+Ext.reg('multiselect', Ext.ux.form.MultiSelect);\r
+\r
+//backwards compat\r
+Ext.ux.Multiselect = Ext.ux.form.MultiSelect;\r
+\r
+\r
+Ext.ux.form.MultiSelect.DragZone = function(ms, config){\r
+ this.ms = ms;\r
+ this.view = ms.view;\r
+ var ddGroup = config.ddGroup || 'MultiselectDD';\r
+ var dd;\r
+ if (Ext.isArray(ddGroup)){\r
+ dd = ddGroup.shift();\r
+ } else {\r
+ dd = ddGroup;\r
+ ddGroup = null;\r
+ }\r
+ Ext.ux.form.MultiSelect.DragZone.superclass.constructor.call(this, this.ms.fs.body, { containerScroll: true, ddGroup: dd });\r
+ this.setDraggable(ddGroup);\r
+};\r
+\r
+Ext.extend(Ext.ux.form.MultiSelect.DragZone, Ext.dd.DragZone, {\r
+ onInitDrag : function(x, y){\r
+ var el = Ext.get(this.dragData.ddel.cloneNode(true));\r
+ this.proxy.update(el.dom);\r
+ el.setWidth(el.child('em').getWidth());\r
+ this.onStartDrag(x, y);\r
+ return true;\r
+ },\r
+\r
+ // private\r
+ collectSelection: function(data) {\r
+ data.repairXY = Ext.fly(this.view.getSelectedNodes()[0]).getXY();\r
+ var i = 0;\r
+ this.view.store.each(function(rec){\r
+ if (this.view.isSelected(i)) {\r
+ var n = this.view.getNode(i);\r
+ var dragNode = n.cloneNode(true);\r
+ dragNode.id = Ext.id();\r
+ data.ddel.appendChild(dragNode);\r
+ data.records.push(this.view.store.getAt(i));\r
+ data.viewNodes.push(n);\r
+ }\r
+ i++;\r
+ }, this);\r
+ },\r
+\r
+ // override\r
+ onEndDrag: function(data, e) {\r
+ var d = Ext.get(this.dragData.ddel);\r
+ if (d && d.hasClass("multi-proxy")) {\r
+ d.remove();\r
+ }\r
+ },\r
+\r
+ // override\r
+ getDragData: function(e){\r
+ var target = this.view.findItemFromChild(e.getTarget());\r
+ if(target) {\r
+ if (!this.view.isSelected(target) && !e.ctrlKey && !e.shiftKey) {\r
+ this.view.select(target);\r
+ this.ms.setValue(this.ms.getValue());\r
+ }\r
+ if (this.view.getSelectionCount() == 0 || e.ctrlKey || e.shiftKey) return false;\r
+ var dragData = {\r
+ sourceView: this.view,\r
+ viewNodes: [],\r
+ records: []\r
+ };\r
+ if (this.view.getSelectionCount() == 1) {\r
+ var i = this.view.getSelectedIndexes()[0];\r
+ var n = this.view.getNode(i);\r
+ dragData.viewNodes.push(dragData.ddel = n);\r
+ dragData.records.push(this.view.store.getAt(i));\r
+ dragData.repairXY = Ext.fly(n).getXY();\r
+ } else {\r
+ dragData.ddel = document.createElement('div');\r
+ dragData.ddel.className = 'multi-proxy';\r
+ this.collectSelection(dragData);\r
+ }\r
+ return dragData;\r
+ }\r
+ return false;\r
+ },\r
+\r
+ // override the default repairXY.\r
+ getRepairXY : function(e){\r
+ return this.dragData.repairXY;\r
+ },\r
+\r
+ // private\r
+ setDraggable: function(ddGroup){\r
+ if (!ddGroup) return;\r
+ if (Ext.isArray(ddGroup)) {\r
+ Ext.each(ddGroup, this.setDraggable, this);\r
+ return;\r
+ }\r
+ this.addToGroup(ddGroup);\r
+ }\r
+});\r
+\r
+Ext.ux.form.MultiSelect.DropZone = function(ms, config){\r
+ this.ms = ms;\r
+ this.view = ms.view;\r
+ var ddGroup = config.ddGroup || 'MultiselectDD';\r
+ var dd;\r
+ if (Ext.isArray(ddGroup)){\r
+ dd = ddGroup.shift();\r
+ } else {\r
+ dd = ddGroup;\r
+ ddGroup = null;\r
+ }\r
+ Ext.ux.form.MultiSelect.DropZone.superclass.constructor.call(this, this.ms.fs.body, { containerScroll: true, ddGroup: dd });\r
+ this.setDroppable(ddGroup);\r
+};\r
+\r
+Ext.extend(Ext.ux.form.MultiSelect.DropZone, Ext.dd.DropZone, {\r
+ /**\r
+ * Part of the Ext.dd.DropZone interface. If no target node is found, the\r
+ * whole Element becomes the target, and this causes the drop gesture to append.\r
+ */\r
+ getTargetFromEvent : function(e) {\r
+ var target = e.getTarget();\r
+ return target;\r
+ },\r
+\r
+ // private\r
+ getDropPoint : function(e, n, dd){\r
+ if (n == this.ms.fs.body.dom) { return "below"; }\r
+ var t = Ext.lib.Dom.getY(n), b = t + n.offsetHeight;\r
+ var c = t + (b - t) / 2;\r
+ var y = Ext.lib.Event.getPageY(e);\r
+ if(y <= c) {\r
+ return "above";\r
+ }else{\r
+ return "below";\r
+ }\r
+ },\r
+\r
+ // private\r
+ isValidDropPoint: function(pt, n, data) {\r
+ if (!data.viewNodes || (data.viewNodes.length != 1)) {\r
+ return true;\r
+ }\r
+ var d = data.viewNodes[0];\r
+ if (d == n) {\r
+ return false;\r
+ }\r
+ if ((pt == "below") && (n.nextSibling == d)) {\r
+ return false;\r
+ }\r
+ if ((pt == "above") && (n.previousSibling == d)) {\r
+ return false;\r
+ }\r
+ return true;\r
+ },\r
+\r
+ // override\r
+ onNodeEnter : function(n, dd, e, data){\r
+ return false;\r
+ },\r
+\r
+ // override\r
+ onNodeOver : function(n, dd, e, data){\r
+ var dragElClass = this.dropNotAllowed;\r
+ var pt = this.getDropPoint(e, n, dd);\r
+ if (this.isValidDropPoint(pt, n, data)) {\r
+ if (this.ms.appendOnly) {\r
+ return "x-tree-drop-ok-below";\r
+ }\r
+\r
+ // set the insert point style on the target node\r
+ if (pt) {\r
+ var targetElClass;\r
+ if (pt == "above"){\r
+ dragElClass = n.previousSibling ? "x-tree-drop-ok-between" : "x-tree-drop-ok-above";\r
+ targetElClass = "x-view-drag-insert-above";\r
+ } else {\r
+ dragElClass = n.nextSibling ? "x-tree-drop-ok-between" : "x-tree-drop-ok-below";\r
+ targetElClass = "x-view-drag-insert-below";\r
+ }\r
+ if (this.lastInsertClass != targetElClass){\r
+ Ext.fly(n).replaceClass(this.lastInsertClass, targetElClass);\r
+ this.lastInsertClass = targetElClass;\r
+ }\r
+ }\r
+ }\r
+ return dragElClass;\r
+ },\r
+\r
+ // private\r
+ onNodeOut : function(n, dd, e, data){\r
+ this.removeDropIndicators(n);\r
+ },\r
+\r
+ // private\r
+ onNodeDrop : function(n, dd, e, data){\r
+ if (this.ms.fireEvent("drop", this, n, dd, e, data) === false) {\r
+ return false;\r
+ }\r
+ var pt = this.getDropPoint(e, n, dd);\r
+ if (n != this.ms.fs.body.dom)\r
+ n = this.view.findItemFromChild(n);\r
+\r
+ if(this.ms.appendOnly) {\r
+ insertAt = this.view.store.getCount();\r
+ } else {\r
+ insertAt = n == this.ms.fs.body.dom ? this.view.store.getCount() - 1 : this.view.indexOf(n);\r
+ if (pt == "below") {\r
+ insertAt++;\r
+ }\r
+ }\r
+\r
+ var dir = false;\r
+\r
+ // Validate if dragging within the same MultiSelect\r
+ if (data.sourceView == this.view) {\r
+ // If the first element to be inserted below is the target node, remove it\r
+ if (pt == "below") {\r
+ if (data.viewNodes[0] == n) {\r
+ data.viewNodes.shift();\r
+ }\r
+ } else { // If the last element to be inserted above is the target node, remove it\r
+ if (data.viewNodes[data.viewNodes.length - 1] == n) {\r
+ data.viewNodes.pop();\r
+ }\r
+ }\r
+\r
+ // Nothing to drop...\r
+ if (!data.viewNodes.length) {\r
+ return false;\r
+ }\r
+\r
+ // If we are moving DOWN, then because a store.remove() takes place first,\r
+ // the insertAt must be decremented.\r
+ if (insertAt > this.view.store.indexOf(data.records[0])) {\r
+ dir = 'down';\r
+ insertAt--;\r
+ }\r
+ }\r
+\r
+ for (var i = 0; i < data.records.length; i++) {\r
+ var r = data.records[i];\r
+ if (data.sourceView) {\r
+ data.sourceView.store.remove(r);\r
+ }\r
+ this.view.store.insert(dir == 'down' ? insertAt : insertAt++, r);\r
+ var si = this.view.store.sortInfo;\r
+ if(si){\r
+ this.view.store.sort(si.field, si.direction);\r
+ }\r
+ }\r
+ return true;\r
+ },\r
+\r
+ // private\r
+ removeDropIndicators : function(n){\r
+ if(n){\r
+ Ext.fly(n).removeClass([\r
+ "x-view-drag-insert-above",\r
+ "x-view-drag-insert-left",\r
+ "x-view-drag-insert-right",\r
+ "x-view-drag-insert-below"]);\r
+ this.lastInsertClass = "_noclass";\r
+ }\r
+ },\r
+\r
+ // private\r
+ setDroppable: function(ddGroup){\r
+ if (!ddGroup) return;\r
+ if (Ext.isArray(ddGroup)) {\r
+ Ext.each(ddGroup, this.setDroppable, this);\r
+ return;\r
+ }\r
+ this.addToGroup(ddGroup);\r
+ }\r
+});\r
+
+/* Fix for Opera, which does not seem to include the map function on Array's */
+if (!Array.prototype.map) {
+ Array.prototype.map = function(fun){
+ var len = this.length;
+ if (typeof fun != 'function') {
+ throw new TypeError();
+ }
+ var res = new Array(len);
+ var thisp = arguments[1];
+ for (var i = 0; i < len; i++) {
+ if (i in this) {
+ res[i] = fun.call(thisp, this[i], i, this);
+ }
+ }
+ return res;
+ };
+}
+
+Ext.ns('Ext.ux.data');
+
+/**
+ * @class Ext.ux.data.PagingMemoryProxy
+ * @extends Ext.data.MemoryProxy
+ * <p>Paging Memory Proxy, allows to use paging grid with in memory dataset</p>
+ */
+Ext.ux.data.PagingMemoryProxy = Ext.extend(Ext.data.MemoryProxy, {
+ constructor : function(data){
+ Ext.ux.data.PagingMemoryProxy.superclass.constructor.call(this);
+ this.data = data;
+ },
+ doRequest : function(action, rs, params, reader, callback, scope, options){
+ params = params ||
+ {};
+ var result;
+ try {
+ result = reader.readRecords(this.data);
+ }
+ catch (e) {
+ this.fireEvent('loadexception', this, options, null, e);
+ callback.call(scope, null, options, false);
+ return;
+ }
+
+ // filtering
+ if (params.filter !== undefined) {
+ result.records = result.records.filter(function(el){
+ if (typeof(el) == 'object') {
+ var att = params.filterCol || 0;
+ return String(el.data[att]).match(params.filter) ? true : false;
+ }
+ else {
+ return String(el).match(params.filter) ? true : false;
+ }
+ });
+ result.totalRecords = result.records.length;
+ }
+
+ // sorting
+ if (params.sort !== undefined) {
+ // use integer as params.sort to specify column, since arrays are not named
+ // params.sort=0; would also match a array without columns
+ var dir = String(params.dir).toUpperCase() == 'DESC' ? -1 : 1;
+ var fn = function(v1, v2){
+ return v1 > v2 ? 1 : (v1 < v2 ? -1 : 0);
+ };
+ result.records.sort(function(a, b){
+ var v = 0;
+ if (typeof(a) == 'object') {
+ v = fn(a.data[params.sort], b.data[params.sort]) * dir;
+ }
+ else {
+ v = fn(a, b) * dir;
+ }
+ if (v == 0) {
+ v = (a.index < b.index ? -1 : 1);
+ }
+ return v;
+ });
+ }
+ // paging (use undefined cause start can also be 0 (thus false))
+ if (params.start !== undefined && params.limit !== undefined) {
+ result.records = result.records.slice(params.start, params.start + params.limit);
+ }
+ callback.call(scope, result, options, true);
+ }
+});
+
+//backwards compat.
+Ext.data.PagingMemoryProxy = Ext.ux.data.PagingMemoryProxy;
+Ext.ux.PanelResizer = Ext.extend(Ext.util.Observable, {\r
+ minHeight: 0,\r
+ maxHeight:10000000,\r
+\r
+ constructor: function(config){\r
+ Ext.apply(this, config);\r
+ this.events = {};\r
+ Ext.ux.PanelResizer.superclass.constructor.call(this, config);\r
+ },\r
+\r
+ init : function(p){\r
+ this.panel = p;\r
+\r
+ if(this.panel.elements.indexOf('footer')==-1){\r
+ p.elements += ',footer';\r
+ }\r
+ p.on('render', this.onRender, this);\r
+ },\r
+\r
+ onRender : function(p){\r
+ this.handle = p.footer.createChild({cls:'x-panel-resize'});\r
+\r
+ this.tracker = new Ext.dd.DragTracker({\r
+ onStart: this.onDragStart.createDelegate(this),\r
+ onDrag: this.onDrag.createDelegate(this),\r
+ onEnd: this.onDragEnd.createDelegate(this),\r
+ tolerance: 3,\r
+ autoStart: 300\r
+ });\r
+ this.tracker.initEl(this.handle);\r
+ p.on('beforedestroy', this.tracker.destroy, this.tracker);\r
+ },\r
+\r
+ // private\r
+ onDragStart: function(e){\r
+ this.dragging = true;\r
+ this.startHeight = this.panel.el.getHeight();\r
+ this.fireEvent('dragstart', this, e);\r
+ },\r
+\r
+ // private\r
+ onDrag: function(e){\r
+ this.panel.setHeight((this.startHeight-this.tracker.getOffset()[1]).constrain(this.minHeight, this.maxHeight));\r
+ this.fireEvent('drag', this, e);\r
+ },\r
+\r
+ // private\r
+ onDragEnd: function(e){\r
+ this.dragging = false;\r
+ this.fireEvent('dragend', this, e);\r
+ }\r
+});\r
+Ext.preg('panelresizer', Ext.ux.PanelResizer);Ext.ux.Portal = Ext.extend(Ext.Panel, {\r
+ layout : 'column',\r
+ autoScroll : true,\r
+ cls : 'x-portal',\r
+ defaultType : 'portalcolumn',\r
+ \r
+ initComponent : function(){\r
+ Ext.ux.Portal.superclass.initComponent.call(this);\r
+ this.addEvents({\r
+ validatedrop:true,\r
+ beforedragover:true,\r
+ dragover:true,\r
+ beforedrop:true,\r
+ drop:true\r
+ });\r
+ },\r
+\r
+ initEvents : function(){\r
+ Ext.ux.Portal.superclass.initEvents.call(this);\r
+ this.dd = new Ext.ux.Portal.DropZone(this, this.dropConfig);\r
+ },\r
+ \r
+ beforeDestroy : function() {\r
+ if(this.dd){\r
+ this.dd.unreg();\r
+ }\r
+ Ext.ux.Portal.superclass.beforeDestroy.call(this);\r
+ }\r
+});\r
+\r
+Ext.reg('portal', Ext.ux.Portal);\r
+\r
+\r
+Ext.ux.Portal.DropZone = function(portal, cfg){\r
+ this.portal = portal;\r
+ Ext.dd.ScrollManager.register(portal.body);\r
+ Ext.ux.Portal.DropZone.superclass.constructor.call(this, portal.bwrap.dom, cfg);\r
+ portal.body.ddScrollConfig = this.ddScrollConfig;\r
+};\r
+\r
+Ext.extend(Ext.ux.Portal.DropZone, Ext.dd.DropTarget, {\r
+ ddScrollConfig : {\r
+ vthresh: 50,\r
+ hthresh: -1,\r
+ animate: true,\r
+ increment: 200\r
+ },\r
+\r
+ createEvent : function(dd, e, data, col, c, pos){\r
+ return {\r
+ portal: this.portal,\r
+ panel: data.panel,\r
+ columnIndex: col,\r
+ column: c,\r
+ position: pos,\r
+ data: data,\r
+ source: dd,\r
+ rawEvent: e,\r
+ status: this.dropAllowed\r
+ };\r
+ },\r
+\r
+ notifyOver : function(dd, e, data){\r
+ var xy = e.getXY(), portal = this.portal, px = dd.proxy;\r
+\r
+ // case column widths\r
+ if(!this.grid){\r
+ this.grid = this.getGrid();\r
+ }\r
+\r
+ // handle case scroll where scrollbars appear during drag\r
+ var cw = portal.body.dom.clientWidth;\r
+ if(!this.lastCW){\r
+ this.lastCW = cw;\r
+ }else if(this.lastCW != cw){\r
+ this.lastCW = cw;\r
+ portal.doLayout();\r
+ this.grid = this.getGrid();\r
+ }\r
+\r
+ // determine column\r
+ var col = 0, xs = this.grid.columnX, cmatch = false;\r
+ for(var len = xs.length; col < len; col++){\r
+ if(xy[0] < (xs[col].x + xs[col].w)){\r
+ cmatch = true;\r
+ break;\r
+ }\r
+ }\r
+ // no match, fix last index\r
+ if(!cmatch){\r
+ col--;\r
+ }\r
+\r
+ // find insert position\r
+ var p, match = false, pos = 0,\r
+ c = portal.items.itemAt(col),\r
+ items = c.items.items, overSelf = false;\r
+\r
+ for(var len = items.length; pos < len; pos++){\r
+ p = items[pos];\r
+ var h = p.el.getHeight();\r
+ if(h === 0){\r
+ overSelf = true;\r
+ }\r
+ else if((p.el.getY()+(h/2)) > xy[1]){\r
+ match = true;\r
+ break;\r
+ }\r
+ }\r
+\r
+ pos = (match && p ? pos : c.items.getCount()) + (overSelf ? -1 : 0);\r
+ var overEvent = this.createEvent(dd, e, data, col, c, pos);\r
+\r
+ if(portal.fireEvent('validatedrop', overEvent) !== false &&\r
+ portal.fireEvent('beforedragover', overEvent) !== false){\r
+\r
+ // make sure proxy width is fluid\r
+ px.getProxy().setWidth('auto');\r
+\r
+ if(p){\r
+ px.moveProxy(p.el.dom.parentNode, match ? p.el.dom : null);\r
+ }else{\r
+ px.moveProxy(c.el.dom, null);\r
+ }\r
+\r
+ this.lastPos = {c: c, col: col, p: overSelf || (match && p) ? pos : false};\r
+ this.scrollPos = portal.body.getScroll();\r
+\r
+ portal.fireEvent('dragover', overEvent);\r
+\r
+ return overEvent.status;\r
+ }else{\r
+ return overEvent.status;\r
+ }\r
+\r
+ },\r
+\r
+ notifyOut : function(){\r
+ delete this.grid;\r
+ },\r
+\r
+ notifyDrop : function(dd, e, data){\r
+ delete this.grid;\r
+ if(!this.lastPos){\r
+ return;\r
+ }\r
+ var c = this.lastPos.c, col = this.lastPos.col, pos = this.lastPos.p;\r
+\r
+ var dropEvent = this.createEvent(dd, e, data, col, c,\r
+ pos !== false ? pos : c.items.getCount());\r
+\r
+ if(this.portal.fireEvent('validatedrop', dropEvent) !== false &&\r
+ this.portal.fireEvent('beforedrop', dropEvent) !== false){\r
+\r
+ dd.proxy.getProxy().remove();\r
+ dd.panel.el.dom.parentNode.removeChild(dd.panel.el.dom);\r
+ \r
+ if(pos !== false){\r
+ if(c == dd.panel.ownerCt && (c.items.items.indexOf(dd.panel) <= pos)){\r
+ pos++;\r
+ }\r
+ c.insert(pos, dd.panel);\r
+ }else{\r
+ c.add(dd.panel);\r
+ }\r
+ \r
+ c.doLayout();\r
+\r
+ this.portal.fireEvent('drop', dropEvent);\r
+\r
+ // scroll position is lost on drop, fix it\r
+ var st = this.scrollPos.top;\r
+ if(st){\r
+ var d = this.portal.body.dom;\r
+ setTimeout(function(){\r
+ d.scrollTop = st;\r
+ }, 10);\r
+ }\r
+\r
+ }\r
+ delete this.lastPos;\r
+ },\r
+\r
+ // internal cache of body and column coords\r
+ getGrid : function(){\r
+ var box = this.portal.bwrap.getBox();\r
+ box.columnX = [];\r
+ this.portal.items.each(function(c){\r
+ box.columnX.push({x: c.el.getX(), w: c.el.getWidth()});\r
+ });\r
+ return box;\r
+ },\r
+\r
+ // unregister the dropzone from ScrollManager\r
+ unreg: function() {\r
+ //Ext.dd.ScrollManager.unregister(this.portal.body);\r
+ Ext.ux.Portal.DropZone.superclass.unreg.call(this);\r
+ }\r
+});\r
+Ext.ux.PortalColumn = Ext.extend(Ext.Container, {\r
+ layout : 'anchor',\r
+ //autoEl : 'div',//already defined by Ext.Component\r
+ defaultType : 'portlet',\r
+ cls : 'x-portal-column'\r
+});\r
+\r
+Ext.reg('portalcolumn', Ext.ux.PortalColumn);\r
+Ext.ux.Portlet = Ext.extend(Ext.Panel, {\r
+ anchor : '100%',\r
+ frame : true,\r
+ collapsible : true,\r
+ draggable : true,\r
+ cls : 'x-portlet'\r
+});\r
+\r
+Ext.reg('portlet', Ext.ux.Portlet);\r
+/**
+* @class Ext.ux.ProgressBarPager
+* @extends Object
+* Plugin (ptype = 'tabclosemenu') for displaying a progressbar inside of a paging toolbar instead of plain text
+*
+* @ptype progressbarpager
+* @constructor
+* Create a new ItemSelector
+* @param {Object} config Configuration options
+* @xtype itemselector
+*/
+Ext.ux.ProgressBarPager = Ext.extend(Object, {
+ /**
+ * @cfg {Integer} progBarWidth
+ * <p>The default progress bar width. Default is 225.</p>
+ */
+ progBarWidth : 225,
+ /**
+ * @cfg {String} defaultText
+ * <p>The text to display while the store is loading. Default is 'Loading...'</p>
+ */
+ defaultText : 'Loading...',
+ /**
+ * @cfg {Object} defaultAnimCfg
+ * <p>A {@link Ext.Fx Ext.Fx} configuration object. Default is { duration : 1, easing : 'bounceOut' }.</p>
+ */
+ defaultAnimCfg : {
+ duration : 1,
+ easing : 'bounceOut'
+ },
+ constructor : function(config) {
+ if (config) {
+ Ext.apply(this, config);
+ }
+ },
+ //public
+ init : function (parent) {
+
+ if(parent.displayInfo){
+ this.parent = parent;
+ var ind = parent.items.indexOf(parent.displayItem);
+ parent.remove(parent.displayItem, true);
+ this.progressBar = new Ext.ProgressBar({
+ text : this.defaultText,
+ width : this.progBarWidth,
+ animate : this.defaultAnimCfg
+ });
+
+ parent.displayItem = this.progressBar;
+
+ parent.add(parent.displayItem);
+ parent.doLayout();
+ Ext.apply(parent, this.parentOverrides);
+
+ this.progressBar.on('render', function(pb) {
+ pb.mon(pb.getEl().applyStyles('cursor:pointer'), 'click', this.handleProgressBarClick, this);
+ }, this, {single: true});
+
+ }
+
+ },
+ // private
+ // This method handles the click for the progress bar
+ handleProgressBarClick : function(e){
+ var parent = this.parent,
+ displayItem = parent.displayItem,
+ box = this.progressBar.getBox(),
+ xy = e.getXY(),
+ position = xy[0]-box.x,
+ pages = Math.ceil(parent.store.getTotalCount()/parent.pageSize),
+ newpage = Math.ceil(position/(displayItem.width/pages));
+
+ parent.changePage(newpage);
+ },
+
+ // private, overriddes
+ parentOverrides : {
+ // private
+ // This method updates the information via the progress bar.
+ updateInfo : function(){
+ if(this.displayItem){
+ var count = this.store.getCount(),
+ pgData = this.getPageData(),
+ pageNum = this.readPage(pgData),
+ msg = count == 0 ?
+ this.emptyMsg :
+ String.format(