/** * Magento Commercial Edition * * NOTICE OF LICENSE * * This source file is subject to the Magento Commercial Edition License * that is available at: http://www.magentocommerce.com/license/commercial-edition * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@magentocommerce.com so we can send you a copy immediately. * * DISCLAIMER * * Do not edit or add to this file if you wish to upgrade Magento to newer * versions in the future. If you wish to customize Magento for your * needs please refer to http://www.magentocommerce.com for more information. * * @category Mage * @package Mage_Adminhtml * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com) * @license http://www.magentocommerce.com/license/commercial-edition */ var varienGrid = new Class.create(); varienGrid.prototype = { initialize : function(containerId, url, pageVar, sortVar, dirVar, filterVar){ this.containerId = containerId; this.url = url; this.pageVar = pageVar || false; this.sortVar = sortVar || false; this.dirVar = dirVar || false; this.filterVar = filterVar || false; this.tableSufix = '_table'; this.useAjax = false; this.rowClickCallback = false; this.checkboxCheckCallback = false; this.preInitCallback = false; this.initCallback = false; this.initRowCallback = false; this.doFilterCallback = false; this.reloadParams = false; this.trOnMouseOver = this.rowMouseOver.bindAsEventListener(this); this.trOnMouseOut = this.rowMouseOut.bindAsEventListener(this); this.trOnClick = this.rowMouseClick.bindAsEventListener(this); this.trOnDblClick = this.rowMouseDblClick.bindAsEventListener(this); this.trOnKeyPress = this.keyPress.bindAsEventListener(this); this.thLinkOnClick = this.doSort.bindAsEventListener(this); this.initGrid(); }, initGrid : function(){ if(this.preInitCallback){ this.preInitCallback(this); } if($(this.containerId+this.tableSufix)){ this.rows = $$('#'+this.containerId+this.tableSufix+' tbody tr'); for (var row=0; row1) { this.url+= '?' + parts[1]; } //this.url = this.url.replace(/([^:])\/{2,}/g, '$1/'); return this.url; }, doExport : function(){ if($(this.containerId+'_export')){ location.href = $(this.containerId+'_export').value; } }, bindFilterFields : function(){ var filters = $$('#'+this.containerId+' .filter input', '#'+this.containerId+' .filter select'); for (var i=0; i47 && keyCode<58){ } else{ Event.stop(event); }*/ }, setPage : function(pageNumber){ this.reload(this.addVarToUrl(this.pageVar, pageNumber)); } }; function openGridRow(grid, event){ var element = Event.findElement(event, 'tr'); if(['a', 'input', 'select', 'option'].indexOf(Event.element(event).tagName.toLowerCase())!=-1) { return; } if(element.title){ setLocation(element.title); } } var varienGridMassaction = Class.create(); varienGridMassaction.prototype = { /* Predefined vars */ checkedValues: $H({}), checkedString: '', oldCallbacks: {}, errorText:'', items: {}, gridIds: [], useSelectAll: false, currentItem: false, fieldTemplate: new Template(''), initialize: function (containerId, grid, checkedValues, formFieldNameInternal, formFieldName) { this.setOldCallback('row_click', grid.rowClickCallback); this.setOldCallback('init', grid.initCallback); this.setOldCallback('init_row', grid.initRowCallback); this.setOldCallback('pre_init', grid.preInitCallback); this.useAjax = false; this.grid = grid; this.containerId = containerId; this.initMassactionElements(); this.checkedString = checkedValues; this.formFieldName = formFieldName; this.formFieldNameInternal = formFieldNameInternal; this.grid.initCallback = this.onGridInit.bind(this); this.grid.preInitCallback = this.onGridPreInit.bind(this); this.grid.initRowCallback = this.onGridRowInit.bind(this); this.grid.rowClickCallback = this.onGridRowClick.bind(this); this.initCheckboxes(); this.checkCheckboxes(); }, setUseAjax: function(flag) { this.useAjax = flag; }, setUseSelectAll: function(flag) { this.useSelectAll = flag; }, initMassactionElements: function() { this.container = $(this.containerId); this.count = $(this.containerId + '-count'); this.formHiddens = $(this.containerId + '-form-hiddens'); this.formAdditional = $(this.containerId + '-form-additional'); this.select = $(this.containerId + '-select'); this.form = this.prepareForm(); this.validator = new Validation(this.form); this.select.observe('change', this.onSelectChange.bindAsEventListener(this)); }, prepareForm: function() { var form = $(this.containerId + '-form'), formPlace = null, formElement = this.formHiddens || this.formAdditional; if (!formElement) { formElement = this.container.getElementsByTagName('button')[0]; formElement && formElement.parentNode; } if (!form && formElement) { /* fix problem with rendering form in FF through innerHTML property */ form = document.createElement('form'); form.setAttribute('method', 'post'); form.setAttribute('action', ''); form.id = this.containerId + '-form'; formPlace = formElement.parentNode.parentNode; formPlace.parentNode.appendChild(form); form.appendChild(formPlace); } return form; }, setGridIds: function(gridIds) { this.gridIds = gridIds; this.updateCount(); }, getGridIds: function() { return this.gridIds; }, setItems: function(items) { this.items = items; this.updateCount(); }, getItems: function() { return this.items; }, getItem: function(itemId) { if(this.items[itemId]) { return this.items[itemId]; } return false; }, getOldCallback: function (callbackName) { return this.oldCallbacks[callbackName] ? this.oldCallbacks[callbackName] : Prototype.emptyFunction; }, setOldCallback: function (callbackName, callback) { this.oldCallbacks[callbackName] = callback; }, onGridPreInit: function(grid) { this.initMassactionElements(); this.getOldCallback('pre_init')(grid); }, onGridInit: function(grid) { this.initCheckboxes(); this.checkCheckboxes(); this.updateCount(); this.getOldCallback('init')(grid); }, onGridRowInit: function(grid, row) { this.getOldCallback('init_row')(grid, row); }, onGridRowClick: function(grid, evt) { var tdElement = Event.findElement(evt, 'td'); var trElement = Event.findElement(evt, 'tr'); if(!$(tdElement).down('input')) { if($(tdElement).down('a') || $(tdElement).down('select')) { return; } if (trElement.title) { setLocation(trElement.title); } else{ var checkbox = Element.select(trElement, 'input'); var isInput = Event.element(evt).tagName == 'input'; var checked = isInput ? checkbox[0].checked : !checkbox[0].checked; if(checked) { this.checkedString = varienStringArray.add(checkbox[0].value, this.checkedString); } else { this.checkedString = varienStringArray.remove(checkbox[0].value, this.checkedString); } this.grid.setCheckboxChecked(checkbox[0], checked); this.updateCount(); } return; } if(Event.element(evt).isMassactionCheckbox) { this.setCheckbox(Event.element(evt)); } else if (checkbox = this.findCheckbox(evt)) { checkbox.checked = !checkbox.checked; this.setCheckbox(checkbox); } }, onSelectChange: function(evt) { var item = this.getSelectedItem(); if(item) { this.formAdditional.update($(this.containerId + '-item-' + item.id + '-block').innerHTML); } else { this.formAdditional.update(''); } this.validator.reset(); }, findCheckbox: function(evt) { if(['a', 'input', 'select'].indexOf(Event.element(evt).tagName.toLowerCase())!==-1) { return false; } checkbox = false; Event.findElement(evt, 'tr').select('.massaction-checkbox').each(function(element){ if(element.isMassactionCheckbox) { checkbox = element; } }.bind(this)); return checkbox; }, initCheckboxes: function() { this.getCheckboxes().each(function(checkbox) { checkbox.isMassactionCheckbox = true; }.bind(this)); }, checkCheckboxes: function() { this.getCheckboxes().each(function(checkbox) { checkbox.checked = varienStringArray.has(checkbox.value, this.checkedString); }.bind(this)); }, selectAll: function() { this.setCheckedValues((this.useSelectAll ? this.getGridIds() : this.getCheckboxesValuesAsString())); this.checkCheckboxes(); this.updateCount(); return false; }, unselectAll: function() { this.setCheckedValues(''); this.checkCheckboxes(); this.updateCount(); return false; }, selectVisible: function() { this.setCheckedValues(this.getCheckboxesValuesAsString()); this.checkCheckboxes(); this.updateCount(); return false; }, unselectVisible: function() { this.getCheckboxesValues().each(function(key){ this.checkedString = varienStringArray.remove(key, this.checkedString); }.bind(this)); this.checkCheckboxes(); this.updateCount(); return false; }, setCheckedValues: function(values) { this.checkedString = values; }, getCheckedValues: function() { return this.checkedString; }, getCheckboxes: function() { var result = []; this.grid.rows.each(function(row){ var checkboxes = row.select('.massaction-checkbox'); checkboxes.each(function(checkbox){ result.push(checkbox); }); }); return result; }, getCheckboxesValues: function() { var result = []; this.getCheckboxes().each(function(checkbox) { result.push(checkbox.value); }.bind(this)); return result; }, getCheckboxesValuesAsString: function() { return this.getCheckboxesValues().join(','); }, setCheckbox: function(checkbox) { if(checkbox.checked) { this.checkedString = varienStringArray.add(checkbox.value, this.checkedString); } else { this.checkedString = varienStringArray.remove(checkbox.value, this.checkedString); } this.updateCount(); }, updateCount: function() { this.count.update(varienStringArray.count(this.checkedString)); if(!this.grid.reloadParams) { this.grid.reloadParams = {}; } this.grid.reloadParams[this.formFieldNameInternal] = this.checkedString; }, getSelectedItem: function() { if(this.getItem(this.select.value)) { return this.getItem(this.select.value); } else { return false; } }, apply: function() { if(varienStringArray.count(this.checkedString) == 0) { alert(this.errorText); return; } var item = this.getSelectedItem(); if(!item) { this.validator.validate(); return; } this.currentItem = item; var fieldName = (item.field ? item.field : this.formFieldName); var fieldsHtml = ''; if(this.currentItem.confirm && !window.confirm(this.currentItem.confirm)) { return; } this.formHiddens.update(''); new Insertion.Bottom(this.formHiddens, this.fieldTemplate.evaluate({name: fieldName, value: this.checkedString})); new Insertion.Bottom(this.formHiddens, this.fieldTemplate.evaluate({name: 'massaction_prepare_key', value: fieldName})); if(!this.validator.validate()) { return; } if(this.useAjax && item.url) { new Ajax.Request(item.url, { 'method': 'post', 'parameters': this.form.serialize(true), 'onComplete': this.onMassactionComplete.bind(this) }); } else if(item.url) { this.form.action = item.url; this.form.submit(); } }, onMassactionComplete: function(transport) { if(this.currentItem.complete) { try { var listener = this.getListener(this.currentItem.complete) || Prototype.emptyFunction; listener(this.grid, this, transport); } catch (e) {} } }, getListener: function(strValue) { return eval(strValue); } }; var varienGridAction = { execute: function(select) { if(!select.value || !select.value.isJSON()) { return; } var config = select.value.evalJSON(); if(config.confirm && !window.confirm(config.confirm)) { select.options[0].selected = true; return; } if(config.popup) { var win = window.open(config.href, 'action_window', 'width=500,height=600,resizable=1,scrollbars=1'); win.focus(); select.options[0].selected = true; } else { setLocation(config.href); } } }; var varienStringArray = { remove: function(str, haystack) { haystack = ',' + haystack + ','; haystack = haystack.replace(new RegExp(',' + str + ',', 'g'), ','); return this.trimComma(haystack); }, add: function(str, haystack) { haystack = ',' + haystack + ','; if (haystack.search(new RegExp(',' + str + ',', 'g'), haystack) === -1) { haystack += str + ','; } return this.trimComma(haystack); }, has: function(str, haystack) { haystack = ',' + haystack + ','; if (haystack.search(new RegExp(',' + str + ',', 'g'), haystack) === -1) { return false; } return true; }, count: function(haystack) { if (typeof haystack != 'string') { return 0; } if (match = haystack.match(new RegExp(',', 'g'))) { return match.length + 1; } else if (haystack.length != 0) { return 1; } return 0; }, each: function(haystack, fnc) { var haystack = haystack.split(','); for (var i=0; i 0; //Hash with grid data this.gridData = this.getGridDataHash(predefinedData); //Hidden input data holder this.hiddenDataHolder = $(hiddenDataHolder); this.hiddenDataHolder.value = this.serializeObject(); this.grid = grid; // Set old callbacks this.setOldCallback('row_click', this.grid.rowClickCallback); this.setOldCallback('init_row', this.grid.initRowCallback); this.setOldCallback('checkbox_check', this.grid.checkboxCheckCallback); //Grid this.reloadParamName = reloadParamName; this.grid.reloadParams = {}; this.grid.reloadParams[this.reloadParamName+'[]'] = this.getDataForReloadParam(); this.grid.rowClickCallback = this.rowClick.bind(this); this.grid.initRowCallback = this.rowInit.bind(this); this.grid.checkboxCheckCallback = this.registerData.bind(this); this.grid.rows.each(this.eachRow.bind(this)); }, setOldCallback: function (callbackName, callback) { this.oldCallbacks[callbackName] = callback; }, getOldCallback: function (callbackName) { return this.oldCallbacks[callbackName] ? this.oldCallbacks[callbackName] : Prototype.emptyFunction; }, registerData : function(grid, element, checked) { if(this.multidimensionalMode){ if(checked){ if(element.inputElements) { this.gridData.set(element.value, {}); for(var i = 0; i < element.inputElements.length; i++) { element.inputElements[i].disabled = false; this.gridData.get(element.value)[element.inputElements[i].name] = element.inputElements[i].value; } } } else{ if(element.inputElements){ for(var i = 0; i < element.inputElements.length; i++) { element.inputElements[i].disabled = true; } } this.gridData.unset(element.value); } } else{ if(checked){ this.gridData.set(element.value, element.value); } else{ this.gridData.unset(element.value); } } this.hiddenDataHolder.value = this.serializeObject(); this.grid.reloadParams = {}; this.grid.reloadParams[this.reloadParamName+'[]'] = this.getDataForReloadParam(); this.getOldCallback('checkbox_check')(grid, element, checked); }, eachRow : function(row) { this.rowInit(this.grid, row); }, rowClick : function(grid, event) { var trElement = Event.findElement(event, 'tr'); var isInput = Event.element(event).tagName == 'INPUT'; if(trElement){ var checkbox = Element.select(trElement, 'input'); if(checkbox[0]){ var checked = isInput ? checkbox[0].checked : !checkbox[0].checked; this.grid.setCheckboxChecked(checkbox[0], checked); } } this.getOldCallback('row_click')(grid, event); }, inputChange : function(event) { var element = Event.element(event); if(element && element.checkboxElement && element.checkboxElement.checked){ this.gridData.get(element.checkboxElement.value)[element.name] = element.value; this.hiddenDataHolder.value = this.serializeObject(); } }, rowInit : function(grid, row) { if(this.multidimensionalMode){ var checkbox = $(row).select('.checkbox')[0]; var selectors = this.inputsToManage.map(function (name) { return ['input[name="' + name + '"]', 'select[name="' + name + '"]']; }); var inputs = $(row).select.apply($(row), selectors.flatten()); if(checkbox && inputs.length > 0) { checkbox.inputElements = inputs; for(var i = 0; i < inputs.length; i++) { inputs[i].checkboxElement = checkbox; if(this.gridData.get(checkbox.value) && this.gridData.get(checkbox.value)[inputs[i].name]) { inputs[i].value = this.gridData.get(checkbox.value)[inputs[i].name]; } inputs[i].disabled = !checkbox.checked; inputs[i].tabIndex = this.tabIndex++; Event.observe(inputs[i],'keyup', this.inputChange.bind(this)); Event.observe(inputs[i],'change', this.inputChange.bind(this)); } } } this.getOldCallback('init_row')(grid, row); }, //Stuff methods getGridDataHash: function (_object){ return $H(this.multidimensionalMode ? _object : this.convertArrayToObject(_object)) }, getDataForReloadParam: function(){ return this.multidimensionalMode ? this.gridData.keys() : this.gridData.values(); }, serializeObject: function(){ if(this.multidimensionalMode){ var clone = this.gridData.clone(); clone.each(function(pair) { clone.set(pair.key, encode_base64(Object.toQueryString(pair.value))); }); return clone.toQueryString(); } else{ return this.gridData.values().join('&'); } }, convertArrayToObject: function (_array){ var _object = {}; for(var i = 0, l = _array.length; i < l; i++){ _object[_array[i]] = _array[i]; } return _object; } };