Rev 1372 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
/*Copyright (c) 2004-2006, The Dojo FoundationAll Rights Reserved.Licensed under the Academic Free License version 2.1 or above OR themodified 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");