(function(jQuery, global){
    global.SearchPaymentCalculator = {

	paymentCalculatorEvents: function() 
	{
		jQuery("#paymentCalculatorIcon").livequery('click',function() {
			/*
			 * The random number added, because the 'payment_MonthlyTerms.do' is getting cached
			 * in IE browsers to avoid this we are appending some random number
			*/
			jQuery("#paymentCalcContainer").load( "payment_MonthlyTerms.do?random=" + Math.random()*99999, function()
			{
				var wrapperObj = jQuery("#designWrapper");
				var iconObj = jQuery("div#paymentCalculatorIcon");
				var leftVal = iconObj.position().left + iconObj.width();
				var topVal = iconObj.position().top;
				jQuery("div#paymentCalculatorTermsLayer").css({top: topVal, left: leftVal});
				jQuery("#numberOfMonths").removeAttr("disabled");
				jQuery("#apr_label").removeAttr("disabled");
				jQuery("#defaultDownPayment_label").removeAttr("disabled");
				jQuery("#tradeInValue_label").removeAttr("disabled");
			});
		}, "form#search");

		jQuery("div.closeWindow").livequery('click',function() 
		{
			if(SearchPaymentCalculator.onChangeOfValue()) SearchPaymentCalculator.disablePaymentFields();
		});	

		jQuery("#reestimate").livequery('click',function() 
		{
		    if(SearchPaymentCalculator.onChangeOfValue())	
			{
				var defaultDownPayment = SearchPaymentCalculator.getFloatNumber(jQuery("#defaultDownPayment_label").val());

				if(!defaultDownPayment)
				{
			    	jQuery("#defaultDownPayment_label").attr('value', 0);
			    	defaultDownPayment = 0;
				}

				var tradeInValue = SearchPaymentCalculator.getFloatNumber(jQuery("#tradeInValue_label").val());

				if(!tradeInValue)
				{
			    	jQuery("#tradeInValue_label").attr('value', 0);
			    	tradeInValue = 0;
				}

				var numberOfMonths = parseInt(jQuery("#numberOfMonths").val());
				var apr = SearchPaymentCalculator.getFloatNumber(jQuery("#apr_label").val());
				
				//Update VD payment calculator widget if present
				if(jQuery("#paymentCalculatorForm").length > 0)
				{
					VehicleDetails.updatePaymentCalculator();
				}
				
				SearchPaymentCalculator.disablePaymentFields(); 
				var requestParams = "downPayment=" + defaultDownPayment + "&tradeInValue=" + tradeInValue + "&numberOfMonths=" + numberOfMonths + "&apr=" + apr;
				SearchPaymentCalculator.updateMonthlyPayment(requestParams);
				
				if (jQuery("#inv_search_priceToggle").attr('checked')) 
				{
					jQuery("#inv_search_monthlyPaymentToggle").trigger('click'); 
				}
			}
		});

		jQuery("#loanTermSelect").change(function() 
		{
			var numberOfMonths = SearchPaymentCalculator.getFloatNumber(jQuery("#loanTermSelect").val());
			var requestParams = "numberOfMonths=" + numberOfMonths;
			SearchPaymentCalculator.updateMonthlyPayment(requestParams);
	    });
		
		jQuery("#trade_label").change(function() 
		{
			var trade = SearchPaymentCalculator.getFloatNumber(jQuery("#trade_label").val());
			var requestParams = "tradeInValue=" + trade;
			SearchPaymentCalculator.updateMonthlyPayment(requestParams);
	    });
		
		jQuery("#downPayment_label").change(function() 
		{
			var downPayment = SearchPaymentCalculator.getFloatNumber(jQuery("#downPayment_label").val());
			var requestParams = "downPayment=" + downPayment;
			SearchPaymentCalculator.updateMonthlyPayment(requestParams);
	    });
		
		jQuery("#interestRate_label").change(function()
		{
			var apr = SearchPaymentCalculator.getFloatNumber(jQuery("#interestRate_label").val());
			var requestParams = "apr=" + apr;
			SearchPaymentCalculator.updateMonthlyPayment(requestParams);
	    });	

	},
	
	getFloatNumber : function(strNumber)
	{
		strNumber = strNumber.replace(",", "");
		strNumber = strNumber.replace(" ", "");
		strNumber = strNumber.replace("%2C", "");
		return parseFloat(strNumber);
	},
	
	updateMonthlyPayment : function(requestParams) 
	{
		jQuery.ajax({
			type: "POST",
			async: false,
			dataType: jQuery.browser.msie ? "xml":"text/xml",
			data: requestParams,
			url: "updateMonthlyPayment.ajax", 
			success: function(data) {
				jQuery(data).find('div').each(function() 
				{
					var id= jQuery(this).attr('id');
					if(id.indexOf("_container") > 0) 
					{
                    	jQuery.browser.msie ? jQuery("#"+id).html(this.xml) : jQuery("#"+id).html(this);
                        SearchSliders.updateSliders();
              		}
				});
			}
		});		
	},
	
	disablePaymentFields : function() 
	{
		jQuery("#numberOfMonths").attr("disabled", true);
		jQuery("#apr_label").attr("disabled", true);
		jQuery("#defaultDownPayment_label").attr("disabled", true);
		jQuery("#tradeInValue_label").attr("disabled", true);
		jQuery("#paymentCalculatorTermsLayer").fadeOut("fast");
	},


	onChangeOfValue : function() 
	{
		var someForm = document.getElementById("paymentCalcContainer");
  		var valid = false;
  		try {
  			valid = SearchPaymentCalculator.validate(someForm);
  		}
        catch (err) {
 			handleException(err);
            return false;
  		}

        return valid;
	},


	validate : function(someForm) 
	{
		FormUtility.resetErrors();
  		var missingFields = FormUtility.getMissingRequired(someForm);	
  		if (missingFields.length) throw new MissingRequiredError(missingFields);
  		var badFields = FormUtility.getBadlyFormatted(someForm);
		var interestField = document.getElementById("apr_label");
  		var interestFieldValue = interestField.value;
  		if (interestFieldValue > 100 || isNaN(interestFieldValue) || interestFieldValue == "") badFields.push(interestFieldValue);
  		if (missingFields.length || badFields.length) 
		{	
			SearchPaymentCalculator.BadFormatSliderError(badFields);
			SearchPaymentCalculator.resetTextBox("#apr_label", global.aprValue);
			SearchPaymentCalculator.resetTextBox("#defaultDownPayment_label", global.defaultPaymentvalue);
			SearchPaymentCalculator.resetTextBox("#tradeInValue_label", global.tradeInValue);
			return false;
		} else return true;

	},

	BadFormatSliderError : function(fieldList) 
	{
		for (var i=0; i<fieldList.length; i++) 
		{
			var currElem = fieldList[i];
			SearchPaymentCalculator.hightlightTextBox("#"+currElem.id);
		}
		alert(ERRORMESSAGE_ENTER_REQUIRED_DATA);
	},

	hightlightTextBox : function(txtBoxId) 
	{
		var currentValue = jQuery(txtBoxId).val();
		if(isNaN(currentValue) || currentValue < 0) jQuery(txtBoxId).addClass("highlightcolor");
	},

	resetTextBox : function(txtBoxId, defaultValue) 
	{
		var currentValue = jQuery(txtBoxId).val();
		if(isNaN(currentValue) || currentValue < 0) 
		{
			jQuery(txtBoxId).attr('value',defaultValue);
			jQuery(txtBoxId).removeClass("highlightcolor");
		}
	}
};

})(Cobalt.Core.JQueryFactory.getLatest(), window);


