var submitter = null;
function submitFunction() {
   submitter = 1;
}

var errCSS = {
    'border-color': 'red',
    'border-style': 'solid'
};

function showAjaxMessage(message){
    $('#checkoutButtonContainer').hide();
    $('#ajaxMessages').show().html(message);
}

function hideAjaxMessage(){
    $('#checkoutButtonContainer').show();
    $('#ajaxMessages').hide();
}

function fieldHasError($element, minLength){
    if ($element.is(':visible') && $element.hasClass('required')){
        if ($element.val().length < minLength){
            return true;
        }
    }
  return false;
}

function queueAjax(o){
    var options = {
        url: o.url,
        cache: o.cache || false,
        dataType: o.dataType || 'html',
        type: o.type || 'GET',
        contentType: o.contentType || 'application/x-www-form-urlencoded; charset=' + ajaxCharset,
        data: o.data || false,
        beforeSend: function (){
            showAjaxMessage(o.beforeSendMsg || 'Ajax Operation, Please Wait...');
        },
        complete: hideAjaxMessage,
        success: o.success,
        error: function (){
            alert(o.errorMsg || 'There was an ajax error, please contact IT Web Experts for support.');
        }
    };
    
    $.ajaxq('update', options);
}

function clickButton(elementName){
    if ($(':radio[name="' + elementName + '"]').size() <= 0){
        $('input[name="' + elementName + '"]').click();
    }else{
        $(':radio[name="' + elementName + '"]:checked').click();
    }
}

function updateAddressHTML(settings){
    var selector = '#billingAddress';
    var sendMsg = 'Billing';
    var errMsg = 'billing';
    if (settings.action == 'getShippingAddress'){
        selector = '#shippingAddress';
        sendMsg = 'Shipping';
        errMsg = 'shipping';
    }
    
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Updating ' + sendMsg + ' Address',
        success: function (data){
            $(selector).html(data);
            if (settings.action == 'getShippingAddress') updateShippingMethods();
        },
        errorMsg: 'There was an error loading your ' + errMsg + ' address, please inform IT Web Experts about this error.'
    });
}

function checkoutUpdateCartView(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Refreshing Shopping Cart',
        success: function (data){
            if (data == 'none'){
                document.location = settings.eUrl;
            }else{
                $('#shoppingCart').html(data);
                
                $('.removeFromCart').each(function (){
                    addRemoveMethod($(this));
                });
                
                if ($('#noShippingAddress:hidden').size() > 0){
                    updateShippingMethods();
                }else{
                    updateOrderTotals();
                }
                updateFinalProductListing();
            }
        },
        errorMsg: 'There was an error refreshing the shopping cart, please inform IT Web Experts about this error.'
    });
}

function checkoutUpdateFinalProductListing(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Refreshing Final Product Listing',
        success: function (data){
            $('.finalProducts').html(data);
        },
        errorMsg: 'There was an error refreshing the final products listing, please inform IT Web Experts about this error.'
    });
}

function checkoutUpdateOrderTotals(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Updating Order Totals',
        success: function (data){
            $('.orderTotals').html(data);
        },
        errorMsg: 'There was an error refreshing the shopping cart, please inform IT Web Experts about this error.'
    });
}

function checkoutUpdateShippingMethods(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Updating Shipping Methods',
        success: function (data){
            $('#noShippingAddress').hide();
            $('#shippingMethods').html(data);
            $('#shippingMethods').show();
            
            $('.shippingRow').each(function (){
                addRowMethods($(this));
                
                $('input[name="shipping"]', $(this)).click(function (){
                    setShippingMethod($(this).val());
                });
            });
            clickShippingButton();
        },
        errorMsg: 'There was an error updating shipping methods, please inform IT Web Experts about this error.'
    });
}

function checkoutUpdatePaymentMethods(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Updating Payment Methods',
        success: function (data){
            $('#noPaymentAddress').hide();
            $('#paymentMethods').html(data);
            $('#paymentMethods').show();
            
            $('.paymentRow').each(function (){
                addRowMethods($(this));
                
                $('input[name="payment"]', $(this)).click(function (){
                    setPaymentMethod($(this));
                });
            });
            clickPaymentButton();
        },
        errorMsg: 'There was an error updating payment methods, please inform IT Web Experts about this error.'
    });
}

function addRowMethods($row){
    $row.hover(function (){
        if (!$(this).hasClass('moduleRowSelected')){
            $(this).addClass('moduleRowOver');
        }
    }, function (){
        if (!$(this).hasClass('moduleRowSelected')){
            $(this).removeClass('moduleRowOver');
        }
    }).click(function (){
        if (!$(this).hasClass('moduleRowSelected')){
            var selector = ($(this).hasClass('shippingRow') ? '.shippingRow' : '.paymentRow') + '.moduleRowSelected';
            $(selector).removeClass('moduleRowSelected');
            $(this).removeClass('moduleRowOver').addClass('moduleRowSelected');
            if (!$('input[type="radio"]', $(this)).is(':checked')){
                $('input[type="radio"]', $(this)).attr('checked', 'checked').click();
            }
        }
    });
}

function checkoutLoadAddressBook(settings){
      queueAjax({
        url: settings.url,
        beforeSendMsg: 'Loading Address Book',
        success: function (data){
            settings.dialog.html(data);
        },
        errorMsg: 'There was an error loading your address book, please inform IT Web Experts about this error.'
    });
}

function setCheckoutAddress(settings){
    var selector = '#billingAddress';
    var sendMsg = 'Setting Billing Address';
    var errMsg = 'billing address';
    if (settings.action == 'setSendTo' && settings.useShipping == true){
        selector = '#shippingAddress';
        sendMsg = 'Setting Shipping Address';
        errMsg = 'shipping address';
    }
    var postData = $(':select, :radio, :input', $(selector)).serialize();
    queueAjax({
        url: settings.url,
        beforeSendMsg: sendMsg,
        dataType: 'json',
        type: 'POST',
        data: postData,
        success: settings.success,
        errorMsg: 'There was an error updating your ' + errMsg + ', please inform IT Web Experts about this error.'
    });
}

function checkoutSetShippingMethod(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Setting Shipping Method',
        dataType: 'json',
        success: function (data){
            updateOrderTotals();
        },
        errorMsg: 'There was an error setting shipping method, please inform IT Web Experts about this error.'
    });
}

function checkoutSetPaymentMethod(settings){
    queueAjax({
        url: settings.url,
        beforeSendMsg: 'Setting Payment Method',
        dataType: 'json',
        success: function (data){
            $('.paymentFields').remove();
            if (data.inputFields != ''){
                $(data.inputFields).insertAfter(settings.element.parent().parent());
            }
            updateOrderTotals();
        },
        errorMsg: 'There was an error setting payment method, please inform IT Web Experts about this error.'
    });
}

function checkAddressErrors(inputFields, selectFields, addErrorClass){
    var errMessage = '';
    addErrorClass = addErrorClass || false;
    $(inputFields).each(function (i, aInfo){
        if (fieldHasError($('input[name="' + inputFields[i][0] + '"]'), inputFields[i][1])){
            errMessage += inputFields[i][2] + "\n";
            if (addErrorClass){
                $('input[name="' + inputFields[i][0] + '"]').css(errCSS);
            }
        }
    });
      
    $(selectFields).each(function (i, aInfo){
        if ($('select[name="' + selectFields[i][0] + '"]').val() == ''){
            errMessage += selectFields[i][1] + "\n";
            if (addErrorClass){
                $('select[name="' + inputFields[i][0] + '"]').css(errCSS);
            }
        }
    });
  return errMessage;
}

function checkoutAddCountryAjax(settings){
    settings.field.change(function (event, callBack){
        var $thisName = $(this).attr('name');
        queueAjax({
            url: settings.url + '&fieldName=' + settings.fieldName + '&cID=' + $(this).val(),
            beforeSendMsg: 'Getting Country\'s Zones',
            success: function (data){
                $('#' + settings.state_column).html(data);
                
                if (settings.fieldName == 'billing_state'){
                    if ($(':select', $('#' + settings.state_column)).size() > 0){
                        $(':select', $('#' + settings.state_column)).change(processBillingAddress);
                    }else{
                        $('input', $('#' + settings.state_column)).blur(processBillingAddress);
                    }
                }
                
                if (callBack){
                    callBack.call();
                }
            },
            errorMsg: 'There was an error getting states, please inform IT Web Experts about this error.'
        });
    });
}

function checkoutAddCartRemoveMethod(settings){
    settings.element.click(function (){
        var $productRow = $(this).parent().parent();
        queueAjax({
            url: this.href + '&rType=ajax',
            beforeSendMsg: 'Removing Product From Cart',
            dataType: 'json',
            data: data,
            success: function (data){
                if (data.products == 0){
                    document.location = settings.noProdURL;
                }else{
                    $productRow.remove();
                    updateFinalProductListing();
                    updateOrderTotals();
                    updateShippingMethods();
                }
            },
            errorMsg: 'There was an error updating shopping cart, please inform IT Web Experts about this error.'
        });
      return false;
    });    
}

function processBillingAddress(){
    var thisName = $(this).attr('name');
    if ((thisName != 'password' && thisName != 'confirmation') || ((thisName == 'password' || thisName == 'confirmation') && $(this).hasClass('required'))){
        var errCheck = checkBillingAddress(false);
        if (errCheck == ''){
            setBillTo();
            updatePaymentMethods();

            if ($('#diffShipping:checked').size() <= 0){
                setSendTo(false);
            }else{
                setSendTo(true);
            }
            updateShippingMethods();
            updateCartView();
        }else{
            if ($('#diffShipping:checked').size() <= 0){
                $('.noAddress').show();
                $('#shippingMethods').hide();
            }else{
                $('#noBillingAddress').show();
            }
            $('#paymentMethods').hide();
        }
    }
}

