Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Blame | Compare with Previous | 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.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;
}});