/** * 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 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 Varien * @package js * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com) * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) */ VarienForm = Class.create(); VarienForm.prototype = { initialize: function(formId, firstFieldFocus){ this.form = $(formId); if (!this.form) { return; } this.cache = $A(); this.currLoader = false; this.currDataIndex = false; this.validator = new Validation(this.form); this.elementFocus = this.elementOnFocus.bindAsEventListener(this); this.elementBlur = this.elementOnBlur.bindAsEventListener(this); this.childLoader = this.onChangeChildLoad.bindAsEventListener(this); this.highlightClass = 'highlight'; this.extraChildParams = ''; this.firstFieldFocus= firstFieldFocus || false; this.bindElements(); if(this.firstFieldFocus){ try{ Form.Element.focus(Form.findFirstElement(this.form)) } catch(e){} } }, submit : function(url){ if(this.validator && this.validator.validate()){ this.form.submit(); } return false; }, bindElements:function (){ var elements = Form.getElements(this.form); for (var row in elements) { if (elements[row].id) { Event.observe(elements[row],'focus',this.elementFocus); Event.observe(elements[row],'blur',this.elementBlur); } } }, elementOnFocus: function(event){ var element = Event.findElement(event, 'fieldset'); if(element){ Element.addClassName(element, this.highlightClass); } }, elementOnBlur: function(event){ var element = Event.findElement(event, 'fieldset'); if(element){ Element.removeClassName(element, this.highlightClass); } }, setElementsRelation: function(parent, child, dataUrl, first){ if (parent=$(parent)) { // TODO: array of relation and caching if (!this.cache[parent.id]){ this.cache[parent.id] = $A(); this.cache[parent.id]['child'] = child; this.cache[parent.id]['dataUrl'] = dataUrl; this.cache[parent.id]['data'] = $A(); this.cache[parent.id]['first'] = first || false; } Event.observe(parent,'change',this.childLoader); } }, onChangeChildLoad: function(event){ element = Event.element(event); this.elementChildLoad(element); }, elementChildLoad: function(element, callback){ this.callback = callback || false; if (element.value) { this.currLoader = element.id; this.currDataIndex = element.value; if (this.cache[element.id]['data'][element.value]) { this.setDataToChild(this.cache[element.id]['data'][element.value]); } else{ new Ajax.Request(this.cache[this.currLoader]['dataUrl'],{ method: 'post', parameters: {"parent":element.value}, onComplete: this.reloadChildren.bind(this) }); } } }, reloadChildren: function(transport){ var data = eval('(' + transport.responseText + ')'); this.cache[this.currLoader]['data'][this.currDataIndex] = data; this.setDataToChild(data); }, setDataToChild: function(data){ if (data.length) { var child = $(this.cache[this.currLoader]['child']); if (child){ var html = ''; Element.insert(child, {before: html}); Element.remove(child); } } else{ var child = $(this.cache[this.currLoader]['child']); if (child){ var html = ''; Element.insert(child, {before: html}); Element.remove(child); } } this.bindElements(); if (this.callback) { this.callback(); } } } RegionUpdater = Class.create(); RegionUpdater.prototype = { initialize: function (countryEl, regionTextEl, regionSelectEl, regions, disableAction, zipEl) { this.countryEl = $(countryEl); this.regionTextEl = $(regionTextEl); this.regionSelectEl = $(regionSelectEl); this.zipEl = $(zipEl); this.regions = regions; this.disableAction = (typeof disableAction=='undefined') ? 'hide' : disableAction; this.zipOptions = (typeof zipOptions=='undefined') ? false : zipOptions; if (this.regionSelectEl.options.length<=1) { this.update(); } Event.observe(this.countryEl, 'change', this.update.bind(this)); }, update: function() { if (this.regions[this.countryEl.value]) { var i, option, region, def; if (this.regionTextEl) { def = this.regionTextEl.value.toLowerCase(); this.regionTextEl.value = ''; } if (!def) { def = this.regionSelectEl.getAttribute('defaultValue'); } this.regionSelectEl.options.length = 1; for (regionId in this.regions[this.countryEl.value]) { region = this.regions[this.countryEl.value][regionId]; option = document.createElement('OPTION'); option.value = regionId; option.text = region.name; if (this.regionSelectEl.options.add) { this.regionSelectEl.options.add(option); } else { this.regionSelectEl.appendChild(option); } if (regionId==def || region.name.toLowerCase()==def || region.code.toLowerCase()==def) { this.regionSelectEl.value = regionId; } } if (this.disableAction=='hide') { if (this.regionTextEl) { this.regionTextEl.style.display = 'none'; } this.regionSelectEl.style.display = ''; } else if (this.disableAction=='disable') { if (this.regionTextEl) { this.regionTextEl.disabled = true; } this.regionSelectEl.disabled = false; } this.setMarkDisplay(this.regionSelectEl, true); } else { if (this.disableAction=='hide') { if (this.regionTextEl) { this.regionTextEl.style.display = ''; } this.regionSelectEl.style.display = 'none'; Validation.reset(this.regionSelectEl); } else if (this.disableAction=='disable') { if (this.regionTextEl) { this.regionTextEl.disabled = false; } this.regionSelectEl.disabled = true; } else if (this.disableAction=='nullify') { this.regionSelectEl.options.length = 1; this.regionSelectEl.value = ''; this.regionSelectEl.selectedIndex = 0; this.lastCountryId = ''; } this.setMarkDisplay(this.regionSelectEl, false); } // Make Zip and its label required/optional var zipUpdater = new ZipUpdater(this.countryEl.value, this.zipEl); zipUpdater.update(); }, setMarkDisplay: function(elem, display){ elem = $(elem); var labelElement = elem.up(0).down('label > span.required') || elem.up(1).down('label > span.required') || elem.up(0).down('label.required > em') || elem.up(1).down('label.required > em'); if(labelElement) { inputElement = labelElement.up().next('input'); if (display) { labelElement.show(); if (inputElement) { inputElement.addClassName('required-entry'); } } else { labelElement.hide(); if (inputElement) { inputElement.removeClassName('required-entry'); } } } } } ZipUpdater = Class.create(); ZipUpdater.prototype = { initialize: function(country, zipElement) { this.country = country; this.zipElement = $(zipElement); }, update: function() { // Country ISO 2-letter codes must be pre-defined if (typeof optionalZipCountries == 'undefined') { return false; } // Ajax-request and normal content load compatibility if (this.zipElement != undefined) { this._setPostcodeOptional(); } else { Event.observe(window, "load", this._setPostcodeOptional.bind(this)); } }, _setPostcodeOptional: function() { this.zipElement = $(this.zipElement); if (this.zipElement == undefined) { return false; } // find label var label = $$('label[for="' + this.zipElement.id + '"]')[0]; if (label != undefined) { var wildCard = label.down('em') || label.down('span.required'); } // Make Zip and its label required/optional if (optionalZipCountries.indexOf(this.country) != -1) { while (this.zipElement.hasClassName('required-entry')) { this.zipElement.removeClassName('required-entry'); } if (wildCard != undefined) { wildCard.hide(); } } else { this.zipElement.addClassName('required-entry'); if (wildCard != undefined) { wildCard.show(); } } } }