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.behavior");
dojo.require("dojo.event.*");
dojo.require("dojo.experimental");
dojo.experimental("dojo.behavior");
dojo.behavior = new function () {
        function arrIn(obj, name) {
                if (!obj[name]) {
                        obj[name] = [];
                }
                return obj[name];
        }
        function forIn(obj, scope, func) {
                var tmpObj = {};
                for (var x in obj) {
                        if (typeof tmpObj[x] == "undefined") {
                                if (!func) {
                                        scope(obj[x], x);
                                } else {
                                        func.call(scope, obj[x], x);
                                }
                        }
                }
        }
        this.behaviors = {};
        this.add = function (behaviorObj) {
                var tmpObj = {};
                forIn(behaviorObj, this, function (behavior, name) {
                        var tBehavior = arrIn(this.behaviors, name);
                        if ((dojo.lang.isString(behavior)) || (dojo.lang.isFunction(behavior))) {
                                behavior = {found:behavior};
                        }
                        forIn(behavior, function (rule, ruleName) {
                                arrIn(tBehavior, ruleName).push(rule);
                        });
                });
        };
        this.apply = function () {
                dojo.profile.start("dojo.behavior.apply");
                var r = dojo.render.html;
                var safariGoodEnough = (!r.safari);
                if (r.safari) {
                        var uas = r.UA.split("AppleWebKit/")[1];
                        if (parseInt(uas.match(/[0-9.]{3,}/)) >= 420) {
                                safariGoodEnough = true;
                        }
                }
                if ((dj_undef("behaviorFastParse", djConfig) ? (safariGoodEnough) : djConfig["behaviorFastParse"])) {
                        this.applyFast();
                } else {
                        this.applySlow();
                }
                dojo.profile.end("dojo.behavior.apply");
        };
        this.matchCache = {};
        this.elementsById = function (id, handleRemoved) {
                var removed = [];
                var added = [];
                arrIn(this.matchCache, id);
                if (handleRemoved) {
                        var nodes = this.matchCache[id];
                        for (var x = 0; x < nodes.length; x++) {
                                if (nodes[x].id != "") {
                                        removed.push(nodes[x]);
                                        nodes.splice(x, 1);
                                        x--;
                                }
                        }
                }
                var tElem = dojo.byId(id);
                while (tElem) {
                        if (!tElem["idcached"]) {
                                added.push(tElem);
                        }
                        tElem.id = "";
                        tElem = dojo.byId(id);
                }
                this.matchCache[id] = this.matchCache[id].concat(added);
                dojo.lang.forEach(this.matchCache[id], function (node) {
                        node.id = id;
                        node.idcached = true;
                });
                return {"removed":removed, "added":added, "match":this.matchCache[id]};
        };
        this.applyToNode = function (node, action, ruleSetName) {
                if (typeof action == "string") {
                        dojo.event.topic.registerPublisher(action, node, ruleSetName);
                } else {
                        if (typeof action == "function") {
                                if (ruleSetName == "found") {
                                        action(node);
                                } else {
                                        dojo.event.connect(node, ruleSetName, action);
                                }
                        } else {
                                action.srcObj = node;
                                action.srcFunc = ruleSetName;
                                dojo.event.kwConnect(action);
                        }
                }
        };
        this.applyFast = function () {
                dojo.profile.start("dojo.behavior.applyFast");
                forIn(this.behaviors, function (tBehavior, id) {
                        var elems = dojo.behavior.elementsById(id);
                        dojo.lang.forEach(elems.added, function (elem) {
                                forIn(tBehavior, function (ruleSet, ruleSetName) {
                                        if (dojo.lang.isArray(ruleSet)) {
                                                dojo.lang.forEach(ruleSet, function (action) {
                                                        dojo.behavior.applyToNode(elem, action, ruleSetName);
                                                });
                                        }
                                });
                        });
                });
                dojo.profile.end("dojo.behavior.applyFast");
        };
        this.applySlow = function () {
                dojo.profile.start("dojo.behavior.applySlow");
                var all = document.getElementsByTagName("*");
                var allLen = all.length;
                for (var x = 0; x < allLen; x++) {
                        var elem = all[x];
                        if ((elem.id) && (!elem["behaviorAdded"]) && (this.behaviors[elem.id])) {
                                elem["behaviorAdded"] = true;
                                forIn(this.behaviors[elem.id], function (ruleSet, ruleSetName) {
                                        if (dojo.lang.isArray(ruleSet)) {
                                                dojo.lang.forEach(ruleSet, function (action) {
                                                        dojo.behavior.applyToNode(elem, action, ruleSetName);
                                                });
                                        }
                                });
                        }
                }
                dojo.profile.end("dojo.behavior.applySlow");
        };
};
dojo.addOnLoad(dojo.behavior, "apply");