var RequestCall = {
	closeRequested: false,
	
	showRequestForm: function() {
		Dom.setStyle("request_call_container", "display", "block");
		Dom.setStyle("request_call_errors", "display", "none");
		Dom.get('requestCallSpecialsPromotions').checked = 'checked';
		
		var eff = new YAHOO.widget.Effects.BlindDown("request_call_container");
		
		eff.onEffectComplete.subscribe(function() { 
			Dom.addClass("openRequestCallButton", "gray_button");
			Dom.get("requestCallFirstName").focus();
		}); 
	},
	
	hideRequestForm: function() {
		var eff = new YAHOO.widget.Effects.BlindUp("request_call_container");
		eff.onEffectComplete.subscribe(function() { 
			Dom.removeClass("openRequestCallButton", "gray_button");			
			Dom.setStyle("requestSubmittedMsg", "display", "none");
			YAHOO.util.Functional.each([
			  "clearRequestCallFormButton", "submitRequestCallButton"
			], function (el) { Dom.setStyle(el, "display", "inline"); });			
			RequestCall.closeRequested = false;
		}); 
	},
	
	track: function (status) {			  
		if (!YAHOO.tracking || 
		    !YAHOO.tracking.Omniture || 
				!YAHOO.tracking.Omniture.instance) { return; }
		YAHOO.tracking.Omniture.instance.track_ajax(status.argument);
	},
	
	submitRequest: function(formElem, target) {
		if (RequestCall.validate()) {
			RequestCall.closeRequested = true;
			var opted_in = YAHOO.util.Dom.get("requestCallSpecialsPromotions").checked;
			var optin_event = (!opted_in ? "event32" : "event33");			
			try {
				YAHOO.util.Connect.setForm(formElem);
				YAHOO.util.Connect.asyncRequest('POST', formElem.action, {
					argument: {
            link_name: "Click to Call Header",
            link: target,     
            events: ["event31", optin_event],
						props: []
          },
					success: RequestCall.track,
					failure: RequestCall.track
				}); 		
			}
			catch (ex) {}
			
			YAHOO.util.Functional.each([
  			  "clearRequestCallFormButton", "submitRequestCallButton"
  			], function (el) { Dom.setStyle(el, "display", "none"); });
			
			Dom.setStyle("requestSubmittedMsg", "display", "block");
			setTimeout(function() { RequestCall.hideRequestForm(); }, 2000);
		}
	},
	
	highlightError: function (field, label) {
		Dom.addClass(label, "ctaError");
		Dom.addClass(field, "ctaFieldError");
	},
	
	clearError: function (field, label) {
		YAHOO.util.Functional.each([label, field], RequestCall.killAllClassNames);		    	
	},
	
	isFieldValid: function(shortName, block) {
		return block(
		  Dom.get('requestCall' + shortName), 
		  Dom.get('requestCall' + shortName + 'Label')
		);
	},
	
	validate: function() {
		var isValid = true;			
		isValid = YAHOO.util.Functional.all([
		  'FirstName', 'LastName', 'PhoneNumber', 'EmailAddress'
		], function(field) { return RequestCall.isFieldValid(field, RequestCall.validator[field]); });									
		Dom.setStyle("request_call_errors", "display", (isValid ? "none" : "block"));			
		return isValid;
	},
	
	hasNoValue: function (el) {
		return (!el.value || el.value == "");
	},
	
	hasValue: function (el) {
		return !RequestCall.hasNoValue(el);
	},
	
	isNumber: function (data) {
		return !isNaN(data);
	},
	
	isEmail: function (data) {
		return /^([a-zA-Z0-9_.\\-\\+])+@(([a-zA-Z0-9-])+[.])+([a-zA-Z0-9]{2,6})+$/.test(data);
	},
	
	stripPhoneChars: function (data) {
		return data.replace(/[\(\)\.\-\ ]/g, '');
	},
	
	checkForErrors: function(field, label, block) {
		if (block(field)) {				
			RequestCall.clearError(field, label);
			return true;
		}

		RequestCall.highlightError(field, label);
		return false;					
	},
	
	validateField : function(field, label) {
		return RequestCall.checkForErrors(field, label, function () {
			return RequestCall.hasValue(field);
		});
	},
	
	validateEmail: function(field,label){
		return RequestCall.checkForErrors(field, label, function () {
			return RequestCall.isEmail(field.value);
		});		
	},
	
	validatePhone : function(field , label) {
	   return RequestCall.checkForErrors(field, label, function () {
			return (RequestCall.hasValue(field) && RequestCall.isNumber(RequestCall.stripPhoneChars(field.value)));
	   }); 
	},		
	
	clearValue: function(el) { 
		Dom.get(el).value = ""; 
	},
	
	killAllClassNames: function(el) { 
		Dom.get(el).className = ""; 
	},
	
	clearField: function(el) {
		RequestCall.clearValue(el);
		RequestCall.killAllClassNames(el);
	},
	
	clearForm : function() {		
		YAHOO.util.Functional.each([
		  'requestCallFirstName', 'requestCallLastName',
		  'requestCallPhoneNumber', 'requestCallEmailAddress' 
		], RequestCall.clearField);					
		
		YAHOO.util.Functional.each([
		  'requestCallFirstNameLabel', 'requestCallLastNameLabel',
		  'requestCallPhoneNumberLabel', 'requestCallEmailAddressLabel' 
		], RequestCall.killAllClassNames);		
	},
	
	handleClick: function(e) {
		/* Don't allow close to fire again if already requested once and it has not finished yet */
		if (RequestCall.closeRequested !== false) { return; }
		
		var target = Evt.getTarget(e);
		
		if (target.id == "submitRequestCallButton") {
			RequestCall.submitRequest(target.form, target);			
		} 
		else if (target.id == "closeRequestCallFormButton") {
			RequestCall.closeRequested = true;
			RequestCall.hideRequestForm();
		}		
	}
}

RequestCall.validator = {
  'FirstName': 	  RequestCall.validateField,
  'LastName':	  RequestCall.validateField,
  'PhoneNumber':  RequestCall.validatePhone,
  'EmailAddress': RequestCall.validateEmail
};

Evt.onDOMReady(function() {
	Evt.addListener("openRequestCallButton", "click", function(e) {
		if (false === Dom.hasClass("openRequestCallButton", "gray_button")) {
			RequestCall.clearForm();
			RequestCall.showRequestForm();
		}
	});
	
	Evt.addListener("request_call_div", "click", function(e) {
		RequestCall.handleClick(e);
	});
});