Rev 1422 | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified BSD license. For more information on Dojo licensing, see:http://dojotoolkit.org/community/licensing.shtml*/dojo.provide("dojo.widget.Parse");dojo.require("dojo.widget.Manager");dojo.require("dojo.dom");dojo.widget.Parse = function (fragment) {this.propertySetsList = [];this.fragment = fragment;this.createComponents = function (frag, parentComp) {var comps = [];var built = false;try {if (frag && frag.tagName && (frag != frag.nodeRef)) {var djTags = dojo.widget.tags;var tna = String(frag.tagName).split(";");for (var x = 0; x < tna.length; x++) {var ltn = tna[x].replace(/^\s+|\s+$/g, "").toLowerCase();frag.tagName = ltn;var ret;if (djTags[ltn]) {built = true;ret = djTags[ltn](frag, this, parentComp, frag.index);comps.push(ret);} else {if (ltn.indexOf(":") == -1) {ltn = "dojo:" + ltn;}ret = dojo.widget.buildWidgetFromParseTree(ltn, frag, this, parentComp, frag.index);if (ret) {built = true;comps.push(ret);}}}}}catch (e) {dojo.debug("dojo.widget.Parse: error:", e);}if (!built) {comps = comps.concat(this.createSubComponents(frag, parentComp));}return comps;};this.createSubComponents = function (fragment, parentComp) {var frag, comps = [];for (var item in fragment) {frag = fragment[item];if (frag && typeof frag == "object" && (frag != fragment.nodeRef) && (frag != fragment.tagName) && (!dojo.dom.isNode(frag))) {comps = comps.concat(this.createComponents(frag, parentComp));}}return comps;};this.parsePropertySets = function (fragment) {return [];};this.parseProperties = function (fragment) {var properties = {};for (var item in fragment) {if ((fragment[item] == fragment.tagName) || (fragment[item] == fragment.nodeRef)) {} else {var frag = fragment[item];if (frag.tagName && dojo.widget.tags[frag.tagName.toLowerCase()]) {} else {if (frag[0] && frag[0].value != "" && frag[0].value != null) {try {if (item.toLowerCase() == "dataprovider") {var _this = this;this.getDataProvider(_this, frag[0].value);properties.dataProvider = this.dataProvider;}properties[item] = frag[0].value;var nestedProperties = this.parseProperties(frag);for (var property in nestedProperties) {properties[property] = nestedProperties[property];}}catch (e) {dojo.debug(e);}}}switch (item.toLowerCase()) {case "checked":case "disabled":if (typeof properties[item] != "boolean") {properties[item] = true;}break;}}}return properties;};this.getDataProvider = function (objRef, dataUrl) {dojo.io.bind({url:dataUrl, load:function (type, evaldObj) {if (type == "load") {objRef.dataProvider = evaldObj;}}, mimetype:"text/javascript", sync:true});};this.getPropertySetById = function (propertySetId) {for (var x = 0; x < this.propertySetsList.length; x++) {if (propertySetId == this.propertySetsList[x]["id"][0].value) {return this.propertySetsList[x];}}return "";};this.getPropertySetsByType = function (componentType) {var propertySets = [];for (var x = 0; x < this.propertySetsList.length; x++) {var cpl = this.propertySetsList[x];var cpcc = cpl.componentClass || cpl.componentType || null;var propertySetId = this.propertySetsList[x]["id"][0].value;if (cpcc && (propertySetId == cpcc[0].value)) {propertySets.push(cpl);}}return propertySets;};this.getPropertySets = function (fragment) {var ppl = "dojo:propertyproviderlist";var propertySets = [];var tagname = fragment.tagName;if (fragment[ppl]) {var propertyProviderIds = fragment[ppl].value.split(" ");for (var propertySetId in propertyProviderIds) {if ((propertySetId.indexOf("..") == -1) && (propertySetId.indexOf("://") == -1)) {var propertySet = this.getPropertySetById(propertySetId);if (propertySet != "") {propertySets.push(propertySet);}} else {}}}return this.getPropertySetsByType(tagname).concat(propertySets);};this.createComponentFromScript = function (nodeRef, componentName, properties, ns) {properties.fastMixIn = true;var ltn = (ns || "dojo") + ":" + componentName.toLowerCase();if (dojo.widget.tags[ltn]) {return [dojo.widget.tags[ltn](properties, this, null, null, properties)];}return [dojo.widget.buildWidgetFromParseTree(ltn, properties, this, null, null, properties)];};};dojo.widget._parser_collection = {"dojo":new dojo.widget.Parse()};dojo.widget.getParser = function (name) {if (!name) {name = "dojo";}if (!this._parser_collection[name]) {this._parser_collection[name] = new dojo.widget.Parse();}return this._parser_collection[name];};dojo.widget.createWidget = function (name, props, refNode, position) {var isNode = false;var isNameStr = (typeof name == "string");if (isNameStr) {var pos = name.indexOf(":");var ns = (pos > -1) ? name.substring(0, pos) : "dojo";if (pos > -1) {name = name.substring(pos + 1);}var lowerCaseName = name.toLowerCase();var namespacedName = ns + ":" + lowerCaseName;isNode = (dojo.byId(name) && !dojo.widget.tags[namespacedName]);}if ((arguments.length == 1) && (isNode || !isNameStr)) {var xp = new dojo.xml.Parse();var tn = isNode ? dojo.byId(name) : name;return dojo.widget.getParser().createComponents(xp.parseElement(tn, null, true))[0];}function fromScript(placeKeeperNode, name, props, ns) {props[namespacedName] = {dojotype:[{value:lowerCaseName}], nodeRef:placeKeeperNode, fastMixIn:true};props.ns = ns;return dojo.widget.getParser().createComponentFromScript(placeKeeperNode, name, props, ns);}props = props || {};var notRef = false;var tn = null;var h = dojo.render.html.capable;if (h) {tn = document.createElement("span");}if (!refNode) {notRef = true;refNode = tn;if (h) {dojo.body().appendChild(refNode);}} else {if (position) {dojo.dom.insertAtPosition(tn, refNode, position);} else {tn = refNode;}}var widgetArray = fromScript(tn, name.toLowerCase(), props, ns);if ((!widgetArray) || (!widgetArray[0]) || (typeof widgetArray[0].widgetType == "undefined")) {throw new Error("createWidget: Creation of \"" + name + "\" widget failed.");}try {if (notRef && widgetArray[0].domNode.parentNode) {widgetArray[0].domNode.parentNode.removeChild(widgetArray[0].domNode);}}catch (e) {dojo.debug(e);}return widgetArray[0];};