Subversion Repositories Applications.papyrus

Rev

Rev 1372 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*
        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];
};