/**
 * CEREBRUM
 *
 * @category    Cerebrum
 * @package     Cerebrum_Payments
 * @copyright   Copyright (c) 2005 Cerebrum (http://www.cerebrum.com.br)
 * @license     http://www.cerebrum.com.br/license.html
 */

//---

// payments
var Payments = Class.create();
Payments.prototype = {
    beforeInitFunc:$H({}),
    afterInitFunc:$H({}),
    beforeValidateFunc:$H({}),
    afterValidateFunc:$H({}),
    initialize: function(form, saveUrl){
        this.form = form;
        this.saveUrl = saveUrl;
        this.onSave = this.nextStep.bindAsEventListener(this);
        this.onComplete = this.resetLoadWaiting.bindAsEventListener(this);
    },

    addBeforeInitFunction : function(code, func) {
        this.beforeInitFunc.set(code, func);
    },

    beforeInit : function() {
        (this.beforeInitFunc).each(function(init){
           (init.value)();;
        });
    },

    init : function () {
        this.beforeInit();
        var elements = Form.getElements(this.form);
        if ($(this.form)) {
            $(this.form).observe('submit', function(event){this.save();Event.stop(event);}.bind(this));
        }
        var method = null;
        for (var i=0; i<elements.length; i++) {
            if (elements[i].name=='payment[method]') {
                if (elements[i].checked) {
                    method = elements[i].value;
                }
            } else {
                elements[i].disabled = true;
            }
            elements[i].setAttribute('autocomplete','off');
        }
        if (method) this.switchMethod(method);
        this.afterInit();
    },

    addAfterInitFunction : function(code, func) {
        this.afterInitFunc.set(code, func);
    },

    afterInit : function() {
        (this.afterInitFunc).each(function(init){
            (init.value)();
        });
    },

    switchMethod: function(method){
        if (this.currentMethod && $('payment_form_'+this.currentMethod)) {
            this.changeVisible(this.currentMethod, true);
        }
        if ($('payment_form_'+method)){
            this.changeVisible(method, false);
            $('payment_form_'+method).fire('payment-method:switched', {method_code : method});
        } else {
            //Event fix for payment methods without form like "Check / Money order"
            document.body.fire('payment-method:switched', {method_code : method});
        }
        this.currentMethod = method;
    },

    changeVisible: function(method, mode) {
        var block = 'payment_form_' + method;
        [block + '_before', block, block + '_after'].each(function(el) {
            element = $(el);
            if (element) {
                element.style.display = (mode) ? 'none' : '';
                element.select('input', 'select', 'textarea').each(function(field) {
                    field.disabled = mode;
                });
            }
        });
    },

    addBeforeValidateFunction : function(code, func) {
        this.beforeValidateFunc.set(code, func);
    },

    beforeValidate : function() {
        var validateResult = true;
        var hasValidation = false;
        (this.beforeValidateFunc).each(function(validate){
            hasValidation = true;
            if ((validate.value)() == false) {
                validateResult = false;
            }
        }.bind(this));
        if (!hasValidation) {
            validateResult = false;
        }
        return validateResult;
    },

    validate: function() {
        var result = this.beforeValidate();
        if (result) {
            return true;
        }
        var methods = document.getElementsByName('payment[method]');
        if (methods.length==0) {
            alert(Translator.translate('Your order cannot be completed at this time as there is no payment methods available for it.'));
            return false;
        }
        for (var i=0; i<methods.length; i++) {
            if (methods[i].checked) {
                return true;
            }
        }
        result = this.afterValidate();
        if (result) {
            return true;
        }
        alert(Translator.translate('Please specify payment method.'));
        return false;
    },

    addAfterValidateFunction : function(code, func) {
        this.afterValidateFunc.set(code, func);
    },

    afterValidate : function() {
        var validateResult = true;
        var hasValidation = false;
        (this.afterValidateFunc).each(function(validate){
            hasValidation = true;
            if ((validate.value)() == false) {
                validateResult = false;
            }
        }.bind(this));
        if (!hasValidation) {
            validateResult = false;
        }
        return validateResult;
    },

    save: function(){
        if (checkout.loadWaiting!=false) return;
        var validator = new Validation(this.form);
        if (this.validate() && validator.validate()) {
            checkout.setLoadWaiting('payment');
            var request = new Ajax.Request(
                this.saveUrl,
                {
                    method:'post',
                    onComplete: this.onComplete,
                    onSuccess: '',//this.onSave,
                    onFailure: checkout.ajaxFailure.bind(checkout),
                    parameters: Form.serialize(this.form)
                }
            );
        }
    },

    resetLoadWaiting: function(){
        checkout.setLoadWaiting(false);
    },

    nextStep: function(transport){
        if (transport && transport.responseText){
            try{
                response = eval('(' + transport.responseText + ')');
            }
            catch (e) {
                response = {};
            }
        }
        /*
        * if there is an error in payment, need to show error message
        */
        if (response.error) {
            if (response.fields) {
                var fields = response.fields.split(',');
                for (var i=0;i<fields.length;i++) {
                    var field = null;
                    if (field = $(fields[i])) {
                        Validation.ajaxError(field, response.error);
                    }
                }
                return;
            }
            alert(response.error);
            return;
        }

        checkout.setStepResponse(response);

        //checkout.setPayment();
    },

    initWhatIsCvvListeners: function(){
        $$('.cvv-what-is-this').each(function(element){
            Event.observe(element, 'click', toggleToolTip);
        });
    }
}

//---

/**
* Returns the value of the selected radio button in the radio group, null if
* none are selected, and false if the button group doesn't exist
*
* @param {radio Object} or {radio id} el
* OR
* @param {form Object} or {form id} el
* @param {radio group name} radioGroup
*/
function $RF(el, radioGroup) {
    if($(el).type && $(el).type.toLowerCase() == 'radio') {
        var radioGroup = $(el).name;
        var el = $(el).form;
    } else if ($(el).tagName.toLowerCase() != 'form') {
        return false;
    }
 
    var checked = $(el).getInputs('radio', radioGroup).find(
        function(re) {return re.checked;}
    );
    return (checked) ? $F(checked) : null;
}

//---

// http://www.somacon.com/p143.php

// return the value of the radio button that is checked
// return an empty string if none are checked, or
// there are no radio buttons
function getCheckedValue(radioObj) {
	if(!radioObj)
		return "";
	var radioLength = radioObj.length;
	if(radioLength == undefined)
		if(radioObj.checked)
			return radioObj.value;
		else
			return "";
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

// set the radio button with the given value as being checked
// do nothing if there are no radio buttons
// if the given value does not exist, all the radio buttons
// are reset to unchecked
function setCheckedValue(radioObj, newValue) {
	if(!radioObj)
		return;
	var radioLength = radioObj.length;
	if(radioLength == undefined) {
		radioObj.checked = (radioObj.value == newValue.toString());
		return;
	}
	for(var i = 0; i < radioLength; i++) {
		radioObj[i].checked = false;
		if(radioObj[i].value == newValue.toString()) {
			radioObj[i].checked = true;
		}
	}
}

//---

// Function init_payments
function init_payments() {

if(document.forms['edit_form']){
var value_p_method = getCheckedValue(document.forms['edit_form'].elements['payment[method]']);
}

if(document.forms['co-payment-form']){
var value_p_method = getCheckedValue(document.forms['co-payment-form'].elements['payment[method]']);
}

//alert(value_p_method);

switch(value_p_method)
{
case 'payments_redecard':

var element_type = $('payments_redecard_bandeira').nodeName;

if (element_type == 'SELECT'){
	var value_bandeira = $('payments_redecard_bandeira').getValue();
}else{
	var value_bandeira = $RF('payments_redecard_bandeira');
}

//alert(value_bandeira);

if (value_bandeira == '' || value_bandeira == null){
	payments_redecard_hide_all();
}

if(value_bandeira == 'DINERS'){
	DINERS_payments_redecard_Event();
}else if(value_bandeira == 'VISA'){
	VISA_payments_redecard_Event();
}else if(value_bandeira == 'MASTERCARD'){
	MASTERCARD_payments_redecard_Event();
}

/*$('li-payments_redecard-bandeiras').on('change', '.radio', function(event) {
    init_payments();
});*/

break;
case 'payments_cielowebservice':

var element_type = $('payments_cielowebservice_bandeira').nodeName;

if (element_type == 'SELECT'){
	var value_bandeira = $('payments_cielowebservice_bandeira').getValue();
}else{
	var value_bandeira = $RF('payments_cielowebservice_bandeira');
}

//alert(value_bandeira);

if (value_bandeira == '' || value_bandeira == null){
	payments_cielowebservice_hide_all();
}

if(value_bandeira == 'VISA'){
	VISA_payments_cielowebservice_Event();
}else if(value_bandeira == 'VISA_ELECTRON'){
	VISA_ELECTRON_payments_cielowebservice_Event();
}else if(value_bandeira == 'MASTERCARD'){
	MASTERCARD_payments_cielowebservice_Event();
}else if(value_bandeira == 'ELO'){
	ELO_payments_cielowebservice_Event();
}else if(value_bandeira == 'DINERS'){
	DINERS_payments_cielowebservice_Event();
}else if(value_bandeira == 'DISCOVER'){
	DISCOVER_payments_cielowebservice_Event();
}

break;
case 'payments_americanexpress':

var element_type = $('payments_americanexpress_bandeira').nodeName;

if (element_type == 'SELECT'){
	var value_bandeira = $('payments_americanexpress_bandeira').getValue();
}else{
	var value_bandeira = $RF('payments_americanexpress_bandeira');
}

//alert(value_bandeira);

if (value_bandeira == '' || value_bandeira == null){
	payments_americanexpress_hide_all();

	__payments_americanexpress_Event();
}

break;
default:

}

}

// Functions Hide
function payments_redecard_hide_all(){
var element_type = $('payments_redecard_bandeira').nodeName;

	if (element_type == 'SELECT'){
		$('payments_redecard_bandeira').addClassName("required-entry");
	}else{
		$('payments_redecard_bandeira').addClassName("validate-one-required");
	}

	if($('payments_redecard_parcelamento_diners')){
		if (element_type == 'SELECT'){
			$('payments_redecard_parcelamento_diners').removeClassName("required-entry");
		}else{
			$('payments_redecard_parcelamento_diners').removeClassName("validate-one-required");
		}
		$('li-payments_redecard-parcelamento-diners').addClassName("no-display");
	}

	if($('payments_redecard_parcelamento_visa')){
		if (element_type == 'SELECT'){
			$('payments_redecard_parcelamento_visa').removeClassName("required-entry");
		}else{
			$('payments_redecard_parcelamento_visa').removeClassName("validate-one-required");
		}
		$('li-payments_redecard-parcelamento-visa').addClassName("no-display");
	}

	if($('payments_redecard_parcelamento_mastercard')){
		if (element_type == 'SELECT'){
			$('payments_redecard_parcelamento_mastercard').removeClassName("required-entry");
		}else{
			$('payments_redecard_parcelamento_mastercard').removeClassName("validate-one-required");
		}
		$('li-payments_redecard-parcelamento-mastercard').addClassName("no-display");
	}
}

// Functions Hide
function payments_cielowebservice_hide_all(){
var element_type = $('payments_cielowebservice_bandeira').nodeName;

	if (element_type == 'SELECT'){
		$('payments_cielowebservice_bandeira').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_bandeira').addClassName("validate-one-required");
	}

	if($('payments_cielowebservice_parcelamento_visa')){
		if (element_type == 'SELECT'){
			$('payments_cielowebservice_parcelamento_visa').removeClassName("required-entry");
		}else{
			$('payments_cielowebservice_parcelamento_visa').removeClassName("validate-one-required");
		}
		$('li-payments_cielowebservice-parcelamento-visa').addClassName("no-display");
	}

	if($('payments_cielowebservice_parcelamento_visa_electron')){
		if (element_type == 'SELECT'){
			$('payments_cielowebservice_parcelamento_visa_electron').removeClassName("required-entry");
		}else{
			$('payments_cielowebservice_parcelamento_visa_electron').removeClassName("validate-one-required");
		}
		$('li-payments_cielowebservice-parcelamento-visa_electron').addClassName("no-display");
	}

	if($('payments_cielowebservice_parcelamento_mastercard')){
		if (element_type == 'SELECT'){
			$('payments_cielowebservice_parcelamento_mastercard').removeClassName("required-entry");
		}else{
			$('payments_cielowebservice_parcelamento_mastercard').removeClassName("validate-one-required");
		}
		$('li-payments_cielowebservice-parcelamento-mastercard').addClassName("no-display");
	}

	if($('payments_cielowebservice_parcelamento_elo')){
		if (element_type == 'SELECT'){
			$('payments_cielowebservice_parcelamento_elo').removeClassName("required-entry");
		}else{
			$('payments_cielowebservice_parcelamento_elo').removeClassName("validate-one-required");
		}
		$('li-payments_cielowebservice-parcelamento-elo').addClassName("no-display");
	}

	if($('payments_cielowebservice_parcelamento_diners')){
		if (element_type == 'SELECT'){
			$('payments_cielowebservice_parcelamento_diners').removeClassName("required-entry");
		}else{
			$('payments_cielowebservice_parcelamento_diners').removeClassName("validate-one-required");
		}
		$('li-payments_cielowebservice-parcelamento-diners').addClassName("no-display");
	}

	if($('payments_cielowebservice_parcelamento_discover')){
		if (element_type == 'SELECT'){
			$('payments_cielowebservice_parcelamento_discover').removeClassName("required-entry");
		}else{
			$('payments_cielowebservice_parcelamento_discover').removeClassName("validate-one-required");
		}
		$('li-payments_cielowebservice-parcelamento-discover').addClassName("no-display");
	}
}

// Functions Hide
function payments_americanexpress_hide_all(){
var element_type = $('payments_americanexpress_bandeira').nodeName;

	if (element_type == 'SELECT'){
		$('payments_americanexpress_bandeira').addClassName("required-entry");
	}else{
		$('payments_americanexpress_bandeira').addClassName("validate-one-required");
	}

	if(document.forms['edit_form']){
		setCheckedValue(document.forms['edit_form'].elements['payment[bandeira]'], '_');
	}

	if(document.forms['co-payment-form']){
		setCheckedValue(document.forms['co-payment-form'].elements['payment[bandeira]'], '_');
	}

	$('li-payments_americanexpress-bandeiras').addClassName("no-display");

	if($('payments_americanexpress_parcelamento__')){
		if (element_type == 'SELECT'){
			$('payments_americanexpress_parcelamento__').removeClassName("required-entry");
		}else{
			$('payments_americanexpress_parcelamento__').removeClassName("validate-one-required");
		}
		$('payments_americanexpress_parcelamento__').addClassName("validate-one-required");
	}
}

// Functions Event Bandeira
function DINERS_payments_redecard_Event() {
var element_type = $('payments_redecard_bandeira').nodeName;
	payments_redecard_hide_all();
	if (element_type == 'SELECT'){
		$('payments_redecard_parcelamento_diners').addClassName("required-entry");
	}else{
		$('payments_redecard_parcelamento_diners').addClassName("validate-one-required");
	}
	$('li-payments_redecard-parcelamento-diners').removeClassName("no-display");
}

function VISA_payments_redecard_Event() {
var element_type = $('payments_redecard_bandeira').nodeName;
	payments_redecard_hide_all();
	if (element_type == 'SELECT'){
		$('payments_redecard_parcelamento_visa').addClassName("required-entry");
	}else{
		$('payments_redecard_parcelamento_visa').addClassName("validate-one-required");
	}
	$('li-payments_redecard-parcelamento-visa').removeClassName("no-display");
}

function MASTERCARD_payments_redecard_Event() {
var element_type = $('payments_redecard_bandeira').nodeName;
	payments_redecard_hide_all();
	if (element_type == 'SELECT'){
		$('payments_redecard_parcelamento_mastercard').addClassName("required-entry");
	}else{
		$('payments_redecard_parcelamento_mastercard').addClassName("validate-one-required");
	}
	$('li-payments_redecard-parcelamento-mastercard').removeClassName("no-display");
}

// Functions Event Bandeira
function VISA_payments_cielowebservice_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_cielowebservice_hide_all();
	if (element_type == 'SELECT'){
		$('payments_cielowebservice_parcelamento_visa').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_parcelamento_visa').addClassName("validate-one-required");
	}
	$('li-payments_cielowebservice-parcelamento-visa').removeClassName("no-display");
}

function VISA_ELECTRON_payments_cielowebservice_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_cielowebservice_hide_all();
	if (element_type == 'SELECT'){
		$('payments_cielowebservice_parcelamento_visa_electron').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_parcelamento_visa_electron').addClassName("validate-one-required");
	}
	$('li-payments_cielowebservice-parcelamento-visa_electron').removeClassName("no-display");
}

function MASTERCARD_payments_cielowebservice_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_cielowebservice_hide_all();
	if (element_type == 'SELECT'){
		$('payments_cielowebservice_parcelamento_mastercard').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_parcelamento_mastercard').addClassName("validate-one-required");
	}
	$('li-payments_cielowebservice-parcelamento-mastercard').removeClassName("no-display");
}

function ELO_payments_cielowebservice_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_cielowebservice_hide_all();
	if (element_type == 'SELECT'){
		$('payments_cielowebservice_parcelamento_elo').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_parcelamento_elo').addClassName("validate-one-required");
	}
	$('li-payments_cielowebservice-parcelamento-elo').removeClassName("no-display");
}

function DINERS_payments_cielowebservice_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_cielowebservice_hide_all();
	if (element_type == 'SELECT'){
		$('payments_cielowebservice_parcelamento_diners').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_parcelamento_diners').addClassName("validate-one-required");
	}
	$('li-payments_cielowebservice-parcelamento-diners').removeClassName("no-display");
}

function DISCOVER_payments_cielowebservice_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_cielowebservice_hide_all();
	if (element_type == 'SELECT'){
		$('payments_cielowebservice_parcelamento_discover').addClassName("required-entry");
	}else{
		$('payments_cielowebservice_parcelamento_discover').addClassName("validate-one-required");
	}
	$('li-payments_cielowebservice-parcelamento-discover').removeClassName("no-display");
}

// Functions Event Bandeira
function __payments_americanexpress_Event() {
var element_type = $('payments_cielowebservice_bandeira').nodeName;
	payments_americanexpress_hide_all();
	if (element_type == 'SELECT'){
		$('payments_americanexpress_parcelamento__').addClassName("required-entry");
	}else{
		$('payments_americanexpress_parcelamento__').addClassName("validate-one-required");
	}
	$('li-payments_americanexpress-parcelamento-_').removeClassName("no-display");
}

// Functions Event Parcelas
function payments_redecard_Parcelamento_Event(param_url) {
var payments = new Payments('co-payment-form', param_url);
payments.save();
}

// Functions Event Parcelas
function payments_cielowebservice_Parcelamento_Event(param_url) {
var payments = new Payments('co-payment-form', param_url);
payments.save();
}

// Functions Event Parcelas
function payments_americanexpress_Parcelamento_Event(param_url) {
var payments = new Payments('co-payment-form', param_url);
payments.save();
}


//---

//---

//---

//---

//---

//---

//---


