diff options
Diffstat (limited to 'includes/js/dojox/wire/ml/util.js')
-rw-r--r-- | includes/js/dojox/wire/ml/util.js | 295 |
1 files changed, 295 insertions, 0 deletions
diff --git a/includes/js/dojox/wire/ml/util.js b/includes/js/dojox/wire/ml/util.js new file mode 100644 index 0000000..a336b28 --- /dev/null +++ b/includes/js/dojox/wire/ml/util.js @@ -0,0 +1,295 @@ +if(!dojo._hasResource["dojox.wire.ml.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. +dojo._hasResource["dojox.wire.ml.util"] = true; +dojo.provide("dojox.wire.ml.util"); + +dojo.require("dojox.data.dom"); +dojo.require("dojox.wire.Wire"); + +dojox.wire.ml._getValue = function(/*String*/source, /*Array*/args){ + // summary: + // Return a value + // description: + // This method obtains an object by an ID of a widget or an DOM + // element. + // If 'source' specifies a dotted notation to its property, a Wire is + // used to get the object property. + // If 'source' starts with "arguments", 'args' is used as a root + // object for the Wire. + // source: + // A string to specify an object and its property + // args: + // An optional arguments array + // returns: + // A value + if(!source){ + return undefined; //undefined + } + var property = undefined; + if(args && source.length >= 9 && source.substring(0, 9) == "arguments"){ + property = source.substring(9); + return new dojox.wire.Wire({property: property}).getValue(args); + } + var i = source.indexOf('.'); + if(i >= 0){ + property = source.substring(i + 1); + source = source.substring(0, i); + } + var object = (dijit.byId(source) || dojo.byId(source) || dojo.getObject(source)); + if(!object){ + return undefined; //undefined + } + if(!property){ + return object; //Object + }else{ + return new dojox.wire.Wire({object: object, property: property}).getValue(); //anything + } +}; + +dojox.wire.ml._setValue = function(/*String*/target, /*anything*/value){ + // summary: + // Store a value + // description: + // This method stores a value by an ID of a widget or an DOM + // element with a dotted notation to its property, using a Wire. + // target: + // A string to specify an object and its property + // value: + // A value + if(!target){ + return; //undefined + } + var i = target.indexOf('.'); + if(i < 0){ + return; //undefined + } + var object = this._getValue(target.substring(0, i)); + if(!object){ + return; //undefined + } + var property = target.substring(i + 1); + new dojox.wire.Wire({object: object, property: property}).setValue(value); +}; + +dojo.declare("dojox.wire.ml.XmlElement", null, { + // summary: + // An object wrapping an XML element + // description: + // This class represents an XML element. + + constructor: function(/*Element||String*/element){ + // summary: + // Initialize with an XML element or a tag name + // element: + // An XML element or a tag name + if(dojo.isString(element)){ + element = this._getDocument().createElement(element); + } + this.element = element; + }, + getPropertyValue: function(/*String*/property){ + // summary: + // Return a property value + // description: + // If 'property' starts with '@', the attribute value is returned. + // If 'property' specifies "text()", the value of the first child + // text is returned. + // Otherwise, child elements of the tag name specified with + // 'property' are returned. + // property: + // A property name + // returns: + // A property value + var value = undefined; + if(!this.element){ + return value; //undefined + } + if(!property){ + return value; //undefined + } + + if(property.charAt(0) == '@'){ + var attribute = property.substring(1); + value = this.element.getAttribute(attribute); + }else if(property == "text()"){ + var text = this.element.firstChild; + if(text){ + value = text.nodeValue; + } + }else{ // child elements + var elements = []; + for(var i = 0; i < this.element.childNodes.length; i++){ + var child = this.element.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == property){ + elements.push(new dojox.wire.ml.XmlElement(child)); + } + } + if(elements.length > 0){ + if(elements.length === 1){ + value = elements[0]; + }else{ + value = elements; + } + } + } + return value; //String||Array||XmlElement + }, + + setPropertyValue: function(/*String*/property, /*String||Array||XmlElement*/value){ + // summary: + // Store a property value + // description: + // If 'property' starts with '@', 'value' is set to the attribute. + // If 'property' specifies "text()", 'value' is set as the first + // child text. + // If 'value' is a string, a child element of the tag name + // specified with 'property' is created and 'value' is set as + // the first child text of the child element. + // Otherwise, 'value' is set to as child elements. + // property: + // A property name + // value: + // A property value + if(!this.element){ + return; //undefined + } + if(!property){ + return; //undefined + } + + if(property.charAt(0) == '@'){ + var attribute = property.substring(1); + if(value){ + this.element.setAttribute(attribute, value); + }else{ + this.element.removeAttribute(attribute); + } + }else if(property == "text()"){ + while(this.element.firstChild){ + this.element.removeChild(this.element.firstChild); + } + if(value){ + var text = this._getDocument().createTextNode(value); + this.element.appendChild(text); + } + }else{ // child elements + var nextChild = null; + for(var i = this.element.childNodes.length - 1; i >= 0; i--){ + var child = this.element.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */ && child.nodeName == property){ + if(!nextChild){ + nextChild = child.nextSibling; + } + this.element.removeChild(child); + } + } + if(value){ + if(dojo.isArray(value)){ + for(var i in value){ + var e = value[i]; + if(e.element){ + this.element.insertBefore(e.element, nextChild); + } + } + }else if(value instanceof dojox.wire.ml.XmlElement){ + if(value.element){ + this.element.insertBefore(value.element, nextChild); + } + }else{ // assume string + var child = this._getDocument().createElement(property); + var text = this._getDocument().createTextNode(value); + child.appendChild(text); + this.element.insertBefore(child, nextChild); + } + } + } + }, + + toString: function(){ + // summary: + // Return a value of the first text child of the element + // description: + // A value of the first text child of the element is returned. + // returns: + // A value of the first text child of the element + var s = ""; + if(this.element){ + var text = this.element.firstChild; + if(text){ + s = text.nodeValue; + } + } + return s; //String + }, + + toObject: function(){ + // summary: + // Return an object representation of the element + // description: + // An object with properties for child elements, attributes and + // text is returned. + // returns: + // An object representation of the element + if(!this.element){ + return null; //null + } + var text = ""; + var obj = {}; + var elements = 0; + for(var i = 0; i < this.element.childNodes.length; i++){ + var child = this.element.childNodes[i]; + if(child.nodeType === 1 /* ELEMENT_NODE */){ + elements++; + var o = new dojox.wire.ml.XmlElement(child).toObject(); + var name = child.nodeName; + var p = obj[name]; + if(!p){ + obj[name] = o; + }else if(dojo.isArray(p)){ + p.push(o); + }else{ + obj[name] = [p, o]; // make them array + } + }else if(child.nodeType === 3 /* TEXT_NODE */ || + child.nodeType === 4 /* CDATA_SECTION_NODE */){ + text += child.nodeValue; + } + } + var attributes = 0; + if(this.element.nodeType === 1 /* ELEMENT_NODE */){ + attributes = this.element.attributes.length; + for(var i = 0; i < attributes; i++){ + var attr = this.element.attributes[i]; + obj["@" + attr.nodeName] = attr.nodeValue; + } + } + if(elements === 0){ + if(attributes === 0){ + // text only + return text; //String + } + // text with attributes + obj["text()"] = text; + } + // else ignore text + return obj; //Object + }, + + _getDocument: function(){ + // summary: + // Return a DOM document + // description: + // If 'element' is specified, a DOM document of the element is + // returned. + // Otherwise, a DOM document is created. + // returns: + // A DOM document + if(this.element){ + return (this.element.nodeType == 9 /* DOCUMENT_NODE */ ? + this.element : this.element.ownerDocument); //Document + }else{ + return dojox.data.dom.createDocument(); //Document + } + } +}); + +} |