var tfStateCookie = {
    data: {},
    load: function () {
		var cookie = readCookie('tfstate');
        if (cookie) {
			this.data = JSON.parse(cookie);
        }
        return this.data;
    },
    save: function (expires, path) {
		createCookie('tfstate', JSON.stringify(this.data));
    }
};

var tfState = tfStateCookie.load();

var sorting = [[0,0],[1,0]];
	
$(document).ready(function() 
    {
		if (getLanguage() == 'fr') {
			tfDropdownInitMsg = 'Veuillez indiquer votre choix';			
		}
		else {
			tfDropdownInitMsg = 'Please Choose';
		}

		// state on tire finder landing page		
		if ($('#year').val() != null) {		

			restoreState();
			
			// set manufacturers value
			var mfrs = getMfrs();
			$('#tireManufacturer').attr("value", mfrs);
			
			// save state on change
			$('#year').change(function(){
				updateMakeDropdown();
				saveState();
			});
			$('#make').change(function(){
				updateModelDropdown();
				saveState();
			});
			$('#model').change(function(){
				saveState();
			});
			$('.tf-size').change(function(){
				saveState();
			});
			$('#mfr-all').change(function(){
				saveState();
			});	
			$('.checkMfr').change(function(){
				saveState();
			});
			$('.tire-type').change(function(){
				saveState();
			});	
		};		
			
		// Tablesorter 
		var sortByManuAsc = true;
		var sortByTireAsc = true;
		var sortByTypeAsc = true;
		var sortBySizeAsc = true;

		// call the tablesorter plugin
		$("#tireResultsOem").tablesorter({headers: {4: {sorter: false}}, widgets: ['zebra']});
		$("#tireResultsOther").tablesorter({headers: {4: {sorter: false}}, widgets: ['zebra']}); 
				
		sorting = [[0,0],[1,0]];
		doSort(sorting);		

		$(".sortByManu").click(function() {
			// set sorting column and direction
			sorting = [[0,0],[1,0]];
			if(sortByManuAsc == true){
				sorting = [[0,0],[1,0]];
				sortByManuAsc = false;
			}
			else {
				sorting = [[0,1],[1,0]];			
				sortByManuAsc = true;
			}				
			// sort on the first & second column 
			doSort(sorting);
			// return false to stop default link action 
			return false; 
		});
		
		$(".sortByTire").click(function() { 
			// set sorting column and direction
			sorting = [[1,0],[2,0]];
			if(sortByTireAsc == true){
				sorting = [[1,0],[2,0]];
				sortByTireAsc = false;
			}
			else {
				sorting = [[1,1],[2,0]];
				sortByTireAsc = true;
			}	
			// sort on the second & third column
			doSort(sorting);	
			// return false to stop default link action 
			return false; 
		});
		
		$(".sortByType").click(function() { 
			// set sorting column and direction
			sorting = [[2,0],[0,0]];
			if(sortByTypeAsc == true){
				sorting = [[2,0],[0,0]];
				sortByTypeAsc = false;
			}
			else {
				sorting = [[2,1],[0,0]];
				sortByTypeAsc = true;
			}
			// sort on the third & first column 
			doSort(sorting);
			// return false to stop default link action 
			return false; 
		});
		
		$(".sortBySize").click(function() { 
			// set sorting column and direction
			sorting = [[3,0],[0,0]];
			if(sortBySizeAsc == true){
				sorting = [[3,0],[0,0]];
				sortBySizeAsc = false;
			}
			else {
				sorting = [[3,1],[0,0]];
				sortBySizeAsc = true;
			}	
			// sort on the fourth & first column 
			doSort(sorting);
			// return false to stop default link action 
			return false; 
		});	
		
		$('.checkMfr:checkbox').click(function () {
			$('#mfr-all:checkbox').attr('checked',false);
			var mfrs = getMfrs();
			$('#tireManufacturer').attr("value", mfrs);	
		});

		$('#mfr-all:checkbox').click(function () {
			$('.checkMfr:checkbox').attr('checked',false);
			var mfrs = getMfrs();
			$('#tireManufacturer').attr("value", mfrs);			
		});

		// Validate user input
		$('input#tireSearch').click(function () {
			var vehicleValidated = validateFormVehicle();
			var tireSizeValidated = validateFormTireSize();
			if (vehicleValidated == true || tireSizeValidated == true ) {
				$('form#tire_chooser').submit();
			}
			else if (vehicleValidated == false && tireSizeValidated == false) {
				var tfSubmitErrMsg = getTfSubmitErrMsg();
				$('td#validationError').html(tfSubmitErrMsg);
				if($('#errorVehicle').is(':visible')){
					$('#errorVehicle').hide();
				}

				$('td#validationError').show();
				return false;
			}
		});
		
		var tableHeight = $("#resultsTable").outerHeight();
		// Tire Card displayed on items containing more info.
		$('.moreInfo').click(function(){
			var tid = $(this).attr("id");
			var topPos = Math.round($(this).position().top);
			var tireCardHeight = $('.' + tid).outerHeight();
			var topPosFix = topPos - (tireCardHeight / 4);
			$('.tireCard').not('[class*=' + tid + ']').hide();
			if (topPos >= (tireCardHeight / 4))			
			$('.' + tid).css('top',topPosFix);
			if ($('.' + tid).is(':hidden')) {
				$('.' + tid).fadeIn();
			}
			
			// make sure table height is large enough to fit the tire card.				
			var newCardHeight = tireCardHeight + topPos;
			var diff = 0;
			if (newCardHeight > tableHeight) {
				 diff = (newCardHeight - tableHeight) - 50;
			} 
			else {
				diff = 0;
			}
			if (diff >= 0) {
				$("#resultsTable").css('padding-bottom', diff);
			}

			return false;
		});		
	}
);

var tfLang = "en";
var tfDropdownInitMsg = 'Please Choose';

function getLanguage() {
	var thisURL = location.toString();
	if ((thisURL.indexOf('/english') != -1) || (thisURL.indexOf('en_CA') != -1) || (thisURL.indexOf('lang=en') != -1)) { 
		tfLang = "en";	
	}
	else if ((thisURL.indexOf('/french') != -1)|| (thisURL.indexOf('fr_CA') != -1) || (thisURL.indexOf('lang=fr') != -1)) { 
		tfLang = "fr"; 		
	}
	return tfLang;
}

function validateFormVehicle() {
	if ($('#year').val() != "" && $('#make').val() != "" && $('#model').val() != "") {
		return true;
	}
	else {
		return false;
	}
}

function validateFormTireSize() {
	if ($('#tireWidth').val() != "" && $('#tireAspectRatio').val() != "" && $('#tireSize').val() != "") {
		return true;
	}
	else {
		return false;
	}
}

function doSort(sorting) {
	if ($('#tireResultsOem tr').children('td').length > 0){
		$('#tireResultsOem').trigger('sorton',[sorting]);
	}
	else {
		$('#tireResultsOem').hide();
		$('#tireResultsOther th').css('visibility','visible');		
	}
	if ($('#tireResultsOther tr').children('td').length > 0){
		$('#tireResultsOther').trigger('sorton',[sorting]); 
	}
	// I can't find a sorter callback so I'm resorting to a wait.
	setTimeout(removeSubSortClass,0001);
}

function removeSubSortClass() {
	if (sorting) {
		var trimmedSort = sorting.toString();
		trimmedSort.replace(/^\s+|\s+$/g, '');
		switch(trimmedSort) {
			case '0,0,1,0':
				//var t = setTimeout("$('.sortByTire').removeClass('headerSortDown')",1000);
				$('.sortByTire').removeClass('headerSortDown');
				//$("table").tablesorter( { headers: { 1: { sorter: false } } } );
				break;
			case '0,1,1,0':
				$('.sortByTire').removeClass('headerSortDown');
				//$("table").tablesorter( { headers: { 1: { sorter: false } } } );
				break;	
				
			case '1,0,2,0':
				$('.sortByType').removeClass('headerSortDown');
				//$("table").tablesorter( { headers: { 2: { sorter: false } } } );
				break;
			case '1,1,2,0':
				$('.sortByType').removeClass('headerSortDown');
				//$("table").tablesorter( { headers: { 2: { sorter: false } } } );
				break;	
				
				
			case '2,0,0,0':
				$('.sortByManu').removeClass('headerSortDown');
				break;
			case '2,1,0,0':
				$('.sortByManu').removeClass('headerSortDown');
				break;
				
			case '3,0,0,0':
				$('.sortByManu').removeClass('headerSortDown');
				break;
				
			case '3,1,0,0':
				$('.sortByManu').removeClass('headerSortDown');
				break;			
				
			default:
				// do nothing
		}
	}
}

function updateMakeDropdown() {
	var yearValue = $('#year').val();
	var dropdownSet = $('#make');
	if (yearValue.length == 0) {
		dropdownSet.emptySelect();
		$('#model').emptySelect();
	}
	else {
		$.getJSON(
			'/gm/english/services/goodwrench/tires/tire-finder',
			{actionType:'searchMakes',year:yearValue},
			function(data){
				dropdownSet.loadSelect2(data, tfDropdownInitMsg);
				if (tfState) {
					$('select#make').val(tfState.make);
				}					
				updateModelDropdown();			
			}
		);
	} 
}

function updateModelDropdown() {
	var yearValue = $('#year').val();
	var makeValue = $('#make').val();
	var dropdownSet = $('#model');
	if ((yearValue.length == 0)||(makeValue.length == 0) ) {
	  dropdownSet.emptySelect();
	}
	else {
	  $.getJSON(
		'/gm/english/services/goodwrench/tires/tire-finder',
		{actionType:'searchModel',year:yearValue,make:makeValue},
		function(data){
			dropdownSet.loadSelect2(data, tfDropdownInitMsg);
			if (tfState) {
				$('select#model').val(tfState.model);
			}				
		}
	  );
	}
}

function getMfrs() {
	var mfr = "";
	$.each($('input:checkbox:checked'), function() {
		if ($('input:checkbox:checked')){
			if (mfr != "") {
				mfr =  mfr + "," + $(this).val(); 
			} else {
				mfr =  $(this).val(); 
			}
		}
	});	
	return mfr;
}

$.fn.emptySelect = function() {
	return this.each(function(){
	  if (this.tagName=='SELECT') this.options.length = 0;
	});
}
 
$.fn.loadSelect2 = function(optionsArray, defaultMsg) {
	optionsArray.push(' ' + defaultMsg);
	var uniqueSortedOptionsArray = optionsArray.unique().sort();
	return this.emptySelect().each(function(){
		if (this.tagName=='SELECT') {
		  var selectElement = this;
		  $.each(uniqueSortedOptionsArray,function(index,optionData){
			var option;
			if (index != 0) {
				option = new Option(optionData, optionData);
			}
			else {
				option = new Option(optionData, "");
			}
			if ($.browser.msie) {
			  selectElement.add(option);
			}
			else {
			  selectElement.add(option,null);
			}
		  });
		}
	});
}

Array.prototype.unique = function () {
	var r = new Array();
	o:for(var i = 0, n = this.length; i < n; i++)
	{
		for(var x = 0, y = r.length; x < y; x++)
		{
			if(jQuery.trim(r[x])==jQuery.trim(this[i]))
			{
				continue o;
			}
		}
		r[r.length] = this[i];
	}
	return r;
}

$.fn.check = function(mode) {
   // if mode is undefined, use 'on' as default
   var mode = mode || 'on';
   
   return this.each(function() {
     switch(mode) {
       case 'on':
         this.checked = true;
         break;
       case 'off':
         this.checked = false;
         break;
       case 'toggle':
         this.checked = !this.checked;
         break;
     }
   });
 };

$.fn.selectItem = function(selText) {
	return $(this).each(function(){
		var option;
		if ($(this).text() == selText) {
			option = this;
			option.selected = true
			return false;
		}
	});
};

// write dealer Request Quote & Schedule Service Appt. buttons (re-purposed Ralph's code, uses /js/common/jquery.query-2.1.7.js)
var url = location.search;
var dealerUrl = $.query.get('dealerUrl');

function writeRAQURL() {
	document.write('<a id="btn-request" class="gwButton" href="http://'+dealerUrl+'/f_RequestAQuote?raqType=service&staffType=service" target="_blank"><span>Request Quote</span></a>');							
}

function writeServiceURL() {
	document.write('<a id="btn-schedule" class="gwButton" href="http://'+dealerUrl+'/f_RequestAQuote?raqType=scheduleService&staffType=service" target="_blank"><span>Schedule Service Appointment</span></a>');				
}	
function writeRAQURLfr() {
	document.write('<a id="btn-request" class="gwButton french" href="http://'+dealerUrl+'/f_RequestAQuote?raqType=service&staffType=service" target="_blank"><span>Demande de soumission</span></a>');							
}

function writeServiceURLfr() {
	document.write('<a id="btn-schedule" class="gwButton french" href="http://'+dealerUrl+'/f_RequestAQuote?raqType=scheduleService&staffType=service" target="_blank"><span>');
	document.write("Fixer un rendez-vous d'entretien");
	document.write('</span></a>');				
}

function getTfSubmitErrMsg() {
	var tfMsg = "";
	if ($('#year').val() === "" && $('#make').val() === "" && $('#model').val() === "" &&  $('#tireWidth').val() === "" && $('#tireAspectRatio').val() === "" && $('#tireSize').val() === "" ) {
		if (getLanguage() === 'fr') {
			tfMsg = "Erreur - pour la recherche de pneus, entrez l'ann&#233;e, la marque et le mod&#232;le du v&#233;hicule, ou la dimension de pneu.";
		}
		else {
			tfMsg = "Error - to search for tires, please provide either the year, make and model, or tire size.";
		}
	}
	else if ($('#year').val() !== "" || $('#make').val() !== "" || $('#model').val() !== "" ) {
		if (getLanguage() === 'fr') {
			tfMsg = "Erreur - pour la recherche de pneus pour votre v&#233;hicule GM, entrez l'ann&#233;e, la marque et le mod&#232;le du v&#233;hicule.";
		}
		else {
			tfMsg = "Error - to search for tires for your GM vehicle, please provide the year, make and model.";	
		}
	}
	else if ($('#tireWidth').val() !== "" || $('#tireAspectRatio').val() !== "" || $('#tireSize').val() !== "" ) {
		if (getLanguage() === 'fr') {	
			tfMsg = "Erreur - pour la recherche de pneus par dimension, entrez les trois param&#232;tres de pneu (largeur, flanc et jante).";
		}
		else {
			tfMsg = "Error - to search for tires by size, please provide all 3 tire parameters (width, sidewall and rim).";
		}
	}
	return tfMsg;
}

function saveState() {
	var saveState = {
			// vehicle
			year: $('select#year').val(),
			make: $('select#make').val(),
			model: $('select#model').val(),
			// size
			tireWidth: $('select#tireWidth').val(),
			tireSize: $('select#tireSize').val(),
			tireAspectRatio: $('select#tireAspectRatio').val(),
			// manufacturer checkboxes
			mfrAll: $('#mfr-all').is(':checked'),
			mfrBfgoodrich: $('#mfr-BFGoodrich').is(':checked'),
			mfrBridgestone: $('#mfr-Bridgestone').is(':checked'),
			mfrContinental: $('#mfr-Continental').is(':checked'),
			mfrDunlop: $('#mfr-Dunlop').is(':checked'),
			mfrFirestone: $('#mfr-Firestone').is(':checked'),
			mfrGeneral: $('#mfr-General').is(':checked'),
			mfrGoodyear: $('#mfr-Goodyear').is(':checked'),
			mfrHankook: $('#mfr-Hankook').is(':checked'),
			mfrKumho: $('#mfr-Kumho').is(':checked'),
			mfrMaxxis: $('#mfr-Maxxis').is(':checked'),
			mfrMedalist: $('#mfr-Medalist').is(':checked'),
			mfrMichelin: $('#mfr-Michelin').is(':checked'),
			mfrPirelli: $('#mfr-Pirelli').is(':checked'),
			mfrUniroyal: $('#mfr-Uniroyal').is(':checked'),
			// tire type
			typeAll: $('#type-all').is(':checked'),
			typeAs: $('#type-as').is(':checked'),
			typeW: $('#type-w').is(':checked')
	}
	tfStateCookie.data = saveState;
	tfStateCookie.save();
};

function restoreState() {
	// restore state
	if (tfState) {
		// vehicle
		$('select#year').val(tfState.year);
		updateMakeDropdown();
		// size
		$('select#tireWidth').val(tfState.tireWidth);
		$('select#tireAspectRatio').val(tfState.tireAspectRatio);
		$('select#tireSize').val(tfState.tireSize);		
		// manufacturer checkboxes
		$('#mfr-all').attr('checked', tfState.mfrAll);
		$('#mfr-BFGoodrich').attr('checked', tfState.mfrBfgoodrich);
		$('#mfr-BFGoodrich').attr('checked', tfState.mfrBfgoodrich);
		$('#mfr-Bridgestone').attr('checked', tfState.mfrBridgestone);
		$('#mfr-Continental').attr('checked', tfState.mfrContinental);
		$('#mfr-Dunlop').attr('checked', tfState.mfrDunlop);
		$('#mfr-Firestone').attr('checked', tfState.mfrFirestone);
		$('#mfr-General').attr('checked', tfState.mfrGeneral);
		$('#mfr-Goodyear').attr('checked', tfState.mfrGoodyear);
		$('#mfr-Hankook').attr('checked', tfState.mfrHankook);
		$('#mfr-Kumho').attr('checked', tfState.mfrKumho);
		$('#mfr-Maxxis').attr('checked', tfState.mfrMaxxis);
		$('#mfr-Medalist').attr('checked', tfState.mfrMedalist);
		$('#mfr-Michelin').attr('checked', tfState.mfrMichelin);
		$('#mfr-Pirelli').attr('checked', tfState.mfrPirelli);
		$('#mfr-Uniroyal').attr('checked', tfState.mfrUniroyal);
		// tire type
		$('#type-all').attr('checked', tfState.typeAll);
		$('#type-as').attr('checked', tfState.typeAs);
		$('#type-w').attr('checked', tfState.typeW);
	};
}
