/*
- Copyright (c) 2004-2010, The Dojo Foundation All Rights Reserved.
+ Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
Available via Academic Free License >= 2.1 OR the modified BSD license.
see: http://dojotoolkit.org/license for details
*/
-
-if(!dojo._hasResource["dojo.behavior"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.behavior"] = true;
-dojo.provide("dojo.behavior");
-
-dojo.behavior = new function(){
- // summary:
- // Utility for unobtrusive/progressive event binding, DOM traversal,
- // and manipulation.
- //
- // description:
- //
- // A very simple, lightweight mechanism for applying code to
- // existing documents, based around `dojo.query` (CSS3 selectors) for node selection,
- // and a simple two-command API: `dojo.behavior.add()` and `dojo.behavior.apply()`;
- //
- // Behaviors apply to a given page, and are registered following the syntax
- // options described by `dojo.behavior.add` to match nodes to actions, or "behaviors".
- //
- // Added behaviors are applied to the current DOM when .apply() is called,
- // matching only new nodes found since .apply() was last called.
- //
- function arrIn(obj, name){
- if(!obj[name]){ obj[name] = []; }
- return obj[name];
- }
-
- var _inc = 0;
-
- 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);
- }
- }
- }
- }
-
- // FIXME: need a better test so we don't exclude nightly Safari's!
- this._behaviors = {};
- this.add = function(/* Object */behaviorObj){
- // summary:
- // Add the specified behavior to the list of behaviors, ignoring existing
- // matches.
- //
- // description:
- // Add the specified behavior to the list of behaviors which will
- // be applied the next time apply() is called. Calls to add() for
- // an already existing behavior do not replace the previous rules,
- // but are instead additive. New nodes which match the rule will
- // have all add()-ed behaviors applied to them when matched.
- //
- // The "found" method is a generalized handler that's called as soon
- // as the node matches the selector. Rules for values that follow also
- // apply to the "found" key.
- //
- // The "on*" handlers are attached with `dojo.connect()`, using the
- // matching node
- //
- // If the value corresponding to the ID key is a function and not a
- // list, it's treated as though it was the value of "found".
- //
- // dojo.behavior.add() can be called any number of times before
- // the DOM is ready. `dojo.behavior.apply()` is called automatically
- // by `dojo.addOnLoad`, though can be called to re-apply previously added
- // behaviors anytime the DOM changes.
- //
- // There are a variety of formats permitted in the behaviorObject
- //
- // example:
- // Simple list of properties. "found" is special. "Found" is assumed if
- // no property object for a given selector, and property is a function.
- //
- // | dojo.behavior.add({
- // | "#id": {
- // | "found": function(element){
- // | // node match found
- // | },
- // | "onclick": function(evt){
- // | // register onclick handler for found node
- // | }
- // | },
- // | "#otherid": function(element){
- // | // assumes "found" with this syntax
- // | }
- // | });
- //
- // example:
- // If property is a string, a dojo.publish will be issued on the channel:
- //
- // | dojo.behavior.add({
- // | // dojo.publish() whenever class="noclick" found on anchors
- // | "a.noclick": "/got/newAnchor",
- // | "div.wrapper": {
- // | "onclick": "/node/wasClicked"
- // | }
- // | });
- // | dojo.subscribe("/got/newAnchor", function(node){
- // | // handle node finding when dojo.behavior.apply() is called,
- // | // provided a newly matched node is found.
- // | });
- //
- // example:
- // Scoping can be accomplished by passing an object as a property to
- // a connection handle (on*):
- //
- // | dojo.behavior.add({
- // | "#id": {
- // | // like calling dojo.hitch(foo,"bar"). execute foo.bar() in scope of foo
- // | "onmouseenter": { targetObj: foo, targetFunc: "bar" },
- // | "onmouseleave": { targetObj: foo, targetFunc: "baz" }
- // | }
- // | });
- //
- // example:
- // Bahaviors match on CSS3 Selectors, powered by dojo.query. Example selectors:
- //
- // | dojo.behavior.add({
- // | // match all direct descendants
- // | "#id4 > *": function(element){
- // | // ...
- // | },
- // |
- // | // match the first child node that's an element
- // | "#id4 > :first-child": { ... },
- // |
- // | // match the last child node that's an element
- // | "#id4 > :last-child": { ... },
- // |
- // | // all elements of type tagname
- // | "tagname": {
- // | // ...
- // | },
- // |
- // | "tagname1 tagname2 tagname3": {
- // | // ...
- // | },
- // |
- // | ".classname": {
- // | // ...
- // | },
- // |
- // | "tagname.classname": {
- // | // ...
- // | }
- // | });
- //
-
- var tmpObj = {};
- forIn(behaviorObj, this, function(behavior, name){
- var tBehavior = arrIn(this._behaviors, name);
- if(typeof tBehavior["id"] != "number"){
- tBehavior.id = _inc++;
- }
- var cversion = [];
- tBehavior.push(cversion);
- if((dojo.isString(behavior))||(dojo.isFunction(behavior))){
- behavior = { found: behavior };
- }
- forIn(behavior, function(rule, ruleName){
- arrIn(cversion, ruleName).push(rule);
- });
- });
- }
-
- var _applyToNode = function(node, action, ruleSetName){
- if(dojo.isString(action)){
- if(ruleSetName == "found"){
- dojo.publish(action, [ node ]);
- }else{
- dojo.connect(node, ruleSetName, function(){
- dojo.publish(action, arguments);
- });
- }
- }else if(dojo.isFunction(action)){
- if(ruleSetName == "found"){
- action(node);
- }else{
- dojo.connect(node, ruleSetName, action);
- }
- }
- }
-
- this.apply = function(){
- // summary:
- // Applies all currently registered behaviors to the document.
- //
- // description:
- // Applies all currently registered behaviors to the document,
- // taking care to ensure that only incremental updates are made
- // since the last time add() or apply() were called.
- //
- // If new matching nodes have been added, all rules in a behavior will be
- // applied to that node. For previously matched nodes, only
- // behaviors which have been added since the last call to apply()
- // will be added to the nodes.
- //
- // apply() is called once automatically by `dojo.addOnLoad`, so
- // registering behaviors with `dojo.behavior.add` before the DOM is
- // ready is acceptable, provided the dojo.behavior module is ready.
- //
- // Calling appy() manually after manipulating the DOM is required
- // to rescan the DOM and apply newly .add()ed behaviors, or to match
- // nodes that match existing behaviors when those nodes are added to
- // the DOM.
- //
- forIn(this._behaviors, function(tBehavior, id){
- dojo.query(id).forEach(
- function(elem){
- var runFrom = 0;
- var bid = "_dj_behavior_"+tBehavior.id;
- if(typeof elem[bid] == "number"){
- runFrom = elem[bid];
- if(runFrom == (tBehavior.length)){
- return;
- }
- }
- // run through the versions, applying newer rules at each step
-
- for(var x=runFrom, tver; tver = tBehavior[x]; x++){
- forIn(tver, function(ruleSet, ruleSetName){
- if(dojo.isArray(ruleSet)){
- dojo.forEach(ruleSet, function(action){
- _applyToNode(elem, action, ruleSetName);
- });
- }
- });
- }
-
- // ensure that re-application only adds new rules to the node
- elem[bid] = tBehavior.length;
- }
- );
- });
- }
-}
-
-dojo.addOnLoad(dojo.behavior, "apply");
-
-}
+//>>built
+define("dojo/behavior",["./_base/kernel","./_base/lang","./_base/array","./_base/connect","./query","./ready"],function(_1,_2,_3,_4,_5,_6){_1.deprecated("dojo.behavior","Use dojo/on with event delegation (on.selector())");var _7=function(){function _8(_9,_a){if(!_9[_a]){_9[_a]=[];}return _9[_a];};var _b=0;function _c(_d,_e,_f){var _10={};for(var x in _d){if(typeof _10[x]=="undefined"){if(!_f){_e(_d[x],x);}else{_f.call(_e,_d[x],x);}}}};this._behaviors={};this.add=function(_11){_c(_11,this,function(_12,_13){var _14=_8(this._behaviors,_13);if(typeof _14["id"]!="number"){_14.id=_b++;}var _15=[];_14.push(_15);if((_2.isString(_12))||(_2.isFunction(_12))){_12={found:_12};}_c(_12,function(_16,_17){_8(_15,_17).push(_16);});});};var _18=function(_19,_1a,_1b){if(_2.isString(_1a)){if(_1b=="found"){_4.publish(_1a,[_19]);}else{_4.connect(_19,_1b,function(){_4.publish(_1a,arguments);});}}else{if(_2.isFunction(_1a)){if(_1b=="found"){_1a(_19);}else{_4.connect(_19,_1b,_1a);}}}};this.apply=function(){_c(this._behaviors,function(_1c,id){_5(id).forEach(function(_1d){var _1e=0;var bid="_dj_behavior_"+_1c.id;if(typeof _1d[bid]=="number"){_1e=_1d[bid];if(_1e==(_1c.length)){return;}}for(var x=_1e,_1f;_1f=_1c[x];x++){_c(_1f,function(_20,_21){if(_2.isArray(_20)){_3.forEach(_20,function(_22){_18(_1d,_22,_21);});}});}_1d[bid]=_1c.length;});});};};_1.behavior=new _7();_6(_1.behavior,"apply");return _1.behavior;});
\ No newline at end of file