1 /**
  2  * @fileOverview simple event target for loader
  3  * @author yiminghe@gmail.com
  4  */
  5 (function (S) {
  6 
  7     if (typeof require !== 'undefined') {
  8         return;
  9     }
 10 
 11     var time = S.now(),
 12         p = "__events__" + time;
 13 
 14     function getHolder(self) {
 15         return self[p] || (self[p] = {});
 16     }
 17 
 18     function getEventHolder(self, name, create) {
 19         var holder = getHolder(self);
 20         if (create) {
 21             holder[name] = holder[name] || [];
 22         }
 23         return holder[name];
 24     }
 25 
 26     S.Loader.Target =
 27     /**
 28      * @lends KISSY.Loader#
 29      */
 30     {
 31         /**
 32          * register callback for specified eventName from loader
 33          * @param {String} eventName event name from kissy loader
 34          * @param {Function} callback function to be executed when event of eventName is fired
 35          */
 36         on:function (eventName, callback) {
 37             getEventHolder(this, eventName, 1).push(callback);
 38         },
 39 
 40         /**
 41          * remove callback for specified eventName from loader
 42          * @param {String} [eventName] eventName from kissy loader.
 43          * if undefined remove all callbacks for all events
 44          * @param {Function } [callback] function to be executed when event of eventName is fired.
 45          * if undefined remove all callbacks fro this event
 46          */
 47         detach:function (eventName, callback) {
 48             if (!eventName) {
 49                 delete this[p];
 50                 return;
 51             }
 52             var fns = getEventHolder(this, eventName);
 53             if (fns) {
 54                 if (callback) {
 55                     var index = S.indexOf(callback, fns);
 56                     if (index != -1) {
 57                         fns.splice(index, 1);
 58                     }
 59                 }
 60                 if (!callback || !fns.length) {
 61                     delete getHolder(this)[eventName];
 62                 }
 63             }
 64         },
 65 
 66         /**
 67          * @private
 68          */
 69         fire:function (eventName, obj) {
 70             var fns = getEventHolder(this, eventName);
 71             S.each(fns, function (f) {
 72                 f.call(null, obj);
 73             });
 74         }
 75     };
 76 })(KISSY);