blob: 504cdbad8ebf7aa7c871b68ff416c17ba474c842 [file] [log] [blame]
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified 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];
};