/**
 * Daniel Ifrim
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-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   PfpjRom
 * @package    Js
 * @copyright  Copyright (c) Daniel Ifrim
 * @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 * @author     Daniel Ifrim
 */
if(!PfpjRom) var PfpjRom = {};

PfpjRom.AddressTippersBehaviour = Class.create();
PfpjRom.AddressTippersBehaviour.prototype = {
    initialize : function(tippers_value, state, config, levels_to_paret, is_tippers_required, enable_obj, primary_billing_id, primary_shipping_id, is_default_billing, is_default_shipping) {
    	/*alert("clasa");*/
    	this.enableObj = (enable_obj == true || enable_obj == null ? true : false);
    	this.config = config || {};
    	is_tippers_required = (is_tippers_required == true || enable_obj == null ? true : false);
    	this.triggerBaseId = (this.config.trigger || null);
    	this.requiredHintPath = (this.config.required_hint_path || "span.required");
    	this.optionsConfig = (this.config.options || {});
    	this.fieldsConfig = (this.config.fields || {});
    	this.requiredClass = (this.config.required_class || "required-entry");
    	this.state = state; // billing, shipping or all

/*alert("in pfpjrom/core.js: " + this.triggerBaseId + "1" + " " + $(this.triggerBaseId + "1").checked);
alert("in pfpjrom/core.js: " + this.triggerBaseId + "2" + " " + $(this.triggerBaseId + "2").checked);*/


    	this.primaryBilling = (primary_billing_id != null && $(primary_billing_id) != undefined ? $(primary_billing_id) : null);
    	this.primaryShipping = (primary_shipping_id != null && $(primary_shipping_id) != undefined ? $(primary_shipping_id) : null);
    	
    	this.isDefaultBilling = (is_default_billing == true ? true : false);
    	this.isDefaultShipping = (is_default_shipping == true ? true : false);
    	
    	if (!is_tippers_required) {
    		for(var fieldName in this.fieldsConfig) {
    			if (fieldName.indexOf('pfpj_tip_pers') != -1) {
    				for(var fieldOption in this.fieldsConfig[fieldName]) {
    					if (this.state == 'all' || this.state == 'billing')
    						this.fieldsConfig[fieldName][fieldOption]['billing'].required = false;
    					if (this.state == 'all' || this.state == 'shipping')
    						this.fieldsConfig[fieldName][fieldOption]['shipping'].required = false;
    				}
    				break;
    			}
    		}
    	}
    	
    	this.tippersValue = (!(tippers_value == "" || tippers_value == undefined)  ? tippers_value : this.config.default_option);
    	
    	this.levelsToParet = (levels_to_paret != undefined ? levels_to_paret : 1);

    	this.enableObject(this, this.enableObj);
    },
    enableObject : function(addr, enableObj) {
    	if (!enableObj) {
    		addr.enableObj = false;
    		return false;
    	}
    	addr.enableObj = enableObj;
/*alert("enable: " + enableObj);*/
    	addr.fields = {};
    	for(var fieldName in addr.fieldsConfig) {
    		if ($(fieldName)) {
    			addr.fields[fieldName] = $(fieldName);
    		}
    	}
    	
    	addr.options = {};
    	for(var optionValue in addr.optionsConfig)
    		if ($(addr.triggerBaseId + optionValue))
    			addr.options[optionValue] = $(addr.triggerBaseId + optionValue);

    	for(var option in addr.options)
    		Event.observe(addr.options[option],'click',addr.eventListenerTippers.bindAsEventListener(addr, addr));

    	if (addr.state == 'all' || addr.state == 'billing') {
    		Event.observe(addr.fields[addr.getFieldName(addr, 'pfpj_for_billing')],'change',addr.eventListenerStateFields.bindAsEventListener(addr, addr));
    	}

    	if (addr.state == 'all' || addr.state == 'shipping') {
    		Event.observe(addr.fields[addr.getFieldName(addr, 'pfpj_for_shipping')],'change',addr.eventListenerStateFields.bindAsEventListener(addr, addr));
    	}

    	if (addr.primaryBilling != null)
    		Event.observe(addr.primaryBilling,'change',addr.eventListenerPrimaryBilling.bindAsEventListener(addr, addr));
    	if (addr.primaryShipping != null)
    		Event.observe(addr.primaryShipping,'change',addr.eventListenerPrimaryShipping.bindAsEventListener(addr, addr));
    	
    	addr.initObject(addr);
    	
    	return true;
    },
    initObject : function(addr) {
    	addr.switchOptions(addr);
    },
    setTippersValue : function (addr, v) {
    	addr.tippersValue = v;
    },
    setStateDefaultValue : function(addr, name, state) {
    	var _name = addr.getFieldName(addr, name);
    	if (addr.isDefaultBilling && _name == 'pfpj_for_billing') {
    		addr.fields[_name].value = 1;
    		addr.fields[_name].checked = true;
    	} else if (addr.isDefaultShipping && _name == 'pfpj_for_shipping') {
    		addr.fields[_name].value = 1;
    		addr.fields[_name].checked = true;
    	} else {
    		addr.fields[_name].value = addr.getDefaultValue(addr, _name, addr.tippersValue, state);
    		addr.fields[_name].checked = (addr.fields[_name].value == 1 ? true : false);
    	}
    },
    eventListenerTippers : function(e, addr) {
    	addr.setTippersValue(addr, Event.element(e).value);
    	if (addr.state == 'all' || addr.state == 'billing')
    		addr.setStateDefaultValue(addr, 'pfpj_for_billing', addr.state);
    	if (addr.state == 'all' || addr.state == 'shipping')
    		addr.setStateDefaultValue(addr, 'pfpj_for_shipping', addr.state);
    	addr.switchOptions(addr);
    },
    eventListenerStateFields : function(e, addr) {
    	var el = Event.element(e);
    	for(var optionValue in addr.options) {
			if (addr.options[optionValue].checked == true) {
				addr.setTippersValue(addr, optionValue);
			}
		}

		addr.setStateFieldsByPrimary(addr, el);
    	addr.switchOptions(addr);
    },
    setStateFieldsByPrimary : function (addr, el) {
    	if (el.id == addr.getFieldName(addr, 'pfpj_for_billing')) {
			//alert(addr.primaryBilling.checked);
			if (addr.primaryBilling !== null) {
				if (addr.primaryBilling.checked)
					addr.isDefaultBilling = true;
				else
					addr.isDefaultBilling = false;
			}
    		if (addr.isDefaultBilling) {
				el.checked = true;
    			el.value = 1;
    		}
		}
		if (el.id == addr.getFieldName(addr, 'pfpj_for_billing') && addr.primaryBilling != null) {
			el.value = (el.checked ? 1 : 0);
			if (!el.checked && addr.primaryBilling.checked)
				addr.primaryBilling.checked = false;
		}
		
		if (el.id == addr.getFieldName(addr, 'pfpj_for_shipping')) {
			if (addr.primaryShipping !== null) {
				if (addr.primaryShipping.checked) {
					addr.isDefaultShipping = true;
				} else {
					addr.isDefaultShipping = false;
				}
			}
			if (addr.isDefaultShipping) {
    			el.checked = true;
    			el.value = 1;
			}
		}
		if (el.id == addr.getFieldName(addr, 'pfpj_for_shipping') && addr.primaryShipping != null) {
			el.value = (el.checked ? 1 : 0);
			if (!el.checked && addr.primaryShipping.checked)
				addr.primaryShipping.checked = false;
		}
    },
    eventListenerPrimaryBilling : function(e, addr) {
    	//alert(Event.element(e).id);
    	if (Event.element(e).checked) {
    		var billingName = addr.getFieldName(addr, 'pfpj_for_billing');
    		addr.fields[billingName].checked = true;
    		addr.fields[billingName].value = 1;
    		addr.isDefaultBilling = true;
    		//Event.observe(addr.fields[addr.getFieldName(addr, 'pfpj_for_billing')],'change',addr.eventListenerCheckFieldState.bindAsEventListener(addr, addr));
    	} else {
    		addr.isDefaultBilling = false;
    		//addr.fields[addr.getFieldName(addr, 'pfpj_for_billing')].stopObserving('change', addr.eventListenerCheckFieldState);
    	}
    	addr.eventListenerStateFields(e, addr);
    },
    eventListenerPrimaryShipping : function(e, addr) {
    	if (Event.element(e).checked) {
    		var shippingName = addr.getFieldName(addr, 'pfpj_for_shipping');
    		addr.fields[shippingName].checked = true;
    		addr.fields[shippingName].value = 1;
    		addr.isDefaultShipping = true;
    		//Event.observe(addr.fields[addr.getFieldName(addr, 'pfpj_for_shipping')],'change',addr.eventListenerCheckFieldState.bindAsEventListener(addr, addr));
    	} else {
    		addr.isDefaultShipping = false;
    		//addr.fields[addr.getFieldName(addr, 'pfpj_for_shipping')].stopObserving('change', addr.eventListenerCheckFieldState);
    	}
    	addr.eventListenerStateFields(e, addr);
    },
    getFieldName : function (addr, name) {
    	for(var fieldName in addr.fields) {
    		if (fieldName.indexOf(name) != -1)
    			return fieldName;
    	}
    	return null;
    },
    getIsForBilling : function (addr) {
    	var billingEl = addr.fields[addr.getFieldName(addr, 'pfpj_for_billing')];
    	if (billingEl.checked == true)
    		return true;
    	return false;
    },
    getIsForShipping : function (addr) {
    	var shippingEl = addr.fields[addr.getFieldName(addr, 'pfpj_for_shipping')];
    	if (shippingEl.checked == true)
    		return true;
    	return false;
    },
    isShowField : function (addr, fieldName, tippers_value, state, check_state_field) {
    	var ret;
    	if (state == 'billing') {
    		ret = ((check_state_field && addr.getIsForBilling(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value][state].show;
    	} else if (state == 'shipping') {
    		ret = ((check_state_field && addr.getIsForShipping(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value][state].show;
    	} else {
    		ret = ((check_state_field && addr.getIsForBilling(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value]['billing'].show;
    		ret = ret || (((check_state_field && addr.getIsForShipping(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value]['shipping'].show);
    	}
    	return ret;
    },
    isRequiredField : function (addr, fieldName, tippers_value, state, check_state_field) {
    	var ret;
    	if (state == 'billing') {
    		ret = ((check_state_field && addr.getIsForBilling(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value][state].required;
    	} else if (state == 'shipping') {
    		ret = ((check_state_field && addr.getIsForShipping(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value][state].required;
    	} else {
    		ret = ((check_state_field && addr.getIsForBilling(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value]['billing'].required;
    		ret = ret || (((check_state_field && addr.getIsForShipping(addr)) || !check_state_field) && addr.fieldsConfig[fieldName][tippers_value]['shipping'].required);
    	}
    	return ret;
    },
    getDefaultValue : function(addr, fieldName, tippers_value, state) {
    	var defaultValue;
    	if (state != 'all') {
    		defaultValue = addr.fieldsConfig[fieldName][tippers_value][state].defaultValue;
    	} else {
    		defaultValue = (addr.fieldsConfig[fieldName][tippers_value]['billing'].defaultValue == 1 ||
    						addr.fieldsConfig[fieldName][tippers_value]['shipping'].defaultValue == 1 ? 1 : 0);
    	}
    	return defaultValue;
    },
    switchOptions : function(addr) {
    	var billingName = addr.getFieldName(addr, 'pfpj_for_billing');
    	var shippingName = addr.getFieldName(addr, 'pfpj_for_shipping');
    	
    	if (addr.state == 'all' || addr.state == 'billing')
    		addr.setStateFieldsByPrimary(addr, addr.fields[billingName]);
    	if (addr.state == 'all' || addr.state == 'shipping')
			addr.setStateFieldsByPrimary(addr, addr.fields[shippingName]);
    	
    	for(var fieldName in addr.fields) {
    		if (billingName != fieldName && shippingName != fieldName) {
	    		if (addr.isShowField(addr, fieldName, addr.tippersValue, addr.state, true)) {
	    			addr.fields[fieldName].up(addr.levelsToParet).show();
	    		} else {
	    			addr.fields[fieldName].up(addr.levelsToParet).hide();
	    			addr.fields[fieldName].value = "";
	    		}
    		}
    	}

    	if (addr.state == 'all' || addr.state == 'billing') {
	    	if (addr.isShowField(addr, billingName, addr.tippersValue, addr.state, false)) {
	    		addr.fields[billingName].up(addr.levelsToParet).show();
	    	} else {
	    		addr.fields[billingName].up(addr.levelsToParet).hide();
	    		addr.setStateDefaultValue(addr, 'pfpj_for_billing', addr.state);
	    	}
    	}
    	
    	if (addr.state == 'all' || addr.state == 'shipping') {
	    	if (addr.isShowField(addr, shippingName, addr.tippersValue, addr.state, false)) {
	    		addr.fields[shippingName].up(addr.levelsToParet).show();
	    	} else {
	    		addr.fields[shippingName].up(addr.levelsToParet).hide();
	    		addr.setStateDefaultValue(addr, 'pfpj_for_shipping', addr.state);
	    	}
    	}
    	
    	for(var fieldName in addr.fields) {
    		if (billingName != fieldName && shippingName != fieldName) {
    			var spanReqEl = addr.fields[fieldName].up(addr.levelsToParet).down(addr.requiredHintPath);
	    		if (addr.isRequiredField(addr, fieldName, addr.tippersValue, addr.state, true)) {
	    			addr.fields[fieldName].removeClassName(addr.requiredClass);
	    			addr.fields[fieldName].addClassName(addr.requiredClass);
	    			if (spanReqEl != undefined)
	    				spanReqEl.show();
	    		} else {
	    			addr.fields[fieldName].removeClassName(addr.requiredClass);
	    			if (spanReqEl != undefined)
	    				spanReqEl.hide();
	    		}
    		}
    	}
    	
    	/*if (addr.isRequiredField(addr, billingName, addr.tippersValue, addr.state, false)) {
    		addr.fields[billingName].removeClassName(addr.requiredClass);
	    	addr.fields[billingName].addClassName(addr.requiredClass);
    	} else {
    		addr.fields[billingName].removeClassName(addr.requiredClass);
    	}
    	
    	if (addr.isRequiredField(addr, shippingName, addr.tippersValue, addr.state, false)) {
    		addr.fields[shippingName].removeClassName(addr.requiredClass);
	    	addr.fields[shippingName].addClassName(addr.requiredClass);
    	} else {
    		addr.fields[shippingName].removeClassName(addr.requiredClass);
    	}*/
    	
    },
    mutateFieldsNames : function(addr, prefix_new, prefix_old, suffix_new, suffix_old) {
    	var newFieldsConfig = {};
    	for(var fieldName in addr.fieldsConfig) {
    		var newFieldName = addr._mutateName(fieldName, prefix_new, prefix_old, suffix_new, suffix_old);;
    		newFieldsConfig[newFieldName] = addr.fieldsConfig[fieldName];
    	}
    	
    	addr.fieldsConfig = newFieldsConfig;
    	addr.triggerBaseId = addr._mutateName(addr.triggerBaseId, prefix_new, prefix_old, suffix_new, suffix_old);
    },
    mutatePrimaryNames : function(addr, prefix_new, prefix_old, suffix_new, suffix_old) {
    	var primary_billing_id;
		var primary_shipping_id;
		
		if (addr.primaryBilling != null) {
			primary_billing_id = addr._mutateName(addr.primaryBilling.id, prefix_new, prefix_old, suffix_new, suffix_old);
			addr.primaryBilling = ($(primary_billing_id) != undefined ? $(primary_billing_id) : null);
		}
		
		if (addr.primaryShipping != null) {
			primary_shipping_id = addr._mutateName(addr.primaryShipping.id, prefix_new, prefix_old, suffix_new, suffix_old);
			addr.primaryShipping = ($(primary_shipping_id) != undefined ? $(primary_shipping_id) : null);
		}
		
		/*addr.primaryBilling = ($(primary_billing_id) != undefined ? $(primary_billing_id) : null);
    	addr.primaryShipping = ($(primary_shipping_id) != undefined ? $(primary_shipping_id) : null);*/
		
    },
    _mutateName : function (fieldName, prefix_new, prefix_old, suffix_new, suffix_old) {
    	var newFieldName = fieldName;
    	if (!((prefix_new == "" || prefix_new == null) && (prefix_old == "" || prefix_old == null))) {
    		if (!(prefix_old == "" || prefix_old == null)) {
    			if (newFieldName.indexOf(prefix_old) == 0) {
    				newFieldName = prefix_new + newFieldName.substr(prefix_old.length);
    			}
    		} else {
    			newFieldName = prefix_new + newFieldName;
    		}
		}
		
		if (!((suffix_new == "" || suffix_new == null) && (suffix_old == "" || suffix_old == null))) {
    		if (!(suffix_old == "" || suffix_old == null)) {
    			if (newFieldName.indexOf(suffix_old) > -1 && newFieldName.indexOf(suffix_old) == newFieldName.length - suffix_old.length) {
    				newFieldName = newFieldName.substr(0, newFieldName.indexOf(suffix_old)) + suffix_new;
    			}
    		} else {
    			newFieldName = newFieldName + suffix_new;
    		}
		}
		
    	return newFieldName;
    },
    setFieldsValues : function (addr, addr_source, prefix_source, prefix_target, suffix_source, sufix_target) {
    	for(fieldName in addr.fields) {
    		var field_source;
    		if(addr.fields[fieldName]) {
    			field_source = $(addr._mutateName(fieldName, prefix_source, prefix_target, suffix_source, sufix_target));
    			if (field_source)
    				addr.fields[fieldName].value = field_source.value;
    		}
    	}
		for(var optionValue in addr.options) {
			addr.options[optionValue].checked = addr_source.options[optionValue].checked;
			if (addr.options[optionValue].checked == true) {
				addr.setTippersValue(addr, optionValue);
			}
		}
		/*if (addr.state == 'all' || addr.state == 'billing')
    		addr.setStateDefaultValue(addr, 'pfpj_for_billing', addr.state);
    	if (addr.state == 'all' || addr.state == 'shipping')
    		addr.setStateDefaultValue(addr, 'pfpj_for_shipping', addr.state);*/
		
		/*if (addr.state == 'billing') {
			var shippingName = addr.getFieldName(addr, 'pfpj_for_shipping');
			addr.fields[shippingName].checked = false;
			addr.fields[shippingName].value = 0;
		}
		
		if (addr.state == 'shipping') {
			var billingName = addr.getFieldName(addr, 'pfpj_for_billing');
			addr.fields[billingName].checked = false;
			addr.fields[billingName].value = 0;
		}*/
		
		addr.switchOptions(addr);
    },
    eventListenerSetFieldsValues : function (e, addr, addr_source, prefix_source, prefix_target, suffix_source, sufix_target) {
    	var trigger_el;
    	trigger_el = Event.element(e);
		if (trigger_el.checked) {
	    	addr.setFieldsValues(addr, addr_source, prefix_source, prefix_target, suffix_source, sufix_target);
		}
    },
    syncWithBilling : function (addr, addr_source, trigger, prefix_source, prefix_target, suffix_source, sufix_target) {
    	if ($(trigger)) {
    		addr.triggerSyncWithBilling = $(trigger);
    		Event.observe(addr.triggerSyncWithBilling,'click', addr.eventListenerSetFieldsValues.bindAsEventListener(addr, addr, addr_source, prefix_source, prefix_target, suffix_source, sufix_target));
    	}
    },
    eventListenerCheckFieldState : function(e, addr) {
    	var el = Event.element(e);
    	el.checked = true;
    	el.value = 1;
    	//Event.stop(e);
    }
}