this is a script from an open source script. there is a preInitCallback defined as boolean(i mean, it's inited as fault), but in the initGrid function, it's working like a function (this.preInitCallback(this);). So is this a special usage of prototype? this code confused me so much, any help will be appreciated.
code following... /** * Magento * * NOTICE OF LICENSE * * This source file is subject to the Academic Free License (AFL 3.0) * that is bundled with this package in the file LICENSE_AFL.txt. * It is also available through the world-wide-web at this URL: * http://opensource.org/licenses/afl-3.0.php * 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 lice...@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. * * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ 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; row<this.rows.length; row++) { if(row%2==0){ Element.addClassName(this.rows[row], 'even'); } Event.observe(this.rows [row],'mouseover',this.trOnMouseOver); Event.observe(this.rows [row],'mouseout',this.trOnMouseOut); Event.observe(this.rows[row],'click',this.trOnClick); Event.observe(this.rows [row],'dblclick',this.trOnDblClick); if(this.initRowCallback){ try { this.initRowCallback(this, this.rows[row]); } catch (e) { if(console) { console.log(e); } } } } } if(this.sortVar && this.dirVar){ var columns = $$('#'+this.containerId+this.tableSufix+' thead a'); for(var col=0; col<columns.length; col++){ Event.observe(columns [col],'click',this.thLinkOnClick); } } this.bindFilterFields(); this.bindFieldsChange(); if(this.initCallback){ try { this.initCallback(this); } catch (e) { if(console) { console.log(e); } } } }, getContainerId : function(){ return this.containerId; }, rowMouseOver : function(event){ var element = Event.findElement(event, 'tr'); Element.addClassName(element, 'on-mouse'); if (!Element.hasClassName('pointer') && (this.rowClickCallback !== openGridRow || element.title)) { if (element.title) { Element.addClassName(element, 'pointer'); } } }, rowMouseOut : function(event){ var element = Event.findElement(event, 'tr'); Element.removeClassName(element, 'on-mouse'); }, rowMouseClick : function(event){ if(this.rowClickCallback){ try{ this.rowClickCallback(this, event); } catch(e){} } varienGlobalEvents.fireEvent('gridRowClick', event); }, rowMouseDblClick : function(event){ varienGlobalEvents.fireEvent('gridRowDblClick', event); }, keyPress : function(event){ }, doSort : function(event){ var element = Event.findElement(event, 'a'); if(element.name && element.title){ this.addVarToUrl(this.sortVar, element.name); this.addVarToUrl(this.dirVar, element.title); this.reload(this.url); } Event.stop(event); return false; }, loadByElement : function(element){ if(element && element.name){ this.reload(this.addVarToUrl(element.name, element.value)); } }, reload : function(url){ if (!this.reloadParams) { this.reloadParams = {form_key: FORM_KEY}; } else { this.reloadParams.form_key = FORM_KEY; } url = url || this.url; if(this.useAjax){ new Ajax.Request(url + (url.match(new RegExp('\\?')) ? '&ajax=true' : '?ajax=true' ), { loaderArea: this.containerId, parameters: this.reloadParams || {}, evalScripts: true, onFailure: this._processFailure.bind(this), onComplete: this.initGrid.bind(this), onSuccess: function(transport) { try { if (transport.responseText.isJSON()) { var response = transport.responseText.evalJSON() if (response.error) { alert(response.message); } if(response.ajaxExpired && response.ajaxRedirect) { setLocation(response.ajaxRedirect); } } else { $(this.containerId).update (transport.responseText); } } catch (e) { $(this.containerId).update (transport.responseText); } }.bind(this) }); return; } else{ if(this.reloadParams){ $H(this.reloadParams).each(function(pair){ url = this.addVarToUrl(pair.key, pair.value); }.bind(this)); } location.href = url; } }, /*_processComplete : function(transport){ console.log(transport); if (transport && transport.responseText){ try{ response = eval('(' + transport.responseText + ')'); } catch (e) { response = {}; } } if (response.ajaxExpired && response.ajaxRedirect) { location.href = response.ajaxRedirect; return false; } this.initGrid(); },*/ _processFailure : function(transport){ location.href = BASE_URL; }, addVarToUrl : function(varName, varValue){ var re = new RegExp('\/('+varName+'\/.*?\/)'); var parts = this.url.split(new RegExp('\\?')); this.url = parts[0].replace(re, '/'); this.url+= varName+'/'+varValue+'/'; if(parts.size()>1) { 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; i<filters.length; i++) { Event.observe(filters [i],'keypress',this.filterKeyPress.bind(this)); } }, bindFieldsChange : function(){ if (!$(this.containerId)) { return; } // var dataElements = $(this.containerId+this.tableSufix).down ('.data tbody').select('input', 'select'); var dataElements = $(this.containerId+this.tableSufix).down ('tbody').select('input', 'select'); for(var i=0; i<dataElements.length;i++){ Event.observe(dataElements[i], 'change', dataElements [i].setHasChanges.bind(dataElements[i])); } }, filterKeyPress : function(event){ if(event.keyCode==Event.KEY_RETURN){ this.doFilter(); } }, doFilter : function(){ var filters = $$('#'+this.containerId+' .filter input', '#'+this.containerId+' .filter select'); var elements = []; for(var i in filters){ if(filters[i].value && filters[i].value.length) elements.push(filters[i]); } if (!this.doFilterCallback || (this.doFilterCallback && this.doFilterCallback())) { this.reload(this.addVarToUrl(this.filterVar, encode_base64 (Form.serializeElements(elements)))); } }, resetFilter : function(){ this.reload(this.addVarToUrl(this.filterVar, '')); }, checkCheckboxes : function(element){ elements = Element.select($(this.containerId), 'input [name="'+element.name+'"]'); for(var i=0; i<elements.length;i++){ this.setCheckboxChecked(elements[i], element.checked); } }, setCheckboxChecked : function(element, checked){ element.checked = checked; element.setHasChanges({}); if(this.checkboxCheckCallback){ this.checkboxCheckCallback(this,element,checked); } }, inputPage : function(event, maxNum){ var element = Event.element(event); var keyCode = event.keyCode || event.which; if(keyCode==Event.KEY_RETURN){ this.setPage(element.value); } /*if(keyCode>47 && 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: [], currentItem: false, fieldTemplate: new Template('<input type="hidden" name="#{name}" value="#{value}" />'), 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; }, initMassactionElements: function() { this.container = $(this.containerId); this.form = $(this.containerId + '-form'); this.count = $(this.containerId + '-count'); this.validator = new Validation(this.form); this.formHiddens = $(this.containerId + '-form-hiddens'); this.formAdditional = $(this.containerId + '-form- additional'); this.select = $(this.containerId + '-select'); this.select.observe('change', this.onSelectChange.bindAsEventListener(this)); }, 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'); if(!$(tdElement).down('input')) { if($(tdElement).down('a') || $(tdElement).down('select')) { return; } var trElement = Event.findElement(evt, 'tr'); if (trElement.title) { setLocation(trElement.title); } 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.getGridIds()); 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(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<haystack.length; i++) { fnc(haystack[i]); } }, trimComma: function(string) { string = string.replace(new RegExp('^(,+)','i'), ''); string = string.replace(new RegExp('(,+)$','i'), ''); return string; } }; --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Prototype & script.aculo.us" group. To post to this group, send email to prototype-scriptaculous@googlegroups.com To unsubscribe from this group, send email to prototype-scriptaculous+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/prototype-scriptaculous?hl=en -~----------~----~----~----~------~----~------~--~---