var debug_alerts = false;
var inc = 0; //NO [include incentives]
var mki = 999;
var mdi = 999;
var Y = 0;
var sti = 0;
var mks = null;
var mds = null;
var tgl = null;
var tag = null;
var N = 1; //how many make-model selector pairs

var $CE = function(tagName, attributes, styles){ //short for create element
  var el = document.createElement(tagName);
  if (attributes) {
  	$H(attributes).each(function(pair) {
      eval("el." + pair.key + "='" + pair.value + "'");
    });
  }
  if (styles) {
    $H(styles).each(function(pair) {
      el.style[pair.key] = pair.value;
    });
	}
  return $(el);
};

Element.addMethods({
	clearChildren: function(element) {
		element = $(element);
		$A(element.childNodes).each(function(e) {
			  e.parentNode.removeChild(e);
		});
		return element;
	},

	append: function(element, tagName, attributes, styles) {
		element = $(element);
		var newEl = $CE(tagName, attributes, styles);
		element.appendChild(newEl);
		return newEl;
	},

	appendText: function(element, text) {
		element = $(element);
		var t = document.createTextNode(text);
		element.appendChild(t);
		return element;
	}
});

function initMakesModels(ref) {
	try {
		if (!ref) ref = '';
		mks = $('ajax_make_id' + ref);
		mds = $('ajax_model_id' + ref);
		tgl = $('ajax_year_toggle' + ref);
		tag = $('ajax_year_toggle_' + ref);
		tgl = clearToggle();
	} catch(err) {
		if(debug_alerts)alert('initMakesModels FAILED: '+ err)
	}
}

function getMakes() {
	var URL = '/ajax/makes_models.php';
	var myAjax = new Ajax.Request(URL, {method: 'post', parameters: '', onComplete: fillMakes});
}

function fillMakes(originalRequest, json)	{
	var feed = originalRequest.responseText.evalJSON();
	for (n=0; n<N; n++) {
		try {
			initMakesModels((n?n:''));
			mks.clearChildren();
			mko = mks.append('option');
			mko.value = 999;
			mko.innerHTML = 'Select a Make';
			if (mki == 999 || mki == 0) {
				mki = 999;//feed.dflt.make;
				mdi = 999;//feed.dflt.model;
			}
			for (var i=0; i< feed.makes.length; i++) {
				mko = mks.append('option');
				mko.value = feed.makes[i].make_id;
				mko.innerHTML = feed.makes[i].make_name+(typeof promo_makes != 'undefined' && in_array(mko.value, promo_makes)?' *':'');
				if (mko.value == mki) mko.selected = true;
			}
			mks.disabled = false;
			//mds.disabled = false;
			if (mki != 999) getModels((n?n:''));
		} catch(err) {
			if(debug_alerts)alert('fillMakes FAILED: '+ err)
		}
	}
}

function getModels(ref) {
	if (!ref) ref = '';
	var URL = '/ajax/makes_models.php';
	var myAjax = new Ajax.Request(URL, {method: 'post', parameters: 'make_id=' + mki + '&ref=' + ref, onComplete: fillModels});
}

function fillModels(originalRequest, json) {
	var feed = originalRequest.responseText.evalJSON();
	initMakesModels(feed.ref);
	try {
		mds.clearChildren();
		mdo = mds.append('option');
		mdo.value = 999;
		mdo.innerHTML = 'Select a Model';
		if (isNaN(mdi)) mdi = 999;
		for (var i=0; i< feed.models.length; i++) {
			mdo = mds.append('option');
			mdo.value = feed.models[i].model_id;
			mdo.innerHTML = feed.models[i].model_name+(typeof promo_models != 'undefined' && in_array(mdo.value, promo_models)?' *':'');
			if (mdo.value == mdi) mdo.selected = true;
		}
		if ( mki != 999 && mdi != 999 && tgl && mds.options[mds.selectedIndex].value != 999 )
			getModelYears(feed.ref);
		mks.disabled = false;
		mds.disabled = false;
		fixIE6DropDown(mds);
		turnON();
	} catch (err) {
		if(debug_alerts)alert('fillModels FAILED: '+ err);
	}
}

function getModelYears(ref) {
	if (!ref) ref = '';
	var URL = '/ajax/makes_models.php';
	var pars = 'model_years=' + mdi + '&ref=' + ref;
	var myAjax = new Ajax.Request(URL, {method: 'post', parameters: pars, onComplete: showToggle});
}

function showToggle(originalRequest, json) {
	var feed = originalRequest.responseText.evalJSON();
	initMakesModels(feed.ref);
	try {
		tgl = clearToggle();
		if (Y == 0) Y = defaultYear(feed.years);
		if (feed.years.length == 1) {
			Y = feed.years[0];
			I = tgl.append('input', {type: 'hidden'});
			I.setAttribute('name', 'year');
			I.id = '2f_year';
			I.value = Y;
		} else if (feed.years.length > 1) {
			tag.innerHTML = lbl;
			for (var i=0; i< feed.years.length; i++) {
				try {
					R = tgl.append('input', {type: 'radio'});
					R.setAttribute('name', 'year');
					R.value = feed.years[i];
					R.onclick = function() {Y = this.value; fixIE(); this.checked = true; try{local();}catch(err){if(debug_alerts)alert('local FAILED: '+ err)}};
					if (feed.years[i] == Y) R.checked = true;
					L = tgl.append('span');
					L.innerHTML = feed.years[i] +'&nbsp;'+(typeof promo_years != 'undefined' && typeof promo_models != 'undefined' && in_array(mdi, promo_models) && in_array(feed.years[i], promo_years)?'* ':'');
				} catch (err) {
					if (debug_alerts) alert('showToggle FAILED: '+ err);
				}
			}
	 	}
	 	if (Y && $('ajax_style_id_')) getStyles(0);
	} catch (err) {
		if (debug_alerts) alert('showToggle FAILED: '+ err);
	}
}

function fixIE() {
	for (var i=0; i< tgl.childNodes.length; i++) {
		tgl.childNodes[i].checked = false;
	}
}

function clearToggle() {
	try {
		tgl.clearChildren();
		tag.innerHTML = '';
		return tgl;
	} catch(err) {
		if (debug_alerts) alert('clearToggle FAILED: '+ err);
	}
}

function getStyles(ref) {
	try {turnOFF();}catch(err){if(debug_alerts)alert('getStyles FAILED: '+ err)}
	var URL = '/ajax/makes_models.php';
	var pars = (ref ? pars = ref : 'model_id=' + mdi + '&year=' + Y);
	var myAjax = new Ajax.Request(URL, {method: 'post', parameters: pars, onComplete: fillStyles});
}

function fillStyles(originalRequest, json) {
	var feed = originalRequest.responseText.evalJSON();
	try {
		sts = $('ajax_style_id_' + feed.ref);
		sts.clearChildren();
		if (feed.ref == '' && (sti < 1 || isNaN(sti))) sti = feed.sti;
		L = feed.trims.length;
		if (L == 0) {if (debug_alerts) alert('No styles')}
		if (L == 1) {
			sti = feed.trims[0].style_id;
			ST = sts.append('input', {type: 'hidden'});
			ST.setAttribute('name', '2f_style_id_' + feed.ref);
			ST.id = '2f_style_id_' + feed.ref;
			ST.value = feed.trims[0].style_id;
			T = sts.append('span');
			T.innerHTML = feed.trims[0].style;
		} else {
			ST = sts.append('select');
			if (feed.ref != '') ST.onchange = function() {sti = this.value; getColors('style_id=' + sti + '&ref=' + feed.ref);};
			else ST.onchange = function() {sti = this.value; getColors(0);};
			ST.className = select_css;
			ST.setAttribute('name', '2f_style_id_' + feed.ref);
			ST.id = '2f_style_id_' + feed.ref;
			if (feed.ref != '') {
				sto = ST.append('option');
				sto.value = 0;
				sto.innerHTML = 'Select a Style';
			}
			for (var i=0; i < L; i++) {
				sto = ST.append('option');
				sto.value = feed.trims[i].style_id;
				sto.innerHTML = feed.trims[i].style;
				if (sto.value == sti) sto.selected = true;
			}
		  fixIE6DropDown(ST);
		}
		if (feed.ref != '') {
			if (sti == 0) resetColors(feed.ref);
			else getColors('style_id=' + sti + '&ref=' + feed.ref);
		} else getColors(0);
	} catch(err) {
		if(debug_alerts)alert('fillStyles FAILED: ' + err )
	}
}

function getColors(ref) {
	if (ref && sti == 0) {
		ref = ref.replace('style_id=' + sti + '&ref=','');
		resetColors(ref);
	} else {
		var URL = '/ajax/makes_models.php';
		var pars = (ref ? pars = ref : 'style_id=' + sti);
		if (inc && (mvc.zipcode.value || $('2f_zipcode').value)) pars += '&zip=' + (mvc.zipcode.value ? mvc.zipcode.value : $('2f_zipcode').value);
		var myAjax = new Ajax.Request(URL, {method: 'post', parameters: pars, onComplete: fillColors});
	}
}

function resetColors(ref) {
	try {
		cls = $('ajax_colors_' + ref);
		cls.clearChildren();
		C = cls.append('select');
		C.setAttribute('name', '2f_colors_' + ref);
		C.id = '2f_colors_' + ref;
		C.onchange = function() {try{color_local();}catch(err){if(debug_alerts)alert('color_local FAILED: '+ err)}};
		C.className = select_css;
		clo = C.append('option');
		clo.value = 0;
		clo.innerHTML = 'Select a Color';
		turnON();
	} catch(err) {
		if(debug_alerts)alert('resetColors FAILED: '+ err)
	}
}

function fillColors(originalRequest, json) {
	var feed = originalRequest.responseText.evalJSON();
	try {
		cls = $('ajax_colors_' + feed.ref);
		cls.clearChildren();
		L = feed.colors.length;
		if (L == 0) {
			C = cls.append('input', {type: 'hidden'});
			C.setAttribute('name', '2f_colors_' + feed.ref);
			C.id = '2f_colors_' + feed.ref;
			C.value = 'N/A';
			T = cls.append('span');
			T.innerHTML = 'No detailed colors available.';
		} else if (L == 1) {
			C = cls.append('input', {type: 'hidden'});
			C.setAttribute('name', '2f_colors_' + feed.ref);
			C.id = '2f_colors_' + feed.ref;
			C.value = feed.colors[0].exterior + '|' + feed.colors[0].interior;
			T = cls.append('span');
			T.innerHTML = 'Exterior: ' + feed.colors[0].exterior + ' - Interior: ' + feed.colors[0].interior;
		} else {
			C = cls.append('select');
			C.setAttribute('name', '2f_colors_' + feed.ref);
			C.id = '2f_colors_' + feed.ref;
			C.onchange = function() {color_local();};
			C.className = select_css;
			if (feed.ref != '') {
				clo = C.append('option');
				clo.value = 0;
				clo.innerHTML = 'Select Color';
			}
			clo = C.append('option');
			clo.value = 'No Preferences';
			clo.innerHTML = 'Undecided';
			for (var i=0; i < L; i++) {
				clo = C.append('option');
				clo.value = feed.colors[i].exterior + '|' + feed.colors[i].interior;
				clo.innerHTML = 'Exterior: ' + feed.colors[i].exterior + ' - Interior: ' + feed.colors[i].interior;
				if (clo.value == clr) clo.selected = true;
			}
		}
		showVehicleData(feed.msrp, feed.inpr, feed.img, feed.incentives, feed.ref);
		turnON();
	} catch (err) {
		if (debug_alerts) alert('fillColors FAILED: ' + err);
	}
}

function defaultYear(available) {
/*
	var dt = new Date();
	var df = ((dt.getMonth()>7 && dt.getDate()>7) ? dt.getFullYear()+1 : dt.getFullYear());alert(dt.getDate()+'|'+df)
	for (var i = 0; i < available.length; i++) {
		if (available[i] == df) return available[i];
	}
*/
    var indx = available.length - 1;
	return available[indx];
}

function fixIE6DropDown(ie_select) {
	ie_select = $(ie_select);

  // THIS FUNCTION IS ONLY CONCERNED WITH INTERNET EXPLORER NON-MULTIPLE SELECT NODES THAT HAVE A SPECIFIC WIDTH DEFINED
	if(!ie_select.attachEvent || navigator.userAgent.indexOf("Opera") > -1 || ie_select.multiple || ie_select.currentStyle.width == "auto" || ie_select.offsetWidth == 0) { return; }

	var body = document.getElementsByTagName("body").item(0);

  // get the size of the dropdown with autsize using a clone
	var clone = ie_select.cloneNode(true);
	clone.style.position = "absolute";
	clone.style.visibility = "hidden";
	clone.style.width = "auto";
	body.appendChild(clone);

	ie_select._initialOffsetWidth = ie_select.offsetWidth;
	ie_select._initialOffsetHeight = ie_select.offsetHeight;
	ie_select._autoWidth = clone.offsetWidth;
	body.removeChild(clone);

	ie_select.style.position = "absolute";
	ie_select.style.width = ie_select._initialOffsetWidth + "px";

	var standin = document.createElement("div");
	standin._isIeDropDownContainer = true;
	standin.style.position = "relative";
	standin.style.width = ie_select._initialOffsetWidth + "px";
	standin.style.height = ie_select._initialOffsetHeight + "px";
	standin.style.marginBottom = "-4";
	if (ie_select.nextSibling) {
	  ie_select.parentNode.insertBefore(standin,ie_select.nextSibling);
	} else {
	  ie_select.parentNode.appendChild(standin);
	}	
	standin.appendChild(ie_select);

	if (ie_select._autoWidth > ie_select._initialOffsetWidth) {
		var expand = function() {
			event.srcElement.parentNode.style.zIndex = 1;
			event.srcElement.style.width = "auto";
			if (event.srcElement.offsetWidth > event.srcElement._initialOffsetWidth) {
				event.srcElement.style.width = "auto";
			} else {
				event.srcElement.style.width = event.srcElement._initialOffsetWidth + "px";
			}
		};
		var contract = function() {
			event.srcElement.parentNode.style.zIndex = 0;
			event.srcElement.style.width = event.srcElement._initialOffsetWidth + "px";
		};
		ie_select.attachEvent("onactivate", expand);
		ie_select.attachEvent("ondeactivate", contract);
	}
}
function in_array(needle, haystack){
        for (var i=0; i < haystack.length; i++) {
                if ( haystack[i] == needle)  {return true;}
        }
        return false;
}
