(function ($) {
	var co = {
		init: function () {
			//vehicle type tabs
			$('.vehicleTypeTabs li').mousedown(this.trackClick).click(this.changeType);
			//model tabs
			$('.modelTabs li').mousedown(this.trackClick).click(this.changeModel);
			//year dropdown
			$('select[id*="_yearDP"]').mousedown(this.trackClick).change(this.changeYear);
			//sub-model dropdown
			$('select[id*="_subModelDP"]').change(this.changeSub);
			//toggle disclaimer
			$('.disclaimerLink').click(this.disclaimer);
			//promo tile functionality
			$('.promo, .promoActive').mouseover(this.promoTiles);
			
			//re-applies values in case of page refresh
			$('select[id*="_yearDP"], select[id*="_subModelDP"]').trigger('change');
			
			//checks for deep linking url
			this.deepLink();
		},
		changeType: function (elem) {
			// This method is called through a jQuery event handler from inside the init method.
			// Because of that, the scope of this method is the jQuery object and NOT the co object.
			var e;
			elem.id ? e = elem : e = this;
			if (!e) return false;
			
			var typeTabs = e.parentNode.children,
				typeId = e.id.split('_'),
				activeType = typeId[0],
				activeContent = document.getElementById(activeType + '_vehicleTypeContent'),
				contentDivs = activeContent.parentNode.children;
			
			for (var i = 0, len = typeTabs.length; len > i; i++) {
				typeTabs[i].className = 'vehicleTypeTab';
			}
			
			e.className = 'vehicleTypeTabActive';
			
			for (var i = 0, len = contentDivs.length; len > i; i++) {
				if (contentDivs[i].className === 'vehicleTypeContentActive') {
					contentDivs[i].className = 'vehicleTypeContent';
				}
			}
			
			activeContent.className = 'vehicleTypeContentActive';
		},
		changeModel: function (elem) {
			// This method is called through a jQuery event handler from inside the init method.
			// Because of that, the scope of this method is the jQuery object and NOT the co object.			
			var e;
			elem.id ? e = elem : e = this;
			if (!e) return false;
			
			var typeId = e.parentNode.parentNode.id.split('_'),
				vehicleType = typeId[0],
				model = ($.trim($(e).text())).replace(' ', '-'),
				modelTabs = e.parentNode.children,
				typeDivs = document.getElementById(vehicleType + '_vehicleTypeContent').children,
				activeModel = document.getElementById(vehicleType + '_' + model + '_modelContent');
			
			for (var i = 0, len = modelTabs.length; len > i; i++) {
				if (modelTabs[i].className === 'modelTabActive') {
					modelTabs[i].className = 'modelTab';
				}
			}
			
			e.className = 'modelTabActive';
			
			for (var i = 0, len = typeDivs.length; len > i; i++) {
				if (typeDivs[i].className === 'modelContentActive') {
					typeDivs[i].className = 'modelContent';
				}
			}
			
			activeModel.className = 'modelContentActive';
			
			if (co.trackChange == true) {
				// alert('co.trackChange flag: ' + co.trackChange + '\n[Model change WILL be tracked in Omniture]');
				co.trackTabs(model);
				co.trackChange = false;  // Returns flag to false to prevent click tracking during page refresh.
			}
		},
		changeYear: function (elem) {
			// This method is called through a jQuery event handler from inside the init method.
			// Because of that, the scope of this method is the jQuery object and NOT the co object.
			var e;
			elem.id ? e = elem : e = this;
			if (!e) return false;
			
			var subCheck,
				subModelValue = false, 
				id = e.id.split('_'),
				model = $.trim(id[0]),
				year = $.trim(e.options[e.selectedIndex].value),
				dropdowns = e.parentNode.children,
				allOffers = e.parentNode.parentNode.children[1].children,
				subModelDP = document.getElementById(model + '_' + year + '_subModelDP'); 
				year = year.replace('&nbsp;', '');
			
			// This will trigger the submodel select box, so that if you were looking
			// at a 2010 model, the same model will be present upon switching to 2011
			for (var i = 0, len = dropdowns.length; len > i; i++) {
				if (dropdowns[i].className === 'subModelDP' && dropdowns[i].children.length) {
					co.changeSub(dropdowns[i]);
				}
			}
			
			if (subModelDP.children.length > 1) {
				subModelValue = $.trim(subModelDP.options[subModelDP.selectedIndex].value);
			}
			
			subCheck = subModelValue === false || subModelValue === 'All';
			
			for (var i = 0, len = dropdowns.length; len > i; i++) {
				if (dropdowns[i].className.indexOf('subModelDP') > -1) {
					if (dropdowns[i].id === model + '_' + year + '_subModelDP') {
						dropdowns[i].className = 'subModelDPActive';
					} else {
						dropdowns[i].className = 'subModelDP';
					}
				}
			}
			
			for (var i = 0, len = allOffers.length; len > i; i++) {
				if ( subCheck ) {
					allOffers[i].className = allOffers[i].id.indexOf(year) > -1 ? 'offerContentActive' : 'offerContent'; 
				} else {
					allOffers[i].className = allOffers[i].id === subModelValue + '_' + year + '_offerContent' ? 'offerContentActive' : 'offerContent';
				}
			}
			
			if (co.trackChange == true) {
				// alert('co.trackChange flag: ' + co.trackChange + '\n[Year change WILL be tracked in Omniture]');
				co.trackTabs(model, year);
				co.trackChange = false;  // Returns clickTracking flag to false to prevent click tracking on page refresh.
			}
		},
		changeSub: function (elem) {
			// This method is called through a jQuery event handler from inside the init method.
			// Because of that, the scope of this method is the jQuery object and NOT the co object.
			var e;
			elem.id ? e = elem : e = this;
			if (!e) return false;
			
			var year, val,
				id = e.id.split('_'),
				model = ($.trim(id[0])).replace(' ', '-'),
				dropdowns = e.parentNode.children,
				yearDP = document.getElementById(model + '_yearDP'),
				allOffers = e.parentNode.parentNode.children[1].children,
				subModelValue;
			
			if ( e.children.length > 1 ) {
				subModelValue = $.trim(e.options[e.selectedIndex].value);
			} else { 
				subModelValue = $.trim(e.children[0].innerHTML);
			}
				
			if (yearDP.children.length > 1) {
				year = $.trim(yearDP.options[yearDP.selectedIndex].value);
			} else {
				year = $.trim(yearDP.innerHTML);
			}
			year = year.replace('&nbsp;', '');
			
			for (var i = 0, len = allOffers.length; len > i; i++) {
				if (subModelValue === 'All') {
					if (allOffers[i].id.indexOf(year) > -1) {
						allOffers[i].className = 'offerContentActive';
					} else {
						allOffers[i].className = 'offerContent';
					}
				} else {
					if (allOffers[i].id === subModelValue + '_' + year + '_offerContent') {
						allOffers[i].className = 'offerContentActive';
					} else {
						allOffers[i].className = 'offerContent';
					}
				}
			}
			
			// This will change the non-selected years sub model, so if the user switches years
			// The submodel they were looking at will still be present, if it exists
			for (var i = 0, len = dropdowns.length; len > i; i++) {
				if (dropdowns[i].className === 'subModelDP' && dropdowns[i].children.length) {
					for (var j = 0, _len = dropdowns[i].children.length; _len > j; j++) {
						val = $.trim(dropdowns[i].children[j].value);
						if (val === subModelValue) {
							dropdowns[i].children[j].setAttribute('selected', 'selected');
						} else {
							dropdowns[i].children[j].removeAttribute('selected');
						}
					}
				}
			}
		},
		disclaimer: function () {
			// This method is called through a jQuery event handler from inside the init method.
			// Because of that, the scope of this method is the jQuery object and NOT the co object.
			var link = this,
				disclaimer = this.nextSibling,
				readMsg = 'Read full offer details',
				hideMsg = 'Hide full offer details';
			
			while (disclaimer.nodeType !== 1) {
				disclaimer = disclaimer.nextSibling;
			}
			
			if (disclaimer.className === 'disclaimer') {
				link.children[0].innerHTML = hideMsg;
				disclaimer.className = 'disclaimerActive';
			} else {
				link.children[0].innerHTML = readMsg;
				disclaimer.className = 'disclaimer';
			}
		},
		promoTiles: function () {
			// This method is called through a jQuery event handler from inside the init method.
			// Because of that, the scope of this method is the jQuery object and NOT the co object.
			var oldTiles,
				newTile = this,
				allTiles = this.parentNode.children;
			
			for (var i = 0, len = allTiles.length; len > i; i++) {
				if (allTiles[i].className === 'promoActive') {
					oldTile = allTiles[i];
				}
			}
			
			oldTile.className = 'promo';
			oldTile.children[0].className += ' active';
			oldTile.children[1].className = 'promoImage';
			
			newTile.className = 'promoActive';
			newTile.children[0].className = 'promoImage';
			newTile.children[1].className += ' active';
		},
		trackTabs: function (model, year) {
			var dropdown,
				trackObj;
		
			if (!model) {
				model = $.trim($('.modelTabActive').text());
			}
			if (!year) {
				dropdown = document.getElementById(model + '_yearDP');
				if (dropdown.children.length > 1) {
					year = dropdown.options[dropdown.selectedIndex].value;
				} else {
					year = $.trim(dropdown.innerHTML);
				}
				year = year.replace('&nbsp;', '');
			}
			
			model = model.toLowerCase();
			
			trackObj = {
				prop1: model,
				prop3: '',
				eVar5: model,
				eVar7: '',
				eVar28: year,
				prop33: model + ' | current offers',
				prop35: model + ' | current offers | index'
			};
			
			clickTrack(trackObj);
		},
		deepLink: function () {
			var data, type, model, year, submodel, oType, oModel, oYear, oSubmodel,
				qsArray = getQsParams(),
				qs = qsArray['year'] + qsArray['brand'];
			
			if (typeof yearBrandArray[qs] !== 'undefined' && isNaN(qs)) {
				data = yearBrandArray[qs].split('~');
				type = data[0];
				model = data[1];
				year = data[2];
				submodel = data[3];
				oType = document.getElementById(type + '_vehicleTypeTab');
				oModel = document.getElementById(model + '_modelTab');
				oYear = document.getElementById(model + '_yearDP');
				oSubmodel = document.getElementById(model + '_' + year + '_subModelDP');
				
				if (!oType || !oModel || !oYear || !oSubmodel) return;
				
				// Selects year as defined in query string
				for (var i = 0, len = oYear.children.length; len > i; i++) {
					if (oYear.children[i].value === year) {
						oYear.children[i].setAttribute('selected', 'selected');
					} else {
						oYear.children[i].removeAttribute('selected');
					}
				}
				
				// Selects submodel as defined in query string
				for (var i = 0, len = oSubmodel.children.length; len > i; i++) {
					if (oSubmodel.children[i].value === submodel) {
						oSubmodel.children[i].setAttribute('selected','selected');
					} else {
						oSubmodel.children[i].removeAttribute('selected');
					}
				}
				
				this.changeType(oType);
				this.changeModel(oModel);
				this.changeYear(oYear);
				this.changeSub(oSubmodel);
			}
		},
		
		//Omniture click tracking flag
		trackChange: false,  // Starts off false to prevent click tracking when changeModel/changeYear is called during page load/refresh.
		trackClick: function () {
			// Triggered by mousedown event; Changes above flag to true to enable click tracking.
			co.trackChange = true;
		}
	};
	
	$(document).ready(function () {
		co.init();
	});

})(mrm.$);
var thisPage = function() {
	var private_var;
	function private_method() {
		// do stuff here
	}

	// --------------------------------------------------------------
	// generic name/value pair function
	// return a hash (of sorts) of name value pairs from the querystring
	// uasge: var qsParams = getQsParams();
	// then: qsParams['url'] whould equal whatever url=XXX in the querystring

	function getQsParams() {
		var qs = location.search;
		qs = qs.substring(1);
		// create an 'array' called newArray with the name value pairs from the querystring
		var qsArray = new Array;
		qsArray = qs.split('&'); //creating an array in which the values are separated by ampersands in the code//
		var keyValueArray = new Array; //this one loads the names and values into a hash (of sorts)//
		for(i=0; i<qsArray.length; i++) {
			var nameValue = qsArray[i].split('='); //splitting what we find between each ampersand into key value pairs //
			keyValueArray[nameValue[0]] = unescape(nameValue[1]); //we are then turning all the escaped characters back into the 'real thing' ie. %3F turns into a '?' //
		}
		return keyValueArray;
	}

	return {
		loadPage : function(){
			var qsParams = getQsParams();
			//alert("loadPage");
			zipLoc = getDefaultLocation();
			//alert(zipLoc);
			var url = window.location.href.split("?");
			var tempLink = "";
			if(qsParams['year']!=null && qsParams['brand']!=null){
				tempLink = "&year="+qsParams['year']+"&brand="+qsParams['brand'];
			}
			//alert(zipLoc);
			window.location.href=url[0]+"?zipCode="+zipLoc.zipcode+tempLink;
		}
	};
}();

function getZipCode(myCookieStr) {
	var str = unescape(myCookieStr);
	return str.substring(str.length - 7, str.length -2);
}
