var proxyURL="/reachhigher/configurator/mks/preConfigProxy.asp"
var preOrderURL="/reachhigher/configurator/mks/preOrder.asp"
var lightboxURL="/reachhigher/configurator/mks/optionLightwindow.asp"
var pages=Array("models","colors","packages","options","summary");
var page="models";
var interiorOpen=false;
var ajaxRunning=false;
var firstTimeLoaded=true;
var resolvingConflict=false;
var currentUpdateId="";
var currentUpdateValue="";

//notables
var notableDescriptions = new Array();
notableDescriptions["PN3GM"]="This exterior color requires adding a package. We've pre-selected the Technology package for you.  You can change this selection and choose either the Navigation or Ultimate packages on the options screen. Accept addition of White Chocolate Tri-Coat Clearcoat now?";
notableDescriptions["D2VAF"]="19-inch machined and painted cast aluminum wheels requires either Technology or Navigation Packages.  The Technology package has been pre-selected for you.  You can change this selection and choose the Navigation Package on the options screen.  Note: This wheel is not available with the Ultimate Package.  Add these 19-inch wheels?";
notableDescriptions["D2FAU"]="The 20-inch polished cast aluminum wheels requires a package.  We've pre-selected the Technology package for you. You can change this selection and choose either Navigation or Ultimate packages on the options screen.  Add these 20-inch wheels?";
notableDescriptions["IDAAR"]="The THX&reg;-II Certified Premium Sound System requires adding the Navigation Package. Would you still like to add this sound system?";
notableDescriptions["IBAED"]="The voice-activated DVD navigation system requires the Navigation Package. Would you like to add this system?";
notableDescriptions["YP6AB"]="Ultimate package includes 19-inch premium painted cast-aluminum wheels. You can change these wheels by choosing the 20-inch polished cast-aluminum wheels.  Changes can be made on the options page.   Accept now?";
notableDescriptions["BBDAC"]="Interior wood package requires adding Ultimate or Navigation Packages. We've pre-selected the Navigation package for you.  You can change this selection and choose the Ultimate package on the options screen.  Note: Interior aluminum package and Interior wood package are not available together.  Add the Interior Wood Package now?";
notableDescriptions["BB6A5"]="Interior aluminum package requires a package.  We've preselected the Technology package for you.  You can change this selection and choose the Ultimate package or Navigation package on the options screen.  Note: Interior aluminum package and Interior wood package are not available together.  Interior aluminum package not avaialable with Camel interior trim.  Add the Interior Aluminum Package now?";

var updatingDivName = 'updatingDiv'; // div that is to follow the mouse
var offX = 15;          // X offset from mouse position
var offY = 0;          // Y offset from mouse position

//default vehicle values
var exteriorColorId="";
var interiorColorId="";
var drivetrain="";

var thisPreloader=Preloader;

var mksConfigState,xmlResponse;

window.onload=function(){
	proxyComm();
	preLoader();
	changePage("models");
	//document.onmousemove = follow;
}

function doFooter(){
	var h=$("mainContainer").offsetHeight+400;
	$("footer").style.top=h;
	$("footer").style.display="block";
}

function cancelUpdate(){
	//set cookie back
	document.cookie = "mksConfigState="+mksConfigState+";path=/;";
	$('lightboxOuter').style.display="none";
	$('conflictResolutionContainer').style.display="none";
	resolvingConflict=false;
}

function continueUpdate(){
	//do update
	updateData(xmlResponse);
	$('lightboxOuter').style.display="none";
	$('conflictResolutionContainer').style.display="none";
}

function updateData(xml){
	xmlResponse=xml;
	var x=getXmlTopNode(xml);

	ajaxRunning=false;
	//toggleUpdatingDiv(false);
	
	//prices
	fwdPrice=parseFloat(x.getElementsByTagName("FWDMSRP")[0].firstChild.nodeValue).toFixed(0);
	awdPrice=parseFloat(x.getElementsByTagName("AWDMSRP")[0].firstChild.nodeValue).toFixed(0);
	MSRP=parseInt(x.getElementsByTagName(x.getElementsByTagName("Drivetrain")[0].firstChild.nodeValue+"MSRP")[0].firstChild.nodeValue);

	deliveryPrice=parseInt(x.getElementsByTagName("DeliveryPrice")[0].firstChild.nodeValue);
	optionsTotal=parseInt(x.getElementsByTagName("OptionsTotal")[0].firstChild.nodeValue);
	totalPrice=parseFloat(MSRP+deliveryPrice+optionsTotal).toFixed(0);

	//ids
	exteriorColorId=x.getElementsByTagName("ExteriorColorId")[0].firstChild.nodeValue;
	interiorColorId=x.getElementsByTagName("InteriorColorId")[0].firstChild.nodeValue;
	drivetrain=x.getElementsByTagName("Drivetrain")[0].firstChild.nodeValue;

	if (parseFloat(x.getElementsByTagName("ExteriorColorPrice")[0].firstChild.nodeValue).toFixed(0)>0){
		exteriorColorPrice=parseFloat(x.getElementsByTagName("ExteriorColorPrice")[0].firstChild.nodeValue).toFixed(0);
	}else{
		exteriorColorPrice=0;
	}
	
	//conflict resolution
	eval("conflictResolutionArray=Array"+x.getElementsByTagName("conflictResolution")[0].firstChild.nodeValue);
	if (resolvingConflict==false && conflictResolutionArray[0]!="" && currentUpdateId!="YBCKH" && currentUpdateId!="YBCKJ"){
		resolvingConflict=true;
		var notableText="N/A";
		if (conflictResolutionArray[0]=="") conflictResolutionArray[0]="N/A";
		if (conflictResolutionArray[1]=="") conflictResolutionArray[1]="N/A";
		if (notableDescriptions[currentUpdateId]!=undefined && currentUpdateValue=="true") notableText=notableDescriptions[currentUpdateId];
		$("conflictChangesContainer").innerHTML="<div class='notableTitle'>PRICE CHANGE</div>From "+$("summaryTotal").innerHTML+" to $"+monetize((parseFloat(totalPrice)+parseFloat(exteriorColorPrice)).toString())+"<br/><br/><div class='notableTitle'>SELECTION ADDITIONS</div>"+conflictResolutionArray[0]+"<br/><div class='notableTitle'>SELECTION REMOVALS</div>"+conflictResolutionArray[1]+"<br/><div class='notableTitle'>Please Note</div>"+notableText+"</div>";
		$('lightboxOuter').style.display="block";
		$('conflictResolutionContainer').style.top=100+document.body.scrollTop;
		$('conflictResolutionContainer').style.display="block";
		return;
	}
	resolvingConflict=false;
	
	//configstate
	mksConfigState=getCookie("mksConfigState");
	
	//models page
	$("modelsPageTopFiveFeaturesContainer").innerHTML=x.getElementsByTagName("topFiveFeatures")[0].firstChild.nodeValue;
	if (x.getElementsByTagName("Drivetrain")[0].firstChild.nodeValue=="FWD"){
		$("modelsPageDrivetrainContainer").innerHTML="<img src='/reachhigher/configurator/mks/assets/box_selected.jpg' width=12 height=12 border=0/><div style='height:30;'></div><a href='javascript:updateFeature(\"\",\"YBCKJ\",\"true\");' onmouseover='roll(this);' onmouseout='roll(this);'><img src='/reachhigher/configurator/mks/assets/box_off.jpg' width=12 height=12 border=0/></a>";
	}else{
		$("modelsPageDrivetrainContainer").innerHTML="<a href='javascript:updateFeature(\"\",\"YBCKH\",\"true\");' onmouseover='roll(this);' onmouseout='roll(this);'><img src='/reachhigher/configurator/mks/assets/box_off.jpg' width=12 height=12 border=0/></a><div style='height:30;'></div><img src='/reachhigher/configurator/mks/assets/box_selected.jpg' width=12 height=12 />";
	}
	$("modelsPagePriceContainer").innerHTML="<span>Base MSRP $"+monetize(fwdPrice)+"</span><div style='height:30;'></div><span>Base MSRP $"+monetize(awdPrice)+"</span>";

	//vehicle images
	$("slidingVehicleIntImage").src="/reachhigher/configurator/mks/assets/int/"+x.getElementsByTagName("InteriorColorId")[0].firstChild.nodeValue+".jpg";
	$("slidingVehicleExtImage").src="/reachhigher/configurator/mks/assets/ext/"+x.getElementsByTagName("ExteriorColorId")[0].firstChild.nodeValue+"_"+x.getElementsByTagName("WheelId")[0].firstChild.nodeValue+".jpg";
	$("summaryVehicleImage").src="/reachhigher/configurator/mks/assets/ext/"+x.getElementsByTagName("ExteriorColorId")[0].firstChild.nodeValue+"_"+x.getElementsByTagName("WheelId")[0].firstChild.nodeValue+".jpg";
	
	//colors page
	$("exteriorColorNameContainer").innerHTML=x.getElementsByTagName("ExteriorColor")[0].firstChild.nodeValue;
	if (parseFloat(x.getElementsByTagName("ExteriorColorPrice")[0].firstChild.nodeValue).toFixed(0)>0){
		$("exteriorColorPriceContainer").innerHTML="$"+parseFloat(x.getElementsByTagName("ExteriorColorPrice")[0].firstChild.nodeValue).toFixed(2);
	}else{
		$("exteriorColorPriceContainer").innerHTML="";
	}
	
	$("exteriorColorChipsContainer").innerHTML=x.getElementsByTagName("exteriorColors")[0].firstChild.nodeValue;
	$("interiorColorNameContainer").innerHTML=x.getElementsByTagName("InteriorColor")[0].firstChild.nodeValue;
	$("interiorColorChipsContainer").innerHTML=x.getElementsByTagName("interiorColors")[0].firstChild.nodeValue;
	$("wheelNameContainer").innerHTML=x.getElementsByTagName("Wheel")[0].firstChild.nodeValue;
	if (parseFloat(x.getElementsByTagName("WheelPrice")[0].firstChild.nodeValue).toFixed(0)>0){
		$("wheelPriceContainer").innerHTML="$"+parseFloat(x.getElementsByTagName("WheelPrice")[0].firstChild.nodeValue).toFixed(2);
	}else{
		$("wheelPriceContainer").innerHTML="";
	}
	$("wheelChipsContainer").innerHTML=x.getElementsByTagName("wheels")[0].firstChild.nodeValue;
	
	//options page
	$("optionsContainer").innerHTML=x.getElementsByTagName("options")[0].firstChild.nodeValue;
	
	//packages page
	$("packagesContainer").innerHTML=x.getElementsByTagName("packages")[0].firstChild.nodeValue;
	
	//your selection box
	$("yourSelectionDrivetrain").innerHTML=x.getElementsByTagName("Drivetrain")[0].firstChild.nodeValue;
	$("yourSelectionMSRP").innerHTML="$"+monetize(MSRP.toString());
	$("yourSelectionColorsTotal").innerHTML="$"+monetize(exteriorColorPrice.toString());
	$("yourSelectionExterior").innerHTML=x.getElementsByTagName("ExteriorColor")[0].firstChild.nodeValue.split("(")[0];
	$("yourSelectionInterior").innerHTML=x.getElementsByTagName("InteriorColor")[0].firstChild.nodeValue;
	$("yourSelectionOptionsTotal").innerHTML="$"+monetize(optionsTotal.toString());
	$("yourSelectionDeliveryPrice").innerHTML="$"+monetize(deliveryPrice.toString());
	$("yourSelectionTotal").innerHTML="$"+monetize((parseFloat(totalPrice)+parseFloat(exteriorColorPrice)).toString());
	
	//summary page
	if (x.getElementsByTagName("Drivetrain")[0].firstChild.nodeValue=="FWD"){
		$("summaryBlock").style.backgroundImage="url(/reachhigher/configurator/mks/assets/summary_block_fwd.jpg)";
		$("summaryTitle").innerHTML="<img src='/reachhigher/configurator/mks/assets/summary_title_fwd.gif' width=338 height=12 />";
	}else{
		$("summaryBlock").style.backgroundImage="url(/reachhigher/configurator/mks/assets/summary_block_awd.jpg)";
		$("summaryTitle").innerHTML="<img src='/reachhigher/configurator/mks/assets/summary_title_awd.gif' width=338 height=12 />";
	}
	$("summaryBaseMSRPContainer").innerHTML="$"+monetize(MSRP.toString());
	$("summaryExteriorColorContainer").innerHTML="Exterior Color:&nbsp;&nbsp;&nbsp;"+x.getElementsByTagName("ExteriorColor")[0].firstChild.nodeValue.split("(")[0];
	$("summaryExteriorColorPrice").innerHTML="$"+monetize(exteriorColorPrice.toString());
	$("summaryInteriorColorContainer").innerHTML="Interior Color:&nbsp;&nbsp;&nbsp;&nbsp;"+x.getElementsByTagName("InteriorColor")[0].firstChild.nodeValue;
	$("summaryOptionsContainer").innerHTML=x.getElementsByTagName("optionsSummary")[0].firstChild.nodeValue;
	$("summaryTotal").innerHTML="$"+monetize((parseFloat(totalPrice)+parseFloat(exteriorColorPrice)).toString());
	
	doFooter();
	$('lightboxOuter').style.display="none";
	$('lightboxContainer').style.display="none";
}

function updateFeature(metric,id,value){
	if (ajaxRunning) return;
	//mContentActivity(metric+":"+id+"="+value);
	currentUpdateId=id;	
	currentUpdateValue=value;
	ajaxRunning=true;
	toggleUpdatingDiv(true);
	ajax=new Ajax.Request(proxyURL+"?action=update&id="+id+"&value="+value+"&nocache="+ new Date().getTime(), {
		method: 'get',
		onSuccess: function(transport) {
			ajaxRunning=false;
			updateData(transport.responseText);
		},
		onFailure: function(transport){
			ajaxRunning=false;
		//faliureCommMessage(transport,1);
		}
	});
}

function getXmlTopNode(xml){
	// code for IE
	if (window.ActiveXObject){
		var doc=new ActiveXObject("Microsoft.XMLDOM");
		doc.async="false";
		doc.loadXML(xml);
	}else{
		// code for Mozilla, Firefox, Opera, etc.
		var parser=new DOMParser();
		var doc=parser.parseFromString(xml,"text/xml");
	}
	return doc.documentElement;
}

function proxyComm(){
	new Ajax.Request(proxyURL+"?nocache="+ new Date().getTime(), {
		method: 'get',
		onSuccess: function(transport) {
			updateData(transport.responseText)
		},
		onFailure: function(transport){
		//alert("fail")
		//faliureCommMessage(transport,0)
		}
	});
}

function changeMenu(pageName){
	htmlMenu=""

	for (i=0;i<pages.length;i++){
		if (pageName==pages[i]){
			htmlMenu+='<img src="/reachhigher/configurator/mks/assets/nav/'+pages[i]+'_selected.jpg" style="margin-right:4;" />';
		}else{
			htmlMenu+='<a href="javascript:changePage(\''+pages[i]+'\');" onMouseOver="roll(this)" onMouseOut="roll(this)"><img src="/reachhigher/configurator/mks/assets/nav/'+pages[i]+'_off.jpg" style="margin-right:4;" border=0 /></a>';
		}
	}
	$("menuContainer").innerHTML=htmlMenu;
}

function changeVehicleImage(pageName){
	if (pageName=="models"){
		$("slidingVehicleImageContainer").style.display="none";
		$("summaryVehicleImageContainer").style.display="none";
		$("staticVehicleImageContainer").style.display="block";
	}else if (pageName=="summary"){
		$("staticVehicleImageContainer").style.display="none";
		$("slidingVehicleImageContainer").style.display="none";
		$("summaryVehicleImageContainer").style.display="block";
	}else{
		$("staticVehicleImageContainer").style.display="none";
		$("summaryVehicleImageContainer").style.display="none";
		$("slidingVehicleImageContainer").style.display="block";
	}
}

function changePageBlock(pageName){
	for (i=0;i<pages.length;i++){
		$(pages[i]+"Block").style.display="none";
	}
	
	$(pageName+"Block").style.display="block";
	
}

function changeLeftBlockContainer(pageName){
	if (pageName!="summary"){
		$("preOrderContainer").style.display="none";
		$("yourSelectionsContainer").style.display="block";
	}else{
		$("yourSelectionsContainer").style.display="none";
		$("preOrderContainer").style.display="block";
	}
}

function changePage(pageName){
	changeMenu(pageName);
	changeVehicleImage(pageName);
	changePageBlock(pageName);
	changeLeftBlockContainer(pageName);
	
	if (firstTimeLoaded){
	
		sendEvent('models', "event6");
	}
	
	if (!firstTimeLoaded && pageName!="summary"){
		//metricsFunction('page', pageName);
		sendEvent(pageName, "event6");
	}
	
	if (pageName=="summary"){
		sendConfigMetrics();
		oFloodLight.fireFloodlight("bps", "mks")
	} else {
	    //oFloodLight.fireFloodlight("bpi", "mks")
	}
	firstTimeLoaded=false;
}

function expandExteriorImage(){
	$('expandButtonContainer').style.display="none";
	Effect.MoveBy('vehicleImageIntContainer',0,-220);
	Effect.MoveBy('vehicleImageExtContainer',0,-589,{afterFinish: function(){$('collapseButtonContainer').style.display="block"}});
	interiorOpen=true;
}

function collapseExteriorImage(){
	$('collapseButtonContainer').style.display="none";
	Effect.MoveBy('vehicleImageIntContainer',0,220);
	Effect.MoveBy('vehicleImageExtContainer',0,589,{afterFinish: function(){$('expandButtonContainer').style.display="block";}});
	interiorOpen=false;
}

function slidePreOrderUp(){
	Effect.MoveBy('preOrderInnerContainer',-695,0);
	    s_eVar18=''
	     s_eVar19=''
	     s_eVar20=''
	     s_eVar21=''
	     s_eVar23=''
	     s_eVar24=''
	     s_eVar25=''
	     s_eVar26=''
	     s_eVar28 = "";
     	 s_prop18="";
	     s_prop5="ln: reachhigher: preodermks";
	     mContentView('signup');
	     //metricsFunction('page', 'signup');
}

function slidePreOrderDown(){
	Effect.MoveBy('preOrderInnerContainer',695,0);
}

function monetize( strValue ) {
	var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})');

	//check for match to search criteria
	while(objRegExp.test(strValue)) {
		//replace original string with first group match,
		//a comma, then second group match
		strValue = strValue.replace(objRegExp, '$1,$2');
	}
	return strValue;
}

function getCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function loadOption(id){
	//mContentActivity("model feature,options");
	new Ajax.Request(lightboxURL+"?id="+id, {
		method: 'get',
		onSuccess: function(transport) {
			showOption(transport.responseText);
		}
	});	
}
function showOption(html){
	$('lightboxOuter').style.display="block";
	$('lightboxContainer').style.top=100+document.body.scrollTop;
	$('lightboxContainer').innerHTML=html;
	Effect.Grow('lightboxContainer');
}
function closeOption(){
	$('lightboxOuter').style.display="none";
	$('lightboxContainer').innerHTML="";
	$('lightboxContainer').style.display="none";
}

function toggleUpdatingDiv(open){
	if (open){
		$('updatingDiv').style.display="block";
	}else{
		$('updatingDiv').style.display="none";
	}
}

function validatePhone(obj,e){
	var keynum;
	var keychar;
	var numcheck;
	if(window.event){
		keynum = e.keyCode;
	}else if(e.which){
		keynum = e.which;
	}
	
	//allow delete,left,right keys
	if (keynum==8 || keynum==37 || keynum==39) return true;
	
	//10 char max
	if (obj.value.length>=10) return false;
	
	keychar = String.fromCharCode(keynum);
	numcheck = /\d/;
	
	return numcheck.test(keychar);
}

function submitPreOrder(){
	var frm=document.forms.preOrder;
	var validated=true;
	var getString=""
	for (i=0;i<frm.length-2;i++){
		if (frm[i].value==""){
			$(frm[i].name+"Block").style.color="#b30c23";
			validated=false;
		}else{
			getString=getString+frm[i].name+"="+frm[i].value+"&"
			$(frm[i].name+"Block").style.color="#FFFFFF";
		}
	}
	if (!validateEmail(frm.emailAddress.value)){
		$("emailAddressBlock").style.color="#b30c23";
		validated=false;
	}else{
		$("emailAddressBlock").style.color="#FFFFFF";
	}
	if (!validated){
	    //metricsFunction('page', 'signup:error');
		sendEvent('signup:error', "event6");
		
		$("requiredFields").style.color="#b30c23";
	}else{
		//hide buttons
		$("preOrderCancelButton").style.display="none";
		$("preOrderSubmitButton").style.display="none";
		
		
		var options=getElementsByClassName(document,"optionNames","span").join(";")+getElementsByClassName(document,"packages","span").join(";");
		
		//submit
		if (frm.signup.checked){
			getString=getString+"signup=true&"
		}else{
			getString=getString+"signup=false&"
		}
		getString=getString+"questionsComments="+frm.questionsComments.value+"&";
		getString=getString+"exteriorColorId="+exteriorColorId+"&interiorColorId="+interiorColorId+"&";
		getString=getString+"exteriorColor="+$("yourSelectionExterior").innerHTML+"&interiorColor="+$("yourSelectionInterior").innerHTML+"&";
		getString=getString+"trim="+drivetrain+"&";
		getString=getString+"options="+options+"&";
		ajax=new Ajax.Request(preOrderURL+"?"+getString+"nocache="+ new Date().getTime(), {
			method: 'get',
			onSuccess: function(transport) {
				sendSignUpMetrics(frm.signup.checked);
				oFloodLight.fireFloodlight("pro", "mks");
				//metricsFunction('page', 'signup:thankyou');
				//sendEvent("event10");

				//show close button
				$("preOrderCloseButton").style.display="block";
				//show feedback
				$("preOrderFormContainer").innerHTML=$("preOrderFeedback").innerHTML;
			},
			onFailure: function(transport){
				//show buttons
				$("preOrderCancelButton").style.display="block";
				$("preOrderSubmitButton").style.display="block";
			}
		});
	}
}

//start metrics
function sendEvent(pageName, event){
     s_eVar18=''
     s_eVar19=''
     s_eVar20=''
     s_eVar21=''
     s_eVar23=''
     s_eVar24=''
     s_eVar25=''
     s_eVar26=''
     s_eVar28 = "";
     s_prop18="";
     s_events = event;  
     s_pageName = 'ln:reachhigher:configurator: mks:'+pageName
     sendAnalyticsEvent('');
}

function sendConfigMetrics(){
	s_prop18="";
	s_eVar28="";
	
	s_pageName='ln:reachhigher:configurator: mks:summary';
	s_events = 'event2';
	
	var options=""; 
	var i=0;
	var options=getElementsByClassName(document,"options","span").join(";");
	var packages=getElementsByClassName(document,"packages","span").join(";");
	
	price=$("summaryTotal").innerHTML.replace("$","");
	price=price.replace(",","");
	s_eVar12="2009";
	s_eVar16="mks";
	s_eVar19=exteriorColorId;
	s_eVar20=interiorColorId;
	s_eVar21=options.toLowerCase();
	s_eVar23=packages.toLowerCase();
	s_eVar24=drivetrain;
	s_eVar25=price;
	s_eVar26=''
	
	sendAnalyticsEvent('');
     
}

function sendSignUpMetrics(strOptIn){
	s_prop18="vrfq: bp: as-built";
	s_prop5 = "ln:reachhigher:submit";
	s_eVar28="vrfq: bp: as-built";

	//if opt in box is checked then set this
	if (strOptIn){
	s_prop20="email opt-in full";}
	else{
	s_prop20=""}
	
	//else leave it blank
	
	s_pageName='ln:reachhigher:configurator:mks:signup:thankyou';
	s_events = 'event10, event3, event13';
	
	var options=""; 
	var i=0;
	var options=getElementsByClassName(document,"options","span").join(";");
	var packages=getElementsByClassName(document,"packages","span").join(";");
	
	price=$("summaryTotal").innerHTML.replace("$","");
	price=price.replace(",","");
	s_eVar12="2009";
	s_eVar16="mks";
	s_eVar19=exteriorColorId;
	s_eVar20=interiorColorId;
	s_eVar21=options.toLowerCase();
	s_eVar23=packages.toLowerCase();
	s_eVar24=drivetrain;
	s_eVar25=price;
	s_eVar26=''
	
	sendAnalyticsEvent('');
     
}


//end metrics

function getElementsByClassName(obj,className,tagName) {
	var aElm=obj.getElementsByTagName(tagName);
	var a=Array();
	var pos=0;
	for(var i=0; i<aElm.length; i++) {
		if(aElm[i].className==className) {
			a[pos]=aElm[i].innerHTML;
			pos++;
		}
	}
	return a;
}

function validateEmail(f){
	apos=f.indexOf("@")
	dotpos=f.lastIndexOf(".")
	if (apos<1||dotpos-apos<2) {
		return false;
	}else{
		return true;
	}
}

function roll(ele) {
	var img = ele.getElementsByTagName("img")[0];
	var src = img.src;
	img.src = (/_on/.test(src)) ? src.replace('_on', '_off') : src.replace('_off', '_on');
	if (ele.style.filter){
		ele.style.filter = (/_on/.test(ele.style.filter)) ? ele.style.filter.replace('_on', '_off') : ele.style.filter.replace('_off', '_on');
	}
}

function mouseX(evt) {if (!evt) evt = window.event; if (evt.pageX) return evt.pageX; else if (evt.clientX)return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft); else return 0;}
function mouseY(evt) {if (!evt) evt = window.event; if (evt.pageY) return evt.pageY; else if (evt.clientY)return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); else return 0;}

function follow(evt) {if (document.getElementById) {var obj = document.getElementById(updatingDivName).style; obj.visibility = 'visible';obj.left = (parseInt(mouseX(evt))+offX) + 'px';obj.top = (parseInt(mouseY(evt))+offY) + 'px';}}



function preLoader(){
	//pre load models
	$('imagePreloader').src="/reachhigher/configurator/mks/assets/colors.gif";
	thisPreloader=Preloader;
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/19-Bright-Machined-Painted.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/19-Premium-Painted-Cast-Al.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/20-Polished-Cast-Aluminum.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Adaptive-Cruise-Control.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/AdvanceTrac.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Dual-Panel-Moonroof-with-Po.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Engine3.7L.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/HID-Headlamps.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/19-Bright-Machined-Painted.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/19-Premium-Painted-Cast-Al.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/20-Polished-Cast-Aluminum.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Adaptive-Cruise-Control.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/AdvanceTrac.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Dual-Panel-Moonroof-with-Po.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Engine3.7L.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/HID-Headlamps.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/InteriorAluminumAppliqu.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/InteriorPremiumWoodDoor.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Keyless-Entry-Keypad.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Lincoln-split-waterfall-chr.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Luxury-tuned-Four-Wheel-Ind.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/NavPackage.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Standard-Safety-Features.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/SYNC.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Technology-Package.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/THX-Audio.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/THXIICertified-Premium-Soun.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/TransmissionSixSpeed.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/UltimatePackage.jpg');
	thisPreloader.add('/reachhigher/configurator/mks/assets/details/Voice-Activated-DVD-based-N.jpg');
	var finishFunc = function(){
	    //pre load colors
	    $('imagePreloader').src="/reachhigher/configurator/mks/assets/colors.gif";
	   	}
	thisPreloader.onFinish(finishFunc);
  	thisPreloader.load();
}


var Preloader = {
  callbacks: [],
  images: [],
  loadedImages: [],
  imagesLoaded: 0,
  
  add: function(image){
    if (typeof image == 'string') this.images.push(image);
    if (typeof image == 'array' || typeof image == 'object'){
      for (var i=0; i< image.length; i++){
        this.images.push(image[i]);
      }
    }
  },
  onFinish: function(func){
    if (typeof func == 'function') this.callbacks.push(func);
    if (typeof func == 'array' || typeof func == 'object'){
      for (var i=0; i< func.length; i++){
        this.callbacks.push(func[i]);
      }
    }
  },
  load: function(){
    for(var i=0; i<this.images.length; i++){
      this.loadedImages[i] = new Image();
      this.loadedImages[i].onload = function(){ Preloader.checkFinished.apply(Preloader) }
      this.loadedImages[i].src = this.images[i];
    }
  },
  
  checkFinished: function(){
    this.imagesLoaded++;
    if (this.imagesLoaded == this.images.length) this.fireFinish();
  },
  fireFinish: function(){
    for (var i=0; i<this.callbacks.length; i++){
      this.callbacks[i]();
    }
    this.images = [];
    this.loadedImages = [];
    this.imagesLoaded = 0;
    this.callbacks = [];
  }
}