diff options
Diffstat (limited to 'deluge/ui/web/js/extjs')
-rw-r--r-- | deluge/ui/web/js/extjs/ext-extensions-debug.js | 2927 | ||||
-rw-r--r-- | deluge/ui/web/js/extjs/ext-extensions.js | 84 |
2 files changed, 0 insertions, 3011 deletions
diff --git a/deluge/ui/web/js/extjs/ext-extensions-debug.js b/deluge/ui/web/js/extjs/ext-extensions-debug.js deleted file mode 100644 index 8a05e61..0000000 --- a/deluge/ui/web/js/extjs/ext-extensions-debug.js +++ /dev/null @@ -1,2927 +0,0 @@ -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -Ext.ns('Ext.ux.form'); - -/** - * @class Ext.ux.form.FileUploadField - * @extends Ext.form.TextField - * Creates a file upload field. - * @xtype fileuploadfield - */ -Ext.ux.form.FileUploadField = Ext.extend(Ext.form.TextField, { - /** - * @cfg {String} buttonText The button text to display on the upload button (defaults to - * 'Browse...'). Note that if you supply a value for {@link #buttonCfg}, the buttonCfg.text - * value will be used instead if available. - */ - buttonText: 'Browse...', - /** - * @cfg {Boolean} buttonOnly True to display the file upload field as a button with no visible - * text field (defaults to false). If true, all inherited TextField members will still be available. - */ - buttonOnly: false, - /** - * @cfg {Number} buttonOffset The number of pixels of space reserved between the button and the text field - * (defaults to 3). Note that this only applies if {@link #buttonOnly} = false. - */ - buttonOffset: 3, - - /** - * @cfg {Boolean} multiple True to select more than one file. (defaults to false). - * Note that this only applies if the HTML doc is using HTML5. - */ - multiple: false, - - /** - * @cfg {Object} buttonCfg A standard {@link Ext.Button} config object. - */ - - // private - readOnly: true, - - /** - * @hide - * @method autoSize - */ - autoSize: Ext.emptyFn, - - // private - initComponent: function () { - Ext.ux.form.FileUploadField.superclass.initComponent.call(this); - - this.addEvents( - /** - * @event fileselected - * Fires when the underlying file input field's value has changed from the user - * selecting a new file from the system file selection dialog. - * @param {Ext.ux.form.FileUploadField} this - * @param {String} value The file value returned by the underlying file input field - */ - 'fileselected' - ); - }, - - // private - onRender: function (ct, position) { - Ext.ux.form.FileUploadField.superclass.onRender.call( - this, - ct, - position - ); - - this.wrap = this.el.wrap({ cls: 'x-form-field-wrap x-form-file-wrap' }); - this.el.addClass('x-form-file-text'); - this.el.dom.removeAttribute('name'); - this.createFileInput(); - - var btnCfg = Ext.applyIf(this.buttonCfg || {}, { - text: this.buttonText, - }); - this.button = new Ext.Button( - Ext.apply(btnCfg, { - renderTo: this.wrap, - cls: 'x-form-file-btn' + (btnCfg.iconCls ? ' x-btn-icon' : ''), - }) - ); - - if (this.buttonOnly) { - this.el.hide(); - this.wrap.setWidth(this.button.getEl().getWidth()); - } - - this.bindListeners(); - this.resizeEl = this.positionEl = this.wrap; - }, - - bindListeners: function () { - this.fileInput.on({ - scope: this, - mouseenter: function () { - this.button.addClass(['x-btn-over', 'x-btn-focus']); - }, - mouseleave: function () { - this.button.removeClass([ - 'x-btn-over', - 'x-btn-focus', - 'x-btn-click', - ]); - }, - mousedown: function () { - this.button.addClass('x-btn-click'); - }, - mouseup: function () { - this.button.removeClass([ - 'x-btn-over', - 'x-btn-focus', - 'x-btn-click', - ]); - }, - change: function () { - var value = this.fileInput.dom.files; - // Fallback to value. - if (!value) value = this.fileInput.dom.value; - this.setValue(value); - this.fireEvent('fileselected', this, value); - }, - }); - }, - - createFileInput: function () { - this.fileInput = this.wrap.createChild({ - id: this.getFileInputId(), - name: this.name || this.getId(), - cls: 'x-form-file', - tag: 'input', - type: 'file', - size: 1, - }); - this.fileInput.dom.multiple = this.multiple; - }, - - reset: function () { - if (this.rendered) { - this.fileInput.remove(); - this.createFileInput(); - this.bindListeners(); - } - Ext.ux.form.FileUploadField.superclass.reset.call(this); - }, - - // private - getFileInputId: function () { - return this.id + '-file'; - }, - - // private - onResize: function (w, h) { - Ext.ux.form.FileUploadField.superclass.onResize.call(this, w, h); - - this.wrap.setWidth(w); - - if (!this.buttonOnly) { - var w = - this.wrap.getWidth() - - this.button.getEl().getWidth() - - this.buttonOffset; - this.el.setWidth(w); - } - }, - - // private - onDestroy: function () { - Ext.ux.form.FileUploadField.superclass.onDestroy.call(this); - Ext.destroy(this.fileInput, this.button, this.wrap); - }, - - onDisable: function () { - Ext.ux.form.FileUploadField.superclass.onDisable.call(this); - this.doDisable(true); - }, - - onEnable: function () { - Ext.ux.form.FileUploadField.superclass.onEnable.call(this); - this.doDisable(false); - }, - - // private - doDisable: function (disabled) { - this.fileInput.dom.disabled = disabled; - this.button.setDisabled(disabled); - }, - - // private - preFocus: Ext.emptyFn, - - // private - alignErrorIcon: function () { - this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); - }, -}); - -Ext.reg('fileuploadfield', Ext.ux.form.FileUploadField); - -// backwards compat -Ext.form.FileUploadField = Ext.ux.form.FileUploadField; -/** - * Ext.ux.form.RadioGroup.js - * - * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ - -// Allow radiogroups to be treated as a single form element. -Ext.override(Ext.form.RadioGroup, { - afterRender: function () { - this.items.each(function (i) { - this.relayEvents(i, ['check']); - }, this); - if (this.lazyValue) { - this.setValue(this.value); - delete this.value; - delete this.lazyValue; - } - Ext.form.RadioGroup.superclass.afterRender.call(this); - }, - - getName: function () { - return this.items.first().getName(); - }, - - getValue: function () { - return this.items.first().getGroupValue(); - }, - - setValue: function (v) { - if (!this.items.each) { - this.value = v; - this.lazyValue = true; - return; - } - this.items.each(function (item) { - if (item.rendered) { - var checked = item.el.getValue() == String(v); - item.el.dom.checked = checked; - item.el.dom.defaultChecked = checked; - item.wrap[checked ? 'addClass' : 'removeClass']( - item.checkedCls - ); - } - }); - }, -}); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -Ext.ns('Ext.ux.form'); - -/** - * @class Ext.ux.form.SpinnerField - * @extends Ext.form.NumberField - * Creates a field utilizing Ext.ux.Spinner - * @xtype spinnerfield - */ -Ext.ux.form.SpinnerField = Ext.extend(Ext.form.NumberField, { - actionMode: 'wrap', - deferHeight: true, - autoSize: Ext.emptyFn, - onBlur: Ext.emptyFn, - adjustSize: Ext.BoxComponent.prototype.adjustSize, - - constructor: function (config) { - var spinnerConfig = Ext.copyTo( - {}, - config, - 'incrementValue,alternateIncrementValue,accelerate,defaultValue,triggerClass,splitterClass' - ); - - var spl = (this.spinner = new Ext.ux.Spinner(spinnerConfig)); - - var plugins = config.plugins - ? Ext.isArray(config.plugins) - ? config.plugins.push(spl) - : [config.plugins, spl] - : spl; - - Ext.ux.form.SpinnerField.superclass.constructor.call( - this, - Ext.apply(config, { plugins: plugins }) - ); - }, - - // private - getResizeEl: function () { - return this.wrap; - }, - - // private - getPositionEl: function () { - return this.wrap; - }, - - // private - alignErrorIcon: function () { - if (this.wrap) { - this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); - } - }, - - validateBlur: function () { - return true; - }, -}); - -Ext.reg('spinnerfield', Ext.ux.form.SpinnerField); - -//backwards compat -Ext.form.SpinnerField = Ext.ux.form.SpinnerField; -/** - * Ext.ux.form.SpinnerField.js - * - * Copyright (c) Damien Churchill 2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ - -Ext.override(Ext.ux.form.SpinnerField, { - onBlur: Ext.form.Field.prototype.onBlur, -}); -/** - * Ext.ux.form.SpinnerGroup.js - * - * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ -Ext.ns('Ext.ux.form'); - -/** - * - */ -Ext.ux.form.SpinnerGroup = Ext.extend(Ext.form.CheckboxGroup, { - // private - defaultType: 'spinnerfield', - anchor: '98%', - - // private - groupCls: 'x-form-spinner-group', - - colCfg: {}, - - // private - onRender: function (ct, position) { - if (!this.el) { - var panelCfg = { - cls: this.groupCls, - layout: 'column', - border: false, - renderTo: ct, - }; - var colCfg = Ext.apply( - { - defaultType: this.defaultType, - layout: 'form', - border: false, - labelWidth: 60, - defaults: { - hideLabel: true, - anchor: '60%', - }, - }, - this.colCfg - ); - - if (this.items[0].items) { - // The container has standard ColumnLayout configs, so pass them in directly - - Ext.apply(panelCfg, { - layoutConfig: { columns: this.items.length }, - defaults: this.defaults, - items: this.items, - }); - for (var i = 0, len = this.items.length; i < len; i++) { - Ext.applyIf(this.items[i], colCfg); - } - } else { - // The container has field item configs, so we have to generate the column - // panels first then move the items into the columns as needed. - - var numCols, - cols = []; - - if (typeof this.columns == 'string') { - // 'auto' so create a col per item - this.columns = this.items.length; - } - if (!Ext.isArray(this.columns)) { - var cs = []; - for (var i = 0; i < this.columns; i++) { - cs.push((100 / this.columns) * 0.01); // distribute by even % - } - this.columns = cs; - } - - numCols = this.columns.length; - - // Generate the column configs with the correct width setting - for (var i = 0; i < numCols; i++) { - var cc = Ext.apply({ items: [] }, colCfg); - cc[this.columns[i] <= 1 ? 'columnWidth' : 'width'] = - this.columns[i]; - if (this.defaults) { - cc.defaults = Ext.apply( - cc.defaults || {}, - this.defaults - ); - } - cols.push(cc); - } - - // Distribute the original items into the columns - if (this.vertical) { - var rows = Math.ceil(this.items.length / numCols), - ri = 0; - for (var i = 0, len = this.items.length; i < len; i++) { - if (i > 0 && i % rows == 0) { - ri++; - } - if (this.items[i].fieldLabel) { - this.items[i].hideLabel = false; - } - cols[ri].items.push(this.items[i]); - } - } else { - for (var i = 0, len = this.items.length; i < len; i++) { - var ci = i % numCols; - if (this.items[i].fieldLabel) { - this.items[i].hideLabel = false; - } - cols[ci].items.push(this.items[i]); - } - } - - Ext.apply(panelCfg, { - layoutConfig: { columns: numCols }, - items: cols, - }); - } - - this.panel = new Ext.Panel(panelCfg); - this.el = this.panel.getEl(); - - if (this.forId && this.itemCls) { - var l = this.el.up(this.itemCls).child('label', true); - if (l) { - l.setAttribute('htmlFor', this.forId); - } - } - - var fields = this.panel.findBy(function (c) { - return c.isFormField; - }, this); - - this.items = new Ext.util.MixedCollection(); - this.items.addAll(fields); - - this.items.each(function (field) { - field.on('spin', this.onFieldChange, this); - field.on('change', this.onFieldChange, this); - }, this); - - if (this.lazyValueSet) { - this.setValue(this.value); - delete this.value; - delete this.lazyValueSet; - } - - if (this.lazyRawValueSet) { - this.setRawValue(this.rawValue); - delete this.rawValue; - delete this.lazyRawValueSet; - } - } - - Ext.ux.form.SpinnerGroup.superclass.onRender.call(this, ct, position); - }, - - onFieldChange: function (spinner) { - this.fireEvent('change', this, this.getValue()); - }, - - initValue: Ext.emptyFn, - - getValue: function () { - var value = [this.items.getCount()]; - this.items.each(function (item, i) { - value[i] = Number(item.getValue()); - }); - return value; - }, - - getRawValue: function () { - var value = [this.items.getCount()]; - this.items.each(function (item, i) { - value[i] = Number(item.getRawValue()); - }); - return value; - }, - - setValue: function (value) { - if (!this.rendered) { - this.value = value; - this.lazyValueSet = true; - } else { - this.items.each(function (item, i) { - item.setValue(value[i]); - }); - } - }, - - setRawValue: function (value) { - if (!this.rendered) { - this.rawValue = value; - this.lazyRawValueSet = true; - } else { - this.items.each(function (item, i) { - item.setRawValue(value[i]); - }); - } - }, -}); -Ext.reg('spinnergroup', Ext.ux.form.SpinnerGroup); -/** - * Ext.ux.form.ToggleField.js - * - * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ -Ext.namespace('Ext.ux.form'); - -/** - * Ext.ux.form.ToggleField class - * - * @author Damien Churchill - * @version v0.1 - * - * @class Ext.ux.form.ToggleField - * @extends Ext.form.TriggerField - */ -Ext.ux.form.ToggleField = Ext.extend(Ext.form.Field, { - cls: 'x-toggle-field', - - initComponent: function () { - Ext.ux.form.ToggleField.superclass.initComponent.call(this); - - this.toggle = new Ext.form.Checkbox(); - this.toggle.on('check', this.onToggleCheck, this); - - this.input = new Ext.form.TextField({ - disabled: true, - }); - }, - - onRender: function (ct, position) { - if (!this.el) { - this.panel = new Ext.Panel({ - cls: this.groupCls, - layout: 'table', - layoutConfig: { - columns: 2, - }, - border: false, - renderTo: ct, - }); - this.panel.ownerCt = this; - this.el = this.panel.getEl(); - - this.panel.add(this.toggle); - this.panel.add(this.input); - this.panel.doLayout(); - - this.toggle.getEl().parent().setStyle('padding-right', '10px'); - } - Ext.ux.form.ToggleField.superclass.onRender.call(this, ct, position); - }, - - // private - onResize: function (w, h) { - this.panel.setSize(w, h); - this.panel.doLayout(); - - // we substract 10 for the padding :-) - var inputWidth = w - this.toggle.getSize().width - 25; - this.input.setSize(inputWidth, h); - }, - - onToggleCheck: function (toggle, checked) { - this.input.setDisabled(!checked); - }, -}); -Ext.reg('togglefield', Ext.ux.form.ToggleField); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -Ext.ns('Ext.ux.grid'); - -/** - * @class Ext.ux.grid.BufferView - * @extends Ext.grid.GridView - * A custom GridView which renders rows on an as-needed basis. - */ -Ext.ux.grid.BufferView = Ext.extend(Ext.grid.GridView, { - /** - * @cfg {Number} rowHeight - * The height of a row in the grid. - */ - rowHeight: 19, - - /** - * @cfg {Number} borderHeight - * The combined height of border-top and border-bottom of a row. - */ - borderHeight: 2, - - /** - * @cfg {Boolean/Number} scrollDelay - * The number of milliseconds before rendering rows out of the visible - * viewing area. Defaults to 100. Rows will render immediately with a config - * of false. - */ - scrollDelay: 100, - - /** - * @cfg {Number} cacheSize - * The number of rows to look forward and backwards from the currently viewable - * area. The cache applies only to rows that have been rendered already. - */ - cacheSize: 20, - - /** - * @cfg {Number} cleanDelay - * The number of milliseconds to buffer cleaning of extra rows not in the - * cache. - */ - cleanDelay: 500, - - initTemplates: function () { - Ext.ux.grid.BufferView.superclass.initTemplates.call(this); - var ts = this.templates; - // empty div to act as a place holder for a row - ts.rowHolder = new Ext.Template( - '<div class="x-grid3-row {alt}" style="{tstyle}"></div>' - ); - ts.rowHolder.disableFormats = true; - ts.rowHolder.compile(); - - ts.rowBody = new Ext.Template( - '<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">', - '<tbody><tr>{cells}</tr>', - this.enableRowBody - ? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>' - : '', - '</tbody></table>' - ); - ts.rowBody.disableFormats = true; - ts.rowBody.compile(); - }, - - getStyleRowHeight: function () { - return Ext.isBorderBox - ? this.rowHeight + this.borderHeight - : this.rowHeight; - }, - - getCalculatedRowHeight: function () { - return this.rowHeight + this.borderHeight; - }, - - getVisibleRowCount: function () { - var rh = this.getCalculatedRowHeight(), - visibleHeight = this.scroller.dom.clientHeight; - return visibleHeight < 1 ? 0 : Math.ceil(visibleHeight / rh); - }, - - getVisibleRows: function () { - var count = this.getVisibleRowCount(), - sc = this.scroller.dom.scrollTop, - start = - sc === 0 - ? 0 - : Math.floor(sc / this.getCalculatedRowHeight()) - 1; - return { - first: Math.max(start, 0), - last: Math.min(start + count + 2, this.ds.getCount() - 1), - }; - }, - - doRender: function (cs, rs, ds, startRow, colCount, stripe, onlyBody) { - var ts = this.templates, - ct = ts.cell, - rt = ts.row, - rb = ts.rowBody, - last = colCount - 1, - rh = this.getStyleRowHeight(), - vr = this.getVisibleRows(), - tstyle = 'width:' + this.getTotalWidth() + ';height:' + rh + 'px;', - // buffers - buf = [], - cb, - c, - p = {}, - rp = { tstyle: tstyle }, - r; - for (var j = 0, len = rs.length; j < len; j++) { - r = rs[j]; - cb = []; - var rowIndex = j + startRow, - visible = rowIndex >= vr.first && rowIndex <= vr.last; - if (visible) { - for (var i = 0; i < colCount; i++) { - c = cs[i]; - p.id = c.id; - p.css = - i === 0 - ? 'x-grid3-cell-first ' - : i == last - ? 'x-grid3-cell-last ' - : ''; - p.attr = p.cellAttr = ''; - p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds); - p.style = c.style; - if (p.value === undefined || p.value === '') { - p.value = ' '; - } - if (r.dirty && typeof r.modified[c.name] !== 'undefined') { - p.css += ' x-grid3-dirty-cell'; - } - cb[cb.length] = ct.apply(p); - } - } - var alt = []; - if (stripe && (rowIndex + 1) % 2 === 0) { - alt[0] = 'x-grid3-row-alt'; - } - if (r.dirty) { - alt[1] = ' x-grid3-dirty-row'; - } - rp.cols = colCount; - if (this.getRowClass) { - alt[2] = this.getRowClass(r, rowIndex, rp, ds); - } - rp.alt = alt.join(' '); - rp.cells = cb.join(''); - buf[buf.length] = !visible - ? ts.rowHolder.apply(rp) - : onlyBody - ? rb.apply(rp) - : rt.apply(rp); - } - return buf.join(''); - }, - - isRowRendered: function (index) { - var row = this.getRow(index); - return row && row.childNodes.length > 0; - }, - - syncScroll: function () { - Ext.ux.grid.BufferView.superclass.syncScroll.apply(this, arguments); - this.update(); - }, - - // a (optionally) buffered method to update contents of gridview - update: function () { - if (this.scrollDelay) { - if (!this.renderTask) { - this.renderTask = new Ext.util.DelayedTask(this.doUpdate, this); - } - this.renderTask.delay(this.scrollDelay); - } else { - this.doUpdate(); - } - }, - - onRemove: function (ds, record, index, isUpdate) { - Ext.ux.grid.BufferView.superclass.onRemove.apply(this, arguments); - if (isUpdate !== true) { - this.update(); - } - }, - - doUpdate: function () { - if (this.getVisibleRowCount() > 0) { - var g = this.grid, - cm = g.colModel, - ds = g.store, - cs = this.getColumnData(), - vr = this.getVisibleRows(), - row; - for (var i = vr.first; i <= vr.last; i++) { - // if row is NOT rendered and is visible, render it - if (!this.isRowRendered(i) && (row = this.getRow(i))) { - var html = this.doRender( - cs, - [ds.getAt(i)], - ds, - i, - cm.getColumnCount(), - g.stripeRows, - true - ); - row.innerHTML = html; - } - } - this.clean(); - } - }, - - // a buffered method to clean rows - clean: function () { - if (!this.cleanTask) { - this.cleanTask = new Ext.util.DelayedTask(this.doClean, this); - } - this.cleanTask.delay(this.cleanDelay); - }, - - doClean: function () { - if (this.getVisibleRowCount() > 0) { - var vr = this.getVisibleRows(); - vr.first -= this.cacheSize; - vr.last += this.cacheSize; - - var i = 0, - rows = this.getRows(); - // if first is less than 0, all rows have been rendered - // so lets clean the end... - if (vr.first <= 0) { - i = vr.last + 1; - } - for (var len = this.ds.getCount(); i < len; i++) { - // if current row is outside of first and last and - // has content, update the innerHTML to nothing - if ((i < vr.first || i > vr.last) && rows[i].innerHTML) { - rows[i].innerHTML = ''; - } - } - } - }, - - removeTask: function (name) { - var task = this[name]; - if (task && task.cancel) { - task.cancel(); - this[name] = null; - } - }, - - destroy: function () { - this.removeTask('cleanTask'); - this.removeTask('renderTask'); - Ext.ux.grid.BufferView.superclass.destroy.call(this); - }, - - layout: function () { - Ext.ux.grid.BufferView.superclass.layout.call(this); - this.update(); - }, -}); -/** - * Ext.ux.layout.FormLayoutFix.js - * - * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ - -// Taken from http://extjs.com/forum/showthread.php?t=75273 -// remove spaces for hidden elements and make show(), hide(), enable() and disable() act on -// the label. don't use hideLabel with this. -Ext.override(Ext.layout.FormLayout, { - renderItem: function (c, position, target) { - if ( - c && - !c.rendered && - (c.isFormField || c.fieldLabel) && - c.inputType != 'hidden' - ) { - var args = this.getTemplateArgs(c); - if (typeof position == 'number') { - position = target.dom.childNodes[position] || null; - } - if (position) { - c.formItem = this.fieldTpl.insertBefore(position, args, true); - } else { - c.formItem = this.fieldTpl.append(target, args, true); - } - c.actionMode = 'formItem'; - c.render('x-form-el-' + c.id); - c.container = c.formItem; - c.actionMode = 'container'; - } else { - Ext.layout.FormLayout.superclass.renderItem.apply(this, arguments); - } - }, -}); -/** - * Ext.ux.tree.MultiSelectionModelFix.js - * - * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ - -/** - * This enhances the MSM to allow for shift selecting in tree grids etc. - * @author Damien Churchill <damoxc@gmail.com> - */ -Ext.override(Ext.tree.MultiSelectionModel, { - onNodeClick: function (node, e) { - if (e.ctrlKey && this.isSelected(node)) { - this.unselect(node); - } else if (e.shiftKey && !this.isSelected(node)) { - var parentNode = node.parentNode; - // We can only shift select files in the same node - if (this.lastSelNode.parentNode.id != parentNode.id) return; - - // Get the node indexes - var fi = parentNode.indexOf(node), - li = parentNode.indexOf(this.lastSelNode); - - // Select the last clicked node and wipe old selections - this.select(this.lastSelNode, e, false, true); - - // Swap the values if required - if (fi > li) { - (fi = fi + li), (li = fi - li), (fi = fi - li); - } - - // Select all the nodes - parentNode.eachChild(function (n) { - var i = parentNode.indexOf(n); - if (fi < i && i < li) { - this.select(n, e, true, true); - } - }, this); - - // Select the clicked node - this.select(node, e, true); - } else { - this.select(node, e, e.ctrlKey); - } - }, - - select: function (node, e, keepExisting, suppressEvent) { - if (keepExisting !== true) { - this.clearSelections(true); - } - if (this.isSelected(node)) { - this.lastSelNode = node; - return node; - } - this.selNodes.push(node); - this.selMap[node.id] = node; - this.lastSelNode = node; - node.ui.onSelectedChange(true); - if (suppressEvent !== true) { - this.fireEvent('selectionchange', this, this.selNodes); - } - return node; - }, -}); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -Ext.ns('Ext.ux.tree'); - -/** - * @class Ext.ux.tree.TreeGrid - * @extends Ext.tree.TreePanel - * - * @xtype treegrid - */ -Ext.ux.tree.TreeGrid = Ext.extend(Ext.tree.TreePanel, { - rootVisible: false, - useArrows: true, - lines: false, - borderWidth: Ext.isBorderBox ? 0 : 2, // the combined left/right border for each cell - cls: 'x-treegrid', - - columnResize: true, - enableSort: true, - reserveScrollOffset: true, - enableHdMenu: true, - - columnsText: 'Columns', - - initComponent: function () { - if (!this.root) { - this.root = new Ext.tree.AsyncTreeNode({ text: 'Root' }); - } - - // initialize the loader - var l = this.loader; - if (!l) { - l = new Ext.ux.tree.TreeGridLoader({ - dataUrl: this.dataUrl, - requestMethod: this.requestMethod, - store: this.store, - }); - } else if (Ext.isObject(l) && !l.load) { - l = new Ext.ux.tree.TreeGridLoader(l); - } - this.loader = l; - - Ext.ux.tree.TreeGrid.superclass.initComponent.call(this); - - this.initColumns(); - - if (this.enableSort) { - this.treeGridSorter = new Ext.ux.tree.TreeGridSorter( - this, - this.enableSort - ); - } - - if (this.columnResize) { - this.colResizer = new Ext.tree.ColumnResizer(this.columnResize); - this.colResizer.init(this); - } - - var c = this.columns; - if (!this.internalTpl) { - this.internalTpl = new Ext.XTemplate( - '<div class="x-grid3-header">', - '<div class="x-treegrid-header-inner">', - '<div class="x-grid3-header-offset">', - '<table style="table-layout: fixed;" cellspacing="0" cellpadding="0" border="0"><colgroup><tpl for="columns"><col /></tpl></colgroup>', - '<thead><tr class="x-grid3-hd-row">', - '<tpl for="columns">', - '<td class="x-grid3-hd x-grid3-cell x-treegrid-hd" style="text-align: {align};" id="', - this.id, - '-xlhd-{#}">', - '<div class="x-grid3-hd-inner x-treegrid-hd-inner" unselectable="on">', - this.enableHdMenu - ? '<a class="x-grid3-hd-btn" href="#"></a>' - : '', - '{header}<img class="x-grid3-sort-icon" src="', - Ext.BLANK_IMAGE_URL, - '" />', - '</div>', - '</td></tpl>', - '</tr></thead>', - '</table>', - '</div></div>', - '</div>', - '<div class="x-treegrid-root-node">', - '<table class="x-treegrid-root-table" cellpadding="0" cellspacing="0" style="table-layout: fixed;"></table>', - '</div>' - ); - } - - if (!this.colgroupTpl) { - this.colgroupTpl = new Ext.XTemplate( - '<colgroup><tpl for="columns"><col style="width: {width}px"/></tpl></colgroup>' - ); - } - }, - - initColumns: function () { - var cs = this.columns, - len = cs.length, - columns = [], - i, - c; - - for (i = 0; i < len; i++) { - c = cs[i]; - if (!c.isColumn) { - c.xtype = c.xtype - ? /^tg/.test(c.xtype) - ? c.xtype - : 'tg' + c.xtype - : 'tgcolumn'; - c = Ext.create(c); - } - c.init(this); - columns.push(c); - - if (this.enableSort !== false && c.sortable !== false) { - c.sortable = true; - this.enableSort = true; - } - } - - this.columns = columns; - }, - - onRender: function () { - Ext.tree.TreePanel.superclass.onRender.apply(this, arguments); - - this.el.addClass('x-treegrid'); - - this.outerCt = this.body.createChild({ - cls: - 'x-tree-root-ct x-treegrid-ct ' + - (this.useArrows - ? 'x-tree-arrows' - : this.lines - ? 'x-tree-lines' - : 'x-tree-no-lines'), - }); - - this.internalTpl.overwrite(this.outerCt, { columns: this.columns }); - - this.mainHd = Ext.get(this.outerCt.dom.firstChild); - this.innerHd = Ext.get(this.mainHd.dom.firstChild); - this.innerBody = Ext.get(this.outerCt.dom.lastChild); - this.innerCt = Ext.get(this.innerBody.dom.firstChild); - - this.colgroupTpl.insertFirst(this.innerCt, { columns: this.columns }); - - if (this.hideHeaders) { - this.el.child('.x-grid3-header').setDisplayed('none'); - } else if (this.enableHdMenu !== false) { - this.hmenu = new Ext.menu.Menu({ id: this.id + '-hctx' }); - if (this.enableColumnHide !== false) { - this.colMenu = new Ext.menu.Menu({ - id: this.id + '-hcols-menu', - }); - this.colMenu.on({ - scope: this, - beforeshow: this.beforeColMenuShow, - itemclick: this.handleHdMenuClick, - }); - this.hmenu.add({ - itemId: 'columns', - hideOnClick: false, - text: this.columnsText, - menu: this.colMenu, - iconCls: 'x-cols-icon', - }); - } - this.hmenu.on('itemclick', this.handleHdMenuClick, this); - } - }, - - setRootNode: function (node) { - node.attributes.uiProvider = Ext.ux.tree.TreeGridRootNodeUI; - node = Ext.ux.tree.TreeGrid.superclass.setRootNode.call(this, node); - if (this.innerCt) { - this.colgroupTpl.insertFirst(this.innerCt, { - columns: this.columns, - }); - } - return node; - }, - - clearInnerCt: function () { - if (Ext.isIE) { - var dom = this.innerCt.dom; - while (dom.firstChild) { - dom.removeChild(dom.firstChild); - } - } else { - Ext.ux.tree.TreeGrid.superclass.clearInnerCt.call(this); - } - }, - - initEvents: function () { - Ext.ux.tree.TreeGrid.superclass.initEvents.apply(this, arguments); - - this.mon(this.innerBody, 'scroll', this.syncScroll, this); - this.mon(this.innerHd, 'click', this.handleHdDown, this); - this.mon(this.mainHd, { - scope: this, - mouseover: this.handleHdOver, - mouseout: this.handleHdOut, - }); - }, - - onResize: function (w, h) { - Ext.ux.tree.TreeGrid.superclass.onResize.apply(this, arguments); - - var bd = this.innerBody.dom; - var hd = this.innerHd.dom; - - if (!bd) { - return; - } - - if (Ext.isNumber(h)) { - bd.style.height = - this.body.getHeight(true) - hd.offsetHeight + 'px'; - } - - if (Ext.isNumber(w)) { - var sw = Ext.num(this.scrollOffset, Ext.getScrollBarWidth()); - if ( - this.reserveScrollOffset || - bd.offsetWidth - bd.clientWidth > 10 - ) { - this.setScrollOffset(sw); - } else { - var me = this; - setTimeout(function () { - me.setScrollOffset( - bd.offsetWidth - bd.clientWidth > 10 ? sw : 0 - ); - }, 10); - } - } - }, - - updateColumnWidths: function () { - var cols = this.columns, - colCount = cols.length, - groups = this.outerCt.query('colgroup'), - groupCount = groups.length, - c, - g, - i, - j; - - for (i = 0; i < colCount; i++) { - c = cols[i]; - for (j = 0; j < groupCount; j++) { - g = groups[j]; - g.childNodes[i].style.width = (c.hidden ? 0 : c.width) + 'px'; - } - } - - for ( - i = 0, groups = this.innerHd.query('td'), len = groups.length; - i < len; - i++ - ) { - c = Ext.fly(groups[i]); - if (cols[i] && cols[i].hidden) { - c.addClass('x-treegrid-hd-hidden'); - } else { - c.removeClass('x-treegrid-hd-hidden'); - } - } - - var tcw = this.getTotalColumnWidth(); - Ext.fly(this.innerHd.dom.firstChild).setWidth( - tcw + (this.scrollOffset || 0) - ); - this.outerCt.select('table').setWidth(tcw); - this.syncHeaderScroll(); - }, - - getVisibleColumns: function () { - var columns = [], - cs = this.columns, - len = cs.length, - i; - - for (i = 0; i < len; i++) { - if (!cs[i].hidden) { - columns.push(cs[i]); - } - } - return columns; - }, - - getTotalColumnWidth: function () { - var total = 0; - for ( - var i = 0, cs = this.getVisibleColumns(), len = cs.length; - i < len; - i++ - ) { - total += cs[i].width; - } - return total; - }, - - setScrollOffset: function (scrollOffset) { - this.scrollOffset = scrollOffset; - this.updateColumnWidths(); - }, - - // private - handleHdDown: function (e, t) { - var hd = e.getTarget('.x-treegrid-hd'); - - if (hd && Ext.fly(t).hasClass('x-grid3-hd-btn')) { - var ms = this.hmenu.items, - cs = this.columns, - index = this.findHeaderIndex(hd), - c = cs[index], - sort = c.sortable; - - e.stopEvent(); - Ext.fly(hd).addClass('x-grid3-hd-menu-open'); - this.hdCtxIndex = index; - - this.fireEvent('headerbuttonclick', ms, c, hd, index); - - this.hmenu.on( - 'hide', - function () { - Ext.fly(hd).removeClass('x-grid3-hd-menu-open'); - }, - this, - { single: true } - ); - - this.hmenu.show(t, 'tl-bl?'); - } else if (hd) { - var index = this.findHeaderIndex(hd); - this.fireEvent('headerclick', this.columns[index], hd, index); - } - }, - - // private - handleHdOver: function (e, t) { - var hd = e.getTarget('.x-treegrid-hd'); - if (hd && !this.headersDisabled) { - index = this.findHeaderIndex(hd); - this.activeHdRef = t; - this.activeHdIndex = index; - var el = Ext.get(hd); - this.activeHdRegion = el.getRegion(); - el.addClass('x-grid3-hd-over'); - this.activeHdBtn = el.child('.x-grid3-hd-btn'); - if (this.activeHdBtn) { - this.activeHdBtn.dom.style.height = - hd.firstChild.offsetHeight - 1 + 'px'; - } - } - }, - - // private - handleHdOut: function (e, t) { - var hd = e.getTarget('.x-treegrid-hd'); - if (hd && (!Ext.isIE || !e.within(hd, true))) { - this.activeHdRef = null; - Ext.fly(hd).removeClass('x-grid3-hd-over'); - hd.style.cursor = ''; - } - }, - - findHeaderIndex: function (hd) { - hd = hd.dom || hd; - var cs = hd.parentNode.childNodes; - for (var i = 0, c; (c = cs[i]); i++) { - if (c == hd) { - return i; - } - } - return -1; - }, - - // private - beforeColMenuShow: function () { - var cols = this.columns, - colCount = cols.length, - i, - c; - this.colMenu.removeAll(); - for (i = 1; i < colCount; i++) { - c = cols[i]; - if (c.hideable !== false) { - this.colMenu.add( - new Ext.menu.CheckItem({ - itemId: 'col-' + i, - text: c.header, - checked: !c.hidden, - hideOnClick: false, - disabled: c.hideable === false, - }) - ); - } - } - }, - - // private - handleHdMenuClick: function (item) { - var index = this.hdCtxIndex, - id = item.getItemId(); - - if ( - this.fireEvent( - 'headermenuclick', - this.columns[index], - id, - index - ) !== false - ) { - index = id.substr(4); - if (index > 0 && this.columns[index]) { - this.setColumnVisible(index, !item.checked); - } - } - - return true; - }, - - setColumnVisible: function (index, visible) { - this.columns[index].hidden = !visible; - this.updateColumnWidths(); - }, - - /** - * Scrolls the grid to the top - */ - scrollToTop: function () { - this.innerBody.dom.scrollTop = 0; - this.innerBody.dom.scrollLeft = 0; - }, - - // private - syncScroll: function () { - this.syncHeaderScroll(); - var mb = this.innerBody.dom; - this.fireEvent('bodyscroll', mb.scrollLeft, mb.scrollTop); - }, - - // private - syncHeaderScroll: function () { - var mb = this.innerBody.dom; - this.innerHd.dom.scrollLeft = mb.scrollLeft; - this.innerHd.dom.scrollLeft = mb.scrollLeft; // second time for IE (1/2 time first fails, other browsers ignore) - }, - - registerNode: function (n) { - Ext.ux.tree.TreeGrid.superclass.registerNode.call(this, n); - if (!n.uiProvider && !n.isRoot && !n.ui.isTreeGridNodeUI) { - n.ui = new Ext.ux.tree.TreeGridNodeUI(n); - } - }, -}); - -Ext.reg('treegrid', Ext.ux.tree.TreeGrid); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -/** - * @class Ext.tree.ColumnResizer - * @extends Ext.util.Observable - */ -Ext.tree.ColumnResizer = Ext.extend(Ext.util.Observable, { - /** - * @cfg {Number} minWidth The minimum width the column can be dragged to. - * Defaults to <tt>14</tt>. - */ - minWidth: 14, - - constructor: function (config) { - Ext.apply(this, config); - Ext.tree.ColumnResizer.superclass.constructor.call(this); - }, - - init: function (tree) { - this.tree = tree; - tree.on('render', this.initEvents, this); - }, - - initEvents: function (tree) { - tree.mon(tree.innerHd, 'mousemove', this.handleHdMove, this); - this.tracker = new Ext.dd.DragTracker({ - onBeforeStart: this.onBeforeStart.createDelegate(this), - onStart: this.onStart.createDelegate(this), - onDrag: this.onDrag.createDelegate(this), - onEnd: this.onEnd.createDelegate(this), - tolerance: 3, - autoStart: 300, - }); - this.tracker.initEl(tree.innerHd); - tree.on('beforedestroy', this.tracker.destroy, this.tracker); - }, - - handleHdMove: function (e, t) { - var hw = 5, - x = e.getPageX(), - hd = e.getTarget('.x-treegrid-hd', 3, true); - - if (hd) { - var r = hd.getRegion(), - ss = hd.dom.style, - pn = hd.dom.parentNode; - - if (x - r.left <= hw && hd.dom !== pn.firstChild) { - var ps = hd.dom.previousSibling; - while (ps && Ext.fly(ps).hasClass('x-treegrid-hd-hidden')) { - ps = ps.previousSibling; - } - if (ps) { - this.activeHd = Ext.get(ps); - ss.cursor = Ext.isWebKit ? 'e-resize' : 'col-resize'; - } - } else if (r.right - x <= hw) { - var ns = hd.dom; - while (ns && Ext.fly(ns).hasClass('x-treegrid-hd-hidden')) { - ns = ns.previousSibling; - } - if (ns) { - this.activeHd = Ext.get(ns); - ss.cursor = Ext.isWebKit ? 'w-resize' : 'col-resize'; - } - } else { - delete this.activeHd; - ss.cursor = ''; - } - } - }, - - onBeforeStart: function (e) { - this.dragHd = this.activeHd; - return !!this.dragHd; - }, - - onStart: function (e) { - this.dragHeadersDisabled = this.tree.headersDisabled; - this.tree.headersDisabled = true; - this.proxy = this.tree.body.createChild({ cls: 'x-treegrid-resizer' }); - this.proxy.setHeight(this.tree.body.getHeight()); - - var x = this.tracker.getXY()[0]; - - this.hdX = this.dragHd.getX(); - this.hdIndex = this.tree.findHeaderIndex(this.dragHd); - - this.proxy.setX(this.hdX); - this.proxy.setWidth(x - this.hdX); - - this.maxWidth = - this.tree.outerCt.getWidth() - - this.tree.innerBody.translatePoints(this.hdX).left; - }, - - onDrag: function (e) { - var cursorX = this.tracker.getXY()[0]; - this.proxy.setWidth( - (cursorX - this.hdX).constrain(this.minWidth, this.maxWidth) - ); - }, - - onEnd: function (e) { - var nw = this.proxy.getWidth(), - tree = this.tree, - disabled = this.dragHeadersDisabled; - - this.proxy.remove(); - delete this.dragHd; - - tree.columns[this.hdIndex].width = nw; - tree.updateColumnWidths(); - - setTimeout(function () { - tree.headersDisabled = disabled; - }, 100); - }, -}); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -(function () { - Ext.override(Ext.list.Column, { - init: function () { - var types = Ext.data.Types, - st = this.sortType; - - if (this.type) { - if (Ext.isString(this.type)) { - this.type = - Ext.data.Types[this.type.toUpperCase()] || types.AUTO; - } - } else { - this.type = types.AUTO; - } - - // named sortTypes are supported, here we look them up - if (Ext.isString(st)) { - this.sortType = Ext.data.SortTypes[st]; - } else if (Ext.isEmpty(st)) { - this.sortType = this.type.sortType; - } - }, - }); - - Ext.tree.Column = Ext.extend(Ext.list.Column, {}); - Ext.tree.NumberColumn = Ext.extend(Ext.list.NumberColumn, {}); - Ext.tree.DateColumn = Ext.extend(Ext.list.DateColumn, {}); - Ext.tree.BooleanColumn = Ext.extend(Ext.list.BooleanColumn, {}); - - Ext.reg('tgcolumn', Ext.tree.Column); - Ext.reg('tgnumbercolumn', Ext.tree.NumberColumn); - Ext.reg('tgdatecolumn', Ext.tree.DateColumn); - Ext.reg('tgbooleancolumn', Ext.tree.BooleanColumn); -})(); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -/** - * @class Ext.ux.tree.TreeGridLoader - * @extends Ext.tree.TreeLoader - */ -Ext.ux.tree.TreeGridLoader = Ext.extend(Ext.tree.TreeLoader, { - createNode: function (attr) { - if (!attr.uiProvider) { - attr.uiProvider = Ext.ux.tree.TreeGridNodeUI; - } - return Ext.tree.TreeLoader.prototype.createNode.call(this, attr); - }, -}); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -/** - * @class Ext.ux.tree.TreeGridNodeUI - * @extends Ext.tree.TreeNodeUI - */ -Ext.ux.tree.TreeGridNodeUI = Ext.extend(Ext.tree.TreeNodeUI, { - isTreeGridNodeUI: true, - - renderElements: function (n, a, targetNode, bulkRender) { - var t = n.getOwnerTree(), - cols = t.columns, - c = cols[0], - i, - buf, - len; - - this.indentMarkup = n.parentNode - ? n.parentNode.ui.getChildIndent() - : ''; - - buf = [ - '<tbody class="x-tree-node">', - '<tr ext:tree-node-id="', - n.id, - '" class="x-tree-node-el x-tree-node-leaf ', - a.cls, - '">', - '<td class="x-treegrid-col">', - '<span class="x-tree-node-indent">', - this.indentMarkup, - '</span>', - '<img src="', - this.emptyIcon, - '" class="x-tree-ec-icon x-tree-elbow" />', - '<img src="', - a.icon || this.emptyIcon, - '" class="x-tree-node-icon', - a.icon ? ' x-tree-node-inline-icon' : '', - a.iconCls ? ' ' + a.iconCls : '', - '" unselectable="on" />', - '<a hidefocus="on" class="x-tree-node-anchor" href="', - a.href ? a.href : '#', - '" tabIndex="1" ', - a.hrefTarget ? ' target="' + a.hrefTarget + '"' : '', - '>', - '<span unselectable="on">', - c.tpl ? c.tpl.apply(a) : a[c.dataIndex] || c.text, - '</span></a>', - '</td>', - ]; - - for (i = 1, len = cols.length; i < len; i++) { - c = cols[i]; - buf.push( - '<td class="x-treegrid-col ', - c.cls ? c.cls : '', - '">', - '<div unselectable="on" class="x-treegrid-text"', - c.align ? ' style="text-align: ' + c.align + ';"' : '', - '>', - c.tpl ? c.tpl.apply(a) : a[c.dataIndex], - '</div>', - '</td>' - ); - } - - buf.push( - '</tr><tr class="x-tree-node-ct"><td colspan="', - cols.length, - '">', - '<table class="x-treegrid-node-ct-table" cellpadding="0" cellspacing="0" style="table-layout: fixed; display: none; width: ', - t.innerCt.getWidth(), - 'px;"><colgroup>' - ); - for (i = 0, len = cols.length; i < len; i++) { - buf.push( - '<col style="width: ', - cols[i].hidden ? 0 : cols[i].width, - 'px;" />' - ); - } - buf.push('</colgroup></table></td></tr></tbody>'); - - if (bulkRender !== true && n.nextSibling && n.nextSibling.ui.getEl()) { - this.wrap = Ext.DomHelper.insertHtml( - 'beforeBegin', - n.nextSibling.ui.getEl(), - buf.join('') - ); - } else { - this.wrap = Ext.DomHelper.insertHtml( - 'beforeEnd', - targetNode, - buf.join('') - ); - } - - this.elNode = this.wrap.childNodes[0]; - this.ctNode = this.wrap.childNodes[1].firstChild.firstChild; - var cs = this.elNode.firstChild.childNodes; - this.indentNode = cs[0]; - this.ecNode = cs[1]; - this.iconNode = cs[2]; - this.anchor = cs[3]; - this.textNode = cs[3].firstChild; - }, - - // private - animExpand: function (cb) { - this.ctNode.style.display = ''; - Ext.ux.tree.TreeGridNodeUI.superclass.animExpand.call(this, cb); - }, -}); - -Ext.ux.tree.TreeGridRootNodeUI = Ext.extend(Ext.tree.TreeNodeUI, { - isTreeGridNodeUI: true, - - // private - render: function () { - if (!this.rendered) { - this.wrap = this.ctNode = this.node.ownerTree.innerCt.dom; - this.node.expanded = true; - } - - if (Ext.isWebKit) { - // weird table-layout: fixed issue in webkit - var ct = this.ctNode; - ct.style.tableLayout = null; - (function () { - ct.style.tableLayout = 'fixed'; - }.defer(1)); - } - }, - - destroy: function () { - if (this.elNode) { - Ext.dd.Registry.unregister(this.elNode.id); - } - delete this.node; - }, - - collapse: Ext.emptyFn, - expand: Ext.emptyFn, -}); -/** - * Ext.ux.tree.TreeGridNodeUIFix.js - * - * Copyright (c) Damien Churchill 2009-2010 <damoxc@gmail.com> - * - * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with - * the additional special exception to link portions of this program with the OpenSSL library. - * See LICENSE for more details. - */ - -Ext.override(Ext.ux.tree.TreeGridNodeUI, { - updateColumns: function () { - if (!this.rendered) return; - - var a = this.node.attributes, - t = this.node.getOwnerTree(), - cols = t.columns, - c = cols[0]; - - // Update the first column - this.anchor.firstChild.innerHTML = c.tpl - ? c.tpl.apply(a) - : a[c.dataIndex] || c.text; - - // Update the remaining columns - for (i = 1, len = cols.length; i < len; i++) { - c = cols[i]; - this.elNode.childNodes[i].firstChild.innerHTML = c.tpl - ? c.tpl.apply(a) - : a[c.dataIndex] || c.text; - } - }, -}); -Ext.tree.RenderColumn = Ext.extend(Ext.tree.Column, { - constructor: function (c) { - c.tpl = c.tpl || new Ext.XTemplate('{' + c.dataIndex + ':this.format}'); - c.tpl.format = c.renderer; - c.tpl.col = this; - Ext.tree.RenderColumn.superclass.constructor.call(this, c); - }, -}); -Ext.reg('tgrendercolumn', Ext.tree.RenderColumn); -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -Ext.ns('Ext.ux.tree'); - -/** - * @class Ext.ux.tree.TreeGridSorter - * @extends Ext.tree.TreeSorter - * Provides sorting of nodes in a {@link Ext.ux.tree.TreeGrid}. The TreeGridSorter automatically monitors events on the - * associated TreeGrid that might affect the tree's sort order (beforechildrenrendered, append, insert and textchange). - * Example usage:<br /> - * <pre><code> - new Ext.ux.tree.TreeGridSorter(myTreeGrid, { - folderSort: true, - dir: "desc", - sortType: function(node) { - // sort by a custom, typed attribute: - return parseInt(node.id, 10); - } - }); - </code></pre> - * @constructor - * @param {TreeGrid} tree - * @param {Object} config - */ -Ext.ux.tree.TreeGridSorter = Ext.extend(Ext.tree.TreeSorter, { - /** - * @cfg {Array} sortClasses The CSS classes applied to a header when it is sorted. (defaults to <tt>['sort-asc', 'sort-desc']</tt>) - */ - sortClasses: ['sort-asc', 'sort-desc'], - /** - * @cfg {String} sortAscText The text displayed in the 'Sort Ascending' menu item (defaults to <tt>'Sort Ascending'</tt>) - */ - sortAscText: 'Sort Ascending', - /** - * @cfg {String} sortDescText The text displayed in the 'Sort Descending' menu item (defaults to <tt>'Sort Descending'</tt>) - */ - sortDescText: 'Sort Descending', - - constructor: function (tree, config) { - if (!Ext.isObject(config)) { - config = { - property: tree.columns[0].dataIndex || 'text', - folderSort: true, - }; - } - - Ext.ux.tree.TreeGridSorter.superclass.constructor.apply( - this, - arguments - ); - - this.tree = tree; - tree.on('headerclick', this.onHeaderClick, this); - tree.ddAppendOnly = true; - - var me = this; - this.defaultSortFn = function (n1, n2) { - var desc = me.dir && me.dir.toLowerCase() == 'desc', - prop = me.property || 'text', - sortType = me.sortType, - caseSensitive = me.caseSensitive === true, - leafAttr = me.leafAttr || 'leaf', - attr1 = n1.attributes, - attr2 = n2.attributes; - - if (me.folderSort) { - if (attr1[leafAttr] && !attr2[leafAttr]) { - return 1; - } - if (!attr1[leafAttr] && attr2[leafAttr]) { - return -1; - } - } - var prop1 = attr1[prop], - prop2 = attr2[prop], - v1 = sortType - ? sortType(prop1) - : caseSensitive - ? prop1 - : prop1.toUpperCase(); - v2 = sortType - ? sortType(prop2) - : caseSensitive - ? prop2 - : prop2.toUpperCase(); - - if (v1 < v2) { - return desc ? +1 : -1; - } else if (v1 > v2) { - return desc ? -1 : +1; - } else { - return 0; - } - }; - - tree.on('afterrender', this.onAfterTreeRender, this, { single: true }); - tree.on('headermenuclick', this.onHeaderMenuClick, this); - }, - - onAfterTreeRender: function () { - if (this.tree.hmenu) { - this.tree.hmenu.insert( - 0, - { - itemId: 'asc', - text: this.sortAscText, - cls: 'xg-hmenu-sort-asc', - }, - { - itemId: 'desc', - text: this.sortDescText, - cls: 'xg-hmenu-sort-desc', - } - ); - } - this.updateSortIcon(0, 'asc'); - }, - - onHeaderMenuClick: function (c, id, index) { - if (id === 'asc' || id === 'desc') { - this.onHeaderClick(c, null, index); - return false; - } - }, - - onHeaderClick: function (c, el, i) { - if (c && !this.tree.headersDisabled) { - var me = this; - - me.property = c.dataIndex; - me.dir = c.dir = c.dir === 'desc' ? 'asc' : 'desc'; - me.sortType = c.sortType; - me.caseSensitive === Ext.isBoolean(c.caseSensitive) - ? c.caseSensitive - : this.caseSensitive; - me.sortFn = c.sortFn || this.defaultSortFn; - - this.tree.root.cascade(function (n) { - if (!n.isLeaf()) { - me.updateSort(me.tree, n); - } - }); - - this.updateSortIcon(i, c.dir); - } - }, - - // private - updateSortIcon: function (col, dir) { - var sc = this.sortClasses, - hds = this.tree.innerHd.select('td').removeClass(sc); - hds.item(col).addClass(sc[dir == 'desc' ? 1 : 0]); - }, -}); -Ext.ux.JSLoader = function (options) { - Ext.ux.JSLoader.scripts[++Ext.ux.JSLoader.index] = { - url: options.url, - success: true, - jsLoadObj: null, - options: options, - onLoad: options.onLoad || Ext.emptyFn, - onError: options.onError || Ext.ux.JSLoader.stdError, - scope: options.scope || this, - }; - - Ext.Ajax.request({ - url: options.url, - scriptIndex: Ext.ux.JSLoader.index, - success: function (response, options) { - var script = Ext.ux.JSLoader.scripts[options.scriptIndex]; - try { - eval(response.responseText); - } catch (e) { - script.success = false; - script.onError(script.options, e); - } - if (script.success) { - script.onLoad.call(script.scope, script.options); - } - }, - failure: function (response, options) { - var script = Ext.ux.JSLoader.scripts[options.scriptIndex]; - script.success = false; - script.onError(script.options, response.status); - }, - }); -}; -Ext.ux.JSLoader.index = 0; -Ext.ux.JSLoader.scripts = []; -Ext.ux.JSLoader.stdError = function (options, e) { - window.alert( - 'Error loading script:\n\n' + options.url + '\n\nstatus: ' + e - ); -}; -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -/** - * @class Ext.ux.Spinner - * @extends Ext.util.Observable - * Creates a Spinner control utilized by Ext.ux.form.SpinnerField - */ -Ext.ux.Spinner = Ext.extend(Ext.util.Observable, { - incrementValue: 1, - alternateIncrementValue: 5, - triggerClass: 'x-form-spinner-trigger', - splitterClass: 'x-form-spinner-splitter', - alternateKey: Ext.EventObject.shiftKey, - defaultValue: 0, - accelerate: false, - - constructor: function (config) { - Ext.ux.Spinner.superclass.constructor.call(this, config); - Ext.apply(this, config); - this.mimicing = false; - }, - - init: function (field) { - this.field = field; - - field.afterMethod('onRender', this.doRender, this); - field.afterMethod('onEnable', this.doEnable, this); - field.afterMethod('onDisable', this.doDisable, this); - field.afterMethod('afterRender', this.doAfterRender, this); - field.afterMethod('onResize', this.doResize, this); - field.afterMethod('onFocus', this.doFocus, this); - field.beforeMethod('onDestroy', this.doDestroy, this); - }, - - doRender: function (ct, position) { - var el = (this.el = this.field.getEl()); - var f = this.field; - - if (!f.wrap) { - f.wrap = this.wrap = el.wrap({ - cls: 'x-form-field-wrap', - }); - } else { - this.wrap = f.wrap.addClass('x-form-field-wrap'); - } - - this.trigger = this.wrap.createChild({ - tag: 'img', - src: Ext.BLANK_IMAGE_URL, - cls: 'x-form-trigger ' + this.triggerClass, - }); - - if (!f.width) { - this.wrap.setWidth(el.getWidth() + this.trigger.getWidth()); - } - - this.splitter = this.wrap.createChild({ - tag: 'div', - cls: this.splitterClass, - style: 'width:13px; height:2px;', - }); - this.splitter - .setRight(Ext.isIE ? 1 : 2) - .setTop(10) - .show(); - - this.proxy = this.trigger.createProxy('', this.splitter, true); - this.proxy.addClass('x-form-spinner-proxy'); - this.proxy.setStyle('left', '0px'); - this.proxy.setSize(14, 1); - this.proxy.hide(); - this.dd = new Ext.dd.DDProxy(this.splitter.dom.id, 'SpinnerDrag', { - dragElId: this.proxy.id, - }); - - this.initTrigger(); - this.initSpinner(); - }, - - doAfterRender: function () { - var y; - if (Ext.isIE && this.el.getY() != (y = this.trigger.getY())) { - this.el.position(); - this.el.setY(y); - } - }, - - doEnable: function () { - if (this.wrap) { - this.disabled = false; - this.wrap.removeClass(this.field.disabledClass); - } - }, - - doDisable: function () { - if (this.wrap) { - this.disabled = true; - this.wrap.addClass(this.field.disabledClass); - this.el.removeClass(this.field.disabledClass); - } - }, - - doResize: function (w, h) { - if (typeof w == 'number') { - this.el.setWidth(w - this.trigger.getWidth()); - } - this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth()); - }, - - doFocus: function () { - if (!this.mimicing) { - this.wrap.addClass('x-trigger-wrap-focus'); - this.mimicing = true; - Ext.get(Ext.isIE ? document.body : document).on( - 'mousedown', - this.mimicBlur, - this, - { - delay: 10, - } - ); - this.el.on('keydown', this.checkTab, this); - } - }, - - // private - checkTab: function (e) { - if (e.getKey() == e.TAB) { - this.triggerBlur(); - } - }, - - // private - mimicBlur: function (e) { - if (!this.wrap.contains(e.target) && this.field.validateBlur(e)) { - this.triggerBlur(); - } - }, - - // private - triggerBlur: function () { - this.mimicing = false; - Ext.get(Ext.isIE ? document.body : document).un( - 'mousedown', - this.mimicBlur, - this - ); - this.el.un('keydown', this.checkTab, this); - this.field.beforeBlur(); - this.wrap.removeClass('x-trigger-wrap-focus'); - this.field.onBlur.call(this.field); - }, - - initTrigger: function () { - this.trigger.addClassOnOver('x-form-trigger-over'); - this.trigger.addClassOnClick('x-form-trigger-click'); - }, - - initSpinner: function () { - this.field.addEvents({ - spin: true, - spinup: true, - spindown: true, - }); - - this.keyNav = new Ext.KeyNav(this.el, { - up: function (e) { - e.preventDefault(); - this.onSpinUp(); - }, - - down: function (e) { - e.preventDefault(); - this.onSpinDown(); - }, - - pageUp: function (e) { - e.preventDefault(); - this.onSpinUpAlternate(); - }, - - pageDown: function (e) { - e.preventDefault(); - this.onSpinDownAlternate(); - }, - - scope: this, - }); - - this.repeater = new Ext.util.ClickRepeater(this.trigger, { - accelerate: this.accelerate, - }); - this.field.mon(this.repeater, 'click', this.onTriggerClick, this, { - preventDefault: true, - }); - - this.field.mon(this.trigger, { - mouseover: this.onMouseOver, - mouseout: this.onMouseOut, - mousemove: this.onMouseMove, - mousedown: this.onMouseDown, - mouseup: this.onMouseUp, - scope: this, - preventDefault: true, - }); - - this.field.mon(this.wrap, 'mousewheel', this.handleMouseWheel, this); - - this.dd.setXConstraint(0, 0, 10); - this.dd.setYConstraint(1500, 1500, 10); - this.dd.endDrag = this.endDrag.createDelegate(this); - this.dd.startDrag = this.startDrag.createDelegate(this); - this.dd.onDrag = this.onDrag.createDelegate(this); - }, - - onMouseOver: function () { - if (this.disabled) { - return; - } - var middle = this.getMiddle(); - this.tmpHoverClass = - Ext.EventObject.getPageY() < middle - ? 'x-form-spinner-overup' - : 'x-form-spinner-overdown'; - this.trigger.addClass(this.tmpHoverClass); - }, - - //private - onMouseOut: function () { - this.trigger.removeClass(this.tmpHoverClass); - }, - - //private - onMouseMove: function () { - if (this.disabled) { - return; - } - var middle = this.getMiddle(); - if ( - (Ext.EventObject.getPageY() > middle && - this.tmpHoverClass == 'x-form-spinner-overup') || - (Ext.EventObject.getPageY() < middle && - this.tmpHoverClass == 'x-form-spinner-overdown') - ) { - } - }, - - //private - onMouseDown: function () { - if (this.disabled) { - return; - } - var middle = this.getMiddle(); - this.tmpClickClass = - Ext.EventObject.getPageY() < middle - ? 'x-form-spinner-clickup' - : 'x-form-spinner-clickdown'; - this.trigger.addClass(this.tmpClickClass); - }, - - //private - onMouseUp: function () { - this.trigger.removeClass(this.tmpClickClass); - }, - - //private - onTriggerClick: function () { - if (this.disabled || this.el.dom.readOnly) { - return; - } - var middle = this.getMiddle(); - var ud = Ext.EventObject.getPageY() < middle ? 'Up' : 'Down'; - this['onSpin' + ud](); - }, - - //private - getMiddle: function () { - var t = this.trigger.getTop(); - var h = this.trigger.getHeight(); - var middle = t + h / 2; - return middle; - }, - - //private - //checks if control is allowed to spin - isSpinnable: function () { - if (this.disabled || this.el.dom.readOnly) { - Ext.EventObject.preventDefault(); //prevent scrolling when disabled/readonly - return false; - } - return true; - }, - - handleMouseWheel: function (e) { - //disable scrolling when not focused - if (this.wrap.hasClass('x-trigger-wrap-focus') == false) { - return; - } - - var delta = e.getWheelDelta(); - if (delta > 0) { - this.onSpinUp(); - e.stopEvent(); - } else if (delta < 0) { - this.onSpinDown(); - e.stopEvent(); - } - }, - - //private - startDrag: function () { - this.proxy.show(); - this._previousY = Ext.fly(this.dd.getDragEl()).getTop(); - }, - - //private - endDrag: function () { - this.proxy.hide(); - }, - - //private - onDrag: function () { - if (this.disabled) { - return; - } - var y = Ext.fly(this.dd.getDragEl()).getTop(); - var ud = ''; - - if (this._previousY > y) { - ud = 'Up'; - } //up - if (this._previousY < y) { - ud = 'Down'; - } //down - if (ud != '') { - this['onSpin' + ud](); - } - - this._previousY = y; - }, - - //private - onSpinUp: function () { - if (this.isSpinnable() == false) { - return; - } - if (Ext.EventObject.shiftKey == true) { - this.onSpinUpAlternate(); - return; - } else { - this.spin(false, false); - } - this.field.fireEvent('spin', this); - this.field.fireEvent('spinup', this); - }, - - //private - onSpinDown: function () { - if (this.isSpinnable() == false) { - return; - } - if (Ext.EventObject.shiftKey == true) { - this.onSpinDownAlternate(); - return; - } else { - this.spin(true, false); - } - this.field.fireEvent('spin', this); - this.field.fireEvent('spindown', this); - }, - - //private - onSpinUpAlternate: function () { - if (this.isSpinnable() == false) { - return; - } - this.spin(false, true); - this.field.fireEvent('spin', this); - this.field.fireEvent('spinup', this); - }, - - //private - onSpinDownAlternate: function () { - if (this.isSpinnable() == false) { - return; - } - this.spin(true, true); - this.field.fireEvent('spin', this); - this.field.fireEvent('spindown', this); - }, - - spin: function (down, alternate) { - var v = parseFloat(this.field.getValue()); - var incr = - alternate == true - ? this.alternateIncrementValue - : this.incrementValue; - down == true ? (v -= incr) : (v += incr); - - v = isNaN(v) ? this.defaultValue : v; - v = this.fixBoundries(v); - this.field.setRawValue(v); - }, - - fixBoundries: function (value) { - var v = value; - - if (this.field.minValue != undefined && v < this.field.minValue) { - v = this.field.minValue; - } - if (this.field.maxValue != undefined && v > this.field.maxValue) { - v = this.field.maxValue; - } - - return this.fixPrecision(v); - }, - - // private - fixPrecision: function (value) { - var nan = isNaN(value); - if ( - !this.field.allowDecimals || - this.field.decimalPrecision == -1 || - nan || - !value - ) { - return nan ? '' : value; - } - return parseFloat( - parseFloat(value).toFixed(this.field.decimalPrecision) - ); - }, - - doDestroy: function () { - if (this.trigger) { - this.trigger.remove(); - } - if (this.wrap) { - this.wrap.remove(); - delete this.field.wrap; - } - - if (this.splitter) { - this.splitter.remove(); - } - - if (this.dd) { - this.dd.unreg(); - this.dd = null; - } - - if (this.proxy) { - this.proxy.remove(); - } - - if (this.repeater) { - this.repeater.purgeListeners(); - } - if (this.mimicing) { - Ext.get(Ext.isIE ? document.body : document).un( - 'mousedown', - this.mimicBlur, - this - ); - } - }, -}); - -//backwards compat -Ext.form.Spinner = Ext.ux.Spinner; -/** - * Ext JS Library 3.4.0 - * Copyright(c) 2006-2011 Sencha Inc. - * licensing@sencha.com - * http://www.sencha.com/license - */ -/** - * @class Ext.ux.StatusBar - * <p>Basic status bar component that can be used as the bottom toolbar of any {@link Ext.Panel}. In addition to - * supporting the standard {@link Ext.Toolbar} interface for adding buttons, menus and other items, the StatusBar - * provides a greedy status element that can be aligned to either side and has convenient methods for setting the - * status text and icon. You can also indicate that something is processing using the {@link #showBusy} method.</p> - * <pre><code> -new Ext.Panel({ - title: 'StatusBar', - // etc. - bbar: new Ext.ux.StatusBar({ - id: 'my-status', - - // defaults to use when the status is cleared: - defaultText: 'Default status text', - defaultIconCls: 'default-icon', - - // values to set initially: - text: 'Ready', - iconCls: 'ready-icon', - - // any standard Toolbar items: - items: [{ - text: 'A Button' - }, '-', 'Plain Text'] - }) -}); - -// Update the status bar later in code: -var sb = Ext.getCmp('my-status'); -sb.setStatus({ - text: 'OK', - iconCls: 'ok-icon', - clear: true // auto-clear after a set interval -}); - -// Set the status bar to show that something is processing: -sb.showBusy(); - -// processing.... - -sb.clearStatus(); // once completeed -</code></pre> - * @extends Ext.Toolbar - * @constructor - * Creates a new StatusBar - * @param {Object/Array} config A config object - */ -Ext.ux.StatusBar = Ext.extend(Ext.Toolbar, { - /** - * @cfg {String} statusAlign - * The alignment of the status element within the overall StatusBar layout. When the StatusBar is rendered, - * it creates an internal div containing the status text and icon. Any additional Toolbar items added in the - * StatusBar's {@link #items} config, or added via {@link #add} or any of the supported add* methods, will be - * rendered, in added order, to the opposite side. The status element is greedy, so it will automatically - * expand to take up all sapce left over by any other items. Example usage: - * <pre><code> -// Create a left-aligned status bar containing a button, -// separator and text item that will be right-aligned (default): -new Ext.Panel({ - title: 'StatusBar', - // etc. - bbar: new Ext.ux.StatusBar({ - defaultText: 'Default status text', - id: 'status-id', - items: [{ - text: 'A Button' - }, '-', 'Plain Text'] - }) -}); - -// By adding the statusAlign config, this will create the -// exact same toolbar, except the status and toolbar item -// layout will be reversed from the previous example: -new Ext.Panel({ - title: 'StatusBar', - // etc. - bbar: new Ext.ux.StatusBar({ - defaultText: 'Default status text', - id: 'status-id', - statusAlign: 'right', - items: [{ - text: 'A Button' - }, '-', 'Plain Text'] - }) -}); -</code></pre> - */ - /** - * @cfg {String} defaultText - * The default {@link #text} value. This will be used anytime the status bar is cleared with the - * <tt>useDefaults:true</tt> option (defaults to ''). - */ - /** - * @cfg {String} defaultIconCls - * The default {@link #iconCls} value (see the iconCls docs for additional details about customizing the icon). - * This will be used anytime the status bar is cleared with the <tt>useDefaults:true</tt> option (defaults to ''). - */ - /** - * @cfg {String} text - * A string that will be <b>initially</b> set as the status message. This string - * will be set as innerHTML (html tags are accepted) for the toolbar item. - * If not specified, the value set for <code>{@link #defaultText}</code> - * will be used. - */ - /** - * @cfg {String} iconCls - * A CSS class that will be <b>initially</b> set as the status bar icon and is - * expected to provide a background image (defaults to ''). - * Example usage:<pre><code> -// Example CSS rule: -.x-statusbar .x-status-custom { - padding-left: 25px; - background: transparent url(images/custom-icon.gif) no-repeat 3px 2px; -} - -// Setting a default icon: -var sb = new Ext.ux.StatusBar({ - defaultIconCls: 'x-status-custom' -}); - -// Changing the icon: -sb.setStatus({ - text: 'New status', - iconCls: 'x-status-custom' -}); -</code></pre> - */ - - /** - * @cfg {String} cls - * The base class applied to the containing element for this component on render (defaults to 'x-statusbar') - */ - cls: 'x-statusbar', - /** - * @cfg {String} busyIconCls - * The default <code>{@link #iconCls}</code> applied when calling - * <code>{@link #showBusy}</code> (defaults to <tt>'x-status-busy'</tt>). - * It can be overridden at any time by passing the <code>iconCls</code> - * argument into <code>{@link #showBusy}</code>. - */ - busyIconCls: 'x-status-busy', - /** - * @cfg {String} busyText - * The default <code>{@link #text}</code> applied when calling - * <code>{@link #showBusy}</code> (defaults to <tt>'Loading...'</tt>). - * It can be overridden at any time by passing the <code>text</code> - * argument into <code>{@link #showBusy}</code>. - */ - busyText: 'Loading...', - /** - * @cfg {Number} autoClear - * The number of milliseconds to wait after setting the status via - * <code>{@link #setStatus}</code> before automatically clearing the status - * text and icon (defaults to <tt>5000</tt>). Note that this only applies - * when passing the <tt>clear</tt> argument to <code>{@link #setStatus}</code> - * since that is the only way to defer clearing the status. This can - * be overridden by specifying a different <tt>wait</tt> value in - * <code>{@link #setStatus}</code>. Calls to <code>{@link #clearStatus}</code> - * always clear the status bar immediately and ignore this value. - */ - autoClear: 5000, - - /** - * @cfg {String} emptyText - * The text string to use if no text has been set. Defaults to - * <tt>' '</tt>). If there are no other items in the toolbar using - * an empty string (<tt>''</tt>) for this value would end up in the toolbar - * height collapsing since the empty string will not maintain the toolbar - * height. Use <tt>''</tt> if the toolbar should collapse in height - * vertically when no text is specified and there are no other items in - * the toolbar. - */ - emptyText: ' ', - - // private - activeThreadId: 0, - - // private - initComponent: function () { - if (this.statusAlign == 'right') { - this.cls += ' x-status-right'; - } - Ext.ux.StatusBar.superclass.initComponent.call(this); - }, - - // private - afterRender: function () { - Ext.ux.StatusBar.superclass.afterRender.call(this); - - var right = this.statusAlign == 'right'; - this.currIconCls = this.iconCls || this.defaultIconCls; - this.statusEl = new Ext.Toolbar.TextItem({ - cls: 'x-status-text ' + (this.currIconCls || ''), - text: this.text || this.defaultText || '', - }); - - if (right) { - this.add('->'); - this.add(this.statusEl); - } else { - this.insert(0, this.statusEl); - this.insert(1, '->'); - } - this.doLayout(); - }, - - /** - * Sets the status {@link #text} and/or {@link #iconCls}. Also supports automatically clearing the - * status that was set after a specified interval. - * @param {Object/String} config A config object specifying what status to set, or a string assumed - * to be the status text (and all other options are defaulted as explained below). A config - * object containing any or all of the following properties can be passed:<ul> - * <li><tt>text</tt> {String} : (optional) The status text to display. If not specified, any current - * status text will remain unchanged.</li> - * <li><tt>iconCls</tt> {String} : (optional) The CSS class used to customize the status icon (see - * {@link #iconCls} for details). If not specified, any current iconCls will remain unchanged.</li> - * <li><tt>clear</tt> {Boolean/Number/Object} : (optional) Allows you to set an internal callback that will - * automatically clear the status text and iconCls after a specified amount of time has passed. If clear is not - * specified, the new status will not be auto-cleared and will stay until updated again or cleared using - * {@link #clearStatus}. If <tt>true</tt> is passed, the status will be cleared using {@link #autoClear}, - * {@link #defaultText} and {@link #defaultIconCls} via a fade out animation. If a numeric value is passed, - * it will be used as the callback interval (in milliseconds), overriding the {@link #autoClear} value. - * All other options will be defaulted as with the boolean option. To customize any other options, - * you can pass an object in the format:<ul> - * <li><tt>wait</tt> {Number} : (optional) The number of milliseconds to wait before clearing - * (defaults to {@link #autoClear}).</li> - * <li><tt>anim</tt> {Number} : (optional) False to clear the status immediately once the callback - * executes (defaults to true which fades the status out).</li> - * <li><tt>useDefaults</tt> {Number} : (optional) False to completely clear the status text and iconCls - * (defaults to true which uses {@link #defaultText} and {@link #defaultIconCls}).</li> - * </ul></li></ul> - * Example usage:<pre><code> -// Simple call to update the text -statusBar.setStatus('New status'); - -// Set the status and icon, auto-clearing with default options: -statusBar.setStatus({ - text: 'New status', - iconCls: 'x-status-custom', - clear: true -}); - -// Auto-clear with custom options: -statusBar.setStatus({ - text: 'New status', - iconCls: 'x-status-custom', - clear: { - wait: 8000, - anim: false, - useDefaults: false - } -}); -</code></pre> - * @return {Ext.ux.StatusBar} this - */ - setStatus: function (o) { - o = o || {}; - - if (typeof o == 'string') { - o = { text: o }; - } - if (o.text !== undefined) { - this.setText(o.text); - } - if (o.iconCls !== undefined) { - this.setIcon(o.iconCls); - } - - if (o.clear) { - var c = o.clear, - wait = this.autoClear, - defaults = { useDefaults: true, anim: true }; - - if (typeof c == 'object') { - c = Ext.applyIf(c, defaults); - if (c.wait) { - wait = c.wait; - } - } else if (typeof c == 'number') { - wait = c; - c = defaults; - } else if (typeof c == 'boolean') { - c = defaults; - } - - c.threadId = this.activeThreadId; - this.clearStatus.defer(wait, this, [c]); - } - return this; - }, - - /** - * Clears the status {@link #text} and {@link #iconCls}. Also supports clearing via an optional fade out animation. - * @param {Object} config (optional) A config object containing any or all of the following properties. If this - * object is not specified the status will be cleared using the defaults below:<ul> - * <li><tt>anim</tt> {Boolean} : (optional) True to clear the status by fading out the status element (defaults - * to false which clears immediately).</li> - * <li><tt>useDefaults</tt> {Boolean} : (optional) True to reset the text and icon using {@link #defaultText} and - * {@link #defaultIconCls} (defaults to false which sets the text to '' and removes any existing icon class).</li> - * </ul> - * @return {Ext.ux.StatusBar} this - */ - clearStatus: function (o) { - o = o || {}; - - if (o.threadId && o.threadId !== this.activeThreadId) { - // this means the current call was made internally, but a newer - // thread has set a message since this call was deferred. Since - // we don't want to overwrite a newer message just ignore. - return this; - } - - var text = o.useDefaults ? this.defaultText : this.emptyText, - iconCls = o.useDefaults - ? this.defaultIconCls - ? this.defaultIconCls - : '' - : ''; - - if (o.anim) { - // animate the statusEl Ext.Element - this.statusEl.el.fadeOut({ - remove: false, - useDisplay: true, - scope: this, - callback: function () { - this.setStatus({ - text: text, - iconCls: iconCls, - }); - - this.statusEl.el.show(); - }, - }); - } else { - // hide/show the el to avoid jumpy text or icon - this.statusEl.hide(); - this.setStatus({ - text: text, - iconCls: iconCls, - }); - this.statusEl.show(); - } - return this; - }, - - /** - * Convenience method for setting the status text directly. For more flexible options see {@link #setStatus}. - * @param {String} text (optional) The text to set (defaults to '') - * @return {Ext.ux.StatusBar} this - */ - setText: function (text) { - this.activeThreadId++; - this.text = text || ''; - if (this.rendered) { - this.statusEl.setText(this.text); - } - return this; - }, - - /** - * Returns the current status text. - * @return {String} The status text - */ - getText: function () { - return this.text; - }, - - /** - * Convenience method for setting the status icon directly. For more flexible options see {@link #setStatus}. - * See {@link #iconCls} for complete details about customizing the icon. - * @param {String} iconCls (optional) The icon class to set (defaults to '', and any current icon class is removed) - * @return {Ext.ux.StatusBar} this - */ - setIcon: function (cls) { - this.activeThreadId++; - cls = cls || ''; - - if (this.rendered) { - if (this.currIconCls) { - this.statusEl.removeClass(this.currIconCls); - this.currIconCls = null; - } - if (cls.length > 0) { - this.statusEl.addClass(cls); - this.currIconCls = cls; - } - } else { - this.currIconCls = cls; - } - return this; - }, - - /** - * Convenience method for setting the status text and icon to special values that are pre-configured to indicate - * a "busy" state, usually for loading or processing activities. - * @param {Object/String} config (optional) A config object in the same format supported by {@link #setStatus}, or a - * string to use as the status text (in which case all other options for setStatus will be defaulted). Use the - * <tt>text</tt> and/or <tt>iconCls</tt> properties on the config to override the default {@link #busyText} - * and {@link #busyIconCls} settings. If the config argument is not specified, {@link #busyText} and - * {@link #busyIconCls} will be used in conjunction with all of the default options for {@link #setStatus}. - * @return {Ext.ux.StatusBar} this - */ - showBusy: function (o) { - if (typeof o == 'string') { - o = { text: o }; - } - o = Ext.applyIf(o || {}, { - text: this.busyText, - iconCls: this.busyIconCls, - }); - return this.setStatus(o); - }, -}); -Ext.reg('statusbar', Ext.ux.StatusBar); diff --git a/deluge/ui/web/js/extjs/ext-extensions.js b/deluge/ui/web/js/extjs/ext-extensions.js deleted file mode 100644 index e6cb62c..0000000 --- a/deluge/ui/web/js/extjs/ext-extensions.js +++ /dev/null @@ -1,84 +0,0 @@ -Ext.ns("Ext.ux.form"); -Ext.ux.form.FileUploadField=Ext.extend(Ext.form.TextField,{buttonText:"Browse...",buttonOnly:!1,buttonOffset:3,multiple:!1,readOnly:!0,autoSize:Ext.emptyFn,initComponent:function(){Ext.ux.form.FileUploadField.superclass.initComponent.call(this);this.addEvents("fileselected")},onRender:function(a,b){Ext.ux.form.FileUploadField.superclass.onRender.call(this,a,b);this.wrap=this.el.wrap({cls:"x-form-field-wrap x-form-file-wrap"});this.el.addClass("x-form-file-text");this.el.dom.removeAttribute("name");this.createFileInput(); -var c=Ext.applyIf(this.buttonCfg||{},{text:this.buttonText});this.button=new Ext.Button(Ext.apply(c,{renderTo:this.wrap,cls:"x-form-file-btn"+(c.iconCls?" x-btn-icon":"")}));this.buttonOnly&&(this.el.hide(),this.wrap.setWidth(this.button.getEl().getWidth()));this.bindListeners();this.resizeEl=this.positionEl=this.wrap},bindListeners:function(){this.fileInput.on({scope:this,mouseenter:function(){this.button.addClass(["x-btn-over","x-btn-focus"])},mouseleave:function(){this.button.removeClass(["x-btn-over", -"x-btn-focus","x-btn-click"])},mousedown:function(){this.button.addClass("x-btn-click")},mouseup:function(){this.button.removeClass(["x-btn-over","x-btn-focus","x-btn-click"])},change:function(){var a=this.fileInput.dom.files;a||(a=this.fileInput.dom.value);this.setValue(a);this.fireEvent("fileselected",this,a)}})},createFileInput:function(){this.fileInput=this.wrap.createChild({id:this.getFileInputId(),name:this.name||this.getId(),cls:"x-form-file",tag:"input",type:"file",size:1});this.fileInput.dom.multiple= -this.multiple},reset:function(){this.rendered&&(this.fileInput.remove(),this.createFileInput(),this.bindListeners());Ext.ux.form.FileUploadField.superclass.reset.call(this)},getFileInputId:function(){return this.id+"-file"},onResize:function(a,b){Ext.ux.form.FileUploadField.superclass.onResize.call(this,a,b);this.wrap.setWidth(a);this.buttonOnly||(a=this.wrap.getWidth()-this.button.getEl().getWidth()-this.buttonOffset,this.el.setWidth(a))},onDestroy:function(){Ext.ux.form.FileUploadField.superclass.onDestroy.call(this); -Ext.destroy(this.fileInput,this.button,this.wrap)},onDisable:function(){Ext.ux.form.FileUploadField.superclass.onDisable.call(this);this.doDisable(!0)},onEnable:function(){Ext.ux.form.FileUploadField.superclass.onEnable.call(this);this.doDisable(!1)},doDisable:function(a){this.fileInput.dom.disabled=a;this.button.setDisabled(a)},preFocus:Ext.emptyFn,alignErrorIcon:function(){this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])}});Ext.reg("fileuploadfield",Ext.ux.form.FileUploadField); -Ext.form.FileUploadField=Ext.ux.form.FileUploadField; -Ext.override(Ext.form.RadioGroup,{afterRender:function(){this.items.each(function(a){this.relayEvents(a,["check"])},this);this.lazyValue&&(this.setValue(this.value),delete this.value,delete this.lazyValue);Ext.form.RadioGroup.superclass.afterRender.call(this)},getName:function(){return this.items.first().getName()},getValue:function(){return this.items.first().getGroupValue()},setValue:function(a){this.items.each?this.items.each(function(b){if(b.rendered){var c=b.el.getValue()==String(a);b.el.dom.checked= -c;b.el.dom.defaultChecked=c;b.wrap[c?"addClass":"removeClass"](b.checkedCls)}}):(this.value=a,this.lazyValue=!0)}});Ext.ns("Ext.ux.form"); -Ext.ux.form.SpinnerField=Ext.extend(Ext.form.NumberField,{actionMode:"wrap",deferHeight:!0,autoSize:Ext.emptyFn,onBlur:Ext.emptyFn,adjustSize:Ext.BoxComponent.prototype.adjustSize,constructor:function(a){var b=Ext.copyTo({},a,"incrementValue,alternateIncrementValue,accelerate,defaultValue,triggerClass,splitterClass"),b=this.spinner=new Ext.ux.Spinner(b),b=a.plugins?Ext.isArray(a.plugins)?a.plugins.push(b):[a.plugins,b]:b;Ext.ux.form.SpinnerField.superclass.constructor.call(this,Ext.apply(a,{plugins:b}))}, -getResizeEl:function(){return this.wrap},getPositionEl:function(){return this.wrap},alignErrorIcon:function(){this.wrap&&this.errorIcon.alignTo(this.wrap,"tl-tr",[2,0])},validateBlur:function(){return!0}});Ext.reg("spinnerfield",Ext.ux.form.SpinnerField);Ext.form.SpinnerField=Ext.ux.form.SpinnerField;Ext.override(Ext.ux.form.SpinnerField,{onBlur:Ext.form.Field.prototype.onBlur});Ext.ns("Ext.ux.form"); -Ext.ux.form.SpinnerGroup=Ext.extend(Ext.form.CheckboxGroup,{defaultType:"spinnerfield",anchor:"98%",groupCls:"x-form-spinner-group",colCfg:{},onRender:function(a,b){if(!this.el){var c={cls:this.groupCls,layout:"column",border:!1,renderTo:a},d=Ext.apply({defaultType:this.defaultType,layout:"form",border:!1,labelWidth:60,defaults:{hideLabel:!0,anchor:"60%"}},this.colCfg);if(this.items[0].items){Ext.apply(c,{layoutConfig:{columns:this.items.length},defaults:this.defaults,items:this.items});for(var e= -0,g=this.items.length;e<g;e++)Ext.applyIf(this.items[e],d)}else{var f,h=[];"string"==typeof this.columns&&(this.columns=this.items.length);if(!Ext.isArray(this.columns)){f=[];for(e=0;e<this.columns;e++)f.push(0.01*(100/this.columns));this.columns=f}f=this.columns.length;for(e=0;e<f;e++)g=Ext.apply({items:[]},d),g[1>=this.columns[e]?"columnWidth":"width"]=this.columns[e],this.defaults&&(g.defaults=Ext.apply(g.defaults||{},this.defaults)),h.push(g);if(this.vertical)for(var d=Math.ceil(this.items.length/ -f),k=0,e=0,g=this.items.length;e<g;e++)0<e&&0==e%d&&k++,this.items[e].fieldLabel&&(this.items[e].hideLabel=!1),h[k].items.push(this.items[e]);else{e=0;for(g=this.items.length;e<g;e++)d=e%f,this.items[e].fieldLabel&&(this.items[e].hideLabel=!1),h[d].items.push(this.items[e])}Ext.apply(c,{layoutConfig:{columns:f},items:h})}this.panel=new Ext.Panel(c);this.el=this.panel.getEl();this.forId&&this.itemCls&&(c=this.el.up(this.itemCls).child("label",!0))&&c.setAttribute("htmlFor",this.forId);c=this.panel.findBy(function(a){return a.isFormField}, -this);this.items=new Ext.util.MixedCollection;this.items.addAll(c);this.items.each(function(a){a.on("spin",this.onFieldChange,this);a.on("change",this.onFieldChange,this)},this);this.lazyValueSet&&(this.setValue(this.value),delete this.value,delete this.lazyValueSet);this.lazyRawValueSet&&(this.setRawValue(this.rawValue),delete this.rawValue,delete this.lazyRawValueSet)}Ext.ux.form.SpinnerGroup.superclass.onRender.call(this,a,b)},onFieldChange:function(a){this.fireEvent("change",this,this.getValue())}, -initValue:Ext.emptyFn,getValue:function(){var a=[this.items.getCount()];this.items.each(function(b,c){a[c]=Number(b.getValue())});return a},getRawValue:function(){var a=[this.items.getCount()];this.items.each(function(b,c){a[c]=Number(b.getRawValue())});return a},setValue:function(a){this.rendered?this.items.each(function(b,c){b.setValue(a[c])}):(this.value=a,this.lazyValueSet=!0)},setRawValue:function(a){this.rendered?this.items.each(function(b,c){b.setRawValue(a[c])}):(this.rawValue=a,this.lazyRawValueSet= -!0)}});Ext.reg("spinnergroup",Ext.ux.form.SpinnerGroup);Ext.namespace("Ext.ux.form"); -Ext.ux.form.ToggleField=Ext.extend(Ext.form.Field,{cls:"x-toggle-field",initComponent:function(){Ext.ux.form.ToggleField.superclass.initComponent.call(this);this.toggle=new Ext.form.Checkbox;this.toggle.on("check",this.onToggleCheck,this);this.input=new Ext.form.TextField({disabled:!0})},onRender:function(a,b){this.el||(this.panel=new Ext.Panel({cls:this.groupCls,layout:"table",layoutConfig:{columns:2},border:!1,renderTo:a}),this.panel.ownerCt=this,this.el=this.panel.getEl(),this.panel.add(this.toggle), -this.panel.add(this.input),this.panel.doLayout(),this.toggle.getEl().parent().setStyle("padding-right","10px"));Ext.ux.form.ToggleField.superclass.onRender.call(this,a,b)},onResize:function(a,b){this.panel.setSize(a,b);this.panel.doLayout();var c=a-this.toggle.getSize().width-25;this.input.setSize(c,b)},onToggleCheck:function(a,b){this.input.setDisabled(!b)}});Ext.reg("togglefield",Ext.ux.form.ToggleField);Ext.ns("Ext.ux.grid"); -Ext.ux.grid.BufferView=Ext.extend(Ext.grid.GridView,{rowHeight:19,borderHeight:2,scrollDelay:100,cacheSize:20,cleanDelay:500,initTemplates:function(){Ext.ux.grid.BufferView.superclass.initTemplates.call(this);var a=this.templates;a.rowHolder=new Ext.Template('<div class="x-grid3-row {alt}" style="{tstyle}"></div>');a.rowHolder.disableFormats=!0;a.rowHolder.compile();a.rowBody=new Ext.Template('<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',"<tbody><tr>{cells}</tr>", -this.enableRowBody?'<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>':"","</tbody></table>");a.rowBody.disableFormats=!0;a.rowBody.compile()},getStyleRowHeight:function(){return Ext.isBorderBox?this.rowHeight+this.borderHeight:this.rowHeight},getCalculatedRowHeight:function(){return this.rowHeight+this.borderHeight},getVisibleRowCount:function(){var a=this.getCalculatedRowHeight(), -b=this.scroller.dom.clientHeight;return 1>b?0:Math.ceil(b/a)},getVisibleRows:function(){var a=this.getVisibleRowCount(),b=this.scroller.dom.scrollTop,b=0===b?0:Math.floor(b/this.getCalculatedRowHeight())-1;return{first:Math.max(b,0),last:Math.min(b+a+2,this.ds.getCount()-1)}},doRender:function(a,b,c,d,e,g,f){for(var h=this.templates,k=h.cell,l=h.row,t=h.rowBody,p=e-1,u=this.getStyleRowHeight(),y=this.getVisibleRows(),x=[],n,m={},q={tstyle:"width:"+this.getTotalWidth()+";height:"+u+"px;"},r,w=0,A= -b.length;w<A;w++){r=b[w];var u=[],v=w+d,z=v>=y.first&&v<=y.last;if(z)for(var s=0;s<e;s++){n=a[s];m.id=n.id;m.css=0===s?"x-grid3-cell-first ":s==p?"x-grid3-cell-last ":"";m.attr=m.cellAttr="";m.value=n.renderer(r.data[n.name],m,r,v,s,c);m.style=n.style;if(void 0===m.value||""===m.value)m.value=" ";r.dirty&&"undefined"!==typeof r.modified[n.name]&&(m.css+=" x-grid3-dirty-cell");u[u.length]=k.apply(m)}n=[];g&&0===(v+1)%2&&(n[0]="x-grid3-row-alt");r.dirty&&(n[1]=" x-grid3-dirty-row");q.cols=e;this.getRowClass&& -(n[2]=this.getRowClass(r,v,q,c));q.alt=n.join(" ");q.cells=u.join("");x[x.length]=!z?h.rowHolder.apply(q):f?t.apply(q):l.apply(q)}return x.join("")},isRowRendered:function(a){return(a=this.getRow(a))&&0<a.childNodes.length},syncScroll:function(){Ext.ux.grid.BufferView.superclass.syncScroll.apply(this,arguments);this.update()},update:function(){this.scrollDelay?(this.renderTask||(this.renderTask=new Ext.util.DelayedTask(this.doUpdate,this)),this.renderTask.delay(this.scrollDelay)):this.doUpdate()}, -onRemove:function(a,b,c,d){Ext.ux.grid.BufferView.superclass.onRemove.apply(this,arguments);!0!==d&&this.update()},doUpdate:function(){if(0<this.getVisibleRowCount()){for(var a=this.grid,b=a.colModel,c=a.store,d=this.getColumnData(),e=this.getVisibleRows(),g,f=e.first;f<=e.last;f++)if(!this.isRowRendered(f)&&(g=this.getRow(f))){var h=this.doRender(d,[c.getAt(f)],c,f,b.getColumnCount(),a.stripeRows,!0);g.innerHTML=h}this.clean()}},clean:function(){this.cleanTask||(this.cleanTask=new Ext.util.DelayedTask(this.doClean, -this));this.cleanTask.delay(this.cleanDelay)},doClean:function(){if(0<this.getVisibleRowCount()){var a=this.getVisibleRows();a.first-=this.cacheSize;a.last+=this.cacheSize;var b=0,c=this.getRows();0>=a.first&&(b=a.last+1);for(var d=this.ds.getCount();b<d;b++)if((b<a.first||b>a.last)&&c[b].innerHTML)c[b].innerHTML=""}},removeTask:function(a){var b=this[a];b&&b.cancel&&(b.cancel(),this[a]=null)},destroy:function(){this.removeTask("cleanTask");this.removeTask("renderTask");Ext.ux.grid.BufferView.superclass.destroy.call(this)}, -layout:function(){Ext.ux.grid.BufferView.superclass.layout.call(this);this.update()}}); -Ext.override(Ext.layout.FormLayout,{renderItem:function(a,b,c){if(a&&!a.rendered&&(a.isFormField||a.fieldLabel)&&"hidden"!=a.inputType){var d=this.getTemplateArgs(a);"number"==typeof b&&(b=c.dom.childNodes[b]||null);a.formItem=b?this.fieldTpl.insertBefore(b,d,!0):this.fieldTpl.append(c,d,!0);a.actionMode="formItem";a.render("x-form-el-"+a.id);a.container=a.formItem;a.actionMode="container"}else Ext.layout.FormLayout.superclass.renderItem.apply(this,arguments)}}); -Ext.override(Ext.tree.MultiSelectionModel,{onNodeClick:function(a,b){if(b.ctrlKey&&this.isSelected(a))this.unselect(a);else if(b.shiftKey&&!this.isSelected(a)){var c=a.parentNode;if(this.lastSelNode.parentNode.id==c.id){var d=c.indexOf(a),e=c.indexOf(this.lastSelNode);this.select(this.lastSelNode,b,!1,!0);d>e&&(d+=e,e=d-e,d-=e);c.eachChild(function(a){var f=c.indexOf(a);d<f&&f<e&&this.select(a,b,!0,!0)},this);this.select(a,b,!0)}}else this.select(a,b,b.ctrlKey)},select:function(a,b,c,d){!0!==c&&this.clearSelections(!0); -if(this.isSelected(a))return this.lastSelNode=a;this.selNodes.push(a);this.lastSelNode=this.selMap[a.id]=a;a.ui.onSelectedChange(!0);!0!==d&&this.fireEvent("selectionchange",this,this.selNodes);return a}});Ext.ns("Ext.ux.tree"); -Ext.ux.tree.TreeGrid=Ext.extend(Ext.tree.TreePanel,{rootVisible:!1,useArrows:!0,lines:!1,borderWidth:Ext.isBorderBox?0:2,cls:"x-treegrid",columnResize:!0,enableSort:!0,reserveScrollOffset:!0,enableHdMenu:!0,columnsText:"Columns",initComponent:function(){this.root||(this.root=new Ext.tree.AsyncTreeNode({text:"Root"}));var a=this.loader;a?Ext.isObject(a)&&!a.load&&(a=new Ext.ux.tree.TreeGridLoader(a)):a=new Ext.ux.tree.TreeGridLoader({dataUrl:this.dataUrl,requestMethod:this.requestMethod,store:this.store}); -this.loader=a;Ext.ux.tree.TreeGrid.superclass.initComponent.call(this);this.initColumns();this.enableSort&&(this.treeGridSorter=new Ext.ux.tree.TreeGridSorter(this,this.enableSort));this.columnResize&&(this.colResizer=new Ext.tree.ColumnResizer(this.columnResize),this.colResizer.init(this));this.internalTpl||(this.internalTpl=new Ext.XTemplate('<div class="x-grid3-header">','<div class="x-treegrid-header-inner">','<div class="x-grid3-header-offset">','<table style="table-layout: fixed;" cellspacing="0" cellpadding="0" border="0"><colgroup><tpl for="columns"><col /></tpl></colgroup>', -'<thead><tr class="x-grid3-hd-row">','<tpl for="columns">','<td class="x-grid3-hd x-grid3-cell x-treegrid-hd" style="text-align: {align};" id="',this.id,'-xlhd-{#}">','<div class="x-grid3-hd-inner x-treegrid-hd-inner" unselectable="on">',this.enableHdMenu?'<a class="x-grid3-hd-btn" href="#"></a>':"",'{header}<img class="x-grid3-sort-icon" src="',Ext.BLANK_IMAGE_URL,'" />',"</div>","</td></tpl>","</tr></thead>","</table>","</div></div>","</div>",'<div class="x-treegrid-root-node">','<table class="x-treegrid-root-table" cellpadding="0" cellspacing="0" style="table-layout: fixed;"></table>', -"</div>"));this.colgroupTpl||(this.colgroupTpl=new Ext.XTemplate('<colgroup><tpl for="columns"><col style="width: {width}px"/></tpl></colgroup>'))},initColumns:function(){var a=this.columns,b=a.length,c=[],d,e;for(d=0;d<b;d++)e=a[d],e.isColumn||(e.xtype=e.xtype?/^tg/.test(e.xtype)?e.xtype:"tg"+e.xtype:"tgcolumn",e=Ext.create(e)),e.init(this),c.push(e),!1!==this.enableSort&&!1!==e.sortable&&(this.enableSort=e.sortable=!0);this.columns=c},onRender:function(){Ext.tree.TreePanel.superclass.onRender.apply(this, -arguments);this.el.addClass("x-treegrid");this.outerCt=this.body.createChild({cls:"x-tree-root-ct x-treegrid-ct "+(this.useArrows?"x-tree-arrows":this.lines?"x-tree-lines":"x-tree-no-lines")});this.internalTpl.overwrite(this.outerCt,{columns:this.columns});this.mainHd=Ext.get(this.outerCt.dom.firstChild);this.innerHd=Ext.get(this.mainHd.dom.firstChild);this.innerBody=Ext.get(this.outerCt.dom.lastChild);this.innerCt=Ext.get(this.innerBody.dom.firstChild);this.colgroupTpl.insertFirst(this.innerCt,{columns:this.columns}); -this.hideHeaders?this.el.child(".x-grid3-header").setDisplayed("none"):!1!==this.enableHdMenu&&(this.hmenu=new Ext.menu.Menu({id:this.id+"-hctx"}),!1!==this.enableColumnHide&&(this.colMenu=new Ext.menu.Menu({id:this.id+"-hcols-menu"}),this.colMenu.on({scope:this,beforeshow:this.beforeColMenuShow,itemclick:this.handleHdMenuClick}),this.hmenu.add({itemId:"columns",hideOnClick:!1,text:this.columnsText,menu:this.colMenu,iconCls:"x-cols-icon"})),this.hmenu.on("itemclick",this.handleHdMenuClick,this))}, -setRootNode:function(a){a.attributes.uiProvider=Ext.ux.tree.TreeGridRootNodeUI;a=Ext.ux.tree.TreeGrid.superclass.setRootNode.call(this,a);this.innerCt&&this.colgroupTpl.insertFirst(this.innerCt,{columns:this.columns});return a},clearInnerCt:function(){if(Ext.isIE)for(var a=this.innerCt.dom;a.firstChild;)a.removeChild(a.firstChild);else Ext.ux.tree.TreeGrid.superclass.clearInnerCt.call(this)},initEvents:function(){Ext.ux.tree.TreeGrid.superclass.initEvents.apply(this,arguments);this.mon(this.innerBody, -"scroll",this.syncScroll,this);this.mon(this.innerHd,"click",this.handleHdDown,this);this.mon(this.mainHd,{scope:this,mouseover:this.handleHdOver,mouseout:this.handleHdOut})},onResize:function(a,b){Ext.ux.tree.TreeGrid.superclass.onResize.apply(this,arguments);var c=this.innerBody.dom,d=this.innerHd.dom;if(c&&(Ext.isNumber(b)&&(c.style.height=this.body.getHeight(!0)-d.offsetHeight+"px"),Ext.isNumber(a))){var e=Ext.num(this.scrollOffset,Ext.getScrollBarWidth());if(this.reserveScrollOffset||10<c.offsetWidth- -c.clientWidth)this.setScrollOffset(e);else{var g=this;setTimeout(function(){g.setScrollOffset(10<c.offsetWidth-c.clientWidth?e:0)},10)}}},updateColumnWidths:function(){var a=this.columns,b=a.length,c=this.outerCt.query("colgroup"),d=c.length,e,g,f,h;for(f=0;f<b;f++){e=a[f];for(h=0;h<d;h++)g=c[h],g.childNodes[f].style.width=(e.hidden?0:e.width)+"px"}f=0;c=this.innerHd.query("td");for(len=c.length;f<len;f++)e=Ext.fly(c[f]),a[f]&&a[f].hidden?e.addClass("x-treegrid-hd-hidden"):e.removeClass("x-treegrid-hd-hidden"); -a=this.getTotalColumnWidth();Ext.fly(this.innerHd.dom.firstChild).setWidth(a+(this.scrollOffset||0));this.outerCt.select("table").setWidth(a);this.syncHeaderScroll()},getVisibleColumns:function(){var a=[],b=this.columns,c=b.length,d;for(d=0;d<c;d++)b[d].hidden||a.push(b[d]);return a},getTotalColumnWidth:function(){for(var a=0,b=0,c=this.getVisibleColumns(),d=c.length;b<d;b++)a+=c[b].width;return a},setScrollOffset:function(a){this.scrollOffset=a;this.updateColumnWidths()},handleHdDown:function(a, -b){var c=a.getTarget(".x-treegrid-hd");if(c&&Ext.fly(b).hasClass("x-grid3-hd-btn")){var d=this.hmenu.items,e=this.columns,g=this.findHeaderIndex(c),e=e[g];a.stopEvent();Ext.fly(c).addClass("x-grid3-hd-menu-open");this.hdCtxIndex=g;this.fireEvent("headerbuttonclick",d,e,c,g);this.hmenu.on("hide",function(){Ext.fly(c).removeClass("x-grid3-hd-menu-open")},this,{single:!0});this.hmenu.show(b,"tl-bl?")}else c&&(g=this.findHeaderIndex(c),this.fireEvent("headerclick",this.columns[g],c,g))},handleHdOver:function(a, -b){var c=a.getTarget(".x-treegrid-hd");if(c&&!this.headersDisabled){index=this.findHeaderIndex(c);this.activeHdRef=b;this.activeHdIndex=index;var d=Ext.get(c);this.activeHdRegion=d.getRegion();d.addClass("x-grid3-hd-over");if(this.activeHdBtn=d.child(".x-grid3-hd-btn"))this.activeHdBtn.dom.style.height=c.firstChild.offsetHeight-1+"px"}},handleHdOut:function(a,b){var c=a.getTarget(".x-treegrid-hd");if(c&&(!Ext.isIE||!a.within(c,!0)))this.activeHdRef=null,Ext.fly(c).removeClass("x-grid3-hd-over"),c.style.cursor= -""},findHeaderIndex:function(a){a=a.dom||a;for(var b=a.parentNode.childNodes,c=0,d;d=b[c];c++)if(d==a)return c;return-1},beforeColMenuShow:function(){var a=this.columns,b=a.length,c,d;this.colMenu.removeAll();for(c=1;c<b;c++)d=a[c],!1!==d.hideable&&this.colMenu.add(new Ext.menu.CheckItem({itemId:"col-"+c,text:d.header,checked:!d.hidden,hideOnClick:!1,disabled:!1===d.hideable}))},handleHdMenuClick:function(a){var b=this.hdCtxIndex,c=a.getItemId();!1!==this.fireEvent("headermenuclick",this.columns[b], -c,b)&&(b=c.substr(4),0<b&&this.columns[b]&&this.setColumnVisible(b,!a.checked));return!0},setColumnVisible:function(a,b){this.columns[a].hidden=!b;this.updateColumnWidths()},scrollToTop:function(){this.innerBody.dom.scrollTop=0;this.innerBody.dom.scrollLeft=0},syncScroll:function(){this.syncHeaderScroll();var a=this.innerBody.dom;this.fireEvent("bodyscroll",a.scrollLeft,a.scrollTop)},syncHeaderScroll:function(){var a=this.innerBody.dom;this.innerHd.dom.scrollLeft=a.scrollLeft;this.innerHd.dom.scrollLeft= -a.scrollLeft},registerNode:function(a){Ext.ux.tree.TreeGrid.superclass.registerNode.call(this,a);!a.uiProvider&&(!a.isRoot&&!a.ui.isTreeGridNodeUI)&&(a.ui=new Ext.ux.tree.TreeGridNodeUI(a))}});Ext.reg("treegrid",Ext.ux.tree.TreeGrid); -Ext.tree.ColumnResizer=Ext.extend(Ext.util.Observable,{minWidth:14,constructor:function(a){Ext.apply(this,a);Ext.tree.ColumnResizer.superclass.constructor.call(this)},init:function(a){this.tree=a;a.on("render",this.initEvents,this)},initEvents:function(a){a.mon(a.innerHd,"mousemove",this.handleHdMove,this);this.tracker=new Ext.dd.DragTracker({onBeforeStart:this.onBeforeStart.createDelegate(this),onStart:this.onStart.createDelegate(this),onDrag:this.onDrag.createDelegate(this),onEnd:this.onEnd.createDelegate(this), -tolerance:3,autoStart:300});this.tracker.initEl(a.innerHd);a.on("beforedestroy",this.tracker.destroy,this.tracker)},handleHdMove:function(a,b){var c=a.getPageX(),d=a.getTarget(".x-treegrid-hd",3,!0);if(d){var e=d.getRegion(),g=d.dom.style,f=d.dom.parentNode;if(5>=c-e.left&&d.dom!==f.firstChild){for(c=d.dom.previousSibling;c&&Ext.fly(c).hasClass("x-treegrid-hd-hidden");)c=c.previousSibling;c&&(this.activeHd=Ext.get(c),g.cursor=Ext.isWebKit?"e-resize":"col-resize")}else if(5>=e.right-c){for(c=d.dom;c&& -Ext.fly(c).hasClass("x-treegrid-hd-hidden");)c=c.previousSibling;c&&(this.activeHd=Ext.get(c),g.cursor=Ext.isWebKit?"w-resize":"col-resize")}else delete this.activeHd,g.cursor=""}},onBeforeStart:function(a){this.dragHd=this.activeHd;return!!this.dragHd},onStart:function(a){this.dragHeadersDisabled=this.tree.headersDisabled;this.tree.headersDisabled=!0;this.proxy=this.tree.body.createChild({cls:"x-treegrid-resizer"});this.proxy.setHeight(this.tree.body.getHeight());a=this.tracker.getXY()[0];this.hdX= -this.dragHd.getX();this.hdIndex=this.tree.findHeaderIndex(this.dragHd);this.proxy.setX(this.hdX);this.proxy.setWidth(a-this.hdX);this.maxWidth=this.tree.outerCt.getWidth()-this.tree.innerBody.translatePoints(this.hdX).left},onDrag:function(a){a=this.tracker.getXY()[0];this.proxy.setWidth((a-this.hdX).constrain(this.minWidth,this.maxWidth))},onEnd:function(a){a=this.proxy.getWidth();var b=this.tree,c=this.dragHeadersDisabled;this.proxy.remove();delete this.dragHd;b.columns[this.hdIndex].width=a;b.updateColumnWidths(); -setTimeout(function(){b.headersDisabled=c},100)}}); -(function(){Ext.override(Ext.list.Column,{init:function(){var a=Ext.data.Types,b=this.sortType;this.type?Ext.isString(this.type)&&(this.type=Ext.data.Types[this.type.toUpperCase()]||a.AUTO):this.type=a.AUTO;Ext.isString(b)?this.sortType=Ext.data.SortTypes[b]:Ext.isEmpty(b)&&(this.sortType=this.type.sortType)}});Ext.tree.Column=Ext.extend(Ext.list.Column,{});Ext.tree.NumberColumn=Ext.extend(Ext.list.NumberColumn,{});Ext.tree.DateColumn=Ext.extend(Ext.list.DateColumn,{});Ext.tree.BooleanColumn=Ext.extend(Ext.list.BooleanColumn, -{});Ext.reg("tgcolumn",Ext.tree.Column);Ext.reg("tgnumbercolumn",Ext.tree.NumberColumn);Ext.reg("tgdatecolumn",Ext.tree.DateColumn);Ext.reg("tgbooleancolumn",Ext.tree.BooleanColumn)})();Ext.ux.tree.TreeGridLoader=Ext.extend(Ext.tree.TreeLoader,{createNode:function(a){a.uiProvider||(a.uiProvider=Ext.ux.tree.TreeGridNodeUI);return Ext.tree.TreeLoader.prototype.createNode.call(this,a)}}); -Ext.ux.tree.TreeGridNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{isTreeGridNodeUI:!0,renderElements:function(a,b,c,d){var e=a.getOwnerTree(),g=e.columns,f=g[0],h,k,l;this.indentMarkup=a.parentNode?a.parentNode.ui.getChildIndent():"";k=['<tbody class="x-tree-node">','<tr ext:tree-node-id="',a.id,'" class="x-tree-node-el x-tree-node-leaf ',b.cls,'">','<td class="x-treegrid-col">','<span class="x-tree-node-indent">',this.indentMarkup,"</span>",'<img src="',this.emptyIcon,'" class="x-tree-ec-icon x-tree-elbow" />', -'<img src="',b.icon||this.emptyIcon,'" class="x-tree-node-icon',b.icon?" x-tree-node-inline-icon":"",b.iconCls?" "+b.iconCls:"",'" unselectable="on" />','<a hidefocus="on" class="x-tree-node-anchor" href="',b.href?b.href:"#",'" tabIndex="1" ',b.hrefTarget?' target="'+b.hrefTarget+'"':"",">",'<span unselectable="on">',f.tpl?f.tpl.apply(b):b[f.dataIndex]||f.text,"</span></a>","</td>"];h=1;for(l=g.length;h<l;h++)f=g[h],k.push('<td class="x-treegrid-col ',f.cls?f.cls:"",'">','<div unselectable="on" class="x-treegrid-text"', -f.align?' style="text-align: '+f.align+';"':"",">",f.tpl?f.tpl.apply(b):b[f.dataIndex],"</div>","</td>");k.push('</tr><tr class="x-tree-node-ct"><td colspan="',g.length,'">','<table class="x-treegrid-node-ct-table" cellpadding="0" cellspacing="0" style="table-layout: fixed; display: none; width: ',e.innerCt.getWidth(),'px;"><colgroup>');h=0;for(l=g.length;h<l;h++)k.push('<col style="width: ',g[h].hidden?0:g[h].width,'px;" />');k.push("</colgroup></table></td></tr></tbody>");!0!==d&&a.nextSibling&& -a.nextSibling.ui.getEl()?this.wrap=Ext.DomHelper.insertHtml("beforeBegin",a.nextSibling.ui.getEl(),k.join("")):this.wrap=Ext.DomHelper.insertHtml("beforeEnd",c,k.join(""));this.elNode=this.wrap.childNodes[0];this.ctNode=this.wrap.childNodes[1].firstChild.firstChild;a=this.elNode.firstChild.childNodes;this.indentNode=a[0];this.ecNode=a[1];this.iconNode=a[2];this.anchor=a[3];this.textNode=a[3].firstChild},animExpand:function(a){this.ctNode.style.display="";Ext.ux.tree.TreeGridNodeUI.superclass.animExpand.call(this, -a)}});Ext.ux.tree.TreeGridRootNodeUI=Ext.extend(Ext.tree.TreeNodeUI,{isTreeGridNodeUI:!0,render:function(){this.rendered||(this.wrap=this.ctNode=this.node.ownerTree.innerCt.dom,this.node.expanded=!0);if(Ext.isWebKit){var a=this.ctNode;a.style.tableLayout=null;(function(){a.style.tableLayout="fixed"}).defer(1)}},destroy:function(){this.elNode&&Ext.dd.Registry.unregister(this.elNode.id);delete this.node},collapse:Ext.emptyFn,expand:Ext.emptyFn}); -Ext.override(Ext.ux.tree.TreeGridNodeUI,{updateColumns:function(){if(this.rendered){var a=this.node.attributes,b=this.node.getOwnerTree().columns,c=b[0];this.anchor.firstChild.innerHTML=c.tpl?c.tpl.apply(a):a[c.dataIndex]||c.text;i=1;for(len=b.length;i<len;i++)c=b[i],this.elNode.childNodes[i].firstChild.innerHTML=c.tpl?c.tpl.apply(a):a[c.dataIndex]||c.text}}}); -Ext.tree.RenderColumn=Ext.extend(Ext.tree.Column,{constructor:function(a){a.tpl=a.tpl||new Ext.XTemplate("{"+a.dataIndex+":this.format}");a.tpl.format=a.renderer;a.tpl.col=this;Ext.tree.RenderColumn.superclass.constructor.call(this,a)}});Ext.reg("tgrendercolumn",Ext.tree.RenderColumn);Ext.ns("Ext.ux.tree"); -Ext.ux.tree.TreeGridSorter=Ext.extend(Ext.tree.TreeSorter,{sortClasses:["sort-asc","sort-desc"],sortAscText:"Sort Ascending",sortDescText:"Sort Descending",constructor:function(a,b){Ext.isObject(b)||(b={property:a.columns[0].dataIndex||"text",folderSort:!0});Ext.ux.tree.TreeGridSorter.superclass.constructor.apply(this,arguments);this.tree=a;a.on("headerclick",this.onHeaderClick,this);a.ddAppendOnly=!0;var c=this;this.defaultSortFn=function(a,b){var g=c.dir&&"desc"==c.dir.toLowerCase(),f=c.property|| -"text",h=c.sortType,k=!0===c.caseSensitive,l=c.leafAttr||"leaf",t=a.attributes,p=b.attributes;if(c.folderSort){if(t[l]&&!p[l])return 1;if(!t[l]&&p[l])return-1}l=t[f];f=p[f];p=h?h(l):k?l:l.toUpperCase();v2=h?h(f):k?f:f.toUpperCase();return p<v2?g?1:-1:p>v2?g?-1:1:0};a.on("afterrender",this.onAfterTreeRender,this,{single:!0});a.on("headermenuclick",this.onHeaderMenuClick,this)},onAfterTreeRender:function(){this.tree.hmenu&&this.tree.hmenu.insert(0,{itemId:"asc",text:this.sortAscText,cls:"xg-hmenu-sort-asc"}, -{itemId:"desc",text:this.sortDescText,cls:"xg-hmenu-sort-desc"});this.updateSortIcon(0,"asc")},onHeaderMenuClick:function(a,b,c){if("asc"===b||"desc"===b)return this.onHeaderClick(a,null,c),!1},onHeaderClick:function(a,b,c){if(a&&!this.tree.headersDisabled){var d=this;d.property=a.dataIndex;d.dir=a.dir="desc"===a.dir?"asc":"desc";d.sortType=a.sortType;d.caseSensitive===Ext.isBoolean(a.caseSensitive)?a.caseSensitive:this.caseSensitive;d.sortFn=a.sortFn||this.defaultSortFn;this.tree.root.cascade(function(a){a.isLeaf()|| -d.updateSort(d.tree,a)});this.updateSortIcon(c,a.dir)}},updateSortIcon:function(a,b){var c=this.sortClasses;this.tree.innerHd.select("td").removeClass(c).item(a).addClass(c["desc"==b?1:0])}}); -Ext.ux.JSLoader=function(a){Ext.ux.JSLoader.scripts[++Ext.ux.JSLoader.index]={url:a.url,success:!0,jsLoadObj:null,options:a,onLoad:a.onLoad||Ext.emptyFn,onError:a.onError||Ext.ux.JSLoader.stdError,scope:a.scope||this};Ext.Ajax.request({url:a.url,scriptIndex:Ext.ux.JSLoader.index,success:function(a,c){var d=Ext.ux.JSLoader.scripts[c.scriptIndex];try{eval(a.responseText)}catch(e){d.success=!1,d.onError(d.options,e)}d.success&&d.onLoad.call(d.scope,d.options)},failure:function(a,c){var d=Ext.ux.JSLoader.scripts[c.scriptIndex]; -d.success=!1;d.onError(d.options,a.status)}})};Ext.ux.JSLoader.index=0;Ext.ux.JSLoader.scripts=[];Ext.ux.JSLoader.stdError=function(a,b){window.alert("Error loading script:\n\n"+a.url+"\n\nstatus: "+b)}; -Ext.ux.Spinner=Ext.extend(Ext.util.Observable,{incrementValue:1,alternateIncrementValue:5,triggerClass:"x-form-spinner-trigger",splitterClass:"x-form-spinner-splitter",alternateKey:Ext.EventObject.shiftKey,defaultValue:0,accelerate:!1,constructor:function(a){Ext.ux.Spinner.superclass.constructor.call(this,a);Ext.apply(this,a);this.mimicing=!1},init:function(a){this.field=a;a.afterMethod("onRender",this.doRender,this);a.afterMethod("onEnable",this.doEnable,this);a.afterMethod("onDisable",this.doDisable, -this);a.afterMethod("afterRender",this.doAfterRender,this);a.afterMethod("onResize",this.doResize,this);a.afterMethod("onFocus",this.doFocus,this);a.beforeMethod("onDestroy",this.doDestroy,this)},doRender:function(a,b){var c=this.el=this.field.getEl(),d=this.field;d.wrap?this.wrap=d.wrap.addClass("x-form-field-wrap"):d.wrap=this.wrap=c.wrap({cls:"x-form-field-wrap"});this.trigger=this.wrap.createChild({tag:"img",src:Ext.BLANK_IMAGE_URL,cls:"x-form-trigger "+this.triggerClass});d.width||this.wrap.setWidth(c.getWidth()+ -this.trigger.getWidth());this.splitter=this.wrap.createChild({tag:"div",cls:this.splitterClass,style:"width:13px; height:2px;"});this.splitter.setRight(Ext.isIE?1:2).setTop(10).show();this.proxy=this.trigger.createProxy("",this.splitter,!0);this.proxy.addClass("x-form-spinner-proxy");this.proxy.setStyle("left","0px");this.proxy.setSize(14,1);this.proxy.hide();this.dd=new Ext.dd.DDProxy(this.splitter.dom.id,"SpinnerDrag",{dragElId:this.proxy.id});this.initTrigger();this.initSpinner()},doAfterRender:function(){var a; -if(Ext.isIE&&this.el.getY()!=(a=this.trigger.getY()))this.el.position(),this.el.setY(a)},doEnable:function(){this.wrap&&(this.disabled=!1,this.wrap.removeClass(this.field.disabledClass))},doDisable:function(){this.wrap&&(this.disabled=!0,this.wrap.addClass(this.field.disabledClass),this.el.removeClass(this.field.disabledClass))},doResize:function(a,b){"number"==typeof a&&this.el.setWidth(a-this.trigger.getWidth());this.wrap.setWidth(this.el.getWidth()+this.trigger.getWidth())},doFocus:function(){this.mimicing|| -(this.wrap.addClass("x-trigger-wrap-focus"),this.mimicing=!0,Ext.get(Ext.isIE?document.body:document).on("mousedown",this.mimicBlur,this,{delay:10}),this.el.on("keydown",this.checkTab,this))},checkTab:function(a){a.getKey()==a.TAB&&this.triggerBlur()},mimicBlur:function(a){!this.wrap.contains(a.target)&&this.field.validateBlur(a)&&this.triggerBlur()},triggerBlur:function(){this.mimicing=!1;Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur,this);this.el.un("keydown",this.checkTab, -this);this.field.beforeBlur();this.wrap.removeClass("x-trigger-wrap-focus");this.field.onBlur.call(this.field)},initTrigger:function(){this.trigger.addClassOnOver("x-form-trigger-over");this.trigger.addClassOnClick("x-form-trigger-click")},initSpinner:function(){this.field.addEvents({spin:!0,spinup:!0,spindown:!0});this.keyNav=new Ext.KeyNav(this.el,{up:function(a){a.preventDefault();this.onSpinUp()},down:function(a){a.preventDefault();this.onSpinDown()},pageUp:function(a){a.preventDefault();this.onSpinUpAlternate()}, -pageDown:function(a){a.preventDefault();this.onSpinDownAlternate()},scope:this});this.repeater=new Ext.util.ClickRepeater(this.trigger,{accelerate:this.accelerate});this.field.mon(this.repeater,"click",this.onTriggerClick,this,{preventDefault:!0});this.field.mon(this.trigger,{mouseover:this.onMouseOver,mouseout:this.onMouseOut,mousemove:this.onMouseMove,mousedown:this.onMouseDown,mouseup:this.onMouseUp,scope:this,preventDefault:!0});this.field.mon(this.wrap,"mousewheel",this.handleMouseWheel,this); -this.dd.setXConstraint(0,0,10);this.dd.setYConstraint(1500,1500,10);this.dd.endDrag=this.endDrag.createDelegate(this);this.dd.startDrag=this.startDrag.createDelegate(this);this.dd.onDrag=this.onDrag.createDelegate(this)},onMouseOver:function(){if(!this.disabled){var a=this.getMiddle();this.tmpHoverClass=Ext.EventObject.getPageY()<a?"x-form-spinner-overup":"x-form-spinner-overdown";this.trigger.addClass(this.tmpHoverClass)}},onMouseOut:function(){this.trigger.removeClass(this.tmpHoverClass)},onMouseMove:function(){if(!this.disabled){var a= -this.getMiddle();Ext.EventObject.getPageY()>a&&"x-form-spinner-overup"==this.tmpHoverClass||Ext.EventObject.getPageY()}},onMouseDown:function(){if(!this.disabled){var a=this.getMiddle();this.tmpClickClass=Ext.EventObject.getPageY()<a?"x-form-spinner-clickup":"x-form-spinner-clickdown";this.trigger.addClass(this.tmpClickClass)}},onMouseUp:function(){this.trigger.removeClass(this.tmpClickClass)},onTriggerClick:function(){if(!this.disabled&&!this.el.dom.readOnly){var a=this.getMiddle();this["onSpin"+ -(Ext.EventObject.getPageY()<a?"Up":"Down")]()}},getMiddle:function(){var a=this.trigger.getTop(),b=this.trigger.getHeight();return a+b/2},isSpinnable:function(){return this.disabled||this.el.dom.readOnly?(Ext.EventObject.preventDefault(),!1):!0},handleMouseWheel:function(a){if(!1!=this.wrap.hasClass("x-trigger-wrap-focus")){var b=a.getWheelDelta();0<b?(this.onSpinUp(),a.stopEvent()):0>b&&(this.onSpinDown(),a.stopEvent())}},startDrag:function(){this.proxy.show();this._previousY=Ext.fly(this.dd.getDragEl()).getTop()}, -endDrag:function(){this.proxy.hide()},onDrag:function(){if(!this.disabled){var a=Ext.fly(this.dd.getDragEl()).getTop(),b="";this._previousY>a&&(b="Up");this._previousY<a&&(b="Down");if(""!=b)this["onSpin"+b]();this._previousY=a}},onSpinUp:function(){if(!1!=this.isSpinnable())if(!0==Ext.EventObject.shiftKey)this.onSpinUpAlternate();else this.spin(!1,!1),this.field.fireEvent("spin",this),this.field.fireEvent("spinup",this)},onSpinDown:function(){if(!1!=this.isSpinnable())if(!0==Ext.EventObject.shiftKey)this.onSpinDownAlternate(); -else this.spin(!0,!1),this.field.fireEvent("spin",this),this.field.fireEvent("spindown",this)},onSpinUpAlternate:function(){!1!=this.isSpinnable()&&(this.spin(!1,!0),this.field.fireEvent("spin",this),this.field.fireEvent("spinup",this))},onSpinDownAlternate:function(){!1!=this.isSpinnable()&&(this.spin(!0,!0),this.field.fireEvent("spin",this),this.field.fireEvent("spindown",this))},spin:function(a,b){var c=parseFloat(this.field.getValue()),d=!0==b?this.alternateIncrementValue:this.incrementValue; -!0==a?c-=d:c+=d;c=isNaN(c)?this.defaultValue:c;c=this.fixBoundries(c);this.field.setRawValue(c)},fixBoundries:function(a){void 0!=this.field.minValue&&a<this.field.minValue&&(a=this.field.minValue);void 0!=this.field.maxValue&&a>this.field.maxValue&&(a=this.field.maxValue);return this.fixPrecision(a)},fixPrecision:function(a){var b=isNaN(a);return!this.field.allowDecimals||-1==this.field.decimalPrecision||b||!a?b?"":a:parseFloat(parseFloat(a).toFixed(this.field.decimalPrecision))},doDestroy:function(){this.trigger&& -this.trigger.remove();this.wrap&&(this.wrap.remove(),delete this.field.wrap);this.splitter&&this.splitter.remove();this.dd&&(this.dd.unreg(),this.dd=null);this.proxy&&this.proxy.remove();this.repeater&&this.repeater.purgeListeners();this.mimicing&&Ext.get(Ext.isIE?document.body:document).un("mousedown",this.mimicBlur,this)}});Ext.form.Spinner=Ext.ux.Spinner; -Ext.ux.StatusBar=Ext.extend(Ext.Toolbar,{cls:"x-statusbar",busyIconCls:"x-status-busy",busyText:"Loading...",autoClear:5E3,emptyText:" ",activeThreadId:0,initComponent:function(){"right"==this.statusAlign&&(this.cls+=" x-status-right");Ext.ux.StatusBar.superclass.initComponent.call(this)},afterRender:function(){Ext.ux.StatusBar.superclass.afterRender.call(this);var a="right"==this.statusAlign;this.currIconCls=this.iconCls||this.defaultIconCls;this.statusEl=new Ext.Toolbar.TextItem({cls:"x-status-text "+ -(this.currIconCls||""),text:this.text||this.defaultText||""});a?(this.add("->"),this.add(this.statusEl)):(this.insert(0,this.statusEl),this.insert(1,"->"));this.doLayout()},setStatus:function(a){a=a||{};"string"==typeof a&&(a={text:a});void 0!==a.text&&this.setText(a.text);void 0!==a.iconCls&&this.setIcon(a.iconCls);if(a.clear){a=a.clear;var b=this.autoClear,c={useDefaults:!0,anim:!0};"object"==typeof a?(a=Ext.applyIf(a,c),a.wait&&(b=a.wait)):"number"==typeof a?(b=a,a=c):"boolean"==typeof a&&(a=c); -a.threadId=this.activeThreadId;this.clearStatus.defer(b,this,[a])}return this},clearStatus:function(a){a=a||{};if(a.threadId&&a.threadId!==this.activeThreadId)return this;var b=a.useDefaults?this.defaultText:this.emptyText,c=a.useDefaults?this.defaultIconCls?this.defaultIconCls:"":"";a.anim?this.statusEl.el.fadeOut({remove:!1,useDisplay:!0,scope:this,callback:function(){this.setStatus({text:b,iconCls:c});this.statusEl.el.show()}}):(this.statusEl.hide(),this.setStatus({text:b,iconCls:c}),this.statusEl.show()); -return this},setText:function(a){this.activeThreadId++;this.text=a||"";this.rendered&&this.statusEl.setText(this.text);return this},getText:function(){return this.text},setIcon:function(a){this.activeThreadId++;a=a||"";this.rendered?(this.currIconCls&&(this.statusEl.removeClass(this.currIconCls),this.currIconCls=null),0<a.length&&(this.statusEl.addClass(a),this.currIconCls=a)):this.currIconCls=a;return this},showBusy:function(a){"string"==typeof a&&(a={text:a});a=Ext.applyIf(a||{},{text:this.busyText, -iconCls:this.busyIconCls});return this.setStatus(a)}});Ext.reg("statusbar",Ext.ux.StatusBar); |