ext-all-debug.js
上传用户:chliyg
上传日期:2016-05-15
资源大小:3196k
文件大小:951k
源码类别:

Jsp/Servlet

开发平台:

Java

  1.         this.DDM.refreshCache(this.groups);
  2.         var pt = new Ext.lib.Point(Ext.lib.Event.getPageX(e), Ext.lib.Event.getPageY(e));
  3.         if (!this.hasOuterHandles && !this.DDM.isOverTarget(pt, this) )  {
  4.         } else {
  5.             if (this.clickValidator(e)) {
  6.                                  this.setStartPosition();
  7.                 this.b4MouseDown(e);
  8.                 this.onMouseDown(e);
  9.                 this.DDM.handleMouseDown(e, this);
  10.                 this.DDM.stopEvent(e);
  11.             } else {
  12.             }
  13.         }
  14.     },
  15.     clickValidator: function(e) {
  16.         var target = e.getTarget();
  17.         return ( this.isValidHandleChild(target) &&
  18.                     (this.id == this.handleElId ||
  19.                         this.DDM.handleWasClicked(target, this.id)) );
  20.     },
  21.     
  22.     addInvalidHandleType: function(tagName) {
  23.         var type = tagName.toUpperCase();
  24.         this.invalidHandleTypes[type] = type;
  25.     },
  26.     
  27.     addInvalidHandleId: function(id) {
  28.         if (typeof id !== "string") {
  29.             id = Ext.id(id);
  30.         }
  31.         this.invalidHandleIds[id] = id;
  32.     },
  33.     
  34.     addInvalidHandleClass: function(cssClass) {
  35.         this.invalidHandleClasses.push(cssClass);
  36.     },
  37.     
  38.     removeInvalidHandleType: function(tagName) {
  39.         var type = tagName.toUpperCase();
  40.                  delete this.invalidHandleTypes[type];
  41.     },
  42.     
  43.     removeInvalidHandleId: function(id) {
  44.         if (typeof id !== "string") {
  45.             id = Ext.id(id);
  46.         }
  47.         delete this.invalidHandleIds[id];
  48.     },
  49.     
  50.     removeInvalidHandleClass: function(cssClass) {
  51.         for (var i=0, len=this.invalidHandleClasses.length; i<len; ++i) {
  52.             if (this.invalidHandleClasses[i] == cssClass) {
  53.                 delete this.invalidHandleClasses[i];
  54.             }
  55.         }
  56.     },
  57.     
  58.     isValidHandleChild: function(node) {
  59.         var valid = true;
  60.                  var nodeName;
  61.         try {
  62.             nodeName = node.nodeName.toUpperCase();
  63.         } catch(e) {
  64.             nodeName = node.nodeName;
  65.         }
  66.         valid = valid && !this.invalidHandleTypes[nodeName];
  67.         valid = valid && !this.invalidHandleIds[node.id];
  68.         for (var i=0, len=this.invalidHandleClasses.length; valid && i<len; ++i) {
  69.             valid = !Ext.fly(node).hasClass(this.invalidHandleClasses[i]);
  70.         }
  71.         return valid;
  72.     },
  73.     
  74.     setXTicks: function(iStartX, iTickSize) {
  75.         this.xTicks = [];
  76.         this.xTickSize = iTickSize;
  77.         var tickMap = {};
  78.         for (var i = this.initPageX; i >= this.minX; i = i - iTickSize) {
  79.             if (!tickMap[i]) {
  80.                 this.xTicks[this.xTicks.length] = i;
  81.                 tickMap[i] = true;
  82.             }
  83.         }
  84.         for (i = this.initPageX; i <= this.maxX; i = i + iTickSize) {
  85.             if (!tickMap[i]) {
  86.                 this.xTicks[this.xTicks.length] = i;
  87.                 tickMap[i] = true;
  88.             }
  89.         }
  90.         this.xTicks.sort(this.DDM.numericSort) ;
  91.     },
  92.     
  93.     setYTicks: function(iStartY, iTickSize) {
  94.         this.yTicks = [];
  95.         this.yTickSize = iTickSize;
  96.         var tickMap = {};
  97.         for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
  98.             if (!tickMap[i]) {
  99.                 this.yTicks[this.yTicks.length] = i;
  100.                 tickMap[i] = true;
  101.             }
  102.         }
  103.         for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
  104.             if (!tickMap[i]) {
  105.                 this.yTicks[this.yTicks.length] = i;
  106.                 tickMap[i] = true;
  107.             }
  108.         }
  109.         this.yTicks.sort(this.DDM.numericSort) ;
  110.     },
  111.     
  112.     setXConstraint: function(iLeft, iRight, iTickSize) {
  113.         this.leftConstraint = iLeft;
  114.         this.rightConstraint = iRight;
  115.         this.minX = this.initPageX - iLeft;
  116.         this.maxX = this.initPageX + iRight;
  117.         if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
  118.         this.constrainX = true;
  119.     },
  120.     
  121.     clearConstraints: function() {
  122.         this.constrainX = false;
  123.         this.constrainY = false;
  124.         this.clearTicks();
  125.     },
  126.     
  127.     clearTicks: function() {
  128.         this.xTicks = null;
  129.         this.yTicks = null;
  130.         this.xTickSize = 0;
  131.         this.yTickSize = 0;
  132.     },
  133.     
  134.     setYConstraint: function(iUp, iDown, iTickSize) {
  135.         this.topConstraint = iUp;
  136.         this.bottomConstraint = iDown;
  137.         this.minY = this.initPageY - iUp;
  138.         this.maxY = this.initPageY + iDown;
  139.         if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
  140.         this.constrainY = true;
  141.     },
  142.     
  143.     resetConstraints: function() {
  144.                  if (this.initPageX || this.initPageX === 0) {
  145.                          var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
  146.             var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
  147.             this.setInitPosition(dx, dy);
  148.                  } else {
  149.             this.setInitPosition();
  150.         }
  151.         if (this.constrainX) {
  152.             this.setXConstraint( this.leftConstraint,
  153.                                  this.rightConstraint,
  154.                                  this.xTickSize        );
  155.         }
  156.         if (this.constrainY) {
  157.             this.setYConstraint( this.topConstraint,
  158.                                  this.bottomConstraint,
  159.                                  this.yTickSize         );
  160.         }
  161.     },
  162.     
  163.     getTick: function(val, tickArray) {
  164.         if (!tickArray) {
  165.                                       return val;
  166.         } else if (tickArray[0] >= val) {
  167.                                       return tickArray[0];
  168.         } else {
  169.             for (var i=0, len=tickArray.length; i<len; ++i) {
  170.                 var next = i + 1;
  171.                 if (tickArray[next] && tickArray[next] >= val) {
  172.                     var diff1 = val - tickArray[i];
  173.                     var diff2 = tickArray[next] - val;
  174.                     return (diff2 > diff1) ? tickArray[i] : tickArray[next];
  175.                 }
  176.             }
  177.                                       return tickArray[tickArray.length - 1];
  178.         }
  179.     },
  180.     
  181.     toString: function() {
  182.         return ("DragDrop " + this.id);
  183.     }
  184. };
  185. })();
  186. if (!Ext.dd.DragDropMgr) {
  187. Ext.dd.DragDropMgr = function() {
  188.     var Event = Ext.EventManager;
  189.     return {
  190.         
  191.         ids: {},
  192.         
  193.         handleIds: {},
  194.         
  195.         dragCurrent: null,
  196.         
  197.         dragOvers: {},
  198.         
  199.         deltaX: 0,
  200.         
  201.         deltaY: 0,
  202.         
  203.         preventDefault: true,
  204.         
  205.         stopPropagation: true,
  206.         
  207.         initialized: false,
  208.         
  209.         locked: false,
  210.         
  211.         init: function() {
  212.             this.initialized = true;
  213.         },
  214.         
  215.         POINT: 0,
  216.         
  217.         INTERSECT: 1,
  218.         
  219.         mode: 0,
  220.         
  221.         _execOnAll: function(sMethod, args) {
  222.             for (var i in this.ids) {
  223.                 for (var j in this.ids[i]) {
  224.                     var oDD = this.ids[i][j];
  225.                     if (! this.isTypeOfDD(oDD)) {
  226.                         continue;
  227.                     }
  228.                     oDD[sMethod].apply(oDD, args);
  229.                 }
  230.             }
  231.         },
  232.         
  233.         _onLoad: function() {
  234.             this.init();
  235.             Event.on(document, "mouseup",   this.handleMouseUp, this, true);
  236.             Event.on(document, "mousemove", this.handleMouseMove, this, true);
  237.             Event.on(window,   "unload",    this._onUnload, this, true);
  238.             Event.on(window,   "resize",    this._onResize, this, true);
  239.             
  240.         },
  241.         
  242.         _onResize: function(e) {
  243.             this._execOnAll("resetConstraints", []);
  244.         },
  245.         
  246.         lock: function() { this.locked = true; },
  247.         
  248.         unlock: function() { this.locked = false; },
  249.         
  250.         isLocked: function() { return this.locked; },
  251.         
  252.         locationCache: {},
  253.         
  254.         useCache: true,
  255.         
  256.         clickPixelThresh: 3,
  257.         
  258.         clickTimeThresh: 350,
  259.         
  260.         dragThreshMet: false,
  261.         
  262.         clickTimeout: null,
  263.         
  264.         startX: 0,
  265.         
  266.         startY: 0,
  267.         
  268.         regDragDrop: function(oDD, sGroup) {
  269.             if (!this.initialized) { this.init(); }
  270.             if (!this.ids[sGroup]) {
  271.                 this.ids[sGroup] = {};
  272.             }
  273.             this.ids[sGroup][oDD.id] = oDD;
  274.         },
  275.         
  276.         removeDDFromGroup: function(oDD, sGroup) {
  277.             if (!this.ids[sGroup]) {
  278.                 this.ids[sGroup] = {};
  279.             }
  280.             var obj = this.ids[sGroup];
  281.             if (obj && obj[oDD.id]) {
  282.                 delete obj[oDD.id];
  283.             }
  284.         },
  285.         
  286.         _remove: function(oDD) {
  287.             for (var g in oDD.groups) {
  288.                 if (g && this.ids[g][oDD.id]) {
  289.                     delete this.ids[g][oDD.id];
  290.                 }
  291.             }
  292.             delete this.handleIds[oDD.id];
  293.         },
  294.         
  295.         regHandle: function(sDDId, sHandleId) {
  296.             if (!this.handleIds[sDDId]) {
  297.                 this.handleIds[sDDId] = {};
  298.             }
  299.             this.handleIds[sDDId][sHandleId] = sHandleId;
  300.         },
  301.         
  302.         isDragDrop: function(id) {
  303.             return ( this.getDDById(id) ) ? true : false;
  304.         },
  305.         
  306.         getRelated: function(p_oDD, bTargetsOnly) {
  307.             var oDDs = [];
  308.             for (var i in p_oDD.groups) {
  309.                 for (j in this.ids[i]) {
  310.                     var dd = this.ids[i][j];
  311.                     if (! this.isTypeOfDD(dd)) {
  312.                         continue;
  313.                     }
  314.                     if (!bTargetsOnly || dd.isTarget) {
  315.                         oDDs[oDDs.length] = dd;
  316.                     }
  317.                 }
  318.             }
  319.             return oDDs;
  320.         },
  321.         
  322.         isLegalTarget: function (oDD, oTargetDD) {
  323.             var targets = this.getRelated(oDD, true);
  324.             for (var i=0, len=targets.length;i<len;++i) {
  325.                 if (targets[i].id == oTargetDD.id) {
  326.                     return true;
  327.                 }
  328.             }
  329.             return false;
  330.         },
  331.         
  332.         isTypeOfDD: function (oDD) {
  333.             return (oDD && oDD.__ygDragDrop);
  334.         },
  335.         
  336.         isHandle: function(sDDId, sHandleId) {
  337.             return ( this.handleIds[sDDId] &&
  338.                             this.handleIds[sDDId][sHandleId] );
  339.         },
  340.         
  341.         getDDById: function(id) {
  342.             for (var i in this.ids) {
  343.                 if (this.ids[i][id]) {
  344.                     return this.ids[i][id];
  345.                 }
  346.             }
  347.             return null;
  348.         },
  349.         
  350.         handleMouseDown: function(e, oDD) {
  351.             if(Ext.QuickTips){
  352.                 Ext.QuickTips.disable();
  353.             }
  354.             this.currentTarget = e.getTarget();
  355.             this.dragCurrent = oDD;
  356.             var el = oDD.getEl();
  357.                          this.startX = e.getPageX();
  358.             this.startY = e.getPageY();
  359.             this.deltaX = this.startX - el.offsetLeft;
  360.             this.deltaY = this.startY - el.offsetTop;
  361.             this.dragThreshMet = false;
  362.             this.clickTimeout = setTimeout(
  363.                     function() {
  364.                         var DDM = Ext.dd.DDM;
  365.                         DDM.startDrag(DDM.startX, DDM.startY);
  366.                     },
  367.                     this.clickTimeThresh );
  368.         },
  369.         
  370.         startDrag: function(x, y) {
  371.             clearTimeout(this.clickTimeout);
  372.             if (this.dragCurrent) {
  373.                 this.dragCurrent.b4StartDrag(x, y);
  374.                 this.dragCurrent.startDrag(x, y);
  375.             }
  376.             this.dragThreshMet = true;
  377.         },
  378.         
  379.         handleMouseUp: function(e) {
  380.             if(Ext.QuickTips){
  381.                 Ext.QuickTips.enable();
  382.             }
  383.             if (! this.dragCurrent) {
  384.                 return;
  385.             }
  386.             clearTimeout(this.clickTimeout);
  387.             if (this.dragThreshMet) {
  388.                 this.fireEvents(e, true);
  389.             } else {
  390.             }
  391.             this.stopDrag(e);
  392.             this.stopEvent(e);
  393.         },
  394.         
  395.         stopEvent: function(e){
  396.             if(this.stopPropagation) {
  397.                 e.stopPropagation();
  398.             }
  399.             if (this.preventDefault) {
  400.                 e.preventDefault();
  401.             }
  402.         },
  403.         
  404.         stopDrag: function(e) {
  405.                          if (this.dragCurrent) {
  406.                 if (this.dragThreshMet) {
  407.                     this.dragCurrent.b4EndDrag(e);
  408.                     this.dragCurrent.endDrag(e);
  409.                 }
  410.                 this.dragCurrent.onMouseUp(e);
  411.             }
  412.             this.dragCurrent = null;
  413.             this.dragOvers = {};
  414.         },
  415.         
  416.         handleMouseMove: function(e) {
  417.             if (! this.dragCurrent) {
  418.                 return true;
  419.             }
  420.             
  421.                          if (Ext.isIE && (e.button !== 0 && e.button !== 1 && e.button !== 2)) {
  422.                 this.stopEvent(e);
  423.                 return this.handleMouseUp(e);
  424.             }
  425.             if (!this.dragThreshMet) {
  426.                 var diffX = Math.abs(this.startX - e.getPageX());
  427.                 var diffY = Math.abs(this.startY - e.getPageY());
  428.                 if (diffX > this.clickPixelThresh ||
  429.                             diffY > this.clickPixelThresh) {
  430.                     this.startDrag(this.startX, this.startY);
  431.                 }
  432.             }
  433.             if (this.dragThreshMet) {
  434.                 this.dragCurrent.b4Drag(e);
  435.                 this.dragCurrent.onDrag(e);
  436.                 if(!this.dragCurrent.moveOnly){
  437.                     this.fireEvents(e, false);
  438.                 }
  439.             }
  440.             this.stopEvent(e);
  441.             return true;
  442.         },
  443.         
  444.         fireEvents: function(e, isDrop) {
  445.             var dc = this.dragCurrent;
  446.                                       if (!dc || dc.isLocked()) {
  447.                 return;
  448.             }
  449.             var pt = e.getPoint();
  450.                          var oldOvers = [];
  451.             var outEvts   = [];
  452.             var overEvts  = [];
  453.             var dropEvts  = [];
  454.             var enterEvts = [];
  455.                                       for (var i in this.dragOvers) {
  456.                 var ddo = this.dragOvers[i];
  457.                 if (! this.isTypeOfDD(ddo)) {
  458.                     continue;
  459.                 }
  460.                 if (! this.isOverTarget(pt, ddo, this.mode)) {
  461.                     outEvts.push( ddo );
  462.                 }
  463.                 oldOvers[i] = true;
  464.                 delete this.dragOvers[i];
  465.             }
  466.             for (var sGroup in dc.groups) {
  467.                 if ("string" != typeof sGroup) {
  468.                     continue;
  469.                 }
  470.                 for (i in this.ids[sGroup]) {
  471.                     var oDD = this.ids[sGroup][i];
  472.                     if (! this.isTypeOfDD(oDD)) {
  473.                         continue;
  474.                     }
  475.                     if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {
  476.                         if (this.isOverTarget(pt, oDD, this.mode)) {
  477.                                                          if (isDrop) {
  478.                                 dropEvts.push( oDD );
  479.                                                          } else {
  480.                                                                  if (!oldOvers[oDD.id]) {
  481.                                     enterEvts.push( oDD );
  482.                                                                  } else {
  483.                                     overEvts.push( oDD );
  484.                                 }
  485.                                 this.dragOvers[oDD.id] = oDD;
  486.                             }
  487.                         }
  488.                     }
  489.                 }
  490.             }
  491.             if (this.mode) {
  492.                 if (outEvts.length) {
  493.                     dc.b4DragOut(e, outEvts);
  494.                     dc.onDragOut(e, outEvts);
  495.                 }
  496.                 if (enterEvts.length) {
  497.                     dc.onDragEnter(e, enterEvts);
  498.                 }
  499.                 if (overEvts.length) {
  500.                     dc.b4DragOver(e, overEvts);
  501.                     dc.onDragOver(e, overEvts);
  502.                 }
  503.                 if (dropEvts.length) {
  504.                     dc.b4DragDrop(e, dropEvts);
  505.                     dc.onDragDrop(e, dropEvts);
  506.                 }
  507.             } else {
  508.                                  var len = 0;
  509.                 for (i=0, len=outEvts.length; i<len; ++i) {
  510.                     dc.b4DragOut(e, outEvts[i].id);
  511.                     dc.onDragOut(e, outEvts[i].id);
  512.                 }
  513.                                  for (i=0,len=enterEvts.length; i<len; ++i) {
  514.                                          dc.onDragEnter(e, enterEvts[i].id);
  515.                 }
  516.                                  for (i=0,len=overEvts.length; i<len; ++i) {
  517.                     dc.b4DragOver(e, overEvts[i].id);
  518.                     dc.onDragOver(e, overEvts[i].id);
  519.                 }
  520.                                  for (i=0, len=dropEvts.length; i<len; ++i) {
  521.                     dc.b4DragDrop(e, dropEvts[i].id);
  522.                     dc.onDragDrop(e, dropEvts[i].id);
  523.                 }
  524.             }
  525.                          if (isDrop && !dropEvts.length) {
  526.                 dc.onInvalidDrop(e);
  527.             }
  528.         },
  529.         
  530.         getBestMatch: function(dds) {
  531.             var winner = null;
  532.                                                                    
  533.             var len = dds.length;
  534.             if (len == 1) {
  535.                 winner = dds[0];
  536.             } else {
  537.                                  for (var i=0; i<len; ++i) {
  538.                     var dd = dds[i];
  539.                                                                                    if (dd.cursorIsOver) {
  540.                         winner = dd;
  541.                         break;
  542.                                          } else {
  543.                         if (!winner ||
  544.                             winner.overlap.getArea() < dd.overlap.getArea()) {
  545.                             winner = dd;
  546.                         }
  547.                     }
  548.                 }
  549.             }
  550.             return winner;
  551.         },
  552.         
  553.         refreshCache: function(groups) {
  554.             for (var sGroup in groups) {
  555.                 if ("string" != typeof sGroup) {
  556.                     continue;
  557.                 }
  558.                 for (var i in this.ids[sGroup]) {
  559.                     var oDD = this.ids[sGroup][i];
  560.                     if (this.isTypeOfDD(oDD)) {
  561.                                              var loc = this.getLocation(oDD);
  562.                         if (loc) {
  563.                             this.locationCache[oDD.id] = loc;
  564.                         } else {
  565.                             delete this.locationCache[oDD.id];
  566.                                                                                                                }
  567.                     }
  568.                 }
  569.             }
  570.         },
  571.         
  572.         verifyEl: function(el) {
  573.             if (el) {
  574.                 var parent;
  575.                 if(Ext.isIE){
  576.                     try{
  577.                         parent = el.offsetParent;
  578.                     }catch(e){}
  579.                 }else{
  580.                     parent = el.offsetParent;
  581.                 }
  582.                 if (parent) {
  583.                     return true;
  584.                 }
  585.             }
  586.             return false;
  587.         },
  588.         
  589.         getLocation: function(oDD) {
  590.             if (! this.isTypeOfDD(oDD)) {
  591.                 return null;
  592.             }
  593.             var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;
  594.             try {
  595.                 pos= Ext.lib.Dom.getXY(el);
  596.             } catch (e) { }
  597.             if (!pos) {
  598.                 return null;
  599.             }
  600.             x1 = pos[0];
  601.             x2 = x1 + el.offsetWidth;
  602.             y1 = pos[1];
  603.             y2 = y1 + el.offsetHeight;
  604.             t = y1 - oDD.padding[0];
  605.             r = x2 + oDD.padding[1];
  606.             b = y2 + oDD.padding[2];
  607.             l = x1 - oDD.padding[3];
  608.             return new Ext.lib.Region( t, r, b, l );
  609.         },
  610.         
  611.         isOverTarget: function(pt, oTarget, intersect) {
  612.                          var loc = this.locationCache[oTarget.id];
  613.             if (!loc || !this.useCache) {
  614.                 loc = this.getLocation(oTarget);
  615.                 this.locationCache[oTarget.id] = loc;
  616.             }
  617.             if (!loc) {
  618.                 return false;
  619.             }
  620.             oTarget.cursorIsOver = loc.contains( pt );
  621.                                                                              var dc = this.dragCurrent;
  622.             if (!dc || !dc.getTargetCoord ||
  623.                     (!intersect && !dc.constrainX && !dc.constrainY)) {
  624.                 return oTarget.cursorIsOver;
  625.             }
  626.             oTarget.overlap = null;
  627.                                                                 var pos = dc.getTargetCoord(pt.x, pt.y);
  628.             var el = dc.getDragEl();
  629.             var curRegion = new Ext.lib.Region( pos.y,
  630.                                                    pos.x + el.offsetWidth,
  631.                                                    pos.y + el.offsetHeight,
  632.                                                    pos.x );
  633.             var overlap = curRegion.intersect(loc);
  634.             if (overlap) {
  635.                 oTarget.overlap = overlap;
  636.                 return (intersect) ? true : oTarget.cursorIsOver;
  637.             } else {
  638.                 return false;
  639.             }
  640.         },
  641.         
  642.         _onUnload: function(e, me) {
  643.             Ext.dd.DragDropMgr.unregAll();
  644.         },
  645.         
  646.         unregAll: function() {
  647.             if (this.dragCurrent) {
  648.                 this.stopDrag();
  649.                 this.dragCurrent = null;
  650.             }
  651.             this._execOnAll("unreg", []);
  652.             for (var i in this.elementCache) {
  653.                 delete this.elementCache[i];
  654.             }
  655.             this.elementCache = {};
  656.             this.ids = {};
  657.         },
  658.         
  659.         elementCache: {},
  660.         
  661.         getElWrapper: function(id) {
  662.             var oWrapper = this.elementCache[id];
  663.             if (!oWrapper || !oWrapper.el) {
  664.                 oWrapper = this.elementCache[id] =
  665.                     new this.ElementWrapper(Ext.getDom(id));
  666.             }
  667.             return oWrapper;
  668.         },
  669.         
  670.         getElement: function(id) {
  671.             return Ext.getDom(id);
  672.         },
  673.         
  674.         getCss: function(id) {
  675.             var el = Ext.getDom(id);
  676.             return (el) ? el.style : null;
  677.         },
  678.         
  679.         ElementWrapper: function(el) {
  680.                 
  681.                 this.el = el || null;
  682.                 
  683.                 this.id = this.el && el.id;
  684.                 
  685.                 this.css = this.el && el.style;
  686.             },
  687.         
  688.         getPosX: function(el) {
  689.             return Ext.lib.Dom.getX(el);
  690.         },
  691.         
  692.         getPosY: function(el) {
  693.             return Ext.lib.Dom.getY(el);
  694.         },
  695.         
  696.         swapNode: function(n1, n2) {
  697.             if (n1.swapNode) {
  698.                 n1.swapNode(n2);
  699.             } else {
  700.                 var p = n2.parentNode;
  701.                 var s = n2.nextSibling;
  702.                 if (s == n1) {
  703.                     p.insertBefore(n1, n2);
  704.                 } else if (n2 == n1.nextSibling) {
  705.                     p.insertBefore(n2, n1);
  706.                 } else {
  707.                     n1.parentNode.replaceChild(n2, n1);
  708.                     p.insertBefore(n1, s);
  709.                 }
  710.             }
  711.         },
  712.         
  713.         getScroll: function () {
  714.             var t, l, dde=document.documentElement, db=document.body;
  715.             if (dde && (dde.scrollTop || dde.scrollLeft)) {
  716.                 t = dde.scrollTop;
  717.                 l = dde.scrollLeft;
  718.             } else if (db) {
  719.                 t = db.scrollTop;
  720.                 l = db.scrollLeft;
  721.             } else {
  722.             }
  723.             return { top: t, left: l };
  724.         },
  725.         
  726.         getStyle: function(el, styleProp) {
  727.             return Ext.fly(el).getStyle(styleProp);
  728.         },
  729.         
  730.         getScrollTop: function () { return this.getScroll().top; },
  731.         
  732.         getScrollLeft: function () { return this.getScroll().left; },
  733.         
  734.         moveToEl: function (moveEl, targetEl) {
  735.             var aCoord = Ext.lib.Dom.getXY(targetEl);
  736.             Ext.lib.Dom.setXY(moveEl, aCoord);
  737.         },
  738.         
  739.         numericSort: function(a, b) { return (a - b); },
  740.         
  741.         _timeoutCount: 0,
  742.         
  743.         _addListeners: function() {
  744.             var DDM = Ext.dd.DDM;
  745.             if ( Ext.lib.Event && document ) {
  746.                 DDM._onLoad();
  747.             } else {
  748.                 if (DDM._timeoutCount > 2000) {
  749.                 } else {
  750.                     setTimeout(DDM._addListeners, 10);
  751.                     if (document && document.body) {
  752.                         DDM._timeoutCount += 1;
  753.                     }
  754.                 }
  755.             }
  756.         },
  757.         
  758.         handleWasClicked: function(node, id) {
  759.             if (this.isHandle(id, node.id)) {
  760.                 return true;
  761.             } else {
  762.                                  var p = node.parentNode;
  763.                 while (p) {
  764.                     if (this.isHandle(id, p.id)) {
  765.                         return true;
  766.                     } else {
  767.                         p = p.parentNode;
  768.                     }
  769.                 }
  770.             }
  771.             return false;
  772.         }
  773.     };
  774. }();
  775. Ext.dd.DDM = Ext.dd.DragDropMgr;
  776. Ext.dd.DDM._addListeners();
  777. }
  778. Ext.dd.DD = function(id, sGroup, config) {
  779.     if (id) {
  780.         this.init(id, sGroup, config);
  781.     }
  782. };
  783. Ext.extend(Ext.dd.DD, Ext.dd.DragDrop, {
  784.     
  785.     scroll: true,
  786.     
  787.     autoOffset: function(iPageX, iPageY) {
  788.         var x = iPageX - this.startPageX;
  789.         var y = iPageY - this.startPageY;
  790.         this.setDelta(x, y);
  791.     },
  792.     
  793.     setDelta: function(iDeltaX, iDeltaY) {
  794.         this.deltaX = iDeltaX;
  795.         this.deltaY = iDeltaY;
  796.     },
  797.     
  798.     setDragElPos: function(iPageX, iPageY) {
  799.                  
  800.         var el = this.getDragEl();
  801.         this.alignElWithMouse(el, iPageX, iPageY);
  802.     },
  803.     
  804.     alignElWithMouse: function(el, iPageX, iPageY) {
  805.         var oCoord = this.getTargetCoord(iPageX, iPageY);
  806.         var fly = el.dom ? el : Ext.fly(el, '_dd');
  807.         if (!this.deltaSetXY) {
  808.             var aCoord = [oCoord.x, oCoord.y];
  809.             fly.setXY(aCoord);
  810.             var newLeft = fly.getLeft(true);
  811.             var newTop  = fly.getTop(true);
  812.             this.deltaSetXY = [ newLeft - oCoord.x, newTop - oCoord.y ];
  813.         } else {
  814.             fly.setLeftTop(oCoord.x + this.deltaSetXY[0], oCoord.y + this.deltaSetXY[1]);
  815.         }
  816.         this.cachePosition(oCoord.x, oCoord.y);
  817.         this.autoScroll(oCoord.x, oCoord.y, el.offsetHeight, el.offsetWidth);
  818.         return oCoord;
  819.     },
  820.     
  821.     cachePosition: function(iPageX, iPageY) {
  822.         if (iPageX) {
  823.             this.lastPageX = iPageX;
  824.             this.lastPageY = iPageY;
  825.         } else {
  826.             var aCoord = Ext.lib.Dom.getXY(this.getEl());
  827.             this.lastPageX = aCoord[0];
  828.             this.lastPageY = aCoord[1];
  829.         }
  830.     },
  831.     
  832.     autoScroll: function(x, y, h, w) {
  833.         if (this.scroll) {
  834.                          var clientH = Ext.lib.Dom.getViewHeight();
  835.                          var clientW = Ext.lib.Dom.getViewWidth();
  836.                          var st = this.DDM.getScrollTop();
  837.                          var sl = this.DDM.getScrollLeft();
  838.                          var bot = h + y;
  839.                          var right = w + x;
  840.                                                    var toBot = (clientH + st - y - this.deltaY);
  841.                          var toRight = (clientW + sl - x - this.deltaX);
  842.                                       var thresh = 40;
  843.                                                    var scrAmt = (document.all) ? 80 : 30;
  844.                                       if ( bot > clientH && toBot < thresh ) {
  845.                 window.scrollTo(sl, st + scrAmt);
  846.             }
  847.                                       if ( y < st && st > 0 && y - st < thresh ) {
  848.                 window.scrollTo(sl, st - scrAmt);
  849.             }
  850.                                       if ( right > clientW && toRight < thresh ) {
  851.                 window.scrollTo(sl + scrAmt, st);
  852.             }
  853.                                       if ( x < sl && sl > 0 && x - sl < thresh ) {
  854.                 window.scrollTo(sl - scrAmt, st);
  855.             }
  856.         }
  857.     },
  858.     
  859.     getTargetCoord: function(iPageX, iPageY) {
  860.         var x = iPageX - this.deltaX;
  861.         var y = iPageY - this.deltaY;
  862.         if (this.constrainX) {
  863.             if (x < this.minX) { x = this.minX; }
  864.             if (x > this.maxX) { x = this.maxX; }
  865.         }
  866.         if (this.constrainY) {
  867.             if (y < this.minY) { y = this.minY; }
  868.             if (y > this.maxY) { y = this.maxY; }
  869.         }
  870.         x = this.getTick(x, this.xTicks);
  871.         y = this.getTick(y, this.yTicks);
  872.         return {x:x, y:y};
  873.     },
  874.     
  875.     applyConfig: function() {
  876.         Ext.dd.DD.superclass.applyConfig.call(this);
  877.         this.scroll = (this.config.scroll !== false);
  878.     },
  879.     
  880.     b4MouseDown: function(e) {
  881.                  this.autoOffset(e.getPageX(),
  882.                             e.getPageY());
  883.     },
  884.     
  885.     b4Drag: function(e) {
  886.         this.setDragElPos(e.getPageX(),
  887.                             e.getPageY());
  888.     },
  889.     toString: function() {
  890.         return ("DD " + this.id);
  891.     }
  892.                    
  893. });
  894. Ext.dd.DDProxy = function(id, sGroup, config) {
  895.     if (id) {
  896.         this.init(id, sGroup, config);
  897.         this.initFrame();
  898.     }
  899. };
  900. Ext.dd.DDProxy.dragElId = "ygddfdiv";
  901. Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {
  902.     
  903.     resizeFrame: true,
  904.     
  905.     centerFrame: false,
  906.     
  907.     createFrame: function() {
  908.         var self = this;
  909.         var body = document.body;
  910.         if (!body || !body.firstChild) {
  911.             setTimeout( function() { self.createFrame(); }, 50 );
  912.             return;
  913.         }
  914.         var div = this.getDragEl();
  915.         if (!div) {
  916.             div    = document.createElement("div");
  917.             div.id = this.dragElId;
  918.             var s  = div.style;
  919.             s.position   = "absolute";
  920.             s.visibility = "hidden";
  921.             s.cursor     = "move";
  922.             s.border     = "2px solid #aaa";
  923.             s.zIndex     = 999;
  924.                                                    body.insertBefore(div, body.firstChild);
  925.         }
  926.     },
  927.     
  928.     initFrame: function() {
  929.         this.createFrame();
  930.     },
  931.     applyConfig: function() {
  932.         Ext.dd.DDProxy.superclass.applyConfig.call(this);
  933.         this.resizeFrame = (this.config.resizeFrame !== false);
  934.         this.centerFrame = (this.config.centerFrame);
  935.         this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);
  936.     },
  937.     
  938.     showFrame: function(iPageX, iPageY) {
  939.         var el = this.getEl();
  940.         var dragEl = this.getDragEl();
  941.         var s = dragEl.style;
  942.         this._resizeProxy();
  943.         if (this.centerFrame) {
  944.             this.setDelta( Math.round(parseInt(s.width,  10)/2),
  945.                            Math.round(parseInt(s.height, 10)/2) );
  946.         }
  947.         this.setDragElPos(iPageX, iPageY);
  948.         Ext.fly(dragEl).show();
  949.     },
  950.     
  951.     _resizeProxy: function() {
  952.         if (this.resizeFrame) {
  953.             var el = this.getEl();
  954.             Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);
  955.         }
  956.     },
  957.          b4MouseDown: function(e) {
  958.         var x = e.getPageX();
  959.         var y = e.getPageY();
  960.         this.autoOffset(x, y);
  961.         this.setDragElPos(x, y);
  962.     },
  963.          b4StartDrag: function(x, y) {
  964.                  this.showFrame(x, y);
  965.     },
  966.          b4EndDrag: function(e) {
  967.         Ext.fly(this.getDragEl()).hide();
  968.     },
  969.                    endDrag: function(e) {
  970.         var lel = this.getEl();
  971.         var del = this.getDragEl();
  972.                  del.style.visibility = "";
  973.         this.beforeMove();
  974.                           lel.style.visibility = "hidden";
  975.         Ext.dd.DDM.moveToEl(lel, del);
  976.         del.style.visibility = "hidden";
  977.         lel.style.visibility = "";
  978.         this.afterDrag();
  979.     },
  980.     beforeMove : function(){
  981.     },
  982.     afterDrag : function(){
  983.     },
  984.     toString: function() {
  985.         return ("DDProxy " + this.id);
  986.     }
  987. });
  988. Ext.dd.DDTarget = function(id, sGroup, config) {
  989.     if (id) {
  990.         this.initTarget(id, sGroup, config);
  991.     }
  992. };
  993. Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {
  994.     toString: function() {
  995.         return ("DDTarget " + this.id);
  996.     }
  997. });
  998. Ext.dd.DragTracker = function(config){
  999.     Ext.apply(this, config);
  1000.     this.addEvents(
  1001.         'mousedown',
  1002.         'mouseup',
  1003.         'mousemove',
  1004.         'dragstart',
  1005.         'dragend',
  1006.         'drag'
  1007.     );
  1008.     this.dragRegion = new Ext.lib.Region(0,0,0,0);
  1009.     if(this.el){
  1010.         this.initEl(this.el);
  1011.     }
  1012. }
  1013. Ext.extend(Ext.dd.DragTracker, Ext.util.Observable,  {
  1014.     active: false,
  1015.     tolerance: 5,
  1016.     autoStart: false,
  1017.     initEl: function(el){
  1018.         this.el = Ext.get(el);
  1019.         el.on('mousedown', this.onMouseDown, this,
  1020.                 this.delegate ? {delegate: this.delegate} : undefined);
  1021.     },
  1022.     destroy : function(){
  1023.         this.el.un('mousedown', this.onMouseDown, this);
  1024.     },
  1025.     onMouseDown: function(e, target){
  1026.         if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){
  1027.             this.startXY = this.lastXY = e.getXY();
  1028.             this.dragTarget = this.delegate ? target : this.el.dom;
  1029.             e.preventDefault();
  1030.             var doc = Ext.getDoc();
  1031.             doc.on('mouseup', this.onMouseUp, this);
  1032.             doc.on('mousemove', this.onMouseMove, this);
  1033.             doc.on('selectstart', this.stopSelect, this);
  1034.             if(this.autoStart){
  1035.                 this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this);
  1036.             }
  1037.         }
  1038.     },
  1039.     onMouseMove: function(e, target){
  1040.         e.preventDefault();
  1041.         var xy = e.getXY(), s = this.startXY;
  1042.         this.lastXY = xy;
  1043.         if(!this.active){
  1044.             if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){
  1045.                 this.triggerStart();
  1046.             }else{
  1047.                 return;
  1048.             }
  1049.         }
  1050.         this.fireEvent('mousemove', this, e);
  1051.         this.onDrag(e);
  1052.         this.fireEvent('drag', this, e);
  1053.     },
  1054.     onMouseUp: function(e){
  1055.         var doc = Ext.getDoc();
  1056.         doc.un('mousemove', this.onMouseMove, this);
  1057.         doc.un('mouseup', this.onMouseUp, this);
  1058.         doc.un('selectstart', this.stopSelect, this);
  1059.         e.preventDefault();
  1060.         this.clearStart();
  1061.         this.active = false;
  1062.         delete this.elRegion;
  1063.         this.fireEvent('mouseup', this, e);
  1064.         this.onEnd(e);
  1065.         this.fireEvent('dragend', this, e);
  1066.     },
  1067.     triggerStart: function(isTimer){
  1068.         this.clearStart();
  1069.         this.active = true;
  1070.         this.onStart(this.startXY);
  1071.         this.fireEvent('dragstart', this, this.startXY);
  1072.     },
  1073.     clearStart : function(){
  1074.         if(this.timer){
  1075.             clearTimeout(this.timer);
  1076.             delete this.timer;
  1077.         }
  1078.     },
  1079.     stopSelect : function(e){
  1080.         e.stopEvent();
  1081.         return false;
  1082.     },
  1083.     onBeforeStart : function(e){
  1084.     },
  1085.     onStart : function(xy){
  1086.     },
  1087.     onDrag : function(e){
  1088.     },
  1089.     onEnd : function(e){
  1090.     },
  1091.     getDragTarget : function(){
  1092.         return this.dragTarget;
  1093.     },
  1094.     getDragCt : function(){
  1095.         return this.el;
  1096.     },
  1097.     getXY : function(constrain){
  1098.         return constrain ?
  1099.                this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;
  1100.     },
  1101.     getOffset : function(constrain){
  1102.         var xy = this.getXY(constrain);
  1103.         var s = this.startXY;
  1104.         return [s[0]-xy[0], s[1]-xy[1]];
  1105.     },
  1106.     constrainModes: {
  1107.         'point' : function(xy){
  1108.             if(!this.elRegion){
  1109.                 this.elRegion = this.getDragCt().getRegion();
  1110.             }
  1111.             var dr = this.dragRegion;
  1112.             dr.left = xy[0];
  1113.             dr.top = xy[1];
  1114.             dr.right = xy[0];
  1115.             dr.bottom = xy[1];
  1116.             dr.constrainTo(this.elRegion);
  1117.             return [dr.left, dr.top];
  1118.         }
  1119.     }
  1120. });
  1121. Ext.dd.ScrollManager = function(){
  1122.     var ddm = Ext.dd.DragDropMgr;
  1123.     var els = {};
  1124.     var dragEl = null;
  1125.     var proc = {};
  1126.     
  1127.     var onStop = function(e){
  1128.         dragEl = null;
  1129.         clearProc();
  1130.     };
  1131.     
  1132.     var triggerRefresh = function(){
  1133.         if(ddm.dragCurrent){
  1134.              ddm.refreshCache(ddm.dragCurrent.groups);
  1135.         }
  1136.     };
  1137.     
  1138.     var doScroll = function(){
  1139.         if(ddm.dragCurrent){
  1140.             var dds = Ext.dd.ScrollManager;
  1141.             var inc = proc.el.ddScrollConfig ?
  1142.                       proc.el.ddScrollConfig.increment : dds.increment;
  1143.             if(!dds.animate){
  1144.                 if(proc.el.scroll(proc.dir, inc)){
  1145.                     triggerRefresh();
  1146.                 }
  1147.             }else{
  1148.                 proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);
  1149.             }
  1150.         }
  1151.     };
  1152.     
  1153.     var clearProc = function(){
  1154.         if(proc.id){
  1155.             clearInterval(proc.id);
  1156.         }
  1157.         proc.id = 0;
  1158.         proc.el = null;
  1159.         proc.dir = "";
  1160.     };
  1161.     
  1162.     var startProc = function(el, dir){
  1163.         clearProc();
  1164.         proc.el = el;
  1165.         proc.dir = dir;
  1166.         var freq = (el.ddScrollConfig && el.ddScrollConfig.frequency) ? 
  1167.                 el.ddScrollConfig.frequency : Ext.dd.ScrollManager.frequency;
  1168.         proc.id = setInterval(doScroll, freq);
  1169.     };
  1170.     
  1171.     var onFire = function(e, isDrop){
  1172.         if(isDrop || !ddm.dragCurrent){ return; }
  1173.         var dds = Ext.dd.ScrollManager;
  1174.         if(!dragEl || dragEl != ddm.dragCurrent){
  1175.             dragEl = ddm.dragCurrent;
  1176.                          dds.refreshCache();
  1177.         }
  1178.         
  1179.         var xy = Ext.lib.Event.getXY(e);
  1180.         var pt = new Ext.lib.Point(xy[0], xy[1]);
  1181.         for(var id in els){
  1182.             var el = els[id], r = el._region;
  1183.             var c = el.ddScrollConfig ? el.ddScrollConfig : dds;
  1184.             if(r && r.contains(pt) && el.isScrollable()){
  1185.                 if(r.bottom - pt.y <= c.vthresh){
  1186.                     if(proc.el != el){
  1187.                         startProc(el, "down");
  1188.                     }
  1189.                     return;
  1190.                 }else if(r.right - pt.x <= c.hthresh){
  1191.                     if(proc.el != el){
  1192.                         startProc(el, "left");
  1193.                     }
  1194.                     return;
  1195.                 }else if(pt.y - r.top <= c.vthresh){
  1196.                     if(proc.el != el){
  1197.                         startProc(el, "up");
  1198.                     }
  1199.                     return;
  1200.                 }else if(pt.x - r.left <= c.hthresh){
  1201.                     if(proc.el != el){
  1202.                         startProc(el, "right");
  1203.                     }
  1204.                     return;
  1205.                 }
  1206.             }
  1207.         }
  1208.         clearProc();
  1209.     };
  1210.     
  1211.     ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);
  1212.     ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);
  1213.     
  1214.     return {
  1215.         
  1216.         register : function(el){
  1217.             if(Ext.isArray(el)){
  1218.                 for(var i = 0, len = el.length; i < len; i++) {
  1219.                  this.register(el[i]);
  1220.                 }
  1221.             }else{
  1222.                 el = Ext.get(el);
  1223.                 els[el.id] = el;
  1224.             }
  1225.         },
  1226.         
  1227.         
  1228.         unregister : function(el){
  1229.             if(Ext.isArray(el)){
  1230.                 for(var i = 0, len = el.length; i < len; i++) {
  1231.                  this.unregister(el[i]);
  1232.                 }
  1233.             }else{
  1234.                 el = Ext.get(el);
  1235.                 delete els[el.id];
  1236.             }
  1237.         },
  1238.         
  1239.         
  1240.         vthresh : 25,
  1241.         
  1242.         hthresh : 25,
  1243.         
  1244.         increment : 100,
  1245.         
  1246.         
  1247.         frequency : 500,
  1248.         
  1249.         
  1250.         animate: true,
  1251.         
  1252.         
  1253.         animDuration: .4,
  1254.         
  1255.         
  1256.         refreshCache : function(){
  1257.             for(var id in els){
  1258.                 if(typeof els[id] == 'object'){                      els[id]._region = els[id].getRegion();
  1259.                 }
  1260.             }
  1261.         }
  1262.     };
  1263. }();
  1264. Ext.dd.Registry = function(){
  1265.     var elements = {}; 
  1266.     var handles = {}; 
  1267.     var autoIdSeed = 0;
  1268.     var getId = function(el, autogen){
  1269.         if(typeof el == "string"){
  1270.             return el;
  1271.         }
  1272.         var id = el.id;
  1273.         if(!id && autogen !== false){
  1274.             id = "extdd-" + (++autoIdSeed);
  1275.             el.id = id;
  1276.         }
  1277.         return id;
  1278.     };
  1279.     
  1280.     return {
  1281.     
  1282.         register : function(el, data){
  1283.             data = data || {};
  1284.             if(typeof el == "string"){
  1285.                 el = document.getElementById(el);
  1286.             }
  1287.             data.ddel = el;
  1288.             elements[getId(el)] = data;
  1289.             if(data.isHandle !== false){
  1290.                 handles[data.ddel.id] = data;
  1291.             }
  1292.             if(data.handles){
  1293.                 var hs = data.handles;
  1294.                 for(var i = 0, len = hs.length; i < len; i++){
  1295.                  handles[getId(hs[i])] = data;
  1296.                 }
  1297.             }
  1298.         },
  1299.     
  1300.         unregister : function(el){
  1301.             var id = getId(el, false);
  1302.             var data = elements[id];
  1303.             if(data){
  1304.                 delete elements[id];
  1305.                 if(data.handles){
  1306.                     var hs = data.handles;
  1307.                     for(var i = 0, len = hs.length; i < len; i++){
  1308.                      delete handles[getId(hs[i], false)];
  1309.                     }
  1310.                 }
  1311.             }
  1312.         },
  1313.     
  1314.         getHandle : function(id){
  1315.             if(typeof id != "string"){                  id = id.id;
  1316.             }
  1317.             return handles[id];
  1318.         },
  1319.     
  1320.         getHandleFromEvent : function(e){
  1321.             var t = Ext.lib.Event.getTarget(e);
  1322.             return t ? handles[t.id] : null;
  1323.         },
  1324.     
  1325.         getTarget : function(id){
  1326.             if(typeof id != "string"){                  id = id.id;
  1327.             }
  1328.             return elements[id];
  1329.         },
  1330.     
  1331.         getTargetFromEvent : function(e){
  1332.             var t = Ext.lib.Event.getTarget(e);
  1333.             return t ? elements[t.id] || handles[t.id] : null;
  1334.         }
  1335.     };
  1336. }();
  1337. Ext.dd.StatusProxy = function(config){
  1338.     Ext.apply(this, config);
  1339.     this.id = this.id || Ext.id();
  1340.     this.el = new Ext.Layer({
  1341.         dh: {
  1342.             id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [
  1343.                 {tag: "div", cls: "x-dd-drop-icon"},
  1344.                 {tag: "div", cls: "x-dd-drag-ghost"}
  1345.             ]
  1346.         }, 
  1347.         shadow: !config || config.shadow !== false
  1348.     });
  1349.     this.ghost = Ext.get(this.el.dom.childNodes[1]);
  1350.     this.dropStatus = this.dropNotAllowed;
  1351. };
  1352. Ext.dd.StatusProxy.prototype = {
  1353.     
  1354.     dropAllowed : "x-dd-drop-ok",
  1355.     
  1356.     dropNotAllowed : "x-dd-drop-nodrop",
  1357.     
  1358.     setStatus : function(cssClass){