- \r
- applyConfig: function() {\r
- Ext.dd.DD.superclass.applyConfig.call(this);\r
- this.scroll = (this.config.scroll !== false);\r
- },\r
-\r
- \r
- b4MouseDown: function(e) {\r
- // this.resetConstraints();\r
- this.autoOffset(e.getPageX(),\r
- e.getPageY());\r
- },\r
-\r
- \r
- b4Drag: function(e) {\r
- this.setDragElPos(e.getPageX(),\r
- e.getPageY());\r
- },\r
-\r
- toString: function() {\r
- return ("DD " + this.id);\r
- }\r
-\r
- //////////////////////////////////////////////////////////////////////////\r
- // Debugging ygDragDrop events that can be overridden\r
- //////////////////////////////////////////////////////////////////////////\r
- \r
-\r
-});\r
-\r
-Ext.dd.DDProxy = function(id, sGroup, config) {\r
- if (id) {\r
- this.init(id, sGroup, config);\r
- this.initFrame();\r
- }\r
-};\r
-\r
-\r
-Ext.dd.DDProxy.dragElId = "ygddfdiv";\r
-\r
-Ext.extend(Ext.dd.DDProxy, Ext.dd.DD, {\r
-\r
- \r
- resizeFrame: true,\r
-\r
- \r
- centerFrame: false,\r
-\r
- \r
- createFrame: function() {\r
- var self = this;\r
- var body = document.body;\r
-\r
- if (!body || !body.firstChild) {\r
- setTimeout( function() { self.createFrame(); }, 50 );\r
- return;\r
- }\r
-\r
- var div = this.getDragEl();\r
-\r
- if (!div) {\r
- div = document.createElement("div");\r
- div.id = this.dragElId;\r
- var s = div.style;\r
-\r
- s.position = "absolute";\r
- s.visibility = "hidden";\r
- s.cursor = "move";\r
- s.border = "2px solid #aaa";\r
- s.zIndex = 999;\r
-\r
- // appendChild can blow up IE if invoked prior to the window load event\r
- // while rendering a table. It is possible there are other scenarios\r
- // that would cause this to happen as well.\r
- body.insertBefore(div, body.firstChild);\r
- }\r
- },\r
-\r
- \r
- initFrame: function() {\r
- this.createFrame();\r
- },\r
-\r
- applyConfig: function() {\r
- Ext.dd.DDProxy.superclass.applyConfig.call(this);\r
-\r
- this.resizeFrame = (this.config.resizeFrame !== false);\r
- this.centerFrame = (this.config.centerFrame);\r
- this.setDragElId(this.config.dragElId || Ext.dd.DDProxy.dragElId);\r
- },\r
-\r
- \r
- showFrame: function(iPageX, iPageY) {\r
- var el = this.getEl();\r
- var dragEl = this.getDragEl();\r
- var s = dragEl.style;\r
-\r
- this._resizeProxy();\r
-\r
- if (this.centerFrame) {\r
- this.setDelta( Math.round(parseInt(s.width, 10)/2),\r
- Math.round(parseInt(s.height, 10)/2) );\r
- }\r
-\r
- this.setDragElPos(iPageX, iPageY);\r
-\r
- Ext.fly(dragEl).show();\r
- },\r
-\r
- \r
- _resizeProxy: function() {\r
- if (this.resizeFrame) {\r
- var el = this.getEl();\r
- Ext.fly(this.getDragEl()).setSize(el.offsetWidth, el.offsetHeight);\r
- }\r
- },\r
-\r
- // overrides Ext.dd.DragDrop\r
- b4MouseDown: function(e) {\r
- var x = e.getPageX();\r
- var y = e.getPageY();\r
- this.autoOffset(x, y);\r
- this.setDragElPos(x, y);\r
- },\r
-\r
- // overrides Ext.dd.DragDrop\r
- b4StartDrag: function(x, y) {\r
- // show the drag frame\r
- this.showFrame(x, y);\r
- },\r
-\r
- // overrides Ext.dd.DragDrop\r
- b4EndDrag: function(e) {\r
- Ext.fly(this.getDragEl()).hide();\r
- },\r
-\r
- // overrides Ext.dd.DragDrop\r
- // By default we try to move the element to the last location of the frame.\r
- // This is so that the default behavior mirrors that of Ext.dd.DD.\r
- endDrag: function(e) {\r
-\r
- var lel = this.getEl();\r
- var del = this.getDragEl();\r
-\r
- // Show the drag frame briefly so we can get its position\r
- del.style.visibility = "";\r
-\r
- this.beforeMove();\r
- // Hide the linked element before the move to get around a Safari\r
- // rendering bug.\r
- lel.style.visibility = "hidden";\r
- Ext.dd.DDM.moveToEl(lel, del);\r
- del.style.visibility = "hidden";\r
- lel.style.visibility = "";\r
-\r
- this.afterDrag();\r
- },\r
-\r
- beforeMove : function(){\r
-\r
- },\r
-\r
- afterDrag : function(){\r
-\r
- },\r
-\r
- toString: function() {\r
- return ("DDProxy " + this.id);\r
- }\r
-\r
-});\r
-\r
-Ext.dd.DDTarget = function(id, sGroup, config) {\r
- if (id) {\r
- this.initTarget(id, sGroup, config);\r
- }\r
-};\r
-\r
-// Ext.dd.DDTarget.prototype = new Ext.dd.DragDrop();\r
-Ext.extend(Ext.dd.DDTarget, Ext.dd.DragDrop, {\r
- toString: function() {\r
- return ("DDTarget " + this.id);\r
- }\r
-});\r
-\r
-Ext.dd.DragTracker = function(config){\r
- Ext.apply(this, config);\r
- this.addEvents(\r
- 'mousedown',\r
- 'mouseup',\r
- 'mousemove',\r
- 'dragstart',\r
- 'dragend',\r
- 'drag'\r
- );\r
-\r
- this.dragRegion = new Ext.lib.Region(0,0,0,0);\r
-\r
- if(this.el){\r
- this.initEl(this.el);\r
- }\r
-}\r
-\r
-Ext.extend(Ext.dd.DragTracker, Ext.util.Observable, {\r
- active: false,\r
- tolerance: 5,\r
- autoStart: false,\r
-\r
- initEl: function(el){\r
- this.el = Ext.get(el);\r
- el.on('mousedown', this.onMouseDown, this,\r
- this.delegate ? {delegate: this.delegate} : undefined);\r
- },\r
-\r
- destroy : function(){\r
- this.el.un('mousedown', this.onMouseDown, this);\r
- },\r
-\r
- onMouseDown: function(e, target){\r
- if(this.fireEvent('mousedown', this, e) !== false && this.onBeforeStart(e) !== false){\r
- this.startXY = this.lastXY = e.getXY();\r
- this.dragTarget = this.delegate ? target : this.el.dom;\r
- e.preventDefault();\r
- var doc = Ext.getDoc();\r
- doc.on('mouseup', this.onMouseUp, this);\r
- doc.on('mousemove', this.onMouseMove, this);\r
- doc.on('selectstart', this.stopSelect, this);\r
- if(this.autoStart){\r
- this.timer = this.triggerStart.defer(this.autoStart === true ? 1000 : this.autoStart, this);\r
- }\r
- }\r
- },\r
-\r
- onMouseMove: function(e, target){\r
- e.preventDefault();\r
- var xy = e.getXY(), s = this.startXY;\r
- this.lastXY = xy;\r
- if(!this.active){\r
- if(Math.abs(s[0]-xy[0]) > this.tolerance || Math.abs(s[1]-xy[1]) > this.tolerance){\r
- this.triggerStart();\r
- }else{\r
- return;\r
- }\r
- }\r
- this.fireEvent('mousemove', this, e);\r
- this.onDrag(e);\r
- this.fireEvent('drag', this, e);\r
- },\r
-\r
- onMouseUp: function(e){\r
- var doc = Ext.getDoc();\r
- doc.un('mousemove', this.onMouseMove, this);\r
- doc.un('mouseup', this.onMouseUp, this);\r
- doc.un('selectstart', this.stopSelect, this);\r
- e.preventDefault();\r
- this.clearStart();\r
- this.active = false;\r
- delete this.elRegion;\r
- this.fireEvent('mouseup', this, e);\r
- this.onEnd(e);\r
- this.fireEvent('dragend', this, e);\r
- },\r
-\r
- triggerStart: function(isTimer){\r
- this.clearStart();\r
- this.active = true;\r
- this.onStart(this.startXY);\r
- this.fireEvent('dragstart', this, this.startXY);\r
- },\r
-\r
- clearStart : function(){\r
- if(this.timer){\r
- clearTimeout(this.timer);\r
- delete this.timer;\r
- }\r
- },\r
-\r
- stopSelect : function(e){\r
- e.stopEvent();\r
- return false;\r
- },\r
-\r
- onBeforeStart : function(e){\r
-\r
- },\r
-\r
- onStart : function(xy){\r
-\r
- },\r
-\r
- onDrag : function(e){\r
-\r
- },\r
-\r
- onEnd : function(e){\r
-\r
- },\r
-\r
- getDragTarget : function(){\r
- return this.dragTarget;\r
- },\r
-\r
- getDragCt : function(){\r
- return this.el;\r
- },\r
-\r
- getXY : function(constrain){\r
- return constrain ?\r
- this.constrainModes[constrain].call(this, this.lastXY) : this.lastXY;\r
- },\r
-\r
- getOffset : function(constrain){\r
- var xy = this.getXY(constrain);\r
- var s = this.startXY;\r
- return [s[0]-xy[0], s[1]-xy[1]];\r
- },\r
-\r
- constrainModes: {\r
- 'point' : function(xy){\r
-\r
- if(!this.elRegion){\r
- this.elRegion = this.getDragCt().getRegion();\r
- }\r
-\r
- var dr = this.dragRegion;\r
-\r
- dr.left = xy[0];\r
- dr.top = xy[1];\r
- dr.right = xy[0];\r
- dr.bottom = xy[1];\r
-\r
- dr.constrainTo(this.elRegion);\r
-\r
- return [dr.left, dr.top];\r
- }\r
- }\r
-});\r
-\r
-Ext.dd.ScrollManager = function(){\r
- var ddm = Ext.dd.DragDropMgr;\r
- var els = {};\r
- var dragEl = null;\r
- var proc = {};\r
- \r
- var onStop = function(e){\r
- dragEl = null;\r
- clearProc();\r
- };\r
- \r
- var triggerRefresh = function(){\r
- if(ddm.dragCurrent){\r
- ddm.refreshCache(ddm.dragCurrent.groups);\r
- }\r
- };\r
- \r
- var doScroll = function(){\r
- if(ddm.dragCurrent){\r
- var dds = Ext.dd.ScrollManager;\r
- var inc = proc.el.ddScrollConfig ?\r
- proc.el.ddScrollConfig.increment : dds.increment;\r
- if(!dds.animate){\r
- if(proc.el.scroll(proc.dir, inc)){\r
- triggerRefresh();\r
- }\r
- }else{\r
- proc.el.scroll(proc.dir, inc, true, dds.animDuration, triggerRefresh);\r
- }\r
- }\r
- };\r
- \r
- var clearProc = function(){\r
- if(proc.id){\r
- clearInterval(proc.id);\r
- }\r
- proc.id = 0;\r
- proc.el = null;\r
- proc.dir = "";\r
- };\r
- \r
- var startProc = function(el, dir){\r
- clearProc();\r
- proc.el = el;\r
- proc.dir = dir;\r
- var freq = (el.ddScrollConfig && el.ddScrollConfig.frequency) ? \r
- el.ddScrollConfig.frequency : Ext.dd.ScrollManager.frequency;\r
- proc.id = setInterval(doScroll, freq);\r
- };\r
- \r
- var onFire = function(e, isDrop){\r
- if(isDrop || !ddm.dragCurrent){ return; }\r
- var dds = Ext.dd.ScrollManager;\r
- if(!dragEl || dragEl != ddm.dragCurrent){\r
- dragEl = ddm.dragCurrent;\r
- // refresh regions on drag start\r
- dds.refreshCache();\r
- }\r
- \r
- var xy = Ext.lib.Event.getXY(e);\r
- var pt = new Ext.lib.Point(xy[0], xy[1]);\r
- for(var id in els){\r
- var el = els[id], r = el._region;\r
- var c = el.ddScrollConfig ? el.ddScrollConfig : dds;\r
- if(r && r.contains(pt) && el.isScrollable()){\r
- if(r.bottom - pt.y <= c.vthresh){\r
- if(proc.el != el){\r
- startProc(el, "down");\r
- }\r
- return;\r
- }else if(r.right - pt.x <= c.hthresh){\r
- if(proc.el != el){\r
- startProc(el, "left");\r
- }\r
- return;\r
- }else if(pt.y - r.top <= c.vthresh){\r
- if(proc.el != el){\r
- startProc(el, "up");\r
- }\r
- return;\r
- }else if(pt.x - r.left <= c.hthresh){\r
- if(proc.el != el){\r
- startProc(el, "right");\r
- }\r
- return;\r
- }\r
- }\r
- }\r
- clearProc();\r
- };\r
- \r
- ddm.fireEvents = ddm.fireEvents.createSequence(onFire, ddm);\r
- ddm.stopDrag = ddm.stopDrag.createSequence(onStop, ddm);\r
- \r
- return {\r
- \r
- register : function(el){\r
- if(Ext.isArray(el)){\r
- for(var i = 0, len = el.length; i < len; i++) {\r
- this.register(el[i]);\r
- }\r
- }else{\r
- el = Ext.get(el);\r
- els[el.id] = el;\r
- }\r
- },\r
- \r
- \r
- unregister : function(el){\r
- if(Ext.isArray(el)){\r
- for(var i = 0, len = el.length; i < len; i++) {\r
- this.unregister(el[i]);\r
- }\r
- }else{\r
- el = Ext.get(el);\r
- delete els[el.id];\r
- }\r
- },\r
- \r
- \r
- vthresh : 25,\r
- \r
- hthresh : 25,\r
-\r
- \r
- increment : 100,\r
- \r
- \r
- frequency : 500,\r
- \r
- \r
- animate: true,\r
- \r
- \r
- animDuration: .4,\r
- \r
- \r
- refreshCache : function(){\r
- for(var id in els){\r
- if(typeof els[id] == 'object'){ // for people extending the object prototype\r
- els[id]._region = els[id].getRegion();\r
- }\r
- }\r
- }\r
- };\r
-}();\r
-\r
-Ext.dd.Registry = function(){\r
- var elements = {}; \r
- var handles = {}; \r
- var autoIdSeed = 0;\r
-\r
- var getId = function(el, autogen){\r
- if(typeof el == "string"){\r
- return el;\r
- }\r
- var id = el.id;\r
- if(!id && autogen !== false){\r
- id = "extdd-" + (++autoIdSeed);\r
- el.id = id;\r
- }\r
- return id;\r
- };\r
- \r
- return {\r
- \r
- register : function(el, data){\r
- data = data || {};\r
- if(typeof el == "string"){\r
- el = document.getElementById(el);\r
- }\r
- data.ddel = el;\r
- elements[getId(el)] = data;\r
- if(data.isHandle !== false){\r
- handles[data.ddel.id] = data;\r
- }\r
- if(data.handles){\r
- var hs = data.handles;\r
- for(var i = 0, len = hs.length; i < len; i++){\r
- handles[getId(hs[i])] = data;\r
- }\r
- }\r
- },\r
-\r
- \r
- unregister : function(el){\r
- var id = getId(el, false);\r
- var data = elements[id];\r
- if(data){\r
- delete elements[id];\r
- if(data.handles){\r
- var hs = data.handles;\r
- for(var i = 0, len = hs.length; i < len; i++){\r
- delete handles[getId(hs[i], false)];\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- getHandle : function(id){\r
- if(typeof id != "string"){ // must be element?\r
- id = id.id;\r
- }\r
- return handles[id];\r
- },\r
-\r
- \r
- getHandleFromEvent : function(e){\r
- var t = Ext.lib.Event.getTarget(e);\r
- return t ? handles[t.id] : null;\r
- },\r
-\r
- \r
- getTarget : function(id){\r
- if(typeof id != "string"){ // must be element?\r
- id = id.id;\r
- }\r
- return elements[id];\r
- },\r
-\r
- \r
- getTargetFromEvent : function(e){\r
- var t = Ext.lib.Event.getTarget(e);\r
- return t ? elements[t.id] || handles[t.id] : null;\r
- }\r
- };\r
-}();\r
-\r
-Ext.dd.StatusProxy = function(config){\r
- Ext.apply(this, config);\r
- this.id = this.id || Ext.id();\r
- this.el = new Ext.Layer({\r
- dh: {\r
- id: this.id, tag: "div", cls: "x-dd-drag-proxy "+this.dropNotAllowed, children: [\r
- {tag: "div", cls: "x-dd-drop-icon"},\r
- {tag: "div", cls: "x-dd-drag-ghost"}\r
- ]\r
- }, \r
- shadow: !config || config.shadow !== false\r
- });\r
- this.ghost = Ext.get(this.el.dom.childNodes[1]);\r
- this.dropStatus = this.dropNotAllowed;\r
-};\r
-\r
-Ext.dd.StatusProxy.prototype = {\r
- \r
- dropAllowed : "x-dd-drop-ok",\r
- \r
- dropNotAllowed : "x-dd-drop-nodrop",\r
-\r
- \r
- setStatus : function(cssClass){\r
- cssClass = cssClass || this.dropNotAllowed;\r
- if(this.dropStatus != cssClass){\r
- this.el.replaceClass(this.dropStatus, cssClass);\r
- this.dropStatus = cssClass;\r
- }\r
- },\r
-\r
- \r
- reset : function(clearGhost){\r
- this.el.dom.className = "x-dd-drag-proxy " + this.dropNotAllowed;\r
- this.dropStatus = this.dropNotAllowed;\r
- if(clearGhost){\r
- this.ghost.update("");\r
- }\r
- },\r
-\r
- \r
- update : function(html){\r
- if(typeof html == "string"){\r
- this.ghost.update(html);\r
- }else{\r
- this.ghost.update("");\r
- html.style.margin = "0";\r
- this.ghost.dom.appendChild(html);\r
- }\r
- var el = this.ghost.dom.firstChild; \r
- if(el){\r
- Ext.fly(el).setStyle(Ext.isIE ? 'styleFloat' : 'cssFloat', 'none');\r
- }\r
- },\r
-\r
- \r
- getEl : function(){\r
- return this.el;\r
- },\r
-\r
- \r
- getGhost : function(){\r
- return this.ghost;\r
- },\r
-\r
- \r
- hide : function(clear){\r
- this.el.hide();\r
- if(clear){\r
- this.reset(true);\r
- }\r
- },\r
-\r
- \r
- stop : function(){\r
- if(this.anim && this.anim.isAnimated && this.anim.isAnimated()){\r
- this.anim.stop();\r
- }\r
- },\r
-\r
- \r
- show : function(){\r
- this.el.show();\r
- },\r
-\r
- \r
- sync : function(){\r
- this.el.sync();\r
- },\r
-\r
- \r
- repair : function(xy, callback, scope){\r
- this.callback = callback;\r
- this.scope = scope;\r
- if(xy && this.animRepair !== false){\r
- this.el.addClass("x-dd-drag-repair");\r
- this.el.hideUnders(true);\r
- this.anim = this.el.shift({\r
- duration: this.repairDuration || .5,\r
- easing: 'easeOut',\r
- xy: xy,\r
- stopFx: true,\r
- callback: this.afterRepair,\r
- scope: this\r
- });\r
- }else{\r
- this.afterRepair();\r
- }\r
- },\r
-\r
- // private\r
- afterRepair : function(){\r
- this.hide(true);\r
- if(typeof this.callback == "function"){\r
- this.callback.call(this.scope || this);\r
- }\r
- this.callback = null;\r
- this.scope = null;\r
- }\r
-};\r
-\r
-Ext.dd.DragSource = function(el, config){\r
- this.el = Ext.get(el);\r
- if(!this.dragData){\r
- this.dragData = {};\r
- }\r
- \r
- Ext.apply(this, config);\r
- \r
- if(!this.proxy){\r
- this.proxy = new Ext.dd.StatusProxy();\r
- }\r
- Ext.dd.DragSource.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, \r
- {dragElId : this.proxy.id, resizeFrame: false, isTarget: false, scroll: this.scroll === true});\r
- \r
- this.dragging = false;\r
-};\r
-\r
-Ext.extend(Ext.dd.DragSource, Ext.dd.DDProxy, {\r
- \r
- \r
- dropAllowed : "x-dd-drop-ok",\r
- \r
- dropNotAllowed : "x-dd-drop-nodrop",\r
-\r
- \r
- getDragData : function(e){\r
- return this.dragData;\r
- },\r
-\r
- // private\r
- onDragEnter : function(e, id){\r
- var target = Ext.dd.DragDropMgr.getDDById(id);\r
- this.cachedTarget = target;\r
- if(this.beforeDragEnter(target, e, id) !== false){\r
- if(target.isNotifyTarget){\r
- var status = target.notifyEnter(this, e, this.dragData);\r
- this.proxy.setStatus(status);\r
- }else{\r
- this.proxy.setStatus(this.dropAllowed);\r
- }\r
- \r
- if(this.afterDragEnter){\r
- \r
- this.afterDragEnter(target, e, id);\r
- }\r
- }\r
- },\r
-\r
- \r
- beforeDragEnter : function(target, e, id){\r
- return true;\r
- },\r
-\r
- // private\r
- alignElWithMouse: function() {\r
- Ext.dd.DragSource.superclass.alignElWithMouse.apply(this, arguments);\r
- this.proxy.sync();\r
- },\r
-\r
- // private\r
- onDragOver : function(e, id){\r
- var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
- if(this.beforeDragOver(target, e, id) !== false){\r
- if(target.isNotifyTarget){\r
- var status = target.notifyOver(this, e, this.dragData);\r
- this.proxy.setStatus(status);\r
- }\r
-\r
- if(this.afterDragOver){\r
- \r
- this.afterDragOver(target, e, id);\r
- }\r
- }\r
- },\r
-\r
- \r
- beforeDragOver : function(target, e, id){\r
- return true;\r
- },\r
-\r
- // private\r
- onDragOut : function(e, id){\r
- var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
- if(this.beforeDragOut(target, e, id) !== false){\r
- if(target.isNotifyTarget){\r
- target.notifyOut(this, e, this.dragData);\r
- }\r
- this.proxy.reset();\r
- if(this.afterDragOut){\r
- \r
- this.afterDragOut(target, e, id);\r
- }\r
- }\r
- this.cachedTarget = null;\r
- },\r
-\r
- \r
- beforeDragOut : function(target, e, id){\r
- return true;\r
- },\r
- \r
- // private\r
- onDragDrop : function(e, id){\r
- var target = this.cachedTarget || Ext.dd.DragDropMgr.getDDById(id);\r
- if(this.beforeDragDrop(target, e, id) !== false){\r
- if(target.isNotifyTarget){\r
- if(target.notifyDrop(this, e, this.dragData)){ // valid drop?\r
- this.onValidDrop(target, e, id);\r
- }else{\r
- this.onInvalidDrop(target, e, id);\r
- }\r
- }else{\r
- this.onValidDrop(target, e, id);\r
- }\r
- \r
- if(this.afterDragDrop){\r
- \r
- this.afterDragDrop(target, e, id);\r
- }\r
- }\r
- delete this.cachedTarget;\r
- },\r
-\r
- \r
- beforeDragDrop : function(target, e, id){\r
- return true;\r
- },\r
-\r
- // private\r
- onValidDrop : function(target, e, id){\r
- this.hideProxy();\r
- if(this.afterValidDrop){\r
- \r
- this.afterValidDrop(target, e, id);\r
- }\r
- },\r
-\r
- // private\r
- getRepairXY : function(e, data){\r
- return this.el.getXY(); \r
- },\r
-\r
- // private\r
- onInvalidDrop : function(target, e, id){\r
- this.beforeInvalidDrop(target, e, id);\r
- if(this.cachedTarget){\r
- if(this.cachedTarget.isNotifyTarget){\r
- this.cachedTarget.notifyOut(this, e, this.dragData);\r
- }\r
- this.cacheTarget = null;\r
- }\r
- this.proxy.repair(this.getRepairXY(e, this.dragData), this.afterRepair, this);\r
-\r
- if(this.afterInvalidDrop){\r
- \r
- this.afterInvalidDrop(e, id);\r
- }\r
- },\r
-\r
- // private\r
- afterRepair : function(){\r
- if(Ext.enableFx){\r
- this.el.highlight(this.hlColor || "c3daf9");\r
- }\r
- this.dragging = false;\r
- },\r
-\r
- \r
- beforeInvalidDrop : function(target, e, id){\r
- return true;\r
- },\r
-\r
- // private\r
- handleMouseDown : function(e){\r
- if(this.dragging) {\r
- return;\r
- }\r
- var data = this.getDragData(e);\r
- if(data && this.onBeforeDrag(data, e) !== false){\r
- this.dragData = data;\r
- this.proxy.stop();\r
- Ext.dd.DragSource.superclass.handleMouseDown.apply(this, arguments);\r
- } \r
- },\r
-\r
- \r
- onBeforeDrag : function(data, e){\r
- return true;\r
- },\r
-\r
- \r
- onStartDrag : Ext.emptyFn,\r
-\r
- // private override\r
- startDrag : function(x, y){\r
- this.proxy.reset();\r
- this.dragging = true;\r
- this.proxy.update("");\r
- this.onInitDrag(x, y);\r
- this.proxy.show();\r
- },\r
-\r
- // private\r
- onInitDrag : function(x, y){\r
- var clone = this.el.dom.cloneNode(true);\r
- clone.id = Ext.id(); // prevent duplicate ids\r
- this.proxy.update(clone);\r
- this.onStartDrag(x, y);\r
- return true;\r
- },\r
-\r
- \r
- getProxy : function(){\r
- return this.proxy; \r
- },\r
-\r
- \r
- hideProxy : function(){\r
- this.proxy.hide(); \r
- this.proxy.reset(true);\r
- this.dragging = false;\r
- },\r
-\r
- // private\r
- triggerCacheRefresh : function(){\r
- Ext.dd.DDM.refreshCache(this.groups);\r
- },\r
-\r
- // private - override to prevent hiding\r
- b4EndDrag: function(e) {\r
- },\r
-\r
- // private - override to prevent moving\r
- endDrag : function(e){\r
- this.onEndDrag(this.dragData, e);\r
- },\r
-\r
- // private\r
- onEndDrag : function(data, e){\r
- },\r
- \r
- // private - pin to cursor\r
- autoOffset : function(x, y) {\r
- this.setDelta(-12, -20);\r
- } \r
-});\r
-\r
-Ext.dd.DropTarget = function(el, config){\r
- this.el = Ext.get(el);\r
- \r
- Ext.apply(this, config);\r
- \r
- if(this.containerScroll){\r
- Ext.dd.ScrollManager.register(this.el);\r
- }\r
- \r
- Ext.dd.DropTarget.superclass.constructor.call(this, this.el.dom, this.ddGroup || this.group, \r
- {isTarget: true});\r
-\r
-};\r
-\r
-Ext.extend(Ext.dd.DropTarget, Ext.dd.DDTarget, {\r
- \r
- \r
- \r
- dropAllowed : "x-dd-drop-ok",\r
- \r
- dropNotAllowed : "x-dd-drop-nodrop",\r
-\r
- // private\r
- isTarget : true,\r
-\r
- // private\r
- isNotifyTarget : true,\r
-\r
- \r
- notifyEnter : function(dd, e, data){\r
- if(this.overClass){\r
- this.el.addClass(this.overClass);\r
- }\r
- return this.dropAllowed;\r
- },\r
-\r
- \r
- notifyOver : function(dd, e, data){\r
- return this.dropAllowed;\r
- },\r
-\r
- \r
- notifyOut : function(dd, e, data){\r
- if(this.overClass){\r
- this.el.removeClass(this.overClass);\r
- }\r
- },\r
-\r
- \r
- notifyDrop : function(dd, e, data){\r
- return false;\r
- }\r
-});\r
-\r
-Ext.dd.DragZone = function(el, config){\r
- Ext.dd.DragZone.superclass.constructor.call(this, el, config);\r
- if(this.containerScroll){\r
- Ext.dd.ScrollManager.register(this.el);\r
- }\r
-};\r
-\r
-Ext.extend(Ext.dd.DragZone, Ext.dd.DragSource, {\r
- \r
- \r
-\r
- \r
- getDragData : function(e){\r
- return Ext.dd.Registry.getHandleFromEvent(e);\r
- },\r
- \r
- \r
- onInitDrag : function(x, y){\r
- this.proxy.update(this.dragData.ddel.cloneNode(true));\r
- this.onStartDrag(x, y);\r
- return true;\r
- },\r
- \r
- \r
- afterRepair : function(){\r
- if(Ext.enableFx){\r
- Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");\r
- }\r
- this.dragging = false;\r
- },\r
-\r
- \r
- getRepairXY : function(e){\r
- return Ext.Element.fly(this.dragData.ddel).getXY(); \r
- }\r
-});\r
-\r
-Ext.dd.DropZone = function(el, config){\r
- Ext.dd.DropZone.superclass.constructor.call(this, el, config);\r
-};\r
-\r
-Ext.extend(Ext.dd.DropZone, Ext.dd.DropTarget, {\r
- \r
- getTargetFromEvent : function(e){\r
- return Ext.dd.Registry.getTargetFromEvent(e);\r
- },\r
-\r
- \r
- onNodeEnter : function(n, dd, e, data){\r
- \r
- },\r
-\r
- \r
- onNodeOver : function(n, dd, e, data){\r
- return this.dropAllowed;\r
- },\r
-\r
- \r
- onNodeOut : function(n, dd, e, data){\r
- \r
- },\r
-\r
- \r
- onNodeDrop : function(n, dd, e, data){\r
- return false;\r
- },\r
-\r
- \r
- onContainerOver : function(dd, e, data){\r
- return this.dropNotAllowed;\r
- },\r
-\r
- \r
- onContainerDrop : function(dd, e, data){\r
- return false;\r
- },\r
-\r
- \r
- notifyEnter : function(dd, e, data){\r
- return this.dropNotAllowed;\r
- },\r
-\r
- \r
- notifyOver : function(dd, e, data){\r
- var n = this.getTargetFromEvent(e);\r
- if(!n){ // not over valid drop target\r
- if(this.lastOverNode){\r
- this.onNodeOut(this.lastOverNode, dd, e, data);\r
- this.lastOverNode = null;\r
- }\r
- return this.onContainerOver(dd, e, data);\r
- }\r
- if(this.lastOverNode != n){\r
- if(this.lastOverNode){\r
- this.onNodeOut(this.lastOverNode, dd, e, data);\r
- }\r
- this.onNodeEnter(n, dd, e, data);\r
- this.lastOverNode = n;\r
- }\r
- return this.onNodeOver(n, dd, e, data);\r
- },\r
-\r
- \r
- notifyOut : function(dd, e, data){\r
- if(this.lastOverNode){\r
- this.onNodeOut(this.lastOverNode, dd, e, data);\r
- this.lastOverNode = null;\r
- }\r
- },\r
-\r
- \r
- notifyDrop : function(dd, e, data){\r
- if(this.lastOverNode){\r
- this.onNodeOut(this.lastOverNode, dd, e, data);\r
- this.lastOverNode = null;\r
- }\r
- var n = this.getTargetFromEvent(e);\r
- return n ?\r
- this.onNodeDrop(n, dd, e, data) :\r
- this.onContainerDrop(dd, e, data);\r
- },\r
-\r
- // private\r
- triggerCacheRefresh : function(){\r
- Ext.dd.DDM.refreshCache(this.groups);\r
- } \r
-});\r
-\r
-\r
-Ext.data.SortTypes = {\r
- \r
- none : function(s){\r
- return s;\r
- },\r
- \r
- \r
- stripTagsRE : /<\/?[^>]+>/gi,\r
- \r
- \r
- asText : function(s){\r
- return String(s).replace(this.stripTagsRE, "");\r
- },\r
- \r
- \r
- asUCText : function(s){\r
- return String(s).toUpperCase().replace(this.stripTagsRE, "");\r
- },\r
- \r
- \r
- asUCString : function(s) {\r
- return String(s).toUpperCase();\r
- },\r
- \r
- \r
- asDate : function(s) {\r
- if(!s){\r
- return 0;\r
- }\r
- if(Ext.isDate(s)){\r
- return s.getTime();\r
- }\r
- return Date.parse(String(s));\r
- },\r
- \r
- \r
- asFloat : function(s) {\r
- var val = parseFloat(String(s).replace(/,/g, ""));\r
- if(isNaN(val)) val = 0;\r
- return val;\r
- },\r
- \r
- \r
- asInt : function(s) {\r
- var val = parseInt(String(s).replace(/,/g, ""));\r
- if(isNaN(val)) val = 0;\r
- return val;\r
- }\r
-};\r
-\r
-Ext.data.Record = function(data, id){\r
- this.id = (id || id === 0) ? id : ++Ext.data.Record.AUTO_ID;\r
- this.data = data;\r
-};\r
-\r
-\r
-Ext.data.Record.create = function(o){\r
- var f = Ext.extend(Ext.data.Record, {});\r
- var p = f.prototype;\r
- p.fields = new Ext.util.MixedCollection(false, function(field){\r
- return field.name;\r
- });\r
- for(var i = 0, len = o.length; i < len; i++){\r
- p.fields.add(new Ext.data.Field(o[i]));\r
- }\r
- f.getField = function(name){\r
- return p.fields.get(name);\r
- };\r
- return f;\r
-};\r
-\r
-Ext.data.Record.AUTO_ID = 1000;\r
-Ext.data.Record.EDIT = 'edit';\r
-Ext.data.Record.REJECT = 'reject';\r
-Ext.data.Record.COMMIT = 'commit';\r
-\r
-Ext.data.Record.prototype = {\r
- \r
- \r
- \r
- \r
- dirty : false,\r
- editing : false,\r
- error: null,\r
- \r
- modified: null,\r
-\r
- // private\r
- join : function(store){\r
- this.store = store;\r
- },\r
-\r
- \r
- set : function(name, value){\r
- if(String(this.data[name]) == String(value)){\r
- return;\r
- }\r
- this.dirty = true;\r
- if(!this.modified){\r
- this.modified = {};\r
- }\r
- if(typeof this.modified[name] == 'undefined'){\r
- this.modified[name] = this.data[name];\r
- }\r
- this.data[name] = value;\r
- if(!this.editing && this.store){\r
- this.store.afterEdit(this);\r
- }\r
- },\r
-\r
- \r
- get : function(name){\r
- return this.data[name];\r
- },\r
-\r
- \r
- beginEdit : function(){\r
- this.editing = true;\r
- this.modified = {};\r
- },\r
-\r
- \r
- cancelEdit : function(){\r
- this.editing = false;\r
- delete this.modified;\r
- },\r
-\r
- \r
- endEdit : function(){\r
- this.editing = false;\r
- if(this.dirty && this.store){\r
- this.store.afterEdit(this);\r
- }\r
- },\r
-\r
- \r
- reject : function(silent){\r
- var m = this.modified;\r
- for(var n in m){\r
- if(typeof m[n] != "function"){\r
- this.data[n] = m[n];\r
- }\r
- }\r
- this.dirty = false;\r
- delete this.modified;\r
- this.editing = false;\r
- if(this.store && silent !== true){\r
- this.store.afterReject(this);\r
- }\r
- },\r
-\r
- \r
- commit : function(silent){\r
- this.dirty = false;\r
- delete this.modified;\r
- this.editing = false;\r
- if(this.store && silent !== true){\r
- this.store.afterCommit(this);\r
- }\r
- },\r
-\r
- \r
- getChanges : function(){\r
- var m = this.modified, cs = {};\r
- for(var n in m){\r
- if(m.hasOwnProperty(n)){\r
- cs[n] = this.data[n];\r
- }\r
- }\r
- return cs;\r
- },\r
-\r
- // private\r
- hasError : function(){\r
- return this.error != null;\r
- },\r
-\r
- // private\r
- clearError : function(){\r
- this.error = null;\r
- },\r
-\r
- \r
- copy : function(newId) {\r
- return new this.constructor(Ext.apply({}, this.data), newId || this.id);\r
- },\r
-\r
- \r
- isModified : function(fieldName){\r
- return !!(this.modified && this.modified.hasOwnProperty(fieldName));\r
- }\r
-};\r
-\r
-Ext.StoreMgr = Ext.apply(new Ext.util.MixedCollection(), {\r
- \r
-\r
- \r
- register : function(){\r
- for(var i = 0, s; s = arguments[i]; i++){\r
- this.add(s);\r
- }\r
- },\r
-\r
- \r
- unregister : function(){\r
- for(var i = 0, s; s = arguments[i]; i++){\r
- this.remove(this.lookup(s));\r
- }\r
- },\r
-\r
- \r
- lookup : function(id){\r
- return typeof id == "object" ? id : this.get(id);\r
- },\r
-\r
- // getKey implementation for MixedCollection\r
- getKey : function(o){\r
- return o.storeId || o.id;\r
- }\r
-});\r
-\r
-Ext.data.Store = function(config){\r
- this.data = new Ext.util.MixedCollection(false);\r
- this.data.getKey = function(o){\r
- return o.id;\r
- };\r
- \r
- this.baseParams = {};\r
- \r
- this.paramNames = {\r
- "start" : "start",\r
- "limit" : "limit",\r
- "sort" : "sort",\r
- "dir" : "dir"\r
- };\r
-\r
- if(config && config.data){\r
- this.inlineData = config.data;\r
- delete config.data;\r
- }\r
-\r
- Ext.apply(this, config);\r
-\r
- if(this.url && !this.proxy){\r
- this.proxy = new Ext.data.HttpProxy({url: this.url});\r
- }\r
-\r
- if(this.reader){ // reader passed\r
- if(!this.recordType){\r
- this.recordType = this.reader.recordType;\r
- }\r
- if(this.reader.onMetaChange){\r
- this.reader.onMetaChange = this.onMetaChange.createDelegate(this);\r
- }\r
- }\r
-\r
- \r
- if(this.recordType){\r
- \r
- this.fields = this.recordType.prototype.fields;\r
- }\r
- this.modified = [];\r
-\r
- this.addEvents(\r
- \r
- 'datachanged',\r
- \r
- 'metachange',\r
- \r
- 'add',\r
- \r
- 'remove',\r
- \r
- 'update',\r
- \r
- 'clear',\r
- \r
- 'beforeload',\r
- \r
- 'load',\r
- \r
- 'loadexception'\r
- );\r
-\r
- if(this.proxy){\r
- this.relayEvents(this.proxy, ["loadexception"]);\r
- }\r
-\r
- this.sortToggle = {};\r
- if(this.sortInfo){\r
- this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);\r
- }\r
-\r
- Ext.data.Store.superclass.constructor.call(this);\r
-\r
- if(this.storeId || this.id){\r
- Ext.StoreMgr.register(this);\r
- }\r
- if(this.inlineData){\r
- this.loadData(this.inlineData);\r
- delete this.inlineData;\r
- }else if(this.autoLoad){\r
- this.load.defer(10, this, [\r
- typeof this.autoLoad == 'object' ?\r
- this.autoLoad : undefined]);\r
- }\r
-};\r
-Ext.extend(Ext.data.Store, Ext.util.Observable, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- remoteSort : false,\r
-\r
- \r
- pruneModifiedRecords : false,\r
-\r
- \r
- lastOptions : null,\r
-\r
- destroy : function(){\r
- if(this.storeId || this.id){\r
- Ext.StoreMgr.unregister(this);\r
- }\r
- this.data = null;\r
- this.purgeListeners();\r
- },\r
-\r
- \r
- add : function(records){\r
- records = [].concat(records);\r
- if(records.length < 1){\r
- return;\r
- }\r
- for(var i = 0, len = records.length; i < len; i++){\r
- records[i].join(this);\r
- }\r
- var index = this.data.length;\r
- this.data.addAll(records);\r
- if(this.snapshot){\r
- this.snapshot.addAll(records);\r
- }\r
- this.fireEvent("add", this, records, index);\r
- },\r
-\r
- \r
- addSorted : function(record){\r
- var index = this.findInsertIndex(record);\r
- this.insert(index, record);\r
- },\r
-\r
- \r
- remove : function(record){\r
- var index = this.data.indexOf(record);\r
- this.data.removeAt(index);\r
- if(this.pruneModifiedRecords){\r
- this.modified.remove(record);\r
- }\r
- if(this.snapshot){\r
- this.snapshot.remove(record);\r
- }\r
- this.fireEvent("remove", this, record, index);\r
- },\r
- \r
- \r
- removeAt : function(index){\r
- this.remove(this.getAt(index)); \r
- },\r
-\r
- \r
- removeAll : function(){\r
- this.data.clear();\r
- if(this.snapshot){\r
- this.snapshot.clear();\r
- }\r
- if(this.pruneModifiedRecords){\r
- this.modified = [];\r
- }\r
- this.fireEvent("clear", this);\r
- },\r
-\r
- \r
- insert : function(index, records){\r
- records = [].concat(records);\r
- for(var i = 0, len = records.length; i < len; i++){\r
- this.data.insert(index, records[i]);\r
- records[i].join(this);\r
- }\r
- this.fireEvent("add", this, records, index);\r
- },\r
-\r
- \r
- indexOf : function(record){\r
- return this.data.indexOf(record);\r
- },\r
-\r
- \r
- indexOfId : function(id){\r
- return this.data.indexOfKey(id);\r
- },\r
-\r
- \r
- getById : function(id){\r
- return this.data.key(id);\r
- },\r
-\r
- \r
- getAt : function(index){\r
- return this.data.itemAt(index);\r
- },\r
-\r
- \r
- getRange : function(start, end){\r
- return this.data.getRange(start, end);\r
- },\r
-\r
- // private\r
- storeOptions : function(o){\r
- o = Ext.apply({}, o);\r
- delete o.callback;\r
- delete o.scope;\r
- this.lastOptions = o;\r
- },\r
-\r
- \r
- load : function(options){\r
- options = options || {};\r
- if(this.fireEvent("beforeload", this, options) !== false){\r
- this.storeOptions(options);\r
- var p = Ext.apply(options.params || {}, this.baseParams);\r
- if(this.sortInfo && this.remoteSort){\r
- var pn = this.paramNames;\r
- p[pn["sort"]] = this.sortInfo.field;\r
- p[pn["dir"]] = this.sortInfo.direction;\r
- }\r
- this.proxy.load(p, this.reader, this.loadRecords, this, options);\r
- return true;\r
- } else {\r
- return false;\r
- }\r
- },\r
-\r
- \r
- reload : function(options){\r
- this.load(Ext.applyIf(options||{}, this.lastOptions));\r
- },\r
-\r
- // private\r
- // Called as a callback by the Reader during a load operation.\r
- loadRecords : function(o, options, success){\r
- if(!o || success === false){\r
- if(success !== false){\r
- this.fireEvent("load", this, [], options);\r
- }\r
- if(options.callback){\r
- options.callback.call(options.scope || this, [], options, false);\r
- }\r
- return;\r
- }\r
- var r = o.records, t = o.totalRecords || r.length;\r
- if(!options || options.add !== true){\r
- if(this.pruneModifiedRecords){\r
- this.modified = [];\r
- }\r
- for(var i = 0, len = r.length; i < len; i++){\r
- r[i].join(this);\r
- }\r
- if(this.snapshot){\r
- this.data = this.snapshot;\r
- delete this.snapshot;\r
- }\r
- this.data.clear();\r
- this.data.addAll(r);\r
- this.totalLength = t;\r
- this.applySort();\r
- this.fireEvent("datachanged", this);\r
- }else{\r
- this.totalLength = Math.max(t, this.data.length+r.length);\r
- this.add(r);\r
- }\r
- this.fireEvent("load", this, r, options);\r
- if(options.callback){\r
- options.callback.call(options.scope || this, r, options, true);\r
- }\r
- },\r
-\r
- \r
- loadData : function(o, append){\r
- var r = this.reader.readRecords(o);\r
- this.loadRecords(r, {add: append}, true);\r
- },\r
-\r
- \r
- getCount : function(){\r
- return this.data.length || 0;\r
- },\r
-\r
- \r
- getTotalCount : function(){\r
- return this.totalLength || 0;\r
- },\r
-\r
- \r
- getSortState : function(){\r
- return this.sortInfo;\r
- },\r
-\r
- // private\r
- applySort : function(){\r
- if(this.sortInfo && !this.remoteSort){\r
- var s = this.sortInfo, f = s.field;\r
- this.sortData(f, s.direction);\r
- }\r
- },\r
-\r
- // private\r
- sortData : function(f, direction){\r
- direction = direction || 'ASC';\r
- var st = this.fields.get(f).sortType;\r
- var fn = function(r1, r2){\r
- var v1 = st(r1.data[f]), v2 = st(r2.data[f]);\r
- return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);\r
- };\r
- this.data.sort(direction, fn);\r
- if(this.snapshot && this.snapshot != this.data){\r
- this.snapshot.sort(direction, fn);\r
- }\r
- },\r
-\r
- \r
- setDefaultSort : function(field, dir){\r
- dir = dir ? dir.toUpperCase() : "ASC";\r
- this.sortInfo = {field: field, direction: dir};\r
- this.sortToggle[field] = dir;\r
- },\r
-\r
- \r
- sort : function(fieldName, dir){\r
- var f = this.fields.get(fieldName);\r
- if(!f){\r
- return false;\r
- }\r
- if(!dir){\r
- if(this.sortInfo && this.sortInfo.field == f.name){ // toggle sort dir\r
- dir = (this.sortToggle[f.name] || "ASC").toggle("ASC", "DESC");\r
- }else{\r
- dir = f.sortDir;\r
- }\r
- }\r
- var st = (this.sortToggle) ? this.sortToggle[f.name] : null;\r
- var si = (this.sortInfo) ? this.sortInfo : null;\r
-\r
- this.sortToggle[f.name] = dir;\r
- this.sortInfo = {field: f.name, direction: dir};\r
- if(!this.remoteSort){\r
- this.applySort();\r
- this.fireEvent("datachanged", this);\r
- }else{\r
- if (!this.load(this.lastOptions)) {\r
- if (st) {\r
- this.sortToggle[f.name] = st;\r
- }\r
- if (si) {\r
- this.sortInfo = si;\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- each : function(fn, scope){\r
- this.data.each(fn, scope);\r
- },\r
-\r
- \r
- getModifiedRecords : function(){\r
- return this.modified;\r
- },\r
-\r
- // private\r
- createFilterFn : function(property, value, anyMatch, caseSensitive){\r
- if(Ext.isEmpty(value, false)){\r
- return false;\r
- }\r
- value = this.data.createValueMatcher(value, anyMatch, caseSensitive);\r
- return function(r){\r
- return value.test(r.data[property]);\r
- };\r
- },\r
-\r
- \r
- sum : function(property, start, end){\r
- var rs = this.data.items, v = 0;\r
- start = start || 0;\r
- end = (end || end === 0) ? end : rs.length-1;\r
-\r
- for(var i = start; i <= end; i++){\r
- v += (rs[i].data[property] || 0);\r
- }\r
- return v;\r
- },\r
-\r
- \r
- filter : function(property, value, anyMatch, caseSensitive){\r
- var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);\r
- return fn ? this.filterBy(fn) : this.clearFilter();\r
- },\r
-\r
- \r
- filterBy : function(fn, scope){\r
- this.snapshot = this.snapshot || this.data;\r
- this.data = this.queryBy(fn, scope||this);\r
- this.fireEvent("datachanged", this);\r
- },\r
-\r
- \r
- query : function(property, value, anyMatch, caseSensitive){\r
- var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);\r
- return fn ? this.queryBy(fn) : this.data.clone();\r
- },\r
-\r
- \r
- queryBy : function(fn, scope){\r
- var data = this.snapshot || this.data;\r
- return data.filterBy(fn, scope||this);\r
- },\r
-\r
- \r
- find : function(property, value, start, anyMatch, caseSensitive){\r
- var fn = this.createFilterFn(property, value, anyMatch, caseSensitive);\r
- return fn ? this.data.findIndexBy(fn, null, start) : -1;\r
- },\r
-\r
- \r
- findBy : function(fn, scope, start){\r
- return this.data.findIndexBy(fn, scope, start);\r
- },\r
-\r
- \r
- collect : function(dataIndex, allowNull, bypassFilter){\r
- var d = (bypassFilter === true && this.snapshot) ?\r
- this.snapshot.items : this.data.items;\r
- var v, sv, r = [], l = {};\r
- for(var i = 0, len = d.length; i < len; i++){\r
- v = d[i].data[dataIndex];\r
- sv = String(v);\r
- if((allowNull || !Ext.isEmpty(v)) && !l[sv]){\r
- l[sv] = true;\r
- r[r.length] = v;\r
- }\r
- }\r
- return r;\r
- },\r
-\r
- \r
- clearFilter : function(suppressEvent){\r
- if(this.isFiltered()){\r
- this.data = this.snapshot;\r
- delete this.snapshot;\r
- if(suppressEvent !== true){\r
- this.fireEvent("datachanged", this);\r
- }\r
- }\r
- },\r
-\r
- \r
- isFiltered : function(){\r
- return this.snapshot && this.snapshot != this.data;\r
- },\r
-\r
- // private\r
- afterEdit : function(record){\r
- if(this.modified.indexOf(record) == -1){\r
- this.modified.push(record);\r
- }\r
- this.fireEvent("update", this, record, Ext.data.Record.EDIT);\r
- },\r
-\r
- // private\r
- afterReject : function(record){\r
- this.modified.remove(record);\r
- this.fireEvent("update", this, record, Ext.data.Record.REJECT);\r
- },\r
-\r
- // private\r
- afterCommit : function(record){\r
- this.modified.remove(record);\r
- this.fireEvent("update", this, record, Ext.data.Record.COMMIT);\r
- },\r
-\r
- \r
- commitChanges : function(){\r
- var m = this.modified.slice(0);\r
- this.modified = [];\r
- for(var i = 0, len = m.length; i < len; i++){\r
- m[i].commit();\r
- }\r
- },\r
-\r
- \r
- rejectChanges : function(){\r
- var m = this.modified.slice(0);\r
- this.modified = [];\r
- for(var i = 0, len = m.length; i < len; i++){\r
- m[i].reject();\r
- }\r
- },\r
-\r
- // private\r
- onMetaChange : function(meta, rtype, o){\r
- this.recordType = rtype;\r
- this.fields = rtype.prototype.fields;\r
- delete this.snapshot;\r
- this.sortInfo = meta.sortInfo;\r
- this.modified = [];\r
- this.fireEvent('metachange', this, this.reader.meta);\r
- },\r
-\r
- // private\r
- findInsertIndex : function(record){\r
- this.suspendEvents();\r
- var data = this.data.clone();\r
- this.data.add(record);\r
- this.applySort();\r
- var index = this.data.indexOf(record);\r
- this.data = data;\r
- this.resumeEvents();\r
- return index;\r
- }\r
-});\r
-\r
-Ext.data.SimpleStore = function(config){\r
- Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {\r
- reader: new Ext.data.ArrayReader({\r
- id: config.id\r
- },\r
- Ext.data.Record.create(config.fields)\r
- )\r
- }));\r
-};\r
-Ext.extend(Ext.data.SimpleStore, Ext.data.Store, {\r
- loadData : function(data, append){\r
- if(this.expandData === true){\r
- var r = [];\r
- for(var i = 0, len = data.length; i < len; i++){\r
- r[r.length] = [data[i]];\r
- }\r
- data = r;\r
- }\r
- Ext.data.SimpleStore.superclass.loadData.call(this, data, append);\r
- }\r
-});\r
-\r
-Ext.data.JsonStore = function(c){\r
- \r
- \r
- Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {\r
- proxy: c.proxy || (!c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined),\r
- reader: new Ext.data.JsonReader(c, c.fields)\r
- }));\r
-};\r
-Ext.extend(Ext.data.JsonStore, Ext.data.Store);\r
-\r
-Ext.data.Field = function(config){\r
- if(typeof config == "string"){\r
- config = {name: config};\r
- }\r
- Ext.apply(this, config);\r
- \r
- if(!this.type){\r
- this.type = "auto";\r
- }\r
- \r
- var st = Ext.data.SortTypes;\r
- // named sortTypes are supported, here we look them up\r
- if(typeof this.sortType == "string"){\r
- this.sortType = st[this.sortType];\r
- }\r
- \r
- // set default sortType for strings and dates\r
- if(!this.sortType){\r
- switch(this.type){\r
- case "string":\r
- this.sortType = st.asUCString;\r
- break;\r
- case "date":\r
- this.sortType = st.asDate;\r
- break;\r
- default:\r
- this.sortType = st.none;\r
- }\r
- }\r
-\r
- // define once\r
- var stripRe = /[\$,%]/g;\r
-\r
- // prebuilt conversion function for this field, instead of\r
- // switching every time we're reading a value\r
- if(!this.convert){\r
- var cv, dateFormat = this.dateFormat;\r
- switch(this.type){\r
- case "":\r
- case "auto":\r
- case undefined:\r
- cv = function(v){ return v; };\r
- break;\r
- case "string":\r
- cv = function(v){ return (v === undefined || v === null) ? '' : String(v); };\r
- break;\r
- case "int":\r
- cv = function(v){\r
- return v !== undefined && v !== null && v !== '' ?\r
- parseInt(String(v).replace(stripRe, ""), 10) : '';\r
- };\r
- break;\r
- case "float":\r
- cv = function(v){\r
- return v !== undefined && v !== null && v !== '' ?\r
- parseFloat(String(v).replace(stripRe, ""), 10) : ''; \r
- };\r
- break;\r
- case "bool":\r
- case "boolean":\r
- cv = function(v){ return v === true || v === "true" || v == 1; };\r
- break;\r
- case "date":\r
- cv = function(v){\r
- if(!v){\r
- return '';\r
- }\r
- if(Ext.isDate(v)){\r
- return v;\r
- }\r
- if(dateFormat){\r
- if(dateFormat == "timestamp"){\r
- return new Date(v*1000);\r
- }\r
- if(dateFormat == "time"){\r
- return new Date(parseInt(v, 10));\r
- }\r
- return Date.parseDate(v, dateFormat);\r
- }\r
- var parsed = Date.parse(v);\r
- return parsed ? new Date(parsed) : null;\r
- };\r
- break;\r
- \r
- }\r
- this.convert = cv;\r
- }\r
-};\r
-\r
-Ext.data.Field.prototype = {\r
- \r
- \r
- \r
- \r
- dateFormat: null,\r
- \r
- defaultValue: "",\r
- \r
- mapping: null,\r
- \r
- sortType : null,\r
- \r
- sortDir : "ASC"\r
-};\r
-\r
-Ext.data.DataReader = function(meta, recordType){\r
- \r
- this.meta = meta;\r
- this.recordType = Ext.isArray(recordType) ? \r
- Ext.data.Record.create(recordType) : recordType;\r
-};\r
-\r
-Ext.data.DataReader.prototype = {\r
- \r
-};\r
-\r
-Ext.data.DataProxy = function(){\r
- this.addEvents(\r
- \r
- 'beforeload',\r
- \r
- 'load'\r
- );\r
- Ext.data.DataProxy.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.DataProxy, Ext.util.Observable);\r
-\r
-Ext.data.MemoryProxy = function(data){\r
- Ext.data.MemoryProxy.superclass.constructor.call(this);\r
- this.data = data;\r
-};\r
-\r
-Ext.extend(Ext.data.MemoryProxy, Ext.data.DataProxy, {\r
- \r
- \r
- \r
- load : function(params, reader, callback, scope, arg){\r
- params = params || {};\r
- var result;\r
- try {\r
- result = reader.readRecords(this.data);\r
- }catch(e){\r
- this.fireEvent("loadexception", this, arg, null, e);\r
- callback.call(scope, null, arg, false);\r
- return;\r
- }\r
- callback.call(scope, result, arg, true);\r
- },\r
- \r
- // private\r
- update : function(params, records){\r
- \r
- }\r
-});\r
-\r
-Ext.data.HttpProxy = function(conn){\r
- Ext.data.HttpProxy.superclass.constructor.call(this);\r
- \r
- this.conn = conn;\r
- this.useAjax = !conn || !conn.events;\r
-\r
- \r
-};\r
-\r
-Ext.extend(Ext.data.HttpProxy, Ext.data.DataProxy, {\r
- \r
- getConnection : function(){\r
- return this.useAjax ? Ext.Ajax : this.conn;\r
- },\r
-\r
- \r
- load : function(params, reader, callback, scope, arg){\r
- if(this.fireEvent("beforeload", this, params) !== false){\r
- var o = {\r
- params : params || {},\r
- request: {\r
- callback : callback,\r
- scope : scope,\r
- arg : arg\r
- },\r
- reader: reader,\r
- callback : this.loadResponse,\r
- scope: this\r
- };\r
- if(this.useAjax){\r
- Ext.applyIf(o, this.conn);\r
- if(this.activeRequest){\r
- Ext.Ajax.abort(this.activeRequest);\r
- }\r
- this.activeRequest = Ext.Ajax.request(o);\r
- }else{\r
- this.conn.request(o);\r
- }\r
- }else{\r
- callback.call(scope||this, null, arg, false);\r
- }\r
- },\r
-\r
- // private\r
- loadResponse : function(o, success, response){\r
- delete this.activeRequest;\r
- if(!success){\r
- this.fireEvent("loadexception", this, o, response);\r
- o.request.callback.call(o.request.scope, null, o.request.arg, false);\r
- return;\r
- }\r
- var result;\r
- try {\r
- result = o.reader.read(response);\r
- }catch(e){\r
- this.fireEvent("loadexception", this, o, response, e);\r
- o.request.callback.call(o.request.scope, null, o.request.arg, false);\r
- return;\r
- }\r
- this.fireEvent("load", this, o, o.request.arg);\r
- o.request.callback.call(o.request.scope, result, o.request.arg, true);\r
- },\r
- \r
- // private\r
- update : function(dataSet){\r
- \r
- },\r
- \r
- // private\r
- updateResponse : function(dataSet){\r
- \r
- }\r
-});\r
-\r
-Ext.data.ScriptTagProxy = function(config){\r
- Ext.data.ScriptTagProxy.superclass.constructor.call(this);\r
- Ext.apply(this, config);\r
- this.head = document.getElementsByTagName("head")[0];\r
- \r
- \r
-};\r
-\r
-Ext.data.ScriptTagProxy.TRANS_ID = 1000;\r
-\r
-Ext.extend(Ext.data.ScriptTagProxy, Ext.data.DataProxy, {\r
- \r
- \r
- timeout : 30000,\r
- \r
- callbackParam : "callback",\r
- \r
- nocache : true,\r
-\r
- \r
- load : function(params, reader, callback, scope, arg){\r
- if(this.fireEvent("beforeload", this, params) !== false){\r
-\r
- var p = Ext.urlEncode(Ext.apply(params, this.extraParams));\r
-\r
- var url = this.url;\r
- url += (url.indexOf("?") != -1 ? "&" : "?") + p;\r
- if(this.nocache){\r
- url += "&_dc=" + (new Date().getTime());\r
- }\r
- var transId = ++Ext.data.ScriptTagProxy.TRANS_ID;\r
- var trans = {\r
- id : transId,\r
- cb : "stcCallback"+transId,\r
- scriptId : "stcScript"+transId,\r
- params : params,\r
- arg : arg,\r
- url : url,\r
- callback : callback,\r
- scope : scope,\r
- reader : reader\r
- };\r
- var conn = this;\r
-\r
- window[trans.cb] = function(o){\r
- conn.handleResponse(o, trans);\r
- };\r
-\r
- url += String.format("&{0}={1}", this.callbackParam, trans.cb);\r
-\r
- if(this.autoAbort !== false){\r
- this.abort();\r
- }\r
-\r
- trans.timeoutId = this.handleFailure.defer(this.timeout, this, [trans]);\r
-\r
- var script = document.createElement("script");\r
- script.setAttribute("src", url);\r
- script.setAttribute("type", "text/javascript");\r
- script.setAttribute("id", trans.scriptId);\r
- this.head.appendChild(script);\r
-\r
- this.trans = trans;\r
- }else{\r
- callback.call(scope||this, null, arg, false);\r
- }\r
- },\r
-\r
- // private\r
- isLoading : function(){\r
- return this.trans ? true : false;\r
- },\r
-\r
- \r
- abort : function(){\r
- if(this.isLoading()){\r
- this.destroyTrans(this.trans);\r
- }\r
- },\r
-\r
- // private\r
- destroyTrans : function(trans, isLoaded){\r
- this.head.removeChild(document.getElementById(trans.scriptId));\r
- clearTimeout(trans.timeoutId);\r
- if(isLoaded){\r
- window[trans.cb] = undefined;\r
- try{\r
- delete window[trans.cb];\r
- }catch(e){}\r
- }else{\r
- // if hasn't been loaded, wait for load to remove it to prevent script error\r
- window[trans.cb] = function(){\r
- window[trans.cb] = undefined;\r
- try{\r
- delete window[trans.cb];\r
- }catch(e){}\r
- };\r
- }\r
- },\r
-\r
- // private\r
- handleResponse : function(o, trans){\r
- this.trans = false;\r
- this.destroyTrans(trans, true);\r
- var result;\r
- try {\r
- result = trans.reader.readRecords(o);\r
- }catch(e){\r
- this.fireEvent("loadexception", this, o, trans.arg, e);\r
- trans.callback.call(trans.scope||window, null, trans.arg, false);\r
- return;\r
- }\r
- this.fireEvent("load", this, o, trans.arg);\r
- trans.callback.call(trans.scope||window, result, trans.arg, true);\r
- },\r
-\r
- // private\r
- handleFailure : function(trans){\r
- this.trans = false;\r
- this.destroyTrans(trans, false);\r
- this.fireEvent("loadexception", this, null, trans.arg);\r
- trans.callback.call(trans.scope||window, null, trans.arg, false);\r
- }\r
-});\r
-\r
-Ext.data.JsonReader = function(meta, recordType){\r
- meta = meta || {};\r
- Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);\r
-};\r
-Ext.extend(Ext.data.JsonReader, Ext.data.DataReader, {\r
- \r
- \r
- read : function(response){\r
- var json = response.responseText;\r
- var o = eval("("+json+")");\r
- if(!o) {\r
- throw {message: "JsonReader.read: Json object not found"};\r
- }\r
- return this.readRecords(o);\r
- },\r
-\r
- // private function a store will implement\r
- onMetaChange : function(meta, recordType, o){\r
-\r
- },\r
-\r
- \r
- simpleAccess: function(obj, subsc) {\r
- return obj[subsc];\r
- },\r
-\r
- \r
- getJsonAccessor: function(){\r
- var re = /[\[\.]/;\r
- return function(expr) {\r
- try {\r
- return(re.test(expr))\r
- ? new Function("obj", "return obj." + expr)\r
- : function(obj){\r
- return obj[expr];\r
- };\r
- } catch(e){}\r
- return Ext.emptyFn;\r
- };\r
- }(),\r
-\r
- \r
- readRecords : function(o){\r
- \r
- this.jsonData = o;\r
- if(o.metaData){\r
- delete this.ef;\r
- this.meta = o.metaData;\r
- this.recordType = Ext.data.Record.create(o.metaData.fields);\r
- this.onMetaChange(this.meta, this.recordType, o);\r
- }\r
- var s = this.meta, Record = this.recordType,\r
- f = Record.prototype.fields, fi = f.items, fl = f.length;\r
-\r
-// Generate extraction functions for the totalProperty, the root, the id, and for each field\r
- if (!this.ef) {\r
- if(s.totalProperty) {\r
- this.getTotal = this.getJsonAccessor(s.totalProperty);\r
- }\r
- if(s.successProperty) {\r
- this.getSuccess = this.getJsonAccessor(s.successProperty);\r
- }\r
- this.getRoot = s.root ? this.getJsonAccessor(s.root) : function(p){return p;};\r
- if (s.id) {\r
- var g = this.getJsonAccessor(s.id);\r
- this.getId = function(rec) {\r
- var r = g(rec);\r
- return (r === undefined || r === "") ? null : r;\r
- };\r
- } else {\r
- this.getId = function(){return null;};\r
- }\r
- this.ef = [];\r
- for(var i = 0; i < fl; i++){\r
- f = fi[i];\r
- var map = (f.mapping !== undefined && f.mapping !== null) ? f.mapping : f.name;\r
- this.ef[i] = this.getJsonAccessor(map);\r
- }\r
- }\r
-\r
- var root = this.getRoot(o), c = root.length, totalRecords = c, success = true;\r
- if(s.totalProperty){\r
- var v = parseInt(this.getTotal(o), 10);\r
- if(!isNaN(v)){\r
- totalRecords = v;\r
- }\r
- }\r
- if(s.successProperty){\r
- var v = this.getSuccess(o);\r
- if(v === false || v === 'false'){\r
- success = false;\r
- }\r
- }\r
- var records = [];\r
- for(var i = 0; i < c; i++){\r
- var n = root[i];\r
- var values = {};\r
- var id = this.getId(n);\r
- for(var j = 0; j < fl; j++){\r
- f = fi[j];\r
- var v = this.ef[j](n);\r
- values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue, n);\r
- }\r
- var record = new Record(values, id);\r
- record.json = n;\r
- records[i] = record;\r
- }\r
- return {\r
- success : success,\r
- records : records,\r
- totalRecords : totalRecords\r
- };\r
- }\r
-});\r
-\r
-Ext.data.XmlReader = function(meta, recordType){\r
- meta = meta || {};\r
- Ext.data.XmlReader.superclass.constructor.call(this, meta, recordType || meta.fields);\r
-};\r
-Ext.extend(Ext.data.XmlReader, Ext.data.DataReader, {\r
- \r
- read : function(response){\r
- var doc = response.responseXML;\r
- if(!doc) {\r
- throw {message: "XmlReader.read: XML Document not available"};\r
- }\r
- return this.readRecords(doc);\r
- },\r
-\r
- \r
- readRecords : function(doc){\r
- \r
- this.xmlData = doc;\r
- var root = doc.documentElement || doc;\r
- var q = Ext.DomQuery;\r
- var recordType = this.recordType, fields = recordType.prototype.fields;\r
- var sid = this.meta.id;\r
- var totalRecords = 0, success = true;\r
- if(this.meta.totalRecords){\r
- totalRecords = q.selectNumber(this.meta.totalRecords, root, 0);\r
- }\r
-\r
- if(this.meta.success){\r
- var sv = q.selectValue(this.meta.success, root, true);\r
- success = sv !== false && sv !== 'false';\r
- }\r
- var records = [];\r
- var ns = q.select(this.meta.record, root);\r
- for(var i = 0, len = ns.length; i < len; i++) {\r
- var n = ns[i];\r
- var values = {};\r
- var id = sid ? q.selectValue(sid, n) : undefined;\r
- for(var j = 0, jlen = fields.length; j < jlen; j++){\r
- var f = fields.items[j];\r
- var v = q.selectValue(f.mapping || f.name, n, f.defaultValue);\r
- v = f.convert(v, n);\r
- values[f.name] = v;\r
- }\r
- var record = new recordType(values, id);\r
- record.node = n;\r
- records[records.length] = record;\r
- }\r
-\r
- return {\r
- success : success,\r
- records : records,\r
- totalRecords : totalRecords || records.length\r
- };\r
- }\r
-});\r
-\r
-Ext.data.ArrayReader = Ext.extend(Ext.data.JsonReader, {\r
- \r
- readRecords : function(o){\r
- var sid = this.meta ? this.meta.id : null;\r
- var recordType = this.recordType, fields = recordType.prototype.fields;\r
- var records = [];\r
- var root = o;\r
- for(var i = 0; i < root.length; i++){\r
- var n = root[i];\r
- var values = {};\r
- var id = ((sid || sid === 0) && n[sid] !== undefined && n[sid] !== "" ? n[sid] : null);\r
- for(var j = 0, jlen = fields.length; j < jlen; j++){\r
- var f = fields.items[j];\r
- var k = f.mapping !== undefined && f.mapping !== null ? f.mapping : j;\r
- var v = n[k] !== undefined ? n[k] : f.defaultValue;\r
- v = f.convert(v, n);\r
- values[f.name] = v;\r
- }\r
- var record = new recordType(values, id);\r
- record.json = n;\r
- records[records.length] = record;\r
- }\r
- return {\r
- records : records,\r
- totalRecords : records.length\r
- };\r
- }\r
-});\r
-\r
-Ext.data.Tree = function(root){\r
- this.nodeHash = {};\r
- \r
- this.root = null;\r
- if(root){\r
- this.setRootNode(root);\r
- }\r
- this.addEvents(\r
- \r
- "append",\r
- \r
- "remove",\r
- \r
- "move",\r
- \r
- "insert",\r
- \r
- "beforeappend",\r
- \r
- "beforeremove",\r
- \r
- "beforemove",\r
- \r
- "beforeinsert"\r
- );\r
-\r
- Ext.data.Tree.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.Tree, Ext.util.Observable, {\r
- \r
- pathSeparator: "/",\r
-\r
- // private\r
- proxyNodeEvent : function(){\r
- return this.fireEvent.apply(this, arguments);\r
- },\r
-\r
- \r
- getRootNode : function(){\r
- return this.root;\r
- },\r
-\r
- \r
- setRootNode : function(node){\r
- this.root = node;\r
- node.ownerTree = this;\r
- node.isRoot = true;\r
- this.registerNode(node);\r
- return node;\r
- },\r
-\r
- \r
- getNodeById : function(id){\r
- return this.nodeHash[id];\r
- },\r
-\r
- // private\r
- registerNode : function(node){\r
- this.nodeHash[node.id] = node;\r
- },\r
-\r
- // private\r
- unregisterNode : function(node){\r
- delete this.nodeHash[node.id];\r
- },\r
-\r
- toString : function(){\r
- return "[Tree"+(this.id?" "+this.id:"")+"]";\r
- }\r
-});\r
-\r
-\r
-Ext.data.Node = function(attributes){\r
- \r
- this.attributes = attributes || {};\r
- this.leaf = this.attributes.leaf;\r
- \r
- this.id = this.attributes.id;\r
- if(!this.id){\r
- this.id = Ext.id(null, "ynode-");\r
- this.attributes.id = this.id;\r
- }\r
- \r
- this.childNodes = [];\r
- if(!this.childNodes.indexOf){ // indexOf is a must\r
- this.childNodes.indexOf = function(o){\r
- for(var i = 0, len = this.length; i < len; i++){\r
- if(this[i] == o) return i;\r
- }\r
- return -1;\r
- };\r
- }\r
- \r
- this.parentNode = null;\r
- \r
- this.firstChild = null;\r
- \r
- this.lastChild = null;\r
- \r
- this.previousSibling = null;\r
- \r
- this.nextSibling = null;\r
-\r
- this.addEvents({\r
- \r
- "append" : true,\r
- \r
- "remove" : true,\r
- \r
- "move" : true,\r
- \r
- "insert" : true,\r
- \r
- "beforeappend" : true,\r
- \r
- "beforeremove" : true,\r
- \r
- "beforemove" : true,\r
- \r
- "beforeinsert" : true\r
- });\r
- this.listeners = this.attributes.listeners;\r
- Ext.data.Node.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.data.Node, Ext.util.Observable, {\r
- // private\r
- fireEvent : function(evtName){\r
- // first do standard event for this node\r
- if(Ext.data.Node.superclass.fireEvent.apply(this, arguments) === false){\r
- return false;\r
- }\r
- // then bubble it up to the tree if the event wasn't cancelled\r
- var ot = this.getOwnerTree();\r
- if(ot){\r
- if(ot.proxyNodeEvent.apply(ot, arguments) === false){\r
- return false;\r
- }\r
- }\r
- return true;\r
- },\r
-\r
- \r
- isLeaf : function(){\r
- return this.leaf === true;\r
- },\r
-\r
- // private\r
- setFirstChild : function(node){\r
- this.firstChild = node;\r
- },\r
-\r
- //private\r
- setLastChild : function(node){\r
- this.lastChild = node;\r
- },\r
-\r
-\r
- \r
- isLast : function(){\r
- return (!this.parentNode ? true : this.parentNode.lastChild == this);\r
- },\r
-\r
- \r
- isFirst : function(){\r
- return (!this.parentNode ? true : this.parentNode.firstChild == this);\r
- },\r
-\r
- \r
- hasChildNodes : function(){\r
- return !this.isLeaf() && this.childNodes.length > 0;\r
- },\r
- \r
- \r
- isExpandable : function(){\r
- return this.attributes.expandable || this.hasChildNodes();\r
- },\r
-\r
- \r
- appendChild : function(node){\r
- var multi = false;\r
- if(Ext.isArray(node)){\r
- multi = node;\r
- }else if(arguments.length > 1){\r
- multi = arguments;\r
- }\r
- // if passed an array or multiple args do them one by one\r
- if(multi){\r
- for(var i = 0, len = multi.length; i < len; i++) {\r
- this.appendChild(multi[i]);\r
- }\r
- }else{\r
- if(this.fireEvent("beforeappend", this.ownerTree, this, node) === false){\r
- return false;\r
- }\r
- var index = this.childNodes.length;\r
- var oldParent = node.parentNode;\r
- // it's a move, make sure we move it cleanly\r
- if(oldParent){\r
- if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index) === false){\r
- return false;\r
- }\r
- oldParent.removeChild(node);\r
- }\r
- index = this.childNodes.length;\r
- if(index == 0){\r
- this.setFirstChild(node);\r
- }\r
- this.childNodes.push(node);\r
- node.parentNode = this;\r
- var ps = this.childNodes[index-1];\r
- if(ps){\r
- node.previousSibling = ps;\r
- ps.nextSibling = node;\r
- }else{\r
- node.previousSibling = null;\r
- }\r
- node.nextSibling = null;\r
- this.setLastChild(node);\r
- node.setOwnerTree(this.getOwnerTree());\r
- this.fireEvent("append", this.ownerTree, this, node, index);\r
- if(oldParent){\r
- node.fireEvent("move", this.ownerTree, node, oldParent, this, index);\r
- }\r
- return node;\r
- }\r
- },\r
-\r
- \r
- removeChild : function(node){\r
- var index = this.childNodes.indexOf(node);\r
- if(index == -1){\r
- return false;\r
- }\r
- if(this.fireEvent("beforeremove", this.ownerTree, this, node) === false){\r
- return false;\r
- }\r
-\r
- // remove it from childNodes collection\r
- this.childNodes.splice(index, 1);\r
-\r
- // update siblings\r
- if(node.previousSibling){\r
- node.previousSibling.nextSibling = node.nextSibling;\r
- }\r
- if(node.nextSibling){\r
- node.nextSibling.previousSibling = node.previousSibling;\r
- }\r
-\r
- // update child refs\r
- if(this.firstChild == node){\r
- this.setFirstChild(node.nextSibling);\r
- }\r
- if(this.lastChild == node){\r
- this.setLastChild(node.previousSibling);\r
- }\r
-\r
- node.setOwnerTree(null);\r
- // clear any references from the node\r
- node.parentNode = null;\r
- node.previousSibling = null;\r
- node.nextSibling = null;\r
- this.fireEvent("remove", this.ownerTree, this, node);\r
- return node;\r
- },\r
-\r
- \r
- insertBefore : function(node, refNode){\r
- if(!refNode){ // like standard Dom, refNode can be null for append\r
- return this.appendChild(node);\r
- }\r
- // nothing to do\r
- if(node == refNode){\r
- return false;\r
- }\r
-\r
- if(this.fireEvent("beforeinsert", this.ownerTree, this, node, refNode) === false){\r
- return false;\r
- }\r
- var index = this.childNodes.indexOf(refNode);\r
- var oldParent = node.parentNode;\r
- var refIndex = index;\r
-\r
- // when moving internally, indexes will change after remove\r
- if(oldParent == this && this.childNodes.indexOf(node) < index){\r
- refIndex--;\r
- }\r
-\r
- // it's a move, make sure we move it cleanly\r
- if(oldParent){\r
- if(node.fireEvent("beforemove", node.getOwnerTree(), node, oldParent, this, index, refNode) === false){\r
- return false;\r
- }\r
- oldParent.removeChild(node);\r
- }\r
- if(refIndex == 0){\r
- this.setFirstChild(node);\r
- }\r
- this.childNodes.splice(refIndex, 0, node);\r
- node.parentNode = this;\r
- var ps = this.childNodes[refIndex-1];\r
- if(ps){\r
- node.previousSibling = ps;\r
- ps.nextSibling = node;\r
- }else{\r
- node.previousSibling = null;\r
- }\r
- node.nextSibling = refNode;\r
- refNode.previousSibling = node;\r
- node.setOwnerTree(this.getOwnerTree());\r
- this.fireEvent("insert", this.ownerTree, this, node, refNode);\r
- if(oldParent){\r
- node.fireEvent("move", this.ownerTree, node, oldParent, this, refIndex, refNode);\r
- }\r
- return node;\r
- },\r
-\r
- \r
- remove : function(){\r
- this.parentNode.removeChild(this);\r
- return this;\r
- },\r
-\r
- \r
- item : function(index){\r
- return this.childNodes[index];\r
- },\r
-\r
- \r
- replaceChild : function(newChild, oldChild){\r
- var s = oldChild ? oldChild.nextSibling : null;\r
- this.removeChild(oldChild);\r
- this.insertBefore(newChild, s);\r
- return oldChild;\r
- },\r
-\r
- \r
- indexOf : function(child){\r
- return this.childNodes.indexOf(child);\r
- },\r
-\r
- \r
- getOwnerTree : function(){\r
- // if it doesn't have one, look for one\r
- if(!this.ownerTree){\r
- var p = this;\r
- while(p){\r
- if(p.ownerTree){\r
- this.ownerTree = p.ownerTree;\r
- break;\r
- }\r
- p = p.parentNode;\r
- }\r
- }\r
- return this.ownerTree;\r
- },\r
-\r
- \r
- getDepth : function(){\r
- var depth = 0;\r
- var p = this;\r
- while(p.parentNode){\r
- ++depth;\r
- p = p.parentNode;\r
- }\r
- return depth;\r
- },\r
-\r
- // private\r
- setOwnerTree : function(tree){\r
- // if it's move, we need to update everyone\r
- if(tree != this.ownerTree){\r
- if(this.ownerTree){\r
- this.ownerTree.unregisterNode(this);\r
- }\r
- this.ownerTree = tree;\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- cs[i].setOwnerTree(tree);\r
- }\r
- if(tree){\r
- tree.registerNode(this);\r
- }\r
- }\r
- },\r
-\r
- \r
- getPath : function(attr){\r
- attr = attr || "id";\r
- var p = this.parentNode;\r
- var b = [this.attributes[attr]];\r
- while(p){\r
- b.unshift(p.attributes[attr]);\r
- p = p.parentNode;\r
- }\r
- var sep = this.getOwnerTree().pathSeparator;\r
- return sep + b.join(sep);\r
- },\r
-\r
- \r
- bubble : function(fn, scope, args){\r
- var p = this;\r
- while(p){\r
- if(fn.apply(scope || p, args || [p]) === false){\r
- break;\r
- }\r
- p = p.parentNode;\r
- }\r
- },\r
-\r
- \r
- cascade : function(fn, scope, args){\r
- if(fn.apply(scope || this, args || [this]) !== false){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- cs[i].cascade(fn, scope, args);\r
- }\r
- }\r
- },\r
-\r
- \r
- eachChild : function(fn, scope, args){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- if(fn.apply(scope || this, args || [cs[i]]) === false){\r
- break;\r
- }\r
- }\r
- },\r
-\r
- \r
- findChild : function(attribute, value){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- if(cs[i].attributes[attribute] == value){\r
- return cs[i];\r
- }\r
- }\r
- return null;\r
- },\r
-\r
- \r
- findChildBy : function(fn, scope){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- if(fn.call(scope||cs[i], cs[i]) === true){\r
- return cs[i];\r
- }\r
- }\r
- return null;\r
- },\r
-\r
- \r
- sort : function(fn, scope){\r
- var cs = this.childNodes;\r
- var len = cs.length;\r
- if(len > 0){\r
- var sortFn = scope ? function(){fn.apply(scope, arguments);} : fn;\r
- cs.sort(sortFn);\r
- for(var i = 0; i < len; i++){\r
- var n = cs[i];\r
- n.previousSibling = cs[i-1];\r
- n.nextSibling = cs[i+1];\r
- if(i == 0){\r
- this.setFirstChild(n);\r
- }\r
- if(i == len-1){\r
- this.setLastChild(n);\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- contains : function(node){\r
- return node.isAncestor(this);\r
- },\r
-\r
- \r
- isAncestor : function(node){\r
- var p = this.parentNode;\r
- while(p){\r
- if(p == node){\r
- return true;\r
- }\r
- p = p.parentNode;\r
- }\r
- return false;\r
- },\r
-\r
- toString : function(){\r
- return "[Node"+(this.id?" "+this.id:"")+"]";\r
- }\r
-});\r
-\r
-Ext.data.GroupingStore = Ext.extend(Ext.data.Store, {\r
- \r
- \r
- remoteGroup : false,\r
- \r
- groupOnSort:false,\r
-\r
- \r
- clearGrouping : function(){\r
- this.groupField = false;\r
- if(this.remoteGroup){\r
- if(this.baseParams){\r
- delete this.baseParams.groupBy;\r
- }\r
- this.reload();\r
- }else{\r
- this.applySort();\r
- this.fireEvent('datachanged', this);\r
- }\r
- },\r
-\r
- \r
- groupBy : function(field, forceRegroup){\r
- if(this.groupField == field && !forceRegroup){\r
- return; // already grouped by this field\r
- }\r
- this.groupField = field;\r
- if(this.remoteGroup){\r
- if(!this.baseParams){\r
- this.baseParams = {};\r
- }\r
- this.baseParams['groupBy'] = field;\r
- }\r
- if(this.groupOnSort){\r
- this.sort(field);\r
- return;\r
- }\r
- if(this.remoteGroup){\r
- this.reload();\r
- }else{\r
- var si = this.sortInfo || {};\r
- if(si.field != field){\r
- this.applySort();\r
- }else{\r
- this.sortData(field);\r
- }\r
- this.fireEvent('datachanged', this);\r
- }\r
- },\r
-\r
- // private\r
- applySort : function(){\r
- Ext.data.GroupingStore.superclass.applySort.call(this);\r
- if(!this.groupOnSort && !this.remoteGroup){\r
- var gs = this.getGroupState();\r
- if(gs && gs != this.sortInfo.field){\r
- this.sortData(this.groupField);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- applyGrouping : function(alwaysFireChange){\r
- if(this.groupField !== false){\r
- this.groupBy(this.groupField, true);\r
- return true;\r
- }else{\r
- if(alwaysFireChange === true){\r
- this.fireEvent('datachanged', this);\r
- }\r
- return false;\r
- }\r
- },\r
-\r
- // private\r
- getGroupState : function(){\r
- return this.groupOnSort && this.groupField !== false ?\r
- (this.sortInfo ? this.sortInfo.field : undefined) : this.groupField;\r
- }\r
-});\r
-\r
-Ext.ComponentMgr = function(){\r
- var all = new Ext.util.MixedCollection();\r
- var types = {};\r
-\r
- return {\r
- \r
- register : function(c){\r
- all.add(c);\r
- },\r
-\r
- \r
- unregister : function(c){\r
- all.remove(c);\r
- },\r
-\r
- \r
- get : function(id){\r
- return all.get(id);\r
- },\r
-\r
- \r
- onAvailable : function(id, fn, scope){\r
- all.on("add", function(index, o){\r
- if(o.id == id){\r
- fn.call(scope || o, o);\r
- all.un("add", fn, scope);\r
- }\r
- });\r
- },\r
-\r
- \r
- all : all,\r
-\r
- \r
- registerType : function(xtype, cls){\r
- types[xtype] = cls;\r
- cls.xtype = xtype;\r
- },\r
-\r
- \r
- create : function(config, defaultType){\r
- return new types[config.xtype || defaultType](config);\r
- }\r
- };\r
-}();\r
-\r
-\r
-Ext.reg = Ext.ComponentMgr.registerType; // this will be called a lot internally, shorthand to keep the bytes down\r
-\r
-Ext.Component = function(config){\r
- config = config || {};\r
- if(config.initialConfig){\r
- if(config.isAction){ // actions\r
- this.baseAction = config;\r
- }\r
- config = config.initialConfig; // component cloning / action set up\r
- }else if(config.tagName || config.dom || typeof config == "string"){ // element object\r
- config = {applyTo: config, id: config.id || config};\r
- }\r
-\r
- \r
- this.initialConfig = config;\r
-\r
- Ext.apply(this, config);\r
- this.addEvents(\r
- \r
- 'disable',\r
- \r
- 'enable',\r
- \r
- 'beforeshow',\r
- \r
- 'show',\r
- \r
- 'beforehide',\r
- \r
- 'hide',\r
- \r
- 'beforerender',\r
- \r
- 'render',\r
- \r
- 'beforedestroy',\r
- \r
- 'destroy',\r
- \r
- 'beforestaterestore',\r
- \r
- 'staterestore',\r
- \r
- 'beforestatesave',\r
- \r
- 'statesave'\r
- );\r
- this.getId();\r
- Ext.ComponentMgr.register(this);\r
- Ext.Component.superclass.constructor.call(this);\r
-\r
- if(this.baseAction){\r
- this.baseAction.addComponent(this);\r
- }\r
-\r
- this.initComponent();\r
-\r
- if(this.plugins){\r
- if(Ext.isArray(this.plugins)){\r
- for(var i = 0, len = this.plugins.length; i < len; i++){\r
- this.plugins[i] = this.initPlugin(this.plugins[i]);\r
- }\r
- }else{\r
- this.plugins = this.initPlugin(this.plugins);\r
- }\r
- }\r
-\r
- if(this.stateful !== false){\r
- this.initState(config);\r
- }\r
-\r
- if(this.applyTo){\r
- this.applyToMarkup(this.applyTo);\r
- delete this.applyTo;\r
- }else if(this.renderTo){\r
- this.render(this.renderTo);\r
- delete this.renderTo;\r
- }\r
-};\r
-\r
-// private\r
-Ext.Component.AUTO_ID = 1000;\r
-\r
-Ext.extend(Ext.Component, Ext.util.Observable, {\r
- // Configs below are used for all Components when rendered by FormLayout.\r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- \r
- \r
- \r
-\r
- \r
- disabledClass : "x-item-disabled",\r
- \r
- allowDomMove : true,\r
- \r
- autoShow : false,\r
- \r
- hideMode: 'display',\r
- \r
- hideParent: false,\r
-\r
- \r
- \r
- hidden : false,\r
- \r
- disabled : false,\r
- \r
- rendered : false,\r
-\r
- // private\r
- ctype : "Ext.Component",\r
-\r
- // private\r
- actionMode : "el",\r
-\r
- // private\r
- getActionEl : function(){\r
- return this[this.actionMode];\r
- },\r
-\r
- initPlugin : function(p){\r
- p.init(this);\r
- return p;\r
- },\r
-\r
- \r
- initComponent : Ext.emptyFn,\r
-\r
- \r
- render : function(container, position){\r
- if(!this.rendered && this.fireEvent("beforerender", this) !== false){\r
- if(!container && this.el){\r
- this.el = Ext.get(this.el);\r
- container = this.el.dom.parentNode;\r
- this.allowDomMove = false;\r
- }\r
- this.container = Ext.get(container);\r
- if(this.ctCls){\r
- this.container.addClass(this.ctCls);\r
- }\r
- this.rendered = true;\r
- if(position !== undefined){\r
- if(typeof position == 'number'){\r
- position = this.container.dom.childNodes[position];\r
- }else{\r
- position = Ext.getDom(position);\r
- }\r
- }\r
- this.onRender(this.container, position || null);\r
- if(this.autoShow){\r
- this.el.removeClass(['x-hidden','x-hide-' + this.hideMode]);\r
- }\r
- if(this.cls){\r
- this.el.addClass(this.cls);\r
- delete this.cls;\r
- }\r
- if(this.style){\r
- this.el.applyStyles(this.style);\r
- delete this.style;\r
- }\r
- if(this.overCls){\r
- this.el.addClassOnOver(this.overCls);\r
- }\r
- this.fireEvent("render", this);\r
- this.afterRender(this.container);\r
- if(this.hidden){\r
- this.hide();\r
- }\r
- if(this.disabled){\r
- this.disable();\r
- }\r
-\r
- if(this.stateful !== false){\r
- this.initStateEvents();\r
- }\r
- }\r
- return this;\r
- },\r
-\r
- // private\r
- initState : function(config){\r
- if(Ext.state.Manager){\r
- var id = this.getStateId();\r
- if(id){\r
- var state = Ext.state.Manager.get(id);\r
- if(state){\r
- if(this.fireEvent('beforestaterestore', this, state) !== false){\r
- this.applyState(state);\r
- this.fireEvent('staterestore', this, state);\r
- }\r
- }\r
- }\r
- }\r
- },\r
-\r
- // private\r
- getStateId : function(){\r
- return this.stateId || ((this.id.indexOf('ext-comp-') == 0 || this.id.indexOf('ext-gen') == 0) ? null : this.id);\r
- },\r
-\r
- // private\r
- initStateEvents : function(){\r
- if(this.stateEvents){\r
- for(var i = 0, e; e = this.stateEvents[i]; i++){\r
- this.on(e, this.saveState, this, {delay:100});\r
- }\r
- }\r
- },\r
-\r
- // private\r
- applyState : function(state, config){\r
- if(state){\r
- Ext.apply(this, state);\r
- }\r
- },\r
-\r
- // private\r
- getState : function(){\r
- return null;\r
- },\r
-\r
- // private\r
- saveState : function(){\r
- if(Ext.state.Manager){\r
- var id = this.getStateId();\r
- if(id){\r
- var state = this.getState();\r
- if(this.fireEvent('beforestatesave', this, state) !== false){\r
- Ext.state.Manager.set(id, state);\r
- this.fireEvent('statesave', this, state);\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- applyToMarkup : function(el){\r
- this.allowDomMove = false;\r
- this.el = Ext.get(el);\r
- this.render(this.el.dom.parentNode);\r
- },\r
-\r
- \r
- addClass : function(cls){\r
- if(this.el){\r
- this.el.addClass(cls);\r
- }else{\r
- this.cls = this.cls ? this.cls + ' ' + cls : cls;\r
- }\r
- },\r
-\r
- \r
- removeClass : function(cls){\r
- if(this.el){\r
- this.el.removeClass(cls);\r
- }else if(this.cls){\r
- this.cls = this.cls.split(' ').remove(cls).join(' ');\r
- }\r
- },\r
-\r
- // private\r
- // default function is not really useful\r
- onRender : function(ct, position){\r
- if(this.autoEl){\r
- if(typeof this.autoEl == 'string'){\r
- this.el = document.createElement(this.autoEl);\r
- }else{\r
- var div = document.createElement('div');\r
- Ext.DomHelper.overwrite(div, this.autoEl);\r
- this.el = div.firstChild;\r
- }\r
- if (!this.el.id) {\r
- this.el.id = this.getId();\r
- }\r
- }\r
- if(this.el){\r
- this.el = Ext.get(this.el);\r
- if(this.allowDomMove !== false){\r
- ct.dom.insertBefore(this.el.dom, position);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- getAutoCreate : function(){\r
- var cfg = typeof this.autoCreate == "object" ?\r
- this.autoCreate : Ext.apply({}, this.defaultAutoCreate);\r
- if(this.id && !cfg.id){\r
- cfg.id = this.id;\r
- }\r
- return cfg;\r
- },\r
-\r
- // private\r
- afterRender : Ext.emptyFn,\r
-\r
- \r
- destroy : function(){\r
- if(this.fireEvent("beforedestroy", this) !== false){\r
- this.beforeDestroy();\r
- if(this.rendered){\r
- this.el.removeAllListeners();\r
- this.el.remove();\r
- if(this.actionMode == "container"){\r
- this.container.remove();\r
- }\r
- }\r
- this.onDestroy();\r
- Ext.ComponentMgr.unregister(this);\r
- this.fireEvent("destroy", this);\r
- this.purgeListeners();\r
- }\r
- },\r
-\r
- // private\r
- beforeDestroy : Ext.emptyFn,\r
-\r
- // private\r
- onDestroy : Ext.emptyFn,\r
-\r
- \r
- getEl : function(){\r
- return this.el;\r
- },\r
-\r
- \r
- getId : function(){\r
- return this.id || (this.id = "ext-comp-" + (++Ext.Component.AUTO_ID));\r
- },\r
-\r
- \r
- getItemId : function(){\r
- return this.itemId || this.getId();\r
- },\r
-\r
- \r
- focus : function(selectText, delay){\r
- if(delay){\r
- this.focus.defer(typeof delay == 'number' ? delay : 10, this, [selectText, false]);\r
- return;\r
- }\r
- if(this.rendered){\r
- this.el.focus();\r
- if(selectText === true){\r
- this.el.dom.select();\r
- }\r
- }\r
- return this;\r
- },\r
-\r
- // private\r
- blur : function(){\r
- if(this.rendered){\r
- this.el.blur();\r
- }\r
- return this;\r
- },\r
-\r
- \r
- disable : function(){\r
- if(this.rendered){\r
- this.onDisable();\r
- }\r
- this.disabled = true;\r
- this.fireEvent("disable", this);\r
- return this;\r
- },\r
-\r
- // private\r
- onDisable : function(){\r
- this.getActionEl().addClass(this.disabledClass);\r
- this.el.dom.disabled = true;\r
- },\r
-\r
- \r
- enable : function(){\r
- if(this.rendered){\r
- this.onEnable();\r
- }\r
- this.disabled = false;\r
- this.fireEvent("enable", this);\r
- return this;\r
- },\r
-\r
- // private\r
- onEnable : function(){\r
- this.getActionEl().removeClass(this.disabledClass);\r
- this.el.dom.disabled = false;\r
- },\r
-\r
- \r
- setDisabled : function(disabled){\r
- this[disabled ? "disable" : "enable"]();\r
- },\r
-\r
- \r
- show: function(){\r
- if(this.fireEvent("beforeshow", this) !== false){\r
- this.hidden = false;\r
- if(this.autoRender){\r
- this.render(typeof this.autoRender == 'boolean' ? Ext.getBody() : this.autoRender);\r
- }\r
- if(this.rendered){\r
- this.onShow();\r
- }\r
- this.fireEvent("show", this);\r
- }\r
- return this;\r
- },\r
-\r
- // private\r
- onShow : function(){\r
- if(this.hideParent){\r
- this.container.removeClass('x-hide-' + this.hideMode);\r
- }else{\r
- this.getActionEl().removeClass('x-hide-' + this.hideMode);\r
- }\r
-\r
- },\r
-\r
- \r
- hide: function(){\r
- if(this.fireEvent("beforehide", this) !== false){\r
- this.hidden = true;\r
- if(this.rendered){\r
- this.onHide();\r
- }\r
- this.fireEvent("hide", this);\r
- }\r
- return this;\r
- },\r
-\r
- // private\r
- onHide : function(){\r
- if(this.hideParent){\r
- this.container.addClass('x-hide-' + this.hideMode);\r
- }else{\r
- this.getActionEl().addClass('x-hide-' + this.hideMode);\r
- }\r
- },\r
-\r
- \r
- setVisible: function(visible){\r
- if(visible) {\r
- this.show();\r
- }else{\r
- this.hide();\r
- }\r
- return this;\r
- },\r
-\r
- \r
- isVisible : function(){\r
- return this.rendered && this.getActionEl().isVisible();\r
- },\r
-\r
- \r
- cloneConfig : function(overrides){\r
- overrides = overrides || {};\r
- var id = overrides.id || Ext.id();\r
- var cfg = Ext.applyIf(overrides, this.initialConfig);\r
- cfg.id = id; // prevent dup id\r
- return new this.constructor(cfg);\r
- },\r
-\r
- \r
- getXType : function(){\r
- return this.constructor.xtype;\r
- },\r
-\r
- \r
- isXType : function(xtype, shallow){\r
- //assume a string by default\r
- if (typeof xtype == 'function'){\r
- xtype = xtype.xtype; //handle being passed the class, eg. Ext.Component\r
- }else if (typeof xtype == 'object'){\r
- xtype = xtype.constructor.xtype; //handle being passed an instance\r
- }\r
- \r
- return !shallow ? ('/' + this.getXTypes() + '/').indexOf('/' + xtype + '/') != -1 : this.constructor.xtype == xtype;\r
- },\r
-\r
- \r
- getXTypes : function(){\r
- var tc = this.constructor;\r
- if(!tc.xtypes){\r
- var c = [], sc = this;\r
- while(sc && sc.constructor.xtype){\r
- c.unshift(sc.constructor.xtype);\r
- sc = sc.constructor.superclass;\r
- }\r
- tc.xtypeChain = c;\r
- tc.xtypes = c.join('/');\r
- }\r
- return tc.xtypes;\r
- },\r
-\r
- \r
- findParentBy: function(fn) {\r
- for (var p = this.ownerCt; (p != null) && !fn(p, this); p = p.ownerCt);\r
- return p || null;\r
- },\r
-\r
- \r
- findParentByType: function(xtype) {\r
- return typeof xtype == 'function' ?\r
- this.findParentBy(function(p){\r
- return p.constructor === xtype;\r
- }) :\r
- this.findParentBy(function(p){\r
- return p.constructor.xtype === xtype;\r
- });\r
- },\r
-\r
- // internal function for auto removal of assigned event handlers on destruction\r
- mon : function(item, ename, fn, scope, opt){\r
- if(!this.mons){\r
- this.mons = [];\r
- this.on('beforedestroy', function(){\r
- for(var i= 0, len = this.mons.length; i < len; i++){\r
- var m = this.mons[i];\r
- m.item.un(m.ename, m.fn, m.scope);\r
- }\r
- }, this);\r
- }\r
- this.mons.push({\r
- item: item, ename: ename, fn: fn, scope: scope\r
- });\r
- item.on(ename, fn, scope, opt);\r
- }\r
-});\r
-\r
-Ext.reg('component', Ext.Component);\r
-\r
-\r
-Ext.Action = function(config){\r
- this.initialConfig = config;\r
- this.items = [];\r
-}\r
-\r
-Ext.Action.prototype = {\r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- // private\r
- isAction : true,\r
-\r
- \r
- setText : function(text){\r
- this.initialConfig.text = text;\r
- this.callEach('setText', [text]);\r
- },\r
-\r
- \r
- getText : function(){\r
- return this.initialConfig.text;\r
- },\r
-\r
- \r
- setIconClass : function(cls){\r
- this.initialConfig.iconCls = cls;\r
- this.callEach('setIconClass', [cls]);\r
- },\r
-\r
- \r
- getIconClass : function(){\r
- return this.initialConfig.iconCls;\r
- },\r
-\r
- \r
- setDisabled : function(v){\r
- this.initialConfig.disabled = v;\r
- this.callEach('setDisabled', [v]);\r
- },\r
-\r
- \r
- enable : function(){\r
- this.setDisabled(false);\r
- },\r
-\r
- \r
- disable : function(){\r
- this.setDisabled(true);\r
- },\r
-\r
- \r
- isDisabled : function(){\r
- return this.initialConfig.disabled;\r
- },\r
-\r
- \r
- setHidden : function(v){\r
- this.initialConfig.hidden = v;\r
- this.callEach('setVisible', [!v]);\r
- },\r
-\r
- \r
- show : function(){\r
- this.setHidden(false);\r
- },\r
-\r
- \r
- hide : function(){\r
- this.setHidden(true);\r
- },\r
-\r
- \r
- isHidden : function(){\r
- return this.initialConfig.hidden;\r
- },\r
-\r
- \r
- setHandler : function(fn, scope){\r
- this.initialConfig.handler = fn;\r
- this.initialConfig.scope = scope;\r
- this.callEach('setHandler', [fn, scope]);\r
- },\r
-\r
- \r
- each : function(fn, scope){\r
- Ext.each(this.items, fn, scope);\r
- },\r
-\r
- // private\r
- callEach : function(fnName, args){\r
- var cs = this.items;\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- cs[i][fnName].apply(cs[i], args);\r
- }\r
- },\r
-\r
- // private\r
- addComponent : function(comp){\r
- this.items.push(comp);\r
- comp.on('destroy', this.removeComponent, this);\r
- },\r
-\r
- // private\r
- removeComponent : function(comp){\r
- this.items.remove(comp);\r
- },\r
-\r
- \r
- execute : function(){\r
- this.initialConfig.handler.apply(this.initialConfig.scope || window, arguments);\r
- }\r
-};\r
-\r
-(function(){\r
-Ext.Layer = function(config, existingEl){\r
- config = config || {};\r
- var dh = Ext.DomHelper;\r
- var cp = config.parentEl, pel = cp ? Ext.getDom(cp) : document.body;\r
- if(existingEl){\r
- this.dom = Ext.getDom(existingEl);\r
- }\r
- if(!this.dom){\r
- var o = config.dh || {tag: "div", cls: "x-layer"};\r
- this.dom = dh.append(pel, o);\r
- }\r
- if(config.cls){\r
- this.addClass(config.cls);\r
- }\r
- this.constrain = config.constrain !== false;\r
- this.visibilityMode = Ext.Element.VISIBILITY;\r
- if(config.id){\r
- this.id = this.dom.id = config.id;\r
- }else{\r
- this.id = Ext.id(this.dom);\r
- }\r
- this.zindex = config.zindex || this.getZIndex();\r
- this.position("absolute", this.zindex);\r
- if(config.shadow){\r
- this.shadowOffset = config.shadowOffset || 4;\r
- this.shadow = new Ext.Shadow({\r
- offset : this.shadowOffset,\r
- mode : config.shadow\r
- });\r
- }else{\r
- this.shadowOffset = 0;\r
- }\r
- this.useShim = config.shim !== false && Ext.useShims;\r
- this.useDisplay = config.useDisplay;\r
- this.hide();\r
-};\r
-\r
-var supr = Ext.Element.prototype;\r
-\r
-// shims are shared among layer to keep from having 100 iframes\r
-var shims = [];\r
-\r
-Ext.extend(Ext.Layer, Ext.Element, {\r
-\r
- getZIndex : function(){\r
- return this.zindex || parseInt(this.getStyle("z-index"), 10) || 11000;\r
- },\r
-\r
- getShim : function(){\r
- if(!this.useShim){\r
- return null;\r
- }\r
- if(this.shim){\r
- return this.shim;\r
- }\r
- var shim = shims.shift();\r
- if(!shim){\r
- shim = this.createShim();\r
- shim.enableDisplayMode('block');\r
- shim.dom.style.display = 'none';\r
- shim.dom.style.visibility = 'visible';\r
- }\r
- var pn = this.dom.parentNode;\r
- if(shim.dom.parentNode != pn){\r
- pn.insertBefore(shim.dom, this.dom);\r
- }\r
- shim.setStyle('z-index', this.getZIndex()-2);\r
- this.shim = shim;\r
- return shim;\r
- },\r
-\r
- hideShim : function(){\r
- if(this.shim){\r
- this.shim.setDisplayed(false);\r
- shims.push(this.shim);\r
- delete this.shim;\r
- }\r
- },\r
-\r
- disableShadow : function(){\r
- if(this.shadow){\r
- this.shadowDisabled = true;\r
- this.shadow.hide();\r
- this.lastShadowOffset = this.shadowOffset;\r
- this.shadowOffset = 0;\r
- }\r
- },\r
-\r
- enableShadow : function(show){\r
- if(this.shadow){\r
- this.shadowDisabled = false;\r
- this.shadowOffset = this.lastShadowOffset;\r
- delete this.lastShadowOffset;\r
- if(show){\r
- this.sync(true);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- // this code can execute repeatedly in milliseconds (i.e. during a drag) so\r
- // code size was sacrificed for effeciency (e.g. no getBox/setBox, no XY calls)\r
- sync : function(doShow){\r
- var sw = this.shadow;\r
- if(!this.updating && this.isVisible() && (sw || this.useShim)){\r
- var sh = this.getShim();\r
-\r
- var w = this.getWidth(),\r
- h = this.getHeight();\r
-\r
- var l = this.getLeft(true),\r
- t = this.getTop(true);\r
-\r
- if(sw && !this.shadowDisabled){\r
- if(doShow && !sw.isVisible()){\r
- sw.show(this);\r
- }else{\r
- sw.realign(l, t, w, h);\r
- }\r
- if(sh){\r
- if(doShow){\r
- sh.show();\r
- }\r
- // fit the shim behind the shadow, so it is shimmed too\r
- var a = sw.adjusts, s = sh.dom.style;\r
- s.left = (Math.min(l, l+a.l))+"px";\r
- s.top = (Math.min(t, t+a.t))+"px";\r
- s.width = (w+a.w)+"px";\r
- s.height = (h+a.h)+"px";\r
- }\r
- }else if(sh){\r
- if(doShow){\r
- sh.show();\r
- }\r
- sh.setSize(w, h);\r
- sh.setLeftTop(l, t);\r
- }\r
-\r
- }\r
- },\r
-\r
- // private\r
- destroy : function(){\r
- this.hideShim();\r
- if(this.shadow){\r
- this.shadow.hide();\r
- }\r
- this.removeAllListeners();\r
- Ext.removeNode(this.dom);\r
- Ext.Element.uncache(this.id);\r
- },\r
-\r
- remove : function(){\r
- this.destroy();\r
- },\r
-\r
- // private\r
- beginUpdate : function(){\r
- this.updating = true;\r
- },\r
-\r
- // private\r
- endUpdate : function(){\r
- this.updating = false;\r
- this.sync(true);\r
- },\r
-\r
- // private\r
- hideUnders : function(negOffset){\r
- if(this.shadow){\r
- this.shadow.hide();\r
- }\r
- this.hideShim();\r
- },\r
-\r
- // private\r
- constrainXY : function(){\r
- if(this.constrain){\r
- var vw = Ext.lib.Dom.getViewWidth(),\r
- vh = Ext.lib.Dom.getViewHeight();\r
- var s = Ext.getDoc().getScroll();\r
-\r
- var xy = this.getXY();\r
- var x = xy[0], y = xy[1];\r
- var w = this.dom.offsetWidth+this.shadowOffset, h = this.dom.offsetHeight+this.shadowOffset;\r
- // only move it if it needs it\r
- var moved = false;\r
- // first validate right/bottom\r
- if((x + w) > vw+s.left){\r
- x = vw - w - this.shadowOffset;\r
- moved = true;\r
- }\r
- if((y + h) > vh+s.top){\r
- y = vh - h - this.shadowOffset;\r
- moved = true;\r
- }\r
- // then make sure top/left isn't negative\r
- if(x < s.left){\r
- x = s.left;\r
- moved = true;\r
- }\r
- if(y < s.top){\r
- y = s.top;\r
- moved = true;\r
- }\r
- if(moved){\r
- if(this.avoidY){\r
- var ay = this.avoidY;\r
- if(y <= ay && (y+h) >= ay){\r
- y = ay-h-5;\r
- }\r
- }\r
- xy = [x, y];\r
- this.storeXY(xy);\r
- supr.setXY.call(this, xy);\r
- this.sync();\r
- }\r
- }\r
- },\r
-\r
- isVisible : function(){\r
- return this.visible;\r
- },\r
-\r
- // private\r
- showAction : function(){\r
- this.visible = true; // track visibility to prevent getStyle calls\r
- if(this.useDisplay === true){\r
- this.setDisplayed("");\r
- }else if(this.lastXY){\r
- supr.setXY.call(this, this.lastXY);\r
- }else if(this.lastLT){\r
- supr.setLeftTop.call(this, this.lastLT[0], this.lastLT[1]);\r
- }\r
- },\r
-\r
- // private\r
- hideAction : function(){\r
- this.visible = false;\r
- if(this.useDisplay === true){\r
- this.setDisplayed(false);\r
- }else{\r
- this.setLeftTop(-10000,-10000);\r
- }\r
- },\r
-\r
- // overridden Element method\r
- setVisible : function(v, a, d, c, e){\r
- if(v){\r
- this.showAction();\r
- }\r
- if(a && v){\r
- var cb = function(){\r
- this.sync(true);\r
- if(c){\r
- c();\r
- }\r
- }.createDelegate(this);\r
- supr.setVisible.call(this, true, true, d, cb, e);\r
- }else{\r
- if(!v){\r
- this.hideUnders(true);\r
- }\r
- var cb = c;\r
- if(a){\r
- cb = function(){\r
- this.hideAction();\r
- if(c){\r
- c();\r
- }\r
- }.createDelegate(this);\r
- }\r
- supr.setVisible.call(this, v, a, d, cb, e);\r
- if(v){\r
- this.sync(true);\r
- }else if(!a){\r
- this.hideAction();\r
- }\r
- }\r
- },\r
-\r
- storeXY : function(xy){\r
- delete this.lastLT;\r
- this.lastXY = xy;\r
- },\r
-\r
- storeLeftTop : function(left, top){\r
- delete this.lastXY;\r
- this.lastLT = [left, top];\r
- },\r
-\r
- // private\r
- beforeFx : function(){\r
- this.beforeAction();\r
- return Ext.Layer.superclass.beforeFx.apply(this, arguments);\r
- },\r
-\r
- // private\r
- afterFx : function(){\r
- Ext.Layer.superclass.afterFx.apply(this, arguments);\r
- this.sync(this.isVisible());\r
- },\r
-\r
- // private\r
- beforeAction : function(){\r
- if(!this.updating && this.shadow){\r
- this.shadow.hide();\r
- }\r
- },\r
-\r
- // overridden Element method\r
- setLeft : function(left){\r
- this.storeLeftTop(left, this.getTop(true));\r
- supr.setLeft.apply(this, arguments);\r
- this.sync();\r
- },\r
-\r
- setTop : function(top){\r
- this.storeLeftTop(this.getLeft(true), top);\r
- supr.setTop.apply(this, arguments);\r
- this.sync();\r
- },\r
-\r
- setLeftTop : function(left, top){\r
- this.storeLeftTop(left, top);\r
- supr.setLeftTop.apply(this, arguments);\r
- this.sync();\r
- },\r
-\r
- setXY : function(xy, a, d, c, e){\r
- this.fixDisplay();\r
- this.beforeAction();\r
- this.storeXY(xy);\r
- var cb = this.createCB(c);\r
- supr.setXY.call(this, xy, a, d, cb, e);\r
- if(!a){\r
- cb();\r
- }\r
- },\r
-\r
- // private\r
- createCB : function(c){\r
- var el = this;\r
- return function(){\r
- el.constrainXY();\r
- el.sync(true);\r
- if(c){\r
- c();\r
- }\r
- };\r
- },\r
-\r
- // overridden Element method\r
- setX : function(x, a, d, c, e){\r
- this.setXY([x, this.getY()], a, d, c, e);\r
- },\r
-\r
- // overridden Element method\r
- setY : function(y, a, d, c, e){\r
- this.setXY([this.getX(), y], a, d, c, e);\r
- },\r
-\r
- // overridden Element method\r
- setSize : function(w, h, a, d, c, e){\r
- this.beforeAction();\r
- var cb = this.createCB(c);\r
- supr.setSize.call(this, w, h, a, d, cb, e);\r
- if(!a){\r
- cb();\r
- }\r
- },\r
-\r
- // overridden Element method\r
- setWidth : function(w, a, d, c, e){\r
- this.beforeAction();\r
- var cb = this.createCB(c);\r
- supr.setWidth.call(this, w, a, d, cb, e);\r
- if(!a){\r
- cb();\r
- }\r
- },\r
-\r
- // overridden Element method\r
- setHeight : function(h, a, d, c, e){\r
- this.beforeAction();\r
- var cb = this.createCB(c);\r
- supr.setHeight.call(this, h, a, d, cb, e);\r
- if(!a){\r
- cb();\r
- }\r
- },\r
-\r
- // overridden Element method\r
- setBounds : function(x, y, w, h, a, d, c, e){\r
- this.beforeAction();\r
- var cb = this.createCB(c);\r
- if(!a){\r
- this.storeXY([x, y]);\r
- supr.setXY.call(this, [x, y]);\r
- supr.setSize.call(this, w, h, a, d, cb, e);\r
- cb();\r
- }else{\r
- supr.setBounds.call(this, x, y, w, h, a, d, cb, e);\r
- }\r
- return this;\r
- },\r
-\r
- \r
- setZIndex : function(zindex){\r
- this.zindex = zindex;\r
- this.setStyle("z-index", zindex + 2);\r
- if(this.shadow){\r
- this.shadow.setZIndex(zindex + 1);\r
- }\r
- if(this.shim){\r
- this.shim.setStyle("z-index", zindex);\r
- }\r
- }\r
-});\r
-})();\r
-\r
-Ext.Shadow = function(config){\r
- Ext.apply(this, config);\r
- if(typeof this.mode != "string"){\r
- this.mode = this.defaultMode;\r
- }\r
- var o = this.offset, a = {h: 0};\r
- var rad = Math.floor(this.offset/2);\r
- switch(this.mode.toLowerCase()){ // all this hideous nonsense calculates the various offsets for shadows\r
- case "drop":\r
- a.w = 0;\r
- a.l = a.t = o;\r
- a.t -= 1;\r
- if(Ext.isIE){\r
- a.l -= this.offset + rad;\r
- a.t -= this.offset + rad;\r
- a.w -= rad;\r
- a.h -= rad;\r
- a.t += 1;\r
- }\r
- break;\r
- case "sides":\r
- a.w = (o*2);\r
- a.l = -o;\r
- a.t = o-1;\r
- if(Ext.isIE){\r
- a.l -= (this.offset - rad);\r
- a.t -= this.offset + rad;\r
- a.l += 1;\r
- a.w -= (this.offset - rad)*2;\r
- a.w -= rad + 1;\r
- a.h -= 1;\r
- }\r
- break;\r
- case "frame":\r
- a.w = a.h = (o*2);\r
- a.l = a.t = -o;\r
- a.t += 1;\r
- a.h -= 2;\r
- if(Ext.isIE){\r
- a.l -= (this.offset - rad);\r
- a.t -= (this.offset - rad);\r
- a.l += 1;\r
- a.w -= (this.offset + rad + 1);\r
- a.h -= (this.offset + rad);\r
- a.h += 1;\r
- }\r
- break;\r
- };\r
-\r
- this.adjusts = a;\r
-};\r
-\r
-Ext.Shadow.prototype = {\r
- \r
- \r
- offset: 4,\r
-\r
- // private\r
- defaultMode: "drop",\r
-\r
- \r
- show : function(target){\r
- target = Ext.get(target);\r
- if(!this.el){\r
- this.el = Ext.Shadow.Pool.pull();\r
- if(this.el.dom.nextSibling != target.dom){\r
- this.el.insertBefore(target);\r
- }\r
- }\r
- this.el.setStyle("z-index", this.zIndex || parseInt(target.getStyle("z-index"), 10)-1);\r
- if(Ext.isIE){\r
- this.el.dom.style.filter="progid:DXImageTransform.Microsoft.alpha(opacity=50) progid:DXImageTransform.Microsoft.Blur(pixelradius="+(this.offset)+")";\r
- }\r
- this.realign(\r
- target.getLeft(true),\r
- target.getTop(true),\r
- target.getWidth(),\r
- target.getHeight()\r
- );\r
- this.el.dom.style.display = "block";\r
- },\r
-\r
- \r
- isVisible : function(){\r
- return this.el ? true : false; \r
- },\r
-\r
- \r
- realign : function(l, t, w, h){\r
- if(!this.el){\r
- return;\r
- }\r
- var a = this.adjusts, d = this.el.dom, s = d.style;\r
- var iea = 0;\r
- s.left = (l+a.l)+"px";\r
- s.top = (t+a.t)+"px";\r
- var sw = (w+a.w), sh = (h+a.h), sws = sw +"px", shs = sh + "px";\r
- if(s.width != sws || s.height != shs){\r
- s.width = sws;\r
- s.height = shs;\r
- if(!Ext.isIE){\r
- var cn = d.childNodes;\r
- var sww = Math.max(0, (sw-12))+"px";\r
- cn[0].childNodes[1].style.width = sww;\r
- cn[1].childNodes[1].style.width = sww;\r
- cn[2].childNodes[1].style.width = sww;\r
- cn[1].style.height = Math.max(0, (sh-12))+"px";\r
- }\r
- }\r
- },\r
-\r
- \r
- hide : function(){\r
- if(this.el){\r
- this.el.dom.style.display = "none";\r
- Ext.Shadow.Pool.push(this.el);\r
- delete this.el;\r
- }\r
- },\r
-\r
- \r
- setZIndex : function(z){\r
- this.zIndex = z;\r
- if(this.el){\r
- this.el.setStyle("z-index", z);\r
- }\r
- }\r
-};\r
-\r
-// Private utility class that manages the internal Shadow cache\r
-Ext.Shadow.Pool = function(){\r
- var p = [];\r
- var markup = Ext.isIE ?\r
- '<div class="x-ie-shadow"></div>' :\r
- '<div class="x-shadow"><div class="xst"><div class="xstl"></div><div class="xstc"></div><div class="xstr"></div></div><div class="xsc"><div class="xsml"></div><div class="xsmc"></div><div class="xsmr"></div></div><div class="xsb"><div class="xsbl"></div><div class="xsbc"></div><div class="xsbr"></div></div></div>';\r
- return {\r
- pull : function(){\r
- var sh = p.shift();\r
- if(!sh){\r
- sh = Ext.get(Ext.DomHelper.insertHtml("beforeBegin", document.body.firstChild, markup));\r
- sh.autoBoxAdjust = false;\r
- }\r
- return sh;\r
- },\r
-\r
- push : function(sh){\r
- p.push(sh);\r
- }\r
- };\r
-}();\r
-\r
-Ext.BoxComponent = Ext.extend(Ext.Component, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- \r
-\r
- // private\r
- initComponent : function(){\r
- Ext.BoxComponent.superclass.initComponent.call(this);\r
- this.addEvents(\r
- \r
- 'resize',\r
- \r
- 'move'\r
- );\r
- },\r
-\r
- // private, set in afterRender to signify that the component has been rendered\r
- boxReady : false,\r
- // private, used to defer height settings to subclasses\r
- deferHeight: false,\r
-\r
- \r
- setSize : function(w, h){\r
- // support for standard size objects\r
- if(typeof w == 'object'){\r
- h = w.height;\r
- w = w.width;\r
- }\r
- // not rendered\r
- if(!this.boxReady){\r
- this.width = w;\r
- this.height = h;\r
- return this;\r
- }\r
-\r
- // prevent recalcs when not needed\r
- if(this.lastSize && this.lastSize.width == w && this.lastSize.height == h){\r
- return this;\r
- }\r
- this.lastSize = {width: w, height: h};\r
- var adj = this.adjustSize(w, h);\r
- var aw = adj.width, ah = adj.height;\r
- if(aw !== undefined || ah !== undefined){ // this code is nasty but performs better with floaters\r
- var rz = this.getResizeEl();\r
- if(!this.deferHeight && aw !== undefined && ah !== undefined){\r
- rz.setSize(aw, ah);\r
- }else if(!this.deferHeight && ah !== undefined){\r
- rz.setHeight(ah);\r
- }else if(aw !== undefined){\r
- rz.setWidth(aw);\r
- }\r
- this.onResize(aw, ah, w, h);\r
- this.fireEvent('resize', this, aw, ah, w, h);\r
- }\r
- return this;\r
- },\r
-\r
- \r
- setWidth : function(width){\r
- return this.setSize(width);\r
- },\r
-\r
- \r
- setHeight : function(height){\r
- return this.setSize(undefined, height);\r
- },\r
-\r
- \r
- getSize : function(){\r
- return this.el.getSize();\r
- },\r
-\r
- \r
- getPosition : function(local){\r
- if(local === true){\r
- return [this.el.getLeft(true), this.el.getTop(true)];\r
- }\r
- return this.xy || this.el.getXY();\r
- },\r
-\r
- \r
- getBox : function(local){\r
- var s = this.el.getSize();\r
- if(local === true){\r
- s.x = this.el.getLeft(true);\r
- s.y = this.el.getTop(true);\r
- }else{\r
- var xy = this.xy || this.el.getXY();\r
- s.x = xy[0];\r
- s.y = xy[1];\r
- }\r
- return s;\r
- },\r
-\r
- \r
- updateBox : function(box){\r
- this.setSize(box.width, box.height);\r
- this.setPagePosition(box.x, box.y);\r
- return this;\r
- },\r
-\r
- // protected\r
- getResizeEl : function(){\r
- return this.resizeEl || this.el;\r
- },\r
-\r
- // protected\r
- getPositionEl : function(){\r
- return this.positionEl || this.el;\r
- },\r
-\r
- \r
- setPosition : function(x, y){\r
- if(x && typeof x[1] == 'number'){\r
- y = x[1];\r
- x = x[0];\r
- }\r
- this.x = x;\r
- this.y = y;\r
- if(!this.boxReady){\r
- return this;\r
- }\r
- var adj = this.adjustPosition(x, y);\r
- var ax = adj.x, ay = adj.y;\r
-\r
- var el = this.getPositionEl();\r
- if(ax !== undefined || ay !== undefined){\r
- if(ax !== undefined && ay !== undefined){\r
- el.setLeftTop(ax, ay);\r
- }else if(ax !== undefined){\r
- el.setLeft(ax);\r
- }else if(ay !== undefined){\r
- el.setTop(ay);\r
- }\r
- this.onPosition(ax, ay);\r
- this.fireEvent('move', this, ax, ay);\r
- }\r
- return this;\r
- },\r
-\r
- \r
- setPagePosition : function(x, y){\r
- if(x && typeof x[1] == 'number'){\r
- y = x[1];\r
- x = x[0];\r
- }\r
- this.pageX = x;\r
- this.pageY = y;\r
- if(!this.boxReady){\r
- return;\r
- }\r
- if(x === undefined || y === undefined){ // cannot translate undefined points\r
- return;\r
- }\r
- var p = this.el.translatePoints(x, y);\r
- this.setPosition(p.left, p.top);\r
- return this;\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.BoxComponent.superclass.onRender.call(this, ct, position);\r
- if(this.resizeEl){\r
- this.resizeEl = Ext.get(this.resizeEl);\r
- }\r
- if(this.positionEl){\r
- this.positionEl = Ext.get(this.positionEl);\r
- }\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.BoxComponent.superclass.afterRender.call(this);\r
- this.boxReady = true;\r
- this.setSize(this.width, this.height);\r
- if(this.x || this.y){\r
- this.setPosition(this.x, this.y);\r
- }else if(this.pageX || this.pageY){\r
- this.setPagePosition(this.pageX, this.pageY);\r
- }\r
- },\r
-\r
- \r
- syncSize : function(){\r
- delete this.lastSize;\r
- this.setSize(this.autoWidth ? undefined : this.el.getWidth(), this.autoHeight ? undefined : this.el.getHeight());\r
- return this;\r
- },\r
-\r
- \r
- onResize : function(adjWidth, adjHeight, rawWidth, rawHeight){\r
-\r
- },\r
-\r
- \r
- onPosition : function(x, y){\r
-\r
- },\r
-\r
- // private\r
- adjustSize : function(w, h){\r
- if(this.autoWidth){\r
- w = 'auto';\r
- }\r
- if(this.autoHeight){\r
- h = 'auto';\r
- }\r
- return {width : w, height: h};\r
- },\r
-\r
- // private\r
- adjustPosition : function(x, y){\r
- return {x : x, y: y};\r
- }\r
-});\r
-Ext.reg('box', Ext.BoxComponent);\r
-\r
-Ext.SplitBar = function(dragElement, resizingElement, orientation, placement, existingProxy){\r
- \r
- \r
- this.el = Ext.get(dragElement, true);\r
- this.el.dom.unselectable = "on";\r
- \r
- this.resizingEl = Ext.get(resizingElement, true);\r
-\r
- \r
- this.orientation = orientation || Ext.SplitBar.HORIZONTAL;\r
- \r
- \r
- this.minSize = 0;\r
- \r
- \r
- this.maxSize = 2000;\r
- \r
- \r
- this.animate = false;\r
- \r
- \r
- this.useShim = false;\r
- \r
- \r
- this.shim = null;\r
- \r
- if(!existingProxy){\r
- \r
- this.proxy = Ext.SplitBar.createProxy(this.orientation);\r
- }else{\r
- this.proxy = Ext.get(existingProxy).dom;\r
- }\r
- \r
- this.dd = new Ext.dd.DDProxy(this.el.dom.id, "XSplitBars", {dragElId : this.proxy.id});\r
- \r
- \r
- this.dd.b4StartDrag = this.onStartProxyDrag.createDelegate(this);\r
- \r
- \r
- this.dd.endDrag = this.onEndProxyDrag.createDelegate(this);\r
- \r
- \r
- this.dragSpecs = {};\r
- \r
- \r
- this.adapter = new Ext.SplitBar.BasicLayoutAdapter();\r
- this.adapter.init(this);\r
- \r
- if(this.orientation == Ext.SplitBar.HORIZONTAL){\r
- \r
- this.placement = placement || (this.el.getX() > this.resizingEl.getX() ? Ext.SplitBar.LEFT : Ext.SplitBar.RIGHT);\r
- this.el.addClass("x-splitbar-h");\r
- }else{\r
- \r
- this.placement = placement || (this.el.getY() > this.resizingEl.getY() ? Ext.SplitBar.TOP : Ext.SplitBar.BOTTOM);\r
- this.el.addClass("x-splitbar-v");\r
- }\r
- \r
- this.addEvents(\r
- \r
- "resize",\r
- \r
- "moved",\r
- \r
- "beforeresize",\r
-\r
- "beforeapply"\r
- );\r
-\r
- Ext.SplitBar.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.SplitBar, Ext.util.Observable, {\r
- onStartProxyDrag : function(x, y){\r
- this.fireEvent("beforeresize", this);\r
- this.overlay = Ext.DomHelper.append(document.body, {cls: "x-drag-overlay", html: " "}, true);\r
- this.overlay.unselectable();\r
- this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
- this.overlay.show();\r
- Ext.get(this.proxy).setDisplayed("block");\r
- var size = this.adapter.getElementSize(this);\r
- this.activeMinSize = this.getMinimumSize();\r
- this.activeMaxSize = this.getMaximumSize();\r
- var c1 = size - this.activeMinSize;\r
- var c2 = Math.max(this.activeMaxSize - size, 0);\r
- if(this.orientation == Ext.SplitBar.HORIZONTAL){\r
- this.dd.resetConstraints();\r
- this.dd.setXConstraint(\r
- this.placement == Ext.SplitBar.LEFT ? c1 : c2, \r
- this.placement == Ext.SplitBar.LEFT ? c2 : c1\r
- );\r
- this.dd.setYConstraint(0, 0);\r
- }else{\r
- this.dd.resetConstraints();\r
- this.dd.setXConstraint(0, 0);\r
- this.dd.setYConstraint(\r
- this.placement == Ext.SplitBar.TOP ? c1 : c2, \r
- this.placement == Ext.SplitBar.TOP ? c2 : c1\r
- );\r
- }\r
- this.dragSpecs.startSize = size;\r
- this.dragSpecs.startPoint = [x, y];\r
- Ext.dd.DDProxy.prototype.b4StartDrag.call(this.dd, x, y);\r
- },\r
- \r
- \r
- onEndProxyDrag : function(e){\r
- Ext.get(this.proxy).setDisplayed(false);\r
- var endPoint = Ext.lib.Event.getXY(e);\r
- if(this.overlay){\r
- Ext.destroy(this.overlay);\r
- delete this.overlay;\r
- }\r
- var newSize;\r
- if(this.orientation == Ext.SplitBar.HORIZONTAL){\r
- newSize = this.dragSpecs.startSize + \r
- (this.placement == Ext.SplitBar.LEFT ?\r
- endPoint[0] - this.dragSpecs.startPoint[0] :\r
- this.dragSpecs.startPoint[0] - endPoint[0]\r
- );\r
- }else{\r
- newSize = this.dragSpecs.startSize + \r
- (this.placement == Ext.SplitBar.TOP ?\r
- endPoint[1] - this.dragSpecs.startPoint[1] :\r
- this.dragSpecs.startPoint[1] - endPoint[1]\r
- );\r
- }\r
- newSize = Math.min(Math.max(newSize, this.activeMinSize), this.activeMaxSize);\r
- if(newSize != this.dragSpecs.startSize){\r
- if(this.fireEvent('beforeapply', this, newSize) !== false){\r
- this.adapter.setElementSize(this, newSize);\r
- this.fireEvent("moved", this, newSize);\r
- this.fireEvent("resize", this, newSize);\r
- }\r
- }\r
- },\r
- \r
- \r
- getAdapter : function(){\r
- return this.adapter;\r
- },\r
- \r
- \r
- setAdapter : function(adapter){\r
- this.adapter = adapter;\r
- this.adapter.init(this);\r
- },\r
- \r
- \r
- getMinimumSize : function(){\r
- return this.minSize;\r
- },\r
- \r
- \r
- setMinimumSize : function(minSize){\r
- this.minSize = minSize;\r
- },\r
- \r
- \r
- getMaximumSize : function(){\r
- return this.maxSize;\r
- },\r
- \r
- \r
- setMaximumSize : function(maxSize){\r
- this.maxSize = maxSize;\r
- },\r
- \r
- \r
- setCurrentSize : function(size){\r
- var oldAnimate = this.animate;\r
- this.animate = false;\r
- this.adapter.setElementSize(this, size);\r
- this.animate = oldAnimate;\r
- },\r
- \r
- \r
- destroy : function(removeEl){\r
- if(this.shim){\r
- this.shim.remove();\r
- }\r
- this.dd.unreg();\r
- Ext.destroy(Ext.get(this.proxy));\r
- if(removeEl){\r
- this.el.remove();\r
- }\r
- }\r
-});\r
-\r
-\r
-Ext.SplitBar.createProxy = function(dir){\r
- var proxy = new Ext.Element(document.createElement("div"));\r
- proxy.unselectable();\r
- var cls = 'x-splitbar-proxy';\r
- proxy.addClass(cls + ' ' + (dir == Ext.SplitBar.HORIZONTAL ? cls +'-h' : cls + '-v'));\r
- document.body.appendChild(proxy.dom);\r
- return proxy.dom;\r
-};\r
-\r
-\r
-Ext.SplitBar.BasicLayoutAdapter = function(){\r
-};\r
-\r
-Ext.SplitBar.BasicLayoutAdapter.prototype = {\r
- // do nothing for now\r
- init : function(s){\r
- \r
- },\r
- \r
- getElementSize : function(s){\r
- if(s.orientation == Ext.SplitBar.HORIZONTAL){\r
- return s.resizingEl.getWidth();\r
- }else{\r
- return s.resizingEl.getHeight();\r
- }\r
- },\r
- \r
- \r
- setElementSize : function(s, newSize, onComplete){\r
- if(s.orientation == Ext.SplitBar.HORIZONTAL){\r
- if(!s.animate){\r
- s.resizingEl.setWidth(newSize);\r
- if(onComplete){\r
- onComplete(s, newSize);\r
- }\r
- }else{\r
- s.resizingEl.setWidth(newSize, true, .1, onComplete, 'easeOut');\r
- }\r
- }else{\r
- \r
- if(!s.animate){\r
- s.resizingEl.setHeight(newSize);\r
- if(onComplete){\r
- onComplete(s, newSize);\r
- }\r
- }else{\r
- s.resizingEl.setHeight(newSize, true, .1, onComplete, 'easeOut');\r
- }\r
- }\r
- }\r
-};\r
-\r
-\r
-Ext.SplitBar.AbsoluteLayoutAdapter = function(container){\r
- this.basic = new Ext.SplitBar.BasicLayoutAdapter();\r
- this.container = Ext.get(container);\r
-};\r
-\r
-Ext.SplitBar.AbsoluteLayoutAdapter.prototype = {\r
- init : function(s){\r
- this.basic.init(s);\r
- },\r
- \r
- getElementSize : function(s){\r
- return this.basic.getElementSize(s);\r
- },\r
- \r
- setElementSize : function(s, newSize, onComplete){\r
- this.basic.setElementSize(s, newSize, this.moveSplitter.createDelegate(this, [s]));\r
- },\r
- \r
- moveSplitter : function(s){\r
- var yes = Ext.SplitBar;\r
- switch(s.placement){\r
- case yes.LEFT:\r
- s.el.setX(s.resizingEl.getRight());\r
- break;\r
- case yes.RIGHT:\r
- s.el.setStyle("right", (this.container.getWidth() - s.resizingEl.getLeft()) + "px");\r
- break;\r
- case yes.TOP:\r
- s.el.setY(s.resizingEl.getBottom());\r
- break;\r
- case yes.BOTTOM:\r
- s.el.setY(s.resizingEl.getTop() - s.el.getHeight());\r
- break;\r
- }\r
- }\r
-};\r
-\r
-\r
-Ext.SplitBar.VERTICAL = 1;\r
-\r
-\r
-Ext.SplitBar.HORIZONTAL = 2;\r
-\r
-\r
-Ext.SplitBar.LEFT = 1;\r
-\r
-\r
-Ext.SplitBar.RIGHT = 2;\r
-\r
-\r
-Ext.SplitBar.TOP = 3;\r
-\r
-\r
-Ext.SplitBar.BOTTOM = 4;\r
-\r
-\r
-Ext.Container = Ext.extend(Ext.BoxComponent, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- \r
- autoDestroy: true,\r
- \r
- \r
- defaultType: 'panel',\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.Container.superclass.initComponent.call(this);\r
-\r
- this.addEvents(\r
- \r
- 'afterlayout',\r
- \r
- 'beforeadd',\r
- \r
- 'beforeremove',\r
- \r
- 'add',\r
- \r
- 'remove'\r
- );\r
-\r
- \r
- var items = this.items;\r
- if(items){\r
- delete this.items;\r
- if(Ext.isArray(items) && items.length > 0){\r
- this.add.apply(this, items);\r
- }else{\r
- this.add(items);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- initItems : function(){\r
- if(!this.items){\r
- this.items = new Ext.util.MixedCollection(false, this.getComponentId);\r
- this.getLayout(); // initialize the layout\r
- }\r
- },\r
-\r
- // private\r
- setLayout : function(layout){\r
- if(this.layout && this.layout != layout){\r
- this.layout.setContainer(null);\r
- }\r
- this.initItems();\r
- this.layout = layout;\r
- layout.setContainer(this);\r
- },\r
-\r
- // private\r
- render : function(){\r
- Ext.Container.superclass.render.apply(this, arguments);\r
- if(this.layout){\r
- if(typeof this.layout == 'string'){\r
- this.layout = new Ext.Container.LAYOUTS[this.layout.toLowerCase()](this.layoutConfig);\r
- }\r
- this.setLayout(this.layout);\r
-\r
- if(this.activeItem !== undefined){\r
- var item = this.activeItem;\r
- delete this.activeItem;\r
- this.layout.setActiveItem(item);\r
- return;\r
- }\r
- }\r
- if(!this.ownerCt){\r
- this.doLayout();\r
- }\r
- if(this.monitorResize === true){\r
- Ext.EventManager.onWindowResize(this.doLayout, this, [false]);\r
- }\r
- },\r
-\r
- \r
- getLayoutTarget : function(){\r
- return this.el;\r
- },\r
-\r
- // private - used as the key lookup function for the items collection\r
- getComponentId : function(comp){\r
- return comp.itemId || comp.id;\r
- },\r
-\r
- \r
- add : function(comp){\r
- if(!this.items){\r
- this.initItems();\r
- }\r
- var a = arguments, len = a.length;\r
- if(len > 1){\r
- for(var i = 0; i < len; i++) {\r
- this.add(a[i]);\r
- }\r
- return;\r
- }\r
- var c = this.lookupComponent(this.applyDefaults(comp));\r
- var pos = this.items.length;\r
- if(this.fireEvent('beforeadd', this, c, pos) !== false && this.onBeforeAdd(c) !== false){\r
- this.items.add(c);\r
- c.ownerCt = this;\r
- this.fireEvent('add', this, c, pos);\r
- }\r
- return c;\r
- },\r
-\r
- \r
- insert : function(index, comp){\r
- if(!this.items){\r
- this.initItems();\r
- }\r
- var a = arguments, len = a.length;\r
- if(len > 2){\r
- for(var i = len-1; i >= 1; --i) {\r
- this.insert(index, a[i]);\r
- }\r
- return;\r
- }\r
- var c = this.lookupComponent(this.applyDefaults(comp));\r
-\r
- if(c.ownerCt == this && this.items.indexOf(c) < index){\r
- --index;\r
- }\r
-\r
- if(this.fireEvent('beforeadd', this, c, index) !== false && this.onBeforeAdd(c) !== false){\r
- this.items.insert(index, c);\r
- c.ownerCt = this;\r
- this.fireEvent('add', this, c, index);\r
- }\r
- return c;\r
- },\r
-\r
- // private\r
- applyDefaults : function(c){\r
- if(this.defaults){\r
- if(typeof c == 'string'){\r
- c = Ext.ComponentMgr.get(c);\r
- Ext.apply(c, this.defaults);\r
- }else if(!c.events){\r
- Ext.applyIf(c, this.defaults);\r
- }else{\r
- Ext.apply(c, this.defaults);\r
- }\r
- }\r
- return c;\r
- },\r
-\r
- // private\r
- onBeforeAdd : function(item){\r
- if(item.ownerCt){\r
- item.ownerCt.remove(item, false);\r
- }\r
- if(this.hideBorders === true){\r
- item.border = (item.border === true);\r
- }\r
- },\r
-\r
- \r
- remove : function(comp, autoDestroy){\r
- var c = this.getComponent(comp);\r
- if(c && this.fireEvent('beforeremove', this, c) !== false){\r
- this.items.remove(c);\r
- delete c.ownerCt;\r
- if(autoDestroy === true || (autoDestroy !== false && this.autoDestroy)){\r
- c.destroy();\r
- }\r
- if(this.layout && this.layout.activeItem == c){\r
- delete this.layout.activeItem;\r
- }\r
- this.fireEvent('remove', this, c);\r
- }\r
- return c;\r
- },\r
- \r
- \r
- removeAll: function(autoDestroy){\r
- var item, items = [];\r
- while((item = this.items.last())){\r
- items.unshift(this.remove(item, autoDestroy));\r
- }\r
- return items;\r
- },\r
-\r
- \r
- getComponent : function(comp){\r
- if(typeof comp == 'object'){\r
- return comp;\r
- }\r
- return this.items.get(comp);\r
- },\r
-\r
- // private\r
- lookupComponent : function(comp){\r
- if(typeof comp == 'string'){\r
- return Ext.ComponentMgr.get(comp);\r
- }else if(!comp.events){\r
- return this.createComponent(comp);\r
- }\r
- return comp;\r
- },\r
-\r
- // private\r
- createComponent : function(config){\r
- return Ext.ComponentMgr.create(config, this.defaultType);\r
- },\r
-\r
- \r
- doLayout : function(shallow){\r
- if(this.rendered && this.layout){\r
- this.layout.layout();\r
- }\r
- if(shallow !== false && this.items){\r
- var cs = this.items.items;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- var c = cs[i];\r
- if(c.doLayout){\r
- c.doLayout();\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- getLayout : function(){\r
- if(!this.layout){\r
- var layout = new Ext.layout.ContainerLayout(this.layoutConfig);\r
- this.setLayout(layout);\r
- }\r
- return this.layout;\r
- },\r
-\r
- // private\r
- beforeDestroy : function(){\r
- if(this.items){\r
- Ext.destroy.apply(Ext, this.items.items);\r
- }\r
- if(this.monitorResize){\r
- Ext.EventManager.removeResizeListener(this.doLayout, this);\r
- }\r
- if (this.layout && this.layout.destroy) {\r
- this.layout.destroy();\r
- }\r
- Ext.Container.superclass.beforeDestroy.call(this);\r
- },\r
-\r
- \r
- bubble : function(fn, scope, args){\r
- var p = this;\r
- while(p){\r
- if(fn.apply(scope || p, args || [p]) === false){\r
- break;\r
- }\r
- p = p.ownerCt;\r
- }\r
- },\r
-\r
- \r
- cascade : function(fn, scope, args){\r
- if(fn.apply(scope || this, args || [this]) !== false){\r
- if(this.items){\r
- var cs = this.items.items;\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- if(cs[i].cascade){\r
- cs[i].cascade(fn, scope, args);\r
- }else{\r
- fn.apply(scope || cs[i], args || [cs[i]]);\r
- }\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- findById : function(id){\r
- var m, ct = this;\r
- this.cascade(function(c){\r
- if(ct != c && c.id === id){\r
- m = c;\r
- return false;\r
- }\r
- });\r
- return m || null;\r
- },\r
-\r
- \r
- findByType : function(xtype, shallow){\r
- return this.findBy(function(c){\r
- return c.isXType(xtype, shallow);\r
- });\r
- },\r
-\r
- \r
- find : function(prop, value){\r
- return this.findBy(function(c){\r
- return c[prop] === value;\r
- });\r
- },\r
-\r
- \r
- findBy : function(fn, scope){\r
- var m = [], ct = this;\r
- this.cascade(function(c){\r
- if(ct != c && fn.call(scope || c, c, ct) === true){\r
- m.push(c);\r
- }\r
- });\r
- return m;\r
- }\r
-});\r
-\r
-Ext.Container.LAYOUTS = {};\r
-Ext.reg('container', Ext.Container);\r
-\r
-Ext.layout.ContainerLayout = function(config){\r
- Ext.apply(this, config);\r
-};\r
-\r
-Ext.layout.ContainerLayout.prototype = {\r
- \r
- \r
-\r
- \r
-\r
- // private\r
- monitorResize:false,\r
- // private\r
- activeItem : null,\r
-\r
- // private\r
- layout : function(){\r
- var target = this.container.getLayoutTarget();\r
- this.onLayout(this.container, target);\r
- this.container.fireEvent('afterlayout', this.container, this);\r
- },\r
-\r
- // private\r
- onLayout : function(ct, target){\r
- this.renderAll(ct, target);\r
- },\r
-\r
- // private\r
- isValidParent : function(c, target){\r
- var el = c.getPositionEl ? c.getPositionEl() : c.getEl();\r
- return el.dom.parentNode == target.dom;\r
- },\r
-\r
- // private\r
- renderAll : function(ct, target){\r
- var items = ct.items.items;\r
- for(var i = 0, len = items.length; i < len; i++) {\r
- var c = items[i];\r
- if(c && (!c.rendered || !this.isValidParent(c, target))){\r
- this.renderItem(c, i, target);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- renderItem : function(c, position, target){\r
- if(c && !c.rendered){\r
- c.render(target, position);\r
- if(this.extraCls){\r
- var t = c.getPositionEl ? c.getPositionEl() : c;\r
- t.addClass(this.extraCls);\r
- }\r
- if (this.renderHidden && c != this.activeItem) {\r
- c.hide();\r
- }\r
- }else if(c && !this.isValidParent(c, target)){\r
- if(this.extraCls){\r
- var t = c.getPositionEl ? c.getPositionEl() : c;\r
- t.addClass(this.extraCls);\r
- }\r
- if(typeof position == 'number'){\r
- position = target.dom.childNodes[position];\r
- }\r
- target.dom.insertBefore(c.getEl().dom, position || null);\r
- if (this.renderHidden && c != this.activeItem) {\r
- c.hide();\r
- }\r
- }\r
- },\r
-\r
- // private\r
- onResize: function(){\r
- if(this.container.collapsed){\r
- return;\r
- }\r
- var b = this.container.bufferResize;\r
- if(b){\r
- if(!this.resizeTask){\r
- this.resizeTask = new Ext.util.DelayedTask(this.layout, this);\r
- this.resizeBuffer = typeof b == 'number' ? b : 100;\r
- }\r
- this.resizeTask.delay(this.resizeBuffer);\r
- }else{\r
- this.layout();\r
- }\r
- },\r
-\r
- // private\r
- setContainer : function(ct){\r
- if(this.monitorResize && ct != this.container){\r
- if(this.container){\r
- this.container.un('resize', this.onResize, this);\r
- }\r
- if(ct){\r
- ct.on('resize', this.onResize, this);\r
- }\r
- }\r
- this.container = ct;\r
- },\r
-\r
- // private\r
- parseMargins : function(v){\r
- var ms = v.split(' ');\r
- var len = ms.length;\r
- if(len == 1){\r
- ms[1] = ms[0];\r
- ms[2] = ms[0];\r
- ms[3] = ms[0];\r
- }\r
- if(len == 2){\r
- ms[2] = ms[0];\r
- ms[3] = ms[1];\r
- }\r
- return {\r
- top:parseInt(ms[0], 10) || 0,\r
- right:parseInt(ms[1], 10) || 0,\r
- bottom:parseInt(ms[2], 10) || 0,\r
- left:parseInt(ms[3], 10) || 0\r
- };\r
- },\r
-\r
- \r
- destroy : Ext.emptyFn\r
-};\r
-Ext.Container.LAYOUTS['auto'] = Ext.layout.ContainerLayout;\r
-\r
-Ext.layout.FitLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
- // private\r
- monitorResize:true,\r
-\r
- // private\r
- onLayout : function(ct, target){\r
- Ext.layout.FitLayout.superclass.onLayout.call(this, ct, target);\r
- if(!this.container.collapsed){\r
- this.setItemSize(this.activeItem || ct.items.itemAt(0), target.getStyleSize());\r
- }\r
- },\r
-\r
- // private\r
- setItemSize : function(item, size){\r
- if(item && size.height > 0){ // display none?\r
- item.setSize(size);\r
- }\r
- }\r
-});\r
-Ext.Container.LAYOUTS['fit'] = Ext.layout.FitLayout;\r
-\r
-Ext.layout.CardLayout = Ext.extend(Ext.layout.FitLayout, {\r
- \r
- deferredRender : false,\r
-\r
- // private\r
- renderHidden : true,\r
-\r
- \r
- setActiveItem : function(item){\r
- item = this.container.getComponent(item);\r
- if(this.activeItem != item){\r
- if(this.activeItem){\r
- this.activeItem.hide();\r
- }\r
- this.activeItem = item;\r
- item.show();\r
- this.layout();\r
- }\r
- },\r
-\r
- // private\r
- renderAll : function(ct, target){\r
- if(this.deferredRender){\r
- this.renderItem(this.activeItem, undefined, target);\r
- }else{\r
- Ext.layout.CardLayout.superclass.renderAll.call(this, ct, target);\r
- }\r
- }\r
-});\r
-Ext.Container.LAYOUTS['card'] = Ext.layout.CardLayout;\r
-\r
-Ext.layout.AnchorLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
- // private\r
- monitorResize:true,\r
-\r
- // private\r
- getAnchorViewSize : function(ct, target){\r
- return target.dom == document.body ?\r
- target.getViewSize() : target.getStyleSize();\r
- },\r
-\r
- // private\r
- onLayout : function(ct, target){\r
- Ext.layout.AnchorLayout.superclass.onLayout.call(this, ct, target);\r
-\r
- var size = this.getAnchorViewSize(ct, target);\r
-\r
- var w = size.width, h = size.height;\r
-\r
- if(w < 20 || h < 20){\r
- return;\r
- }\r
-\r
- // find the container anchoring size\r
- var aw, ah;\r
- if(ct.anchorSize){\r
- if(typeof ct.anchorSize == 'number'){\r
- aw = ct.anchorSize;\r
- }else{\r
- aw = ct.anchorSize.width;\r
- ah = ct.anchorSize.height;\r
- }\r
- }else{\r
- aw = ct.initialConfig.width;\r
- ah = ct.initialConfig.height;\r
- }\r
-\r
- var cs = ct.items.items, len = cs.length, i, c, a, cw, ch;\r
- for(i = 0; i < len; i++){\r
- c = cs[i];\r
- if(c.anchor){\r
- a = c.anchorSpec;\r
- if(!a){ // cache all anchor values\r
- var vs = c.anchor.split(' ');\r
- c.anchorSpec = a = {\r
- right: this.parseAnchor(vs[0], c.initialConfig.width, aw),\r
- bottom: this.parseAnchor(vs[1], c.initialConfig.height, ah)\r
- };\r
- }\r
- cw = a.right ? this.adjustWidthAnchor(a.right(w), c) : undefined;\r
- ch = a.bottom ? this.adjustHeightAnchor(a.bottom(h), c) : undefined;\r
-\r
- if(cw || ch){\r
- c.setSize(cw || undefined, ch || undefined);\r
- }\r
- }\r
- }\r
- },\r
-\r
- // private\r
- parseAnchor : function(a, start, cstart){\r
- if(a && a != 'none'){\r
- var last;\r
- if(/^(r|right|b|bottom)$/i.test(a)){ // standard anchor\r
- var diff = cstart - start;\r
- return function(v){\r
- if(v !== last){\r
- last = v;\r
- return v - diff;\r
- }\r
- }\r
- }else if(a.indexOf('%') != -1){\r
- var ratio = parseFloat(a.replace('%', ''))*.01; // percentage\r
- return function(v){\r
- if(v !== last){\r
- last = v;\r
- return Math.floor(v*ratio);\r
- }\r
- }\r
- }else{\r
- a = parseInt(a, 10);\r
- if(!isNaN(a)){ // simple offset adjustment\r
- return function(v){\r
- if(v !== last){\r
- last = v;\r
- return v + a;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- return false;\r
- },\r
-\r
- // private\r
- adjustWidthAnchor : function(value, comp){\r
- return value;\r
- },\r
-\r
- // private\r
- adjustHeightAnchor : function(value, comp){\r
- return value;\r
- }\r
- \r
- \r
-});\r
-Ext.Container.LAYOUTS['anchor'] = Ext.layout.AnchorLayout;\r
-\r
-Ext.layout.ColumnLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
- // private\r
- monitorResize:true,\r
- \r
- \r
- extraCls: 'x-column',\r
-\r
- scrollOffset : 0,\r
-\r
- // private\r
- isValidParent : function(c, target){\r
- return (c.getPositionEl ? c.getPositionEl() : c.getEl()).dom.parentNode == this.innerCt.dom;\r
- },\r
-\r
- // private\r
- onLayout : function(ct, target){\r
- var cs = ct.items.items, len = cs.length, c, i;\r
-\r
- if(!this.innerCt){\r
- target.addClass('x-column-layout-ct');\r
-\r
- // the innerCt prevents wrapping and shuffling while\r
- // the container is resizing\r
- this.innerCt = target.createChild({cls:'x-column-inner'});\r
- this.innerCt.createChild({cls:'x-clear'});\r
- }\r
- this.renderAll(ct, this.innerCt);\r
-\r
- var size = Ext.isIE && target.dom != Ext.getBody().dom ? target.getStyleSize() : target.getViewSize();\r
-\r
- if(size.width < 1 && size.height < 1){ // display none?\r
- return;\r
- }\r
-\r
- var w = size.width - target.getPadding('lr') - this.scrollOffset,\r
- h = size.height - target.getPadding('tb'),\r
- pw = w;\r
-\r
- this.innerCt.setWidth(w);\r
- \r
- // some columns can be percentages while others are fixed\r
- // so we need to make 2 passes\r
-\r
- for(i = 0; i < len; i++){\r
- c = cs[i];\r
- if(!c.columnWidth){\r
- pw -= (c.getSize().width + c.getEl().getMargins('lr'));\r
- }\r
- }\r
-\r
- pw = pw < 0 ? 0 : pw;\r
-\r
- for(i = 0; i < len; i++){\r
- c = cs[i];\r
- if(c.columnWidth){\r
- c.setSize(Math.floor(c.columnWidth*pw) - c.getEl().getMargins('lr'));\r
- }\r
- }\r
- }\r
- \r
- \r
-});\r
-\r
-Ext.Container.LAYOUTS['column'] = Ext.layout.ColumnLayout;\r
-\r
-Ext.layout.BorderLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
- // private\r
- monitorResize:true,\r
- // private\r
- rendered : false,\r
-\r
- // private\r
- onLayout : function(ct, target){\r
- var collapsed;\r
- if(!this.rendered){\r
- target.position();\r
- target.addClass('x-border-layout-ct');\r
- var items = ct.items.items;\r
- collapsed = [];\r
- for(var i = 0, len = items.length; i < len; i++) {\r
- var c = items[i];\r
- var pos = c.region;\r
- if(c.collapsed){\r
- collapsed.push(c);\r
- }\r
- c.collapsed = false;\r
- if(!c.rendered){\r
- c.cls = c.cls ? c.cls +' x-border-panel' : 'x-border-panel';\r
- c.render(target, i);\r
- }\r
- this[pos] = pos != 'center' && c.split ?\r
- new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :\r
- new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);\r
- this[pos].render(target, c);\r
- }\r
- this.rendered = true;\r
- }\r
-\r
- var size = target.getViewSize();\r
- if(size.width < 20 || size.height < 20){ // display none?\r
- if(collapsed){\r
- this.restoreCollapsed = collapsed;\r
- }\r
- return;\r
- }else if(this.restoreCollapsed){\r
- collapsed = this.restoreCollapsed;\r
- delete this.restoreCollapsed;\r
- }\r
-\r
- var w = size.width, h = size.height;\r
- var centerW = w, centerH = h, centerY = 0, centerX = 0;\r
-\r
- var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;\r
- if(!c && Ext.layout.BorderLayout.WARN !== false){\r
- throw 'No center region defined in BorderLayout ' + ct.id;\r
- }\r
-\r
- if(n && n.isVisible()){\r
- var b = n.getSize();\r
- var m = n.getMargins();\r
- b.width = w - (m.left+m.right);\r
- b.x = m.left;\r
- b.y = m.top;\r
- centerY = b.height + b.y + m.bottom;\r
- centerH -= centerY;\r
- n.applyLayout(b);\r
- }\r
- if(s && s.isVisible()){\r
- var b = s.getSize();\r
- var m = s.getMargins();\r
- b.width = w - (m.left+m.right);\r
- b.x = m.left;\r
- var totalHeight = (b.height + m.top + m.bottom);\r
- b.y = h - totalHeight + m.top;\r
- centerH -= totalHeight;\r
- s.applyLayout(b);\r
- }\r
- if(west && west.isVisible()){\r
- var b = west.getSize();\r
- var m = west.getMargins();\r
- b.height = centerH - (m.top+m.bottom);\r
- b.x = m.left;\r
- b.y = centerY + m.top;\r
- var totalWidth = (b.width + m.left + m.right);\r
- centerX += totalWidth;\r
- centerW -= totalWidth;\r
- west.applyLayout(b);\r
- }\r
- if(e && e.isVisible()){\r
- var b = e.getSize();\r
- var m = e.getMargins();\r
- b.height = centerH - (m.top+m.bottom);\r
- var totalWidth = (b.width + m.left + m.right);\r
- b.x = w - totalWidth + m.left;\r
- b.y = centerY + m.top;\r
- centerW -= totalWidth;\r
- e.applyLayout(b);\r
- }\r
-\r
- if(c){\r
- var m = c.getMargins();\r
- var centerBox = {\r
- x: centerX + m.left,\r
- y: centerY + m.top,\r
- width: centerW - (m.left+m.right),\r
- height: centerH - (m.top+m.bottom)\r
- };\r
- c.applyLayout(centerBox);\r
- }\r
- if(collapsed){\r
- for(var i = 0, len = collapsed.length; i < len; i++){\r
- collapsed[i].collapse(false);\r
- }\r
- }\r
-\r
- if(Ext.isIE && Ext.isStrict){ // workaround IE strict repainting issue\r
- target.repaint();\r
- }\r
- },\r
-\r
- // inherit docs\r
- destroy: function() {\r
- var r = ['north', 'south', 'east', 'west'];\r
- for (var i = 0; i < r.length; i++) {\r
- var region = this[r[i]];\r
- if(region){\r
- if(region.destroy){\r
- region.destroy();\r
- }else if (region.split){\r
- region.split.destroy(true);\r
- }\r
- }\r
- }\r
- Ext.layout.BorderLayout.superclass.destroy.call(this);\r
- }\r
- \r
- \r
-});\r
-\r
-\r
-Ext.layout.BorderLayout.Region = function(layout, config, pos){\r
- Ext.apply(this, config);\r
- this.layout = layout;\r
- this.position = pos;\r
- this.state = {};\r
- if(typeof this.margins == 'string'){\r
- this.margins = this.layout.parseMargins(this.margins);\r
- }\r
- this.margins = Ext.applyIf(this.margins || {}, this.defaultMargins);\r
- if(this.collapsible){\r
- if(typeof this.cmargins == 'string'){\r
- this.cmargins = this.layout.parseMargins(this.cmargins);\r
- }\r
- if(this.collapseMode == 'mini' && !this.cmargins){\r
- this.cmargins = {left:0,top:0,right:0,bottom:0};\r
- }else{\r
- this.cmargins = Ext.applyIf(this.cmargins || {},\r
- pos == 'north' || pos == 'south' ? this.defaultNSCMargins : this.defaultEWCMargins);\r
- }\r
- }\r
-};\r
-\r
-Ext.layout.BorderLayout.Region.prototype = {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- collapsible : false,\r
- \r
- split:false,\r
- \r
- floatable: true,\r
- \r
- minWidth:50,\r
- \r
- minHeight:50,\r
-\r
- // private\r
- defaultMargins : {left:0,top:0,right:0,bottom:0},\r
- // private\r
- defaultNSCMargins : {left:5,top:5,right:5,bottom:5},\r
- // private\r
- defaultEWCMargins : {left:5,top:0,right:5,bottom:0},\r
-\r
- \r
- isCollapsed : false,\r
-\r
- \r
- \r
- \r
-\r
- // private\r
- render : function(ct, p){\r
- this.panel = p;\r
- p.el.enableDisplayMode();\r
- this.targetEl = ct;\r
- this.el = p.el;\r
-\r
- var gs = p.getState, ps = this.position;\r
- p.getState = function(){\r
- return Ext.apply(gs.call(p) || {}, this.state);\r
- }.createDelegate(this);\r
-\r
- if(ps != 'center'){\r
- p.allowQueuedExpand = false;\r
- p.on({\r
- beforecollapse: this.beforeCollapse,\r
- collapse: this.onCollapse,\r
- beforeexpand: this.beforeExpand,\r
- expand: this.onExpand,\r
- hide: this.onHide,\r
- show: this.onShow,\r
- scope: this\r
- });\r
- if(this.collapsible){\r
- p.collapseEl = 'el';\r
- p.slideAnchor = this.getSlideAnchor();\r
- }\r
- if(p.tools && p.tools.toggle){\r
- p.tools.toggle.addClass('x-tool-collapse-'+ps);\r
- p.tools.toggle.addClassOnOver('x-tool-collapse-'+ps+'-over');\r
- }\r
- }\r
- },\r
-\r
- // private\r
- getCollapsedEl : function(){\r
- if(!this.collapsedEl){\r
- if(!this.toolTemplate){\r
- var tt = new Ext.Template(\r
- '<div class="x-tool x-tool-{id}"> </div>'\r
- );\r
- tt.disableFormats = true;\r
- tt.compile();\r
- Ext.layout.BorderLayout.Region.prototype.toolTemplate = tt;\r
- }\r
- this.collapsedEl = this.targetEl.createChild({\r
- cls: "x-layout-collapsed x-layout-collapsed-"+this.position,\r
- id: this.panel.id + '-xcollapsed'\r
- });\r
- this.collapsedEl.enableDisplayMode('block');\r
-\r
- if(this.collapseMode == 'mini'){\r
- this.collapsedEl.addClass('x-layout-cmini-'+this.position);\r
- this.miniCollapsedEl = this.collapsedEl.createChild({\r
- cls: "x-layout-mini x-layout-mini-"+this.position, html: " "\r
- });\r
- this.miniCollapsedEl.addClassOnOver('x-layout-mini-over');\r
- this.collapsedEl.addClassOnOver("x-layout-collapsed-over");\r
- this.collapsedEl.on('click', this.onExpandClick, this, {stopEvent:true});\r
- }else {\r
- var t = this.toolTemplate.append(\r
- this.collapsedEl.dom,\r
- {id:'expand-'+this.position}, true);\r
- t.addClassOnOver('x-tool-expand-'+this.position+'-over');\r
- t.on('click', this.onExpandClick, this, {stopEvent:true});\r
- \r
- if(this.floatable !== false){\r
- this.collapsedEl.addClassOnOver("x-layout-collapsed-over");\r
- this.collapsedEl.on("click", this.collapseClick, this);\r
- }\r
- }\r
- }\r
- return this.collapsedEl;\r
- },\r
-\r
- // private\r
- onExpandClick : function(e){\r
- if(this.isSlid){\r
- this.afterSlideIn();\r
- this.panel.expand(false);\r
- }else{\r
- this.panel.expand();\r
- }\r
- },\r
-\r
- // private\r
- onCollapseClick : function(e){\r
- this.panel.collapse();\r
- },\r
-\r
- // private\r
- beforeCollapse : function(p, animate){\r
- this.lastAnim = animate;\r
- if(this.splitEl){\r
- this.splitEl.hide();\r
- }\r
- this.getCollapsedEl().show();\r
- this.panel.el.setStyle('z-index', 100);\r
- this.isCollapsed = true;\r
- this.layout.layout();\r
- },\r
-\r
- // private\r
- onCollapse : function(animate){\r
- this.panel.el.setStyle('z-index', 1);\r
- if(this.lastAnim === false || this.panel.animCollapse === false){\r
- this.getCollapsedEl().dom.style.visibility = 'visible';\r
- }else{\r
- this.getCollapsedEl().slideIn(this.panel.slideAnchor, {duration:.2});\r
- }\r
- this.state.collapsed = true;\r
- this.panel.saveState();\r
- },\r
-\r
- // private\r
- beforeExpand : function(animate){\r
- var c = this.getCollapsedEl();\r
- this.el.show();\r
- if(this.position == 'east' || this.position == 'west'){\r
- this.panel.setSize(undefined, c.getHeight());\r
- }else{\r
- this.panel.setSize(c.getWidth(), undefined);\r
- }\r
- c.hide();\r
- c.dom.style.visibility = 'hidden';\r
- this.panel.el.setStyle('z-index', 100);\r
- },\r
-\r
- // private\r
- onExpand : function(){\r
- this.isCollapsed = false;\r
- if(this.splitEl){\r
- this.splitEl.show();\r
- }\r
- this.layout.layout();\r
- this.panel.el.setStyle('z-index', 1);\r
- this.state.collapsed = false;\r
- this.panel.saveState();\r
- },\r
-\r
- // private\r
- collapseClick : function(e){\r
- if(this.isSlid){\r
- e.stopPropagation();\r
- this.slideIn();\r
- }else{\r
- e.stopPropagation();\r
- this.slideOut();\r
- }\r
- },\r
-\r
- // private\r
- onHide : function(){\r
- if(this.isCollapsed){\r
- this.getCollapsedEl().hide();\r
- }else if(this.splitEl){\r
- this.splitEl.hide();\r
- }\r
- },\r
-\r
- // private\r
- onShow : function(){\r
- if(this.isCollapsed){\r
- this.getCollapsedEl().show();\r
- }else if(this.splitEl){\r
- this.splitEl.show();\r
- }\r
- },\r
-\r
- \r
- isVisible : function(){\r
- return !this.panel.hidden;\r
- },\r
-\r
- \r
- getMargins : function(){\r
- return this.isCollapsed && this.cmargins ? this.cmargins : this.margins;\r
- },\r
-\r
- \r
- getSize : function(){\r
- return this.isCollapsed ? this.getCollapsedEl().getSize() : this.panel.getSize();\r
- },\r
-\r
- \r
- setPanel : function(panel){\r
- this.panel = panel;\r
- },\r
-\r
- \r
- getMinWidth: function(){\r
- return this.minWidth;\r
- },\r
-\r
- \r
- getMinHeight: function(){\r
- return this.minHeight;\r
- },\r
-\r
- // private\r
- applyLayoutCollapsed : function(box){\r
- var ce = this.getCollapsedEl();\r
- ce.setLeftTop(box.x, box.y);\r
- ce.setSize(box.width, box.height);\r
- },\r
-\r
- // private\r
- applyLayout : function(box){\r
- if(this.isCollapsed){\r
- this.applyLayoutCollapsed(box);\r
- }else{\r
- this.panel.setPosition(box.x, box.y);\r
- this.panel.setSize(box.width, box.height);\r
- }\r
- },\r
-\r
- // private\r
- beforeSlide: function(){\r
- this.panel.beforeEffect();\r
- },\r
-\r
- // private\r
- afterSlide : function(){\r
- this.panel.afterEffect();\r
- },\r
-\r
- // private\r
- initAutoHide : function(){\r
- if(this.autoHide !== false){\r
- if(!this.autoHideHd){\r
- var st = new Ext.util.DelayedTask(this.slideIn, this);\r
- this.autoHideHd = {\r
- "mouseout": function(e){\r
- if(!e.within(this.el, true)){\r
- st.delay(500);\r
- }\r
- },\r
- "mouseover" : function(e){\r
- st.cancel();\r
- },\r
- scope : this\r
- };\r
- }\r
- this.el.on(this.autoHideHd);\r
- }\r
- },\r
-\r
- // private\r
- clearAutoHide : function(){\r
- if(this.autoHide !== false){\r
- this.el.un("mouseout", this.autoHideHd.mouseout);\r
- this.el.un("mouseover", this.autoHideHd.mouseover);\r
- }\r
- },\r
-\r
- // private\r
- clearMonitor : function(){\r
- Ext.getDoc().un("click", this.slideInIf, this);\r
- },\r
-\r
- // these names are backwards but not changed for compat\r
- // private\r
- slideOut : function(){\r
- if(this.isSlid || this.el.hasActiveFx()){\r
- return;\r
- }\r
- this.isSlid = true;\r
- var ts = this.panel.tools;\r
- if(ts && ts.toggle){\r
- ts.toggle.hide();\r
- }\r
- this.el.show();\r
- if(this.position == 'east' || this.position == 'west'){\r
- this.panel.setSize(undefined, this.collapsedEl.getHeight());\r
- }else{\r
- this.panel.setSize(this.collapsedEl.getWidth(), undefined);\r
- }\r
- this.restoreLT = [this.el.dom.style.left, this.el.dom.style.top];\r
- this.el.alignTo(this.collapsedEl, this.getCollapseAnchor());\r
- this.el.setStyle("z-index", 102);\r
- this.panel.el.replaceClass('x-panel-collapsed', 'x-panel-floating');\r
- if(this.animFloat !== false){\r
- this.beforeSlide();\r
- this.el.slideIn(this.getSlideAnchor(), {\r
- callback: function(){\r
- this.afterSlide();\r
- this.initAutoHide();\r
- Ext.getDoc().on("click", this.slideInIf, this);\r
- },\r
- scope: this,\r
- block: true\r
- });\r
- }else{\r
- this.initAutoHide();\r
- Ext.getDoc().on("click", this.slideInIf, this);\r
- }\r
- },\r
-\r
- // private\r
- afterSlideIn : function(){\r
- this.clearAutoHide();\r
- this.isSlid = false;\r
- this.clearMonitor();\r
- this.el.setStyle("z-index", "");\r
- this.panel.el.replaceClass('x-panel-floating', 'x-panel-collapsed');\r
- this.el.dom.style.left = this.restoreLT[0];\r
- this.el.dom.style.top = this.restoreLT[1];\r
-\r
- var ts = this.panel.tools;\r
- if(ts && ts.toggle){\r
- ts.toggle.show();\r
- }\r
- },\r
-\r
- // private\r
- slideIn : function(cb){\r
- if(!this.isSlid || this.el.hasActiveFx()){\r
- Ext.callback(cb);\r
- return;\r
- }\r
- this.isSlid = false;\r
- if(this.animFloat !== false){\r
- this.beforeSlide();\r
- this.el.slideOut(this.getSlideAnchor(), {\r
- callback: function(){\r
- this.el.hide();\r
- this.afterSlide();\r
- this.afterSlideIn();\r
- Ext.callback(cb);\r
- },\r
- scope: this,\r
- block: true\r
- });\r
- }else{\r
- this.el.hide();\r
- this.afterSlideIn();\r
- }\r
- },\r
-\r
- // private\r
- slideInIf : function(e){\r
- if(!e.within(this.el)){\r
- this.slideIn();\r
- }\r
- },\r
-\r
- // private\r
- anchors : {\r
- "west" : "left",\r
- "east" : "right",\r
- "north" : "top",\r
- "south" : "bottom"\r
- },\r
-\r
- // private\r
- sanchors : {\r
- "west" : "l",\r
- "east" : "r",\r
- "north" : "t",\r
- "south" : "b"\r
- },\r
-\r
- // private\r
- canchors : {\r
- "west" : "tl-tr",\r
- "east" : "tr-tl",\r
- "north" : "tl-bl",\r
- "south" : "bl-tl"\r
- },\r
-\r
- // private\r
- getAnchor : function(){\r
- return this.anchors[this.position];\r
- },\r
-\r
- // private\r
- getCollapseAnchor : function(){\r
- return this.canchors[this.position];\r
- },\r
-\r
- // private\r
- getSlideAnchor : function(){\r
- return this.sanchors[this.position];\r
- },\r
-\r
- // private\r
- getAlignAdj : function(){\r
- var cm = this.cmargins;\r
- switch(this.position){\r
- case "west":\r
- return [0, 0];\r
- break;\r
- case "east":\r
- return [0, 0];\r
- break;\r
- case "north":\r
- return [0, 0];\r
- break;\r
- case "south":\r
- return [0, 0];\r
- break;\r
- }\r
- },\r
-\r
- // private\r
- getExpandAdj : function(){\r
- var c = this.collapsedEl, cm = this.cmargins;\r
- switch(this.position){\r
- case "west":\r
- return [-(cm.right+c.getWidth()+cm.left), 0];\r
- break;\r
- case "east":\r
- return [cm.right+c.getWidth()+cm.left, 0];\r
- break;\r
- case "north":\r
- return [0, -(cm.top+cm.bottom+c.getHeight())];\r
- break;\r
- case "south":\r
- return [0, cm.top+cm.bottom+c.getHeight()];\r
- break;\r
- }\r
- }\r
-};\r
-\r
-\r
-Ext.layout.BorderLayout.SplitRegion = function(layout, config, pos){\r
- Ext.layout.BorderLayout.SplitRegion.superclass.constructor.call(this, layout, config, pos);\r
- // prevent switch\r
- this.applyLayout = this.applyFns[pos];\r
-};\r
-\r
-Ext.extend(Ext.layout.BorderLayout.SplitRegion, Ext.layout.BorderLayout.Region, {\r
- \r
- splitTip : "Drag to resize.",\r
- \r
- collapsibleSplitTip : "Drag to resize. Double click to hide.",\r
- \r
- useSplitTips : false,\r
-\r
- // private\r
- splitSettings : {\r
- north : {\r
- orientation: Ext.SplitBar.VERTICAL,\r
- placement: Ext.SplitBar.TOP,\r
- maxFn : 'getVMaxSize',\r
- minProp: 'minHeight',\r
- maxProp: 'maxHeight'\r
- },\r
- south : {\r
- orientation: Ext.SplitBar.VERTICAL,\r
- placement: Ext.SplitBar.BOTTOM,\r
- maxFn : 'getVMaxSize',\r
- minProp: 'minHeight',\r
- maxProp: 'maxHeight'\r
- },\r
- east : {\r
- orientation: Ext.SplitBar.HORIZONTAL,\r
- placement: Ext.SplitBar.RIGHT,\r
- maxFn : 'getHMaxSize',\r
- minProp: 'minWidth',\r
- maxProp: 'maxWidth'\r
- },\r
- west : {\r
- orientation: Ext.SplitBar.HORIZONTAL,\r
- placement: Ext.SplitBar.LEFT,\r
- maxFn : 'getHMaxSize',\r
- minProp: 'minWidth',\r
- maxProp: 'maxWidth'\r
- }\r
- },\r
-\r
- // private\r
- applyFns : {\r
- west : function(box){\r
- if(this.isCollapsed){\r
- return this.applyLayoutCollapsed(box);\r
- }\r
- var sd = this.splitEl.dom, s = sd.style;\r
- this.panel.setPosition(box.x, box.y);\r
- var sw = sd.offsetWidth;\r
- s.left = (box.x+box.width-sw)+'px';\r
- s.top = (box.y)+'px';\r
- s.height = Math.max(0, box.height)+'px';\r
- this.panel.setSize(box.width-sw, box.height);\r
- },\r
- east : function(box){\r
- if(this.isCollapsed){\r
- return this.applyLayoutCollapsed(box);\r
- }\r
- var sd = this.splitEl.dom, s = sd.style;\r
- var sw = sd.offsetWidth;\r
- this.panel.setPosition(box.x+sw, box.y);\r
- s.left = (box.x)+'px';\r
- s.top = (box.y)+'px';\r
- s.height = Math.max(0, box.height)+'px';\r
- this.panel.setSize(box.width-sw, box.height);\r
- },\r
- north : function(box){\r
- if(this.isCollapsed){\r
- return this.applyLayoutCollapsed(box);\r
- }\r
- var sd = this.splitEl.dom, s = sd.style;\r
- var sh = sd.offsetHeight;\r
- this.panel.setPosition(box.x, box.y);\r
- s.left = (box.x)+'px';\r
- s.top = (box.y+box.height-sh)+'px';\r
- s.width = Math.max(0, box.width)+'px';\r
- this.panel.setSize(box.width, box.height-sh);\r
- },\r
- south : function(box){\r
- if(this.isCollapsed){\r
- return this.applyLayoutCollapsed(box);\r
- }\r
- var sd = this.splitEl.dom, s = sd.style;\r
- var sh = sd.offsetHeight;\r
- this.panel.setPosition(box.x, box.y+sh);\r
- s.left = (box.x)+'px';\r
- s.top = (box.y)+'px';\r
- s.width = Math.max(0, box.width)+'px';\r
- this.panel.setSize(box.width, box.height-sh);\r
- }\r
- },\r
-\r
- // private\r
- render : function(ct, p){\r
- Ext.layout.BorderLayout.SplitRegion.superclass.render.call(this, ct, p);\r
-\r
- var ps = this.position;\r
-\r
- this.splitEl = ct.createChild({\r
- cls: "x-layout-split x-layout-split-"+ps, html: " ",\r
- id: this.panel.id + '-xsplit'\r
- });\r
-\r
- if(this.collapseMode == 'mini'){\r
- this.miniSplitEl = this.splitEl.createChild({\r
- cls: "x-layout-mini x-layout-mini-"+ps, html: " "\r
- });\r
- this.miniSplitEl.addClassOnOver('x-layout-mini-over');\r
- this.miniSplitEl.on('click', this.onCollapseClick, this, {stopEvent:true});\r
- }\r
-\r
- var s = this.splitSettings[ps];\r
-\r
- this.split = new Ext.SplitBar(this.splitEl.dom, p.el, s.orientation);\r
- this.split.placement = s.placement;\r
- this.split.getMaximumSize = this[s.maxFn].createDelegate(this);\r
- this.split.minSize = this.minSize || this[s.minProp];\r
- this.split.on("beforeapply", this.onSplitMove, this);\r
- this.split.useShim = this.useShim === true;\r
- this.maxSize = this.maxSize || this[s.maxProp];\r
-\r
- if(p.hidden){\r
- this.splitEl.hide();\r
- }\r
-\r
- if(this.useSplitTips){\r
- this.splitEl.dom.title = this.collapsible ? this.collapsibleSplitTip : this.splitTip;\r
- }\r
- if(this.collapsible){\r
- this.splitEl.on("dblclick", this.onCollapseClick, this);\r
- }\r
- },\r
-\r
- //docs inherit from superclass\r
- getSize : function(){\r
- if(this.isCollapsed){\r
- return this.collapsedEl.getSize();\r
- }\r
- var s = this.panel.getSize();\r
- if(this.position == 'north' || this.position == 'south'){\r
- s.height += this.splitEl.dom.offsetHeight;\r
- }else{\r
- s.width += this.splitEl.dom.offsetWidth;\r
- }\r
- return s;\r
- },\r
-\r
- // private\r
- getHMaxSize : function(){\r
- var cmax = this.maxSize || 10000;\r
- var center = this.layout.center;\r
- return Math.min(cmax, (this.el.getWidth()+center.el.getWidth())-center.getMinWidth());\r
- },\r
-\r
- // private\r
- getVMaxSize : function(){\r
- var cmax = this.maxSize || 10000;\r
- var center = this.layout.center;\r
- return Math.min(cmax, (this.el.getHeight()+center.el.getHeight())-center.getMinHeight());\r
- },\r
-\r
- // private\r
- onSplitMove : function(split, newSize){\r
- var s = this.panel.getSize();\r
- this.lastSplitSize = newSize;\r
- if(this.position == 'north' || this.position == 'south'){\r
- this.panel.setSize(s.width, newSize);\r
- this.state.height = newSize;\r
- }else{\r
- this.panel.setSize(newSize, s.height);\r
- this.state.width = newSize;\r
- }\r
- this.layout.layout();\r
- this.panel.saveState();\r
- return false;\r
- },\r
-\r
- \r
- getSplitBar : function(){\r
- return this.split;\r
- },\r
- \r
- // inherit docs\r
- destroy : function() {\r
- Ext.destroy(\r
- this.miniSplitEl, \r
- this.split, \r
- this.splitEl\r
- );\r
- }\r
-});\r
-\r
-Ext.Container.LAYOUTS['border'] = Ext.layout.BorderLayout;\r
-\r
-Ext.layout.FormLayout = Ext.extend(Ext.layout.AnchorLayout, {\r
- \r
- labelSeparator : ':',\r
-\r
- // private\r
- getAnchorViewSize : function(ct, target){\r
- return (ct.body||ct.el).getStyleSize();\r
- },\r
-\r
- // private\r
- setContainer : function(ct){\r
- Ext.layout.FormLayout.superclass.setContainer.call(this, ct);\r
-\r
- if(ct.labelAlign){\r
- ct.addClass('x-form-label-'+ct.labelAlign);\r
- }\r
-\r
- if(ct.hideLabels){\r
- this.labelStyle = "display:none";\r
- this.elementStyle = "padding-left:0;";\r
- this.labelAdjust = 0;\r
- }else{\r
- this.labelSeparator = ct.labelSeparator || this.labelSeparator;\r
- ct.labelWidth = ct.labelWidth || 100;\r
- if(typeof ct.labelWidth == 'number'){\r
- var pad = (typeof ct.labelPad == 'number' ? ct.labelPad : 5);\r
- this.labelAdjust = ct.labelWidth+pad;\r
- this.labelStyle = "width:"+ct.labelWidth+"px;";\r
- this.elementStyle = "padding-left:"+(ct.labelWidth+pad)+'px';\r
- }\r
- if(ct.labelAlign == 'top'){\r
- this.labelStyle = "width:auto;";\r
- this.labelAdjust = 0;\r
- this.elementStyle = "padding-left:0;";\r
- }\r
- }\r
-\r
- if(!this.fieldTpl){\r
- // the default field template used by all form layouts\r
- var t = new Ext.Template(\r
- '<div class="x-form-item {5}" tabIndex="-1">',\r
- '<label for="{0}" style="{2}" class="x-form-item-label">{1}{4}</label>',\r
- '<div class="x-form-element" id="x-form-el-{0}" style="{3}">',\r
- '</div><div class="{6}"></div>',\r
- '</div>'\r
- );\r
- t.disableFormats = true;\r
- t.compile();\r
- Ext.layout.FormLayout.prototype.fieldTpl = t;\r
- }\r
- },\r
- \r
- //private\r
- getLabelStyle: function(s){\r
- var ls = '', items = [this.labelStyle, s];\r
- for (var i = 0, len = items.length; i < len; ++i){\r
- if (items[i]){\r
- ls += items[i];\r
- if (ls.substr(-1, 1) != ';'){\r
- ls += ';'\r
- }\r
- }\r
- }\r
- return ls;\r
- },\r
-\r
- // private\r
- renderItem : function(c, position, target){\r
- if(c && !c.rendered && c.isFormField && c.inputType != 'hidden'){\r
- var args = [\r
- c.id, c.fieldLabel,\r
- this.getLabelStyle(c.labelStyle),\r
- this.elementStyle||'',\r
- typeof c.labelSeparator == 'undefined' ? this.labelSeparator : c.labelSeparator,\r
- (c.itemCls||this.container.itemCls||'') + (c.hideLabel ? ' x-hide-label' : ''),\r
- c.clearCls || 'x-form-clear-left' \r
- ];\r
- if(typeof position == 'number'){\r
- position = target.dom.childNodes[position] || null;\r
- }\r
- if(position){\r
- this.fieldTpl.insertBefore(position, args);\r
- }else{\r
- this.fieldTpl.append(target, args);\r
- }\r
- c.render('x-form-el-'+c.id);\r
- }else {\r
- Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments);\r
- }\r
- },\r
-\r
- // private\r
- adjustWidthAnchor : function(value, comp){\r
- return value - (comp.isFormField ? (comp.hideLabel ? 0 : this.labelAdjust) : 0);\r
- },\r
-\r
- // private\r
- isValidParent : function(c, target){\r
- return true;\r
- }\r
-\r
- \r
-});\r
-\r
-Ext.Container.LAYOUTS['form'] = Ext.layout.FormLayout;\r
-\r
-Ext.layout.Accordion = Ext.extend(Ext.layout.FitLayout, {\r
- \r
- fill : true,\r
- \r
- autoWidth : true,\r
- \r
- titleCollapse : true,\r
- \r
- hideCollapseTool : false,\r
- \r
- collapseFirst : false,\r
- \r
- animate : false,\r
- \r
- sequence : false,\r
- \r
- activeOnTop : false,\r
-\r
- renderItem : function(c){\r
- if(this.animate === false){\r
- c.animCollapse = false;\r
- }\r
- c.collapsible = true;\r
- if(this.autoWidth){\r
- c.autoWidth = true;\r
- }\r
- if(this.titleCollapse){\r
- c.titleCollapse = true;\r
- }\r
- if(this.hideCollapseTool){\r
- c.hideCollapseTool = true;\r
- }\r
- if(this.collapseFirst !== undefined){\r
- c.collapseFirst = this.collapseFirst;\r
- }\r
- if(!this.activeItem && !c.collapsed){\r
- this.activeItem = c;\r
- }else if(this.activeItem){\r
- c.collapsed = true;\r
- }\r
- Ext.layout.Accordion.superclass.renderItem.apply(this, arguments);\r
- c.header.addClass('x-accordion-hd');\r
- c.on('beforeexpand', this.beforeExpand, this);\r
- },\r
-\r
- // private\r
- beforeExpand : function(p, anim){\r
- var ai = this.activeItem;\r
- if(ai){\r
- if(this.sequence){\r
- delete this.activeItem;\r
- if (!ai.collapsed){\r
- ai.collapse({callback:function(){\r
- p.expand(anim || true);\r
- }, scope: this});\r
- return false;\r
- }\r
- }else{\r
- ai.collapse(this.animate);\r
- }\r
- }\r
- this.activeItem = p;\r
- if(this.activeOnTop){\r
- p.el.dom.parentNode.insertBefore(p.el.dom, p.el.dom.parentNode.firstChild);\r
- }\r
- this.layout();\r
- },\r
-\r
- // private\r
- setItemSize : function(item, size){\r
- if(this.fill && item){\r
- var items = this.container.items.items;\r
- var hh = 0;\r
- for(var i = 0, len = items.length; i < len; i++){\r
- var p = items[i];\r
- if(p != item){\r
- hh += (p.getSize().height - p.bwrap.getHeight());\r
- }\r
- }\r
- size.height -= hh;\r
- item.setSize(size);\r
- }\r
- }\r
-});\r
-Ext.Container.LAYOUTS['accordion'] = Ext.layout.Accordion;\r
-\r
-Ext.layout.TableLayout = Ext.extend(Ext.layout.ContainerLayout, {\r
- \r
-\r
- // private\r
- monitorResize:false,\r
-\r
- // private\r
- setContainer : function(ct){\r
- Ext.layout.TableLayout.superclass.setContainer.call(this, ct);\r
-\r
- this.currentRow = 0;\r
- this.currentColumn = 0;\r
- this.cells = [];\r
- },\r
-\r
- // private\r
- onLayout : function(ct, target){\r
- var cs = ct.items.items, len = cs.length, c, i;\r
-\r
- if(!this.table){\r
- target.addClass('x-table-layout-ct');\r
-\r
- this.table = target.createChild(\r
- {tag:'table', cls:'x-table-layout', cellspacing: 0, cn: {tag: 'tbody'}}, null, true);\r
-\r
- this.renderAll(ct, target);\r
- }\r
- },\r
-\r
- // private\r
- getRow : function(index){\r
- var row = this.table.tBodies[0].childNodes[index];\r
- if(!row){\r
- row = document.createElement('tr');\r
- this.table.tBodies[0].appendChild(row);\r
- }\r
- return row;\r
- },\r
-\r
- // private\r
- getNextCell : function(c){\r
- var cell = this.getNextNonSpan(this.currentColumn, this.currentRow);\r
- var curCol = this.currentColumn = cell[0], curRow = this.currentRow = cell[1];\r
- for(var rowIndex = curRow; rowIndex < curRow + (c.rowspan || 1); rowIndex++){\r
- if(!this.cells[rowIndex]){\r
- this.cells[rowIndex] = [];\r
- }\r
- for(var colIndex = curCol; colIndex < curCol + (c.colspan || 1); colIndex++){\r
- this.cells[rowIndex][colIndex] = true;\r
- }\r
- }\r
- var td = document.createElement('td');\r
- if(c.cellId){\r
- td.id = c.cellId;\r
- }\r
- var cls = 'x-table-layout-cell';\r
- if(c.cellCls){\r
- cls += ' ' + c.cellCls;\r
- }\r
- td.className = cls;\r
- if(c.colspan){\r
- td.colSpan = c.colspan;\r
- }\r
- if(c.rowspan){\r
- td.rowSpan = c.rowspan;\r
- }\r
- this.getRow(curRow).appendChild(td);\r
- return td;\r
- },\r
- \r
- // private\r
- getNextNonSpan: function(colIndex, rowIndex){\r
- var cols = this.columns;\r
- while((cols && colIndex >= cols) || (this.cells[rowIndex] && this.cells[rowIndex][colIndex])) {\r
- if(cols && colIndex >= cols){\r
- rowIndex++;\r
- colIndex = 0;\r
- }else{\r
- colIndex++;\r
- }\r
- }\r
- return [colIndex, rowIndex];\r
- },\r
-\r
- // private\r
- renderItem : function(c, position, target){\r
- if(c && !c.rendered){\r
- c.render(this.getNextCell(c));\r
- if(this.extraCls){\r
- var t = c.getPositionEl ? c.getPositionEl() : c;\r
- t.addClass(this.extraCls);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- isValidParent : function(c, target){\r
- return true;\r
- }\r
-\r
- \r
-});\r
-\r
-Ext.Container.LAYOUTS['table'] = Ext.layout.TableLayout;\r
-\r
-Ext.layout.AbsoluteLayout = Ext.extend(Ext.layout.AnchorLayout, {\r
- \r
- extraCls: 'x-abs-layout-item',\r
- isForm: false,\r
- // private\r
- setContainer : function(ct){\r
- Ext.layout.AbsoluteLayout.superclass.setContainer.call(this, ct);\r
- if(ct.isXType('form')){\r
- this.isForm = true;\r
- }\r
- },\r
-\r
- onLayout : function(ct, target){\r
- if(this.isForm){ ct.body.position(); } else { target.position(); }\r
- Ext.layout.AbsoluteLayout.superclass.onLayout.call(this, ct, target);\r
- },\r
-\r
- // private\r
- getAnchorViewSize : function(ct, target){\r
- return this.isForm ? ct.body.getStyleSize() : Ext.layout.AbsoluteLayout.superclass.getAnchorViewSize.call(this, ct, target);\r
- },\r
-\r
- // private\r
- isValidParent : function(c, target){\r
- return this.isForm ? true : Ext.layout.AbsoluteLayout.superclass.isValidParent.call(this, c, target);\r
- },\r
-\r
- // private\r
- adjustWidthAnchor : function(value, comp){\r
- return value ? value - comp.getPosition(true)[0] : value;\r
- },\r
-\r
- // private\r
- adjustHeightAnchor : function(value, comp){\r
- return value ? value - comp.getPosition(true)[1] : value;\r
- }\r
- \r
-});\r
-Ext.Container.LAYOUTS['absolute'] = Ext.layout.AbsoluteLayout;\r
-\r
-Ext.Viewport = Ext.extend(Ext.Container, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- initComponent : function() {\r
- Ext.Viewport.superclass.initComponent.call(this);\r
- document.getElementsByTagName('html')[0].className += ' x-viewport';\r
- this.el = Ext.getBody();\r
- this.el.setHeight = Ext.emptyFn;\r
- this.el.setWidth = Ext.emptyFn;\r
- this.el.setSize = Ext.emptyFn;\r
- this.el.dom.scroll = 'no';\r
- this.allowDomMove = false;\r
- this.autoWidth = true;\r
- this.autoHeight = true;\r
- Ext.EventManager.onWindowResize(this.fireResize, this);\r
- this.renderTo = this.el;\r
- },\r
-\r
- fireResize : function(w, h){\r
- this.fireEvent('resize', this, w, h, w, h);\r
- }\r
-});\r
-Ext.reg('viewport', Ext.Viewport);\r
-\r
-Ext.Panel = Ext.extend(Ext.Container, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- \r
- baseCls : 'x-panel',\r
- \r
- collapsedCls : 'x-panel-collapsed',\r
- \r
- maskDisabled: true,\r
- \r
- animCollapse: Ext.enableFx,\r
- \r
- headerAsText: true,\r
- \r
- buttonAlign: 'right',\r
- \r
- collapsed : false,\r
- \r
- collapseFirst: true,\r
- \r
- minButtonWidth:75,\r
- \r
- elements : 'body',\r
-\r
- // protected - these could be used to customize the behavior of the window,\r
- // but changing them would not be useful without further mofifications and\r
- // could lead to unexpected or undesirable results.\r
- toolTarget : 'header',\r
- collapseEl : 'bwrap',\r
- slideAnchor : 't',\r
- disabledClass: '',\r
-\r
- // private, notify box this class will handle heights\r
- deferHeight: true,\r
- // private\r
- expandDefaults: {\r
- duration:.25\r
- },\r
- // private\r
- collapseDefaults: {\r
- duration:.25\r
- },\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.Panel.superclass.initComponent.call(this);\r
-\r
- this.addEvents(\r
- \r
- 'bodyresize',\r
- \r
- 'titlechange',\r
- \r
- 'iconchange',\r
- \r
- 'collapse',\r
- \r
- 'expand',\r
- \r
- 'beforecollapse',\r
- \r
- 'beforeexpand',\r
- \r
- 'beforeclose',\r
- \r
- 'close',\r
- \r
- 'activate',\r
- \r
- 'deactivate'\r
- );\r
-\r
- // shortcuts\r
- if(this.tbar){\r
- this.elements += ',tbar';\r
- if(typeof this.tbar == 'object'){\r
- this.topToolbar = this.tbar;\r
- }\r
- delete this.tbar;\r
- }\r
- if(this.bbar){\r
- this.elements += ',bbar';\r
- if(typeof this.bbar == 'object'){\r
- this.bottomToolbar = this.bbar;\r
- }\r
- delete this.bbar;\r
- }\r
-\r
- if(this.header === true){\r
- this.elements += ',header';\r
- delete this.header;\r
- }else if(this.title && this.header !== false){\r
- this.elements += ',header';\r
- }\r
-\r
- if(this.footer === true){\r
- this.elements += ',footer';\r
- delete this.footer;\r
- }\r
-\r
- if(this.buttons){\r
- var btns = this.buttons;\r
- \r
- this.buttons = [];\r
- for(var i = 0, len = btns.length; i < len; i++) {\r
- if(btns[i].render){ // button instance\r
- btns[i].ownerCt = this;\r
- this.buttons.push(btns[i]);\r
- }else{\r
- this.addButton(btns[i]);\r
- }\r
- }\r
- }\r
- if(this.autoLoad){\r
- this.on('render', this.doAutoLoad, this, {delay:10});\r
- }\r
- },\r
-\r
- // private\r
- createElement : function(name, pnode){\r
- if(this[name]){\r
- pnode.appendChild(this[name].dom);\r
- return;\r
- }\r
-\r
- if(name === 'bwrap' || this.elements.indexOf(name) != -1){\r
- if(this[name+'Cfg']){\r
- this[name] = Ext.fly(pnode).createChild(this[name+'Cfg']);\r
- }else{\r
- var el = document.createElement('div');\r
- el.className = this[name+'Cls'];\r
- this[name] = Ext.get(pnode.appendChild(el));\r
- }\r
- if(this[name+'CssClass']){\r
- this[name].addClass(this[name+'CssClass']);\r
- }\r
- if(this[name+'Style']){\r
- this[name].applyStyles(this[name+'Style']);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.Panel.superclass.onRender.call(this, ct, position);\r
-\r
- this.createClasses();\r
-\r
- if(this.el){ // existing markup\r
- this.el.addClass(this.baseCls);\r
- this.header = this.el.down('.'+this.headerCls);\r
- this.bwrap = this.el.down('.'+this.bwrapCls);\r
- var cp = this.bwrap ? this.bwrap : this.el;\r
- this.tbar = cp.down('.'+this.tbarCls);\r
- this.body = cp.down('.'+this.bodyCls);\r
- this.bbar = cp.down('.'+this.bbarCls);\r
- this.footer = cp.down('.'+this.footerCls);\r
- this.fromMarkup = true;\r
- }else{\r
- this.el = ct.createChild({\r
- id: this.id,\r
- cls: this.baseCls\r
- }, position);\r
- }\r
- var el = this.el, d = el.dom;\r
-\r
- if(this.cls){\r
- this.el.addClass(this.cls);\r
- }\r
-\r
- if(this.buttons){\r
- this.elements += ',footer';\r
- }\r
-\r
- // This block allows for maximum flexibility and performance when using existing markup\r
-\r
- // framing requires special markup\r
- if(this.frame){\r
- el.insertHtml('afterBegin', String.format(Ext.Element.boxMarkup, this.baseCls));\r
-\r
- this.createElement('header', d.firstChild.firstChild.firstChild);\r
- this.createElement('bwrap', d);\r
-\r
- // append the mid and bottom frame to the bwrap\r
- var bw = this.bwrap.dom;\r
- var ml = d.childNodes[1], bl = d.childNodes[2];\r
- bw.appendChild(ml);\r
- bw.appendChild(bl);\r
-\r
- var mc = bw.firstChild.firstChild.firstChild;\r
- this.createElement('tbar', mc);\r
- this.createElement('body', mc);\r
- this.createElement('bbar', mc);\r
- this.createElement('footer', bw.lastChild.firstChild.firstChild);\r
-\r
- if(!this.footer){\r
- this.bwrap.dom.lastChild.className += ' x-panel-nofooter';\r
- }\r
- }else{\r
- this.createElement('header', d);\r
- this.createElement('bwrap', d);\r
-\r
- // append the mid and bottom frame to the bwrap\r
- var bw = this.bwrap.dom;\r
- this.createElement('tbar', bw);\r
- this.createElement('body', bw);\r
- this.createElement('bbar', bw);\r
- this.createElement('footer', bw);\r
-\r
- if(!this.header){\r
- this.body.addClass(this.bodyCls + '-noheader');\r
- if(this.tbar){\r
- this.tbar.addClass(this.tbarCls + '-noheader');\r
- }\r
- }\r
- }\r
-\r
- if(this.border === false){\r
- this.el.addClass(this.baseCls + '-noborder');\r
- this.body.addClass(this.bodyCls + '-noborder');\r
- if(this.header){\r
- this.header.addClass(this.headerCls + '-noborder');\r
- }\r
- if(this.footer){\r
- this.footer.addClass(this.footerCls + '-noborder');\r
- }\r
- if(this.tbar){\r
- this.tbar.addClass(this.tbarCls + '-noborder');\r
- }\r
- if(this.bbar){\r
- this.bbar.addClass(this.bbarCls + '-noborder');\r
- }\r
- }\r
-\r
- if(this.bodyBorder === false){\r
- this.body.addClass(this.bodyCls + '-noborder');\r
- }\r
-\r
- this.bwrap.enableDisplayMode('block');\r
-\r
- if(this.header){\r
- this.header.unselectable();\r
-\r
- // for tools, we need to wrap any existing header markup\r
- if(this.headerAsText){\r
- this.header.dom.innerHTML =\r
- '<span class="' + this.headerTextCls + '">'+this.header.dom.innerHTML+'</span>';\r
-\r
- if(this.iconCls){\r
- this.setIconClass(this.iconCls);\r
- }\r
- }\r
- }\r
-\r
- if(this.floating){\r
- this.makeFloating(this.floating);\r
- }\r
-\r
- if(this.collapsible){\r
- this.tools = this.tools ? this.tools.slice(0) : [];\r
- if(!this.hideCollapseTool){\r
- this.tools[this.collapseFirst?'unshift':'push']({\r
- id: 'toggle',\r
- handler : this.toggleCollapse,\r
- scope: this\r
- });\r
- }\r
- if(this.titleCollapse && this.header){\r
- this.header.on('click', this.toggleCollapse, this);\r
- this.header.setStyle('cursor', 'pointer');\r
- }\r
- }\r
- if(this.tools){\r
- var ts = this.tools;\r
- this.tools = {};\r
- this.addTool.apply(this, ts);\r
- }else{\r
- this.tools = {};\r
- }\r
-\r
- if(this.buttons && this.buttons.length > 0){\r
- // tables are required to maintain order and for correct IE layout\r
- var tb = this.footer.createChild({cls:'x-panel-btns-ct', cn: {\r
- cls:"x-panel-btns x-panel-btns-"+this.buttonAlign,\r
- html:'<table cellspacing="0"><tbody><tr></tr></tbody></table><div class="x-clear"></div>'\r
- }}, null, true);\r
- var tr = tb.getElementsByTagName('tr')[0];\r
- for(var i = 0, len = this.buttons.length; i < len; i++) {\r
- var b = this.buttons[i];\r
- var td = document.createElement('td');\r
- td.className = 'x-panel-btn-td';\r
- b.render(tr.appendChild(td));\r
- }\r
- }\r
-\r
- if(this.tbar && this.topToolbar){\r
- if(Ext.isArray(this.topToolbar)){\r
- this.topToolbar = new Ext.Toolbar(this.topToolbar);\r
- }\r
- this.topToolbar.render(this.tbar);\r
- this.topToolbar.ownerCt = this;\r
- }\r
- if(this.bbar && this.bottomToolbar){\r
- if(Ext.isArray(this.bottomToolbar)){\r
- this.bottomToolbar = new Ext.Toolbar(this.bottomToolbar);\r
- }\r
- this.bottomToolbar.render(this.bbar);\r
- this.bottomToolbar.ownerCt = this;\r
- }\r
- },\r
-\r
- \r
- setIconClass : function(cls){\r
- var old = this.iconCls;\r
- this.iconCls = cls;\r
- if(this.rendered && this.header){\r
- if(this.frame){\r
- this.header.addClass('x-panel-icon');\r
- this.header.replaceClass(old, this.iconCls);\r
- }else{\r
- var hd = this.header.dom;\r
- var img = hd.firstChild && String(hd.firstChild.tagName).toLowerCase() == 'img' ? hd.firstChild : null;\r
- if(img){\r
- Ext.fly(img).replaceClass(old, this.iconCls);\r
- }else{\r
- Ext.DomHelper.insertBefore(hd.firstChild, {\r
- tag:'img', src: Ext.BLANK_IMAGE_URL, cls:'x-panel-inline-icon '+this.iconCls\r
- });\r
- }\r
- }\r
- }\r
- this.fireEvent('iconchange', this, cls, old);\r
- },\r
-\r
- // private\r
- makeFloating : function(cfg){\r
- this.floating = true;\r
- this.el = new Ext.Layer(\r
- typeof cfg == 'object' ? cfg : {\r
- shadow: this.shadow !== undefined ? this.shadow : 'sides',\r
- shadowOffset: this.shadowOffset,\r
- constrain:false,\r
- shim: this.shim === false ? false : undefined\r
- }, this.el\r
- );\r
- },\r
-\r
- \r
- getTopToolbar : function(){\r
- return this.topToolbar;\r
- },\r
-\r
- \r
- getBottomToolbar : function(){\r
- return this.bottomToolbar;\r
- },\r
-\r
- \r
- addButton : function(config, handler, scope){\r
- var bc = {\r
- handler: handler,\r
- scope: scope,\r
- minWidth: this.minButtonWidth,\r
- hideParent:true\r
- };\r
- if(typeof config == "string"){\r
- bc.text = config;\r
- }else{\r
- Ext.apply(bc, config);\r
- }\r
- var btn = new Ext.Button(bc);\r
- btn.ownerCt = this;\r
- if(!this.buttons){\r
- this.buttons = [];\r
- }\r
- this.buttons.push(btn);\r
- return btn;\r
- },\r
-\r
- // private\r
- addTool : function(){\r
- if(!this[this.toolTarget]) { // no where to render tools!\r
- return;\r
- }\r
- if(!this.toolTemplate){\r
- // initialize the global tool template on first use\r
- var tt = new Ext.Template(\r
- '<div class="x-tool x-tool-{id}"> </div>'\r
- );\r
- tt.disableFormats = true;\r
- tt.compile();\r
- Ext.Panel.prototype.toolTemplate = tt;\r
- }\r
- for(var i = 0, a = arguments, len = a.length; i < len; i++) {\r
- var tc = a[i];\r
- if(!this.tools[tc.id]){\r
- var overCls = 'x-tool-'+tc.id+'-over';\r
- var t = this.toolTemplate.insertFirst((tc.align !== 'left') ? this[this.toolTarget] : this[this.toolTarget].child('span'), tc, true);\r
- this.tools[tc.id] = t;\r
- t.enableDisplayMode('block');\r
- t.on('click', this.createToolHandler(t, tc, overCls, this));\r
- if(tc.on){\r
- t.on(tc.on);\r
- }\r
- if(tc.hidden){\r
- t.hide();\r
- }\r
- if(tc.qtip){\r
- if(typeof tc.qtip == 'object'){\r
- Ext.QuickTips.register(Ext.apply({\r
- target: t.id\r
- }, tc.qtip));\r
- } else {\r
- t.dom.qtip = tc.qtip;\r
- }\r
- }\r
- t.addClassOnOver(overCls);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- onShow : function(){\r
- if(this.floating){\r
- return this.el.show();\r
- }\r
- Ext.Panel.superclass.onShow.call(this);\r
- },\r
-\r
- // private\r
- onHide : function(){\r
- if(this.floating){\r
- return this.el.hide();\r
- }\r
- Ext.Panel.superclass.onHide.call(this);\r
- },\r
-\r
- // private\r
- createToolHandler : function(t, tc, overCls, panel){\r
- return function(e){\r
- t.removeClass(overCls);\r
- e.stopEvent();\r
- if(tc.handler){\r
- tc.handler.call(tc.scope || t, e, t, panel);\r
- }\r
- };\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- if(this.fromMarkup && this.height === undefined && !this.autoHeight){\r
- this.height = this.el.getHeight();\r
- }\r
- if(this.floating && !this.hidden && !this.initHidden){\r
- this.el.show();\r
- }\r
- if(this.title){\r
- this.setTitle(this.title);\r
- }\r
- this.setAutoScroll();\r
- if(this.html){\r
- this.body.update(typeof this.html == 'object' ?\r
- Ext.DomHelper.markup(this.html) :\r
- this.html);\r
- delete this.html;\r
- }\r
- if(this.contentEl){\r
- var ce = Ext.getDom(this.contentEl);\r
- Ext.fly(ce).removeClass(['x-hidden', 'x-hide-display']);\r
- this.body.dom.appendChild(ce);\r
- }\r
- if(this.collapsed){\r
- this.collapsed = false;\r
- this.collapse(false);\r
- }\r
- Ext.Panel.superclass.afterRender.call(this); // do sizing calcs last\r
- this.initEvents();\r
- },\r
-\r
- // private\r
- setAutoScroll : function(){\r
- if(this.rendered && this.autoScroll){\r
- var el = this.body || this.el;\r
- if(el){\r
- el.setOverflow('auto');\r
- }\r
- }\r
- },\r
-\r
- // private\r
- getKeyMap : function(){\r
- if(!this.keyMap){\r
- this.keyMap = new Ext.KeyMap(this.el, this.keys);\r
- }\r
- return this.keyMap;\r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- if(this.keys){\r
- this.getKeyMap();\r
- }\r
- if(this.draggable){\r
- this.initDraggable();\r
- }\r
- },\r
-\r
- // private\r
- initDraggable : function(){\r
- \r
- this.dd = new Ext.Panel.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);\r
- },\r
-\r
- // private\r
- beforeEffect : function(){\r
- if(this.floating){\r
- this.el.beforeAction();\r
- }\r
- this.el.addClass('x-panel-animated');\r
- },\r
-\r
- // private\r
- afterEffect : function(){\r
- this.syncShadow();\r
- this.el.removeClass('x-panel-animated');\r
- },\r
-\r
- // private - wraps up an animation param with internal callbacks\r
- createEffect : function(a, cb, scope){\r
- var o = {\r
- scope:scope,\r
- block:true\r
- };\r
- if(a === true){\r
- o.callback = cb;\r
- return o;\r
- }else if(!a.callback){\r
- o.callback = cb;\r
- }else { // wrap it up\r
- o.callback = function(){\r
- cb.call(scope);\r
- Ext.callback(a.callback, a.scope);\r
- };\r
- }\r
- return Ext.applyIf(o, a);\r
- },\r
-\r
- \r
- collapse : function(animate){\r
- if(this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforecollapse', this, animate) === false){\r
- return;\r
- }\r
- var doAnim = animate === true || (animate !== false && this.animCollapse);\r
- this.beforeEffect();\r
- this.onCollapse(doAnim, animate);\r
- return this;\r
- },\r
-\r
- // private\r
- onCollapse : function(doAnim, animArg){\r
- if(doAnim){\r
- this[this.collapseEl].slideOut(this.slideAnchor,\r
- Ext.apply(this.createEffect(animArg||true, this.afterCollapse, this),\r
- this.collapseDefaults));\r
- }else{\r
- this[this.collapseEl].hide();\r
- this.afterCollapse();\r
- }\r
- },\r
-\r
- // private\r
- afterCollapse : function(){\r
- this.collapsed = true;\r
- this.el.addClass(this.collapsedCls);\r
- this.afterEffect();\r
- this.fireEvent('collapse', this);\r
- },\r
-\r
- \r
- expand : function(animate){\r
- if(!this.collapsed || this.el.hasFxBlock() || this.fireEvent('beforeexpand', this, animate) === false){\r
- return;\r
- }\r
- var doAnim = animate === true || (animate !== false && this.animCollapse);\r
- this.el.removeClass(this.collapsedCls);\r
- this.beforeEffect();\r
- this.onExpand(doAnim, animate);\r
- return this;\r
- },\r
-\r
- // private\r
- onExpand : function(doAnim, animArg){\r
- if(doAnim){\r
- this[this.collapseEl].slideIn(this.slideAnchor,\r
- Ext.apply(this.createEffect(animArg||true, this.afterExpand, this),\r
- this.expandDefaults));\r
- }else{\r
- this[this.collapseEl].show();\r
- this.afterExpand();\r
- }\r
- },\r
-\r
- // private\r
- afterExpand : function(){\r
- this.collapsed = false;\r
- this.afterEffect();\r
- this.fireEvent('expand', this);\r
- },\r
-\r
- \r
- toggleCollapse : function(animate){\r
- this[this.collapsed ? 'expand' : 'collapse'](animate);\r
- return this;\r
- },\r
-\r
- // private\r
- onDisable : function(){\r
- if(this.rendered && this.maskDisabled){\r
- this.el.mask();\r
- }\r
- Ext.Panel.superclass.onDisable.call(this);\r
- },\r
-\r
- // private\r
- onEnable : function(){\r
- if(this.rendered && this.maskDisabled){\r
- this.el.unmask();\r
- }\r
- Ext.Panel.superclass.onEnable.call(this);\r
- },\r
-\r
- // private\r
- onResize : function(w, h){\r
- if(w !== undefined || h !== undefined){\r
- if(!this.collapsed){\r
- if(typeof w == 'number'){\r
- this.body.setWidth(\r
- this.adjustBodyWidth(w - this.getFrameWidth()));\r
- }else if(w == 'auto'){\r
- this.body.setWidth(w);\r
- }\r
-\r
- if(typeof h == 'number'){\r
- this.body.setHeight(\r
- this.adjustBodyHeight(h - this.getFrameHeight()));\r
- }else if(h == 'auto'){\r
- this.body.setHeight(h);\r
- }\r
- \r
- if(this.disabled && this.el._mask){\r
- this.el._mask.setSize(this.el.dom.clientWidth, this.el.getHeight());\r
- }\r
- }else{\r
- this.queuedBodySize = {width: w, height: h};\r
- if(!this.queuedExpand && this.allowQueuedExpand !== false){\r
- this.queuedExpand = true;\r
- this.on('expand', function(){\r
- delete this.queuedExpand;\r
- this.onResize(this.queuedBodySize.width, this.queuedBodySize.height);\r
- this.doLayout();\r
- }, this, {single:true});\r
- }\r
- }\r
- this.fireEvent('bodyresize', this, w, h);\r
- }\r
- this.syncShadow();\r
- },\r
-\r
- // private\r
- adjustBodyHeight : function(h){\r
- return h;\r
- },\r
-\r
- // private\r
- adjustBodyWidth : function(w){\r
- return w;\r
- },\r
-\r
- // private\r
- onPosition : function(){\r
- this.syncShadow();\r
- },\r
-\r
- \r
- getFrameWidth : function(){\r
- var w = this.el.getFrameWidth('lr');\r
-\r
- if(this.frame){\r
- var l = this.bwrap.dom.firstChild;\r
- w += (Ext.fly(l).getFrameWidth('l') + Ext.fly(l.firstChild).getFrameWidth('r'));\r
- var mc = this.bwrap.dom.firstChild.firstChild.firstChild;\r
- w += Ext.fly(mc).getFrameWidth('lr');\r
- }\r
- return w;\r
- },\r
-\r
- \r
- getFrameHeight : function(){\r
- var h = this.el.getFrameWidth('tb');\r
- h += (this.tbar ? this.tbar.getHeight() : 0) +\r
- (this.bbar ? this.bbar.getHeight() : 0);\r
-\r
- if(this.frame){\r
- var hd = this.el.dom.firstChild;\r
- var ft = this.bwrap.dom.lastChild;\r
- h += (hd.offsetHeight + ft.offsetHeight);\r
- var mc = this.bwrap.dom.firstChild.firstChild.firstChild;\r
- h += Ext.fly(mc).getFrameWidth('tb');\r
- }else{\r
- h += (this.header ? this.header.getHeight() : 0) +\r
- (this.footer ? this.footer.getHeight() : 0);\r
- }\r
- return h;\r
- },\r
-\r
- \r
- getInnerWidth : function(){\r
- return this.getSize().width - this.getFrameWidth();\r
- },\r
-\r
- \r
- getInnerHeight : function(){\r
- return this.getSize().height - this.getFrameHeight();\r
- },\r
-\r
- // private\r
- syncShadow : function(){\r
- if(this.floating){\r
- this.el.sync(true);\r
- }\r
- },\r
-\r
- // private\r
- getLayoutTarget : function(){\r
- return this.body;\r
- },\r
-\r
- \r
- setTitle : function(title, iconCls){\r
- this.title = title;\r
- if(this.header && this.headerAsText){\r
- this.header.child('span').update(title);\r
- }\r
- if(iconCls){\r
- this.setIconClass(iconCls);\r
- }\r
- this.fireEvent('titlechange', this, title);\r
- return this;\r
- },\r
-\r
- \r
- getUpdater : function(){\r
- return this.body.getUpdater();\r
- },\r
-\r
- \r
- load : function(){\r
- var um = this.body.getUpdater();\r
- um.update.apply(um, arguments);\r
- return this;\r
- },\r
-\r
- // private\r
- beforeDestroy : function(){\r
- if(this.header){\r
- this.header.removeAllListeners();\r
- if(this.headerAsText){\r
- Ext.Element.uncache(this.header.child('span'));\r
- }\r
- }\r
- Ext.Element.uncache(\r
- this.header,\r
- this.tbar,\r
- this.bbar,\r
- this.footer,\r
- this.body,\r
- this.bwrap\r
- );\r
- if(this.tools){\r
- for(var k in this.tools){\r
- Ext.destroy(this.tools[k]);\r
- }\r
- }\r
- if(this.buttons){\r
- for(var b in this.buttons){\r
- Ext.destroy(this.buttons[b]);\r
- }\r
- }\r
- Ext.destroy(\r
- this.topToolbar,\r
- this.bottomToolbar\r
- );\r
- Ext.Panel.superclass.beforeDestroy.call(this);\r
- },\r
-\r
- // private\r
- createClasses : function(){\r
- this.headerCls = this.baseCls + '-header';\r
- this.headerTextCls = this.baseCls + '-header-text';\r
- this.bwrapCls = this.baseCls + '-bwrap';\r
- this.tbarCls = this.baseCls + '-tbar';\r
- this.bodyCls = this.baseCls + '-body';\r
- this.bbarCls = this.baseCls + '-bbar';\r
- this.footerCls = this.baseCls + '-footer';\r
- },\r
-\r
- // private\r
- createGhost : function(cls, useShim, appendTo){\r
- var el = document.createElement('div');\r
- el.className = 'x-panel-ghost ' + (cls ? cls : '');\r
- if(this.header){\r
- el.appendChild(this.el.dom.firstChild.cloneNode(true));\r
- }\r
- Ext.fly(el.appendChild(document.createElement('ul'))).setHeight(this.bwrap.getHeight());\r
- el.style.width = this.el.dom.offsetWidth + 'px';;\r
- if(!appendTo){\r
- this.container.dom.appendChild(el);\r
- }else{\r
- Ext.getDom(appendTo).appendChild(el);\r
- }\r
- if(useShim !== false && this.el.useShim !== false){\r
- var layer = new Ext.Layer({shadow:false, useDisplay:true, constrain:false}, el);\r
- layer.show();\r
- return layer;\r
- }else{\r
- return new Ext.Element(el);\r
- }\r
- },\r
-\r
- // private\r
- doAutoLoad : function(){\r
- this.body.load(\r
- typeof this.autoLoad == 'object' ?\r
- this.autoLoad : {url: this.autoLoad});\r
- },\r
- \r
- \r
- getTool: function(id) {\r
- return this.tools[id];\r
- }\r
-\r
-\r
-});\r
-Ext.reg('panel', Ext.Panel);\r
-\r
-\r
-Ext.Window = Ext.extend(Ext.Panel, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- baseCls : 'x-window',\r
- \r
- resizable:true,\r
- \r
- draggable:true,\r
- \r
- closable : true,\r
- \r
- constrain:false,\r
- \r
- constrainHeader:false,\r
- \r
- plain:false,\r
- \r
- minimizable : false,\r
- \r
- maximizable : false,\r
- \r
- minHeight: 100,\r
- \r
- minWidth: 200,\r
- \r
- expandOnShow: true,\r
- \r
- closeAction: 'close',\r
- \r
- elements: 'header,body',\r
-\r
- // inherited docs, same default\r
- collapsible:false,\r
-\r
- // private\r
- initHidden : true,\r
- \r
- monitorResize : true,\r
- \r
- frame:true,\r
- \r
- floating:true,\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.Window.superclass.initComponent.call(this);\r
- this.addEvents(\r
- \r
- \r
- \r
- 'resize',\r
- \r
- 'maximize',\r
- \r
- 'minimize',\r
- \r
- 'restore'\r
- );\r
- },\r
-\r
- // private\r
- getState : function(){\r
- return Ext.apply(Ext.Window.superclass.getState.call(this) || {}, this.getBox());\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.Window.superclass.onRender.call(this, ct, position);\r
-\r
- if(this.plain){\r
- this.el.addClass('x-window-plain');\r
- }\r
-\r
- // this element allows the Window to be focused for keyboard events\r
- this.focusEl = this.el.createChild({\r
- tag: "a", href:"#", cls:"x-dlg-focus",\r
- tabIndex:"-1", html: " "});\r
- this.focusEl.swallowEvent('click', true);\r
-\r
- this.proxy = this.el.createProxy("x-window-proxy");\r
- this.proxy.enableDisplayMode('block');\r
-\r
- if(this.modal){\r
- this.mask = this.container.createChild({cls:"ext-el-mask"}, this.el.dom);\r
- this.mask.enableDisplayMode("block");\r
- this.mask.hide();\r
- this.mask.on('click', this.focus, this);\r
- }\r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- Ext.Window.superclass.initEvents.call(this);\r
- if(this.animateTarget){\r
- this.setAnimateTarget(this.animateTarget);\r
- }\r
-\r
- if(this.resizable){\r
- this.resizer = new Ext.Resizable(this.el, {\r
- minWidth: this.minWidth,\r
- minHeight:this.minHeight,\r
- handles: this.resizeHandles || "all",\r
- pinned: true,\r
- resizeElement : this.resizerAction\r
- });\r
- this.resizer.window = this;\r
- this.resizer.on("beforeresize", this.beforeResize, this);\r
- }\r
-\r
- if(this.draggable){\r
- this.header.addClass("x-window-draggable");\r
- }\r
- this.initTools();\r
-\r
- this.el.on("mousedown", this.toFront, this);\r
- this.manager = this.manager || Ext.WindowMgr;\r
- this.manager.register(this);\r
- this.hidden = true;\r
- if(this.maximized){\r
- this.maximized = false;\r
- this.maximize();\r
- }\r
- if(this.closable){\r
- var km = this.getKeyMap();\r
- km.on(27, this.onEsc, this);\r
- km.disable();\r
- }\r
- },\r
-\r
- initDraggable : function(){\r
- \r
- this.dd = new Ext.Window.DD(this);\r
- },\r
-\r
- // private\r
- onEsc : function(){\r
- this[this.closeAction]();\r
- },\r
-\r
- // private\r
- beforeDestroy : function(){\r
- this.hide();\r
- if(this.doAnchor){\r
- Ext.EventManager.removeResizeListener(this.doAnchor, this);\r
- Ext.EventManager.un(window, 'scroll', this.doAnchor, this);\r
- }\r
- Ext.destroy(\r
- this.focusEl,\r
- this.resizer,\r
- this.dd,\r
- this.proxy,\r
- this.mask\r
- );\r
- Ext.Window.superclass.beforeDestroy.call(this);\r
- },\r
-\r
- // private\r
- onDestroy : function(){\r
- if(this.manager){\r
- this.manager.unregister(this);\r
- }\r
- Ext.Window.superclass.onDestroy.call(this);\r
- },\r
-\r
- // private\r
- initTools : function(){\r
- if(this.minimizable){\r
- this.addTool({\r
- id: 'minimize',\r
- handler: this.minimize.createDelegate(this, [])\r
- });\r
- }\r
- if(this.maximizable){\r
- this.addTool({\r
- id: 'maximize',\r
- handler: this.maximize.createDelegate(this, [])\r
- });\r
- this.addTool({\r
- id: 'restore',\r
- handler: this.restore.createDelegate(this, []),\r
- hidden:true\r
- });\r
- this.header.on('dblclick', this.toggleMaximize, this);\r
- }\r
- if(this.closable){\r
- this.addTool({\r
- id: 'close',\r
- handler: this[this.closeAction].createDelegate(this, [])\r
- });\r
- }\r
- },\r
-\r
- // private\r
- resizerAction : function(){\r
- var box = this.proxy.getBox();\r
- this.proxy.hide();\r
- this.window.handleResize(box);\r
- return box;\r
- },\r
-\r
- // private\r
- beforeResize : function(){\r
- this.resizer.minHeight = Math.max(this.minHeight, this.getFrameHeight() + 40); // 40 is a magic minimum content size?\r
- this.resizer.minWidth = Math.max(this.minWidth, this.getFrameWidth() + 40);\r
- this.resizeBox = this.el.getBox();\r
- },\r
-\r
- // private\r
- updateHandles : function(){\r
- if(Ext.isIE && this.resizer){\r
- this.resizer.syncHandleHeight();\r
- this.el.repaint();\r
- }\r
- },\r
-\r
- // private\r
- handleResize : function(box){\r
- var rz = this.resizeBox;\r
- if(rz.x != box.x || rz.y != box.y){\r
- this.updateBox(box);\r
- }else{\r
- this.setSize(box);\r
- }\r
- this.focus();\r
- this.updateHandles();\r
- this.saveState();\r
- if(this.layout){\r
- this.doLayout();\r
- }\r
- this.fireEvent("resize", this, box.width, box.height);\r
- },\r
-\r
- \r
- focus : function(){\r
- var f = this.focusEl, db = this.defaultButton, t = typeof db;\r
- if(t != 'undefined'){\r
- if(t == 'number'){\r
- f = this.buttons[db];\r
- }else if(t == 'string'){\r
- f = Ext.getCmp(db);\r
- }else{\r
- f = db;\r
- }\r
- }\r
- f.focus.defer(10, f);\r
- },\r
-\r
- \r
- setAnimateTarget : function(el){\r
- el = Ext.get(el);\r
- this.animateTarget = el;\r
- },\r
-\r
- // private\r
- beforeShow : function(){\r
- delete this.el.lastXY;\r
- delete this.el.lastLT;\r
- if(this.x === undefined || this.y === undefined){\r
- var xy = this.el.getAlignToXY(this.container, 'c-c');\r
- var pos = this.el.translatePoints(xy[0], xy[1]);\r
- this.x = this.x === undefined? pos.left : this.x;\r
- this.y = this.y === undefined? pos.top : this.y;\r
- }\r
- this.el.setLeftTop(this.x, this.y);\r
-\r
- if(this.expandOnShow){\r
- this.expand(false);\r
- }\r
-\r
- if(this.modal){\r
- Ext.getBody().addClass("x-body-masked");\r
- this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
- this.mask.show();\r
- }\r
- },\r
-\r
- \r
- show : function(animateTarget, cb, scope){\r
- if(!this.rendered){\r
- this.render(Ext.getBody());\r
- }\r
- if(this.hidden === false){\r
- this.toFront();\r
- return;\r
- }\r
- if(this.fireEvent("beforeshow", this) === false){\r
- return;\r
- }\r
- if(cb){\r
- this.on('show', cb, scope, {single:true});\r
- }\r
- this.hidden = false;\r
- if(animateTarget !== undefined){\r
- this.setAnimateTarget(animateTarget);\r
- }\r
- this.beforeShow();\r
- if(this.animateTarget){\r
- this.animShow();\r
- }else{\r
- this.afterShow();\r
- }\r
- },\r
-\r
- // private\r
- afterShow : function(){\r
- this.proxy.hide();\r
- this.el.setStyle('display', 'block');\r
- this.el.show();\r
- if(this.maximized){\r
- this.fitContainer();\r
- }\r
- if(Ext.isMac && Ext.isGecko){ // work around stupid FF 2.0/Mac scroll bar bug\r
- this.cascade(this.setAutoScroll);\r
- }\r
-\r
- if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){\r
- Ext.EventManager.onWindowResize(this.onWindowResize, this);\r
- }\r
- this.doConstrain();\r
- if(this.layout){\r
- this.doLayout();\r
- }\r
- if(this.keyMap){\r
- this.keyMap.enable();\r
- }\r
- this.toFront();\r
- this.updateHandles();\r
- this.fireEvent("show", this);\r
- },\r
-\r
- // private\r
- animShow : function(){\r
- this.proxy.show();\r
- this.proxy.setBox(this.animateTarget.getBox());\r
- this.proxy.setOpacity(0);\r
- var b = this.getBox(false);\r
- b.callback = this.afterShow;\r
- b.scope = this;\r
- b.duration = .25;\r
- b.easing = 'easeNone';\r
- b.opacity = .5;\r
- b.block = true;\r
- this.el.setStyle('display', 'none');\r
- this.proxy.shift(b);\r
- },\r
-\r
- \r
- hide : function(animateTarget, cb, scope){\r
- if(this.activeGhost){ // drag active?\r
- this.hide.defer(100, this, [animateTarget, cb, scope]);\r
- return;\r
- }\r
- if(this.hidden || this.fireEvent("beforehide", this) === false){\r
- return;\r
- }\r
- if(cb){\r
- this.on('hide', cb, scope, {single:true});\r
- }\r
- this.hidden = true;\r
- if(animateTarget !== undefined){\r
- this.setAnimateTarget(animateTarget);\r
- }\r
- if(this.animateTarget){\r
- this.animHide();\r
- }else{\r
- this.el.hide();\r
- this.afterHide();\r
- }\r
- },\r
-\r
- // private\r
- afterHide : function(){\r
- this.proxy.hide();\r
- if(this.monitorResize || this.modal || this.constrain || this.constrainHeader){\r
- Ext.EventManager.removeResizeListener(this.onWindowResize, this);\r
- }\r
- if(this.modal){\r
- this.mask.hide();\r
- Ext.getBody().removeClass("x-body-masked");\r
- }\r
- if(this.keyMap){\r
- this.keyMap.disable();\r
- }\r
- this.fireEvent("hide", this);\r
- },\r
-\r
- // private\r
- animHide : function(){\r
- this.proxy.setOpacity(.5);\r
- this.proxy.show();\r
- var tb = this.getBox(false);\r
- this.proxy.setBox(tb);\r
- this.el.hide();\r
- var b = this.animateTarget.getBox();\r
- b.callback = this.afterHide;\r
- b.scope = this;\r
- b.duration = .25;\r
- b.easing = 'easeNone';\r
- b.block = true;\r
- b.opacity = 0;\r
- this.proxy.shift(b);\r
- },\r
-\r
- // private\r
- onWindowResize : function(){\r
- if(this.maximized){\r
- this.fitContainer();\r
- }\r
- if(this.modal){\r
- this.mask.setSize('100%', '100%');\r
- var force = this.mask.dom.offsetHeight;\r
- this.mask.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
- }\r
- this.doConstrain();\r
- },\r
-\r
- // private\r
- doConstrain : function(){\r
- if(this.constrain || this.constrainHeader){\r
- var offsets;\r
- if(this.constrain){\r
- offsets = {\r
- right:this.el.shadowOffset,\r
- left:this.el.shadowOffset,\r
- bottom:this.el.shadowOffset\r
- };\r
- }else {\r
- var s = this.getSize();\r
- offsets = {\r
- right:-(s.width - 100),\r
- bottom:-(s.height - 25)\r
- };\r
- }\r
-\r
- var xy = this.el.getConstrainToXY(this.container, true, offsets);\r
- if(xy){\r
- this.setPosition(xy[0], xy[1]);\r
- }\r
- }\r
- },\r
-\r
- // private - used for dragging\r
- ghost : function(cls){\r
- var ghost = this.createGhost(cls);\r
- var box = this.getBox(true);\r
- ghost.setLeftTop(box.x, box.y);\r
- ghost.setWidth(box.width);\r
- this.el.hide();\r
- this.activeGhost = ghost;\r
- return ghost;\r
- },\r
-\r
- // private\r
- unghost : function(show, matchPosition){\r
- if(show !== false){\r
- this.el.show();\r
- this.focus();\r
- if(Ext.isMac && Ext.isGecko){ // work around stupid FF 2.0/Mac scroll bar bug\r
- this.cascade(this.setAutoScroll);\r
- }\r
- }\r
- if(matchPosition !== false){\r
- this.setPosition(this.activeGhost.getLeft(true), this.activeGhost.getTop(true));\r
- }\r
- this.activeGhost.hide();\r
- this.activeGhost.remove();\r
- delete this.activeGhost;\r
- },\r
-\r
- \r
- minimize : function(){\r
- this.fireEvent('minimize', this);\r
- },\r
-\r
- \r
- close : function(){\r
- if(this.fireEvent("beforeclose", this) !== false){\r
- this.hide(null, function(){\r
- this.fireEvent('close', this);\r
- this.destroy();\r
- }, this);\r
- }\r
- },\r
-\r
- \r
- maximize : function(){\r
- if(!this.maximized){\r
- this.expand(false);\r
- this.restoreSize = this.getSize();\r
- this.restorePos = this.getPosition(true);\r
- if (this.maximizable){\r
- this.tools.maximize.hide();\r
- this.tools.restore.show();\r
- }\r
- this.maximized = true;\r
- this.el.disableShadow();\r
-\r
- if(this.dd){\r
- this.dd.lock();\r
- }\r
- if(this.collapsible){\r
- this.tools.toggle.hide();\r
- }\r
- this.el.addClass('x-window-maximized');\r
- this.container.addClass('x-window-maximized-ct');\r
-\r
- this.setPosition(0, 0);\r
- this.fitContainer();\r
- this.fireEvent('maximize', this);\r
- }\r
- },\r
-\r
- \r
- restore : function(){\r
- if(this.maximized){\r
- this.el.removeClass('x-window-maximized');\r
- this.tools.restore.hide();\r
- this.tools.maximize.show();\r
- this.setPosition(this.restorePos[0], this.restorePos[1]);\r
- this.setSize(this.restoreSize.width, this.restoreSize.height);\r
- delete this.restorePos;\r
- delete this.restoreSize;\r
- this.maximized = false;\r
- this.el.enableShadow(true);\r
-\r
- if(this.dd){\r
- this.dd.unlock();\r
- }\r
- if(this.collapsible){\r
- this.tools.toggle.show();\r
- }\r
- this.container.removeClass('x-window-maximized-ct');\r
-\r
- this.doConstrain();\r
- this.fireEvent('restore', this);\r
- }\r
- },\r
-\r
- \r
- toggleMaximize : function(){\r
- this[this.maximized ? 'restore' : 'maximize']();\r
- },\r
-\r
- // private\r
- fitContainer : function(){\r
- var vs = this.container.getViewSize();\r
- this.setSize(vs.width, vs.height);\r
- },\r
-\r
- // private\r
- // z-index is managed by the WindowManager and may be overwritten at any time\r
- setZIndex : function(index){\r
- if(this.modal){\r
- this.mask.setStyle("z-index", index);\r
- }\r
- this.el.setZIndex(++index);\r
- index += 5;\r
-\r
- if(this.resizer){\r
- this.resizer.proxy.setStyle("z-index", ++index);\r
- }\r
-\r
- this.lastZIndex = index;\r
- },\r
-\r
- \r
- alignTo : function(element, position, offsets){\r
- var xy = this.el.getAlignToXY(element, position, offsets);\r
- this.setPagePosition(xy[0], xy[1]);\r
- return this;\r
- },\r
-\r
- \r
- anchorTo : function(el, alignment, offsets, monitorScroll){\r
- if(this.doAnchor){\r
- Ext.EventManager.removeResizeListener(this.doAnchor, this);\r
- Ext.EventManager.un(window, 'scroll', this.doAnchor, this);\r
- }\r
- this.doAnchor = function(){\r
- this.alignTo(el, alignment, offsets);\r
- };\r
- Ext.EventManager.onWindowResize(this.doAnchor, this);\r
- \r
- var tm = typeof monitorScroll;\r
- if(tm != 'undefined'){\r
- Ext.EventManager.on(window, 'scroll', this.doAnchor, this,\r
- {buffer: tm == 'number' ? monitorScroll : 50});\r
- }\r
- this.doAnchor();\r
- return this;\r
- },\r
-\r
- \r
- toFront : function(e){\r
- if(this.manager.bringToFront(this)){\r
- if(!e || !e.getTarget().focus){\r
- this.focus();\r
- }\r
- }\r
- return this;\r
- },\r
-\r
- \r
- setActive : function(active){\r
- if(active){\r
- if(!this.maximized){\r
- this.el.enableShadow(true);\r
- }\r
- this.fireEvent('activate', this);\r
- }else{\r
- this.el.disableShadow();\r
- this.fireEvent('deactivate', this);\r
- }\r
- },\r
-\r
- \r
- toBack : function(){\r
- this.manager.sendToBack(this);\r
- return this;\r
- },\r
-\r
- \r
- center : function(){\r
- var xy = this.el.getAlignToXY(this.container, 'c-c');\r
- this.setPagePosition(xy[0], xy[1]);\r
- return this;\r
- }\r
-\r
- \r
-});\r
-Ext.reg('window', Ext.Window);\r
-\r
-// private - custom Window DD implementation\r
-Ext.Window.DD = function(win){\r
- this.win = win;\r
- Ext.Window.DD.superclass.constructor.call(this, win.el.id, 'WindowDD-'+win.id);\r
- this.setHandleElId(win.header.id);\r
- this.scroll = false;\r
-};\r
-\r
-Ext.extend(Ext.Window.DD, Ext.dd.DD, {\r
- moveOnly:true,\r
- headerOffsets:[100, 25],\r
- startDrag : function(){\r
- var w = this.win;\r
- this.proxy = w.ghost();\r
- if(w.constrain !== false){\r
- var so = w.el.shadowOffset;\r
- this.constrainTo(w.container, {right: so, left: so, bottom: so});\r
- }else if(w.constrainHeader !== false){\r
- var s = this.proxy.getSize();\r
- this.constrainTo(w.container, {right: -(s.width-this.headerOffsets[0]), bottom: -(s.height-this.headerOffsets[1])});\r
- }\r
- },\r
- b4Drag : Ext.emptyFn,\r
-\r
- onDrag : function(e){\r
- this.alignElWithMouse(this.proxy, e.getPageX(), e.getPageY());\r
- },\r
-\r
- endDrag : function(e){\r
- this.win.unghost();\r
- this.win.saveState();\r
- }\r
-});\r
-\r
-\r
-Ext.WindowGroup = function(){\r
- var list = {};\r
- var accessList = [];\r
- var front = null;\r
-\r
- // private\r
- var sortWindows = function(d1, d2){\r
- return (!d1._lastAccess || d1._lastAccess < d2._lastAccess) ? -1 : 1;\r
- };\r
-\r
- // private\r
- var orderWindows = function(){\r
- var a = accessList, len = a.length;\r
- if(len > 0){\r
- a.sort(sortWindows);\r
- var seed = a[0].manager.zseed;\r
- for(var i = 0; i < len; i++){\r
- var win = a[i];\r
- if(win && !win.hidden){\r
- win.setZIndex(seed + (i*10));\r
- }\r
- }\r
- }\r
- activateLast();\r
- };\r
-\r
- // private\r
- var setActiveWin = function(win){\r
- if(win != front){\r
- if(front){\r
- front.setActive(false);\r
- }\r
- front = win;\r
- if(win){\r
- win.setActive(true);\r
- }\r
- }\r
- };\r
-\r
- // private\r
- var activateLast = function(){\r
- for(var i = accessList.length-1; i >=0; --i) {\r
- if(!accessList[i].hidden){\r
- setActiveWin(accessList[i]);\r
- return;\r
- }\r
- }\r
- // none to activate\r
- setActiveWin(null);\r
- };\r
-\r
- return {\r
- \r
- zseed : 9000,\r
-\r
- // private\r
- register : function(win){\r
- list[win.id] = win;\r
- accessList.push(win);\r
- win.on('hide', activateLast);\r
- },\r
-\r
- // private\r
- unregister : function(win){\r
- delete list[win.id];\r
- win.un('hide', activateLast);\r
- accessList.remove(win);\r
- },\r
-\r
- \r
- get : function(id){\r
- return typeof id == "object" ? id : list[id];\r
- },\r
-\r
- \r
- bringToFront : function(win){\r
- win = this.get(win);\r
- if(win != front){\r
- win._lastAccess = new Date().getTime();\r
- orderWindows();\r
- return true;\r
- }\r
- return false;\r
- },\r
-\r
- \r
- sendToBack : function(win){\r
- win = this.get(win);\r
- win._lastAccess = -(new Date().getTime());\r
- orderWindows();\r
- return win;\r
- },\r
-\r
- \r
- hideAll : function(){\r
- for(var id in list){\r
- if(list[id] && typeof list[id] != "function" && list[id].isVisible()){\r
- list[id].hide();\r
- }\r
- }\r
- },\r
-\r
- \r
- getActive : function(){\r
- return front;\r
- },\r
-\r
- \r
- getBy : function(fn, scope){\r
- var r = [];\r
- for(var i = accessList.length-1; i >=0; --i) {\r
- var win = accessList[i];\r
- if(fn.call(scope||win, win) !== false){\r
- r.push(win);\r
- }\r
- }\r
- return r;\r
- },\r
-\r
- \r
- each : function(fn, scope){\r
- for(var id in list){\r
- if(list[id] && typeof list[id] != "function"){\r
- if(fn.call(scope || list[id], list[id]) === false){\r
- return;\r
- }\r
- }\r
- }\r
- }\r
- };\r
-};\r
-\r
-\r
-\r
-Ext.WindowMgr = new Ext.WindowGroup();\r
-\r
-Ext.dd.PanelProxy = function(panel, config){\r
- this.panel = panel;\r
- this.id = this.panel.id +'-ddproxy';\r
- Ext.apply(this, config);\r
-};\r
-\r
-Ext.dd.PanelProxy.prototype = {\r
- \r
- insertProxy : true,\r
-\r
- // private overrides\r
- setStatus : Ext.emptyFn,\r
- reset : Ext.emptyFn,\r
- update : Ext.emptyFn,\r
- stop : Ext.emptyFn,\r
- sync: Ext.emptyFn,\r
-\r
- \r
- getEl : function(){\r
- return this.ghost;\r
- },\r
-\r
- \r
- getGhost : function(){\r
- return this.ghost;\r
- },\r
-\r
- \r
- getProxy : function(){\r
- return this.proxy;\r
- },\r
-\r
- \r
- hide : function(){\r
- if(this.ghost){\r
- if(this.proxy){\r
- this.proxy.remove();\r
- delete this.proxy;\r
- }\r
- this.panel.el.dom.style.display = '';\r
- this.ghost.remove();\r
- delete this.ghost;\r
- }\r
- },\r
-\r
- \r
- show : function(){\r
- if(!this.ghost){\r
- this.ghost = this.panel.createGhost(undefined, undefined, Ext.getBody());\r
- this.ghost.setXY(this.panel.el.getXY())\r
- if(this.insertProxy){\r
- this.proxy = this.panel.el.insertSibling({cls:'x-panel-dd-spacer'});\r
- this.proxy.setSize(this.panel.getSize());\r
- }\r
- this.panel.el.dom.style.display = 'none';\r
- }\r
- },\r
-\r
- // private\r
- repair : function(xy, callback, scope){\r
- this.hide();\r
- if(typeof callback == "function"){\r
- callback.call(scope || this);\r
- }\r
- },\r
-\r
- \r
- moveProxy : function(parentNode, before){\r
- if(this.proxy){\r
- parentNode.insertBefore(this.proxy.dom, before);\r
- }\r
- }\r
-};\r
-\r
-// private - DD implementation for Panels\r
-Ext.Panel.DD = function(panel, cfg){\r
- this.panel = panel;\r
- this.dragData = {panel: panel};\r
- this.proxy = new Ext.dd.PanelProxy(panel, cfg);\r
- Ext.Panel.DD.superclass.constructor.call(this, panel.el, cfg);\r
- var h = panel.header;\r
- if(h){\r
- this.setHandleElId(h.id);\r
- }\r
- (h ? h : this.panel.body).setStyle('cursor', 'move');\r
- this.scroll = false;\r
-};\r
-\r
-Ext.extend(Ext.Panel.DD, Ext.dd.DragSource, {\r
- showFrame: Ext.emptyFn,\r
- startDrag: Ext.emptyFn,\r
- b4StartDrag: function(x, y) {\r
- this.proxy.show();\r
- },\r
- b4MouseDown: function(e) {\r
- var x = e.getPageX();\r
- var y = e.getPageY();\r
- this.autoOffset(x, y);\r
- },\r
- onInitDrag : function(x, y){\r
- this.onStartDrag(x, y);\r
- return true;\r
- },\r
- createFrame : Ext.emptyFn,\r
- getDragEl : function(e){\r
- return this.proxy.ghost.dom;\r
- },\r
- endDrag : function(e){\r
- this.proxy.hide();\r
- this.panel.saveState();\r
- },\r
-\r
- autoOffset : function(x, y) {\r
- x -= this.startPageX;\r
- y -= this.startPageY;\r
- this.setDelta(x, y);\r
- }\r
-});\r
-\r
-Ext.state.Provider = function(){\r
- \r
- this.addEvents("statechange");\r
- this.state = {};\r
- Ext.state.Provider.superclass.constructor.call(this);\r
-};\r
-Ext.extend(Ext.state.Provider, Ext.util.Observable, {\r
- \r
- get : function(name, defaultValue){\r
- return typeof this.state[name] == "undefined" ?\r
- defaultValue : this.state[name];\r
- },\r
- \r
- \r
- clear : function(name){\r
- delete this.state[name];\r
- this.fireEvent("statechange", this, name, null);\r
- },\r
- \r
- \r
- set : function(name, value){\r
- this.state[name] = value;\r
- this.fireEvent("statechange", this, name, value);\r
- },\r
- \r
- \r
- decodeValue : function(cookie){\r
- var re = /^(a|n|d|b|s|o)\:(.*)$/;\r
- var matches = re.exec(unescape(cookie));\r
- if(!matches || !matches[1]) return; // non state cookie\r
- var type = matches[1];\r
- var v = matches[2];\r
- switch(type){\r
- case "n":\r
- return parseFloat(v);\r
- case "d":\r
- return new Date(Date.parse(v));\r
- case "b":\r
- return (v == "1");\r
- case "a":\r
- var all = [];\r
- var values = v.split("^");\r
- for(var i = 0, len = values.length; i < len; i++){\r
- all.push(this.decodeValue(values[i]));\r
- }\r
- return all;\r
- case "o":\r
- var all = {};\r
- var values = v.split("^");\r
- for(var i = 0, len = values.length; i < len; i++){\r
- var kv = values[i].split("=");\r
- all[kv[0]] = this.decodeValue(kv[1]);\r
- }\r
- return all;\r
- default:\r
- return v;\r
- }\r
- },\r
- \r
- \r
- encodeValue : function(v){\r
- var enc;\r
- if(typeof v == "number"){\r
- enc = "n:" + v;\r
- }else if(typeof v == "boolean"){\r
- enc = "b:" + (v ? "1" : "0");\r
- }else if(Ext.isDate(v)){\r
- enc = "d:" + v.toGMTString();\r
- }else if(Ext.isArray(v)){\r
- var flat = "";\r
- for(var i = 0, len = v.length; i < len; i++){\r
- flat += this.encodeValue(v[i]);\r
- if(i != len-1) flat += "^";\r
- }\r
- enc = "a:" + flat;\r
- }else if(typeof v == "object"){\r
- var flat = "";\r
- for(var key in v){\r
- if(typeof v[key] != "function" && v[key] !== undefined){\r
- flat += key + "=" + this.encodeValue(v[key]) + "^";\r
- }\r
- }\r
- enc = "o:" + flat.substring(0, flat.length-1);\r
- }else{\r
- enc = "s:" + v;\r
- }\r
- return escape(enc); \r
- }\r
-});\r
-\r
-\r
-Ext.state.Manager = function(){\r
- var provider = new Ext.state.Provider();\r
-\r
- return {\r
- \r
- setProvider : function(stateProvider){\r
- provider = stateProvider;\r
- },\r
-\r
- \r
- get : function(key, defaultValue){\r
- return provider.get(key, defaultValue);\r
- },\r
-\r
- \r
- set : function(key, value){\r
- provider.set(key, value);\r
- },\r
-\r
- \r
- clear : function(key){\r
- provider.clear(key);\r
- },\r
-\r
- \r
- getProvider : function(){\r
- return provider;\r
- }\r
- };\r
-}();\r
-\r
-\r
-Ext.state.CookieProvider = function(config){\r
- Ext.state.CookieProvider.superclass.constructor.call(this);\r
- this.path = "/";\r
- this.expires = new Date(new Date().getTime()+(1000*60*60*24*7)); //7 days\r
- this.domain = null;\r
- this.secure = false;\r
- Ext.apply(this, config);\r
- this.state = this.readCookies();\r
-};\r
-\r
-Ext.extend(Ext.state.CookieProvider, Ext.state.Provider, {\r
- // private\r
- set : function(name, value){\r
- if(typeof value == "undefined" || value === null){\r
- this.clear(name);\r
- return;\r
- }\r
- this.setCookie(name, value);\r
- Ext.state.CookieProvider.superclass.set.call(this, name, value);\r
- },\r
-\r
- // private\r
- clear : function(name){\r
- this.clearCookie(name);\r
- Ext.state.CookieProvider.superclass.clear.call(this, name);\r
- },\r
-\r
- // private\r
- readCookies : function(){\r
- var cookies = {};\r
- var c = document.cookie + ";";\r
- var re = /\s?(.*?)=(.*?);/g;\r
- var matches;\r
- while((matches = re.exec(c)) != null){\r
- var name = matches[1];\r
- var value = matches[2];\r
- if(name && name.substring(0,3) == "ys-"){\r
- cookies[name.substr(3)] = this.decodeValue(value);\r
- }\r
- }\r
- return cookies;\r
- },\r
-\r
- // private\r
- setCookie : function(name, value){\r
- document.cookie = "ys-"+ name + "=" + this.encodeValue(value) +\r
- ((this.expires == null) ? "" : ("; expires=" + this.expires.toGMTString())) +\r
- ((this.path == null) ? "" : ("; path=" + this.path)) +\r
- ((this.domain == null) ? "" : ("; domain=" + this.domain)) +\r
- ((this.secure == true) ? "; secure" : "");\r
- },\r
-\r
- // private\r
- clearCookie : function(name){\r
- document.cookie = "ys-" + name + "=null; expires=Thu, 01-Jan-70 00:00:01 GMT" +\r
- ((this.path == null) ? "" : ("; path=" + this.path)) +\r
- ((this.domain == null) ? "" : ("; domain=" + this.domain)) +\r
- ((this.secure == true) ? "; secure" : "");\r
- }\r
-});\r
-\r
-Ext.DataView = Ext.extend(Ext.BoxComponent, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- selectedClass : "x-view-selected",\r
- \r
- emptyText : "",\r
-\r
- \r
- deferEmptyText: true,\r
- \r
- trackOver: false,\r
-\r
- //private\r
- last: false,\r
-\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.DataView.superclass.initComponent.call(this);\r
- if(typeof this.tpl == "string"){\r
- this.tpl = new Ext.XTemplate(this.tpl);\r
- }\r
-\r
- this.addEvents(\r
- \r
- "beforeclick",\r
- \r
- "click",\r
- \r
- "mouseenter",\r
- \r
- "mouseleave",\r
- \r
- "containerclick",\r
- \r
- "dblclick",\r
- \r
- "contextmenu",\r
- \r
- "selectionchange",\r
-\r
- \r
- "beforeselect"\r
- );\r
-\r
- this.all = new Ext.CompositeElementLite();\r
- this.selected = new Ext.CompositeElementLite();\r
- },\r
-\r
- // private\r
- onRender : function(){\r
- if(!this.el){\r
- this.el = document.createElement('div');\r
- this.el.id = this.id;\r
- }\r
- Ext.DataView.superclass.onRender.apply(this, arguments);\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.DataView.superclass.afterRender.call(this);\r
-\r
- this.el.on({\r
- "click": this.onClick,\r
- "dblclick": this.onDblClick,\r
- "contextmenu": this.onContextMenu,\r
- scope:this\r
- });\r
-\r
- if(this.overClass || this.trackOver){\r
- this.el.on({\r
- "mouseover": this.onMouseOver,\r
- "mouseout": this.onMouseOut,\r
- scope:this\r
- });\r
- }\r
-\r
- if(this.store){\r
- this.setStore(this.store, true);\r
- }\r
- },\r
-\r
- \r
- refresh : function(){\r
- this.clearSelections(false, true);\r
- this.el.update("");\r
- var records = this.store.getRange();\r
- if(records.length < 1){\r
- if(!this.deferEmptyText || this.hasSkippedEmptyText){\r
- this.el.update(this.emptyText);\r
- }\r
- this.hasSkippedEmptyText = true;\r
- this.all.clear();\r
- return;\r
- }\r
- this.tpl.overwrite(this.el, this.collectData(records, 0));\r
- this.all.fill(Ext.query(this.itemSelector, this.el.dom));\r
- this.updateIndexes(0);\r
- },\r
-\r
- \r
- prepareData : function(data){\r
- return data;\r
- },\r
-\r
- \r
- collectData : function(records, startIndex){\r
- var r = [];\r
- for(var i = 0, len = records.length; i < len; i++){\r
- r[r.length] = this.prepareData(records[i].data, startIndex+i, records[i]);\r
- }\r
- return r;\r
- },\r
-\r
- // private\r
- bufferRender : function(records){\r
- var div = document.createElement('div');\r
- this.tpl.overwrite(div, this.collectData(records));\r
- return Ext.query(this.itemSelector, div);\r
- },\r
-\r
- // private\r
- onUpdate : function(ds, record){\r
- var index = this.store.indexOf(record);\r
- var sel = this.isSelected(index);\r
- var original = this.all.elements[index];\r
- var node = this.bufferRender([record], index)[0];\r
-\r
- this.all.replaceElement(index, node, true);\r
- if(sel){\r
- this.selected.replaceElement(original, node);\r
- this.all.item(index).addClass(this.selectedClass);\r
- }\r
- this.updateIndexes(index, index);\r
- },\r
-\r
- // private\r
- onAdd : function(ds, records, index){\r
- if(this.all.getCount() == 0){\r
- this.refresh();\r
- return;\r
- }\r
- var nodes = this.bufferRender(records, index), n, a = this.all.elements;\r
- if(index < this.all.getCount()){\r
- n = this.all.item(index).insertSibling(nodes, 'before', true);\r
- a.splice.apply(a, [index, 0].concat(nodes));\r
- }else{\r
- n = this.all.last().insertSibling(nodes, 'after', true);\r
- a.push.apply(a, nodes);\r
- }\r
- this.updateIndexes(index);\r
- },\r
-\r
- // private\r
- onRemove : function(ds, record, index){\r
- this.deselect(index);\r
- this.all.removeElement(index, true);\r
- this.updateIndexes(index);\r
- },\r
-\r
- \r
- refreshNode : function(index){\r
- this.onUpdate(this.store, this.store.getAt(index));\r
- },\r
-\r
- // private\r
- updateIndexes : function(startIndex, endIndex){\r
- var ns = this.all.elements;\r
- startIndex = startIndex || 0;\r
- endIndex = endIndex || ((endIndex === 0) ? 0 : (ns.length - 1));\r
- for(var i = startIndex; i <= endIndex; i++){\r
- ns[i].viewIndex = i;\r
- }\r
- },\r
- \r
- \r
- getStore : function(){\r
- return this.store;\r
- },\r
-\r
- \r
- setStore : function(store, initial){\r
- if(!initial && this.store){\r
- this.store.un("beforeload", this.onBeforeLoad, this);\r
- this.store.un("datachanged", this.refresh, this);\r
- this.store.un("add", this.onAdd, this);\r
- this.store.un("remove", this.onRemove, this);\r
- this.store.un("update", this.onUpdate, this);\r
- this.store.un("clear", this.refresh, this);\r
- }\r
- if(store){\r
- store = Ext.StoreMgr.lookup(store);\r
- store.on("beforeload", this.onBeforeLoad, this);\r
- store.on("datachanged", this.refresh, this);\r
- store.on("add", this.onAdd, this);\r
- store.on("remove", this.onRemove, this);\r
- store.on("update", this.onUpdate, this);\r
- store.on("clear", this.refresh, this);\r
- }\r
- this.store = store;\r
- if(store){\r
- this.refresh();\r
- }\r
- },\r
-\r
- \r
- findItemFromChild : function(node){\r
- return Ext.fly(node).findParent(this.itemSelector, this.el);\r
- },\r
-\r
- // private\r
- onClick : function(e){\r
- var item = e.getTarget(this.itemSelector, this.el);\r
- if(item){\r
- var index = this.indexOf(item);\r
- if(this.onItemClick(item, index, e) !== false){\r
- this.fireEvent("click", this, index, item, e);\r
- }\r
- }else{\r
- if(this.fireEvent("containerclick", this, e) !== false){\r
- this.clearSelections();\r
- }\r
- }\r
- },\r
-\r
- // private\r
- onContextMenu : function(e){\r
- var item = e.getTarget(this.itemSelector, this.el);\r
- if(item){\r
- this.fireEvent("contextmenu", this, this.indexOf(item), item, e);\r
- }\r
- },\r
-\r
- // private\r
- onDblClick : function(e){\r
- var item = e.getTarget(this.itemSelector, this.el);\r
- if(item){\r
- this.fireEvent("dblclick", this, this.indexOf(item), item, e);\r
- }\r
- },\r
-\r
- // private\r
- onMouseOver : function(e){\r
- var item = e.getTarget(this.itemSelector, this.el);\r
- if(item && item !== this.lastItem){\r
- this.lastItem = item;\r
- Ext.fly(item).addClass(this.overClass);\r
- this.fireEvent("mouseenter", this, this.indexOf(item), item, e);\r
- }\r
- },\r
-\r
- // private\r
- onMouseOut : function(e){\r
- if(this.lastItem){\r
- if(!e.within(this.lastItem, true, true)){\r
- Ext.fly(this.lastItem).removeClass(this.overClass);\r
- this.fireEvent("mouseleave", this, this.indexOf(this.lastItem), this.lastItem, e);\r
- delete this.lastItem;\r
- }\r
- }\r
- },\r
-\r
- // private\r
- onItemClick : function(item, index, e){\r
- if(this.fireEvent("beforeclick", this, index, item, e) === false){\r
- return false;\r
- }\r
- if(this.multiSelect){\r
- this.doMultiSelection(item, index, e);\r
- e.preventDefault();\r
- }else if(this.singleSelect){\r
- this.doSingleSelection(item, index, e);\r
- e.preventDefault();\r
- }\r
- return true;\r
- },\r
-\r
- // private\r
- doSingleSelection : function(item, index, e){\r
- if(e.ctrlKey && this.isSelected(index)){\r
- this.deselect(index);\r
- }else{\r
- this.select(index, false);\r
- }\r
- },\r
-\r
- // private\r
- doMultiSelection : function(item, index, e){\r
- if(e.shiftKey && this.last !== false){\r
- var last = this.last;\r
- this.selectRange(last, index, e.ctrlKey);\r
- this.last = last; // reset the last\r
- }else{\r
- if((e.ctrlKey||this.simpleSelect) && this.isSelected(index)){\r
- this.deselect(index);\r
- }else{\r
- this.select(index, e.ctrlKey || e.shiftKey || this.simpleSelect);\r
- }\r
- }\r
- },\r
-\r
- \r
- getSelectionCount : function(){\r
- return this.selected.getCount()\r
- },\r
-\r
- \r
- getSelectedNodes : function(){\r
- return this.selected.elements;\r
- },\r
-\r
- \r
- getSelectedIndexes : function(){\r
- var indexes = [], s = this.selected.elements;\r
- for(var i = 0, len = s.length; i < len; i++){\r
- indexes.push(s[i].viewIndex);\r
- }\r
- return indexes;\r
- },\r
-\r
- \r
- getSelectedRecords : function(){\r
- var r = [], s = this.selected.elements;\r
- for(var i = 0, len = s.length; i < len; i++){\r
- r[r.length] = this.store.getAt(s[i].viewIndex);\r
- }\r
- return r;\r
- },\r
-\r
- \r
- getRecords : function(nodes){\r
- var r = [], s = nodes;\r
- for(var i = 0, len = s.length; i < len; i++){\r
- r[r.length] = this.store.getAt(s[i].viewIndex);\r
- }\r
- return r;\r
- },\r
-\r
- \r
- getRecord : function(node){\r
- return this.store.getAt(node.viewIndex);\r
- },\r
-\r
- \r
- clearSelections : function(suppressEvent, skipUpdate){\r
- if((this.multiSelect || this.singleSelect) && this.selected.getCount() > 0){\r
- if(!skipUpdate){\r
- this.selected.removeClass(this.selectedClass);\r
- }\r
- this.selected.clear();\r
- this.last = false;\r
- if(!suppressEvent){\r
- this.fireEvent("selectionchange", this, this.selected.elements);\r
- }\r
- }\r
- },\r
-\r
- \r
- isSelected : function(node){\r
- return this.selected.contains(this.getNode(node));\r
- },\r
-\r
- \r
- deselect : function(node){\r
- if(this.isSelected(node)){\r
- node = this.getNode(node);\r
- this.selected.removeElement(node);\r
- if(this.last == node.viewIndex){\r
- this.last = false;\r
- }\r
- Ext.fly(node).removeClass(this.selectedClass);\r
- this.fireEvent("selectionchange", this, this.selected.elements);\r
- }\r
- },\r
-\r
- \r
- select : function(nodeInfo, keepExisting, suppressEvent){\r
- if(Ext.isArray(nodeInfo)){\r
- if(!keepExisting){\r
- this.clearSelections(true);\r
- }\r
- for(var i = 0, len = nodeInfo.length; i < len; i++){\r
- this.select(nodeInfo[i], true, true);\r
- }\r
- if(!suppressEvent){\r
- this.fireEvent("selectionchange", this, this.selected.elements);\r
- }\r
- } else{\r
- var node = this.getNode(nodeInfo);\r
- if(!keepExisting){\r
- this.clearSelections(true);\r
- }\r
- if(node && !this.isSelected(node)){\r
- if(this.fireEvent("beforeselect", this, node, this.selected.elements) !== false){\r
- Ext.fly(node).addClass(this.selectedClass);\r
- this.selected.add(node);\r
- this.last = node.viewIndex;\r
- if(!suppressEvent){\r
- this.fireEvent("selectionchange", this, this.selected.elements);\r
- }\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- selectRange : function(start, end, keepExisting){\r
- if(!keepExisting){\r
- this.clearSelections(true);\r
- }\r
- this.select(this.getNodes(start, end), true);\r
- },\r
-\r
- \r
- getNode : function(nodeInfo){\r
- if(typeof nodeInfo == "string"){\r
- return document.getElementById(nodeInfo);\r
- }else if(typeof nodeInfo == "number"){\r
- return this.all.elements[nodeInfo];\r
- }\r
- return nodeInfo;\r
- },\r
-\r
- \r
- getNodes : function(start, end){\r
- var ns = this.all.elements;\r
- start = start || 0;\r
- end = typeof end == "undefined" ? Math.max(ns.length - 1, 0) : end;\r
- var nodes = [], i;\r
- if(start <= end){\r
- for(i = start; i <= end && ns[i]; i++){\r
- nodes.push(ns[i]);\r
- }\r
- } else{\r
- for(i = start; i >= end && ns[i]; i--){\r
- nodes.push(ns[i]);\r
- }\r
- }\r
- return nodes;\r
- },\r
-\r
- \r
- indexOf : function(node){\r
- node = this.getNode(node);\r
- if(typeof node.viewIndex == "number"){\r
- return node.viewIndex;\r
- }\r
- return this.all.indexOf(node);\r
- },\r
-\r
- // private\r
- onBeforeLoad : function(){\r
- if(this.loadingText){\r
- this.clearSelections(false, true);\r
- this.el.update('<div class="loading-indicator">'+this.loadingText+'</div>');\r
- this.all.clear();\r
- }\r
- },\r
-\r
- onDestroy : function(){\r
- Ext.DataView.superclass.onDestroy.call(this);\r
- this.setStore(null);\r
- }\r
-});\r
-\r
-Ext.reg('dataview', Ext.DataView);\r
-\r
-Ext.ColorPalette = function(config){\r
- Ext.ColorPalette.superclass.constructor.call(this, config);\r
- this.addEvents(\r
- \r
- 'select'\r
- );\r
-\r
- if(this.handler){\r
- this.on("select", this.handler, this.scope, true);\r
- }\r
-};\r
-Ext.extend(Ext.ColorPalette, Ext.Component, {\r
- \r
- \r
- itemCls : "x-color-palette",\r
- \r
- value : null,\r
- clickEvent:'click',\r
- // private\r
- ctype: "Ext.ColorPalette",\r
-\r
- \r
- allowReselect : false,\r
-\r
- \r
- colors : [\r
- "000000", "993300", "333300", "003300", "003366", "000080", "333399", "333333",\r
- "800000", "FF6600", "808000", "008000", "008080", "0000FF", "666699", "808080",\r
- "FF0000", "FF9900", "99CC00", "339966", "33CCCC", "3366FF", "800080", "969696",\r
- "FF00FF", "FFCC00", "FFFF00", "00FF00", "00FFFF", "00CCFF", "993366", "C0C0C0",\r
- "FF99CC", "FFCC99", "FFFF99", "CCFFCC", "CCFFFF", "99CCFF", "CC99FF", "FFFFFF"\r
- ],\r
-\r
- // private\r
- onRender : function(container, position){\r
- var t = this.tpl || new Ext.XTemplate(\r
- '<tpl for="."><a href="#" class="color-{.}" hidefocus="on"><em><span style="background:#{.}" unselectable="on"> </span></em></a></tpl>'\r
- );\r
- var el = document.createElement("div");\r
- el.id = this.getId();\r
- el.className = this.itemCls;\r
- t.overwrite(el, this.colors);\r
- container.dom.insertBefore(el, position);\r
- this.el = Ext.get(el);\r
- this.el.on(this.clickEvent, this.handleClick, this, {delegate: "a"});\r
- if(this.clickEvent != 'click'){\r
- this.el.on('click', Ext.emptyFn, this, {delegate: "a", preventDefault:true});\r
- }\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.ColorPalette.superclass.afterRender.call(this);\r
- if(this.value){\r
- var s = this.value;\r
- this.value = null;\r
- this.select(s);\r
- }\r
- },\r
-\r
- // private\r
- handleClick : function(e, t){\r
- e.preventDefault();\r
- if(!this.disabled){\r
- var c = t.className.match(/(?:^|\s)color-(.{6})(?:\s|$)/)[1];\r
- this.select(c.toUpperCase());\r
- }\r
- },\r
-\r
- \r
- select : function(color){\r
- color = color.replace("#", "");\r
- if(color != this.value || this.allowReselect){\r
- var el = this.el;\r
- if(this.value){\r
- el.child("a.color-"+this.value).removeClass("x-color-palette-sel");\r
- }\r
- el.child("a.color-"+color).addClass("x-color-palette-sel");\r
- this.value = color;\r
- this.fireEvent("select", this, color);\r
- }\r
- }\r
-\r
- \r
-});\r
-Ext.reg('colorpalette', Ext.ColorPalette);\r
-\r
-Ext.DatePicker = Ext.extend(Ext.Component, {\r
- \r
- todayText : "Today",\r
- \r
- okText : " OK ", //   to give the user extra clicking room\r
- \r
- cancelText : "Cancel",\r
- \r
- todayTip : "{0} (Spacebar)",\r
- \r
- minText : "This date is before the minimum date",\r
- \r
- maxText : "This date is after the maximum date",\r
- \r
- format : "m/d/y",\r
- \r
- disabledDaysText : "Disabled",\r
- \r
- disabledDatesText : "Disabled",\r
- \r
- constrainToViewport : true,\r
- \r
- monthNames : Date.monthNames,\r
- \r
- dayNames : Date.dayNames,\r
- \r
- nextText: 'Next Month (Control+Right)',\r
- \r
- prevText: 'Previous Month (Control+Left)',\r
- \r
- monthYearText: 'Choose a month (Control+Up/Down to move years)',\r
- \r
- startDay : 0,\r
- \r
- showToday : true,\r
- \r
- \r
- \r
- \r
- \r
-\r
- // private\r
- initComponent : function(){\r
- Ext.DatePicker.superclass.initComponent.call(this);\r
-\r
- this.value = this.value ?\r
- this.value.clearTime() : new Date().clearTime();\r
-\r
- this.addEvents(\r
- \r
- 'select'\r
- );\r
-\r
- if(this.handler){\r
- this.on("select", this.handler, this.scope || this);\r
- }\r
-\r
- this.initDisabledDays();\r
- },\r
-\r
- // private\r
- initDisabledDays : function(){\r
- if(!this.disabledDatesRE && this.disabledDates){\r
- var dd = this.disabledDates;\r
- var re = "(?:";\r
- for(var i = 0; i < dd.length; i++){\r
- re += dd[i];\r
- if(i != dd.length-1) re += "|";\r
- }\r
- this.disabledDatesRE = new RegExp(re + ")");\r
- }\r
- },\r
- \r
- \r
- setDisabledDates : function(dd){\r
- if(Ext.isArray(dd)){\r
- this.disabledDates = dd;\r
- this.disabledDatesRE = null;\r
- }else{\r
- this.disabledDatesRE = dd;\r
- }\r
- this.initDisabledDays();\r
- this.update(this.value, true);\r
- },\r
- \r
- \r
- setDisabledDays : function(dd){\r
- this.disabledDays = dd;\r
- this.update(this.value, true);\r
- },\r
- \r
- \r
- setMinDate : function(dt){\r
- this.minDate = dt;\r
- this.update(this.value, true);\r
- },\r
- \r
- \r
- setMaxDate : function(dt){\r
- this.maxDate = dt;\r
- this.update(this.value, true);\r
- },\r
-\r
- \r
- setValue : function(value){\r
- var old = this.value;\r
- this.value = value.clearTime(true);\r
- if(this.el){\r
- this.update(this.value);\r
- }\r
- },\r
-\r
- \r
- getValue : function(){\r
- return this.value;\r
- },\r
-\r
- // private\r
- focus : function(){\r
- if(this.el){\r
- this.update(this.activeDate);\r
- }\r
- },\r
-\r
- // private\r
- onRender : function(container, position){\r
- var m = [\r
- '<table cellspacing="0">',\r
- '<tr><td class="x-date-left"><a href="#" title="', this.prevText ,'"> </a></td><td class="x-date-middle" align="center"></td><td class="x-date-right"><a href="#" title="', this.nextText ,'"> </a></td></tr>',\r
- '<tr><td colspan="3"><table class="x-date-inner" cellspacing="0"><thead><tr>'];\r
- var dn = this.dayNames;\r
- for(var i = 0; i < 7; i++){\r
- var d = this.startDay+i;\r
- if(d > 6){\r
- d = d-7;\r
- }\r
- m.push("<th><span>", dn[d].substr(0,1), "</span></th>");\r
- }\r
- m[m.length] = "</tr></thead><tbody><tr>";\r
- for(var i = 0; i < 42; i++) {\r
- if(i % 7 == 0 && i != 0){\r
- m[m.length] = "</tr><tr>";\r
- }\r
- m[m.length] = '<td><a href="#" hidefocus="on" class="x-date-date" tabIndex="1"><em><span></span></em></a></td>';\r
- }\r
- m.push('</tr></tbody></table></td></tr>', \r
- this.showToday ? '<tr><td colspan="3" class="x-date-bottom" align="center"></td></tr>' : '', \r
- '</table><div class="x-date-mp"></div>');\r
-\r
- var el = document.createElement("div");\r
- el.className = "x-date-picker";\r
- el.innerHTML = m.join("");\r
-\r
- container.dom.insertBefore(el, position);\r
-\r
- this.el = Ext.get(el);\r
- this.eventEl = Ext.get(el.firstChild);\r
-\r
- this.leftClickRpt = new Ext.util.ClickRepeater(this.el.child("td.x-date-left a"), {\r
- handler: this.showPrevMonth,\r
- scope: this,\r
- preventDefault:true,\r
- stopDefault:true\r
- });\r
-\r
- this.rightClickRpt = new Ext.util.ClickRepeater(this.el.child("td.x-date-right a"), {\r
- handler: this.showNextMonth,\r
- scope: this,\r
- preventDefault:true,\r
- stopDefault:true\r
- });\r
-\r
- this.eventEl.on("mousewheel", this.handleMouseWheel, this);\r
-\r
- this.monthPicker = this.el.down('div.x-date-mp');\r
- this.monthPicker.enableDisplayMode('block');\r
- \r
- var kn = new Ext.KeyNav(this.eventEl, {\r
- "left" : function(e){\r
- e.ctrlKey ?\r
- this.showPrevMonth() :\r
- this.update(this.activeDate.add("d", -1));\r
- },\r
-\r
- "right" : function(e){\r
- e.ctrlKey ?\r
- this.showNextMonth() :\r
- this.update(this.activeDate.add("d", 1));\r
- },\r
-\r
- "up" : function(e){\r
- e.ctrlKey ?\r
- this.showNextYear() :\r
- this.update(this.activeDate.add("d", -7));\r
- },\r
-\r
- "down" : function(e){\r
- e.ctrlKey ?\r
- this.showPrevYear() :\r
- this.update(this.activeDate.add("d", 7));\r
- },\r
-\r
- "pageUp" : function(e){\r
- this.showNextMonth();\r
- },\r
-\r
- "pageDown" : function(e){\r
- this.showPrevMonth();\r
- },\r
-\r
- "enter" : function(e){\r
- e.stopPropagation();\r
- return true;\r
- },\r
-\r
- scope : this\r
- });\r
-\r
- this.eventEl.on("click", this.handleDateClick, this, {delegate: "a.x-date-date"});\r
-\r
- this.el.unselectable();\r
- \r
- this.cells = this.el.select("table.x-date-inner tbody td");\r
- this.textNodes = this.el.query("table.x-date-inner tbody span");\r
-\r
- this.mbtn = new Ext.Button({\r
- text: " ",\r
- tooltip: this.monthYearText,\r
- renderTo: this.el.child("td.x-date-middle", true)\r
- });\r
-\r
- this.mbtn.on('click', this.showMonthPicker, this);\r
- this.mbtn.el.child(this.mbtn.menuClassTarget).addClass("x-btn-with-menu");\r
-\r
- if(this.showToday){\r
- this.todayKeyListener = this.eventEl.addKeyListener(Ext.EventObject.SPACE, this.selectToday, this);\r
- var today = (new Date()).dateFormat(this.format);\r
- this.todayBtn = new Ext.Button({\r
- renderTo: this.el.child("td.x-date-bottom", true),\r
- text: String.format(this.todayText, today),\r
- tooltip: String.format(this.todayTip, today),\r
- handler: this.selectToday,\r
- scope: this\r
- });\r
- }\r
- \r
- if(Ext.isIE){\r
- this.el.repaint();\r
- }\r
- this.update(this.value);\r
- },\r
-\r
- // private\r
- createMonthPicker : function(){\r
- if(!this.monthPicker.dom.firstChild){\r
- var buf = ['<table border="0" cellspacing="0">'];\r
- for(var i = 0; i < 6; i++){\r
- buf.push(\r
- '<tr><td class="x-date-mp-month"><a href="#">', this.monthNames[i].substr(0, 3), '</a></td>',\r
- '<td class="x-date-mp-month x-date-mp-sep"><a href="#">', this.monthNames[i+6].substr(0, 3), '</a></td>',\r
- i == 0 ?\r
- '<td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-prev"></a></td><td class="x-date-mp-ybtn" align="center"><a class="x-date-mp-next"></a></td></tr>' :\r
- '<td class="x-date-mp-year"><a href="#"></a></td><td class="x-date-mp-year"><a href="#"></a></td></tr>'\r
- );\r
- }\r
- buf.push(\r
- '<tr class="x-date-mp-btns"><td colspan="4"><button type="button" class="x-date-mp-ok">',\r
- this.okText,\r
- '</button><button type="button" class="x-date-mp-cancel">',\r
- this.cancelText,\r
- '</button></td></tr>',\r
- '</table>'\r
- );\r
- this.monthPicker.update(buf.join(''));\r
- this.monthPicker.on('click', this.onMonthClick, this);\r
- this.monthPicker.on('dblclick', this.onMonthDblClick, this);\r
-\r
- this.mpMonths = this.monthPicker.select('td.x-date-mp-month');\r
- this.mpYears = this.monthPicker.select('td.x-date-mp-year');\r
-\r
- this.mpMonths.each(function(m, a, i){\r
- i += 1;\r
- if((i%2) == 0){\r
- m.dom.xmonth = 5 + Math.round(i * .5);\r
- }else{\r
- m.dom.xmonth = Math.round((i-1) * .5);\r
- }\r
- });\r
- }\r
- },\r
-\r
- // private\r
- showMonthPicker : function(){\r
- this.createMonthPicker();\r
- var size = this.el.getSize();\r
- this.monthPicker.setSize(size);\r
- this.monthPicker.child('table').setSize(size);\r
-\r
- this.mpSelMonth = (this.activeDate || this.value).getMonth();\r
- this.updateMPMonth(this.mpSelMonth);\r
- this.mpSelYear = (this.activeDate || this.value).getFullYear();\r
- this.updateMPYear(this.mpSelYear);\r
-\r
- this.monthPicker.slideIn('t', {duration:.2});\r
- },\r
-\r
- // private\r
- updateMPYear : function(y){\r
- this.mpyear = y;\r
- var ys = this.mpYears.elements;\r
- for(var i = 1; i <= 10; i++){\r
- var td = ys[i-1], y2;\r
- if((i%2) == 0){\r
- y2 = y + Math.round(i * .5);\r
- td.firstChild.innerHTML = y2;\r
- td.xyear = y2;\r
- }else{\r
- y2 = y - (5-Math.round(i * .5));\r
- td.firstChild.innerHTML = y2;\r
- td.xyear = y2;\r
- }\r
- this.mpYears.item(i-1)[y2 == this.mpSelYear ? 'addClass' : 'removeClass']('x-date-mp-sel');\r
- }\r
- },\r
-\r
- // private\r
- updateMPMonth : function(sm){\r
- this.mpMonths.each(function(m, a, i){\r
- m[m.dom.xmonth == sm ? 'addClass' : 'removeClass']('x-date-mp-sel');\r
- });\r
- },\r
-\r
- // private\r
- selectMPMonth: function(m){\r
- \r
- },\r
-\r
- // private\r
- onMonthClick : function(e, t){\r
- e.stopEvent();\r
- var el = new Ext.Element(t), pn;\r
- if(el.is('button.x-date-mp-cancel')){\r
- this.hideMonthPicker();\r
- }\r
- else if(el.is('button.x-date-mp-ok')){\r
- var d = new Date(this.mpSelYear, this.mpSelMonth, (this.activeDate || this.value).getDate());\r
- if(d.getMonth() != this.mpSelMonth){\r
- // "fix" the JS rolling date conversion if needed\r
- d = new Date(this.mpSelYear, this.mpSelMonth, 1).getLastDateOfMonth();\r
- }\r
- this.update(d);\r
- this.hideMonthPicker();\r
- }\r
- else if(pn = el.up('td.x-date-mp-month', 2)){\r
- this.mpMonths.removeClass('x-date-mp-sel');\r
- pn.addClass('x-date-mp-sel');\r
- this.mpSelMonth = pn.dom.xmonth;\r
- }\r
- else if(pn = el.up('td.x-date-mp-year', 2)){\r
- this.mpYears.removeClass('x-date-mp-sel');\r
- pn.addClass('x-date-mp-sel');\r
- this.mpSelYear = pn.dom.xyear;\r
- }\r
- else if(el.is('a.x-date-mp-prev')){\r
- this.updateMPYear(this.mpyear-10);\r
- }\r
- else if(el.is('a.x-date-mp-next')){\r
- this.updateMPYear(this.mpyear+10);\r
- }\r
- },\r
-\r
- // private\r
- onMonthDblClick : function(e, t){\r
- e.stopEvent();\r
- var el = new Ext.Element(t), pn;\r
- if(pn = el.up('td.x-date-mp-month', 2)){\r
- this.update(new Date(this.mpSelYear, pn.dom.xmonth, (this.activeDate || this.value).getDate()));\r
- this.hideMonthPicker();\r
- }\r
- else if(pn = el.up('td.x-date-mp-year', 2)){\r
- this.update(new Date(pn.dom.xyear, this.mpSelMonth, (this.activeDate || this.value).getDate()));\r
- this.hideMonthPicker();\r
- }\r
- },\r
-\r
- // private\r
- hideMonthPicker : function(disableAnim){\r
- if(this.monthPicker){\r
- if(disableAnim === true){\r
- this.monthPicker.hide();\r
- }else{\r
- this.monthPicker.slideOut('t', {duration:.2});\r
- }\r
- }\r
- },\r
-\r
- // private\r
- showPrevMonth : function(e){\r
- this.update(this.activeDate.add("mo", -1));\r
- },\r
-\r
- // private\r
- showNextMonth : function(e){\r
- this.update(this.activeDate.add("mo", 1));\r
- },\r
-\r
- // private\r
- showPrevYear : function(){\r
- this.update(this.activeDate.add("y", -1));\r
- },\r
-\r
- // private\r
- showNextYear : function(){\r
- this.update(this.activeDate.add("y", 1));\r
- },\r
-\r
- // private\r
- handleMouseWheel : function(e){\r
- var delta = e.getWheelDelta();\r
- if(delta > 0){\r
- this.showPrevMonth();\r
- e.stopEvent();\r
- } else if(delta < 0){\r
- this.showNextMonth();\r
- e.stopEvent();\r
- }\r
- },\r
-\r
- // private\r
- handleDateClick : function(e, t){\r
- e.stopEvent();\r
- if(t.dateValue && !Ext.fly(t.parentNode).hasClass("x-date-disabled")){\r
- this.setValue(new Date(t.dateValue));\r
- this.fireEvent("select", this, this.value);\r
- }\r
- },\r
-\r
- // private\r
- selectToday : function(){\r
- if(this.todayBtn && !this.todayBtn.disabled){\r
- this.setValue(new Date().clearTime());\r
- this.fireEvent("select", this, this.value);\r
- }\r
- },\r
-\r
- // private\r
- update : function(date, forceRefresh){\r
- var vd = this.activeDate;\r
- this.activeDate = date;\r
- if(!forceRefresh && vd && this.el){\r
- var t = date.getTime();\r
- if(vd.getMonth() == date.getMonth() && vd.getFullYear() == date.getFullYear()){\r
- this.cells.removeClass("x-date-selected");\r
- this.cells.each(function(c){\r
- if(c.dom.firstChild.dateValue == t){\r
- c.addClass("x-date-selected");\r
- setTimeout(function(){\r
- try{c.dom.firstChild.focus();}catch(e){}\r
- }, 50);\r
- return false;\r
- }\r
- });\r
- return;\r
- }\r
- }\r
- var days = date.getDaysInMonth();\r
- var firstOfMonth = date.getFirstDateOfMonth();\r
- var startingPos = firstOfMonth.getDay()-this.startDay;\r
-\r
- if(startingPos <= this.startDay){\r
- startingPos += 7;\r
- }\r
-\r
- var pm = date.add("mo", -1);\r
- var prevStart = pm.getDaysInMonth()-startingPos;\r
-\r
- var cells = this.cells.elements;\r
- var textEls = this.textNodes;\r
- days += startingPos;\r
-\r
- // convert everything to numbers so it's fast\r
- var day = 86400000;\r
- var d = (new Date(pm.getFullYear(), pm.getMonth(), prevStart)).clearTime();\r
- var today = new Date().clearTime().getTime();\r
- var sel = date.clearTime().getTime();\r
- var min = this.minDate ? this.minDate.clearTime() : Number.NEGATIVE_INFINITY;\r
- var max = this.maxDate ? this.maxDate.clearTime() : Number.POSITIVE_INFINITY;\r
- var ddMatch = this.disabledDatesRE;\r
- var ddText = this.disabledDatesText;\r
- var ddays = this.disabledDays ? this.disabledDays.join("") : false;\r
- var ddaysText = this.disabledDaysText;\r
- var format = this.format;\r
- \r
- if(this.showToday){\r
- var td = new Date().clearTime();\r
- var disable = (td < min || td > max || \r
- (ddMatch && format && ddMatch.test(td.dateFormat(format))) || \r
- (ddays && ddays.indexOf(td.getDay()) != -1));\r
- \r
- this.todayBtn.setDisabled(disable);\r
- this.todayKeyListener[disable ? 'disable' : 'enable']();\r
- }\r
-\r
- var setCellClass = function(cal, cell){\r
- cell.title = "";\r
- var t = d.getTime();\r
- cell.firstChild.dateValue = t;\r
- if(t == today){\r
- cell.className += " x-date-today";\r
- cell.title = cal.todayText;\r
- }\r
- if(t == sel){\r
- cell.className += " x-date-selected";\r
- setTimeout(function(){\r
- try{cell.firstChild.focus();}catch(e){}\r
- }, 50);\r
- }\r
- // disabling\r
- if(t < min) {\r
- cell.className = " x-date-disabled";\r
- cell.title = cal.minText;\r
- return;\r
- }\r
- if(t > max) {\r
- cell.className = " x-date-disabled";\r
- cell.title = cal.maxText;\r
- return;\r
- }\r
- if(ddays){\r
- if(ddays.indexOf(d.getDay()) != -1){\r
- cell.title = ddaysText;\r
- cell.className = " x-date-disabled";\r
- }\r
- }\r
- if(ddMatch && format){\r
- var fvalue = d.dateFormat(format);\r
- if(ddMatch.test(fvalue)){\r
- cell.title = ddText.replace("%0", fvalue);\r
- cell.className = " x-date-disabled";\r
- }\r
- }\r
- };\r
-\r
- var i = 0;\r
- for(; i < startingPos; i++) {\r
- textEls[i].innerHTML = (++prevStart);\r
- d.setDate(d.getDate()+1);\r
- cells[i].className = "x-date-prevday";\r
- setCellClass(this, cells[i]);\r
- }\r
- for(; i < days; i++){\r
- var intDay = i - startingPos + 1;\r
- textEls[i].innerHTML = (intDay);\r
- d.setDate(d.getDate()+1);\r
- cells[i].className = "x-date-active";\r
- setCellClass(this, cells[i]);\r
- }\r
- var extraDays = 0;\r
- for(; i < 42; i++) {\r
- textEls[i].innerHTML = (++extraDays);\r
- d.setDate(d.getDate()+1);\r
- cells[i].className = "x-date-nextday";\r
- setCellClass(this, cells[i]);\r
- }\r
-\r
- this.mbtn.setText(this.monthNames[date.getMonth()] + " " + date.getFullYear());\r
-\r
- if(!this.internalRender){\r
- var main = this.el.dom.firstChild;\r
- var w = main.offsetWidth;\r
- this.el.setWidth(w + this.el.getBorderWidth("lr"));\r
- Ext.fly(main).setWidth(w);\r
- this.internalRender = true;\r
- // opera does not respect the auto grow header center column\r
- // then, after it gets a width opera refuses to recalculate\r
- // without a second pass\r
- if(Ext.isOpera && !this.secondPass){\r
- main.rows[0].cells[1].style.width = (w - (main.rows[0].cells[0].offsetWidth+main.rows[0].cells[2].offsetWidth)) + "px";\r
- this.secondPass = true;\r
- this.update.defer(10, this, [date]);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- beforeDestroy : function() {\r
- if(this.rendered){\r
- Ext.destroy(\r
- this.leftClickRpt,\r
- this.rightClickRpt,\r
- this.monthPicker,\r
- this.eventEl,\r
- this.mbtn,\r
- this.todayBtn\r
- );\r
- }\r
- }\r
-\r
- \r
-});\r
-Ext.reg('datepicker', Ext.DatePicker);\r
-\r
-Ext.TabPanel = Ext.extend(Ext.Panel, {\r
- \r
- \r
- \r
- monitorResize : true,\r
- \r
- deferredRender : true,\r
- \r
- tabWidth: 120,\r
- \r
- minTabWidth: 30,\r
- \r
- resizeTabs:false,\r
- \r
- enableTabScroll: false,\r
- \r
- scrollIncrement : 0,\r
- \r
- scrollRepeatInterval : 400,\r
- \r
- scrollDuration : .35,\r
- \r
- animScroll : true,\r
- \r
- tabPosition: 'top',\r
- \r
- baseCls: 'x-tab-panel',\r
- \r
- autoTabs : false,\r
- \r
- autoTabSelector:'div.x-tab',\r
- \r
- activeTab : null,\r
- \r
- tabMargin : 2,\r
- \r
- plain: false,\r
- \r
- wheelIncrement : 20,\r
-\r
- \r
- idDelimiter : '__',\r
-\r
- // private\r
- itemCls : 'x-tab-item',\r
-\r
- // private config overrides\r
- elements: 'body',\r
- headerAsText: false,\r
- frame: false,\r
- hideBorders:true,\r
-\r
- // private\r
- initComponent : function(){\r
- this.frame = false;\r
- Ext.TabPanel.superclass.initComponent.call(this);\r
- this.addEvents(\r
- \r
- 'beforetabchange',\r
- \r
- 'tabchange',\r
- \r
- 'contextmenu'\r
- );\r
- this.setLayout(new Ext.layout.CardLayout({\r
- deferredRender: this.deferredRender\r
- }));\r
- if(this.tabPosition == 'top'){\r
- this.elements += ',header';\r
- this.stripTarget = 'header';\r
- }else {\r
- this.elements += ',footer';\r
- this.stripTarget = 'footer';\r
- }\r
- if(!this.stack){\r
- this.stack = Ext.TabPanel.AccessStack();\r
- }\r
- this.initItems();\r
- },\r
-\r
- // private\r
- render : function(){\r
- Ext.TabPanel.superclass.render.apply(this, arguments);\r
- if(this.activeTab !== undefined){\r
- var item = this.activeTab;\r
- delete this.activeTab;\r
- this.setActiveTab(item);\r
- }\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.TabPanel.superclass.onRender.call(this, ct, position);\r
-\r
- if(this.plain){\r
- var pos = this.tabPosition == 'top' ? 'header' : 'footer';\r
- this[pos].addClass('x-tab-panel-'+pos+'-plain');\r
- }\r
-\r
- var st = this[this.stripTarget];\r
-\r
- this.stripWrap = st.createChild({cls:'x-tab-strip-wrap', cn:{\r
- tag:'ul', cls:'x-tab-strip x-tab-strip-'+this.tabPosition}});\r
-\r
- var beforeEl = (this.tabPosition=='bottom' ? this.stripWrap : null);\r
- this.stripSpacer = st.createChild({cls:'x-tab-strip-spacer'}, beforeEl);\r
- this.strip = new Ext.Element(this.stripWrap.dom.firstChild);\r
-\r
- this.edge = this.strip.createChild({tag:'li', cls:'x-tab-edge'});\r
- this.strip.createChild({cls:'x-clear'});\r
-\r
- this.body.addClass('x-tab-panel-body-'+this.tabPosition);\r
-\r
- if(!this.itemTpl){\r
- var tt = new Ext.Template(\r
- '<li class="{cls}" id="{id}"><a class="x-tab-strip-close" onclick="return false;"></a>',\r
- '<a class="x-tab-right" href="#" onclick="return false;"><em class="x-tab-left">',\r
- '<span class="x-tab-strip-inner"><span class="x-tab-strip-text {iconCls}">{text}</span></span>',\r
- '</em></a></li>'\r
- );\r
- tt.disableFormats = true;\r
- tt.compile();\r
- Ext.TabPanel.prototype.itemTpl = tt;\r
- }\r
-\r
- this.items.each(this.initTab, this);\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.TabPanel.superclass.afterRender.call(this);\r
- if(this.autoTabs){\r
- this.readTabs(false);\r
- }\r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- Ext.TabPanel.superclass.initEvents.call(this);\r
- this.on('add', this.onAdd, this);\r
- this.on('remove', this.onRemove, this);\r
-\r
- this.strip.on('mousedown', this.onStripMouseDown, this);\r
- this.strip.on('contextmenu', this.onStripContextMenu, this);\r
- if(this.enableTabScroll){\r
- this.strip.on('mousewheel', this.onWheel, this);\r
- }\r
- },\r
-\r
- // private\r
- findTargets : function(e){\r
- var item = null;\r
- var itemEl = e.getTarget('li', this.strip);\r
- if(itemEl){\r
- item = this.getComponent(itemEl.id.split(this.idDelimiter)[1]);\r
- if(item.disabled){\r
- return {\r
- close : null,\r
- item : null,\r
- el : null\r
- };\r
- }\r
- }\r
- return {\r
- close : e.getTarget('.x-tab-strip-close', this.strip),\r
- item : item,\r
- el : itemEl\r
- };\r
- },\r
-\r
- // private\r
- onStripMouseDown : function(e){\r
- if(e.button != 0){\r
- return;\r
- }\r
- e.preventDefault();\r
- var t = this.findTargets(e);\r
- if(t.close){\r
- this.remove(t.item);\r
- return;\r
- }\r
- if(t.item && t.item != this.activeTab){\r
- this.setActiveTab(t.item);\r
- }\r
- },\r
-\r
- // private\r
- onStripContextMenu : function(e){\r
- e.preventDefault();\r
- var t = this.findTargets(e);\r
- if(t.item){\r
- this.fireEvent('contextmenu', this, t.item, e);\r
- }\r
- },\r
-\r
- \r
- readTabs : function(removeExisting){\r
- if(removeExisting === true){\r
- this.items.each(function(item){\r
- this.remove(item);\r
- }, this);\r
- }\r
- var tabs = this.el.query(this.autoTabSelector);\r
- for(var i = 0, len = tabs.length; i < len; i++){\r
- var tab = tabs[i];\r
- var title = tab.getAttribute('title');\r
- tab.removeAttribute('title');\r
- this.add({\r
- title: title,\r
- el: tab\r
- });\r
- }\r
- },\r
-\r
- // private\r
- initTab : function(item, index){\r
- var before = this.strip.dom.childNodes[index];\r
- var cls = item.closable ? 'x-tab-strip-closable' : '';\r
- if(item.disabled){\r
- cls += ' x-item-disabled';\r
- }\r
- if(item.iconCls){\r
- cls += ' x-tab-with-icon';\r
- }\r
- if(item.tabCls){\r
- cls += ' ' + item.tabCls;\r
- }\r
-\r
- var p = {\r
- id: this.id + this.idDelimiter + item.getItemId(),\r
- text: item.title,\r
- cls: cls,\r
- iconCls: item.iconCls || ''\r
- };\r
- var el = before ?\r
- this.itemTpl.insertBefore(before, p) :\r
- this.itemTpl.append(this.strip, p);\r
-\r
- Ext.fly(el).addClassOnOver('x-tab-strip-over');\r
-\r
- if(item.tabTip){\r
- Ext.fly(el).child('span.x-tab-strip-text', true).qtip = item.tabTip;\r
- }\r
- item.tabEl = el;\r
-\r
- item.on('disable', this.onItemDisabled, this);\r
- item.on('enable', this.onItemEnabled, this);\r
- item.on('titlechange', this.onItemTitleChanged, this);\r
- item.on('iconchange', this.onItemIconChanged, this);\r
- item.on('beforeshow', this.onBeforeShowItem, this);\r
- },\r
-\r
- // private\r
- onAdd : function(tp, item, index){\r
- this.initTab(item, index);\r
- if(this.items.getCount() == 1){\r
- this.syncSize();\r
- }\r
- this.delegateUpdates();\r
- },\r
-\r
- // private\r
- onBeforeAdd : function(item){\r
- var existing = item.events ? (this.items.containsKey(item.getItemId()) ? item : null) : this.items.get(item);\r
- if(existing){\r
- this.setActiveTab(item);\r
- return false;\r
- }\r
- Ext.TabPanel.superclass.onBeforeAdd.apply(this, arguments);\r
- var es = item.elements;\r
- item.elements = es ? es.replace(',header', '') : es;\r
- item.border = (item.border === true);\r
- },\r
-\r
- // private\r
- onRemove : function(tp, item){\r
- Ext.destroy(Ext.get(this.getTabEl(item)));\r
- this.stack.remove(item);\r
- item.un('disable', this.onItemDisabled, this);\r
- item.un('enable', this.onItemEnabled, this);\r
- item.un('titlechange', this.onItemTitleChanged, this);\r
- item.un('iconchange', this.onItemIconChanged, this);\r
- item.un('beforeshow', this.onBeforeShowItem, this);\r
- if(item == this.activeTab){\r
- var next = this.stack.next();\r
- if(next){\r
- this.setActiveTab(next);\r
- }else if(this.items.getCount() > 0){\r
- this.setActiveTab(0);\r
- }else{\r
- this.activeTab = null;\r
- }\r
- }\r
- this.delegateUpdates();\r
- },\r
-\r
- // private\r
- onBeforeShowItem : function(item){\r
- if(item != this.activeTab){\r
- this.setActiveTab(item);\r
- return false;\r
- }\r
- },\r
-\r
- // private\r
- onItemDisabled : function(item){\r
- var el = this.getTabEl(item);\r
- if(el){\r
- Ext.fly(el).addClass('x-item-disabled');\r
- }\r
- this.stack.remove(item);\r
- },\r
-\r
- // private\r
- onItemEnabled : function(item){\r
- var el = this.getTabEl(item);\r
- if(el){\r
- Ext.fly(el).removeClass('x-item-disabled');\r
- }\r
- },\r
-\r
- // private\r
- onItemTitleChanged : function(item){\r
- var el = this.getTabEl(item);\r
- if(el){\r
- Ext.fly(el).child('span.x-tab-strip-text', true).innerHTML = item.title;\r
- }\r
- },\r
- \r
- //private\r
- onItemIconChanged: function(item, iconCls, oldCls){\r
- var el = this.getTabEl(item);\r
- if(el){\r
- Ext.fly(el).child('span.x-tab-strip-text').replaceClass(oldCls, iconCls);\r
- }\r
- },\r
-\r
- \r
- getTabEl : function(item){\r
- var itemId = (typeof item === 'number')?this.items.items[item].getItemId() : item.getItemId();\r
- return document.getElementById(this.id+this.idDelimiter+itemId);\r
- },\r
-\r
- // private\r
- onResize : function(){\r
- Ext.TabPanel.superclass.onResize.apply(this, arguments);\r
- this.delegateUpdates();\r
- },\r
-\r
- \r
- beginUpdate : function(){\r
- this.suspendUpdates = true;\r
- },\r
-\r
- \r
- endUpdate : function(){\r
- this.suspendUpdates = false;\r
- this.delegateUpdates();\r
- },\r
-\r
- \r
- hideTabStripItem : function(item){\r
- item = this.getComponent(item);\r
- var el = this.getTabEl(item);\r
- if(el){\r
- el.style.display = 'none';\r
- this.delegateUpdates();\r
- }\r
- this.stack.remove(item);\r
- },\r
-\r
- \r
- unhideTabStripItem : function(item){\r
- item = this.getComponent(item);\r
- var el = this.getTabEl(item);\r
- if(el){\r
- el.style.display = '';\r
- this.delegateUpdates();\r
- }\r
- },\r
-\r
- // private\r
- delegateUpdates : function(){\r
- if(this.suspendUpdates){\r
- return;\r
- }\r
- if(this.resizeTabs && this.rendered){\r
- this.autoSizeTabs();\r
- }\r
- if(this.enableTabScroll && this.rendered){\r
- this.autoScrollTabs();\r
- }\r
- },\r
-\r
- // private\r
- autoSizeTabs : function(){\r
- var count = this.items.length;\r
- var ce = this.tabPosition != 'bottom' ? 'header' : 'footer';\r
- var ow = this[ce].dom.offsetWidth;\r
- var aw = this[ce].dom.clientWidth;\r
-\r
- if(!this.resizeTabs || count < 1 || !aw){ // !aw for display:none\r
- return;\r
- }\r
-\r
- var each = Math.max(Math.min(Math.floor((aw-4) / count) - this.tabMargin, this.tabWidth), this.minTabWidth); // -4 for float errors in IE\r
- this.lastTabWidth = each;\r
- var lis = this.stripWrap.dom.getElementsByTagName('li');\r
- for(var i = 0, len = lis.length-1; i < len; i++) { // -1 for the "edge" li\r
- var li = lis[i];\r
- var inner = li.childNodes[1].firstChild.firstChild;\r
- var tw = li.offsetWidth;\r
- var iw = inner.offsetWidth;\r
- inner.style.width = (each - (tw-iw)) + 'px';\r
- }\r
- },\r
-\r
- // private\r
- adjustBodyWidth : function(w){\r
- if(this.header){\r
- this.header.setWidth(w);\r
- }\r
- if(this.footer){\r
- this.footer.setWidth(w);\r
- }\r
- return w;\r
- },\r
-\r
- \r
- setActiveTab : function(item){\r
- item = this.getComponent(item);\r
- if(!item || this.fireEvent('beforetabchange', this, item, this.activeTab) === false){\r
- return;\r
- }\r
- if(!this.rendered){\r
- this.activeTab = item;\r
- return;\r
- }\r
- if(this.activeTab != item){\r
- if(this.activeTab){\r
- var oldEl = this.getTabEl(this.activeTab);\r
- if(oldEl){\r
- Ext.fly(oldEl).removeClass('x-tab-strip-active');\r
- }\r
- this.activeTab.fireEvent('deactivate', this.activeTab);\r
- }\r
- var el = this.getTabEl(item);\r
- Ext.fly(el).addClass('x-tab-strip-active');\r
- this.activeTab = item;\r
- this.stack.add(item);\r
-\r
- this.layout.setActiveItem(item);\r
- if(this.layoutOnTabChange && item.doLayout){\r
- item.doLayout();\r
- }\r
- if(this.scrolling){\r
- this.scrollToTab(item, this.animScroll);\r
- }\r
-\r
- item.fireEvent('activate', item);\r
- this.fireEvent('tabchange', this, item);\r
- }\r
- },\r
-\r
- \r
- getActiveTab : function(){\r
- return this.activeTab || null;\r
- },\r
-\r
- \r
- getItem : function(item){\r
- return this.getComponent(item);\r
- },\r
-\r
- // private\r
- autoScrollTabs : function(){\r
- this.pos = this.tabPosition=='bottom' ? this.footer : this.header;\r
- var count = this.items.length;\r
- var ow = this.pos.dom.offsetWidth;\r
- var tw = this.pos.dom.clientWidth;\r
-\r
- var wrap = this.stripWrap;\r
- var wd = wrap.dom;\r
- var cw = wd.offsetWidth;\r
- var pos = this.getScrollPos();\r
- var l = this.edge.getOffsetsTo(this.stripWrap)[0] + pos;\r
-\r
- if(!this.enableTabScroll || count < 1 || cw < 20){ // 20 to prevent display:none issues\r
- return;\r
- }\r
- if(l <= tw){\r
- wd.scrollLeft = 0;\r
- wrap.setWidth(tw);\r
- if(this.scrolling){\r
- this.scrolling = false;\r
- this.pos.removeClass('x-tab-scrolling');\r
- this.scrollLeft.hide();\r
- this.scrollRight.hide();\r
- if(Ext.isAir || Ext.isSafari){\r
- wd.style.marginLeft = '';\r
- wd.style.marginRight = '';\r
- }\r
- }\r
- }else{\r
- if(!this.scrolling){\r
- this.pos.addClass('x-tab-scrolling');\r
- if(Ext.isAir || Ext.isSafari){\r
- wd.style.marginLeft = '18px';\r
- wd.style.marginRight = '18px';\r
- }\r
- }\r
- tw -= wrap.getMargins('lr');\r
- wrap.setWidth(tw > 20 ? tw : 20);\r
- if(!this.scrolling){\r
- if(!this.scrollLeft){\r
- this.createScrollers();\r
- }else{\r
- this.scrollLeft.show();\r
- this.scrollRight.show();\r
- }\r
- }\r
- this.scrolling = true;\r
- if(pos > (l-tw)){ // ensure it stays within bounds\r
- wd.scrollLeft = l-tw;\r
- }else{ // otherwise, make sure the active tab is still visible\r
- this.scrollToTab(this.activeTab, false);\r
- }\r
- this.updateScrollButtons();\r
- }\r
- },\r
-\r
- // private\r
- createScrollers : function(){\r
- this.pos.addClass('x-tab-scrolling-' + this.tabPosition);\r
- var h = this.stripWrap.dom.offsetHeight;\r
-\r
- // left\r
- var sl = this.pos.insertFirst({\r
- cls:'x-tab-scroller-left'\r
- });\r
- sl.setHeight(h);\r
- sl.addClassOnOver('x-tab-scroller-left-over');\r
- this.leftRepeater = new Ext.util.ClickRepeater(sl, {\r
- interval : this.scrollRepeatInterval,\r
- handler: this.onScrollLeft,\r
- scope: this\r
- });\r
- this.scrollLeft = sl;\r
-\r
- // right\r
- var sr = this.pos.insertFirst({\r
- cls:'x-tab-scroller-right'\r
- });\r
- sr.setHeight(h);\r
- sr.addClassOnOver('x-tab-scroller-right-over');\r
- this.rightRepeater = new Ext.util.ClickRepeater(sr, {\r
- interval : this.scrollRepeatInterval,\r
- handler: this.onScrollRight,\r
- scope: this\r
- });\r
- this.scrollRight = sr;\r
- },\r
-\r
- // private\r
- getScrollWidth : function(){\r
- return this.edge.getOffsetsTo(this.stripWrap)[0] + this.getScrollPos();\r
- },\r
-\r
- // private\r
- getScrollPos : function(){\r
- return parseInt(this.stripWrap.dom.scrollLeft, 10) || 0;\r
- },\r
-\r
- // private\r
- getScrollArea : function(){\r
- return parseInt(this.stripWrap.dom.clientWidth, 10) || 0;\r
- },\r
-\r
- // private\r
- getScrollAnim : function(){\r
- return {duration:this.scrollDuration, callback: this.updateScrollButtons, scope: this};\r
- },\r
-\r
- // private\r
- getScrollIncrement : function(){\r
- return this.scrollIncrement || (this.resizeTabs ? this.lastTabWidth+2 : 100);\r
- },\r
-\r
- \r
-\r
- scrollToTab : function(item, animate){\r
- if(!item){ return; }\r
- var el = this.getTabEl(item);\r
- var pos = this.getScrollPos(), area = this.getScrollArea();\r
- var left = Ext.fly(el).getOffsetsTo(this.stripWrap)[0] + pos;\r
- var right = left + el.offsetWidth;\r
- if(left < pos){\r
- this.scrollTo(left, animate);\r
- }else if(right > (pos + area)){\r
- this.scrollTo(right - area, animate);\r
- }\r
- },\r
-\r
- // private\r
- scrollTo : function(pos, animate){\r
- this.stripWrap.scrollTo('left', pos, animate ? this.getScrollAnim() : false);\r
- if(!animate){\r
- this.updateScrollButtons();\r
- }\r
- },\r
-\r
- onWheel : function(e){\r
- var d = e.getWheelDelta()*this.wheelIncrement*-1;\r
- e.stopEvent();\r
-\r
- var pos = this.getScrollPos();\r
- var newpos = pos + d;\r
- var sw = this.getScrollWidth()-this.getScrollArea();\r
-\r
- var s = Math.max(0, Math.min(sw, newpos));\r
- if(s != pos){\r
- this.scrollTo(s, false);\r
- }\r
- },\r
-\r
- // private\r
- onScrollRight : function(){\r
- var sw = this.getScrollWidth()-this.getScrollArea();\r
- var pos = this.getScrollPos();\r
- var s = Math.min(sw, pos + this.getScrollIncrement());\r
- if(s != pos){\r
- this.scrollTo(s, this.animScroll);\r
- }\r
- },\r
-\r
- // private\r
- onScrollLeft : function(){\r
- var pos = this.getScrollPos();\r
- var s = Math.max(0, pos - this.getScrollIncrement());\r
- if(s != pos){\r
- this.scrollTo(s, this.animScroll);\r
- }\r
- },\r
-\r
- // private\r
- updateScrollButtons : function(){\r
- var pos = this.getScrollPos();\r
- this.scrollLeft[pos == 0 ? 'addClass' : 'removeClass']('x-tab-scroller-left-disabled');\r
- this.scrollRight[pos >= (this.getScrollWidth()-this.getScrollArea()) ? 'addClass' : 'removeClass']('x-tab-scroller-right-disabled');\r
- },\r
-\r
- // private\r
- beforeDestroy : function() {\r
- if(this.items){\r
- this.items.each(function(item){\r
- if(item && item.tabEl){\r
- Ext.get(item.tabEl).removeAllListeners();\r
- item.tabEl = null;\r
- }\r
- }, this);\r
- }\r
- if(this.strip){\r
- this.strip.removeAllListeners();\r
- }\r
- Ext.TabPanel.superclass.beforeDestroy.apply(this);\r
- }\r
-\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
-});\r
-Ext.reg('tabpanel', Ext.TabPanel);\r
-\r
-\r
-Ext.TabPanel.prototype.activate = Ext.TabPanel.prototype.setActiveTab;\r
-\r
-// private utility class used by TabPanel\r
-Ext.TabPanel.AccessStack = function(){\r
- var items = [];\r
- return {\r
- add : function(item){\r
- items.push(item);\r
- if(items.length > 10){\r
- items.shift();\r
- }\r
- },\r
-\r
- remove : function(item){\r
- var s = [];\r
- for(var i = 0, len = items.length; i < len; i++) {\r
- if(items[i] != item){\r
- s.push(items[i]);\r
- }\r
- }\r
- items = s;\r
- },\r
-\r
- next : function(){\r
- return items.pop();\r
- }\r
- };\r
-};\r
-\r
-\r
-\r
-\r
-Ext.Button = Ext.extend(Ext.Component, {\r
- \r
- hidden : false,\r
- \r
- disabled : false,\r
- \r
- pressed : false,\r
- \r
-\r
- \r
-\r
- \r
-\r
- \r
- enableToggle: false,\r
- \r
- \r
- \r
- menuAlign : "tl-bl?",\r
-\r
- \r
- \r
- type : 'button',\r
-\r
- // private\r
- menuClassTarget: 'tr',\r
-\r
- \r
- clickEvent : 'click',\r
-\r
- \r
- handleMouseEvents : true,\r
-\r
- \r
- tooltipType : 'qtip',\r
-\r
- \r
- buttonSelector : "button:first-child",\r
-\r
- \r
- \r
-\r
- initComponent : function(){\r
- Ext.Button.superclass.initComponent.call(this);\r
-\r
- this.addEvents(\r
- \r
- "click",\r
- \r
- "toggle",\r
- \r
- 'mouseover',\r
- \r
- 'mouseout',\r
- \r
- 'menushow',\r
- \r
- 'menuhide',\r
- \r
- 'menutriggerover',\r
- \r
- 'menutriggerout'\r
- );\r
- if(this.menu){\r
- this.menu = Ext.menu.MenuMgr.get(this.menu);\r
- }\r
- if(typeof this.toggleGroup === 'string'){\r
- this.enableToggle = true;\r
- }\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- if(!this.template){\r
- if(!Ext.Button.buttonTemplate){\r
- // hideous table template\r
- Ext.Button.buttonTemplate = new Ext.Template(\r
- '<table border="0" cellpadding="0" cellspacing="0" class="x-btn-wrap"><tbody><tr>',\r
- '<td class="x-btn-left"><i> </i></td><td class="x-btn-center"><em unselectable="on"><button class="x-btn-text" type="{1}">{0}</button></em></td><td class="x-btn-right"><i> </i></td>',\r
- "</tr></tbody></table>");\r
- }\r
- this.template = Ext.Button.buttonTemplate;\r
- }\r
- var btn, targs = [this.text || ' ', this.type];\r
-\r
- if(position){\r
- btn = this.template.insertBefore(position, targs, true);\r
- }else{\r
- btn = this.template.append(ct, targs, true);\r
- }\r
- var btnEl = btn.child(this.buttonSelector);\r
- btnEl.on('focus', this.onFocus, this);\r
- btnEl.on('blur', this.onBlur, this);\r
-\r
- this.initButtonEl(btn, btnEl);\r
-\r
- if(this.menu){\r
- this.el.child(this.menuClassTarget).addClass("x-btn-with-menu");\r
- }\r
- Ext.ButtonToggleMgr.register(this);\r
- },\r
-\r
- // private\r
- initButtonEl : function(btn, btnEl){\r
-\r
- this.el = btn;\r
- btn.addClass("x-btn");\r
-\r
- if(this.id){\r
- this.el.dom.id = this.el.id = this.id;\r
- }\r
- if(this.icon){\r
- btnEl.setStyle('background-image', 'url(' +this.icon +')');\r
- }\r
- if(this.iconCls){\r
- btnEl.addClass(this.iconCls);\r
- if(!this.cls){\r
- btn.addClass(this.text ? 'x-btn-text-icon' : 'x-btn-icon');\r
- }\r
- }\r
- if(this.tabIndex !== undefined){\r
- btnEl.dom.tabIndex = this.tabIndex;\r
- }\r
- if(this.tooltip){\r
- if(typeof this.tooltip == 'object'){\r
- Ext.QuickTips.register(Ext.apply({\r
- target: btnEl.id\r
- }, this.tooltip));\r
- } else {\r
- btnEl.dom[this.tooltipType] = this.tooltip;\r
- }\r
- }\r
-\r
- if(this.pressed){\r
- this.el.addClass("x-btn-pressed");\r
- }\r
-\r
- if(this.handleMouseEvents){\r
- btn.on("mouseover", this.onMouseOver, this);\r
- // new functionality for monitoring on the document level\r
- //btn.on("mouseout", this.onMouseOut, this);\r
- btn.on("mousedown", this.onMouseDown, this);\r
- }\r
-\r
- if(this.menu){\r
- this.menu.on("show", this.onMenuShow, this);\r
- this.menu.on("hide", this.onMenuHide, this);\r
- }\r
-\r
- if(this.repeat){\r
- var repeater = new Ext.util.ClickRepeater(btn,\r
- typeof this.repeat == "object" ? this.repeat : {}\r
- );\r
- repeater.on("click", this.onClick, this);\r
- }\r
-\r
- btn.on(this.clickEvent, this.onClick, this);\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.Button.superclass.afterRender.call(this);\r
- if(Ext.isIE6){\r
- this.autoWidth.defer(1, this);\r
- }else{\r
- this.autoWidth();\r
- }\r
- },\r
-\r
- \r
- setIconClass : function(cls){\r
- if(this.el){\r
- this.el.child(this.buttonSelector).replaceClass(this.iconCls, cls);\r
- }\r
- this.iconCls = cls;\r
- },\r
-\r
- // private\r
- beforeDestroy: function(){\r
- if(this.rendered){\r
- var btnEl = this.el.child(this.buttonSelector);\r
- if(btnEl){\r
- if(this.tooltip){\r
- Ext.QuickTips.unregister(btnEl);\r
- }\r
- btnEl.removeAllListeners();\r
- }\r
- }\r
- if(this.menu){\r
- Ext.destroy(this.menu);\r
- }\r
- },\r
-\r
- // private\r
- onDestroy : function(){\r
- if(this.rendered){\r
- Ext.ButtonToggleMgr.unregister(this);\r
- }\r
- },\r
-\r
- // private\r
- autoWidth : function(){\r
- if(this.el){\r
- this.el.setWidth("auto");\r
- if(Ext.isIE7 && Ext.isStrict){\r
- var ib = this.el.child(this.buttonSelector);\r
- if(ib && ib.getWidth() > 20){\r
- ib.clip();\r
- ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));\r
- }\r
- }\r
- if(this.minWidth){\r
- if(this.el.getWidth() < this.minWidth){\r
- this.el.setWidth(this.minWidth);\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- setHandler : function(handler, scope){\r
- this.handler = handler;\r
- this.scope = scope;\r
- },\r
-\r
- \r
- setText : function(text){\r
- this.text = text;\r
- if(this.el){\r
- this.el.child("td.x-btn-center " + this.buttonSelector).update(text);\r
- }\r
- this.autoWidth();\r
- },\r
-\r
- \r
- getText : function(){\r
- return this.text;\r
- },\r
-\r
- \r
- toggle : function(state){\r
- state = state === undefined ? !this.pressed : state;\r
- if(state != this.pressed){\r
- if(state){\r
- this.el.addClass("x-btn-pressed");\r
- this.pressed = true;\r
- this.fireEvent("toggle", this, true);\r
- }else{\r
- this.el.removeClass("x-btn-pressed");\r
- this.pressed = false;\r
- this.fireEvent("toggle", this, false);\r
- }\r
- if(this.toggleHandler){\r
- this.toggleHandler.call(this.scope || this, this, state);\r
- }\r
- }\r
- },\r
-\r
- \r
- focus : function(){\r
- this.el.child(this.buttonSelector).focus();\r
- },\r
-\r
- // private\r
- onDisable : function(){\r
- if(this.el){\r
- if(!Ext.isIE6 || !this.text){\r
- this.el.addClass(this.disabledClass);\r
- }\r
- this.el.dom.disabled = true;\r
- }\r
- this.disabled = true;\r
- },\r
-\r
- // private\r
- onEnable : function(){\r
- if(this.el){\r
- if(!Ext.isIE6 || !this.text){\r
- this.el.removeClass(this.disabledClass);\r
- }\r
- this.el.dom.disabled = false;\r
- }\r
- this.disabled = false;\r
- },\r
-\r
- \r
- showMenu : function(){\r
- if(this.menu){\r
- this.menu.show(this.el, this.menuAlign);\r
- }\r
- return this;\r
- },\r
-\r
- \r
- hideMenu : function(){\r
- if(this.menu){\r
- this.menu.hide();\r
- }\r
- return this;\r
- },\r
-\r
- \r
- hasVisibleMenu : function(){\r
- return this.menu && this.menu.isVisible();\r
- },\r
-\r
- // private\r
- onClick : function(e){\r
- if(e){\r
- e.preventDefault();\r
- }\r
- if(e.button != 0){\r
- return;\r
- }\r
- if(!this.disabled){\r
- if(this.enableToggle && (this.allowDepress !== false || !this.pressed)){\r
- this.toggle();\r
- }\r
- if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){\r
- this.showMenu();\r
- }\r
- this.fireEvent("click", this, e);\r
- if(this.handler){\r
- //this.el.removeClass("x-btn-over");\r
- this.handler.call(this.scope || this, this, e);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- isMenuTriggerOver : function(e, internal){\r
- return this.menu && !internal;\r
- },\r
-\r
- // private\r
- isMenuTriggerOut : function(e, internal){\r
- return this.menu && !internal;\r
- },\r
-\r
- // private\r
- onMouseOver : function(e){\r
- if(!this.disabled){\r
- var internal = e.within(this.el, true);\r
- if(!internal){\r
- this.el.addClass("x-btn-over");\r
- if(!this.monitoringMouseOver){\r
- Ext.getDoc().on('mouseover', this.monitorMouseOver, this);\r
- this.monitoringMouseOver = true;\r
- }\r
- this.fireEvent('mouseover', this, e);\r
- }\r
- if(this.isMenuTriggerOver(e, internal)){\r
- this.fireEvent('menutriggerover', this, this.menu, e);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- monitorMouseOver : function(e){\r
- if(e.target != this.el.dom && !e.within(this.el)){\r
- if(this.monitoringMouseOver){\r
- Ext.getDoc().un('mouseover', this.monitorMouseOver, this);\r
- this.monitoringMouseOver = false;\r
- }\r
- this.onMouseOut(e);\r
- }\r
- },\r
-\r
- // private\r
- onMouseOut : function(e){\r
- var internal = e.within(this.el) && e.target != this.el.dom;\r
- this.el.removeClass("x-btn-over");\r
- this.fireEvent('mouseout', this, e);\r
- if(this.isMenuTriggerOut(e, internal)){\r
- this.fireEvent('menutriggerout', this, this.menu, e);\r
- }\r
- },\r
- // private\r
- onFocus : function(e){\r
- if(!this.disabled){\r
- this.el.addClass("x-btn-focus");\r
- }\r
- },\r
- // private\r
- onBlur : function(e){\r
- this.el.removeClass("x-btn-focus");\r
- },\r
-\r
- // private\r
- getClickEl : function(e, isUp){\r
- return this.el;\r
- },\r
-\r
- // private\r
- onMouseDown : function(e){\r
- if(!this.disabled && e.button == 0){\r
- this.getClickEl(e).addClass("x-btn-click");\r
- Ext.getDoc().on('mouseup', this.onMouseUp, this);\r
- }\r
- },\r
- // private\r
- onMouseUp : function(e){\r
- if(e.button == 0){\r
- this.getClickEl(e, true).removeClass("x-btn-click");\r
- Ext.getDoc().un('mouseup', this.onMouseUp, this);\r
- }\r
- },\r
- // private\r
- onMenuShow : function(e){\r
- this.ignoreNextClick = 0;\r
- this.el.addClass("x-btn-menu-active");\r
- this.fireEvent('menushow', this, this.menu);\r
- },\r
- // private\r
- onMenuHide : function(e){\r
- this.el.removeClass("x-btn-menu-active");\r
- this.ignoreNextClick = this.restoreClick.defer(250, this);\r
- this.fireEvent('menuhide', this, this.menu);\r
- },\r
-\r
- // private\r
- restoreClick : function(){\r
- this.ignoreNextClick = 0;\r
- }\r
-\r
-\r
-\r
- \r
-});\r
-Ext.reg('button', Ext.Button);\r
-\r
-// Private utility class used by Button\r
-Ext.ButtonToggleMgr = function(){\r
- var groups = {};\r
-\r
- function toggleGroup(btn, state){\r
- if(state){\r
- var g = groups[btn.toggleGroup];\r
- for(var i = 0, l = g.length; i < l; i++){\r
- if(g[i] != btn){\r
- g[i].toggle(false);\r
- }\r
- }\r
- }\r
- }\r
-\r
- return {\r
- register : function(btn){\r
- if(!btn.toggleGroup){\r
- return;\r
- }\r
- var g = groups[btn.toggleGroup];\r
- if(!g){\r
- g = groups[btn.toggleGroup] = [];\r
- }\r
- g.push(btn);\r
- btn.on("toggle", toggleGroup);\r
- },\r
-\r
- unregister : function(btn){\r
- if(!btn.toggleGroup){\r
- return;\r
- }\r
- var g = groups[btn.toggleGroup];\r
- if(g){\r
- g.remove(btn);\r
- btn.un("toggle", toggleGroup);\r
- }\r
- }\r
- };\r
-}();\r
-\r
-Ext.SplitButton = Ext.extend(Ext.Button, {\r
- // private\r
- arrowSelector : 'button:last',\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.SplitButton.superclass.initComponent.call(this);\r
- \r
- this.addEvents("arrowclick");\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- // this is one sweet looking template!\r
- var tpl = new Ext.Template(\r
- '<table cellspacing="0" class="x-btn-menu-wrap x-btn"><tr><td>',\r
- '<table cellspacing="0" class="x-btn-wrap x-btn-menu-text-wrap"><tbody>',\r
- '<tr><td class="x-btn-left"><i> </i></td><td class="x-btn-center"><button class="x-btn-text" type="{1}">{0}</button></td></tr>',\r
- "</tbody></table></td><td>",\r
- '<table cellspacing="0" class="x-btn-wrap x-btn-menu-arrow-wrap"><tbody>',\r
- '<tr><td class="x-btn-center"><button class="x-btn-menu-arrow-el" type="button"> </button></td><td class="x-btn-right"><i> </i></td></tr>',\r
- "</tbody></table></td></tr></table>"\r
- );\r
- var btn, targs = [this.text || ' ', this.type];\r
- if(position){\r
- btn = tpl.insertBefore(position, targs, true);\r
- }else{\r
- btn = tpl.append(ct, targs, true);\r
- }\r
- var btnEl = btn.child(this.buttonSelector);\r
-\r
- this.initButtonEl(btn, btnEl);\r
- this.arrowBtnTable = btn.child("table:last");\r
- if(this.arrowTooltip){\r
- btn.child(this.arrowSelector).dom[this.tooltipType] = this.arrowTooltip;\r
- }\r
- },\r
-\r
- // private\r
- autoWidth : function(){\r
- if(this.el){\r
- var tbl = this.el.child("table:first");\r
- var tbl2 = this.el.child("table:last");\r
- this.el.setWidth("auto");\r
- tbl.setWidth("auto");\r
- if(Ext.isIE7 && Ext.isStrict){\r
- var ib = this.el.child(this.buttonSelector);\r
- if(ib && ib.getWidth() > 20){\r
- ib.clip();\r
- ib.setWidth(Ext.util.TextMetrics.measure(ib, this.text).width+ib.getFrameWidth('lr'));\r
- }\r
- }\r
- if(this.minWidth){\r
- if((tbl.getWidth()+tbl2.getWidth()) < this.minWidth){\r
- tbl.setWidth(this.minWidth-tbl2.getWidth());\r
- }\r
- }\r
- this.el.setWidth(tbl.getWidth()+tbl2.getWidth());\r
- } \r
- },\r
-\r
- \r
- setArrowHandler : function(handler, scope){\r
- this.arrowHandler = handler;\r
- this.scope = scope; \r
- },\r
-\r
- // private\r
- onClick : function(e){\r
- e.preventDefault();\r
- if(!this.disabled){\r
- if(e.getTarget(".x-btn-menu-arrow-wrap")){\r
- if(this.menu && !this.menu.isVisible() && !this.ignoreNextClick){\r
- this.showMenu();\r
- }\r
- this.fireEvent("arrowclick", this, e);\r
- if(this.arrowHandler){\r
- this.arrowHandler.call(this.scope || this, this, e);\r
- }\r
- }else{\r
- if(this.enableToggle){\r
- this.toggle();\r
- }\r
- this.fireEvent("click", this, e);\r
- if(this.handler){\r
- this.handler.call(this.scope || this, this, e);\r
- }\r
- }\r
- }\r
- },\r
-\r
- // private\r
- getClickEl : function(e, isUp){\r
- if(!isUp){\r
- return (this.lastClickEl = e.getTarget("table", 10, true));\r
- }\r
- return this.lastClickEl;\r
- },\r
-\r
- // private\r
- onDisable : function(){\r
- if(this.el){\r
- if(!Ext.isIE6){\r
- this.el.addClass("x-item-disabled");\r
- }\r
- this.el.child(this.buttonSelector).dom.disabled = true;\r
- this.el.child(this.arrowSelector).dom.disabled = true;\r
- }\r
- this.disabled = true;\r
- },\r
-\r
- // private\r
- onEnable : function(){\r
- if(this.el){\r
- if(!Ext.isIE6){\r
- this.el.removeClass("x-item-disabled");\r
- }\r
- this.el.child(this.buttonSelector).dom.disabled = false;\r
- this.el.child(this.arrowSelector).dom.disabled = false;\r
- }\r
- this.disabled = false;\r
- },\r
-\r
- // private\r
- isMenuTriggerOver : function(e){\r
- return this.menu && e.within(this.arrowBtnTable) && !e.within(this.arrowBtnTable, true);\r
- },\r
-\r
- // private\r
- isMenuTriggerOut : function(e, internal){\r
- return this.menu && !e.within(this.arrowBtnTable);\r
- },\r
-\r
- // private\r
- onDestroy : function(){\r
- Ext.destroy(this.arrowBtnTable);\r
- Ext.SplitButton.superclass.onDestroy.call(this);\r
- }\r
-});\r
-\r
-// backwards compat\r
-Ext.MenuButton = Ext.SplitButton;\r
-\r
-\r
-Ext.reg('splitbutton', Ext.SplitButton);\r
-\r
-Ext.CycleButton = Ext.extend(Ext.SplitButton, {\r
- \r
- \r
- \r
- \r
- \r
-\r
- // private\r
- getItemText : function(item){\r
- if(item && this.showText === true){\r
- var text = '';\r
- if(this.prependText){\r
- text += this.prependText;\r
- }\r
- text += item.text;\r
- return text;\r
- }\r
- return undefined;\r
- },\r
-\r
- \r
- setActiveItem : function(item, suppressEvent){\r
- if(typeof item != 'object'){\r
- item = this.menu.items.get(item);\r
- }\r
- if(item){\r
- if(!this.rendered){\r
- this.text = this.getItemText(item);\r
- this.iconCls = item.iconCls;\r
- }else{\r
- var t = this.getItemText(item);\r
- if(t){\r
- this.setText(t);\r
- }\r
- this.setIconClass(item.iconCls);\r
- }\r
- this.activeItem = item;\r
- if(!item.checked){\r
- item.setChecked(true, true);\r
- }\r
- if(this.forceIcon){\r
- this.setIconClass(this.forceIcon);\r
- }\r
- if(!suppressEvent){\r
- this.fireEvent('change', this, item);\r
- }\r
- }\r
- },\r
-\r
- \r
- getActiveItem : function(){\r
- return this.activeItem;\r
- },\r
-\r
- // private\r
- initComponent : function(){\r
- this.addEvents(\r
- \r
- "change"\r
- );\r
-\r
- if(this.changeHandler){\r
- this.on('change', this.changeHandler, this.scope||this);\r
- delete this.changeHandler;\r
- }\r
-\r
- this.itemCount = this.items.length;\r
-\r
- this.menu = {cls:'x-cycle-menu', items:[]};\r
- var checked;\r
- for(var i = 0, len = this.itemCount; i < len; i++){\r
- var item = this.items[i];\r
- item.group = item.group || this.id;\r
- item.itemIndex = i;\r
- item.checkHandler = this.checkHandler;\r
- item.scope = this;\r
- item.checked = item.checked || false;\r
- this.menu.items.push(item);\r
- if(item.checked){\r
- checked = item;\r
- }\r
- }\r
- this.setActiveItem(checked, true);\r
- Ext.CycleButton.superclass.initComponent.call(this);\r
-\r
- this.on('click', this.toggleSelected, this);\r
- },\r
-\r
- // private\r
- checkHandler : function(item, pressed){\r
- if(pressed){\r
- this.setActiveItem(item);\r
- }\r
- },\r
-\r
- \r
- toggleSelected : function(){\r
- this.menu.render();\r
- \r
- var nextIdx, checkItem;\r
- for (var i = 1; i < this.itemCount; i++) {\r
- nextIdx = (this.activeItem.itemIndex + i) % this.itemCount;\r
- // check the potential item\r
- checkItem = this.menu.items.itemAt(nextIdx);\r
- // if its not disabled then check it.\r
- if (!checkItem.disabled) {\r
- checkItem.setChecked(true);\r
- break;\r
- }\r
- }\r
- }\r
-});\r
-Ext.reg('cycle', Ext.CycleButton);\r
- \r
- Ext.Toolbar = function(config){\r
- if(Ext.isArray(config)){\r
- config = {buttons:config};\r
- }\r
- Ext.Toolbar.superclass.constructor.call(this, config);\r
-};\r
-\r
-(function(){\r
-\r
-var T = Ext.Toolbar;\r
-\r
-Ext.extend(T, Ext.BoxComponent, {\r
-\r
- trackMenus : true,\r
-\r
- // private\r
- initComponent : function(){\r
- T.superclass.initComponent.call(this);\r
-\r
- if(this.items){\r
- this.buttons = this.items;\r
- }\r
- \r
- this.items = new Ext.util.MixedCollection(false, function(o){\r
- return o.itemId || o.id || Ext.id();\r
- });\r
- },\r
-\r
- // private\r
- autoCreate: {\r
- cls:'x-toolbar x-small-editor',\r
- html:'<table cellspacing="0"><tr></tr></table>'\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- this.el = ct.createChild(Ext.apply({ id: this.id },this.autoCreate), position);\r
- this.tr = this.el.child("tr", true);\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- T.superclass.afterRender.call(this);\r
- if(this.buttons){\r
- this.add.apply(this, this.buttons);\r
- delete this.buttons;\r
- }\r
- },\r
-\r
- \r
- add : function(){\r
- var a = arguments, l = a.length;\r
- for(var i = 0; i < l; i++){\r
- var el = a[i];\r
- if(el.isFormField){ // some kind of form field\r
- this.addField(el);\r
- }else if(el.render){ // some kind of Toolbar.Item\r
- this.addItem(el);\r
- }else if(typeof el == "string"){ // string\r
- if(el == "separator" || el == "-"){\r
- this.addSeparator();\r
- }else if(el == " "){\r
- this.addSpacer();\r
- }else if(el == "->"){\r
- this.addFill();\r
- }else{\r
- this.addText(el);\r
- }\r
- }else if(el.tagName){ // element\r
- this.addElement(el);\r
- }else if(typeof el == "object"){ // must be button config?\r
- if(el.xtype){\r
- this.addField(Ext.ComponentMgr.create(el, 'button'));\r
- }else{\r
- this.addButton(el);\r
- }\r
- }\r
- }\r
- },\r
- \r
- \r
- addSeparator : function(){\r
- return this.addItem(new T.Separator());\r
- },\r
-\r
- \r
- addSpacer : function(){\r
- return this.addItem(new T.Spacer());\r
- },\r
-\r
- \r
- addFill : function(){\r
- return this.addItem(new T.Fill());\r
- },\r
-\r
- \r
- addElement : function(el){\r
- return this.addItem(new T.Item(el));\r
- },\r
- \r
- \r
- addItem : function(item){\r
- var td = this.nextBlock();\r
- this.initMenuTracking(item);\r
- item.render(td);\r
- this.items.add(item);\r
- return item;\r
- },\r
- \r
- \r
- addButton : function(config){\r
- if(Ext.isArray(config)){\r
- var buttons = [];\r
- for(var i = 0, len = config.length; i < len; i++) {\r
- buttons.push(this.addButton(config[i]));\r
- }\r
- return buttons;\r
- }\r
- var b = config;\r
- if(!(config instanceof T.Button)){\r
- b = config.split ? \r
- new T.SplitButton(config) :\r
- new T.Button(config);\r
- }\r
- var td = this.nextBlock();\r
- this.initMenuTracking(b);\r
- b.render(td);\r
- this.items.add(b);\r
- return b;\r
- },\r
-\r
- // private\r
- initMenuTracking : function(item){\r
- if(this.trackMenus && item.menu){\r
- item.on({\r
- 'menutriggerover' : this.onButtonTriggerOver,\r
- 'menushow' : this.onButtonMenuShow,\r
- 'menuhide' : this.onButtonMenuHide,\r
- scope: this\r
- })\r
- }\r
- },\r
-\r
- \r
- addText : function(text){\r
- return this.addItem(new T.TextItem(text));\r
- },\r
- \r
- \r
- insertButton : function(index, item){\r
- if(Ext.isArray(item)){\r
- var buttons = [];\r
- for(var i = 0, len = item.length; i < len; i++) {\r
- buttons.push(this.insertButton(index + i, item[i]));\r
- }\r
- return buttons;\r
- }\r
- if (!(item instanceof T.Button)){\r
- item = new T.Button(item);\r
- }\r
- var td = document.createElement("td");\r
- this.tr.insertBefore(td, this.tr.childNodes[index]);\r
- this.initMenuTracking(item);\r
- item.render(td);\r
- this.items.insert(index, item);\r
- return item;\r
- },\r
- \r
- \r
- addDom : function(config, returnEl){\r
- var td = this.nextBlock();\r
- Ext.DomHelper.overwrite(td, config);\r
- var ti = new T.Item(td.firstChild);\r
- ti.render(td);\r
- this.items.add(ti);\r
- return ti;\r
- },\r
-\r
- \r
- addField : function(field){\r
- var td = this.nextBlock();\r
- field.render(td);\r
- var ti = new T.Item(td.firstChild);\r
- ti.render(td);\r
- this.items.add(field);\r
- return ti;\r
- },\r
-\r
- // private\r
- nextBlock : function(){\r
- var td = document.createElement("td");\r
- this.tr.appendChild(td);\r
- return td;\r
- },\r
-\r
- // private\r
- onDestroy : function(){\r
- Ext.Toolbar.superclass.onDestroy.call(this);\r
- if(this.rendered){\r
- if(this.items){ // rendered?\r
- Ext.destroy.apply(Ext, this.items.items);\r
- }\r
- Ext.Element.uncache(this.tr);\r
- }\r
- },\r
-\r
- // private\r
- onDisable : function(){\r
- this.items.each(function(item){\r
- if(item.disable){\r
- item.disable();\r
- }\r
- });\r
- },\r
-\r
- // private\r
- onEnable : function(){\r
- this.items.each(function(item){\r
- if(item.enable){\r
- item.enable();\r
- }\r
- });\r
- },\r
-\r
- // private\r
- onButtonTriggerOver : function(btn){\r
- if(this.activeMenuBtn && this.activeMenuBtn != btn){\r
- this.activeMenuBtn.hideMenu();\r
- btn.showMenu();\r
- this.activeMenuBtn = btn;\r
- }\r
- },\r
-\r
- // private\r
- onButtonMenuShow : function(btn){\r
- this.activeMenuBtn = btn;\r
- },\r
-\r
- // private\r
- onButtonMenuHide : function(btn){\r
- delete this.activeMenuBtn;\r
- }\r
-\r
- \r
-});\r
-Ext.reg('toolbar', Ext.Toolbar);\r
-\r
-\r
-T.Item = function(el){\r
- this.el = Ext.getDom(el);\r
- this.id = Ext.id(this.el);\r
- this.hidden = false;\r
-};\r
-\r
-T.Item.prototype = {\r
- \r
- \r
- getEl : function(){\r
- return this.el; \r
- },\r
-\r
- // private\r
- render : function(td){\r
- this.td = td;\r
- td.appendChild(this.el);\r
- },\r
- \r
- \r
- destroy : function(){\r
- if(this.el){\r
- var el = Ext.get(this.el);\r
- Ext.destroy(el);\r
- }\r
- Ext.removeNode(this.td);\r
- },\r
- \r
- \r
- show: function(){\r
- this.hidden = false;\r
- this.td.style.display = "";\r
- },\r
- \r
- \r
- hide: function(){\r
- this.hidden = true;\r
- this.td.style.display = "none";\r
- },\r
- \r
- \r
- setVisible: function(visible){\r
- if(visible) {\r
- this.show();\r
- }else{\r
- this.hide();\r
- }\r
- },\r
- \r
- \r
- focus : function(){\r
- Ext.fly(this.el).focus();\r
- },\r
- \r
- \r
- disable : function(){\r
- Ext.fly(this.td).addClass("x-item-disabled");\r
- this.disabled = true;\r
- this.el.disabled = true;\r
- },\r
- \r
- \r
- enable : function(){\r
- Ext.fly(this.td).removeClass("x-item-disabled");\r
- this.disabled = false;\r
- this.el.disabled = false;\r
- }\r
-};\r
-Ext.reg('tbitem', T.Item);\r
-\r
-\r
-\r
-T.Separator = function(){\r
- var s = document.createElement("span");\r
- s.className = "ytb-sep";\r
- T.Separator.superclass.constructor.call(this, s);\r
-};\r
-Ext.extend(T.Separator, T.Item, {\r
- enable:Ext.emptyFn,\r
- disable:Ext.emptyFn,\r
- focus:Ext.emptyFn\r
-});\r
-Ext.reg('tbseparator', T.Separator);\r
-\r
-\r
-T.Spacer = function(){\r
- var s = document.createElement("div");\r
- s.className = "ytb-spacer";\r
- T.Spacer.superclass.constructor.call(this, s);\r
-};\r
-Ext.extend(T.Spacer, T.Item, {\r
- enable:Ext.emptyFn,\r
- disable:Ext.emptyFn,\r
- focus:Ext.emptyFn\r
-});\r
-\r
-Ext.reg('tbspacer', T.Spacer);\r
-\r
-\r
-T.Fill = Ext.extend(T.Spacer, {\r
- // private\r
- render : function(td){\r
- td.style.width = '100%';\r
- T.Fill.superclass.render.call(this, td);\r
- }\r
-});\r
-Ext.reg('tbfill', T.Fill);\r
-\r
-\r
-T.TextItem = function(t){\r
- var s = document.createElement("span");\r
- s.className = "ytb-text";\r
- s.innerHTML = t.text ? t.text : t;\r
- T.TextItem.superclass.constructor.call(this, s);\r
-};\r
-Ext.extend(T.TextItem, T.Item, {\r
- enable:Ext.emptyFn,\r
- disable:Ext.emptyFn,\r
- focus:Ext.emptyFn\r
-});\r
-Ext.reg('tbtext', T.TextItem);\r
-\r
-\r
-\r
-T.Button = Ext.extend(Ext.Button, {\r
- hideParent : true,\r
-\r
- onDestroy : function(){\r
- T.Button.superclass.onDestroy.call(this);\r
- if(this.container){\r
- this.container.remove();\r
- }\r
- }\r
-});\r
-Ext.reg('tbbutton', T.Button);\r
-\r
-\r
-T.SplitButton = Ext.extend(Ext.SplitButton, {\r
- hideParent : true,\r
-\r
- onDestroy : function(){\r
- T.SplitButton.superclass.onDestroy.call(this);\r
- if(this.container){\r
- this.container.remove();\r
- }\r
- }\r
-});\r
-\r
-Ext.reg('tbsplit', T.SplitButton);\r
-// backwards compat\r
-T.MenuButton = T.SplitButton;\r
-\r
-})();\r
-\r
-\r
-Ext.PagingToolbar = Ext.extend(Ext.Toolbar, {\r
- \r
- \r
- \r
- pageSize: 20,\r
- \r
- displayMsg : 'Displaying {0} - {1} of {2}',\r
- \r
- emptyMsg : 'No data to display',\r
- \r
- beforePageText : "Page",\r
- \r
- afterPageText : "of {0}",\r
- \r
- firstText : "First Page",\r
- \r
- prevText : "Previous Page",\r
- \r
- nextText : "Next Page",\r
- \r
- lastText : "Last Page",\r
- \r
- refreshText : "Refresh",\r
-\r
- \r
- paramNames : {start: 'start', limit: 'limit'},\r
-\r
- // private\r
- initComponent : function(){\r
- this.addEvents(\r
- \r
- 'change',\r
- \r
- 'beforechange'\r
- );\r
- Ext.PagingToolbar.superclass.initComponent.call(this);\r
- this.cursor = 0;\r
- this.bind(this.store);\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.PagingToolbar.superclass.onRender.call(this, ct, position);\r
- this.first = this.addButton({\r
- tooltip: this.firstText,\r
- iconCls: "x-tbar-page-first",\r
- disabled: true,\r
- handler: this.onClick.createDelegate(this, ["first"])\r
- });\r
- this.prev = this.addButton({\r
- tooltip: this.prevText,\r
- iconCls: "x-tbar-page-prev",\r
- disabled: true,\r
- handler: this.onClick.createDelegate(this, ["prev"])\r
- });\r
- this.addSeparator();\r
- this.add(this.beforePageText);\r
- this.field = Ext.get(this.addDom({\r
- tag: "input",\r
- type: "text",\r
- size: "3",\r
- value: "1",\r
- cls: "x-tbar-page-number"\r
- }).el);\r
- this.field.on("keydown", this.onPagingKeydown, this);\r
- this.field.on("focus", function(){this.dom.select();});\r
- this.field.on("blur", this.onPagingBlur, this);\r
- this.afterTextEl = this.addText(String.format(this.afterPageText, 1));\r
- this.field.setHeight(18);\r
- this.addSeparator();\r
- this.next = this.addButton({\r
- tooltip: this.nextText,\r
- iconCls: "x-tbar-page-next",\r
- disabled: true,\r
- handler: this.onClick.createDelegate(this, ["next"])\r
- });\r
- this.last = this.addButton({\r
- tooltip: this.lastText,\r
- iconCls: "x-tbar-page-last",\r
- disabled: true,\r
- handler: this.onClick.createDelegate(this, ["last"])\r
- });\r
- this.addSeparator();\r
- this.loading = this.addButton({\r
- tooltip: this.refreshText,\r
- iconCls: "x-tbar-loading",\r
- handler: this.onClick.createDelegate(this, ["refresh"])\r
- });\r
-\r
- if(this.displayInfo){\r
- this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'});\r
- }\r
- if(this.dsLoaded){\r
- this.onLoad.apply(this, this.dsLoaded);\r
- }\r
- },\r
-\r
- // private\r
- updateInfo : function(){\r
- if(this.displayEl){\r
- var count = this.store.getCount();\r
- var msg = count == 0 ?\r
- this.emptyMsg :\r
- String.format(\r
- this.displayMsg,\r
- this.cursor+1, this.cursor+count, this.store.getTotalCount()\r
- );\r
- this.displayEl.update(msg);\r
- }\r
- },\r
-\r
- // private\r
- onLoad : function(store, r, o){\r
- if(!this.rendered){\r
- this.dsLoaded = [store, r, o];\r
- return;\r
- }\r
- this.cursor = o.params ? o.params[this.paramNames.start] : 0;\r
- var d = this.getPageData(), ap = d.activePage, ps = d.pages;\r
-\r
- this.afterTextEl.el.innerHTML = String.format(this.afterPageText, d.pages);\r
- this.field.dom.value = ap;\r
- this.first.setDisabled(ap == 1);\r
- this.prev.setDisabled(ap == 1);\r
- this.next.setDisabled(ap == ps);\r
- this.last.setDisabled(ap == ps);\r
- this.loading.enable();\r
- this.updateInfo();\r
- this.fireEvent('change', this, d);\r
- },\r
-\r
- // private\r
- getPageData : function(){\r
- var total = this.store.getTotalCount();\r
- return {\r
- total : total,\r
- activePage : Math.ceil((this.cursor+this.pageSize)/this.pageSize),\r
- pages : total < this.pageSize ? 1 : Math.ceil(total/this.pageSize)\r
- };\r
- },\r
-\r
- // private\r
- onLoadError : function(){\r
- if(!this.rendered){\r
- return;\r
- }\r
- this.loading.enable();\r
- },\r
-\r
- // private\r
- readPage : function(d){\r
- var v = this.field.dom.value, pageNum;\r
- if (!v || isNaN(pageNum = parseInt(v, 10))) {\r
- this.field.dom.value = d.activePage;\r
- return false;\r
- }\r
- return pageNum;\r
- },\r
-\r
- //private\r
- onPagingBlur: function(e){\r
- this.field.dom.value = this.getPageData().activePage;\r
- },\r
-\r
- // private\r
- onPagingKeydown : function(e){\r
- var k = e.getKey(), d = this.getPageData(), pageNum;\r
- if (k == e.RETURN) {\r
- e.stopEvent();\r
- pageNum = this.readPage(d);\r
- if(pageNum !== false){\r
- pageNum = Math.min(Math.max(1, pageNum), d.pages) - 1;\r
- this.doLoad(pageNum * this.pageSize);\r
- }\r
- }else if (k == e.HOME || k == e.END){\r
- e.stopEvent();\r
- pageNum = k == e.HOME ? 1 : d.pages;\r
- this.field.dom.value = pageNum;\r
- }else if (k == e.UP || k == e.PAGEUP || k == e.DOWN || k == e.PAGEDOWN){\r
- e.stopEvent();\r
- if(pageNum = this.readPage(d)){\r
- var increment = e.shiftKey ? 10 : 1;\r
- if(k == e.DOWN || k == e.PAGEDOWN){\r
- increment *= -1;\r
- }\r
- pageNum += increment;\r
- if(pageNum >= 1 & pageNum <= d.pages){\r
- this.field.dom.value = pageNum;\r
- }\r
- }\r
- }\r
- },\r
-\r
- // private\r
- beforeLoad : function(){\r
- if(this.rendered && this.loading){\r
- this.loading.disable();\r
- }\r
- },\r
-\r
- // private\r
- doLoad : function(start){\r
- var o = {}, pn = this.paramNames;\r
- o[pn.start] = start;\r
- o[pn.limit] = this.pageSize;\r
- if(this.fireEvent('beforechange', this, o) !== false){\r
- this.store.load({params:o});\r
- }\r
- },\r
-\r
- \r
- changePage: function(page){\r
- this.doLoad(((page-1) * this.pageSize).constrain(0, this.store.getTotalCount()));\r
- },\r
-\r
- // private\r
- onClick : function(which){\r
- var store = this.store;\r
- switch(which){\r
- case "first":\r
- this.doLoad(0);\r
- break;\r
- case "prev":\r
- this.doLoad(Math.max(0, this.cursor-this.pageSize));\r
- break;\r
- case "next":\r
- this.doLoad(this.cursor+this.pageSize);\r
- break;\r
- case "last":\r
- var total = store.getTotalCount();\r
- var extra = total % this.pageSize;\r
- var lastStart = extra ? (total - extra) : total-this.pageSize;\r
- this.doLoad(lastStart);\r
- break;\r
- case "refresh":\r
- this.doLoad(this.cursor);\r
- break;\r
- }\r
- },\r
-\r
- \r
- unbind : function(store){\r
- store = Ext.StoreMgr.lookup(store);\r
- store.un("beforeload", this.beforeLoad, this);\r
- store.un("load", this.onLoad, this);\r
- store.un("loadexception", this.onLoadError, this);\r
- this.store = undefined;\r
- },\r
-\r
- \r
- bind : function(store){\r
- store = Ext.StoreMgr.lookup(store);\r
- store.on("beforeload", this.beforeLoad, this);\r
- store.on("load", this.onLoad, this);\r
- store.on("loadexception", this.onLoadError, this);\r
- this.store = store;\r
- },\r
-\r
- // private\r
- onDestroy : function(){\r
- if(this.store){\r
- this.unbind(this.store);\r
- }\r
- Ext.PagingToolbar.superclass.onDestroy.call(this);\r
- }\r
-});\r
-Ext.reg('paging', Ext.PagingToolbar);\r
-\r
-Ext.Resizable = function(el, config){\r
- this.el = Ext.get(el);\r
- \r
- if(config && config.wrap){\r
- config.resizeChild = this.el;\r
- this.el = this.el.wrap(typeof config.wrap == "object" ? config.wrap : {cls:"xresizable-wrap"});\r
- this.el.id = this.el.dom.id = config.resizeChild.id + "-rzwrap";\r
- this.el.setStyle("overflow", "hidden");\r
- this.el.setPositioning(config.resizeChild.getPositioning());\r
- config.resizeChild.clearPositioning();\r
- if(!config.width || !config.height){\r
- var csize = config.resizeChild.getSize();\r
- this.el.setSize(csize.width, csize.height);\r
- }\r
- if(config.pinned && !config.adjustments){\r
- config.adjustments = "auto";\r
- }\r
- }\r
-\r
- \r
- this.proxy = this.el.createProxy({tag: "div", cls: "x-resizable-proxy", id: this.el.id + "-rzproxy"}, Ext.getBody());\r
- this.proxy.unselectable();\r
- this.proxy.enableDisplayMode('block');\r
-\r
- Ext.apply(this, config);\r
- \r
- if(this.pinned){\r
- this.disableTrackOver = true;\r
- this.el.addClass("x-resizable-pinned");\r
- }\r
- // if the element isn't positioned, make it relative\r
- var position = this.el.getStyle("position");\r
- if(position != "absolute" && position != "fixed"){\r
- this.el.setStyle("position", "relative");\r
- }\r
- if(!this.handles){ // no handles passed, must be legacy style\r
- this.handles = 's,e,se';\r
- if(this.multiDirectional){\r
- this.handles += ',n,w';\r
- }\r
- }\r
- if(this.handles == "all"){\r
- this.handles = "n s e w ne nw se sw";\r
- }\r
- var hs = this.handles.split(/\s*?[,;]\s*?| /);\r
- var ps = Ext.Resizable.positions;\r
- for(var i = 0, len = hs.length; i < len; i++){\r
- if(hs[i] && ps[hs[i]]){\r
- var pos = ps[hs[i]];\r
- this[pos] = new Ext.Resizable.Handle(this, pos, this.disableTrackOver, this.transparent);\r
- }\r
- }\r
- // legacy\r
- this.corner = this.southeast;\r
- \r
- if(this.handles.indexOf("n") != -1 || this.handles.indexOf("w") != -1){\r
- this.updateBox = true;\r
- } \r
- \r
- this.activeHandle = null;\r
- \r
- if(this.resizeChild){\r
- if(typeof this.resizeChild == "boolean"){\r
- this.resizeChild = Ext.get(this.el.dom.firstChild, true);\r
- }else{\r
- this.resizeChild = Ext.get(this.resizeChild, true);\r
- }\r
- }\r
- \r
- if(this.adjustments == "auto"){\r
- var rc = this.resizeChild;\r
- var hw = this.west, he = this.east, hn = this.north, hs = this.south;\r
- if(rc && (hw || hn)){\r
- rc.position("relative");\r
- rc.setLeft(hw ? hw.el.getWidth() : 0);\r
- rc.setTop(hn ? hn.el.getHeight() : 0);\r
- }\r
- this.adjustments = [\r
- (he ? -he.el.getWidth() : 0) + (hw ? -hw.el.getWidth() : 0),\r
- (hn ? -hn.el.getHeight() : 0) + (hs ? -hs.el.getHeight() : 0) -1 \r
- ];\r
- }\r
- \r
- if(this.draggable){\r
- this.dd = this.dynamic ? \r
- this.el.initDD(null) : this.el.initDDProxy(null, {dragElId: this.proxy.id});\r
- this.dd.setHandleElId(this.resizeChild ? this.resizeChild.id : this.el.id);\r
- }\r
- \r
- // public events\r
- this.addEvents(\r
- "beforeresize",\r
- "resize"\r
- );\r
- \r
- if(this.width !== null && this.height !== null){\r
- this.resizeTo(this.width, this.height);\r
- }else{\r
- this.updateChildSize();\r
- }\r
- if(Ext.isIE){\r
- this.el.dom.style.zoom = 1;\r
- }\r
- Ext.Resizable.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.Resizable, Ext.util.Observable, {\r
- resizeChild : false,\r
- adjustments : [0, 0],\r
- minWidth : 5,\r
- minHeight : 5,\r
- maxWidth : 10000,\r
- maxHeight : 10000,\r
- enabled : true,\r
- animate : false,\r
- duration : .35,\r
- dynamic : false,\r
- handles : false,\r
- multiDirectional : false,\r
- disableTrackOver : false,\r
- easing : 'easeOutStrong',\r
- widthIncrement : 0,\r
- heightIncrement : 0,\r
- pinned : false,\r
- width : null,\r
- height : null,\r
- preserveRatio : false,\r
- transparent: false,\r
- minX: 0,\r
- minY: 0,\r
- draggable: false,\r
-\r
- \r
- \r
-\r
- \r
- \r
- \r
- \r
- resizeTo : function(width, height){\r
- this.el.setSize(width, height);\r
- this.updateChildSize();\r
- this.fireEvent("resize", this, width, height, null);\r
- },\r
-\r
- // private\r
- startSizing : function(e, handle){\r
- this.fireEvent("beforeresize", this, e);\r
- if(this.enabled){ // 2nd enabled check in case disabled before beforeresize handler\r
-\r
- if(!this.overlay){\r
- this.overlay = this.el.createProxy({tag: "div", cls: "x-resizable-overlay", html: " "}, Ext.getBody());\r
- this.overlay.unselectable();\r
- this.overlay.enableDisplayMode("block");\r
- this.overlay.on("mousemove", this.onMouseMove, this);\r
- this.overlay.on("mouseup", this.onMouseUp, this);\r
- }\r
- this.overlay.setStyle("cursor", handle.el.getStyle("cursor"));\r
-\r
- this.resizing = true;\r
- this.startBox = this.el.getBox();\r
- this.startPoint = e.getXY();\r
- this.offsets = [(this.startBox.x + this.startBox.width) - this.startPoint[0],\r
- (this.startBox.y + this.startBox.height) - this.startPoint[1]];\r
-\r
- this.overlay.setSize(Ext.lib.Dom.getViewWidth(true), Ext.lib.Dom.getViewHeight(true));\r
- this.overlay.show();\r
-\r
- if(this.constrainTo) {\r
- var ct = Ext.get(this.constrainTo);\r
- this.resizeRegion = ct.getRegion().adjust(\r
- ct.getFrameWidth('t'),\r
- ct.getFrameWidth('l'),\r
- -ct.getFrameWidth('b'),\r
- -ct.getFrameWidth('r')\r
- );\r
- }\r
-\r
- this.proxy.setStyle('visibility', 'hidden'); // workaround display none\r
- this.proxy.show();\r
- this.proxy.setBox(this.startBox);\r
- if(!this.dynamic){\r
- this.proxy.setStyle('visibility', 'visible');\r
- }\r
- }\r
- },\r
-\r
- // private\r
- onMouseDown : function(handle, e){\r
- if(this.enabled){\r
- e.stopEvent();\r
- this.activeHandle = handle;\r
- this.startSizing(e, handle);\r
- } \r
- },\r
-\r
- // private\r
- onMouseUp : function(e){\r
- var size = this.resizeElement();\r
- this.resizing = false;\r
- this.handleOut();\r
- this.overlay.hide();\r
- this.proxy.hide();\r
- this.fireEvent("resize", this, size.width, size.height, e);\r
- },\r
-\r
- // private\r
- updateChildSize : function(){\r
- if(this.resizeChild){\r
- var el = this.el;\r
- var child = this.resizeChild;\r
- var adj = this.adjustments;\r
- if(el.dom.offsetWidth){\r
- var b = el.getSize(true);\r
- child.setSize(b.width+adj[0], b.height+adj[1]);\r
- }\r
- // Second call here for IE\r
- // The first call enables instant resizing and\r
- // the second call corrects scroll bars if they\r
- // exist\r
- if(Ext.isIE){\r
- setTimeout(function(){\r
- if(el.dom.offsetWidth){\r
- var b = el.getSize(true);\r
- child.setSize(b.width+adj[0], b.height+adj[1]);\r
- }\r
- }, 10);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- snap : function(value, inc, min){\r
- if(!inc || !value) return value;\r
- var newValue = value;\r
- var m = value % inc;\r
- if(m > 0){\r
- if(m > (inc/2)){\r
- newValue = value + (inc-m);\r
- }else{\r
- newValue = value - m;\r
- }\r
- }\r
- return Math.max(min, newValue);\r
- },\r
-\r
- \r
- resizeElement : function(){\r
- var box = this.proxy.getBox();\r
- if(this.updateBox){\r
- this.el.setBox(box, false, this.animate, this.duration, null, this.easing);\r
- }else{\r
- this.el.setSize(box.width, box.height, this.animate, this.duration, null, this.easing);\r
- }\r
- this.updateChildSize();\r
- if(!this.dynamic){\r
- this.proxy.hide();\r
- }\r
- return box;\r
- },\r
-\r
- // private\r
- constrain : function(v, diff, m, mx){\r
- if(v - diff < m){\r
- diff = v - m; \r
- }else if(v - diff > mx){\r
- diff = mx - v; \r
- }\r
- return diff; \r
- },\r
-\r
- // private\r
- onMouseMove : function(e){\r
- if(this.enabled){\r
- try{// try catch so if something goes wrong the user doesn't get hung\r
-\r
- if(this.resizeRegion && !this.resizeRegion.contains(e.getPoint())) {\r
- return;\r
- }\r
-\r
- //var curXY = this.startPoint;\r
- var curSize = this.curSize || this.startBox;\r
- var x = this.startBox.x, y = this.startBox.y;\r
- var ox = x, oy = y;\r
- var w = curSize.width, h = curSize.height;\r
- var ow = w, oh = h;\r
- var mw = this.minWidth, mh = this.minHeight;\r
- var mxw = this.maxWidth, mxh = this.maxHeight;\r
- var wi = this.widthIncrement;\r
- var hi = this.heightIncrement;\r
- \r
- var eventXY = e.getXY();\r
- var diffX = -(this.startPoint[0] - Math.max(this.minX, eventXY[0]));\r
- var diffY = -(this.startPoint[1] - Math.max(this.minY, eventXY[1]));\r
- \r
- var pos = this.activeHandle.position;\r
- \r
- switch(pos){\r
- case "east":\r
- w += diffX; \r
- w = Math.min(Math.max(mw, w), mxw);\r
- break;\r
- case "south":\r
- h += diffY;\r
- h = Math.min(Math.max(mh, h), mxh);\r
- break;\r
- case "southeast":\r
- w += diffX; \r
- h += diffY;\r
- w = Math.min(Math.max(mw, w), mxw);\r
- h = Math.min(Math.max(mh, h), mxh);\r
- break;\r
- case "north":\r
- diffY = this.constrain(h, diffY, mh, mxh);\r
- y += diffY;\r
- h -= diffY;\r
- break;\r
- case "west":\r
- diffX = this.constrain(w, diffX, mw, mxw);\r
- x += diffX;\r
- w -= diffX;\r
- break;\r
- case "northeast":\r
- w += diffX; \r
- w = Math.min(Math.max(mw, w), mxw);\r
- diffY = this.constrain(h, diffY, mh, mxh);\r
- y += diffY;\r
- h -= diffY;\r
- break;\r
- case "northwest":\r
- diffX = this.constrain(w, diffX, mw, mxw);\r
- diffY = this.constrain(h, diffY, mh, mxh);\r
- y += diffY;\r
- h -= diffY;\r
- x += diffX;\r
- w -= diffX;\r
- break;\r
- case "southwest":\r
- diffX = this.constrain(w, diffX, mw, mxw);\r
- h += diffY;\r
- h = Math.min(Math.max(mh, h), mxh);\r
- x += diffX;\r
- w -= diffX;\r
- break;\r
- }\r
- \r
- var sw = this.snap(w, wi, mw);\r
- var sh = this.snap(h, hi, mh);\r
- if(sw != w || sh != h){\r
- switch(pos){\r
- case "northeast":\r
- y -= sh - h;\r
- break;\r
- case "north":\r
- y -= sh - h;\r
- break;\r
- case "southwest":\r
- x -= sw - w;\r
- break;\r
- case "west":\r
- x -= sw - w;\r
- break;\r
- case "northwest":\r
- x -= sw - w;\r
- y -= sh - h;\r
- break;\r
- }\r
- w = sw;\r
- h = sh;\r
- }\r
- \r
- if(this.preserveRatio){\r
- switch(pos){\r
- case "southeast":\r
- case "east":\r
- h = oh * (w/ow);\r
- h = Math.min(Math.max(mh, h), mxh);\r
- w = ow * (h/oh);\r
- break;\r
- case "south":\r
- w = ow * (h/oh);\r
- w = Math.min(Math.max(mw, w), mxw);\r
- h = oh * (w/ow);\r
- break;\r
- case "northeast":\r
- w = ow * (h/oh);\r
- w = Math.min(Math.max(mw, w), mxw);\r
- h = oh * (w/ow);\r
- break;\r
- case "north":\r
- var tw = w;\r
- w = ow * (h/oh);\r
- w = Math.min(Math.max(mw, w), mxw);\r
- h = oh * (w/ow);\r
- x += (tw - w) / 2;\r
- break;\r
- case "southwest":\r
- h = oh * (w/ow);\r
- h = Math.min(Math.max(mh, h), mxh);\r
- var tw = w;\r
- w = ow * (h/oh);\r
- x += tw - w;\r
- break;\r
- case "west":\r
- var th = h;\r
- h = oh * (w/ow);\r
- h = Math.min(Math.max(mh, h), mxh);\r
- y += (th - h) / 2;\r
- var tw = w;\r
- w = ow * (h/oh);\r
- x += tw - w;\r
- break;\r
- case "northwest":\r
- var tw = w;\r
- var th = h;\r
- h = oh * (w/ow);\r
- h = Math.min(Math.max(mh, h), mxh);\r
- w = ow * (h/oh);\r
- y += th - h;\r
- x += tw - w;\r
- break;\r
- \r
- }\r
- }\r
- this.proxy.setBounds(x, y, w, h);\r
- if(this.dynamic){\r
- this.resizeElement();\r
- }\r
- }catch(e){}\r
- }\r
- },\r
-\r
- // private\r
- handleOver : function(){\r
- if(this.enabled){\r
- this.el.addClass("x-resizable-over");\r
- }\r
- },\r
-\r
- // private\r
- handleOut : function(){\r
- if(!this.resizing){\r
- this.el.removeClass("x-resizable-over");\r
- }\r
- },\r
- \r
- \r
- getEl : function(){\r
- return this.el;\r
- },\r
- \r
- \r
- getResizeChild : function(){\r
- return this.resizeChild;\r
- },\r
- \r
- \r
- destroy : function(removeEl){\r
- if(this.dd){\r
- this.dd.destroy();\r
- }\r
- if(this.overlay){\r
- Ext.destroy(this.overlay);\r
- this.overlay = null;\r
- }\r
- Ext.destroy(this.proxy);\r
- this.proxy = null;\r
- \r
- var ps = Ext.Resizable.positions;\r
- for(var k in ps){\r
- if(typeof ps[k] != "function" && this[ps[k]]){\r
- this[ps[k]].destroy();\r
- }\r
- }\r
- if(removeEl){\r
- this.el.update("");\r
- Ext.destroy(this.el);\r
- this.el = null;\r
- }\r
- },\r
-\r
- syncHandleHeight : function(){\r
- var h = this.el.getHeight(true);\r
- if(this.west){\r
- this.west.el.setHeight(h);\r
- }\r
- if(this.east){\r
- this.east.el.setHeight(h);\r
- }\r
- }\r
-});\r
-\r
-// private\r
-// hash to map config positions to true positions\r
-Ext.Resizable.positions = {\r
- n: "north", s: "south", e: "east", w: "west", se: "southeast", sw: "southwest", nw: "northwest", ne: "northeast"\r
-};\r
-\r
-// private\r
-Ext.Resizable.Handle = function(rz, pos, disableTrackOver, transparent){\r
- if(!this.tpl){\r
- // only initialize the template if resizable is used\r
- var tpl = Ext.DomHelper.createTemplate(\r
- {tag: "div", cls: "x-resizable-handle x-resizable-handle-{0}"}\r
- );\r
- tpl.compile();\r
- Ext.Resizable.Handle.prototype.tpl = tpl;\r
- }\r
- this.position = pos;\r
- this.rz = rz;\r
- this.el = this.tpl.append(rz.el.dom, [this.position], true);\r
- this.el.unselectable();\r
- if(transparent){\r
- this.el.setOpacity(0);\r
- }\r
- this.el.on("mousedown", this.onMouseDown, this);\r
- if(!disableTrackOver){\r
- this.el.on("mouseover", this.onMouseOver, this);\r
- this.el.on("mouseout", this.onMouseOut, this);\r
- }\r
-};\r
-\r
-// private\r
-Ext.Resizable.Handle.prototype = {\r
- // private\r
- afterResize : function(rz){\r
- // do nothing \r
- },\r
- // private\r
- onMouseDown : function(e){\r
- this.rz.onMouseDown(this, e);\r
- },\r
- // private\r
- onMouseOver : function(e){\r
- this.rz.handleOver(this, e);\r
- },\r
- // private\r
- onMouseOut : function(e){\r
- this.rz.handleOut(this, e);\r
- },\r
- // private\r
- destroy : function(){\r
- Ext.destroy(this.el);\r
- this.el = null;\r
- }\r
-};\r
-\r
-\r
-\r
-\r
-\r
-Ext.Editor = function(field, config){\r
- this.field = field;\r
- Ext.Editor.superclass.constructor.call(this, config);\r
-};\r
-\r
-Ext.extend(Ext.Editor, Ext.Component, {\r
- \r
- \r
- \r
- \r
- \r
- value : "",\r
- \r
- alignment: "c-c?",\r
- \r
- shadow : "frame",\r
- \r
- constrain : false,\r
- \r
- swallowKeys : true,\r
- \r
- completeOnEnter : false,\r
- \r
- cancelOnEsc : false,\r
- \r
- updateEl : false,\r
-\r
- initComponent : function(){\r
- Ext.Editor.superclass.initComponent.call(this);\r
- this.addEvents(\r
- \r
- "beforestartedit",\r
- \r
- "startedit",\r
- \r
- "beforecomplete",\r
- \r
- "complete",\r
- \r
- "canceledit",\r
- \r
- "specialkey"\r
- );\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- this.el = new Ext.Layer({\r
- shadow: this.shadow,\r
- cls: "x-editor",\r
- parentEl : ct,\r
- shim : this.shim,\r
- shadowOffset:4,\r
- id: this.id,\r
- constrain: this.constrain\r
- });\r
- this.el.setStyle("overflow", Ext.isGecko ? "auto" : "hidden");\r
- if(this.field.msgTarget != 'title'){\r
- this.field.msgTarget = 'qtip';\r
- }\r
- this.field.inEditor = true;\r
- this.field.render(this.el);\r
- if(Ext.isGecko){\r
- this.field.el.dom.setAttribute('autocomplete', 'off');\r
- }\r
- this.field.on("specialkey", this.onSpecialKey, this);\r
- if(this.swallowKeys){\r
- this.field.el.swallowEvent(['keydown','keypress']);\r
- }\r
- this.field.show();\r
- this.field.on("blur", this.onBlur, this);\r
- if(this.field.grow){\r
- this.field.on("autosize", this.el.sync, this.el, {delay:1});\r
- }\r
- },\r
-\r
- // private\r
- onSpecialKey : function(field, e){\r
- var key = e.getKey();\r
- if(this.completeOnEnter && key == e.ENTER){\r
- e.stopEvent();\r
- this.completeEdit();\r
- }else if(this.cancelOnEsc && key == e.ESC){\r
- this.cancelEdit();\r
- }else{\r
- this.fireEvent('specialkey', field, e);\r
- }\r
- if(this.field.triggerBlur && (key == e.ENTER || key == e.ESC || key == e.TAB)){\r
- this.field.triggerBlur();\r
- }\r
- },\r
-\r
- \r
- startEdit : function(el, value){\r
- if(this.editing){\r
- this.completeEdit();\r
- }\r
- this.boundEl = Ext.get(el);\r
- var v = value !== undefined ? value : this.boundEl.dom.innerHTML;\r
- if(!this.rendered){\r
- this.render(this.parentEl || document.body);\r
- }\r
- if(this.fireEvent("beforestartedit", this, this.boundEl, v) === false){\r
- return;\r
- }\r
- this.startValue = v;\r
- this.field.setValue(v);\r
- this.doAutoSize();\r
- this.el.alignTo(this.boundEl, this.alignment);\r
- this.editing = true;\r
- this.show();\r
- },\r
-\r
- // private\r
- doAutoSize : function(){\r
- if(this.autoSize){\r
- var sz = this.boundEl.getSize();\r
- switch(this.autoSize){\r
- case "width":\r
- this.setSize(sz.width, "");\r
- break;\r
- case "height":\r
- this.setSize("", sz.height);\r
- break;\r
- default:\r
- this.setSize(sz.width, sz.height);\r
- }\r
- }\r
- },\r
-\r
- \r
- setSize : function(w, h){\r
- delete this.field.lastSize;\r
- this.field.setSize(w, h);\r
- if(this.el){\r
- if(Ext.isGecko2 || Ext.isOpera){\r
- // prevent layer scrollbars\r
- this.el.setSize(w, h);\r
- }\r
- this.el.sync();\r
- }\r
- },\r
-\r
- \r
- realign : function(){\r
- this.el.alignTo(this.boundEl, this.alignment);\r
- },\r
-\r
- \r
- completeEdit : function(remainVisible){\r
- if(!this.editing){\r
- return;\r
- }\r
- var v = this.getValue();\r
- if(this.revertInvalid !== false && !this.field.isValid()){\r
- v = this.startValue;\r
- this.cancelEdit(true);\r
- }\r
- if(String(v) === String(this.startValue) && this.ignoreNoChange){\r
- this.editing = false;\r
- this.hide();\r
- return;\r
- }\r
- if(this.fireEvent("beforecomplete", this, v, this.startValue) !== false){\r
- this.editing = false;\r
- if(this.updateEl && this.boundEl){\r
- this.boundEl.update(v);\r
- }\r
- if(remainVisible !== true){\r
- this.hide();\r
- }\r
- this.fireEvent("complete", this, v, this.startValue);\r
- }\r
- },\r
-\r
- // private\r
- onShow : function(){\r
- this.el.show();\r
- if(this.hideEl !== false){\r
- this.boundEl.hide();\r
- }\r
- this.field.show();\r
- if(Ext.isIE && !this.fixIEFocus){ // IE has problems with focusing the first time\r
- this.fixIEFocus = true;\r
- this.deferredFocus.defer(50, this);\r
- }else{\r
- this.field.focus();\r
- }\r
- this.fireEvent("startedit", this.boundEl, this.startValue);\r
- },\r
-\r
- deferredFocus : function(){\r
- if(this.editing){\r
- this.field.focus();\r
- }\r
- },\r
-\r
- \r
- cancelEdit : function(remainVisible){\r
- if(this.editing){\r
- var v = this.getValue();\r
- this.setValue(this.startValue);\r
- if(remainVisible !== true){\r
- this.hide();\r
- }\r
- this.fireEvent("canceledit", this, v, this.startValue);\r
- }\r
- },\r
-\r
- // private\r
- onBlur : function(){\r
- if(this.allowBlur !== true && this.editing){\r
- this.completeEdit();\r
- }\r
- },\r
-\r
- // private\r
- onHide : function(){\r
- if(this.editing){\r
- this.completeEdit();\r
- return;\r
- }\r
- this.field.blur();\r
- if(this.field.collapse){\r
- this.field.collapse();\r
- }\r
- this.el.hide();\r
- if(this.hideEl !== false){\r
- this.boundEl.show();\r
- }\r
- },\r
-\r
- \r
- setValue : function(v){\r
- this.field.setValue(v);\r
- },\r
-\r
- \r
- getValue : function(){\r
- return this.field.getValue();\r
- },\r
-\r
- beforeDestroy : function(){\r
- Ext.destroy(this.field);\r
- this.field = null;\r
- }\r
-});\r
-Ext.reg('editor', Ext.Editor);\r
-\r
-Ext.MessageBox = function(){\r
- var dlg, opt, mask, waitTimer;\r
- var bodyEl, msgEl, textboxEl, textareaEl, progressBar, pp, iconEl, spacerEl;\r
- var buttons, activeTextEl, bwidth, iconCls = '';\r
-\r
- // private\r
- var handleButton = function(button){\r
- if(dlg.isVisible()){\r
- dlg.hide();\r
- Ext.callback(opt.fn, opt.scope||window, [button, activeTextEl.dom.value, opt], 1);\r
- }\r
- };\r
-\r
- // private\r
- var handleHide = function(){\r
- if(opt && opt.cls){\r
- dlg.el.removeClass(opt.cls);\r
- }\r
- progressBar.reset();\r
- };\r
-\r
- // private\r
- var handleEsc = function(d, k, e){\r
- if(opt && opt.closable !== false){\r
- dlg.hide();\r
- }\r
- if(e){\r
- e.stopEvent();\r
- }\r
- };\r
-\r
- // private\r
- var updateButtons = function(b){\r
- var width = 0;\r
- if(!b){\r
- buttons["ok"].hide();\r
- buttons["cancel"].hide();\r
- buttons["yes"].hide();\r
- buttons["no"].hide();\r
- return width;\r
- }\r
- dlg.footer.dom.style.display = '';\r
- for(var k in buttons){\r
- if(typeof buttons[k] != "function"){\r
- if(b[k]){\r
- buttons[k].show();\r
- buttons[k].setText(typeof b[k] == "string" ? b[k] : Ext.MessageBox.buttonText[k]);\r
- width += buttons[k].el.getWidth()+15;\r
- }else{\r
- buttons[k].hide();\r
- }\r
- }\r
- }\r
- return width;\r
- };\r
-\r
- return {\r
- \r
- getDialog : function(titleText){\r
- if(!dlg){\r
- dlg = new Ext.Window({\r
- autoCreate : true,\r
- title:titleText,\r
- resizable:false,\r
- constrain:true,\r
- constrainHeader:true,\r
- minimizable : false,\r
- maximizable : false,\r
- stateful: false,\r
- modal: true,\r
- shim:true,\r
- buttonAlign:"center",\r
- width:400,\r
- height:100,\r
- minHeight: 80,\r
- plain:true,\r
- footer:true,\r
- closable:true,\r
- close : function(){\r
- if(opt && opt.buttons && opt.buttons.no && !opt.buttons.cancel){\r
- handleButton("no");\r
- }else{\r
- handleButton("cancel");\r
- }\r
- }\r
- });\r
- buttons = {};\r
- var bt = this.buttonText;\r
- //TODO: refactor this block into a buttons config to pass into the Window constructor\r
- buttons["ok"] = dlg.addButton(bt["ok"], handleButton.createCallback("ok"));\r
- buttons["yes"] = dlg.addButton(bt["yes"], handleButton.createCallback("yes"));\r
- buttons["no"] = dlg.addButton(bt["no"], handleButton.createCallback("no"));\r
- buttons["cancel"] = dlg.addButton(bt["cancel"], handleButton.createCallback("cancel"));\r
- buttons["ok"].hideMode = buttons["yes"].hideMode = buttons["no"].hideMode = buttons["cancel"].hideMode = 'offsets';\r
- dlg.render(document.body);\r
- dlg.getEl().addClass('x-window-dlg');\r
- mask = dlg.mask;\r
- bodyEl = dlg.body.createChild({\r
- html:'<div class="ext-mb-icon"></div><div class="ext-mb-content"><span class="ext-mb-text"></span><br /><div class="ext-mb-fix-cursor"><input type="text" class="ext-mb-input" /><textarea class="ext-mb-textarea"></textarea></div></div>'\r
- });\r
- iconEl = Ext.get(bodyEl.dom.firstChild);\r
- var contentEl = bodyEl.dom.childNodes[1];\r
- msgEl = Ext.get(contentEl.firstChild);\r
- textboxEl = Ext.get(contentEl.childNodes[2].firstChild);\r
- textboxEl.enableDisplayMode();\r
- textboxEl.addKeyListener([10,13], function(){\r
- if(dlg.isVisible() && opt && opt.buttons){\r
- if(opt.buttons.ok){\r
- handleButton("ok");\r
- }else if(opt.buttons.yes){\r
- handleButton("yes");\r
- }\r
- }\r
- });\r
- textareaEl = Ext.get(contentEl.childNodes[2].childNodes[1]);\r
- textareaEl.enableDisplayMode();\r
- progressBar = new Ext.ProgressBar({\r
- renderTo:bodyEl\r
- });\r
- bodyEl.createChild({cls:'x-clear'});\r
- }\r
- return dlg;\r
- },\r
-\r
- \r
- updateText : function(text){\r
- if(!dlg.isVisible() && !opt.width){\r
- dlg.setSize(this.maxWidth, 100); // resize first so content is never clipped from previous shows\r
- }\r
- msgEl.update(text || ' ');\r
-\r
- var iw = iconCls != '' ? (iconEl.getWidth() + iconEl.getMargins('lr')) : 0;\r
- var mw = msgEl.getWidth() + msgEl.getMargins('lr');\r
- var fw = dlg.getFrameWidth('lr');\r
- var bw = dlg.body.getFrameWidth('lr');\r
- if (Ext.isIE && iw > 0){\r
- //3 pixels get subtracted in the icon CSS for an IE margin issue,\r
- //so we have to add it back here for the overall width to be consistent\r
- iw += 3;\r
- }\r
- var w = Math.max(Math.min(opt.width || iw+mw+fw+bw, this.maxWidth),\r
- Math.max(opt.minWidth || this.minWidth, bwidth || 0));\r
-\r
- if(opt.prompt === true){\r
- activeTextEl.setWidth(w-iw-fw-bw);\r
- }\r
- if(opt.progress === true || opt.wait === true){\r
- progressBar.setSize(w-iw-fw-bw);\r
- }\r
- if(Ext.isIE && w == bwidth){\r
- w += 4; //Add offset when the content width is smaller than the buttons. \r
- }\r
- dlg.setSize(w, 'auto').center();\r
- return this;\r
- },\r
-\r
- \r
- updateProgress : function(value, progressText, msg){\r
- progressBar.updateProgress(value, progressText);\r
- if(msg){\r
- this.updateText(msg);\r
- }\r
- return this;\r
- },\r
-\r
- \r
- isVisible : function(){\r
- return dlg && dlg.isVisible();\r
- },\r
-\r
- \r
- hide : function(){\r
- var proxy = dlg.activeGhost;\r
- if(this.isVisible() || proxy) {\r
- dlg.hide();\r
- handleHide();\r
- if (proxy) {\r
- proxy.hide();\r
- } \r
- }\r
- return this;\r
- },\r
-\r
- \r
- show : function(options){\r
- if(this.isVisible()){\r
- this.hide();\r
- }\r
- opt = options;\r
- var d = this.getDialog(opt.title || " ");\r
-\r
- d.setTitle(opt.title || " ");\r
- var allowClose = (opt.closable !== false && opt.progress !== true && opt.wait !== true);\r
- d.tools.close.setDisplayed(allowClose);\r
- activeTextEl = textboxEl;\r
- opt.prompt = opt.prompt || (opt.multiline ? true : false);\r
- if(opt.prompt){\r
- if(opt.multiline){\r
- textboxEl.hide();\r
- textareaEl.show();\r
- textareaEl.setHeight(typeof opt.multiline == "number" ?\r
- opt.multiline : this.defaultTextHeight);\r
- activeTextEl = textareaEl;\r
- }else{\r
- textboxEl.show();\r
- textareaEl.hide();\r
- }\r
- }else{\r
- textboxEl.hide();\r
- textareaEl.hide();\r
- }\r
- activeTextEl.dom.value = opt.value || "";\r
- if(opt.prompt){\r
- d.focusEl = activeTextEl;\r
- }else{\r
- var bs = opt.buttons;\r
- var db = null;\r
- if(bs && bs.ok){\r
- db = buttons["ok"];\r
- }else if(bs && bs.yes){\r
- db = buttons["yes"];\r
- }\r
- if (db){\r
- d.focusEl = db;\r
- }\r
- }\r
- if(opt.iconCls){\r
- d.setIconClass(opt.iconCls);\r
- }\r
- this.setIcon(opt.icon);\r
- bwidth = updateButtons(opt.buttons);\r
- progressBar.setVisible(opt.progress === true || opt.wait === true);\r
- this.updateProgress(0, opt.progressText);\r
- this.updateText(opt.msg);\r
- if(opt.cls){\r
- d.el.addClass(opt.cls);\r
- }\r
- d.proxyDrag = opt.proxyDrag === true;\r
- d.modal = opt.modal !== false;\r
- d.mask = opt.modal !== false ? mask : false;\r
- if(!d.isVisible()){\r
- // force it to the end of the z-index stack so it gets a cursor in FF\r
- document.body.appendChild(dlg.el.dom);\r
- d.setAnimateTarget(opt.animEl);\r
- d.show(opt.animEl);\r
- }\r
-\r
- //workaround for window internally enabling keymap in afterShow\r
- d.on('show', function(){\r
- if(allowClose === true){\r
- d.keyMap.enable();\r
- }else{\r
- d.keyMap.disable();\r
- }\r
- }, this, {single:true});\r
-\r
- if(opt.wait === true){\r
- progressBar.wait(opt.waitConfig);\r
- }\r
- return this;\r
- },\r
-\r
- \r
- setIcon : function(icon){\r
- if(icon && icon != ''){\r
- iconEl.removeClass('x-hidden');\r
- iconEl.replaceClass(iconCls, icon);\r
- iconCls = icon;\r
- }else{\r
- iconEl.replaceClass(iconCls, 'x-hidden');\r
- iconCls = '';\r
- }\r
- return this;\r
- },\r
-\r
- \r
- progress : function(title, msg, progressText){\r
- this.show({\r
- title : title,\r
- msg : msg,\r
- buttons: false,\r
- progress:true,\r
- closable:false,\r
- minWidth: this.minProgressWidth,\r
- progressText: progressText\r
- });\r
- return this;\r
- },\r
-\r
- \r
- wait : function(msg, title, config){\r
- this.show({\r
- title : title,\r
- msg : msg,\r
- buttons: false,\r
- closable:false,\r
- wait:true,\r
- modal:true,\r
- minWidth: this.minProgressWidth,\r
- waitConfig: config\r
- });\r
- return this;\r
- },\r
-\r
- \r
- alert : function(title, msg, fn, scope){\r
- this.show({\r
- title : title,\r
- msg : msg,\r
- buttons: this.OK,\r
- fn: fn,\r
- scope : scope\r
- });\r
- return this;\r
- },\r
-\r
- \r
- confirm : function(title, msg, fn, scope){\r
- this.show({\r
- title : title,\r
- msg : msg,\r
- buttons: this.YESNO,\r
- fn: fn,\r
- scope : scope,\r
- icon: this.QUESTION\r
- });\r
- return this;\r
- },\r
-\r
- \r
- prompt : function(title, msg, fn, scope, multiline, value){\r
- this.show({\r
- title : title,\r
- msg : msg,\r
- buttons: this.OKCANCEL,\r
- fn: fn,\r
- minWidth:250,\r
- scope : scope,\r
- prompt:true,\r
- multiline: multiline,\r
- value: value\r
- });\r
- return this;\r
- },\r
-\r
- \r
- OK : {ok:true},\r
- \r
- CANCEL : {cancel:true},\r
- \r
- OKCANCEL : {ok:true, cancel:true},\r
- \r
- YESNO : {yes:true, no:true},\r
- \r
- YESNOCANCEL : {yes:true, no:true, cancel:true},\r
- \r
- INFO : 'ext-mb-info',\r
- \r
- WARNING : 'ext-mb-warning',\r
- \r
- QUESTION : 'ext-mb-question',\r
- \r
- ERROR : 'ext-mb-error',\r
-\r
- \r
- defaultTextHeight : 75,\r
- \r
- maxWidth : 600,\r
- \r
- minWidth : 100,\r
- \r
- minProgressWidth : 250,\r
- \r
- buttonText : {\r
- ok : "OK",\r
- cancel : "Cancel",\r
- yes : "Yes",\r
- no : "No"\r
- }\r
- };\r
-}();\r
-\r
-\r
-Ext.Msg = Ext.MessageBox;\r
-\r
-Ext.Tip = Ext.extend(Ext.Panel, {\r
- \r
- \r
- \r
- minWidth : 40,\r
- \r
- maxWidth : 300,\r
- \r
- shadow : "sides",\r
- \r
- defaultAlign : "tl-bl?",\r
- autoRender: true,\r
- quickShowInterval : 250,\r
-\r
- // private panel overrides\r
- frame:true,\r
- hidden:true,\r
- baseCls: 'x-tip',\r
- floating:{shadow:true,shim:true,useDisplay:true,constrain:false},\r
- autoHeight:true,\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.Tip.superclass.initComponent.call(this);\r
- if(this.closable && !this.title){\r
- this.elements += ',header';\r
- }\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.Tip.superclass.afterRender.call(this);\r
- if(this.closable){\r
- this.addTool({\r
- id: 'close',\r
- handler: this.hide,\r
- scope: this\r
- });\r
- }\r
- },\r
-\r
- \r
- showAt : function(xy){\r
- Ext.Tip.superclass.show.call(this);\r
- if(this.measureWidth !== false && (!this.initialConfig || typeof this.initialConfig.width != 'number')){\r
- this.doAutoWidth();\r
- }\r
- if(this.constrainPosition){\r
- xy = this.el.adjustForConstraints(xy);\r
- }\r
- this.setPagePosition(xy[0], xy[1]);\r
- },\r
-\r
- // protected\r
- doAutoWidth : function(){\r
- var bw = this.body.getTextWidth();\r
- if(this.title){\r
- bw = Math.max(bw, this.header.child('span').getTextWidth(this.title));\r
- }\r
- bw += this.getFrameWidth() + (this.closable ? 20 : 0) + this.body.getPadding("lr");\r
- this.setWidth(bw.constrain(this.minWidth, this.maxWidth));\r
- \r
- // IE7 repaint bug on initial show\r
- if(Ext.isIE7 && !this.repainted){\r
- this.el.repaint();\r
- this.repainted = true;\r
- }\r
- },\r
-\r
- \r
- showBy : function(el, pos){\r
- if(!this.rendered){\r
- this.render(Ext.getBody());\r
- }\r
- this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign));\r
- },\r
-\r
- initDraggable : function(){\r
- this.dd = new Ext.Tip.DD(this, typeof this.draggable == 'boolean' ? null : this.draggable);\r
- this.header.addClass('x-tip-draggable');\r
- }\r
-});\r
-\r
-// private - custom Tip DD implementation\r
-Ext.Tip.DD = function(tip, config){\r
- Ext.apply(this, config);\r
- this.tip = tip;\r
- Ext.Tip.DD.superclass.constructor.call(this, tip.el.id, 'WindowDD-'+tip.id);\r
- this.setHandleElId(tip.header.id);\r
- this.scroll = false;\r
-};\r
-\r
-Ext.extend(Ext.Tip.DD, Ext.dd.DD, {\r
- moveOnly:true,\r
- scroll:false,\r
- headerOffsets:[100, 25],\r
- startDrag : function(){\r
- this.tip.el.disableShadow();\r
- },\r
- endDrag : function(e){\r
- this.tip.el.enableShadow(true);\r
- }\r
-});\r
-\r
-Ext.ToolTip = Ext.extend(Ext.Tip, {\r
- \r
- \r
- \r
- showDelay: 500,\r
- \r
- hideDelay: 200,\r
- \r
- dismissDelay: 5000,\r
- \r
- mouseOffset: [15,18],\r
- \r
- trackMouse : false,\r
- constrainPosition: true,\r
-\r
- // private\r
- initComponent: function(){\r
- Ext.ToolTip.superclass.initComponent.call(this);\r
- this.lastActive = new Date();\r
- this.initTarget();\r
- },\r
-\r
- // private\r
- initTarget : function(){\r
- if(this.target){\r
- this.target = Ext.get(this.target);\r
- this.target.on('mouseover', this.onTargetOver, this);\r
- this.target.on('mouseout', this.onTargetOut, this);\r
- this.target.on('mousemove', this.onMouseMove, this);\r
- }\r
- },\r
-\r
- // private\r
- onMouseMove : function(e){\r
- this.targetXY = e.getXY();\r
- if(!this.hidden && this.trackMouse){\r
- this.setPagePosition(this.getTargetXY());\r
- }\r
- },\r
-\r
- // private\r
- getTargetXY : function(){\r
- return [this.targetXY[0]+this.mouseOffset[0], this.targetXY[1]+this.mouseOffset[1]];\r
- },\r
-\r
- // private\r
- onTargetOver : function(e){\r
- if(this.disabled || e.within(this.target.dom, true)){\r
- return;\r
- }\r
- this.clearTimer('hide');\r
- this.targetXY = e.getXY();\r
- this.delayShow();\r
- },\r
-\r
- // private\r
- delayShow : function(){\r
- if(this.hidden && !this.showTimer){\r
- if(this.lastActive.getElapsed() < this.quickShowInterval){\r
- this.show();\r
- }else{\r
- this.showTimer = this.show.defer(this.showDelay, this);\r
- }\r
- }else if(!this.hidden && this.autoHide !== false){\r
- this.show();\r
- }\r
- },\r
-\r
- // private\r
- onTargetOut : function(e){\r
- if(this.disabled || e.within(this.target.dom, true)){\r
- return;\r
- }\r
- this.clearTimer('show');\r
- if(this.autoHide !== false){\r
- this.delayHide();\r
- }\r
- },\r
-\r
- // private\r
- delayHide : function(){\r
- if(!this.hidden && !this.hideTimer){\r
- this.hideTimer = this.hide.defer(this.hideDelay, this);\r
- }\r
- },\r
-\r
- \r
- hide: function(){\r
- this.clearTimer('dismiss');\r
- this.lastActive = new Date();\r
- Ext.ToolTip.superclass.hide.call(this);\r
- },\r
-\r
- \r
- show : function(){\r
- this.showAt(this.getTargetXY());\r
- },\r
-\r
- // inherit docs\r
- showAt : function(xy){\r
- this.lastActive = new Date();\r
- this.clearTimers();\r
- Ext.ToolTip.superclass.showAt.call(this, xy);\r
- if(this.dismissDelay && this.autoHide !== false){\r
- this.dismissTimer = this.hide.defer(this.dismissDelay, this);\r
- }\r
- },\r
-\r
- // private\r
- clearTimer : function(name){\r
- name = name + 'Timer';\r
- clearTimeout(this[name]);\r
- delete this[name];\r
- },\r
-\r
- // private\r
- clearTimers : function(){\r
- this.clearTimer('show');\r
- this.clearTimer('dismiss');\r
- this.clearTimer('hide');\r
- },\r
-\r
- // private\r
- onShow : function(){\r
- Ext.ToolTip.superclass.onShow.call(this);\r
- Ext.getDoc().on('mousedown', this.onDocMouseDown, this);\r
- },\r
-\r
- // private\r
- onHide : function(){\r
- Ext.ToolTip.superclass.onHide.call(this);\r
- Ext.getDoc().un('mousedown', this.onDocMouseDown, this);\r
- },\r
-\r
- // private\r
- onDocMouseDown : function(e){\r
- if(this.autoHide !== false && !e.within(this.el.dom)){\r
- this.disable();\r
- this.enable.defer(100, this);\r
- }\r
- },\r
-\r
- // private\r
- onDisable : function(){\r
- this.clearTimers();\r
- this.hide();\r
- },\r
-\r
- // private\r
- adjustPosition : function(x, y){\r
- // keep the position from being under the mouse\r
- var ay = this.targetXY[1], h = this.getSize().height;\r
- if(this.constrainPosition && y <= ay && (y+h) >= ay){\r
- y = ay-h-5;\r
- }\r
- return {x : x, y: y};\r
- },\r
-\r
- // private\r
- onDestroy : function(){\r
- Ext.ToolTip.superclass.onDestroy.call(this);\r
- if(this.target){\r
- this.target.un('mouseover', this.onTargetOver, this);\r
- this.target.un('mouseout', this.onTargetOut, this);\r
- this.target.un('mousemove', this.onMouseMove, this);\r
- }\r
- }\r
-});\r
-\r
-Ext.QuickTip = Ext.extend(Ext.ToolTip, {\r
- \r
- \r
- interceptTitles : false,\r
-\r
- // private\r
- tagConfig : {\r
- namespace : "ext",\r
- attribute : "qtip",\r
- width : "qwidth",\r
- target : "target",\r
- title : "qtitle",\r
- hide : "hide",\r
- cls : "qclass",\r
- align : "qalign"\r
- },\r
-\r
- // private\r
- initComponent : function(){\r
- this.target = this.target || Ext.getDoc();\r
- this.targets = this.targets || {};\r
- Ext.QuickTip.superclass.initComponent.call(this);\r
- },\r
-\r
- \r
- register : function(config){\r
- var cs = Ext.isArray(config) ? config : arguments;\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- var c = cs[i];\r
- var target = c.target;\r
- if(target){\r
- if(Ext.isArray(target)){\r
- for(var j = 0, jlen = target.length; j < jlen; j++){\r
- this.targets[Ext.id(target[j])] = c;\r
- }\r
- } else{\r
- this.targets[Ext.id(target)] = c;\r
- }\r
- }\r
- }\r
- },\r
-\r
- \r
- unregister : function(el){\r
- delete this.targets[Ext.id(el)];\r
- },\r
-\r
- // private\r
- onTargetOver : function(e){\r
- if(this.disabled){\r
- return;\r
- }\r
- this.targetXY = e.getXY();\r
- var t = e.getTarget();\r
- if(!t || t.nodeType !== 1 || t == document || t == document.body){\r
- return;\r
- }\r
- if(this.activeTarget && t == this.activeTarget.el){\r
- this.clearTimer('hide');\r
- this.show();\r
- return;\r
- }\r
- if(t && this.targets[t.id]){\r
- this.activeTarget = this.targets[t.id];\r
- this.activeTarget.el = t;\r
- this.delayShow();\r
- return;\r
- }\r
- var ttp, et = Ext.fly(t), cfg = this.tagConfig;\r
- var ns = cfg.namespace;\r
- if(this.interceptTitles && t.title){\r
- ttp = t.title;\r
- t.qtip = ttp;\r
- t.removeAttribute("title");\r
- e.preventDefault();\r
- } else{\r
- ttp = t.qtip || et.getAttributeNS(ns, cfg.attribute);\r
- }\r
- if(ttp){\r
- var autoHide = et.getAttributeNS(ns, cfg.hide);\r
- this.activeTarget = {\r
- el: t,\r
- text: ttp,\r
- width: et.getAttributeNS(ns, cfg.width),\r
- autoHide: autoHide != "user" && autoHide !== 'false',\r
- title: et.getAttributeNS(ns, cfg.title),\r
- cls: et.getAttributeNS(ns, cfg.cls),\r
- align: et.getAttributeNS(ns, cfg.align)\r
- };\r
- this.delayShow();\r
- }\r
- },\r
-\r
- // private\r
- onTargetOut : function(e){\r
- this.clearTimer('show');\r
- if(this.autoHide !== false){\r
- this.delayHide();\r
- }\r
- },\r
-\r
- // inherit docs\r
- showAt : function(xy){\r
- var t = this.activeTarget;\r
- if(t){\r
- if(!this.rendered){\r
- this.render(Ext.getBody());\r
- this.activeTarget = t;\r
- }\r
- if(t.width){\r
- this.setWidth(t.width);\r
- this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth()));\r
- this.measureWidth = false;\r
- } else{\r
- this.measureWidth = true;\r
- }\r
- this.setTitle(t.title || '');\r
- this.body.update(t.text);\r
- this.autoHide = t.autoHide;\r
- this.dismissDelay = t.dismissDelay || this.dismissDelay;\r
- if(this.lastCls){\r
- this.el.removeClass(this.lastCls);\r
- delete this.lastCls;\r
- }\r
- if(t.cls){\r
- this.el.addClass(t.cls);\r
- this.lastCls = t.cls;\r
- }\r
- if(t.align){ // TODO: this doesn't seem to work consistently\r
- xy = this.el.getAlignToXY(t.el, t.align);\r
- this.constrainPosition = false;\r
- } else{\r
- this.constrainPosition = true;\r
- }\r
- }\r
- Ext.QuickTip.superclass.showAt.call(this, xy);\r
- },\r
-\r
- // inherit docs\r
- hide: function(){\r
- delete this.activeTarget;\r
- Ext.QuickTip.superclass.hide.call(this);\r
- }\r
-});\r
-\r
-Ext.QuickTips = function(){\r
- var tip, locks = [];\r
- return {\r
- \r
- init : function(autoRender){\r
- if(!tip){\r
- if(!Ext.isReady){\r
- Ext.onReady(function(){\r
- Ext.QuickTips.init(autoRender);\r
- });\r
- return;\r
- }\r
- tip = new Ext.QuickTip({elements:'header,body'});\r
- if(autoRender !== false){\r
- tip.render(Ext.getBody());\r
- }\r
- }\r
- },\r
-\r
- \r
- enable : function(){\r
- if(tip){\r
- locks.pop();\r
- if(locks.length < 1){\r
- tip.enable();\r
- }\r
- }\r
- },\r
-\r
- \r
- disable : function(){\r
- if(tip){\r
- tip.disable();\r
- }\r
- locks.push(1);\r
- },\r
-\r
- \r
- isEnabled : function(){\r
- return tip !== undefined && !tip.disabled;\r
- },\r
-\r
- \r
- getQuickTip : function(){\r
- return tip;\r
- },\r
-\r
- \r
- register : function(){\r
- tip.register.apply(tip, arguments);\r
- },\r
-\r
- \r
- unregister : function(){\r
- tip.unregister.apply(tip, arguments);\r
- },\r
-\r
- \r
- tips :function(){\r
- tip.register.apply(tip, arguments);\r
- }\r
- }\r
-}();\r
-\r
-Ext.tree.TreePanel = Ext.extend(Ext.Panel, {\r
- rootVisible : true,\r
- animate: Ext.enableFx,\r
- lines : true,\r
- enableDD : false,\r
- hlDrop : Ext.enableFx,\r
- pathSeparator: "/",\r
-\r
- initComponent : function(){\r
- Ext.tree.TreePanel.superclass.initComponent.call(this);\r
-\r
- if(!this.eventModel){\r
- this.eventModel = new Ext.tree.TreeEventModel(this);\r
- }\r
- \r
- // initialize the loader\r
- var l = this.loader;\r
- if(!l){\r
- l = new Ext.tree.TreeLoader({\r
- dataUrl: this.dataUrl\r
- });\r
- }else if(typeof l == 'object' && !l.load){\r
- l = new Ext.tree.TreeLoader(l);\r
- }\r
- this.loader = l;\r
- \r
- this.nodeHash = {};\r
-\r
- \r
- if(this.root){\r
- this.setRootNode(this.root);\r
- }\r
-\r
- this.addEvents(\r
-\r
- \r
- "append",\r
- \r
- "remove",\r
- \r
- "movenode",\r
- \r
- "insert",\r
- \r
- "beforeappend",\r
- \r
- "beforeremove",\r
- \r
- "beforemovenode",\r
- \r
- "beforeinsert",\r
-\r
- \r
- "beforeload",\r
- \r
- "load",\r
- \r
- "textchange",\r
- \r
- "beforeexpandnode",\r
- \r
- "beforecollapsenode",\r
- \r
- "expandnode",\r
- \r
- "disabledchange",\r
- \r
- "collapsenode",\r
- \r
- "beforeclick",\r
- \r
- "click",\r
- \r
- "checkchange",\r
- \r
- "dblclick",\r
- \r
- "contextmenu",\r
- \r
- "beforechildrenrendered",\r
- \r
- "startdrag",\r
- \r
- "enddrag",\r
- \r
- "dragdrop",\r
- \r
- "beforenodedrop",\r
- \r
- "nodedrop",\r
- \r
- "nodedragover"\r
- );\r
- if(this.singleExpand){\r
- this.on("beforeexpandnode", this.restrictExpand, this);\r
- }\r
- },\r
-\r
- // private\r
- proxyNodeEvent : function(ename, a1, a2, a3, a4, a5, a6){\r
- if(ename == 'collapse' || ename == 'expand' || ename == 'beforecollapse' || ename == 'beforeexpand' || ename == 'move' || ename == 'beforemove'){\r
- ename = ename+'node';\r
- }\r
- // args inline for performance while bubbling events\r
- return this.fireEvent(ename, a1, a2, a3, a4, a5, a6);\r
- },\r
-\r
-\r
- \r
- getRootNode : function(){\r
- return this.root;\r
- },\r
-\r
- \r
- setRootNode : function(node){\r
- if(!node.render){ // attributes passed\r
- node = this.loader.createNode(node);\r
- }\r
- this.root = node;\r
- node.ownerTree = this;\r
- node.isRoot = true;\r
- this.registerNode(node);\r
- if(!this.rootVisible){\r
- var uiP = node.attributes.uiProvider;\r
- node.ui = uiP ? new uiP(node) : new Ext.tree.RootTreeNodeUI(node); \r
- }\r
- return node;\r
- },\r
-\r
- \r
- getNodeById : function(id){\r
- return this.nodeHash[id];\r
- },\r
-\r
- // private\r
- registerNode : function(node){\r
- this.nodeHash[node.id] = node;\r
- },\r
-\r
- // private\r
- unregisterNode : function(node){\r
- delete this.nodeHash[node.id];\r
- },\r
-\r
- // private\r
- toString : function(){\r
- return "[Tree"+(this.id?" "+this.id:"")+"]";\r
- },\r
-\r
- // private\r
- restrictExpand : function(node){\r
- var p = node.parentNode;\r
- if(p){\r
- if(p.expandedChild && p.expandedChild.parentNode == p){\r
- p.expandedChild.collapse();\r
- }\r
- p.expandedChild = node;\r
- }\r
- },\r
-\r
- \r
- getChecked : function(a, startNode){\r
- startNode = startNode || this.root;\r
- var r = [];\r
- var f = function(){\r
- if(this.attributes.checked){\r
- r.push(!a ? this : (a == 'id' ? this.id : this.attributes[a]));\r
- }\r
- }\r
- startNode.cascade(f);\r
- return r;\r
- },\r
-\r
- \r
- getEl : function(){\r
- return this.el;\r
- },\r
-\r
- \r
- getLoader : function(){\r
- return this.loader;\r
- },\r
-\r
- \r
- expandAll : function(){\r
- this.root.expand(true);\r
- },\r
-\r
- \r
- collapseAll : function(){\r
- this.root.collapse(true);\r
- },\r
-\r
- \r
- getSelectionModel : function(){\r
- if(!this.selModel){\r
- this.selModel = new Ext.tree.DefaultSelectionModel();\r
- }\r
- return this.selModel;\r
- },\r
-\r
- \r
- expandPath : function(path, attr, callback){\r
- attr = attr || "id";\r
- var keys = path.split(this.pathSeparator);\r
- var curNode = this.root;\r
- if(curNode.attributes[attr] != keys[1]){ // invalid root\r
- if(callback){\r
- callback(false, null);\r
- }\r
- return;\r
- }\r
- var index = 1;\r
- var f = function(){\r
- if(++index == keys.length){\r
- if(callback){\r
- callback(true, curNode);\r
- }\r
- return;\r
- }\r
- var c = curNode.findChild(attr, keys[index]);\r
- if(!c){\r
- if(callback){\r
- callback(false, curNode);\r
- }\r
- return;\r
- }\r
- curNode = c;\r
- c.expand(false, false, f);\r
- };\r
- curNode.expand(false, false, f);\r
- },\r
-\r
- \r
- selectPath : function(path, attr, callback){\r
- attr = attr || "id";\r
- var keys = path.split(this.pathSeparator);\r
- var v = keys.pop();\r
- if(keys.length > 0){\r
- var f = function(success, node){\r
- if(success && node){\r
- var n = node.findChild(attr, v);\r
- if(n){\r
- n.select();\r
- if(callback){\r
- callback(true, n);\r
- }\r
- }else if(callback){\r
- callback(false, n);\r
- }\r
- }else{\r
- if(callback){\r
- callback(false, n);\r
- }\r
- }\r
- };\r
- this.expandPath(keys.join(this.pathSeparator), attr, f);\r
- }else{\r
- this.root.select();\r
- if(callback){\r
- callback(true, this.root);\r
- }\r
- }\r
- },\r
-\r
- \r
- getTreeEl : function(){\r
- return this.body;\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.tree.TreePanel.superclass.onRender.call(this, ct, position);\r
- this.el.addClass('x-tree');\r
- this.innerCt = this.body.createChild({tag:"ul",\r
- cls:"x-tree-root-ct " +\r
- (this.useArrows ? 'x-tree-arrows' : this.lines ? "x-tree-lines" : "x-tree-no-lines")});\r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- Ext.tree.TreePanel.superclass.initEvents.call(this);\r
-\r
- if(this.containerScroll){\r
- Ext.dd.ScrollManager.register(this.body);\r
- }\r
- if((this.enableDD || this.enableDrop) && !this.dropZone){\r
- \r
- this.dropZone = new Ext.tree.TreeDropZone(this, this.dropConfig || {\r
- ddGroup: this.ddGroup || "TreeDD", appendOnly: this.ddAppendOnly === true\r
- });\r
- }\r
- if((this.enableDD || this.enableDrag) && !this.dragZone){\r
- \r
- this.dragZone = new Ext.tree.TreeDragZone(this, this.dragConfig || {\r
- ddGroup: this.ddGroup || "TreeDD",\r
- scroll: this.ddScroll\r
- });\r
- }\r
- this.getSelectionModel().init(this);\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.tree.TreePanel.superclass.afterRender.call(this);\r
- this.root.render();\r
- if(!this.rootVisible){\r
- this.root.renderChildren();\r
- }\r
- },\r
-\r
- onDestroy : function(){\r
- if(this.rendered){\r
- this.body.removeAllListeners();\r
- Ext.dd.ScrollManager.unregister(this.body);\r
- if(this.dropZone){\r
- this.dropZone.unreg();\r
- }\r
- if(this.dragZone){\r
- this.dragZone.unreg();\r
- }\r
- }\r
- this.root.destroy();\r
- this.nodeHash = null;\r
- Ext.tree.TreePanel.superclass.onDestroy.call(this);\r
- }\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
-\r
-\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-});\r
-\r
-Ext.tree.TreePanel.nodeTypes = {};\r
-\r
-Ext.reg('treepanel', Ext.tree.TreePanel);\r
-Ext.tree.TreeEventModel = function(tree){\r
- this.tree = tree;\r
- this.tree.on('render', this.initEvents, this);\r
-}\r
-\r
-Ext.tree.TreeEventModel.prototype = {\r
- initEvents : function(){\r
- var el = this.tree.getTreeEl();\r
- el.on('click', this.delegateClick, this);\r
- if(this.tree.trackMouseOver !== false){\r
- el.on('mouseover', this.delegateOver, this);\r
- el.on('mouseout', this.delegateOut, this);\r
- }\r
- el.on('dblclick', this.delegateDblClick, this);\r
- el.on('contextmenu', this.delegateContextMenu, this);\r
- },\r
-\r
- getNode : function(e){\r
- var t;\r
- if(t = e.getTarget('.x-tree-node-el', 10)){\r
- var id = Ext.fly(t, '_treeEvents').getAttributeNS('ext', 'tree-node-id');\r
- if(id){\r
- return this.tree.getNodeById(id);\r
- }\r
- }\r
- return null;\r
- },\r
-\r
- getNodeTarget : function(e){\r
- var t = e.getTarget('.x-tree-node-icon', 1);\r
- if(!t){\r
- t = e.getTarget('.x-tree-node-el', 6);\r
- }\r
- return t;\r
- },\r
-\r
- delegateOut : function(e, t){\r
- if(!this.beforeEvent(e)){\r
- return;\r
- }\r
- if(e.getTarget('.x-tree-ec-icon', 1)){\r
- var n = this.getNode(e);\r
- this.onIconOut(e, n);\r
- if(n == this.lastEcOver){\r
- delete this.lastEcOver;\r
- }\r
- }\r
- if((t = this.getNodeTarget(e)) && !e.within(t, true)){\r
- this.onNodeOut(e, this.getNode(e));\r
- }\r
- },\r
-\r
- delegateOver : function(e, t){\r
- if(!this.beforeEvent(e)){\r
- return;\r
- }\r
- if(this.lastEcOver){ // prevent hung highlight\r
- this.onIconOut(e, this.lastEcOver);\r
- delete this.lastEcOver;\r
- }\r
- if(e.getTarget('.x-tree-ec-icon', 1)){\r
- this.lastEcOver = this.getNode(e);\r
- this.onIconOver(e, this.lastEcOver);\r
- }\r
- if(t = this.getNodeTarget(e)){\r
- this.onNodeOver(e, this.getNode(e));\r
- }\r
- },\r
-\r
- delegateClick : function(e, t){\r
- if(!this.beforeEvent(e)){\r
- return;\r
- }\r
-\r
- if(e.getTarget('input[type=checkbox]', 1)){\r
- this.onCheckboxClick(e, this.getNode(e));\r
- }\r
- else if(e.getTarget('.x-tree-ec-icon', 1)){\r
- this.onIconClick(e, this.getNode(e));\r
- }\r
- else if(this.getNodeTarget(e)){\r
- this.onNodeClick(e, this.getNode(e));\r
- }\r
- },\r
-\r
- delegateDblClick : function(e, t){\r
- if(this.beforeEvent(e) && this.getNodeTarget(e)){\r
- this.onNodeDblClick(e, this.getNode(e));\r
- }\r
- },\r
-\r
- delegateContextMenu : function(e, t){\r
- if(this.beforeEvent(e) && this.getNodeTarget(e)){\r
- this.onNodeContextMenu(e, this.getNode(e));\r
- }\r
- },\r
-\r
- onNodeClick : function(e, node){\r
- node.ui.onClick(e);\r
- },\r
-\r
- onNodeOver : function(e, node){\r
- node.ui.onOver(e);\r
- },\r
-\r
- onNodeOut : function(e, node){\r
- node.ui.onOut(e);\r
- },\r
-\r
- onIconOver : function(e, node){\r
- node.ui.addClass('x-tree-ec-over');\r
- },\r
-\r
- onIconOut : function(e, node){\r
- node.ui.removeClass('x-tree-ec-over');\r
- },\r
-\r
- onIconClick : function(e, node){\r
- node.ui.ecClick(e);\r
- },\r
-\r
- onCheckboxClick : function(e, node){\r
- node.ui.onCheckChange(e);\r
- },\r
-\r
- onNodeDblClick : function(e, node){\r
- node.ui.onDblClick(e);\r
- },\r
-\r
- onNodeContextMenu : function(e, node){\r
- node.ui.onContextMenu(e);\r
- },\r
-\r
- beforeEvent : function(e){\r
- if(this.disabled){\r
- e.stopEvent();\r
- return false;\r
- }\r
- return true;\r
- },\r
-\r
- disable: function(){\r
- this.disabled = true;\r
- },\r
-\r
- enable: function(){\r
- this.disabled = false;\r
- }\r
-};\r
-\r
-Ext.tree.DefaultSelectionModel = function(config){\r
- this.selNode = null;\r
- \r
- this.addEvents(\r
- \r
- "selectionchange",\r
-\r
- \r
- "beforeselect"\r
- );\r
-\r
- Ext.apply(this, config);\r
- Ext.tree.DefaultSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.tree.DefaultSelectionModel, Ext.util.Observable, {\r
- init : function(tree){\r
- this.tree = tree;\r
- tree.getTreeEl().on("keydown", this.onKeyDown, this);\r
- tree.on("click", this.onNodeClick, this);\r
- },\r
- \r
- onNodeClick : function(node, e){\r
- this.select(node);\r
- },\r
- \r
- \r
- select : function(node){\r
- var last = this.selNode;\r
- if(last != node && this.fireEvent('beforeselect', this, node, last) !== false){\r
- if(last){\r
- last.ui.onSelectedChange(false);\r
- }\r
- this.selNode = node;\r
- node.ui.onSelectedChange(true);\r
- this.fireEvent("selectionchange", this, node, last);\r
- }\r
- return node;\r
- },\r
- \r
- \r
- unselect : function(node){\r
- if(this.selNode == node){\r
- this.clearSelections();\r
- } \r
- },\r
- \r
- \r
- clearSelections : function(){\r
- var n = this.selNode;\r
- if(n){\r
- n.ui.onSelectedChange(false);\r
- this.selNode = null;\r
- this.fireEvent("selectionchange", this, null);\r
- }\r
- return n;\r
- },\r
- \r
- \r
- getSelectedNode : function(){\r
- return this.selNode; \r
- },\r
- \r
- \r
- isSelected : function(node){\r
- return this.selNode == node; \r
- },\r
-\r
- \r
- selectPrevious : function(){\r
- var s = this.selNode || this.lastSelNode;\r
- if(!s){\r
- return null;\r
- }\r
- var ps = s.previousSibling;\r
- if(ps){\r
- if(!ps.isExpanded() || ps.childNodes.length < 1){\r
- return this.select(ps);\r
- } else{\r
- var lc = ps.lastChild;\r
- while(lc && lc.isExpanded() && lc.childNodes.length > 0){\r
- lc = lc.lastChild;\r
- }\r
- return this.select(lc);\r
- }\r
- } else if(s.parentNode && (this.tree.rootVisible || !s.parentNode.isRoot)){\r
- return this.select(s.parentNode);\r
- }\r
- return null;\r
- },\r
-\r
- \r
- selectNext : function(){\r
- var s = this.selNode || this.lastSelNode;\r
- if(!s){\r
- return null;\r
- }\r
- if(s.firstChild && s.isExpanded()){\r
- return this.select(s.firstChild);\r
- }else if(s.nextSibling){\r
- return this.select(s.nextSibling);\r
- }else if(s.parentNode){\r
- var newS = null;\r
- s.parentNode.bubble(function(){\r
- if(this.nextSibling){\r
- newS = this.getOwnerTree().selModel.select(this.nextSibling);\r
- return false;\r
- }\r
- });\r
- return newS;\r
- }\r
- return null;\r
- },\r
-\r
- onKeyDown : function(e){\r
- var s = this.selNode || this.lastSelNode;\r
- // undesirable, but required\r
- var sm = this;\r
- if(!s){\r
- return;\r
- }\r
- var k = e.getKey();\r
- switch(k){\r
- case e.DOWN:\r
- e.stopEvent();\r
- this.selectNext();\r
- break;\r
- case e.UP:\r
- e.stopEvent();\r
- this.selectPrevious();\r
- break;\r
- case e.RIGHT:\r
- e.preventDefault();\r
- if(s.hasChildNodes()){\r
- if(!s.isExpanded()){\r
- s.expand();\r
- }else if(s.firstChild){\r
- this.select(s.firstChild, e);\r
- }\r
- }\r
- break;\r
- case e.LEFT:\r
- e.preventDefault();\r
- if(s.hasChildNodes() && s.isExpanded()){\r
- s.collapse();\r
- }else if(s.parentNode && (this.tree.rootVisible || s.parentNode != this.tree.getRootNode())){\r
- this.select(s.parentNode, e);\r
- }\r
- break;\r
- };\r
- }\r
-});\r
-\r
-\r
-Ext.tree.MultiSelectionModel = function(config){\r
- this.selNodes = [];\r
- this.selMap = {};\r
- this.addEvents(\r
- \r
- "selectionchange"\r
- );\r
- Ext.apply(this, config);\r
- Ext.tree.MultiSelectionModel.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.tree.MultiSelectionModel, Ext.util.Observable, {\r
- init : function(tree){\r
- this.tree = tree;\r
- tree.getTreeEl().on("keydown", this.onKeyDown, this);\r
- tree.on("click", this.onNodeClick, this);\r
- },\r
- \r
- onNodeClick : function(node, e){\r
- this.select(node, e, e.ctrlKey);\r
- },\r
- \r
- \r
- select : function(node, e, keepExisting){\r
- if(keepExisting !== true){\r
- this.clearSelections(true);\r
- }\r
- if(this.isSelected(node)){\r
- this.lastSelNode = node;\r
- return node;\r
- }\r
- this.selNodes.push(node);\r
- this.selMap[node.id] = node;\r
- this.lastSelNode = node;\r
- node.ui.onSelectedChange(true);\r
- this.fireEvent("selectionchange", this, this.selNodes);\r
- return node;\r
- },\r
- \r
- \r
- unselect : function(node){\r
- if(this.selMap[node.id]){\r
- node.ui.onSelectedChange(false);\r
- var sn = this.selNodes;\r
- var index = sn.indexOf(node);\r
- if(index != -1){\r
- this.selNodes.splice(index, 1);\r
- }\r
- delete this.selMap[node.id];\r
- this.fireEvent("selectionchange", this, this.selNodes);\r
- }\r
- },\r
- \r
- \r
- clearSelections : function(suppressEvent){\r
- var sn = this.selNodes;\r
- if(sn.length > 0){\r
- for(var i = 0, len = sn.length; i < len; i++){\r
- sn[i].ui.onSelectedChange(false);\r
- }\r
- this.selNodes = [];\r
- this.selMap = {};\r
- if(suppressEvent !== true){\r
- this.fireEvent("selectionchange", this, this.selNodes);\r
- }\r
- }\r
- },\r
- \r
- \r
- isSelected : function(node){\r
- return this.selMap[node.id] ? true : false; \r
- },\r
- \r
- \r
- getSelectedNodes : function(){\r
- return this.selNodes; \r
- },\r
-\r
- onKeyDown : Ext.tree.DefaultSelectionModel.prototype.onKeyDown,\r
-\r
- selectNext : Ext.tree.DefaultSelectionModel.prototype.selectNext,\r
-\r
- selectPrevious : Ext.tree.DefaultSelectionModel.prototype.selectPrevious\r
-});\r
-\r
-Ext.tree.TreeNode = function(attributes){\r
- attributes = attributes || {};\r
- if(typeof attributes == "string"){\r
- attributes = {text: attributes};\r
- }\r
- this.childrenRendered = false;\r
- this.rendered = false;\r
- Ext.tree.TreeNode.superclass.constructor.call(this, attributes);\r
- this.expanded = attributes.expanded === true;\r
- this.isTarget = attributes.isTarget !== false;\r
- this.draggable = attributes.draggable !== false && attributes.allowDrag !== false;\r
- this.allowChildren = attributes.allowChildren !== false && attributes.allowDrop !== false;\r
-\r
- \r
- this.text = attributes.text;\r
- \r
- this.disabled = attributes.disabled === true;\r
-\r
- this.addEvents(\r
- \r
- "textchange",\r
- \r
- "beforeexpand",\r
- \r
- "beforecollapse",\r
- \r
- "expand",\r
- \r
- "disabledchange",\r
- \r
- "collapse",\r
- \r
- "beforeclick",\r
- \r
- "click",\r
- \r
- "checkchange",\r
- \r
- "dblclick",\r
- \r
- "contextmenu",\r
- \r
- "beforechildrenrendered"\r
- );\r
-\r
- var uiClass = this.attributes.uiProvider || this.defaultUI || Ext.tree.TreeNodeUI;\r
-\r
- \r
- this.ui = new uiClass(this);\r
-};\r
-Ext.extend(Ext.tree.TreeNode, Ext.data.Node, {\r
- preventHScroll: true,\r
- \r
- isExpanded : function(){\r
- return this.expanded;\r
- },\r
-\r
-\r
- getUI : function(){\r
- return this.ui;\r
- },\r
-\r
- getLoader : function(){\r
- var owner;\r
- return this.loader || ((owner = this.getOwnerTree()) && owner.loader ? owner.loader : new Ext.tree.TreeLoader());\r
- },\r
-\r
- // private override\r
- setFirstChild : function(node){\r
- var of = this.firstChild;\r
- Ext.tree.TreeNode.superclass.setFirstChild.call(this, node);\r
- if(this.childrenRendered && of && node != of){\r
- of.renderIndent(true, true);\r
- }\r
- if(this.rendered){\r
- this.renderIndent(true, true);\r
- }\r
- },\r
-\r
- // private override\r
- setLastChild : function(node){\r
- var ol = this.lastChild;\r
- Ext.tree.TreeNode.superclass.setLastChild.call(this, node);\r
- if(this.childrenRendered && ol && node != ol){\r
- ol.renderIndent(true, true);\r
- }\r
- if(this.rendered){\r
- this.renderIndent(true, true);\r
- }\r
- },\r
-\r
- // these methods are overridden to provide lazy rendering support\r
- // private override\r
- appendChild : function(n){\r
- if(!n.render && !Ext.isArray(n)){\r
- n = this.getLoader().createNode(n);\r
- }\r
- var node = Ext.tree.TreeNode.superclass.appendChild.call(this, n);\r
- if(node && this.childrenRendered){\r
- node.render();\r
- }\r
- this.ui.updateExpandIcon();\r
- return node;\r
- },\r
-\r
- // private override\r
- removeChild : function(node){\r
- this.ownerTree.getSelectionModel().unselect(node);\r
- Ext.tree.TreeNode.superclass.removeChild.apply(this, arguments);\r
- // if it's been rendered remove dom node\r
- if(this.childrenRendered){\r
- node.ui.remove();\r
- }\r
- if(this.childNodes.length < 1){\r
- this.collapse(false, false);\r
- }else{\r
- this.ui.updateExpandIcon();\r
- }\r
- if(!this.firstChild && !this.isHiddenRoot()) {\r
- this.childrenRendered = false;\r
- }\r
- return node;\r
- },\r
-\r
- // private override\r
- insertBefore : function(node, refNode){\r
- if(!node.render){ \r
- node = this.getLoader().createNode(node);\r
- }\r
- var newNode = Ext.tree.TreeNode.superclass.insertBefore.apply(this, arguments);\r
- if(newNode && refNode && this.childrenRendered){\r
- node.render();\r
- }\r
- this.ui.updateExpandIcon();\r
- return newNode;\r
- },\r
-\r
- \r
- setText : function(text){\r
- var oldText = this.text;\r
- this.text = text;\r
- this.attributes.text = text;\r
- if(this.rendered){ // event without subscribing\r
- this.ui.onTextChange(this, text, oldText);\r
- }\r
- this.fireEvent("textchange", this, text, oldText);\r
- },\r
-\r
- \r
- select : function(){\r
- this.getOwnerTree().getSelectionModel().select(this);\r
- },\r
-\r
- \r
- unselect : function(){\r
- this.getOwnerTree().getSelectionModel().unselect(this);\r
- },\r
-\r
- \r
- isSelected : function(){\r
- return this.getOwnerTree().getSelectionModel().isSelected(this);\r
- },\r
-\r
- \r
- expand : function(deep, anim, callback){\r
- if(!this.expanded){\r
- if(this.fireEvent("beforeexpand", this, deep, anim) === false){\r
- return;\r
- }\r
- if(!this.childrenRendered){\r
- this.renderChildren();\r
- }\r
- this.expanded = true;\r
- if(!this.isHiddenRoot() && (this.getOwnerTree().animate && anim !== false) || anim){\r
- this.ui.animExpand(function(){\r
- this.fireEvent("expand", this);\r
- if(typeof callback == "function"){\r
- callback(this);\r
- }\r
- if(deep === true){\r
- this.expandChildNodes(true);\r
- }\r
- }.createDelegate(this));\r
- return;\r
- }else{\r
- this.ui.expand();\r
- this.fireEvent("expand", this);\r
- if(typeof callback == "function"){\r
- callback(this);\r
- }\r
- }\r
- }else{\r
- if(typeof callback == "function"){\r
- callback(this);\r
- }\r
- }\r
- if(deep === true){\r
- this.expandChildNodes(true);\r
- }\r
- },\r
-\r
- isHiddenRoot : function(){\r
- return this.isRoot && !this.getOwnerTree().rootVisible;\r
- },\r
-\r
- \r
- collapse : function(deep, anim){\r
- if(this.expanded && !this.isHiddenRoot()){\r
- if(this.fireEvent("beforecollapse", this, deep, anim) === false){\r
- return;\r
- }\r
- this.expanded = false;\r
- if((this.getOwnerTree().animate && anim !== false) || anim){\r
- this.ui.animCollapse(function(){\r
- this.fireEvent("collapse", this);\r
- if(deep === true){\r
- this.collapseChildNodes(true);\r
- }\r
- }.createDelegate(this));\r
- return;\r
- }else{\r
- this.ui.collapse();\r
- this.fireEvent("collapse", this);\r
- }\r
- }\r
- if(deep === true){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- cs[i].collapse(true, false);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- delayedExpand : function(delay){\r
- if(!this.expandProcId){\r
- this.expandProcId = this.expand.defer(delay, this);\r
- }\r
- },\r
-\r
- // private\r
- cancelExpand : function(){\r
- if(this.expandProcId){\r
- clearTimeout(this.expandProcId);\r
- }\r
- this.expandProcId = false;\r
- },\r
-\r
- \r
- toggle : function(){\r
- if(this.expanded){\r
- this.collapse();\r
- }else{\r
- this.expand();\r
- }\r
- },\r
-\r
- \r
- ensureVisible : function(callback){\r
- var tree = this.getOwnerTree();\r
- tree.expandPath(this.parentNode ? this.parentNode.getPath() : this.getPath(), false, function(){\r
- var node = tree.getNodeById(this.id); // Somehow if we don't do this, we lose changes that happened to node in the meantime\r
- tree.getTreeEl().scrollChildIntoView(node.ui.anchor);\r
- Ext.callback(callback);\r
- }.createDelegate(this));\r
- },\r
-\r
- \r
- expandChildNodes : function(deep){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- cs[i].expand(deep);\r
- }\r
- },\r
-\r
- \r
- collapseChildNodes : function(deep){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++) {\r
- cs[i].collapse(deep);\r
- }\r
- },\r
-\r
- \r
- disable : function(){\r
- this.disabled = true;\r
- this.unselect();\r
- if(this.rendered && this.ui.onDisableChange){ // event without subscribing\r
- this.ui.onDisableChange(this, true);\r
- }\r
- this.fireEvent("disabledchange", this, true);\r
- },\r
-\r
- \r
- enable : function(){\r
- this.disabled = false;\r
- if(this.rendered && this.ui.onDisableChange){ // event without subscribing\r
- this.ui.onDisableChange(this, false);\r
- }\r
- this.fireEvent("disabledchange", this, false);\r
- },\r
-\r
- // private\r
- renderChildren : function(suppressEvent){\r
- if(suppressEvent !== false){\r
- this.fireEvent("beforechildrenrendered", this);\r
- }\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- cs[i].render(true);\r
- }\r
- this.childrenRendered = true;\r
- },\r
-\r
- // private\r
- sort : function(fn, scope){\r
- Ext.tree.TreeNode.superclass.sort.apply(this, arguments);\r
- if(this.childrenRendered){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- cs[i].render(true);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- render : function(bulkRender){\r
- this.ui.render(bulkRender);\r
- if(!this.rendered){\r
- // make sure it is registered\r
- this.getOwnerTree().registerNode(this);\r
- this.rendered = true;\r
- if(this.expanded){\r
- this.expanded = false;\r
- this.expand(false, false);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- renderIndent : function(deep, refresh){\r
- if(refresh){\r
- this.ui.childIndent = null;\r
- }\r
- this.ui.renderIndent();\r
- if(deep === true && this.childrenRendered){\r
- var cs = this.childNodes;\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- cs[i].renderIndent(true, refresh);\r
- }\r
- }\r
- },\r
-\r
- beginUpdate : function(){\r
- this.childrenRendered = false;\r
- },\r
-\r
- endUpdate : function(){\r
- if(this.expanded && this.rendered){\r
- this.renderChildren();\r
- }\r
- },\r
-\r
- destroy : function(){\r
- if(this.childNodes){\r
- for(var i = 0,l = this.childNodes.length; i < l; i++){\r
- this.childNodes[i].destroy();\r
- }\r
- this.childNodes = null;\r
- }\r
- if(this.ui.destroy){\r
- this.ui.destroy();\r
- }\r
- }\r
-});\r
-\r
-Ext.tree.TreePanel.nodeTypes.node = Ext.tree.TreeNode;\r
-\r
- Ext.tree.AsyncTreeNode = function(config){\r
- this.loaded = config && config.loaded === true;\r
- this.loading = false;\r
- Ext.tree.AsyncTreeNode.superclass.constructor.apply(this, arguments);\r
- \r
- this.addEvents('beforeload', 'load');\r
- \r
- \r
-};\r
-Ext.extend(Ext.tree.AsyncTreeNode, Ext.tree.TreeNode, {\r
- expand : function(deep, anim, callback){\r
- if(this.loading){ // if an async load is already running, waiting til it's done\r
- var timer;\r
- var f = function(){\r
- if(!this.loading){ // done loading\r
- clearInterval(timer);\r
- this.expand(deep, anim, callback);\r
- }\r
- }.createDelegate(this);\r
- timer = setInterval(f, 200);\r
- return;\r
- }\r
- if(!this.loaded){\r
- if(this.fireEvent("beforeload", this) === false){\r
- return;\r
- }\r
- this.loading = true;\r
- this.ui.beforeLoad(this);\r
- var loader = this.loader || this.attributes.loader || this.getOwnerTree().getLoader();\r
- if(loader){\r
- loader.load(this, this.loadComplete.createDelegate(this, [deep, anim, callback]));\r
- return;\r
- }\r
- }\r
- Ext.tree.AsyncTreeNode.superclass.expand.call(this, deep, anim, callback);\r
- },\r
- \r
- \r
- isLoading : function(){\r
- return this.loading; \r
- },\r
- \r
- loadComplete : function(deep, anim, callback){\r
- this.loading = false;\r
- this.loaded = true;\r
- this.ui.afterLoad(this);\r
- this.fireEvent("load", this);\r
- this.expand(deep, anim, callback);\r
- },\r
- \r
- \r
- isLoaded : function(){\r
- return this.loaded;\r
- },\r
- \r
- hasChildNodes : function(){\r
- if(!this.isLeaf() && !this.loaded){\r
- return true;\r
- }else{\r
- return Ext.tree.AsyncTreeNode.superclass.hasChildNodes.call(this);\r
- }\r
- },\r
-\r
- \r
- reload : function(callback){\r
- this.collapse(false, false);\r
- while(this.firstChild){\r
- this.removeChild(this.firstChild).destroy();\r
- }\r
- this.childrenRendered = false;\r
- this.loaded = false;\r
- if(this.isHiddenRoot()){\r
- this.expanded = false;\r
- }\r
- this.expand(false, false, callback);\r
- }\r
-});\r
-\r
-Ext.tree.TreePanel.nodeTypes.async = Ext.tree.AsyncTreeNode;\r
-\r
-Ext.tree.TreeNodeUI = function(node){\r
- this.node = node;\r
- this.rendered = false;\r
- this.animating = false;\r
- this.wasLeaf = true;\r
- this.ecc = 'x-tree-ec-icon x-tree-elbow';\r
- this.emptyIcon = Ext.BLANK_IMAGE_URL;\r
-};\r
-\r
-Ext.tree.TreeNodeUI.prototype = {\r
- // private\r
- removeChild : function(node){\r
- if(this.rendered){\r
- this.ctNode.removeChild(node.ui.getEl());\r
- } \r
- },\r
-\r
- // private\r
- beforeLoad : function(){\r
- this.addClass("x-tree-node-loading");\r
- },\r
-\r
- // private\r
- afterLoad : function(){\r
- this.removeClass("x-tree-node-loading");\r
- },\r
-\r
- // private\r
- onTextChange : function(node, text, oldText){\r
- if(this.rendered){\r
- this.textNode.innerHTML = text;\r
- }\r
- },\r
-\r
- // private\r
- onDisableChange : function(node, state){\r
- this.disabled = state;\r
- if (this.checkbox) {\r
- this.checkbox.disabled = state;\r
- } \r
- if(state){\r
- this.addClass("x-tree-node-disabled");\r
- }else{\r
- this.removeClass("x-tree-node-disabled");\r
- } \r
- },\r
-\r
- // private\r
- onSelectedChange : function(state){\r
- if(state){\r
- this.focus();\r
- this.addClass("x-tree-selected");\r
- }else{\r
- //this.blur();\r
- this.removeClass("x-tree-selected");\r
- }\r
- },\r
-\r
- // private\r
- onMove : function(tree, node, oldParent, newParent, index, refNode){\r
- this.childIndent = null;\r
- if(this.rendered){\r
- var targetNode = newParent.ui.getContainer();\r
- if(!targetNode){//target not rendered\r
- this.holder = document.createElement("div");\r
- this.holder.appendChild(this.wrap);\r
- return;\r
- }\r
- var insertBefore = refNode ? refNode.ui.getEl() : null;\r
- if(insertBefore){\r
- targetNode.insertBefore(this.wrap, insertBefore);\r
- }else{\r
- targetNode.appendChild(this.wrap);\r
- }\r
- this.node.renderIndent(true);\r
- }\r
- },\r
-\r
-\r
- addClass : function(cls){\r
- if(this.elNode){\r
- Ext.fly(this.elNode).addClass(cls);\r
- }\r
- },\r
-\r
-\r
- removeClass : function(cls){\r
- if(this.elNode){\r
- Ext.fly(this.elNode).removeClass(cls); \r
- }\r
- },\r
-\r
- // private\r
- remove : function(){\r
- if(this.rendered){\r
- this.holder = document.createElement("div");\r
- this.holder.appendChild(this.wrap);\r
- } \r
- },\r
-\r
- // private\r
- fireEvent : function(){\r
- return this.node.fireEvent.apply(this.node, arguments); \r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- this.node.on("move", this.onMove, this);\r
-\r
- if(this.node.disabled){\r
- this.addClass("x-tree-node-disabled");\r
- if (this.checkbox) {\r
- this.checkbox.disabled = true;\r
- } \r
- }\r
- if(this.node.hidden){\r
- this.hide();\r
- }\r
- var ot = this.node.getOwnerTree();\r
- var dd = ot.enableDD || ot.enableDrag || ot.enableDrop;\r
- if(dd && (!this.node.isRoot || ot.rootVisible)){\r
- Ext.dd.Registry.register(this.elNode, {\r
- node: this.node,\r
- handles: this.getDDHandles(),\r
- isHandle: false\r
- });\r
- }\r
- },\r
-\r
- // private\r
- getDDHandles : function(){\r
- return [this.iconNode, this.textNode, this.elNode];\r
- },\r
-\r
-\r
- hide : function(){\r
- this.node.hidden = true;\r
- if(this.wrap){\r
- this.wrap.style.display = "none";\r
- }\r
- },\r
-\r
-\r
- show : function(){\r
- this.node.hidden = false;\r
- if(this.wrap){\r
- this.wrap.style.display = "";\r
- } \r
- },\r
-\r
- // private\r
- onContextMenu : function(e){\r
- if (this.node.hasListener("contextmenu") || this.node.getOwnerTree().hasListener("contextmenu")) {\r
- e.preventDefault();\r
- this.focus();\r
- this.fireEvent("contextmenu", this.node, e);\r
- }\r
- },\r
-\r
- // private\r
- onClick : function(e){\r
- if(this.dropping){\r
- e.stopEvent();\r
- return;\r
- }\r
- if(this.fireEvent("beforeclick", this.node, e) !== false){\r
- var a = e.getTarget('a');\r
- if(!this.disabled && this.node.attributes.href && a){\r
- this.fireEvent("click", this.node, e);\r
- return;\r
- }else if(a && e.ctrlKey){\r
- e.stopEvent();\r
- }\r
- e.preventDefault();\r
- if(this.disabled){\r
- return;\r
- }\r
-\r
- if(this.node.attributes.singleClickExpand && !this.animating && this.node.isExpandable()){\r
- this.node.toggle();\r
- }\r
-\r
- this.fireEvent("click", this.node, e);\r
- }else{\r
- e.stopEvent();\r
- }\r
- },\r
-\r
- // private\r
- onDblClick : function(e){\r
- e.preventDefault();\r
- if(this.disabled){\r
- return;\r
- }\r
- if(this.checkbox){\r
- this.toggleCheck();\r
- }\r
- if(!this.animating && this.node.isExpandable()){\r
- this.node.toggle();\r
- }\r
- this.fireEvent("dblclick", this.node, e);\r
- },\r
-\r
- onOver : function(e){\r
- this.addClass('x-tree-node-over');\r
- },\r
-\r
- onOut : function(e){\r
- this.removeClass('x-tree-node-over');\r
- },\r
-\r
- // private\r
- onCheckChange : function(){\r
- var checked = this.checkbox.checked;\r
- // fix for IE6\r
- this.checkbox.defaultChecked = checked;\r
- this.node.attributes.checked = checked;\r
- this.fireEvent('checkchange', this.node, checked);\r
- },\r
-\r
- // private\r
- ecClick : function(e){\r
- if(!this.animating && this.node.isExpandable()){\r
- this.node.toggle();\r
- }\r
- },\r
-\r
- // private\r
- startDrop : function(){\r
- this.dropping = true;\r
- },\r
- \r
- // delayed drop so the click event doesn't get fired on a drop\r
- endDrop : function(){ \r
- setTimeout(function(){\r
- this.dropping = false;\r
- }.createDelegate(this), 50); \r
- },\r
-\r
- // private\r
- expand : function(){\r
- this.updateExpandIcon();\r
- this.ctNode.style.display = "";\r
- },\r
-\r
- // private\r
- focus : function(){\r
- if(!this.node.preventHScroll){\r
- try{this.anchor.focus();\r
- }catch(e){}\r
- }else{\r
- try{\r
- var noscroll = this.node.getOwnerTree().getTreeEl().dom;\r
- var l = noscroll.scrollLeft;\r
- this.anchor.focus();\r
- noscroll.scrollLeft = l;\r
- }catch(e){}\r
- }\r
- },\r
-\r
-\r
- toggleCheck : function(value){\r
- var cb = this.checkbox;\r
- if(cb){\r
- cb.checked = (value === undefined ? !cb.checked : value);\r
- this.onCheckChange();\r
- }\r
- },\r
-\r
- // private\r
- blur : function(){\r
- try{\r
- this.anchor.blur();\r
- }catch(e){} \r
- },\r
-\r
- // private\r
- animExpand : function(callback){\r
- var ct = Ext.get(this.ctNode);\r
- ct.stopFx();\r
- if(!this.node.isExpandable()){\r
- this.updateExpandIcon();\r
- this.ctNode.style.display = "";\r
- Ext.callback(callback);\r
- return;\r
- }\r
- this.animating = true;\r
- this.updateExpandIcon();\r
- \r
- ct.slideIn('t', {\r
- callback : function(){\r
- this.animating = false;\r
- Ext.callback(callback);\r
- },\r
- scope: this,\r
- duration: this.node.ownerTree.duration || .25\r
- });\r
- },\r
-\r
- // private\r
- highlight : function(){\r
- var tree = this.node.getOwnerTree();\r
- Ext.fly(this.wrap).highlight(\r
- tree.hlColor || "C3DAF9",\r
- {endColor: tree.hlBaseColor}\r
- );\r
- },\r
-\r
- // private\r
- collapse : function(){\r
- this.updateExpandIcon();\r
- this.ctNode.style.display = "none";\r
- },\r
-\r
- // private\r
- animCollapse : function(callback){\r
- var ct = Ext.get(this.ctNode);\r
- ct.enableDisplayMode('block');\r
- ct.stopFx();\r
-\r
- this.animating = true;\r
- this.updateExpandIcon();\r
-\r
- ct.slideOut('t', {\r
- callback : function(){\r
- this.animating = false;\r
- Ext.callback(callback);\r
- },\r
- scope: this,\r
- duration: this.node.ownerTree.duration || .25\r
- });\r
- },\r
-\r
- // private\r
- getContainer : function(){\r
- return this.ctNode; \r
- },\r
-\r
- // private\r
- getEl : function(){\r
- return this.wrap; \r
- },\r
-\r
- // private\r
- appendDDGhost : function(ghostNode){\r
- ghostNode.appendChild(this.elNode.cloneNode(true));\r
- },\r
-\r
- // private\r
- getDDRepairXY : function(){\r
- return Ext.lib.Dom.getXY(this.iconNode);\r
- },\r
-\r
- // private\r
- onRender : function(){\r
- this.render(); \r
- },\r
-\r
- // private\r
- render : function(bulkRender){\r
- var n = this.node, a = n.attributes;\r
- var targetNode = n.parentNode ? \r
- n.parentNode.ui.getContainer() : n.ownerTree.innerCt.dom;\r
- \r
- if(!this.rendered){\r
- this.rendered = true;\r
-\r
- this.renderElements(n, a, targetNode, bulkRender);\r
-\r
- if(a.qtip){\r
- if(this.textNode.setAttributeNS){\r
- this.textNode.setAttributeNS("ext", "qtip", a.qtip);\r
- if(a.qtipTitle){\r
- this.textNode.setAttributeNS("ext", "qtitle", a.qtipTitle);\r
- }\r
- }else{\r
- this.textNode.setAttribute("ext:qtip", a.qtip);\r
- if(a.qtipTitle){\r
- this.textNode.setAttribute("ext:qtitle", a.qtipTitle);\r
- }\r
- } \r
- }else if(a.qtipCfg){\r
- a.qtipCfg.target = Ext.id(this.textNode);\r
- Ext.QuickTips.register(a.qtipCfg);\r
- }\r
- this.initEvents();\r
- if(!this.node.expanded){\r
- this.updateExpandIcon(true);\r
- }\r
- }else{\r
- if(bulkRender === true) {\r
- targetNode.appendChild(this.wrap);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- renderElements : function(n, a, targetNode, bulkRender){\r
- // add some indent caching, this helps performance when rendering a large tree\r
- this.indentMarkup = n.parentNode ? n.parentNode.ui.getChildIndent() : '';\r
-\r
- var cb = typeof a.checked == 'boolean';\r
-\r
- var href = a.href ? a.href : Ext.isGecko ? "" : "#";\r
- var buf = ['<li class="x-tree-node"><div ext:tree-node-id="',n.id,'" class="x-tree-node-el x-tree-node-leaf x-unselectable ', a.cls,'" unselectable="on">',\r
- '<span class="x-tree-node-indent">',this.indentMarkup,"</span>",\r
- '<img src="', this.emptyIcon, '" class="x-tree-ec-icon x-tree-elbow" />',\r
- '<img src="', a.icon || this.emptyIcon, '" class="x-tree-node-icon',(a.icon ? " x-tree-node-inline-icon" : ""),(a.iconCls ? " "+a.iconCls : ""),'" unselectable="on" />',\r
- cb ? ('<input class="x-tree-node-cb" type="checkbox" ' + (a.checked ? 'checked="checked" />' : '/>')) : '',\r
- '<a hidefocus="on" class="x-tree-node-anchor" href="',href,'" tabIndex="1" ',\r
- a.hrefTarget ? ' target="'+a.hrefTarget+'"' : "", '><span unselectable="on">',n.text,"</span></a></div>",\r
- '<ul class="x-tree-node-ct" style="display:none;"></ul>',\r
- "</li>"].join('');\r
-\r
- var nel;\r
- if(bulkRender !== true && n.nextSibling && (nel = n.nextSibling.ui.getEl())){\r
- this.wrap = Ext.DomHelper.insertHtml("beforeBegin", nel, buf);\r
- }else{\r
- this.wrap = Ext.DomHelper.insertHtml("beforeEnd", targetNode, buf);\r
- }\r
- \r
- this.elNode = this.wrap.childNodes[0];\r
- this.ctNode = this.wrap.childNodes[1];\r
- var cs = this.elNode.childNodes;\r
- this.indentNode = cs[0];\r
- this.ecNode = cs[1];\r
- this.iconNode = cs[2];\r
- var index = 3;\r
- if(cb){\r
- this.checkbox = cs[3];\r
- // fix for IE6\r
- this.checkbox.defaultChecked = this.checkbox.checked; \r
- index++;\r
- }\r
- this.anchor = cs[index];\r
- this.textNode = cs[index].firstChild;\r
- },\r
-\r
-\r
- getAnchor : function(){\r
- return this.anchor;\r
- },\r
- \r
-\r
- getTextEl : function(){\r
- return this.textNode;\r
- },\r
- \r
-\r
- getIconEl : function(){\r
- return this.iconNode;\r
- },\r
-\r
-\r
- isChecked : function(){\r
- return this.checkbox ? this.checkbox.checked : false; \r
- },\r
-\r
- // private\r
- updateExpandIcon : function(){\r
- if(this.rendered){\r
- var n = this.node, c1, c2;\r
- var cls = n.isLast() ? "x-tree-elbow-end" : "x-tree-elbow";\r
- if(n.isExpandable()){\r
- if(n.expanded){\r
- cls += "-minus";\r
- c1 = "x-tree-node-collapsed";\r
- c2 = "x-tree-node-expanded";\r
- }else{\r
- cls += "-plus";\r
- c1 = "x-tree-node-expanded";\r
- c2 = "x-tree-node-collapsed";\r
- }\r
- if(this.wasLeaf){\r
- this.removeClass("x-tree-node-leaf");\r
- this.wasLeaf = false;\r
- }\r
- if(this.c1 != c1 || this.c2 != c2){\r
- Ext.fly(this.elNode).replaceClass(c1, c2);\r
- this.c1 = c1; this.c2 = c2;\r
- }\r
- }else{\r
- if(!this.wasLeaf){\r
- Ext.fly(this.elNode).replaceClass("x-tree-node-expanded", "x-tree-node-leaf");\r
- delete this.c1;\r
- delete this.c2;\r
- this.wasLeaf = true;\r
- }\r
- }\r
- var ecc = "x-tree-ec-icon "+cls;\r
- if(this.ecc != ecc){\r
- this.ecNode.className = ecc;\r
- this.ecc = ecc;\r
- }\r
- }\r
- },\r
-\r
- // private\r
- getChildIndent : function(){\r
- if(!this.childIndent){\r
- var buf = [];\r
- var p = this.node;\r
- while(p){\r
- if(!p.isRoot || (p.isRoot && p.ownerTree.rootVisible)){\r
- if(!p.isLast()) {\r
- buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-elbow-line" />');\r
- } else {\r
- buf.unshift('<img src="'+this.emptyIcon+'" class="x-tree-icon" />');\r
- }\r
- }\r
- p = p.parentNode;\r
- }\r
- this.childIndent = buf.join("");\r
- }\r
- return this.childIndent;\r
- },\r
-\r
- // private\r
- renderIndent : function(){\r
- if(this.rendered){\r
- var indent = "";\r
- var p = this.node.parentNode;\r
- if(p){\r
- indent = p.ui.getChildIndent();\r
- }\r
- if(this.indentMarkup != indent){ // don't rerender if not required\r
- this.indentNode.innerHTML = indent;\r
- this.indentMarkup = indent;\r
- }\r
- this.updateExpandIcon();\r
- }\r
- },\r
-\r
- destroy : function(){\r
- if(this.elNode){\r
- Ext.dd.Registry.unregister(this.elNode.id);\r
- }\r
- delete this.elNode;\r
- delete this.ctNode;\r
- delete this.indentNode;\r
- delete this.ecNode;\r
- delete this.iconNode;\r
- delete this.checkbox;\r
- delete this.anchor;\r
- delete this.textNode;\r
- \r
- if (this.holder){\r
- delete this.wrap;\r
- Ext.removeNode(this.holder);\r
- delete this.holder;\r
- }else{\r
- Ext.removeNode(this.wrap);\r
- delete this.wrap;\r
- }\r
- }\r
-};\r
-\r
-\r
-Ext.tree.RootTreeNodeUI = Ext.extend(Ext.tree.TreeNodeUI, {\r
- // private\r
- render : function(){\r
- if(!this.rendered){\r
- var targetNode = this.node.ownerTree.innerCt.dom;\r
- this.node.expanded = true;\r
- targetNode.innerHTML = '<div class="x-tree-root-node"></div>';\r
- this.wrap = this.ctNode = targetNode.firstChild;\r
- }\r
- },\r
- collapse : Ext.emptyFn,\r
- expand : Ext.emptyFn\r
-});\r
-\r
-Ext.tree.TreeLoader = function(config){\r
- this.baseParams = {};\r
- Ext.apply(this, config);\r
-\r
- this.addEvents(\r
- \r
- "beforeload",\r
- \r
- "load",\r
- \r
- "loadexception"\r
- );\r
-\r
- Ext.tree.TreeLoader.superclass.constructor.call(this);\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeLoader, Ext.util.Observable, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- uiProviders : {},\r
-\r
- \r
- clearOnLoad : true,\r
-\r
- \r
- load : function(node, callback){\r
- if(this.clearOnLoad){\r
- while(node.firstChild){\r
- node.removeChild(node.firstChild);\r
- }\r
- }\r
- if(this.doPreload(node)){ // preloaded json children\r
- if(typeof callback == "function"){\r
- callback();\r
- }\r
- }else if(this.dataUrl||this.url){\r
- this.requestData(node, callback);\r
- }\r
- },\r
-\r
- doPreload : function(node){\r
- if(node.attributes.children){\r
- if(node.childNodes.length < 1){ // preloaded?\r
- var cs = node.attributes.children;\r
- node.beginUpdate();\r
- for(var i = 0, len = cs.length; i < len; i++){\r
- var cn = node.appendChild(this.createNode(cs[i]));\r
- if(this.preloadChildren){\r
- this.doPreload(cn);\r
- }\r
- }\r
- node.endUpdate();\r
- }\r
- return true;\r
- }else {\r
- return false;\r
- }\r
- },\r
-\r
- getParams: function(node){\r
- var buf = [], bp = this.baseParams;\r
- for(var key in bp){\r
- if(typeof bp[key] != "function"){\r
- buf.push(encodeURIComponent(key), "=", encodeURIComponent(bp[key]), "&");\r
- }\r
- }\r
- buf.push("node=", encodeURIComponent(node.id));\r
- return buf.join("");\r
- },\r
-\r
- requestData : function(node, callback){\r
- if(this.fireEvent("beforeload", this, node, callback) !== false){\r
- this.transId = Ext.Ajax.request({\r
- method:this.requestMethod,\r
- url: this.dataUrl||this.url,\r
- success: this.handleResponse,\r
- failure: this.handleFailure,\r
- scope: this,\r
- argument: {callback: callback, node: node},\r
- params: this.getParams(node)\r
- });\r
- }else{\r
- // if the load is cancelled, make sure we notify\r
- // the node that we are done\r
- if(typeof callback == "function"){\r
- callback();\r
- }\r
- }\r
- },\r
-\r
- isLoading : function(){\r
- return !!this.transId;\r
- },\r
-\r
- abort : function(){\r
- if(this.isLoading()){\r
- Ext.Ajax.abort(this.transId);\r
- }\r
- },\r
-\r
- \r
- createNode : function(attr){\r
- // apply baseAttrs, nice idea Corey!\r
- if(this.baseAttrs){\r
- Ext.applyIf(attr, this.baseAttrs);\r
- }\r
- if(this.applyLoader !== false){\r
- attr.loader = this;\r
- }\r
- if(typeof attr.uiProvider == 'string'){\r
- attr.uiProvider = this.uiProviders[attr.uiProvider] || eval(attr.uiProvider);\r
- }\r
- if(attr.nodeType){\r
- return new Ext.tree.TreePanel.nodeTypes[attr.nodeType](attr);\r
- }else{\r
- return attr.leaf ?\r
- new Ext.tree.TreeNode(attr) :\r
- new Ext.tree.AsyncTreeNode(attr);\r
- }\r
- },\r
-\r
- processResponse : function(response, node, callback){\r
- var json = response.responseText;\r
- try {\r
- var o = eval("("+json+")");\r
- node.beginUpdate();\r
- for(var i = 0, len = o.length; i < len; i++){\r
- var n = this.createNode(o[i]);\r
- if(n){\r
- node.appendChild(n);\r
- }\r
- }\r
- node.endUpdate();\r
- if(typeof callback == "function"){\r
- callback(this, node);\r
- }\r
- }catch(e){\r
- this.handleFailure(response);\r
- }\r
- },\r
-\r
- handleResponse : function(response){\r
- this.transId = false;\r
- var a = response.argument;\r
- this.processResponse(response, a.node, a.callback);\r
- this.fireEvent("load", this, a.node, response);\r
- },\r
-\r
- handleFailure : function(response){\r
- this.transId = false;\r
- var a = response.argument;\r
- this.fireEvent("loadexception", this, a.node, response);\r
- if(typeof a.callback == "function"){\r
- a.callback(this, a.node);\r
- }\r
- }\r
-});\r
-\r
-Ext.tree.TreeFilter = function(tree, config){\r
- this.tree = tree;\r
- this.filtered = {};\r
- Ext.apply(this, config);\r
-};\r
-\r
-Ext.tree.TreeFilter.prototype = {\r
- clearBlank:false,\r
- reverse:false,\r
- autoClear:false,\r
- remove:false,\r
-\r
- \r
- filter : function(value, attr, startNode){\r
- attr = attr || "text";\r
- var f;\r
- if(typeof value == "string"){\r
- var vlen = value.length;\r
- // auto clear empty filter\r
- if(vlen == 0 && this.clearBlank){\r
- this.clear();\r
- return;\r
- }\r
- value = value.toLowerCase();\r
- f = function(n){\r
- return n.attributes[attr].substr(0, vlen).toLowerCase() == value;\r
- };\r
- }else if(value.exec){ // regex?\r
- f = function(n){\r
- return value.test(n.attributes[attr]);\r
- };\r
- }else{\r
- throw 'Illegal filter type, must be string or regex';\r
- }\r
- this.filterBy(f, null, startNode);\r
- },\r
- \r
- \r
- filterBy : function(fn, scope, startNode){\r
- startNode = startNode || this.tree.root;\r
- if(this.autoClear){\r
- this.clear();\r
- }\r
- var af = this.filtered, rv = this.reverse;\r
- var f = function(n){\r
- if(n == startNode){\r
- return true;\r
- }\r
- if(af[n.id]){\r
- return false;\r
- }\r
- var m = fn.call(scope || n, n);\r
- if(!m || rv){\r
- af[n.id] = n;\r
- n.ui.hide();\r
- return false;\r
- }\r
- return true;\r
- };\r
- startNode.cascade(f);\r
- if(this.remove){\r
- for(var id in af){\r
- if(typeof id != "function"){\r
- var n = af[id];\r
- if(n && n.parentNode){\r
- n.parentNode.removeChild(n);\r
- }\r
- }\r
- } \r
- }\r
- },\r
- \r
- \r
- clear : function(){\r
- var t = this.tree;\r
- var af = this.filtered;\r
- for(var id in af){\r
- if(typeof id != "function"){\r
- var n = af[id];\r
- if(n){\r
- n.ui.show();\r
- }\r
- }\r
- }\r
- this.filtered = {}; \r
- }\r
-};\r
-\r
-\r
-Ext.tree.TreeSorter = function(tree, config){\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- Ext.apply(this, config);\r
- tree.on("beforechildrenrendered", this.doSort, this);\r
- tree.on("append", this.updateSort, this);\r
- tree.on("insert", this.updateSort, this);\r
- tree.on("textchange", this.updateSortParent, this);\r
- \r
- var dsc = this.dir && this.dir.toLowerCase() == "desc";\r
- var p = this.property || "text";\r
- var sortType = this.sortType;\r
- var fs = this.folderSort;\r
- var cs = this.caseSensitive === true;\r
- var leafAttr = this.leafAttr || 'leaf';\r
-\r
- this.sortFn = function(n1, n2){\r
- if(fs){\r
- if(n1.attributes[leafAttr] && !n2.attributes[leafAttr]){\r
- return 1;\r
- }\r
- if(!n1.attributes[leafAttr] && n2.attributes[leafAttr]){\r
- return -1;\r
- }\r
- }\r
- var v1 = sortType ? sortType(n1) : (cs ? n1.attributes[p] : n1.attributes[p].toUpperCase());\r
- var v2 = sortType ? sortType(n2) : (cs ? n2.attributes[p] : n2.attributes[p].toUpperCase());\r
- if(v1 < v2){\r
- return dsc ? +1 : -1;\r
- }else if(v1 > v2){\r
- return dsc ? -1 : +1;\r
- }else{\r
- return 0;\r
- }\r
- };\r
-};\r
-\r
-Ext.tree.TreeSorter.prototype = {\r
- doSort : function(node){\r
- node.sort(this.sortFn);\r
- },\r
- \r
- compareNodes : function(n1, n2){\r
- return (n1.text.toUpperCase() > n2.text.toUpperCase() ? 1 : -1);\r
- },\r
- \r
- updateSort : function(tree, node){\r
- if(node.childrenRendered){\r
- this.doSort.defer(1, this, [node]);\r
- }\r
- },\r
- \r
- updateSortParent : function(node){\r
- var p = node.parentNode;\r
- if(p && p.childrenRendered){\r
- this.doSort.defer(1, this, [p]);\r
- }\r
- }\r
-};\r
-\r
-if(Ext.dd.DropZone){\r
- \r
-Ext.tree.TreeDropZone = function(tree, config){\r
- \r
- this.allowParentInsert = false;\r
- \r
- this.allowContainerDrop = false;\r
- \r
- this.appendOnly = false;\r
- Ext.tree.TreeDropZone.superclass.constructor.call(this, tree.innerCt, config);\r
- \r
- this.tree = tree;\r
- \r
- this.dragOverData = {};\r
- // private\r
- this.lastInsertClass = "x-tree-no-status";\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeDropZone, Ext.dd.DropZone, {\r
- \r
- ddGroup : "TreeDD",\r
-\r
- \r
- expandDelay : 1000,\r
-\r
- // private\r
- expandNode : function(node){\r
- if(node.hasChildNodes() && !node.isExpanded()){\r
- node.expand(false, null, this.triggerCacheRefresh.createDelegate(this));\r
- }\r
- },\r
-\r
- // private\r
- queueExpand : function(node){\r
- this.expandProcId = this.expandNode.defer(this.expandDelay, this, [node]);\r
- },\r
-\r
- // private\r
- cancelExpand : function(){\r
- if(this.expandProcId){\r
- clearTimeout(this.expandProcId);\r
- this.expandProcId = false;\r
- }\r
- },\r
-\r
- // private\r
- isValidDropPoint : function(n, pt, dd, e, data){\r
- if(!n || !data){ return false; }\r
- var targetNode = n.node;\r
- var dropNode = data.node;\r
- // default drop rules\r
- if(!(targetNode && targetNode.isTarget && pt)){\r
- return false;\r
- }\r
- if(pt == "append" && targetNode.allowChildren === false){\r
- return false;\r
- }\r
- if((pt == "above" || pt == "below") && (targetNode.parentNode && targetNode.parentNode.allowChildren === false)){\r
- return false;\r
- }\r
- if(dropNode && (targetNode == dropNode || dropNode.contains(targetNode))){\r
- return false;\r
- }\r
- // reuse the object\r
- var overEvent = this.dragOverData;\r
- overEvent.tree = this.tree;\r
- overEvent.target = targetNode;\r
- overEvent.data = data;\r
- overEvent.point = pt;\r
- overEvent.source = dd;\r
- overEvent.rawEvent = e;\r
- overEvent.dropNode = dropNode;\r
- overEvent.cancel = false; \r
- var result = this.tree.fireEvent("nodedragover", overEvent);\r
- return overEvent.cancel === false && result !== false;\r
- },\r
-\r
- // private\r
- getDropPoint : function(e, n, dd){\r
- var tn = n.node;\r
- if(tn.isRoot){\r
- return tn.allowChildren !== false ? "append" : false; // always append for root\r
- }\r
- var dragEl = n.ddel;\r
- var t = Ext.lib.Dom.getY(dragEl), b = t + dragEl.offsetHeight;\r
- var y = Ext.lib.Event.getPageY(e);\r
- var noAppend = tn.allowChildren === false || tn.isLeaf();\r
- if(this.appendOnly || tn.parentNode.allowChildren === false){\r
- return noAppend ? false : "append";\r
- }\r
- var noBelow = false;\r
- if(!this.allowParentInsert){\r
- noBelow = tn.hasChildNodes() && tn.isExpanded();\r
- }\r
- var q = (b - t) / (noAppend ? 2 : 3);\r
- if(y >= t && y < (t + q)){\r
- return "above";\r
- }else if(!noBelow && (noAppend || y >= b-q && y <= b)){\r
- return "below";\r
- }else{\r
- return "append";\r
- }\r
- },\r
-\r
- // private\r
- onNodeEnter : function(n, dd, e, data){\r
- this.cancelExpand();\r
- },\r
-\r
- // private\r
- onNodeOver : function(n, dd, e, data){\r
- var pt = this.getDropPoint(e, n, dd);\r
- var node = n.node;\r
- \r
- // auto node expand check\r
- if(!this.expandProcId && pt == "append" && node.hasChildNodes() && !n.node.isExpanded()){\r
- this.queueExpand(node);\r
- }else if(pt != "append"){\r
- this.cancelExpand();\r
- }\r
- \r
- // set the insert point style on the target node\r
- var returnCls = this.dropNotAllowed;\r
- if(this.isValidDropPoint(n, pt, dd, e, data)){\r
- if(pt){\r
- var el = n.ddel;\r
- var cls;\r
- if(pt == "above"){\r
- returnCls = n.node.isFirst() ? "x-tree-drop-ok-above" : "x-tree-drop-ok-between";\r
- cls = "x-tree-drag-insert-above";\r
- }else if(pt == "below"){\r
- returnCls = n.node.isLast() ? "x-tree-drop-ok-below" : "x-tree-drop-ok-between";\r
- cls = "x-tree-drag-insert-below";\r
- }else{\r
- returnCls = "x-tree-drop-ok-append";\r
- cls = "x-tree-drag-append";\r
- }\r
- if(this.lastInsertClass != cls){\r
- Ext.fly(el).replaceClass(this.lastInsertClass, cls);\r
- this.lastInsertClass = cls;\r
- }\r
- }\r
- }\r
- return returnCls;\r
- },\r
-\r
- // private\r
- onNodeOut : function(n, dd, e, data){\r
- this.cancelExpand();\r
- this.removeDropIndicators(n);\r
- },\r
-\r
- // private\r
- onNodeDrop : function(n, dd, e, data){\r
- var point = this.getDropPoint(e, n, dd);\r
- var targetNode = n.node;\r
- targetNode.ui.startDrop();\r
- if(!this.isValidDropPoint(n, point, dd, e, data)){\r
- targetNode.ui.endDrop();\r
- return false;\r
- }\r
- // first try to find the drop node\r
- var dropNode = data.node || (dd.getTreeNode ? dd.getTreeNode(data, targetNode, point, e) : null);\r
- var dropEvent = {\r
- tree : this.tree,\r
- target: targetNode,\r
- data: data,\r
- point: point,\r
- source: dd,\r
- rawEvent: e,\r
- dropNode: dropNode,\r
- cancel: !dropNode,\r
- dropStatus: false\r
- };\r
- var retval = this.tree.fireEvent("beforenodedrop", dropEvent);\r
- if(retval === false || dropEvent.cancel === true || !dropEvent.dropNode){\r
- targetNode.ui.endDrop();\r
- return dropEvent.dropStatus;\r
- }\r
- // allow target changing\r
- targetNode = dropEvent.target;\r
- if(point == "append" && !targetNode.isExpanded()){\r
- targetNode.expand(false, null, function(){\r
- this.completeDrop(dropEvent);\r
- }.createDelegate(this));\r
- }else{\r
- this.completeDrop(dropEvent);\r
- }\r
- return true;\r
- },\r
-\r
- // private\r
- completeDrop : function(de){\r
- var ns = de.dropNode, p = de.point, t = de.target;\r
- if(!Ext.isArray(ns)){\r
- ns = [ns];\r
- }\r
- var n;\r
- for(var i = 0, len = ns.length; i < len; i++){\r
- n = ns[i];\r
- if(p == "above"){\r
- t.parentNode.insertBefore(n, t);\r
- }else if(p == "below"){\r
- t.parentNode.insertBefore(n, t.nextSibling);\r
- }else{\r
- t.appendChild(n);\r
- }\r
- }\r
- n.ui.focus();\r
- if(Ext.enableFx && this.tree.hlDrop){\r
- n.ui.highlight();\r
- }\r
- t.ui.endDrop();\r
- this.tree.fireEvent("nodedrop", de);\r
- },\r
-\r
- // private\r
- afterNodeMoved : function(dd, data, e, targetNode, dropNode){\r
- if(Ext.enableFx && this.tree.hlDrop){\r
- dropNode.ui.focus();\r
- dropNode.ui.highlight();\r
- }\r
- this.tree.fireEvent("nodedrop", this.tree, targetNode, data, dd, e);\r
- },\r
-\r
- // private\r
- getTree : function(){\r
- return this.tree;\r
- },\r
-\r
- // private\r
- removeDropIndicators : function(n){\r
- if(n && n.ddel){\r
- var el = n.ddel;\r
- Ext.fly(el).removeClass([\r
- "x-tree-drag-insert-above",\r
- "x-tree-drag-insert-below",\r
- "x-tree-drag-append"]);\r
- this.lastInsertClass = "_noclass";\r
- }\r
- },\r
-\r
- // private\r
- beforeDragDrop : function(target, e, id){\r
- this.cancelExpand();\r
- return true;\r
- },\r
-\r
- // private\r
- afterRepair : function(data){\r
- if(data && Ext.enableFx){\r
- data.node.ui.highlight();\r
- }\r
- this.hideProxy();\r
- } \r
-});\r
-\r
-}\r
-\r
-if(Ext.dd.DragZone){\r
-Ext.tree.TreeDragZone = function(tree, config){\r
- Ext.tree.TreeDragZone.superclass.constructor.call(this, tree.getTreeEl(), config);\r
- \r
- this.tree = tree;\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeDragZone, Ext.dd.DragZone, {\r
- \r
- ddGroup : "TreeDD",\r
-\r
- // private\r
- onBeforeDrag : function(data, e){\r
- var n = data.node;\r
- return n && n.draggable && !n.disabled;\r
- },\r
-\r
- // private\r
- onInitDrag : function(e){\r
- var data = this.dragData;\r
- this.tree.getSelectionModel().select(data.node);\r
- this.tree.eventModel.disable();\r
- this.proxy.update("");\r
- data.node.ui.appendDDGhost(this.proxy.ghost.dom);\r
- this.tree.fireEvent("startdrag", this.tree, data.node, e);\r
- },\r
-\r
- // private\r
- getRepairXY : function(e, data){\r
- return data.node.ui.getDDRepairXY();\r
- },\r
-\r
- // private\r
- onEndDrag : function(data, e){\r
- this.tree.eventModel.enable.defer(100, this.tree.eventModel);\r
- this.tree.fireEvent("enddrag", this.tree, data.node, e);\r
- },\r
-\r
- // private\r
- onValidDrop : function(dd, e, id){\r
- this.tree.fireEvent("dragdrop", this.tree, this.dragData.node, dd, e);\r
- this.hideProxy();\r
- },\r
-\r
- // private\r
- beforeInvalidDrop : function(e, id){\r
- // this scrolls the original position back into view\r
- var sm = this.tree.getSelectionModel();\r
- sm.clearSelections();\r
- sm.select(this.dragData.node);\r
- },\r
- \r
- // private\r
- afterRepair : function(){\r
- if (Ext.enableFx && this.tree.hlDrop) {\r
- Ext.Element.fly(this.dragData.ddel).highlight(this.hlColor || "c3daf9");\r
- }\r
- this.dragging = false;\r
- }\r
-});\r
-}\r
-\r
-Ext.tree.TreeEditor = function(tree, fc, config){\r
- fc = fc || {};\r
- var field = fc.events ? fc : new Ext.form.TextField(fc);\r
- Ext.tree.TreeEditor.superclass.constructor.call(this, field, config);\r
-\r
- this.tree = tree;\r
-\r
- if(!tree.rendered){\r
- tree.on('render', this.initEditor, this);\r
- }else{\r
- this.initEditor(tree);\r
- }\r
-};\r
-\r
-Ext.extend(Ext.tree.TreeEditor, Ext.Editor, {\r
- \r
- alignment: "l-l",\r
- // inherit\r
- autoSize: false,\r
- \r
- hideEl : false,\r
- \r
- cls: "x-small-editor x-tree-editor",\r
- \r
- shim:false,\r
- // inherit\r
- shadow:"frame",\r
- \r
- maxWidth: 250,\r
- \r
- editDelay : 350,\r
-\r
- initEditor : function(tree){\r
- tree.on('beforeclick', this.beforeNodeClick, this);\r
- tree.on('dblclick', this.onNodeDblClick, this);\r
- this.on('complete', this.updateNode, this);\r
- this.on('beforestartedit', this.fitToTree, this);\r
- this.on('startedit', this.bindScroll, this, {delay:10});\r
- this.on('specialkey', this.onSpecialKey, this);\r
- },\r
-\r
- // private\r
- fitToTree : function(ed, el){\r
- var td = this.tree.getTreeEl().dom, nd = el.dom;\r
- if(td.scrollLeft > nd.offsetLeft){ // ensure the node left point is visible\r
- td.scrollLeft = nd.offsetLeft;\r
- }\r
- var w = Math.min(\r
- this.maxWidth,\r
- (td.clientWidth > 20 ? td.clientWidth : td.offsetWidth) - Math.max(0, nd.offsetLeft-td.scrollLeft) - 5);\r
- this.setSize(w, '');\r
- },\r
-\r
- // private\r
- triggerEdit : function(node, defer){\r
- this.completeEdit();\r
- if(node.attributes.editable !== false){\r
- \r
- this.editNode = node;\r
- if(this.tree.autoScroll){\r
- node.ui.getEl().scrollIntoView(this.tree.body);\r
- }\r
- this.autoEditTimer = this.startEdit.defer(this.editDelay, this, [node.ui.textNode, node.text]);\r
- return false;\r
- }\r
- },\r
-\r
- // private\r
- bindScroll : function(){\r
- this.tree.getTreeEl().on('scroll', this.cancelEdit, this);\r
- },\r
-\r
- // private\r
- beforeNodeClick : function(node, e){\r
- clearTimeout(this.autoEditTimer);\r
- if(this.tree.getSelectionModel().isSelected(node)){\r
- e.stopEvent();\r
- return this.triggerEdit(node);\r
- }\r
- },\r
-\r
- onNodeDblClick : function(node, e){\r
- clearTimeout(this.autoEditTimer);\r
- },\r
-\r
- // private\r
- updateNode : function(ed, value){\r
- this.tree.getTreeEl().un('scroll', this.cancelEdit, this);\r
- this.editNode.setText(value);\r
- },\r
-\r
- // private\r
- onHide : function(){\r
- Ext.tree.TreeEditor.superclass.onHide.call(this);\r
- if(this.editNode){\r
- this.editNode.ui.focus.defer(50, this.editNode.ui);\r
- }\r
- },\r
-\r
- // private\r
- onSpecialKey : function(field, e){\r
- var k = e.getKey();\r
- if(k == e.ESC){\r
- e.stopEvent();\r
- this.cancelEdit();\r
- }else if(k == e.ENTER && !e.hasModifier()){\r
- e.stopEvent();\r
- this.completeEdit();\r
- }\r
- }\r
-});\r
-\r
-Ext.menu.Menu = function(config){\r
- if(Ext.isArray(config)){\r
- config = {items:config};\r
- }\r
- Ext.apply(this, config);\r
- this.id = this.id || Ext.id();\r
- this.addEvents(\r
- \r
- 'beforeshow',\r
- \r
- 'beforehide',\r
- \r
- 'show',\r
- \r
- 'hide',\r
- \r
- 'click',\r
- \r
- 'mouseover',\r
- \r
- 'mouseout',\r
- \r
- 'itemclick'\r
- );\r
- Ext.menu.MenuMgr.register(this);\r
- Ext.menu.Menu.superclass.constructor.call(this);\r
- var mis = this.items;\r
- \r
-\r
- this.items = new Ext.util.MixedCollection();\r
- if(mis){\r
- this.add.apply(this, mis);\r
- }\r
-};\r
-\r
-Ext.extend(Ext.menu.Menu, Ext.util.Observable, {\r
- \r
- \r
- \r
- minWidth : 120,\r
- \r
- shadow : "sides",\r
- \r
- subMenuAlign : "tl-tr?",\r
- \r
- defaultAlign : "tl-bl?",\r
- \r
- allowOtherMenus : false,\r
- \r
- ignoreParentClicks : false,\r
-\r
- // private\r
- hidden:true,\r
-\r
- // private\r
- createEl : function(){\r
- return new Ext.Layer({\r
- cls: "x-menu",\r
- shadow:this.shadow,\r
- constrain: false,\r
- parentEl: this.parentEl || document.body,\r
- zindex:15000\r
- });\r
- },\r
-\r
- // private\r
- render : function(){\r
- if(this.el){\r
- return;\r
- }\r
- var el = this.el = this.createEl();\r
-\r
- if(!this.keyNav){\r
- this.keyNav = new Ext.menu.MenuNav(this);\r
- }\r
- if(this.plain){\r
- el.addClass("x-menu-plain");\r
- }\r
- if(this.cls){\r
- el.addClass(this.cls);\r
- }\r
- // generic focus element\r
- this.focusEl = el.createChild({\r
- tag: "a", cls: "x-menu-focus", href: "#", onclick: "return false;", tabIndex:"-1"\r
- });\r
- var ul = el.createChild({tag: "ul", cls: "x-menu-list"});\r
- ul.on("click", this.onClick, this);\r
- ul.on("mouseover", this.onMouseOver, this);\r
- ul.on("mouseout", this.onMouseOut, this);\r
- this.items.each(function(item){\r
- var li = document.createElement("li");\r
- li.className = "x-menu-list-item";\r
- ul.dom.appendChild(li);\r
- item.render(li, this);\r
- }, this);\r
- this.ul = ul;\r
- this.autoWidth();\r
- },\r
-\r
- // private\r
- autoWidth : function(){\r
- var el = this.el, ul = this.ul;\r
- if(!el){\r
- return;\r
- }\r
- var w = this.width;\r
- if(w){\r
- el.setWidth(w);\r
- }else if(Ext.isIE){\r
- el.setWidth(this.minWidth);\r
- var t = el.dom.offsetWidth; // force recalc\r
- el.setWidth(ul.getWidth()+el.getFrameWidth("lr"));\r
- }\r
- },\r
-\r
- // private\r
- delayAutoWidth : function(){\r
- if(this.el){\r
- if(!this.awTask){\r
- this.awTask = new Ext.util.DelayedTask(this.autoWidth, this);\r
- }\r
- this.awTask.delay(20);\r
- }\r
- },\r
-\r
- // private\r
- findTargetItem : function(e){\r
- var t = e.getTarget(".x-menu-list-item", this.ul, true);\r
- if(t && t.menuItemId){\r
- return this.items.get(t.menuItemId);\r
- }\r
- },\r
-\r
- // private\r
- onClick : function(e){\r
- var t;\r
- if(t = this.findTargetItem(e)){\r
- if(t.menu && this.ignoreParentClicks){\r
- t.expandMenu();\r
- }else{\r
- t.onClick(e);\r
- this.fireEvent("click", this, t, e);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- setActiveItem : function(item, autoExpand){\r
- if(item != this.activeItem){\r
- if(this.activeItem){\r
- this.activeItem.deactivate();\r
- }\r
- this.activeItem = item;\r
- item.activate(autoExpand);\r
- }else if(autoExpand){\r
- item.expandMenu();\r
- }\r
- },\r
-\r
- // private\r
- tryActivate : function(start, step){\r
- var items = this.items;\r
- for(var i = start, len = items.length; i >= 0 && i < len; i+= step){\r
- var item = items.get(i);\r
- if(!item.disabled && item.canActivate){\r
- this.setActiveItem(item, false);\r
- return item;\r
- }\r
- }\r
- return false;\r
- },\r
-\r
- // private\r
- onMouseOver : function(e){\r
- var t;\r
- if(t = this.findTargetItem(e)){\r
- if(t.canActivate && !t.disabled){\r
- this.setActiveItem(t, true);\r
- }\r
- }\r
- this.over = true;\r
- this.fireEvent("mouseover", this, e, t);\r
- },\r
-\r
- // private\r
- onMouseOut : function(e){\r
- var t;\r
- if(t = this.findTargetItem(e)){\r
- if(t == this.activeItem && t.shouldDeactivate(e)){\r
- this.activeItem.deactivate();\r
- delete this.activeItem;\r
- }\r
- }\r
- this.over = false;\r
- this.fireEvent("mouseout", this, e, t);\r
- },\r
-\r
- \r
- isVisible : function(){\r
- return this.el && !this.hidden;\r
- },\r
-\r
- \r
- show : function(el, pos, parentMenu){\r
- this.parentMenu = parentMenu;\r
- if(!this.el){\r
- this.render();\r
- }\r
- this.fireEvent("beforeshow", this);\r
- this.showAt(this.el.getAlignToXY(el, pos || this.defaultAlign), parentMenu, false);\r
- },\r
-\r
- \r
- showAt : function(xy, parentMenu, _e){\r
- this.parentMenu = parentMenu;\r
- if(!this.el){\r
- this.render();\r
- }\r
- if(_e !== false){\r
- this.fireEvent("beforeshow", this);\r
- xy = this.el.adjustForConstraints(xy);\r
- }\r
- this.el.setXY(xy);\r
- this.el.show();\r
- this.hidden = false;\r
- this.focus();\r
- this.fireEvent("show", this);\r
- },\r
-\r
-\r
-\r
- focus : function(){\r
- if(!this.hidden){\r
- this.doFocus.defer(50, this);\r
- }\r
- },\r
-\r
- doFocus : function(){\r
- if(!this.hidden){\r
- this.focusEl.focus();\r
- }\r
- },\r
-\r
- \r
- hide : function(deep){\r
- if(this.el && this.isVisible()){\r
- this.fireEvent("beforehide", this);\r
- if(this.activeItem){\r
- this.activeItem.deactivate();\r
- this.activeItem = null;\r
- }\r
- this.el.hide();\r
- this.hidden = true;\r
- this.fireEvent("hide", this);\r
- }\r
- if(deep === true && this.parentMenu){\r
- this.parentMenu.hide(true);\r
- }\r
- },\r
-\r
- \r
- add : function(){\r
- var a = arguments, l = a.length, item;\r
- for(var i = 0; i < l; i++){\r
- var el = a[i];\r
- if(el.render){ // some kind of Item\r
- item = this.addItem(el);\r
- }else if(typeof el == "string"){ // string\r
- if(el == "separator" || el == "-"){\r
- item = this.addSeparator();\r
- }else{\r
- item = this.addText(el);\r
- }\r
- }else if(el.tagName || el.el){ // element\r
- item = this.addElement(el);\r
- }else if(typeof el == "object"){ // must be menu item config?\r
- Ext.applyIf(el, this.defaults);\r
- item = this.addMenuItem(el);\r
- }\r
- }\r
- return item;\r
- },\r
-\r
- \r
- getEl : function(){\r
- if(!this.el){\r
- this.render();\r
- }\r
- return this.el;\r
- },\r
-\r
- \r
- addSeparator : function(){\r
- return this.addItem(new Ext.menu.Separator());\r
- },\r
-\r
- \r
- addElement : function(el){\r
- return this.addItem(new Ext.menu.BaseItem(el));\r
- },\r
-\r
- \r
- addItem : function(item){\r
- this.items.add(item);\r
- if(this.ul){\r
- var li = document.createElement("li");\r
- li.className = "x-menu-list-item";\r
- this.ul.dom.appendChild(li);\r
- item.render(li, this);\r
- this.delayAutoWidth();\r
- }\r
- return item;\r
- },\r
-\r
- \r
- addMenuItem : function(config){\r
- if(!(config instanceof Ext.menu.Item)){\r
- if(typeof config.checked == "boolean"){ // must be check menu item config?\r
- config = new Ext.menu.CheckItem(config);\r
- }else{\r
- config = new Ext.menu.Item(config);\r
- }\r
- }\r
- return this.addItem(config);\r
- },\r
-\r
- \r
- addText : function(text){\r
- return this.addItem(new Ext.menu.TextItem(text));\r
- },\r
-\r
- \r
- insert : function(index, item){\r
- this.items.insert(index, item);\r
- if(this.ul){\r
- var li = document.createElement("li");\r
- li.className = "x-menu-list-item";\r
- this.ul.dom.insertBefore(li, this.ul.dom.childNodes[index]);\r
- item.render(li, this);\r
- this.delayAutoWidth();\r
- }\r
- return item;\r
- },\r
-\r
- \r
- remove : function(item){\r
- this.items.removeKey(item.id);\r
- item.destroy();\r
- },\r
-\r
- \r
- removeAll : function(){\r
- if(this.items){\r
- var f;\r
- while(f = this.items.first()){\r
- this.remove(f);\r
- }\r
- }\r
- },\r
-\r
- \r
- destroy : function(){\r
- this.beforeDestroy();\r
- Ext.menu.MenuMgr.unregister(this);\r
- if (this.keyNav) {\r
- this.keyNav.disable();\r
- }\r
- this.removeAll();\r
- if (this.ul) {\r
- this.ul.removeAllListeners();\r
- }\r
- if (this.el) {\r
- this.el.destroy();\r
- }\r
- },\r
-\r
- // private\r
- beforeDestroy : Ext.emptyFn\r
-\r
-});\r
-\r
-// MenuNav is a private utility class used internally by the Menu\r
-Ext.menu.MenuNav = function(menu){\r
- Ext.menu.MenuNav.superclass.constructor.call(this, menu.el);\r
- this.scope = this.menu = menu;\r
-};\r
-\r
-Ext.extend(Ext.menu.MenuNav, Ext.KeyNav, {\r
- doRelay : function(e, h){\r
- var k = e.getKey();\r
- if(!this.menu.activeItem && e.isNavKeyPress() && k != e.SPACE && k != e.RETURN){\r
- this.menu.tryActivate(0, 1);\r
- return false;\r
- }\r
- return h.call(this.scope || this, e, this.menu);\r
- },\r
-\r
- up : function(e, m){\r
- if(!m.tryActivate(m.items.indexOf(m.activeItem)-1, -1)){\r
- m.tryActivate(m.items.length-1, -1);\r
- }\r
- },\r
-\r
- down : function(e, m){\r
- if(!m.tryActivate(m.items.indexOf(m.activeItem)+1, 1)){\r
- m.tryActivate(0, 1);\r
- }\r
- },\r
-\r
- right : function(e, m){\r
- if(m.activeItem){\r
- m.activeItem.expandMenu(true);\r
- }\r
- },\r
-\r
- left : function(e, m){\r
- m.hide();\r
- if(m.parentMenu && m.parentMenu.activeItem){\r
- m.parentMenu.activeItem.activate();\r
- }\r
- },\r
-\r
- enter : function(e, m){\r
- if(m.activeItem){\r
- e.stopPropagation();\r
- m.activeItem.onClick(e);\r
- m.fireEvent("click", this, m.activeItem);\r
- return true;\r
- }\r
- }\r
-});\r
-\r
-Ext.menu.MenuMgr = function(){\r
- var menus, active, groups = {}, attached = false, lastShow = new Date();\r
-\r
- // private - called when first menu is created\r
- function init(){\r
- menus = {};\r
- active = new Ext.util.MixedCollection();\r
- Ext.getDoc().addKeyListener(27, function(){\r
- if(active.length > 0){\r
- hideAll();\r
- }\r
- });\r
- }\r
-\r
- // private\r
- function hideAll(){\r
- if(active && active.length > 0){\r
- var c = active.clone();\r
- c.each(function(m){\r
- m.hide();\r
- });\r
- }\r
- }\r
-\r
- // private\r
- function onHide(m){\r
- active.remove(m);\r
- if(active.length < 1){\r
- Ext.getDoc().un("mousedown", onMouseDown);\r
- attached = false;\r
- }\r
- }\r
-\r
- // private\r
- function onShow(m){\r
- var last = active.last();\r
- lastShow = new Date();\r
- active.add(m);\r
- if(!attached){\r
- Ext.getDoc().on("mousedown", onMouseDown);\r
- attached = true;\r
- }\r
- if(m.parentMenu){\r
- m.getEl().setZIndex(parseInt(m.parentMenu.getEl().getStyle("z-index"), 10) + 3);\r
- m.parentMenu.activeChild = m;\r
- }else if(last && last.isVisible()){\r
- m.getEl().setZIndex(parseInt(last.getEl().getStyle("z-index"), 10) + 3);\r
- }\r
- }\r
-\r
- // private\r
- function onBeforeHide(m){\r
- if(m.activeChild){\r
- m.activeChild.hide();\r
- }\r
- if(m.autoHideTimer){\r
- clearTimeout(m.autoHideTimer);\r
- delete m.autoHideTimer;\r
- }\r
- }\r
-\r
- // private\r
- function onBeforeShow(m){\r
- var pm = m.parentMenu;\r
- if(!pm && !m.allowOtherMenus){\r
- hideAll();\r
- }else if(pm && pm.activeChild){\r
- pm.activeChild.hide();\r
- }\r
- }\r
-\r
- // private\r
- function onMouseDown(e){\r
- if(lastShow.getElapsed() > 50 && active.length > 0 && !e.getTarget(".x-menu")){\r
- hideAll();\r
- }\r
- }\r
-\r
- // private\r
- function onBeforeCheck(mi, state){\r
- if(state){\r
- var g = groups[mi.group];\r
- for(var i = 0, l = g.length; i < l; i++){\r
- if(g[i] != mi){\r
- g[i].setChecked(false);\r
- }\r
- }\r
- }\r
- }\r
-\r
- return {\r
-\r
- \r
- hideAll : function(){\r
- hideAll(); \r
- },\r
-\r
- // private\r
- register : function(menu){\r
- if(!menus){\r
- init();\r
- }\r
- menus[menu.id] = menu;\r
- menu.on("beforehide", onBeforeHide);\r
- menu.on("hide", onHide);\r
- menu.on("beforeshow", onBeforeShow);\r
- menu.on("show", onShow);\r
- var g = menu.group;\r
- if(g && menu.events["checkchange"]){\r
- if(!groups[g]){\r
- groups[g] = [];\r
- }\r
- groups[g].push(menu);\r
- menu.on("checkchange", onCheck);\r
- }\r
- },\r
-\r
- \r
- get : function(menu){\r
- if(typeof menu == "string"){ // menu id\r
- if(!menus){ // not initialized, no menus to return\r
- return null;\r
- }\r
- return menus[menu];\r
- }else if(menu.events){ // menu instance\r
- return menu;\r
- }else if(typeof menu.length == 'number'){ // array of menu items?\r
- return new Ext.menu.Menu({items:menu});\r
- }else{ // otherwise, must be a config\r
- return new Ext.menu.Menu(menu);\r
- }\r
- },\r
-\r
- // private\r
- unregister : function(menu){\r
- delete menus[menu.id];\r
- menu.un("beforehide", onBeforeHide);\r
- menu.un("hide", onHide);\r
- menu.un("beforeshow", onBeforeShow);\r
- menu.un("show", onShow);\r
- var g = menu.group;\r
- if(g && menu.events["checkchange"]){\r
- groups[g].remove(menu);\r
- menu.un("checkchange", onCheck);\r
- }\r
- },\r
-\r
- // private\r
- registerCheckable : function(menuItem){\r
- var g = menuItem.group;\r
- if(g){\r
- if(!groups[g]){\r
- groups[g] = [];\r
- }\r
- groups[g].push(menuItem);\r
- menuItem.on("beforecheckchange", onBeforeCheck);\r
- }\r
- },\r
-\r
- // private\r
- unregisterCheckable : function(menuItem){\r
- var g = menuItem.group;\r
- if(g){\r
- groups[g].remove(menuItem);\r
- menuItem.un("beforecheckchange", onBeforeCheck);\r
- }\r
- },\r
-\r
- getCheckedItem : function(groupId){\r
- var g = groups[groupId];\r
- if(g){\r
- for(var i = 0, l = g.length; i < l; i++){\r
- if(g[i].checked){\r
- return g[i];\r
- }\r
- }\r
- }\r
- return null;\r
- },\r
-\r
- setCheckedItem : function(groupId, itemId){\r
- var g = groups[groupId];\r
- if(g){\r
- for(var i = 0, l = g.length; i < l; i++){\r
- if(g[i].id == itemId){\r
- g[i].setChecked(true);\r
- }\r
- }\r
- }\r
- return null;\r
- }\r
- };\r
-}();\r
-\r
-\r
-Ext.menu.BaseItem = function(config){\r
- Ext.menu.BaseItem.superclass.constructor.call(this, config);\r
-\r
- this.addEvents(\r
- \r
- 'click',\r
- \r
- 'activate',\r
- \r
- 'deactivate'\r
- );\r
-\r
- if(this.handler){\r
- this.on("click", this.handler, this.scope);\r
- }\r
-};\r
-\r
-Ext.extend(Ext.menu.BaseItem, Ext.Component, {\r
- \r
- \r
- \r
- canActivate : false,\r
- \r
- activeClass : "x-menu-item-active",\r
- \r
- hideOnClick : true,\r
- \r
- hideDelay : 100,\r
-\r
- // private\r
- ctype: "Ext.menu.BaseItem",\r
-\r
- // private\r
- actionMode : "container",\r
-\r
- // private\r
- render : function(container, parentMenu){\r
- \r
- this.parentMenu = parentMenu;\r
- Ext.menu.BaseItem.superclass.render.call(this, container);\r
- this.container.menuItemId = this.id;\r
- },\r
-\r
- // private\r
- onRender : function(container, position){\r
- this.el = Ext.get(this.el);\r
- if(this.id){\r
- this.el.id = this.id;\r
- }\r
- container.dom.appendChild(this.el.dom);\r
- },\r
-\r
- \r
- setHandler : function(handler, scope){\r
- if(this.handler){\r
- this.un("click", this.handler, this.scope);\r
- }\r
- this.on("click", this.handler = handler, this.scope = scope);\r
- },\r
-\r
- // private\r
- onClick : function(e){\r
- if(!this.disabled && this.fireEvent("click", this, e) !== false\r
- && this.parentMenu.fireEvent("itemclick", this, e) !== false){\r
- this.handleClick(e);\r
- }else{\r
- e.stopEvent();\r
- }\r
- },\r
-\r
- // private\r
- activate : function(){\r
- if(this.disabled){\r
- return false;\r
- }\r
- var li = this.container;\r
- li.addClass(this.activeClass);\r
- this.region = li.getRegion().adjust(2, 2, -2, -2);\r
- this.fireEvent("activate", this);\r
- return true;\r
- },\r
-\r
- // private\r
- deactivate : function(){\r
- this.container.removeClass(this.activeClass);\r
- this.fireEvent("deactivate", this);\r
- },\r
-\r
- // private\r
- shouldDeactivate : function(e){\r
- return !this.region || !this.region.contains(e.getPoint());\r
- },\r
-\r
- // private\r
- handleClick : function(e){\r
- if(this.hideOnClick){\r
- this.parentMenu.hide.defer(this.hideDelay, this.parentMenu, [true]);\r
- }\r
- },\r
-\r
- // private\r
- expandMenu : function(autoActivate){\r
- // do nothing\r
- },\r
-\r
- // private\r
- hideMenu : function(){\r
- // do nothing\r
- }\r
-});\r
-\r
-Ext.menu.TextItem = function(cfg){\r
- if(typeof cfg == 'string'){\r
- cfg = {text: cfg}\r
- }\r
- Ext.menu.TextItem.superclass.constructor.call(this, cfg);\r
-};\r
-\r
-Ext.extend(Ext.menu.TextItem, Ext.menu.BaseItem, {\r
- \r
- \r
- hideOnClick : false,\r
- \r
- itemCls : "x-menu-text",\r
-\r
- // private\r
- onRender : function(){\r
- var s = document.createElement("span");\r
- s.className = this.itemCls;\r
- s.innerHTML = this.text;\r
- this.el = s;\r
- Ext.menu.TextItem.superclass.onRender.apply(this, arguments);\r
- }\r
-});\r
-\r
-Ext.menu.Separator = function(config){\r
- Ext.menu.Separator.superclass.constructor.call(this, config);\r
-};\r
-\r
-Ext.extend(Ext.menu.Separator, Ext.menu.BaseItem, {\r
- \r
- itemCls : "x-menu-sep",\r
- \r
- hideOnClick : false,\r
-\r
- // private\r
- onRender : function(li){\r
- var s = document.createElement("span");\r
- s.className = this.itemCls;\r
- s.innerHTML = " ";\r
- this.el = s;\r
- li.addClass("x-menu-sep-li");\r
- Ext.menu.Separator.superclass.onRender.apply(this, arguments);\r
- }\r
-});\r
-\r
-Ext.menu.Item = function(config){\r
- Ext.menu.Item.superclass.constructor.call(this, config);\r
- if(this.menu){\r
- this.menu = Ext.menu.MenuMgr.get(this.menu);\r
- }\r
-};\r
-Ext.extend(Ext.menu.Item, Ext.menu.BaseItem, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- itemCls : "x-menu-item",\r
- \r
- canActivate : true,\r
- \r
- showDelay: 200,\r
- // doc'd in BaseItem\r
- hideDelay: 200,\r
-\r
- // private\r
- ctype: "Ext.menu.Item",\r
-\r
- // private\r
- onRender : function(container, position){\r
- var el = document.createElement("a");\r
- el.hideFocus = true;\r
- el.unselectable = "on";\r
- el.href = this.href || "#";\r
- if(this.hrefTarget){\r
- el.target = this.hrefTarget;\r
- }\r
- el.className = this.itemCls + (this.menu ? " x-menu-item-arrow" : "") + (this.cls ? " " + this.cls : "");\r
- el.innerHTML = String.format(\r
- '<img src="{0}" class="x-menu-item-icon {2}" />{1}',\r
- this.icon || Ext.BLANK_IMAGE_URL, this.itemText||this.text, this.iconCls || '');\r
- this.el = el;\r
- Ext.menu.Item.superclass.onRender.call(this, container, position);\r
- },\r
-\r
- \r
- setText : function(text){\r
- this.text = text;\r
- if(this.rendered){\r
- this.el.update(String.format(\r
- '<img src="{0}" class="x-menu-item-icon {2}">{1}',\r
- this.icon || Ext.BLANK_IMAGE_URL, this.text, this.iconCls || ''));\r
- this.parentMenu.autoWidth();\r
- }\r
- },\r
-\r
- \r
- setIconClass : function(cls){\r
- var oldCls = this.iconCls;\r
- this.iconCls = cls;\r
- if(this.rendered){\r
- this.el.child('img.x-menu-item-icon').replaceClass(oldCls, this.iconCls);\r
- }\r
- },\r
- \r
- //private\r
- beforeDestroy: function(){\r
- if (this.menu){\r
- this.menu.destroy();\r
- }\r
- Ext.menu.Item.superclass.beforeDestroy.call(this);\r
- },\r
-\r
- // private\r
- handleClick : function(e){\r
- if(!this.href){ // if no link defined, stop the event automatically\r
- e.stopEvent();\r
- }\r
- Ext.menu.Item.superclass.handleClick.apply(this, arguments);\r
- },\r
-\r
- // private\r
- activate : function(autoExpand){\r
- if(Ext.menu.Item.superclass.activate.apply(this, arguments)){\r
- this.focus();\r
- if(autoExpand){\r
- this.expandMenu();\r
- }\r
- }\r
- return true;\r
- },\r
-\r
- // private\r
- shouldDeactivate : function(e){\r
- if(Ext.menu.Item.superclass.shouldDeactivate.call(this, e)){\r
- if(this.menu && this.menu.isVisible()){\r
- return !this.menu.getEl().getRegion().contains(e.getPoint());\r
- }\r
- return true;\r
- }\r
- return false;\r
- },\r
-\r
- // private\r
- deactivate : function(){\r
- Ext.menu.Item.superclass.deactivate.apply(this, arguments);\r
- this.hideMenu();\r
- },\r
-\r
- // private\r
- expandMenu : function(autoActivate){\r
- if(!this.disabled && this.menu){\r
- clearTimeout(this.hideTimer);\r
- delete this.hideTimer;\r
- if(!this.menu.isVisible() && !this.showTimer){\r
- this.showTimer = this.deferExpand.defer(this.showDelay, this, [autoActivate]);\r
- }else if (this.menu.isVisible() && autoActivate){\r
- this.menu.tryActivate(0, 1);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- deferExpand : function(autoActivate){\r
- delete this.showTimer;\r
- this.menu.show(this.container, this.parentMenu.subMenuAlign || "tl-tr?", this.parentMenu);\r
- if(autoActivate){\r
- this.menu.tryActivate(0, 1);\r
- }\r
- },\r
-\r
- // private\r
- hideMenu : function(){\r
- clearTimeout(this.showTimer);\r
- delete this.showTimer;\r
- if(!this.hideTimer && this.menu && this.menu.isVisible()){\r
- this.hideTimer = this.deferHide.defer(this.hideDelay, this);\r
- }\r
- },\r
-\r
- // private\r
- deferHide : function(){\r
- delete this.hideTimer;\r
- if(this.menu.over){\r
- this.parentMenu.setActiveItem(this, false);\r
- }else{\r
- this.menu.hide();\r
- }\r
- }\r
-});\r
-\r
-Ext.menu.CheckItem = function(config){\r
- Ext.menu.CheckItem.superclass.constructor.call(this, config);\r
- this.addEvents(\r
- \r
- "beforecheckchange" ,\r
- \r
- "checkchange"\r
- );\r
- \r
- if(this.checkHandler){\r
- this.on('checkchange', this.checkHandler, this.scope);\r
- }\r
- Ext.menu.MenuMgr.registerCheckable(this);\r
-};\r
-Ext.extend(Ext.menu.CheckItem, Ext.menu.Item, {\r
- \r
- \r
- itemCls : "x-menu-item x-menu-check-item",\r
- \r
- groupClass : "x-menu-group-item",\r
-\r
- \r
- checked: false,\r
-\r
- // private\r
- ctype: "Ext.menu.CheckItem",\r
-\r
- // private\r
- onRender : function(c){\r
- Ext.menu.CheckItem.superclass.onRender.apply(this, arguments);\r
- if(this.group){\r
- this.el.addClass(this.groupClass);\r
- }\r
- if(this.checked){\r
- this.checked = false;\r
- this.setChecked(true, true);\r
- }\r
- },\r
-\r
- // private\r
- destroy : function(){\r
- Ext.menu.MenuMgr.unregisterCheckable(this);\r
- Ext.menu.CheckItem.superclass.destroy.apply(this, arguments);\r
- },\r
-\r
- \r
- setChecked : function(state, suppressEvent){\r
- if(this.checked != state && this.fireEvent("beforecheckchange", this, state) !== false){\r
- if(this.container){\r
- this.container[state ? "addClass" : "removeClass"]("x-menu-item-checked");\r
- }\r
- this.checked = state;\r
- if(suppressEvent !== true){\r
- this.fireEvent("checkchange", this, state);\r
- }\r
- }\r
- },\r
-\r
- // private\r
- handleClick : function(e){\r
- if(!this.disabled && !(this.checked && this.group)){// disable unselect on radio item\r
- this.setChecked(!this.checked);\r
- }\r
- Ext.menu.CheckItem.superclass.handleClick.apply(this, arguments);\r
- }\r
-});\r
-\r
-Ext.menu.Adapter = function(component, config){\r
- Ext.menu.Adapter.superclass.constructor.call(this, config);\r
- this.component = component;\r
-};\r
-Ext.extend(Ext.menu.Adapter, Ext.menu.BaseItem, {\r
- // private\r
- canActivate : true,\r
-\r
- // private\r
- onRender : function(container, position){\r
- this.component.render(container);\r
- this.el = this.component.getEl();\r
- },\r
-\r
- // private\r
- activate : function(){\r
- if(this.disabled){\r
- return false;\r
- }\r
- this.component.focus();\r
- this.fireEvent("activate", this);\r
- return true;\r
- },\r
-\r
- // private\r
- deactivate : function(){\r
- this.fireEvent("deactivate", this);\r
- },\r
-\r
- // private\r
- disable : function(){\r
- this.component.disable();\r
- Ext.menu.Adapter.superclass.disable.call(this);\r
- },\r
-\r
- // private\r
- enable : function(){\r
- this.component.enable();\r
- Ext.menu.Adapter.superclass.enable.call(this);\r
- }\r
-});\r
-\r
-Ext.menu.DateItem = function(config){\r
- Ext.menu.DateItem.superclass.constructor.call(this, new Ext.DatePicker(config), config);\r
- \r
- this.picker = this.component;\r
- this.addEvents('select');\r
- \r
- this.picker.on("render", function(picker){\r
- picker.getEl().swallowEvent("click");\r
- picker.container.addClass("x-menu-date-item");\r
- });\r
-\r
- this.picker.on("select", this.onSelect, this);\r
-};\r
-\r
-Ext.extend(Ext.menu.DateItem, Ext.menu.Adapter, {\r
- // private\r
- onSelect : function(picker, date){\r
- this.fireEvent("select", this, date, picker);\r
- Ext.menu.DateItem.superclass.handleClick.call(this);\r
- }\r
-});\r
-\r
-Ext.menu.ColorItem = function(config){\r
- Ext.menu.ColorItem.superclass.constructor.call(this, new Ext.ColorPalette(config), config);\r
- \r
- this.palette = this.component;\r
- this.relayEvents(this.palette, ["select"]);\r
- if(this.selectHandler){\r
- this.on('select', this.selectHandler, this.scope);\r
- }\r
-};\r
-Ext.extend(Ext.menu.ColorItem, Ext.menu.Adapter);\r
-\r
-Ext.menu.DateMenu = function(config){\r
- Ext.menu.DateMenu.superclass.constructor.call(this, config);\r
- this.plain = true;\r
- var di = new Ext.menu.DateItem(config);\r
- this.add(di);\r
- \r
- this.picker = di.picker;\r
- \r
- this.relayEvents(di, ["select"]);\r
-\r
- this.on('beforeshow', function(){\r
- if(this.picker){\r
- this.picker.hideMonthPicker(true);\r
- }\r
- }, this);\r
-};\r
-Ext.extend(Ext.menu.DateMenu, Ext.menu.Menu, {\r
- cls:'x-date-menu',\r
-\r
- // private\r
- beforeDestroy : function() {\r
- this.picker.destroy();\r
- }\r
-});\r
-\r
-Ext.menu.ColorMenu = function(config){\r
- Ext.menu.ColorMenu.superclass.constructor.call(this, config);\r
- this.plain = true;\r
- var ci = new Ext.menu.ColorItem(config);\r
- this.add(ci);\r
- \r
- this.palette = ci.palette;\r
- \r
- this.relayEvents(ci, ["select"]);\r
-};\r
-Ext.extend(Ext.menu.ColorMenu, Ext.menu.Menu, {\r
- //private\r
- beforeDestroy: function(){\r
- this.palette.destroy();\r
- }\r
-});\r
-\r
-Ext.form.Field = Ext.extend(Ext.BoxComponent, {\r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
- \r
-\r
- \r
- invalidClass : "x-form-invalid",\r
- \r
- invalidText : "The value in this field is invalid",\r
- \r
- focusClass : "x-form-focus",\r
- \r
- validationEvent : "keyup",\r
- \r
- validateOnBlur : true,\r
- \r
- validationDelay : 250,\r
- \r
- defaultAutoCreate : {tag: "input", type: "text", size: "20", autocomplete: "off"},\r
- \r
- fieldClass : "x-form-field",\r
- \r
- msgTarget : 'qtip',\r
- \r
- msgFx : 'normal',\r
- \r
- readOnly : false,\r
- \r
- disabled : false,\r
-\r
- // private\r
- isFormField : true,\r
-\r
- // private\r
- hasFocus : false,\r
-\r
- // private\r
- initComponent : function(){\r
- Ext.form.Field.superclass.initComponent.call(this);\r
- this.addEvents(\r
- \r
- 'focus',\r
- \r
- 'blur',\r
- \r
- 'specialkey',\r
- \r
- 'change',\r
- \r
- 'invalid',\r
- \r
- 'valid'\r
- );\r
- },\r
-\r
- \r
- getName: function(){\r
- return this.rendered && this.el.dom.name ? this.el.dom.name : (this.hiddenName || '');\r
- },\r
-\r
- // private\r
- onRender : function(ct, position){\r
- Ext.form.Field.superclass.onRender.call(this, ct, position);\r
- if(!this.el){\r
- var cfg = this.getAutoCreate();\r
- if(!cfg.name){\r
- cfg.name = this.name || this.id;\r
- }\r
- if(this.inputType){\r
- cfg.type = this.inputType;\r
- }\r
- this.el = ct.createChild(cfg, position);\r
- }\r
- var type = this.el.dom.type;\r
- if(type){\r
- if(type == 'password'){\r
- type = 'text';\r
- }\r
- this.el.addClass('x-form-'+type);\r
- }\r
- if(this.readOnly){\r
- this.el.dom.readOnly = true;\r
- }\r
- if(this.tabIndex !== undefined){\r
- this.el.dom.setAttribute('tabIndex', this.tabIndex);\r
- }\r
-\r
- this.el.addClass([this.fieldClass, this.cls]);\r
- },\r
-\r
- // private\r
- initValue : function(){\r
- if(this.value !== undefined){\r
- this.setValue(this.value);\r
- }else if(this.el.dom.value.length > 0 && this.el.dom.value != this.emptyText){\r
- this.setValue(this.el.dom.value);\r
- }\r
- // reference to original value for reset\r
- this.originalValue = this.getValue();\r
- },\r
-\r
- \r
- isDirty : function() {\r
- if(this.disabled) {\r
- return false;\r
- }\r
- return String(this.getValue()) !== String(this.originalValue);\r
- },\r
-\r
- // private\r
- afterRender : function(){\r
- Ext.form.Field.superclass.afterRender.call(this);\r
- this.initEvents();\r
- this.initValue();\r
- },\r
-\r
- // private\r
- fireKey : function(e){\r
- if(e.isSpecialKey()){\r
- this.fireEvent("specialkey", this, e);\r
- }\r
- },\r
-\r
- \r
- reset : function(){\r
- this.setValue(this.originalValue);\r
- this.clearInvalid();\r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- this.el.on(Ext.isIE || Ext.isSafari3 ? "keydown" : "keypress", this.fireKey, this);\r
- this.el.on("focus", this.onFocus, this);\r
-\r
- // fix weird FF/Win editor issue when changing OS window focus\r
- var o = this.inEditor && Ext.isWindows && Ext.isGecko ? {buffer:10} : null;\r
- this.el.on("blur", this.onBlur, this, o);\r
- },\r
-\r
- // private\r
- onFocus : function(){\r
- if(this.focusClass){\r
- this.el.addClass(this.focusClass);\r
- }\r
- if(!this.hasFocus){\r
- this.hasFocus = true;\r
- this.startValue = this.getValue();\r
- this.fireEvent("focus", this);\r
- }\r
- },\r
-\r
- // private\r
- beforeBlur : Ext.emptyFn,\r
-\r
- // private\r
- onBlur : function(){\r
- this.beforeBlur();\r
- if(this.focusClass){\r
- this.el.removeClass(this.focusClass);\r
- }\r
- this.hasFocus = false;\r
- if(this.validationEvent !== false && this.validateOnBlur && this.validationEvent != "blur"){\r
- this.validate();\r
- }\r
- var v = this.getValue();\r
- if(String(v) !== String(this.startValue)){\r
- this.fireEvent('change', this, v, this.startValue);\r
- }\r
- this.fireEvent("blur", this);\r
- },\r
-\r
- \r
- isValid : function(preventMark){\r
- if(this.disabled){\r
- return true;\r
- }\r
- var restore = this.preventMark;\r
- this.preventMark = preventMark === true;\r
- var v = this.validateValue(this.processValue(this.getRawValue()));\r
- this.preventMark = restore;\r
- return v;\r
- },\r
-\r
- \r
- validate : function(){\r
- if(this.disabled || this.validateValue(this.processValue(this.getRawValue()))){\r
- this.clearInvalid();\r
- return true;\r
- }\r
- return false;\r
- },\r
-\r
- // protected - should be overridden by subclasses if necessary to prepare raw values for validation\r
- processValue : function(value){\r
- return value;\r
- },\r
-\r
- // private\r
- // Subclasses should provide the validation implementation by overriding this\r
- validateValue : function(value){\r
- return true;\r
- },\r
-\r
- \r
- markInvalid : function(msg){\r
- if(!this.rendered || this.preventMark){ // not rendered\r
- return;\r
- }\r
- this.el.addClass(this.invalidClass);\r
- msg = msg || this.invalidText;\r
-\r
- switch(this.msgTarget){\r
- case 'qtip':\r
- this.el.dom.qtip = msg;\r
- this.el.dom.qclass = 'x-form-invalid-tip';\r
- if(Ext.QuickTips){ // fix for floating editors interacting with DND\r
- Ext.QuickTips.enable();\r
- }\r
- break;\r
- case 'title':\r
- this.el.dom.title = msg;\r
- break;\r
- case 'under':\r
- if(!this.errorEl){\r
- var elp = this.getErrorCt();\r
- if(!elp){ // field has no container el\r
- this.el.dom.title = msg;\r
- break;\r
- }\r
- this.errorEl = elp.createChild({cls:'x-form-invalid-msg'});\r
- this.errorEl.setWidth(elp.getWidth(true)-20);\r
- }\r
- this.errorEl.update(msg);\r
- Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);\r
- break;\r
- case 'side':\r
- if(!this.errorIcon){\r
- var elp = this.getErrorCt();\r
- if(!elp){ // field has no container el\r
- this.el.dom.title = msg;\r
- break;\r
- }\r
- this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});\r
- }\r
- this.alignErrorIcon();\r
- this.errorIcon.dom.qtip = msg;\r
- this.errorIcon.dom.qclass = 'x-form-invalid-tip';\r
- this.errorIcon.show();\r
- this.on('resize', this.alignErrorIcon, this);\r
- break;\r
- default:\r
- var t = Ext.getDom(this.msgTarget);\r
- t.innerHTML = msg;\r
- t.style.display = this.msgDisplay;\r
- break;\r
- }\r
- this.fireEvent('invalid', this, msg);\r
- },\r
-\r
- // private\r
- getErrorCt : function(){\r
- return this.el.findParent('.x-form-element', 5, true) || // use form element wrap if available\r
- this.el.findParent('.x-form-field-wrap', 5, true); // else direct field wrap\r
- },\r
-\r
- // private\r
- alignErrorIcon : function(){\r
- this.errorIcon.alignTo(this.el, 'tl-tr', [2, 0]);\r
- },\r
-\r
- \r
- clearInvalid : function(){\r
- if(!this.rendered || this.preventMark){ // not rendered\r
- return;\r
- }\r
- this.el.removeClass(this.invalidClass);\r
- switch(this.msgTarget){\r
- case 'qtip':\r
- this.el.dom.qtip = '';\r
- break;\r
- case 'title':\r
- this.el.dom.title = '';\r
- break;\r
- case 'under':\r
- if(this.errorEl){\r
- Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);\r
- }\r
- break;\r
- case 'side':\r
- if(this.errorIcon){\r
- this.errorIcon.dom.qtip = '';\r
- this.errorIcon.hide();\r
- this.un('resize', this.alignErrorIcon, this);\r
- }\r
- break;\r
- default:\r
- var t = Ext.getDom(this.msgTarget);\r
- t.innerHTML = '';\r
- t.style.display = 'none';\r
- break;\r
- }\r
- this.fireEvent('valid', this);\r
- },\r
-\r
- \r
- getRawValue : function(){\r
- var v = this.rendered ? this.el.getValue() : Ext.value(this.value, '');\r
- if(v === this.emptyText){\r
- v = '';\r
- }\r
- return v;\r
- },\r
-\r
- \r
- getValue : function(){\r
- if(!this.rendered) {\r
- return this.value;\r
- }\r
- var v = this.el.getValue();\r
- if(v === this.emptyText || v === undefined){\r
- v = '';\r
- }\r
- return v;\r
- },\r
-\r
- \r
- setRawValue : function(v){\r
- return this.el.dom.value = (v === null || v === undefined ? '' : v);\r
- },\r
-\r
- \r
- setValue : function(v){\r
- this.value = v;\r
- if(this.rendered){\r
- this.el.dom.value = (v === null || v === undefined ? '' : v);\r
- this.validate();\r
- }\r
- },\r
-\r
- // private\r
- adjustSize : function(w, h){\r
- var s = Ext.form.Field.superclass.adjustSize.call(this, w, h);\r
- s.width = this.adjustWidth(this.el.dom.tagName, s.width);\r
- return s;\r
- },\r
-\r
- // private\r
- adjustWidth : function(tag, w){\r
- tag = tag.toLowerCase();\r
- if(typeof w == 'number' && !Ext.isSafari){\r
- if(Ext.isIE && (tag == 'input' || tag == 'textarea')){\r
- if(tag == 'input' && !Ext.isStrict){\r
- return this.inEditor ? w : w - 3;\r
- }\r
- if(tag == 'input' && Ext.isStrict){\r
- return w - (Ext.isIE6 ? 4 : 1);\r
- }\r
- if(tag == 'textarea' && Ext.isStrict){\r
- return w-2;\r
- }\r
- }else if(Ext.isOpera && Ext.isStrict){\r
- if(tag == 'input'){\r
- return w + 2;\r
- }\r
- if(tag == 'textarea'){\r
- return w-2;\r
- }\r
- }\r
- }\r
- return w;\r
- }\r
-\r
- \r
- \r
-\r
- \r
-});\r
-\r
-Ext.form.MessageTargets = {\r
- 'qtip' : {\r
- mark: function(f){\r
- this.el.dom.qtip = msg;\r
- this.el.dom.qclass = 'x-form-invalid-tip';\r
- if(Ext.QuickTips){ // fix for floating editors interacting with DND\r
- Ext.QuickTips.enable();\r
- }\r
- },\r
- clear: function(f){\r
- this.el.dom.qtip = '';\r
- }\r
- },\r
- 'title' : {\r
- mark: function(f){\r
- this.el.dom.title = msg;\r
- },\r
- clear: function(f){\r
- this.el.dom.title = '';\r
- }\r
- },\r
- 'under' : {\r
- mark: function(f){\r
- if(!this.errorEl){\r
- var elp = this.getErrorCt();\r
- if(!elp){ // field has no container el\r
- this.el.dom.title = msg;\r
- return;\r
- }\r
- this.errorEl = elp.createChild({cls:'x-form-invalid-msg'});\r
- this.errorEl.setWidth(elp.getWidth(true)-20);\r
- }\r
- this.errorEl.update(msg);\r
- Ext.form.Field.msgFx[this.msgFx].show(this.errorEl, this);\r
- },\r
- clear: function(f){\r
- if(this.errorEl){\r
- Ext.form.Field.msgFx[this.msgFx].hide(this.errorEl, this);\r
- }else{\r
- this.el.dom.title = '';\r
- }\r
- }\r
- },\r
- 'side' : {\r
- mark: function(f){\r
- if(!this.errorIcon){\r
- var elp = this.getErrorCt();\r
- if(!elp){ // field has no container el\r
- this.el.dom.title = msg;\r
- return;\r
- }\r
- this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'});\r
- }\r
- this.alignErrorIcon();\r
- this.errorIcon.dom.qtip = msg;\r
- this.errorIcon.dom.qclass = 'x-form-invalid-tip';\r
- this.errorIcon.show();\r
- this.on('resize', this.alignErrorIcon, this);\r
- },\r
- clear: function(f){\r
- if(this.errorIcon){\r
- this.errorIcon.dom.qtip = '';\r
- this.errorIcon.hide();\r
- this.un('resize', this.alignErrorIcon, this);\r
- }else{\r
- this.el.dom.title = '';\r
- }\r
- }\r
- },\r
- 'around' : {\r
- mark: function(f){\r
-\r
- },\r
- clear: function(f){\r
-\r
- }\r
- }\r
-};\r
-\r
-\r
-// anything other than normal should be considered experimental\r
-Ext.form.Field.msgFx = {\r
- normal : {\r
- show: function(msgEl, f){\r
- msgEl.setDisplayed('block');\r
- },\r
-\r
- hide : function(msgEl, f){\r
- msgEl.setDisplayed(false).update('');\r
- }\r
- },\r
-\r
- slide : {\r
- show: function(msgEl, f){\r
- msgEl.slideIn('t', {stopFx:true});\r
- },\r
-\r
- hide : function(msgEl, f){\r
- msgEl.slideOut('t', {stopFx:true,useDisplay:true});\r
- }\r
- },\r
-\r
- slideRight : {\r
- show: function(msgEl, f){\r
- msgEl.fixDisplay();\r
- msgEl.alignTo(f.el, 'tl-tr');\r
- msgEl.slideIn('l', {stopFx:true});\r
- },\r
-\r
- hide : function(msgEl, f){\r
- msgEl.slideOut('l', {stopFx:true,useDisplay:true});\r
- }\r
- }\r
-};\r
-Ext.reg('field', Ext.form.Field);\r
-\r
-\r
-Ext.form.TextField = Ext.extend(Ext.form.Field, {\r
- \r
- \r
- \r
- grow : false,\r
- \r
- growMin : 30,\r
- \r
- growMax : 800,\r
- \r
- vtype : null,\r
- \r
- maskRe : null,\r
- \r
- disableKeyFilter : false,\r
- \r
- allowBlank : true,\r
- \r
- minLength : 0,\r
- \r
- maxLength : Number.MAX_VALUE,\r
- \r
- minLengthText : "The minimum length for this field is {0}",\r
- \r
- maxLengthText : "The maximum length for this field is {0}",\r
- \r
- selectOnFocus : false,\r
- \r
- blankText : "This field is required",\r
- \r
- validator : null,\r
- \r
- regex : null,\r
- \r
- regexText : "",\r
- \r
- emptyText : null,\r
- \r
- emptyClass : 'x-form-empty-field',\r
-\r
- \r
-\r
- initComponent : function(){\r
- Ext.form.TextField.superclass.initComponent.call(this);\r
- this.addEvents(\r
- \r
- 'autosize',\r
-\r
- \r
- 'keydown',\r
- \r
- 'keyup',\r
- \r
- 'keypress'\r
- );\r
- },\r
-\r
- // private\r
- initEvents : function(){\r
- Ext.form.TextField.superclass.initEvents.call(this);\r
- if(this.validationEvent == 'keyup'){\r
- this.validationTask = new Ext.util.DelayedTask(this.validate, this);\r
- this.el.on('keyup', this.filterValidation, this);\r
- }\r
- else if(this.validationEvent !== false){\r
- this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay});\r
- }\r
- if(this.selectOnFocus || this.emptyText){\r
- this.on("focus", this.preFocus, this);\r
- this.el.on('mousedown', function(){\r
- if(!this.hasFocus){\r
- this.el.on('mouseup', function(e){\r
- e.preventDefault();\r
- }, this, {single:true});\r