diff --git a/build.xml b/build.xml index 5e6702a1..82367cb2 100644 --- a/build.xml +++ b/build.xml @@ -3,7 +3,7 @@ Builds, tests, and runs the project Env. - + - * Copyright 2008 John Resig, under the MIT License - */ - - -// The Window Object -var __this__ = this; -this.__defineGetter__('window', function(){ - return __this__; -}); - -try{ -(function($w, $env){ - /* -* window.js -* - this file will be wrapped in a closure providing the window object as $w -*/ -// a logger or empty function available to all modules. -var $log = $env.log, - $debug = $env.debug, - $info = $env.info, - $warn = $env.warn, - $error = $env.error; - -//The version of this application -var $version = "0.1"; -//This should be hooked to git or svn or whatever -var $revision = "0.0.0.0"; - -//These descriptions of window properties are taken loosely David Flanagan's -//'JavaScript - The Definitive Guide' (O'Reilly) - -/**> $cookies - see cookie.js <*/ -// read only boolean specifies whether the window has been closed -var $closed = false; - -// a read/write string that specifies the default message that appears in the status line -var $defaultStatus = "Done"; - -// a read-only reference to the Document object belonging to this window -/**> $document - See document.js <*/ - -//IE only, refers to the most recent event object - this maybe be removed after review -var $event = null; - -//A read-only array of window objects -var $frames = []; - -// a read-only reference to the History object -/**> $history - see location.js <**/ - -// read-only properties that specify the height and width, in pixels -var $innerHeight = 600, $innerWidth = 800; - -// a read-only reference to the Location object. the location object does expose read/write properties -/**> $location - see location.js <**/ - -// a read only property specifying the name of the window. Can be set when using open() -// and may be used when specifying the target attribute of links -var $name = 'Resig Env Browser'; - -// a read-only reference to the Navigator object -/**> $navigator - see navigator.js <**/ - -// a read/write reference to the Window object that contained the script that called open() to -//open this browser window. This property is valid only for top-level window objects. -var $opener; - -// Read-only properties that specify the total height and width, in pixels, of the browser window. -// These dimensions include the height and width of the menu bar, toolbars, scrollbars, window -// borders and so on. These properties are not supported by IE and IE offers no alternative -// properties; -var $outerHeight = $innerHeight, $outerWidth = $innerWidth; - -// Read-only properties that specify the number of pixels that the current document has been scrolled -//to the right and down. These are not supported by IE. -var $pageXOffset = 0, $pageYOffset = 0; - -//A read-only reference to the Window object that contains this window or frame. If the window is -// a top-level window, parent refers to the window itself. If this window is a frame, this property -// refers to the window or frame that conatins it. -var $parent; - -// a read-only refernce to the Screen object that specifies information about the screen: -// the number of available pixels and the number of available colors. -/**> $screen - see screen.js <**/ - -// read only properties that specify the coordinates of the upper-left corner of the screen. -var $screenX = 0, $screenY = 0; -var $screenLeft = $screenX, $screenTop = $screenY; - -// a read-only refernce to this window itself. -var $self; - -// a read/write string that specifies the current contents of the status line. -var $status = ''; - -// a read-only reference to the top-level window that contains this window. If this -// window is a top-level window it is simply a refernce to itself. If this window -// is a frame, the top property refers to the top-level window that contains the frame. -var $top; - -// the window property is identical to the self property. -var $window = $w; - -$debug("Initializing Window."); -__extend__($w,{ - get closed(){return $closed;}, - get defaultStatus(){return $defaultStatus;}, - set defaultStatus(_defaultStatus){$defaultStatus = _defaultStatus;}, - //get document(){return $document;}, - see document.js - get event(){return $event;}, - get frames(){return $frames;}, - //get history(){return $history;}, - see location.js - get innerHeight(){return $innerHeight;}, - get innerWidth(){return $innerWidth;}, - get clientHeight(){return $innerHeight;}, - get clientWidth(){return $innerWidth;}, - //get location(){return $location;}, see location.js - get name(){return $name;}, - //get navigator(){return $navigator;}, see navigator.js - get opener(){return $opener;}, - get outerHeight(){return $outerHeight;}, - get outerWidth(){return $outerWidth;}, - get pageXOffest(){return $pageXOffset;}, - get pageYOffset(){return $pageYOffset;}, - get parent(){return $parent;}, - //get screen(){return $screen;}, see screen.js - get screenLeft(){return $screenLeft;}, - get screenTop(){return $screenTop;}, - get screenX(){return $screenX;}, - get screenY(){return $screenY;}, - get self(){return $self;}, - get status(){return $status;}, - set status(_status){$status = _status;}, - get top(){return $top || $window;}, - get window(){return $window;} -}); - -$w.open = function(url, name, features, replace){ - //TODO -}; - -$w.close = function(){ - //TODO -}; - -/* Time related functions - see timer.js -* - clearTimeout -* - clearInterval -* - setTimeout -* - setInterval -*/ - -/* -* Events related functions - see event.js -* - addEventListener -* - attachEvent -* - detachEvent -* - removeEventListener -* -* These functions are identical to the Element equivalents. -*/ - -/* -* UIEvents related functions - see uievent.js -* - blur -* - focus -* -* These functions are identical to the Element equivalents. -*/ - -/* Dialog related functions - see dialog.js -* - alert -* - confirm -* - prompt -*/ - -/* Screen related functions - see screen.js -* - moveBy -* - moveTo -* - print -* - resizeBy -* - resizeTo -* - scrollBy -* - scrollTo -*/ - -/* CSS related functions - see css.js -* - getComputedStyle -*/ - -/* -* Shared utility methods -*/ -// Helper method for extending one object with another. -function __extend__(a,b) { - for ( var i in b ) { - var g = b.__lookupGetter__(i), s = b.__lookupSetter__(i); - if ( g || s ) { - if ( g ) a.__defineGetter__(i, g); - if ( s ) a.__defineSetter__(i, s); - } else - a[i] = b[i]; - } return a; -}; - - -// from ariel flesler http://flesler.blogspot.com/2008/11/fast-trim-function-for-javascript.html -// this might be a good utility function to provide in the env.core -// as in might be useful to the parser and other areas as well -function trim( str ){ - return (str || "").replace( /^\s+|\s+$/g, "" ); - -}; -/*function trim( str ){ - var start = -1, - end = str.length; - /*jsl:ignore* - while( str.charCodeAt(--end) < 33 ); - while( str.charCodeAt(++start) < 33 ); - /*jsl:end* - return str.slice( start, end + 1 ); -};*/ - -//from jQuery -function __setArray__( target, array ) { - // Resetting the length to 0, then using the native Array push - // is a super-fast way to populate an object with array-like properties - target.length = 0; - Array.prototype.push.apply( target, array ); -}; - - -$debug("Defining NodeList"); -/* -* NodeList - DOM Level 2 -*/ -/** - * @class DOMNodeList - provides the abstraction of an ordered collection of nodes - * - * @author Jon van Noort (jon@webarcana.com.au) - * - * @param ownerDocument : DOMDocument - the ownerDocument - * @param parentNode : DOMNode - the node that the DOMNodeList is attached to (or null) - */ -var DOMNodeList = function(ownerDocument, parentNode) { - this.length = 0; - this.parentNode = parentNode; - this.ownerDocument = ownerDocument; - - this._readonly = false; - - __setArray__(this, []); -}; -__extend__(DOMNodeList.prototype, { - item : function(index) { - var ret = null; - //$log("NodeList item("+index+") = " + this[index]); - if ((index >= 0) && (index < this.length)) { // bounds check - ret = this[index]; // return selected Node - } - - return ret; // if the index is out of bounds, default value null is returned - }, - get xml() { - var ret = ""; - - // create string containing the concatenation of the string values of each child - for (var i=0; i < this.length; i++) { - if(this[i]){ - if(this[i].nodeType == DOMNode.TEXT_NODE && i>0 && this[i-1].nodeType == DOMNode.TEXT_NODE){ - //add a single space between adjacent text nodes - ret += " "+this[i].xml; - }else{ - ret += this[i].xml; - } - } - } - - return ret; - }, - toArray: function () { - var children = []; - for ( var i=0; i < this.length; i++) { - children.push (this[i]); - } - return children; - }, - toString: function(){ - return "[ "+(this.length > 0?Array.prototype.join.apply(this, [", "]):"Empty NodeList")+" ]"; - } -}); - - -/** - * @method DOMNodeList._findItemIndex - find the item index of the node with the specified internal id - * @author Jon van Noort (jon@webarcana.com.au) - * @param id : int - unique internal id - * @return : int - */ -var __findItemIndex__ = function (nodelist, id) { - var ret = -1; - - // test that id is valid - if (id > -1) { - for (var i=0; i= 0) && (refChildIndex < nodelist.length)) { // bounds check - - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { // node is a DocumentFragment - // append the children of DocumentFragment - Array.prototype.splice.apply(nodelist,[refChildIndex, 0].concat(newChild.childNodes.toArray())); - } - else { - // append the newChild - Array.prototype.splice.apply(nodelist,[refChildIndex, 0, newChild]); - } - } -}; - -/** - * @method DOMNodeList._replaceChild - replace the specified Node in the NodeList at the specified index - * Used by DOMNode.replaceChild(). Note: DOMNode.replaceChild() is responsible for Node Pointer surgery - * DOMNodeList._replaceChild() simply modifies the internal data structure (Array). - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param newChild : DOMNode - the Node to be inserted - * @param refChildIndex : int - the array index to hold the Node - */ -var __replaceChild__ = function(nodelist, newChild, refChildIndex) { - var ret = null; - - if ((refChildIndex >= 0) && (refChildIndex < nodelist.length)) { // bounds check - ret = nodelist[refChildIndex]; // preserve old child for return - - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { // node is a DocumentFragment - // get array containing children prior to refChild - Array.prototype.splice.apply(nodelist,[refChildIndex, 1].concat(newChild.childNodes.toArray())); - } - else { - // simply replace node in array (links between Nodes are made at higher level) - nodelist[refChildIndex] = newChild; - } - } - - return ret; // return replaced node -}; - -/** - * @method DOMNodeList._removeChild - remove the specified Node in the NodeList at the specified index - * Used by DOMNode.removeChild(). Note: DOMNode.removeChild() is responsible for Node Pointer surgery - * DOMNodeList._replaceChild() simply modifies the internal data structure (Array). - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param refChildIndex : int - the array index holding the Node to be removed - */ -var __removeChild__ = function(nodelist, refChildIndex) { - var ret = null; - - if (refChildIndex > -1) { // found it! - ret = nodelist[refChildIndex]; // return removed node - - // rebuild array without removed child - Array.prototype.splice.apply(nodelist,[refChildIndex, 1]); - } - - return ret; // return removed node -}; - -/** - * @method DOMNodeList._appendChild - append the specified Node to the NodeList - * Used by DOMNode.appendChild(). Note: DOMNode.appendChild() is responsible for Node Pointer surgery - * DOMNodeList._appendChild() simply modifies the internal data structure (Array). - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param newChild : DOMNode - the Node to be inserted - */ -var __appendChild__ = function(nodelist, newChild) { - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { // node is a DocumentFragment - // append the children of DocumentFragment - Array.prototype.push.apply(nodelist, newChild.childNodes.toArray() ); - } else { - // simply add node to array (links between Nodes are made at higher level) - Array.prototype.push.apply(nodelist, [newChild]); - } - -}; - -/** - * @method DOMNodeList._cloneNodes - Returns a NodeList containing clones of the Nodes in this NodeList - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param deep : boolean - If true, recursively clone the subtree under each of the nodes; - * if false, clone only the nodes themselves (and their attributes, if it is an Element). - * @param parentNode : DOMNode - the new parent of the cloned NodeList - * @return : DOMNodeList - NodeList containing clones of the Nodes in this NodeList - */ -var __cloneNodes__ = function(nodelist, deep, parentNode) { - var cloneNodeList = new DOMNodeList(nodelist.ownerDocument, parentNode); - - // create list containing clones of each child - for (var i=0; i < nodelist.length; i++) { - __appendChild__(cloneNodeList, nodelist[i].cloneNode(deep)); - } - - return cloneNodeList; -}; - -$w.NodeList = DOMNodeList; - -/** - * @class DOMNamedNodeMap - used to represent collections of nodes that can be accessed by name - * typically a set of Element attributes - * - * @extends DOMNodeList - note W3C spec says that this is not the case, - * but we need an item() method identicle to DOMNodeList's, so why not? - * @author Jon van Noort (jon@webarcana.com.au) - * @param ownerDocument : DOMDocument - the ownerDocument - * @param parentNode : DOMNode - the node that the DOMNamedNodeMap is attached to (or null) - */ -var DOMNamedNodeMap = function(ownerDocument, parentNode) { - //$log("\t\tcreating dom namednodemap"); - this.DOMNodeList = DOMNodeList; - this.DOMNodeList(ownerDocument, parentNode); - __setArray__(this, []); -}; -DOMNamedNodeMap.prototype = new DOMNodeList; -__extend__(DOMNamedNodeMap.prototype, { - getNamedItem : function(name) { - var ret = null; - - // test that Named Node exists - var itemIndex = __findNamedItemIndex__(this, name); - - if (itemIndex > -1) { // found it! - ret = this[itemIndex]; // return NamedNode - } - - return ret; // if node is not found, default value null is returned - }, - setNamedItem : function(arg) { - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if arg was not created by this Document - if (this.ownerDocument != arg.ownerDocument) { - throw(new DOMException(DOMException.WRONG_DOCUMENT_ERR)); - } - - // throw Exception if DOMNamedNodeMap is readonly - if (this._readonly || (this.parentNode && this.parentNode._readonly)) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if arg is already an attribute of another Element object - if (arg.ownerElement && (arg.ownerElement != this.parentNode)) { - throw(new DOMException(DOMException.INUSE_ATTRIBUTE_ERR)); - } - } - - // get item index - var itemIndex = __findNamedItemIndex__(this, arg.name); - var ret = null; - - if (itemIndex > -1) { // found it! - ret = this[itemIndex]; // use existing Attribute - - // throw Exception if DOMAttr is readonly - if (__ownerDocument__(this).implementation.errorChecking && ret._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } else { - this[itemIndex] = arg; // over-write existing NamedNode - this[arg.name] = arg; - } - } else { - // add new NamedNode - Array.prototype.push.apply(this, [arg]); - this[arg.name] = arg; - } - - arg.ownerElement = this.parentNode; // update ownerElement - - return ret; // return old node or null - }, - removeNamedItem : function(name) { - var ret = null; - // test for exceptions - // throw Exception if DOMNamedNodeMap is readonly - if (__ownerDocument__(this).implementation.errorChecking && - (this._readonly || (this.parentNode && this.parentNode._readonly))) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // get item index - var itemIndex = __findNamedItemIndex__(this, name); - - // throw Exception if there is no node named name in this map - if (__ownerDocument__(this).implementation.errorChecking && (itemIndex < 0)) { - throw(new DOMException(DOMException.NOT_FOUND_ERR)); - } - - // get Node - var oldNode = this[itemIndex]; - //this[oldNode.name] = undefined; - - // throw Exception if Node is readonly - if (__ownerDocument__(this).implementation.errorChecking && oldNode._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // return removed node - return __removeChild__(this, itemIndex); - }, - getNamedItemNS : function(namespaceURI, localName) { - var ret = null; - - // test that Named Node exists - var itemIndex = __findNamedItemNSIndex__(this, namespaceURI, localName); - - if (itemIndex > -1) { // found it! - ret = this[itemIndex]; // return NamedNode - } - - return ret; // if node is not found, default value null is returned - }, - setNamedItemNS : function(arg) { - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if DOMNamedNodeMap is readonly - if (this._readonly || (this.parentNode && this.parentNode._readonly)) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if arg was not created by this Document - if (__ownerDocument__(this) != __ownerDocument__(arg)) { - throw(new DOMException(DOMException.WRONG_DOCUMENT_ERR)); - } - - // throw Exception if arg is already an attribute of another Element object - if (arg.ownerElement && (arg.ownerElement != this.parentNode)) { - throw(new DOMException(DOMException.INUSE_ATTRIBUTE_ERR)); - } - } - - // get item index - var itemIndex = __findNamedItemNSIndex__(this, arg.namespaceURI, arg.localName); - var ret = null; - - if (itemIndex > -1) { // found it! - ret = this[itemIndex]; // use existing Attribute - // throw Exception if DOMAttr is readonly - if (__ownerDocument__(this).implementation.errorChecking && ret._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } else { - this[itemIndex] = arg; // over-write existing NamedNode - } - }else { - // add new NamedNode - Array.prototype.push.apply(this, [arg]); - } - arg.ownerElement = this.parentNode; - - - return ret; // return old node or null - }, - removeNamedItemNS : function(namespaceURI, localName) { - var ret = null; - - // test for exceptions - // throw Exception if DOMNamedNodeMap is readonly - if (__ownerDocument__(this).implementation.errorChecking && (this._readonly || (this.parentNode && this.parentNode._readonly))) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // get item index - var itemIndex = __findNamedItemNSIndex__(this, namespaceURI, localName); - - // throw Exception if there is no matching node in this map - if (__ownerDocument__(this).implementation.errorChecking && (itemIndex < 0)) { - throw(new DOMException(DOMException.NOT_FOUND_ERR)); - } - - // get Node - var oldNode = this[itemIndex]; - - // throw Exception if Node is readonly - if (__ownerDocument__(this).implementation.errorChecking && oldNode._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - return __removeChild__(this, itemIndex); // return removed node - }, - get xml() { - var ret = ""; - - // create string containing concatenation of all (but last) Attribute string values (separated by spaces) - for (var i=0; i < this.length -1; i++) { - ret += this[i].xml +" "; - } - - // add last Attribute to string (without trailing space) - if (this.length > 0) { - ret += this[this.length -1].xml; - } - - return ret; - } - -}); - -/** - * @method DOMNamedNodeMap._findNamedItemIndex - find the item index of the node with the specified name - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param name : string - the name of the required node - * @param isnsmap : if its a DOMNamespaceNodeMap - * @return : int - */ -var __findNamedItemIndex__ = function(namednodemap, name, isnsmap) { - var ret = -1; - - // loop through all nodes - for (var i=0; i -1) { // found it! - ret = true; // return true - } - - return ret; // if node is not found, default value false is returned -} - -/** - * @method DOMNamedNodeMap._hasAttributeNS - Returns true if specified node exists - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param namespaceURI : string - the namespace URI of the required node - * @param localName : string - the local name of the required node - * @return : boolean - */ -var __hasAttributeNS__ = function(namednodemap, namespaceURI, localName) { - var ret = false; - - // test that Named Node exists - var itemIndex = __findNamedItemNSIndex__(namednodemap, namespaceURI, localName); - - if (itemIndex > -1) { // found it! - ret = true; // return true - } - - return ret; // if node is not found, default value false is returned -} - -/** - * @method DOMNamedNodeMap._cloneNodes - Returns a NamedNodeMap containing clones of the Nodes in this NamedNodeMap - * - * @author Jon van Noort (jon@webarcana.com.au) - * @param parentNode : DOMNode - the new parent of the cloned NodeList - * @param isnsmap : bool - is this a DOMNamespaceNodeMap - * @return : DOMNamedNodeMap - NamedNodeMap containing clones of the Nodes in this DOMNamedNodeMap - */ -var __cloneNamedNodes__ = function(namednodemap, parentNode, isnsmap) { - var cloneNamedNodeMap = isnsmap? - new DOMNamespaceNodeMap(namednodemap.ownerDocument, parentNode): - new DOMNamedNodeMap(namednodemap.ownerDocument, parentNode); - - // create list containing clones of all children - for (var i=0; i < namednodemap.length; i++) { - $debug("cloning node in named node map :" + namednodemap[i]); - __appendChild__(cloneNamedNodeMap, namednodemap[i].cloneNode(false)); - } - - return cloneNamedNodeMap; -}; - - -/** - * @class DOMNamespaceNodeMap - used to represent collections of namespace nodes that can be accessed by name - * typically a set of Element attributes - * - * @extends DOMNamedNodeMap - * - * @author Jon van Noort (jon@webarcana.com.au) - * - * @param ownerDocument : DOMDocument - the ownerDocument - * @param parentNode : DOMNode - the node that the DOMNamespaceNodeMap is attached to (or null) - */ -var DOMNamespaceNodeMap = function(ownerDocument, parentNode) { - //$log("\t\t\tcreating dom namespacednodemap"); - this.DOMNamedNodeMap = DOMNamedNodeMap; - this.DOMNamedNodeMap(ownerDocument, parentNode); - __setArray__(this, []); -}; -DOMNamespaceNodeMap.prototype = new DOMNamedNodeMap; -__extend__(DOMNamespaceNodeMap.prototype, { - get xml() { - var ret = ""; - - // identify namespaces declared local to this Element (ie, not inherited) - for (var ind = 0; ind < this.length; ind++) { - // if namespace declaration does not exist in the containing node's, parentNode's namespaces - var ns = null; - try { - var ns = this.parentNode.parentNode._namespaces. - getNamedItem(this[ind].localName); - } - catch (e) { - //breaking to prevent default namespace being inserted into return value - break; - } - if (!(ns && (""+ ns.nodeValue == ""+ this[ind].nodeValue))) { - // display the namespace declaration - ret += this[ind].xml +" "; - } - } - - return ret; - } -}); -$debug("Defining Node"); -/* -* Node - DOM Level 2 -*/ -/** - * @class DOMNode - The Node interface is the primary datatype for the entire Document Object Model. - * It represents a single node in the document tree. - * @author Jon van Noort (jon@webarcana.com.au), David Joham (djoham@yahoo.com) and Scott Severtson - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMNode = function(ownerDocument) { - if (ownerDocument) { - this._id = ownerDocument._genId(); // generate unique internal id - } - - this.namespaceURI = ""; // The namespace URI of this node (Level 2) - this.prefix = ""; // The namespace prefix of this node (Level 2) - this.localName = ""; // The localName of this node (Level 2) - - this.nodeName = ""; // The name of this node - this.nodeValue = null; // The value of this node - this.className = ""; // The CSS class name of this node. - - // The parent of this node. All nodes, except Document, DocumentFragment, and Attr may have a parent. - // However, if a node has just been created and not yet added to the tree, or if it has been removed from the tree, this is null - this.parentNode = null; - - // A NodeList that contains all children of this node. If there are no children, this is a NodeList containing no nodes. - // The content of the returned NodeList is "live" in the sense that, for instance, changes to the children of the node object - // that it was created from are immediately reflected in the nodes returned by the NodeList accessors; - // it is not a static snapshot of the content of the node. This is true for every NodeList, including the ones returned by the getElementsByTagName method. - this.childNodes = new DOMNodeList(ownerDocument, this); - - this.firstChild = null; // The first child of this node. If there is no such node, this is null - this.lastChild = null; // The last child of this node. If there is no such node, this is null. - this.previousSibling = null; // The node immediately preceding this node. If there is no such node, this is null. - this.nextSibling = null; // The node immediately following this node. If there is no such node, this is null. - - this.ownerDocument = ownerDocument; // The Document object associated with this node - this.attributes = new DOMNamedNodeMap(this.ownerDocument, this); - this._namespaces = new DOMNamespaceNodeMap(ownerDocument, this); // The namespaces in scope for this node - this._readonly = false; -}; - -// nodeType constants -DOMNode.ELEMENT_NODE = 1; -DOMNode.ATTRIBUTE_NODE = 2; -DOMNode.TEXT_NODE = 3; -DOMNode.CDATA_SECTION_NODE = 4; -DOMNode.ENTITY_REFERENCE_NODE = 5; -DOMNode.ENTITY_NODE = 6; -DOMNode.PROCESSING_INSTRUCTION_NODE = 7; -DOMNode.COMMENT_NODE = 8; -DOMNode.DOCUMENT_NODE = 9; -DOMNode.DOCUMENT_TYPE_NODE = 10; -DOMNode.DOCUMENT_FRAGMENT_NODE = 11; -DOMNode.NOTATION_NODE = 12; -DOMNode.NAMESPACE_NODE = 13; - -__extend__(DOMNode.prototype, { - hasAttributes : function() { - if (this.attributes.length == 0) { - return false; - }else{ - return true; - } - }, - insertBefore : function(newChild, refChild) { - var prevNode; - - if(newChild==null || refChild==null){ - return newChild; - } - - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if DOMNode is readonly - if (this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if newChild was not created by this Document - if (__ownerDocument__(this) != __ownerDocument__(newChild)) { - throw(new DOMException(DOMException.WRONG_DOCUMENT_ERR)); - } - - // throw Exception if the node is an ancestor - if (__isAncestor__(this, newChild)) { - throw(new DOMException(DOMException.HIERARCHY_REQUEST_ERR)); - } - } - - if (refChild) { // if refChild is specified, insert before it - // find index of refChild - var itemIndex = __findItemIndex__(this.childNodes, refChild._id); - - // throw Exception if there is no child node with this id - if (__ownerDocument__(this).implementation.errorChecking && (itemIndex < 0)) { - throw(new DOMException(DOMException.NOT_FOUND_ERR)); - } - - // if the newChild is already in the tree, - var newChildParent = newChild.parentNode; - if (newChildParent) { - // remove it - newChildParent.removeChild(newChild); - } - - // insert newChild into childNodes - __insertBefore__(this.childNodes, newChild, - __findItemIndex__(this.childNodes, refChild._id)); - - // do node pointer surgery - prevNode = refChild.previousSibling; - - // handle DocumentFragment - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { - if (newChild.childNodes.length > 0) { - // set the parentNode of DocumentFragment's children - for (var ind = 0; ind < newChild.childNodes.length; ind++) { - newChild.childNodes[ind].parentNode = this; - } - - // link refChild to last child of DocumentFragment - refChild.previousSibling = newChild.childNodes[newChild.childNodes.length-1]; - } - }else { - newChild.parentNode = this; // set the parentNode of the newChild - refChild.previousSibling = newChild; // link refChild to newChild - } - }else { // otherwise, append to end - prevNode = this.lastChild; - this.appendChild(newChild); - } - - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { - // do node pointer surgery for DocumentFragment - if (newChild.childNodes.length > 0) { - if (prevNode) { - prevNode.nextSibling = newChild.childNodes[0]; - }else { // this is the first child in the list - this.firstChild = newChild.childNodes[0]; - } - - newChild.childNodes[0].previousSibling = prevNode; - newChild.childNodes[newChild.childNodes.length-1].nextSibling = refChild; - } - }else { - // do node pointer surgery for newChild - if (prevNode) { - prevNode.nextSibling = newChild; - }else { // this is the first child in the list - this.firstChild = newChild; - } - - newChild.previousSibling = prevNode; - newChild.nextSibling = refChild; - } - - return newChild; - }, - replaceChild : function(newChild, oldChild) { - var ret = null; - - if(newChild==null || oldChild==null){ - return oldChild; - } - - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if DOMNode is readonly - if (this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if newChild was not created by this Document - if (__ownerDocument__(this) != __ownerDocument__(newChild)) { - throw(new DOMException(DOMException.WRONG_DOCUMENT_ERR)); - } - - // throw Exception if the node is an ancestor - if (__isAncestor__(this, newChild)) { - throw(new DOMException(DOMException.HIERARCHY_REQUEST_ERR)); - } - } - - // get index of oldChild - var index = __findItemIndex__(this.childNodes, oldChild._id); - - // throw Exception if there is no child node with this id - if (__ownerDocument__(this).implementation.errorChecking && (index < 0)) { - throw(new DOMException(DOMException.NOT_FOUND_ERR)); - } - - // if the newChild is already in the tree, - var newChildParent = newChild.parentNode; - if (newChildParent) { - // remove it - newChildParent.removeChild(newChild); - } - - // add newChild to childNodes - ret = __replaceChild__(this.childNodes,newChild, index); - - - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { - // do node pointer surgery for Document Fragment - if (newChild.childNodes.length > 0) { - for (var ind = 0; ind < newChild.childNodes.length; ind++) { - newChild.childNodes[ind].parentNode = this; - } - - if (oldChild.previousSibling) { - oldChild.previousSibling.nextSibling = newChild.childNodes[0]; - } else { - this.firstChild = newChild.childNodes[0]; - } - - if (oldChild.nextSibling) { - oldChild.nextSibling.previousSibling = newChild; - } else { - this.lastChild = newChild.childNodes[newChild.childNodes.length-1]; - } - - newChild.childNodes[0].previousSibling = oldChild.previousSibling; - newChild.childNodes[newChild.childNodes.length-1].nextSibling = oldChild.nextSibling; - } - } else { - // do node pointer surgery for newChild - newChild.parentNode = this; - - if (oldChild.previousSibling) { - oldChild.previousSibling.nextSibling = newChild; - }else{ - this.firstChild = newChild; - } - if (oldChild.nextSibling) { - oldChild.nextSibling.previousSibling = newChild; - }else{ - this.lastChild = newChild; - } - newChild.previousSibling = oldChild.previousSibling; - newChild.nextSibling = oldChild.nextSibling; - } - return ret; - }, - removeChild : function(oldChild) { - if(!oldChild){ - return null; - } - // throw Exception if DOMNamedNodeMap is readonly - if (__ownerDocument__(this).implementation.errorChecking && (this._readonly || oldChild._readonly)) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // get index of oldChild - var itemIndex = __findItemIndex__(this.childNodes, oldChild._id); - - // throw Exception if there is no child node with this id - if (__ownerDocument__(this).implementation.errorChecking && (itemIndex < 0)) { - throw(new DOMException(DOMException.NOT_FOUND_ERR)); - } - - // remove oldChild from childNodes - __removeChild__(this.childNodes, itemIndex); - - // do node pointer surgery - oldChild.parentNode = null; - - if (oldChild.previousSibling) { - oldChild.previousSibling.nextSibling = oldChild.nextSibling; - }else { - this.firstChild = oldChild.nextSibling; - } - if (oldChild.nextSibling) { - oldChild.nextSibling.previousSibling = oldChild.previousSibling; - }else { - this.lastChild = oldChild.previousSibling; - } - - oldChild.previousSibling = null; - oldChild.nextSibling = null; - - return oldChild; - }, - appendChild : function(newChild) { - if(!newChild){ - return null; - } - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if Node is readonly - if (this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if arg was not created by this Document - if (__ownerDocument__(this) != __ownerDocument__(this)) { - throw(new DOMException(DOMException.WRONG_DOCUMENT_ERR)); - } - - // throw Exception if the node is an ancestor - if (__isAncestor__(this, newChild)) { - throw(new DOMException(DOMException.HIERARCHY_REQUEST_ERR)); - } - } - - // if the newChild is already in the tree, - var newChildParent = newChild.parentNode; - if (newChildParent) { - // remove it - newChildParent.removeChild(newChild); - } - - // add newChild to childNodes - __appendChild__(this.childNodes, newChild); - - if (newChild.nodeType == DOMNode.DOCUMENT_FRAGMENT_NODE) { - // do node pointer surgery for DocumentFragment - if (newChild.childNodes.length > 0) { - for (var ind = 0; ind < newChild.childNodes.length; ind++) { - newChild.childNodes[ind].parentNode = this; - } - - if (this.lastChild) { - this.lastChild.nextSibling = newChild.childNodes[0]; - newChild.childNodes[0].previousSibling = this.lastChild; - this.lastChild = newChild.childNodes[newChild.childNodes.length-1]; - } - else { - this.lastChild = newChild.childNodes[newChild.childNodes.length-1]; - this.firstChild = newChild.childNodes[0]; - } - } - } - else { - // do node pointer surgery for newChild - newChild.parentNode = this; - if (this.lastChild) { - this.lastChild.nextSibling = newChild; - newChild.previousSibling = this.lastChild; - this.lastChild = newChild; - } - else { - this.lastChild = newChild; - this.firstChild = newChild; - } - } - - return newChild; - }, - hasChildNodes : function() { - return (this.childNodes.length > 0); - }, - cloneNode: function(deep) { - // use importNode to clone this Node - //do not throw any exceptions - try { - return __ownerDocument__(this).importNode(this, deep); - } catch (e) { - //there shouldn't be any exceptions, but if there are, return null - return null; - } - }, - normalize : function() { - var inode; - var nodesToRemove = new DOMNodeList(); - - if (this.nodeType == DOMNode.ELEMENT_NODE || this.nodeType == DOMNode.DOCUMENT_NODE) { - var adjacentTextNode = null; - - // loop through all childNodes - for(var i = 0; i < this.childNodes.length; i++) { - inode = this.childNodes.item(i); - - if (inode.nodeType == DOMNode.TEXT_NODE) { // this node is a text node - if (inode.length < 1) { // this text node is empty - __appendChild__(nodesToRemove, inode); // add this node to the list of nodes to be remove - }else { - if (adjacentTextNode) { // if previous node was also text - adjacentTextNode.appendData(inode.data); // merge the data in adjacent text nodes - __appendChild__(nodesToRemove, inode); // add this node to the list of nodes to be removed - }else { - adjacentTextNode = inode; // remember this node for next cycle - } - } - } else { - adjacentTextNode = null; // (soon to be) previous node is not a text node - inode.normalize(); // normalise non Text childNodes - } - } - - // remove redundant Text Nodes - for(var i = 0; i < nodesToRemove.length; i++) { - inode = nodesToRemove.item(i); - inode.parentNode.removeChild(inode); - } - } - }, - isSupported : function(feature, version) { - // use Implementation.hasFeature to determin if this feature is supported - return __ownerDocument__(this).implementation.hasFeature(feature, version); - }, - getElementsByTagName : function(tagname) { - // delegate to _getElementsByTagNameRecursive - // recurse childNodes - var nodelist = new DOMNodeList(__ownerDocument__(this)); - for(var i = 0; i < this.childNodes.length; i++) { - nodeList = __getElementsByTagNameRecursive__(this.childNodes.item(i), tagname, nodelist); - } - return nodelist; - }, - getElementsByTagNameNS : function(namespaceURI, localName) { - // delegate to _getElementsByTagNameNSRecursive - return __getElementsByTagNameNSRecursive__(this, namespaceURI, localName, - new DOMNodeList(__ownerDocument__(this))); - }, - importNode : function(importedNode, deep) { - - var importNode; - //$debug("importing node " + importedNode.nodeName + "(?deep = "+deep+")"); - //there is no need to perform namespace checks since everything has already gone through them - //in order to have gotten into the DOM in the first place. The following line - //turns namespace checking off in ._isValidNamespace - __ownerDocument__(this)._performingImportNodeOperation = true; - - if (importedNode.nodeType == DOMNode.ELEMENT_NODE) { - if (!__ownerDocument__(this).implementation.namespaceAware) { - // create a local Element (with the name of the importedNode) - importNode = __ownerDocument__(this).createElement(importedNode.tagName); - - // create attributes matching those of the importedNode - for(var i = 0; i < importedNode.attributes.length; i++) { - importNode.setAttribute(importedNode.attributes.item(i).name, importedNode.attributes.item(i).value); - } - }else { - // create a local Element (with the name & namespaceURI of the importedNode) - importNode = __ownerDocument__(this).createElementNS(importedNode.namespaceURI, importedNode.nodeName); - - // create attributes matching those of the importedNode - for(var i = 0; i < importedNode.attributes.length; i++) { - importNode.setAttributeNS(importedNode.attributes.item(i).namespaceURI, - importedNode.attributes.item(i).name, importedNode.attributes.item(i).value); - } - - // create namespace definitions matching those of the importedNode - for(var i = 0; i < importedNode._namespaces.length; i++) { - importNode._namespaces[i] = __ownerDocument__(this).createNamespace(importedNode._namespaces.item(i).localName); - importNode._namespaces[i].value = importedNode._namespaces.item(i).value; - } - } - } else if (importedNode.nodeType == DOMNode.ATTRIBUTE_NODE) { - if (!__ownerDocument__(this).implementation.namespaceAware) { - // create a local Attribute (with the name of the importedAttribute) - importNode = __ownerDocument__(this).createAttribute(importedNode.name); - } else { - // create a local Attribute (with the name & namespaceURI of the importedAttribute) - importNode = __ownerDocument__(this).createAttributeNS(importedNode.namespaceURI, importedNode.nodeName); - - // create namespace definitions matching those of the importedAttribute - for(var i = 0; i < importedNode._namespaces.length; i++) { - importNode._namespaces[i] = __ownerDocument__(this).createNamespace(importedNode._namespaces.item(i).localName); - importNode._namespaces[i].value = importedNode._namespaces.item(i).value; - } - } - - // set the value of the local Attribute to match that of the importedAttribute - importNode.value = importedNode.value; - - } else if (importedNode.nodeType == DOMNode.DOCUMENT_FRAGMENT) { - // create a local DocumentFragment - importNode = __ownerDocument__(this).createDocumentFragment(); - } else if (importedNode.nodeType == DOMNode.NAMESPACE_NODE) { - // create a local NamespaceNode (with the same name & value as the importedNode) - importNode = __ownerDocument__(this).createNamespace(importedNode.nodeName); - importNode.value = importedNode.value; - } else if (importedNode.nodeType == DOMNode.TEXT_NODE) { - // create a local TextNode (with the same data as the importedNode) - importNode = __ownerDocument__(this).createTextNode(importedNode.data); - } else if (importedNode.nodeType == DOMNode.CDATA_SECTION_NODE) { - // create a local CDATANode (with the same data as the importedNode) - importNode = __ownerDocument__(this).createCDATASection(importedNode.data); - } else if (importedNode.nodeType == DOMNode.PROCESSING_INSTRUCTION_NODE) { - // create a local ProcessingInstruction (with the same target & data as the importedNode) - importNode = __ownerDocument__(this).createProcessingInstruction(importedNode.target, importedNode.data); - } else if (importedNode.nodeType == DOMNode.COMMENT_NODE) { - // create a local Comment (with the same data as the importedNode) - importNode = __ownerDocument__(this).createComment(importedNode.data); - } else { // throw Exception if nodeType is not supported - throw(new DOMException(DOMException.NOT_SUPPORTED_ERR)); - } - - if (deep) { // recurse childNodes - for(var i = 0; i < importedNode.childNodes.length; i++) { - importNode.appendChild(__ownerDocument__(this).importNode(importedNode.childNodes.item(i), true)); - } - } - - //reset _performingImportNodeOperation - __ownerDocument__(this)._performingImportNodeOperation = false; - return importNode; - - }, - contains : function(node){ - while(node && node != this ){ - node = node.parentNode; - } - return !!node; - }, - compareDocumentPosition : function(b){ - var a = this; - var number = (a != b && a.contains(b) && 16) + (a != b && b.contains(a) && 8); - //find position of both - var all = document.getElementsByTagName("*"); - var my_location = 0, node_location = 0; - for(var i=0; i < all.length; i++){ - if(all[i] == a) my_location = i; - if(all[i] == b) node_location = i; - if(my_location && node_location) break; - } - number += (my_location < node_location && 4) - number += (my_location > node_location && 2) - return number; - } - -}); - -/** - * @method DOMNode._getElementsByTagNameRecursive - implements getElementsByTagName() - * @param elem : DOMElement - The element which are checking and then recursing into - * @param tagname : string - The name of the tag to match on. The special value "*" matches all tags - * @param nodeList : DOMNodeList - The accumulating list of matching nodes - * - * @return : DOMNodeList - */ -var __getElementsByTagNameRecursive__ = function (elem, tagname, nodeList) { - - if (elem.nodeType == DOMNode.ELEMENT_NODE || elem.nodeType == DOMNode.DOCUMENT_NODE) { - - if(elem.nodeType !== DOMNode.DOCUMENT_NODE && - ((elem.nodeName.toUpperCase() == tagname.toUpperCase()) || - (tagname == "*")) ){ - __appendChild__(nodeList, elem); // add matching node to nodeList - } - - // recurse childNodes - for(var i = 0; i < elem.childNodes.length; i++) { - nodeList = __getElementsByTagNameRecursive__(elem.childNodes.item(i), tagname, nodeList); - } - } - - return nodeList; -}; - -/** - * @method DOMNode._getElementsByTagNameNSRecursive - implements getElementsByTagName() - * - * @param elem : DOMElement - The element which are checking and then recursing into - * @param namespaceURI : string - the namespace URI of the required node - * @param localName : string - the local name of the required node - * @param nodeList : DOMNodeList - The accumulating list of matching nodes - * - * @return : DOMNodeList - */ -var __getElementsByTagNameNSRecursive__ = function(elem, namespaceURI, localName, nodeList) { - if (elem.nodeType == DOMNode.ELEMENT_NODE || elem.nodeType == DOMNode.DOCUMENT_NODE) { - - if (((elem.namespaceURI == namespaceURI) || (namespaceURI == "*")) && ((elem.localName == localName) || (localName == "*"))) { - __appendChild__(nodeList, elem); // add matching node to nodeList - } - - // recurse childNodes - for(var i = 0; i < elem.childNodes.length; i++) { - nodeList = __getElementsByTagNameNSRecursive__(elem.childNodes.item(i), namespaceURI, localName, nodeList); - } - } - - return nodeList; -}; - -/** - * @method DOMNode._isAncestor - returns true if node is ancestor of target - * @param target : DOMNode - The node we are using as context - * @param node : DOMNode - The candidate ancestor node - * @return : boolean - */ -var __isAncestor__ = function(target, node) { - // if this node matches, return true, - // otherwise recurse up (if there is a parentNode) - return ((target == node) || ((target.parentNode) && (__isAncestor__(target.parentNode, node)))); -}; - -var __ownerDocument__ = function(node){ - return (node.nodeType == DOMNode.DOCUMENT_NODE)?node:node.ownerDocument; -}; - -$w.Node = DOMNode; - -/** - * @class DOMNamespace - The Namespace interface represents an namespace in an Element object - * - * @extends DOMNode - * @author Jon van Noort (jon@webarcana.com.au) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMNamespace = function(ownerDocument) { - this.DOMNode = DOMNode; - this.DOMNode(ownerDocument); - - this.name = ""; // the name of this attribute - - // If this attribute was explicitly given a value in the original document, this is true; otherwise, it is false. - // Note that the implementation is in charge of this attribute, not the user. - // If the user changes the value of the attribute (even if it ends up having the same value as the default value) - // then the specified flag is automatically flipped to true - this.specified = false; -}; -DOMNamespace.prototype = new DOMNode; -__extend__(DOMNamespace.prototype, { - get value(){ - // the value of the attribute is returned as a string - return this.nodeValue; - }, - set value(value){ - this.nodeValue = value+''; - }, - get nodeType(){ - return DOMNode.NAMESPACE_NODE; - }, - get xml(){ - var ret = ""; - - // serialize Namespace Declaration - if (this.nodeName != "") { - ret += this.nodeName +"=\""+ __escapeXML__(this.nodeValue) +"\""; - } - else { // handle default namespace - ret += "xmlns=\""+ __escapeXML__(this.nodeValue) +"\""; - } - - return ret; - }, - toString: function(){ - return "Namespace #" + this.id; - } -}); - -$debug("Defining CharacterData"); -/* -* CharacterData - DOM Level 2 -*/ -/** - * @class DOMCharacterData - parent abstract class for DOMText and DOMComment - * @extends DOMNode - * @author Jon van Noort (jon@webarcana.com.au) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMCharacterData = function(ownerDocument) { - this.DOMNode = DOMNode; - this.DOMNode(ownerDocument); -}; -DOMCharacterData.prototype = new DOMNode; -__extend__(DOMCharacterData.prototype,{ - get data(){ - return this.nodeValue; - }, - set data(data){ - this.nodeValue = data; - }, - get length(){return this.nodeValue.length;}, - appendData: function(arg){ - // throw Exception if DOMCharacterData is readonly - if (__ownerDocument__(this).implementation.errorChecking && this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - // append data - this.data = "" + this.data + arg; - }, - deleteData: function(offset, count){ - // throw Exception if DOMCharacterData is readonly - if (__ownerDocument__(this).implementation.errorChecking && this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - if (this.data) { - // throw Exception if offset is negative or greater than the data length, - if (__ownerDocument__(this).implementation.errorChecking && - ((offset < 0) || (offset > this.data.length) || (count < 0))) { - throw(new DOMException(DOMException.INDEX_SIZE_ERR)); - } - - // delete data - if(!count || (offset + count) > this.data.length) { - this.data = this.data.substring(0, offset); - }else { - this.data = this.data.substring(0, offset). - concat(this.data.substring(offset + count)); - } - } - }, - insertData: function(offset, arg){ - // throw Exception if DOMCharacterData is readonly - if(__ownerDocument__(this).implementation.errorChecking && this._readonly){ - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - if(this.data){ - // throw Exception if offset is negative or greater than the data length, - if (__ownerDocument__(this).implementation.errorChecking && - ((offset < 0) || (offset > this.data.length))) { - throw(new DOMException(DOMException.INDEX_SIZE_ERR)); - } - - // insert data - this.data = this.data.substring(0, offset).concat(arg, this.data.substring(offset)); - }else { - // throw Exception if offset is negative or greater than the data length, - if (__ownerDocument__(this).implementation.errorChecking && (offset != 0)) { - throw(new DOMException(DOMException.INDEX_SIZE_ERR)); - } - - // set data - this.data = arg; - } - }, - replaceData: function(offset, count, arg){ - // throw Exception if DOMCharacterData is readonly - if (__ownerDocument__(this).implementation.errorChecking && this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - if (this.data) { - // throw Exception if offset is negative or greater than the data length, - if (__ownerDocument__(this).implementation.errorChecking && - ((offset < 0) || (offset > this.data.length) || (count < 0))) { - throw(new DOMException(DOMException.INDEX_SIZE_ERR)); - } - - // replace data - this.data = this.data.substring(0, offset). - concat(arg, this.data.substring(offset + count)); - }else { - // set data - this.data = arg; - } - }, - substringData: function(offset, count){ - var ret = null; - if (this.data) { - // throw Exception if offset is negative or greater than the data length, - // or the count is negative - if (__ownerDocument__(this).implementation.errorChecking && - ((offset < 0) || (offset > this.data.length) || (count < 0))) { - throw(new DOMException(DOMException.INDEX_SIZE_ERR)); - } - // if count is not specified - if (!count) { - ret = this.data.substring(offset); // default to 'end of string' - }else{ - ret = this.data.substring(offset, offset + count); - } - } - return ret; - } -}); - -$w.CharacterData = DOMCharacterData;$debug("Defining Text"); -/* -* Text - DOM Level 2 -*/ -/** - * @class DOMText - The Text interface represents the textual content (termed character data in XML) of an Element or Attr. - * If there is no markup inside an element's content, the text is contained in a single object implementing the Text interface - * that is the only child of the element. If there is markup, it is parsed into a list of elements and Text nodes that form the - * list of children of the element. - * @extends DOMCharacterData - * @author Jon van Noort (jon@webarcana.com.au) and David Joham (djoham@yahoo.com) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMText = function(ownerDocument) { - this.DOMCharacterData = DOMCharacterData; - this.DOMCharacterData(ownerDocument); - - this.nodeName = "#text"; -}; -DOMText.prototype = new DOMCharacterData; -__extend__(DOMText.prototype,{ - //Breaks this Text node into two Text nodes at the specified offset, - // keeping both in the tree as siblings. This node then only contains all the content up to the offset point. - // And a new Text node, which is inserted as the next sibling of this node, contains all the content at and after the offset point. - splitText : function(offset) { - var data, inode; - - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if Node is readonly - if (this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if offset is negative or greater than the data length, - if ((offset < 0) || (offset > this.data.length)) { - throw(new DOMException(DOMException.INDEX_SIZE_ERR)); - } - } - - if (this.parentNode) { - // get remaining string (after offset) - data = this.substringData(offset); - - // create new TextNode with remaining string - inode = __ownerDocument__(this).createTextNode(data); - - // attach new TextNode - if (this.nextSibling) { - this.parentNode.insertBefore(inode, this.nextSibling); - } - else { - this.parentNode.appendChild(inode); - } - - // remove remaining string from original TextNode - this.deleteData(offset); - } - - return inode; - }, - get nodeType(){ - return DOMNode.TEXT_NODE; - }, - get xml(){ - return __escapeXML__(""+ this.nodeValue); - }, - toString: function(){ - return "Text #" + this._id; - } -}); - -$w.Text = DOMText;$debug("Defining CDATASection"); -/* -* CDATASection - DOM Level 2 -*/ -/** - * @class DOMCDATASection - CDATA sections are used to escape blocks of text containing characters that would otherwise be regarded as markup. - * The only delimiter that is recognized in a CDATA section is the "\]\]\>" string that ends the CDATA section - * @extends DOMCharacterData - * @author Jon van Noort (jon@webarcana.com.au) and David Joham (djoham@yahoo.com) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMCDATASection = function(ownerDocument) { - this.DOMText = DOMText; - this.DOMText(ownerDocument); - - this.nodeName = "#cdata-section"; -}; -DOMCDATASection.prototype = new DOMText; -__extend__(DOMCDATASection.prototype,{ - get nodeType(){ - return DOMNode.CDATA_SECTION_NODE; - }, - get xml(){ - return ""; - }, - toString : function(){ - return "CDATA #"+this._id; - } -}); - -$w.CDATASection = DOMCDATASection;$debug("Defining Comment"); -/* -* Comment - DOM Level 2 -*/ -/** - * @class DOMComment - This represents the content of a comment, i.e., all the characters between the starting '' - * @extends DOMCharacterData - * @author Jon van Noort (jon@webarcana.com.au) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMComment = function(ownerDocument) { - this.DOMCharacterData = DOMCharacterData; - this.DOMCharacterData(ownerDocument); - - this.nodeName = "#comment"; -}; -DOMComment.prototype = new DOMCharacterData; -__extend__(DOMComment.prototype, { - get nodeType(){ - return DOMNode.COMMENT_NODE; - }, - get xml(){ - return ""; - }, - toString : function(){ - return "Comment #"+this._id; - } -}); - -$w.Comment = DOMComment; -$debug("Defining DocumentType"); -;/* -* DocumentType - DOM Level 2 -*/ -var DOMDocumentType = function() { - $error("DOMDocumentType.constructor(): Not Implemented" ); -}; - -$w.DocumentType = DOMDocumentType; -$debug("Defining Attr"); -/* -* Attr - DOM Level 2 -*/ -/** - * @class DOMAttr - The Attr interface represents an attribute in an Element object - * @extends DOMNode - * @author Jon van Noort (jon@webarcana.com.au) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMAttr = function(ownerDocument) { - this.DOMNode = DOMNode; - this.DOMNode(ownerDocument); - - this.ownerElement = null; // set when Attr is added to NamedNodeMap -}; -DOMAttr.prototype = new DOMNode; -__extend__(DOMAttr.prototype, { - // the name of this attribute - get name(){ - return this.nodeName; - }, - set name(name){ - this.nodeName = name; - }, - // the value of the attribute is returned as a string - get value(){ - return this.nodeValue; - }, - set value(value){ - // throw Exception if Attribute is readonly - if (__ownerDocument__(this).implementation.errorChecking && this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - // delegate to node - this.nodeValue = value; - }, - get specified(){ - return (this.value.length > 0); - }, - get nodeType(){ - return DOMNode.ATTRIBUTE_NODE; - }, - get xml(){ - return this.nodeName + '="' + __escapeXML__(this.nodeValue) + '" '; - }, - toString : function(){ - return "Attr #" + this._id + " " + this.name; - } -}); - -$w.Attr = DOMAttr; -$debug("Defining Element"); -/** - * @class DOMElement - By far the vast majority of objects (apart from text) that authors encounter - * when traversing a document are Element nodes. - * @extends DOMNode - * @author Jon van Noort (jon@webarcana.com.au) and David Joham (djoham@yahoo.com) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMElement = function(ownerDocument) { - this.DOMNode = DOMNode; - this.DOMNode(ownerDocument); - this.id = ""; // the ID of the element -}; -DOMElement.prototype = new DOMNode; -__extend__(DOMElement.prototype, { - // The name of the element. - get tagName(){ - return this.nodeName; - }, - set tagName(name){ - this.nodeName = name; - }, - addEventListener : function(){ window.addEventListener.apply(this, arguments) }, - removeEventListener : function(){ window.removeEventListener.apply(this, arguments) }, - dispatchEvent : function(){ window.dispatchEvent.apply(this, arguments) }, - getAttribute: function(name) { - var ret = null; - // if attribute exists, use it - var attr = this.attributes.getNamedItem(name); - if (attr) { - ret = attr.value; - } - return ret; // if Attribute exists, return its value, otherwise, return "" - }, - setAttribute : function (name, value) { - // if attribute exists, use it - var attr = this.attributes.getNamedItem(name); - var value = value+''; - //I had to add this check becuase as the script initializes - //the id may be set in the constructor, and the html element - //overrides the id property with a getter/setter. - if(__ownerDocument__(this)){ - if (!attr) { - attr = __ownerDocument__(this).createAttribute(name); // otherwise create it - } - - - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if Attribute is readonly - if (attr._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if the value string contains an illegal character - if (!__isValidString__(value)) { - throw(new DOMException(DOMException.INVALID_CHARACTER_ERR)); - } - } - - if (__isIdDeclaration__(name)) { - // this.id = value; // cache ID for getElementById() - } - - // assign values to properties (and aliases) - attr.value = value; - - // add/replace Attribute in NamedNodeMap - this.attributes.setNamedItem(attr); - } - }, - removeAttribute : function removeAttribute(name) { - // delegate to DOMNamedNodeMap.removeNamedItem - return this.attributes.removeNamedItem(name); - }, - getAttributeNode : function getAttributeNode(name) { - // delegate to DOMNamedNodeMap.getNamedItem - return this.attributes.getNamedItem(name); - }, - setAttributeNode: function(newAttr) { - // if this Attribute is an ID - if (__isIdDeclaration__(newAttr.name)) { - this.id = newAttr.value; // cache ID for getElementById() - } - // delegate to DOMNamedNodeMap.setNamedItem - return this.attributes.setNamedItem(newAttr); - }, - removeAttributeNode: function(oldAttr) { - // throw Exception if Attribute is readonly - if (__ownerDocument__(this).implementation.errorChecking && oldAttr._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // get item index - var itemIndex = this.attributes._findItemIndex(oldAttr._id); - - // throw Exception if node does not exist in this map - if (__ownerDocument__(this).implementation.errorChecking && (itemIndex < 0)) { - throw(new DOMException(DOMException.NOT_FOUND_ERR)); - } - - return this.attributes._removeChild(itemIndex); - }, - getAttributeNS : function(namespaceURI, localName) { - var ret = ""; - // delegate to DOMNAmedNodeMap.getNamedItemNS - var attr = this.attributes.getNamedItemNS(namespaceURI, localName); - if (attr) { - ret = attr.value; - } - return ret; // if Attribute exists, return its value, otherwise return "" - }, - setAttributeNS : function(namespaceURI, qualifiedName, value) { - // call DOMNamedNodeMap.getNamedItem - var attr = this.attributes.getNamedItem(namespaceURI, qualifiedName); - - if (!attr) { // if Attribute exists, use it - // otherwise create it - attr = __ownerDocument__(this).createAttributeNS(namespaceURI, qualifiedName); - } - - var value = value+''; - - // test for exceptions - if (__ownerDocument__(this).implementation.errorChecking) { - // throw Exception if Attribute is readonly - if (attr._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - - // throw Exception if the Namespace is invalid - if (!__isValidNamespace__(namespaceURI, qualifiedName)) { - throw(new DOMException(DOMException.NAMESPACE_ERR)); - } - - // throw Exception if the value string contains an illegal character - if (!__isValidString__(value)) { - throw(new DOMException(DOMException.INVALID_CHARACTER_ERR)); - } - } - - // if this Attribute is an ID - if (__isIdDeclaration__(name)) { - this.id = value; // cache ID for getElementById() - } - - // assign values to properties (and aliases) - attr.value = value; - attr.nodeValue = value; - - // delegate to DOMNamedNodeMap.setNamedItem - this.attributes.setNamedItemNS(attr); - }, - removeAttributeNS : function(namespaceURI, localName) { - // delegate to DOMNamedNodeMap.removeNamedItemNS - return this.attributes.removeNamedItemNS(namespaceURI, localName); - }, - getAttributeNodeNS : function(namespaceURI, localName) { - // delegate to DOMNamedNodeMap.getNamedItemNS - return this.attributes.getNamedItemNS(namespaceURI, localName); - }, - setAttributeNodeNS : function(newAttr) { - // if this Attribute is an ID - if ((newAttr.prefix == "") && __isIdDeclaration__(newAttr.name)) { - this.id = newAttr.value+''; // cache ID for getElementById() - } - - // delegate to DOMNamedNodeMap.setNamedItemNS - return this.attributes.setNamedItemNS(newAttr); - }, - hasAttribute : function(name) { - // delegate to DOMNamedNodeMap._hasAttribute - return __hasAttribute__(this.attributes,name); - }, - hasAttributeNS : function(namespaceURI, localName) { - // delegate to DOMNamedNodeMap._hasAttributeNS - return __hasAttributeNS__(this.attributes, namespaceURI, localName); - }, - get nodeType(){ - return DOMNode.ELEMENT_NODE; - }, - get xml() { - var ret = ""; - - // serialize namespace declarations - var ns = this._namespaces.xml; - if (ns.length > 0) ns = " "+ ns; - - // serialize Attribute declarations - var attrs = this.attributes.xml; - if (attrs.length > 0) attrs = " "+ attrs; - - // serialize this Element - ret += "<" + this.nodeName.toLowerCase() + ns + attrs +">"; - ret += this.childNodes.xml; - ret += ""; - - return ret; - }, - toString : function(){ - return "Element #"+this._id + " "+ this.tagName + (this.id?" => "+this.id:''); - } -}); - -$w.Element = DOMElement; -/** - * @class DOMException - raised when an operation is impossible to perform - * @author Jon van Noort (jon@webarcana.com.au) - * @param code : int - the exception code (one of the DOMException constants) - */ -var DOMException = function(code) { - this.code = code; -}; - -// DOMException constants -// Introduced in DOM Level 1: -DOMException.INDEX_SIZE_ERR = 1; -DOMException.DOMSTRING_SIZE_ERR = 2; -DOMException.HIERARCHY_REQUEST_ERR = 3; -DOMException.WRONG_DOCUMENT_ERR = 4; -DOMException.INVALID_CHARACTER_ERR = 5; -DOMException.NO_DATA_ALLOWED_ERR = 6; -DOMException.NO_MODIFICATION_ALLOWED_ERR = 7; -DOMException.NOT_FOUND_ERR = 8; -DOMException.NOT_SUPPORTED_ERR = 9; -DOMException.INUSE_ATTRIBUTE_ERR = 10; - -// Introduced in DOM Level 2: -DOMException.INVALID_STATE_ERR = 11; -DOMException.SYNTAX_ERR = 12; -DOMException.INVALID_MODIFICATION_ERR = 13; -DOMException.NAMESPACE_ERR = 14; -DOMException.INVALID_ACCESS_ERR = 15; -$debug("Defining DocumentFragment"); -/* -* DocumentFragment - DOM Level 2 -*/ -/** - * @class DOMDocumentFragment - DocumentFragment is a "lightweight" or "minimal" Document object. - * @extends DOMNode - * @author Jon van Noort (jon@webarcana.com.au) and David Joham (djoham@yahoo.com) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMDocumentFragment = function(ownerDocument) { - this.DOMNode = DOMNode; - this.DOMNode(ownerDocument); - this.nodeName = "#document-fragment"; -}; -DOMDocumentFragment.prototype = new DOMNode; -__extend__(DOMDocumentFragment.prototype,{ - get nodeType(){ - return DOMNode.DOCUMENT_FRAGMENT_NODE; - }, - get xml(){ - var xml = "", - count = this.childNodes.length; - - // create string concatenating the serialized ChildNodes - for (var i = 0; i < count; i++) { - xml += this.childNodes.item(i).xml; - } - - return xml; - }, - toString : function(){ - return "DocumentFragment #"+this._id; - } -}); - -$w.DocumentFragment = DOMDocumentFragment; -$debug("Defining ProcessingInstruction"); -/* -* ProcessingInstruction - DOM Level 2 -*/ -/** - * @class DOMProcessingInstruction - The ProcessingInstruction interface represents a "processing instruction", - * used in XML as a way to keep processor-specific information in the text of the document - * @extends DOMNode - * @author Jon van Noort (jon@webarcana.com.au) - * @param ownerDocument : DOMDocument - The Document object associated with this node. - */ -var DOMProcessingInstruction = function(ownerDocument) { - this.DOMNode = DOMNode; - this.DOMNode(ownerDocument); -}; -DOMProcessingInstruction.prototype = new DOMNode; -__extend__(DOMProcessingInstruction.prototype, { - get data(){ - return this.nodeValue; - }, - set data(data){ - // throw Exception if DOMNode is readonly - if (__ownerDocument__(this).errorChecking && this._readonly) { - throw(new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR)); - } - this.nodeValue = data; - }, - get target(){ - // The target of this processing instruction. - // XML defines this as being the first token following the markup that begins the processing instruction. - // The content of this processing instruction. - return this.nodeName; - }, - get nodeType(){ - return DOMNode.PROCESSING_INSTRUCTION_NODE; - }, - get xml(){ - return ""; - }, - toString : function(){ - return "ProcessingInstruction #"+this._id; - } -}); - -$w.ProcessesingInstruction = DOMProcessingInstruction; -$debug("Defining DOMParser"); -/* -* DOMParser -*/ - -var DOMParser = function(){}; -__extend__(DOMParser.prototype,{ - parseFromString: function(xmlString){ - //$log("Parsing XML String: " +xmlString); - return document.implementation.createDocument().loadXML(xmlString); - } -}); - -$debug("Initializing Internal DOMParser."); -//keep one around for internal use -$domparser = new DOMParser(); - -$w.DOMParser = DOMParser; -// ========================================================================= -// -// xmlsax.js - an XML SAX parser in JavaScript. -// -// version 3.1 -// -// ========================================================================= -// -// Copyright (C) 2001 - 2002 David Joham (djoham@yahoo.com) and Scott Severtson -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Lesser General Public -// License as published by the Free Software Foundation; either -// version 2.1 of the License, or (at your option) any later version. - -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Lesser General Public License for more details. - -// You should have received a copy of the GNU Lesser General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// -// -// Visit the XML for