1 /**
  2  * @fileOverview queue of anim objects
  3  * @author yiminghe@gmail.com
  4  */
  5 KISSY.add("anim/queue", function(S, DOM) {
  6 
  7     var /*队列集合容器*/
  8         queueCollectionKey = S.guid("ks-queue-" + S.now() + "-"),
  9         /*默认队列*/
 10         queueKey = S.guid("ks-queue-" + S.now() + "-"),
 11         // 当前队列是否有动画正在执行
 12         processing = "...";
 13 
 14     function getQueue(elem, name, readOnly) {
 15         name = name || queueKey;
 16 
 17         var qu,
 18             quCollection = DOM.data(elem, queueCollectionKey);
 19 
 20         if (!quCollection && !readOnly) {
 21             DOM.data(elem, queueCollectionKey, quCollection = {});
 22         }
 23 
 24         if (quCollection) {
 25             qu = quCollection[name];
 26             if (!qu && !readOnly) {
 27                 qu = quCollection[name] = [];
 28             }
 29         }
 30 
 31         return qu;
 32     }
 33 
 34     function removeQueue(elem, name) {
 35         name = name || queueKey;
 36         var quCollection = DOM.data(elem, queueCollectionKey);
 37         if (quCollection) {
 38             delete quCollection[name];
 39         }
 40         if (S.isEmptyObject(quCollection)) {
 41             DOM.removeData(elem, queueCollectionKey);
 42         }
 43     }
 44 
 45     var q = {
 46 
 47         queueCollectionKey:queueCollectionKey,
 48 
 49         queue:function(anim) {
 50             var elem = anim.elem,
 51                 name = anim.config.queue,
 52                 qu = getQueue(elem, name);
 53             qu.push(anim);
 54             if (qu[0] !== processing) {
 55                 q.dequeue(anim);
 56             }
 57             return qu;
 58         },
 59 
 60         remove:function(anim) {
 61             var elem = anim.elem,
 62                 name = anim.config.queue,
 63                 qu = getQueue(elem, name, 1),index;
 64             if (qu) {
 65                 index = S.indexOf(anim, qu);
 66                 if (index > -1) {
 67                     qu.splice(index, 1);
 68                 }
 69             }
 70         },
 71 
 72         removeQueues:function(elem) {
 73             DOM.removeData(elem, queueCollectionKey);
 74         },
 75 
 76         removeQueue:removeQueue,
 77 
 78         dequeue:function(anim) {
 79             var elem = anim.elem,
 80                 name = anim.config.queue,
 81                 qu = getQueue(elem, name, 1),
 82                 nextAnim = qu && qu.shift();
 83 
 84             if (nextAnim == processing) {
 85                 nextAnim = qu.shift();
 86             }
 87 
 88             if (nextAnim) {
 89                 qu.unshift(processing);
 90                 nextAnim._runInternal();
 91             } else {
 92                 // remove queue data
 93                 removeQueue(elem, name);
 94             }
 95         }
 96 
 97     };
 98     return q;
 99 }, {
100     requires:['dom']
101 });