New file |
0,0 → 1,164 |
/* |
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.data.OpmlStore"); |
dojo.require("dojo.data.core.Read"); |
dojo.require("dojo.data.core.Result"); |
dojo.require("dojo.lang.assert"); |
dojo.require("dojo.json"); |
dojo.require("dojo.experimental"); |
dojo.experimental("dojo.data.OpmlStore"); |
dojo.declare("dojo.data.OpmlStore", dojo.data.core.Read, {initializer:function (keywordParameters) { |
this._arrayOfTopLevelItems = []; |
this._metadataNodes = null; |
this._loadFinished = false; |
this._opmlFileUrl = keywordParameters["url"]; |
}, _assertIsItem:function (item) { |
if (!this.isItem(item)) { |
throw new Error("dojo.data.OpmlStore: a function was passed an item argument that was not an item"); |
} |
}, _removeChildNodesThatAreNotElementNodes:function (node, recursive) { |
var childNodes = node.childNodes; |
if (childNodes.length == 0) { |
return; |
} |
var nodesToRemove = []; |
var i, childNode; |
for (i = 0; i < childNodes.length; ++i) { |
childNode = childNodes[i]; |
if (childNode.nodeType != Node.ELEMENT_NODE) { |
nodesToRemove.push(childNode); |
} |
} |
for (i = 0; i < nodesToRemove.length; ++i) { |
childNode = nodesToRemove[i]; |
node.removeChild(childNode); |
} |
if (recursive) { |
for (i = 0; i < childNodes.length; ++i) { |
childNode = childNodes[i]; |
this._removeChildNodesThatAreNotElementNodes(childNode, recursive); |
} |
} |
}, _processRawXmlTree:function (rawXmlTree) { |
var headNodes = rawXmlTree.getElementsByTagName("head"); |
var headNode = headNodes[0]; |
this._removeChildNodesThatAreNotElementNodes(headNode); |
this._metadataNodes = headNode.childNodes; |
var bodyNodes = rawXmlTree.getElementsByTagName("body"); |
var bodyNode = bodyNodes[0]; |
this._removeChildNodesThatAreNotElementNodes(bodyNode, true); |
var bodyChildNodes = bodyNodes[0].childNodes; |
for (var i = 0; i < bodyChildNodes.length; ++i) { |
var node = bodyChildNodes[i]; |
if (node.tagName == "outline") { |
this._arrayOfTopLevelItems.push(node); |
} |
} |
}, get:function (item, attribute, defaultValue) { |
this._assertIsItem(item); |
if (attribute == "children") { |
return (item.firstChild || defaultValue); |
} else { |
var value = item.getAttribute(attribute); |
value = (value != undefined) ? value : defaultValue; |
return value; |
} |
}, getValues:function (item, attribute) { |
this._assertIsItem(item); |
if (attribute == "children") { |
var array = []; |
for (var i = 0; i < item.childNodes.length; ++i) { |
array.push(item.childNodes[i]); |
} |
return array; |
} else { |
return [item.getAttribute(attribute)]; |
} |
}, getAttributes:function (item) { |
this._assertIsItem(item); |
var attributes = []; |
var xmlNode = item; |
var xmlAttributes = xmlNode.attributes; |
for (var i = 0; i < xmlAttributes.length; ++i) { |
var xmlAttribute = xmlAttributes.item(i); |
attributes.push(xmlAttribute.nodeName); |
} |
if (xmlNode.childNodes.length > 0) { |
attributes.push("children"); |
} |
return attributes; |
}, hasAttribute:function (item, attribute) { |
return (this.getValues(item, attribute).length > 0); |
}, containsValue:function (item, attribute, value) { |
var values = this.getValues(item, attribute); |
for (var i = 0; i < values.length; ++i) { |
var possibleValue = values[i]; |
if (value == possibleValue) { |
return true; |
} |
} |
return false; |
}, isItem:function (something) { |
return (something && something.nodeType == Node.ELEMENT_NODE && something.tagName == "outline"); |
}, isItemAvailable:function (something) { |
return this.isItem(something); |
}, find:function (keywordArgs) { |
var result = null; |
if (keywordArgs instanceof dojo.data.core.Result) { |
result = keywordArgs; |
result.store = this; |
} else { |
result = new dojo.data.core.Result(keywordArgs, this); |
} |
var self = this; |
var bindHandler = function (type, data, evt) { |
var scope = result.scope || dj_global; |
if (type == "load") { |
self._processRawXmlTree(data); |
if (result.saveResult) { |
result.items = self._arrayOfTopLevelItems; |
} |
if (result.onbegin) { |
result.onbegin.call(scope, result); |
} |
for (var i = 0; i < self._arrayOfTopLevelItems.length; i++) { |
var item = self._arrayOfTopLevelItems[i]; |
if (result.onnext && !result._aborted) { |
result.onnext.call(scope, item, result); |
} |
} |
if (result.oncompleted && !result._aborted) { |
result.oncompleted.call(scope, result); |
} |
} else { |
if (type == "error" || type == "timeout") { |
var errorObject = data; |
if (result.onerror) { |
result.onerror.call(scope, data); |
} |
} |
} |
}; |
if (!this._loadFinished) { |
if (this._opmlFileUrl) { |
var bindRequest = dojo.io.bind({url:this._opmlFileUrl, handle:bindHandler, mimetype:"text/xml", sync:(result.sync || false)}); |
result._abortFunc = bindRequest.abort; |
} |
} |
return result; |
}, getIdentity:function (item) { |
dojo.unimplemented("dojo.data.OpmlStore.getIdentity()"); |
return null; |
}, findByIdentity:function (identity) { |
dojo.unimplemented("dojo.data.OpmlStore.findByIdentity()"); |
return null; |
}}); |
|