var sms = {
	window: {
		//Wire up links and form on DOM load
		initLinks: function () {
			
			//Displaying the window
			sms.window.wireUpLinks();

			//IE7 Seems to have some laggy rendering, so we try one more time to make sure its all hooked up
			sms.window.wireUpLinks.delay(1.5);

			//Closing the window
			$("smsCLoseLink").observe('click',sms.window.close);
			$("smsCancelBtn").observe('click',sms.window.close);
			
			//Submitting form
			$("smsSubmitBtn").observe('click',sms.window.submit);

			//Send Again
			$("smsAgainLink").observe('click',sms.window.resetWindow);

			// Opt in radio event for Terms & Conditions display
			//$("smsOptINFlag").observe('click',sms.window.displayTerms);
			new Form.Element.Observer($('smsOptINFlag1'), 0.1, sms.window.handleTermsDisplay);
			new Form.Element.Observer($('smsOptINFlag2'), 0.1, sms.window.handleTermsDisplay);
			new Form.Element.Observer($('smsOptINFlag3'), 0.1, sms.window.handleTermsDisplay);
			new Form.Element.Observer($('smsOptINFlagDefault'), 0.1, sms.window.handleTermsDisplay);
						
			//Watch inputs for auto focus changing
			new Form.Element.Observer($('smsAreaCode'), 0.1, sms.window.handleFieldBounce);
			new Form.Element.Observer($('smsMobilePrefix'), 0.1, sms.window.handleFieldBounce);
			
		},

		//List of select elements that need to be hidden in IE6 for window overlay
		selects: [],
		
		//wireup all A tags with class=smsLink
		//Collect any SELECT form elements that may punch threw DHTML layers in IE6 so we can hide them
		wireUpLinks: function () {
			$$('a.smsLink').each(function(link){
				link.observe('click',sms.window.handleLink,true);
			});
			
			//Collect the select form elements for IE6 so that they may be hidden when window is shown
			sms.window.selects = new Array(); //zero it out so subsequent runs dont "push" on the same element
			if( navigator.appVersion.toLowerCase().indexOf( "msie 6" ) != -1 ) {
				
				$$('FORM').each(function(form){
					for(n=0; n < form.elements.length; n++) {
						if ( form.elements[n].type.startsWith('select') ) {
							sms.window.selects.push(form.elements[n]);
						}
					}
				});
			}
		},
		
		//Control select element visibility
		manageSelects: function (state) {
			if (state=="hide") {
				sms.window.selects.each(function(select) {
					select.style.visibility = 'hidden';
				});
			} else {
				sms.window.selects.each(function(select) {
					select.style.visibility = 'visible';
				});
			}
		},

		//Handler for displaying the window
		handleLink: function (event) {
			if ( sms.window.transmitting ) return;
			sms.window.doAnalytics('open');
			sms.window.resetWindow();
			sms.window.resetForm();
			
			//Embed external data into form
			$('smsdealerId').value = event.target.getAttribute('dealerid');
			if ($('smsVIN')) $('smsVIN').value = event.target.getAttribute('vin');
			if ( $('smsFormattedDirectionsSource') ) $('smsFormattedDirections').value = $('smsFormattedDirectionsSource').value;

			var offsetLeft = event.target.getWidth() - $("sms_popup_dealer_directions").getWidth();
			var offsetTop = event.target.getHeight() + 3;
			
			try {//First time fails for IE7
				Element.clonePosition($("sms_popup_dealer_directions"), Event.element(event), {setWidth:false, setHeight:false, offsetLeft:offsetLeft, offsetTop:offsetTop});
			}
			catch (err) {//Try one more time... this is so lame, pretend like you never saw this
				Element.clonePosition($("sms_popup_dealer_directions"), Event.element(event), {setWidth:false, setHeight:false, offsetLeft:offsetLeft, offsetTop:offsetTop});
			}
			
			sms.window.manageSelects('hide');

			$("sms_popup_dealer_directions").setStyle({visibility:"visible"});
			$("smsEmail").focus();
		},
		
		//Handler for closing window
		close: function () {
			if ( sms.window.transmitting ) return;
			$('sms_popup_dealer_directions').setStyle({'visibility':'hidden'});
			sms.window.manageSelects('show');
		},

		//Handler for submitting form
		submit: function () {
			$('smsLoading').setStyle({"display":"block"});
			$('smsButtons').setStyle({"display":"none"});
			sms.window.transmitting = true;
			$('smsInputs').request({
				onSuccess: sms.window.handleResponse,
				onFailure: sms.window.handleFailure,
				onComplete: function(transport, json){ sms.window.transmitting = false; }
			})
		},

		//Handler for a successful request response
		handleResponse: function (transport) {
			var msg = transport.responseText.evalJSON();
			if(msg && msg.success) {
				sms.window.showSuccess(transport, msg);
			} else {
				sms.window.showError(transport, msg);
			}
		},

		//Handler for a failed request
		handleFailure: function (transport) {
			sms.window.showError(transport, false);
		},
		
		//Handle display detials for showing a success message
		showSuccess: function (transport, msg) {
			sms.window.doAnalytics('success');
			sms.window.resetWindow();

			$('smsInputs').setStyle({"display":"none"});
			$('smsAgainLink').setStyle({"display":"block"});
			$('smsSuccessMsg').innerHTML = "Success: "+msg.message;
			$('smsSuccessMsg').setStyle({"display":"block"});
		},
		
		//Handle display detials for showing an error message
		showError: function (transport, msg) {
			sms.window.doAnalytics('fail');
			sms.window.resetWindow();

			if (msg) { //server side error message
				$('smsErrorMsg').innerHTML = msg.message;
			} else { //client side error message
				$('smsErrorMsg').innerHTML = "Unable to deliver SMS message:<br />["+transport.status+"] "+transport.statusText;
			}
			$('sms_popup_dealer_directions').setStyle({"border":"2px solid #CC0000"});
			$('smsErrorMsg').setStyle({"display":"block"});
		},
		
		//Handle the details for reseting the window display to its default
		resetWindow: function () {
			$('sms_popup_dealer_directions').setStyle({"border":"1px solid #CCCCCC"});
			$('smsErrorMsg').setStyle({"display":"none"});
			$('smsSuccessMsg').setStyle({"display":"none"});
			$('smsAgainLink').setStyle({"display":"none"});
			$('smsInputs').setStyle({"display":"block"});
			$('smsLoading').setStyle({"display":"none"});
			$('smsButtons').setStyle({"display":"block"});
		},
		//Handle the details for reseting the form elements
		resetForm: function () {
			$('smsAreaCode').value='';
			$('smsMobilePrefix').value='';
			$('smsMobileSuffix').value='';
			$('smsEmail').value='';
			$('smsEmail').value='';
			$('smsOptINFlagDefault').checked=true;
		},
		handleTermsDisplay: function (el, value) {
			if (value == "phone" || value == "both") {
				$('smsAgree').setStyle({"display":"inline"});
				$('smsAgreeLabel').setStyle({"display":"inline"});
			}
			if (value == "email" || value == "none") {
				$('smsAgree').setStyle({"display":"none"});
				$('smsAgreeLabel').setStyle({"display":"none"});
				$('smsAgree').checked = false;
			}
		},
		//Handle the automatic focus change of phone number input elements
		handleFieldBounce: function (el, value) {
			if (value.length >= 3 && !el.bounced) {
				if (el === $('smsAreaCode')) {
					$('smsMobilePrefix').focus();
				} else {
					$('smsMobileSuffix').focus();
				}
			}
		},
		//Fire omniture reporting based on type
		doAnalytics: function (type) {
			if ( !this.analyticExt[type] ) return; //stop if not a valid analytic type
			var orgPageName = s.pageName;
			var orgChannel = s.channel;
			s.pageName += this.analyticExt[type];
			s.channel = "sms";
			
			void(s_gi(s_account));
			s.tl();
			s.pageName = orgPageName;
			s.channel = orgChannel;
		},

		//Maps analytic types to s_pageName extenstions
		analyticExt: {"open":"_sms_form", "success":"_sms_form_success", "fail":"_sms_form_fail"}
	}
}

//Kickoff init on DOM load
document.observe("dom:loaded", function(){
	sms.window.initLinks();
	//sms.window.initLinks.delay(1)
});