String.prototype.endsWith = function(str) {
	return (this.match(str+"$")==str);
};

var consoleUndefined = "undefined";

function logToConsole(value) {
	if( window.console ) {
		console.log( value );
	}
}

function populateModels() {
    document.getElementById('modelsCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#modelsCombo");
    
    $.getJSON("guest/products/fillModelsJSON.action", {make: $('#makesCombo').val()}, function(response) {
        for(var i=0;i<response.length;i++){
            if ($('#modelsCombo option[value="' + response[i].code + '"]').length == 0) {
        		$("<option value='" + response[i].code + "'>" + response[i].name + "</option>").appendTo("#modelsCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i].name + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#modelsCombo").attr("disabled",false);
        } else {
            $("#modelsCombo").attr("disabled",true);
        }
    });
};

function populateModelVersions() {
    document.getElementById('modelVersionsCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#modelVersionsCombo");
    
    $.getJSON("guest/products/fillModelVersionsJSON.action", {model: $('#modelsCombo').val()}, function(response) {
        for(var i=0;i<response.length;i++){
            if ($('#modelVersionsCombo option[value="' + response[i].code + '"]').length == 0) {
        		$("<option value='" + response[i].code + "'>" + response[i].name + "</option>").appendTo("#modelVersionsCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i].name + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#modelVersionsCombo").attr("disabled",false);
        } else {
            $("#modelVersionsCombo").attr("disabled",true);
        }
    });
};

function populateVehicleYears() {
    document.getElementById('yearsCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#yearsCombo");
    
    $.getJSON("guest/products/fillVehiclesJSON.action", {modelVersion: $('#modelVersionsCombo').val()}, function(response) {
        for(var i=0;i<response.length;i++){
        	if ($('#yearsCombo option[value="' + response[i].formatedDate + '"]').length == 0) {
        		$("<option value='" + response[i].formatedDate + "'>" + response[i].formatedDate + "</option>").appendTo("#yearsCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i].formatedDate + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#yearsCombo").attr("disabled",false);
        } else {
            $("#yearsCombo").attr("disabled",true);
        }
    });
};

function populateTyreCombinations() {
    document.getElementById('tyreSizeCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#tyreSizeCombo");
    
    $.getJSON("guest/products/fillTyreSpecJSON.action", {modelVersion: $('#modelVersionsCombo').val(), year: $('#yearsCombo').val()}, function(response) {
    	for(var i=0;i<response.length;i++){
    		if ($('#tyreSizeCombo option[value="' + response[i].code + '"]').length == 0) {
        		$("<option value='" + response[i].code + "'>" + response[i].name + "</option>").appendTo("#tyreSizeCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i].code + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#tyreSizeCombo").attr("disabled",false);
        } else {
            $("#tyreSizeCombo").attr("disabled",true);
        }
    });
};

function populateAspectRatios() {
	populateSeasonTypes();
	
    document.getElementById('aspectRatioCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#aspectRatioCombo");
    
    $.getJSON("guest/products/fillAspectRatiosJSON.action", {width: $('#widthCombo').val(),summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {    
        for(var i=0;i<response.length;i++){
        	if (response[i] == null || response[i] == 'null') {
        		logToConsole("Server response contained " + response[i] + "!");
        		continue;
        	}
        	if ($('#aspectRatioCombo option[value="' + response[i] + '"]').length == 0) {
        		logToConsole("Adding " + response[i]);
        		$("<option value='" + response[i] + "'>" + response[i] + "</option>").appendTo("#aspectRatioCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i] + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#aspectRatioCombo").attr("disabled",false);
        } else {
            $("#aspectRatioCombo").attr("disabled",true);
        }
    });
};

function populateDiameters() {
	populateSeasonTypes();
	
    document.getElementById('diameterCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#diameterCombo");
    
    $.getJSON("guest/products/fillDiametersJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(),summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {
    
        for(var i=0;i<response.length;i++){
        	if ($('#diameterCombo option[value="' + response[i] + '"]').length == 0) {
        		logToConsole("Adding " + response[i]);
        		$("<option value='" + response[i] + "'>" + response[i] + "</option>").appendTo("#diameterCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i] + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#diameterCombo").attr("disabled",false);
        } else {
            $("#diameterCombo").attr("disabled",true);
        }
    });
};

function populateLoadIndexes(){
	populateSeasonTypes();
	
    document.getElementById('loadIndexCombo').options.length=0;
    $("<option value=''>--</option>").appendTo("#loadIndexCombo");
    
    $.getJSON("guest/products/fillLoadIndexesJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(), rim: $('#diameterCombo').val(),summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {  
        for(var i=0;i<response.length;i++){
        	if ($('#loadIndexCombo option[value="' + response[i] + '"]').length == 0) {
        		$("<option value='" + response[i] + "'>" + response[i] + "</option>").appendTo("#loadIndexCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i] + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#loadIndexCombo").attr("disabled",false);
        } else {
            $("#loadIndexCombo").attr("disabled",true);
        }
    });
};

function populateSpeedRatings() {
	populateSeasonTypes();
	
	document.getElementById('speedRatingCombo').options.length=0;
	$("<option value=''>--</option>").appendTo("#speedRatingCombo");
    
    $.getJSON("guest/products/fillSpeedRatingsJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(), rim: $('#diameterCombo').val(), load: $('#loadIndexCombo').val(), summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {    
        for(var i=0;i<response.length;i++){
        	if ($('#speedRatingCombo option[value="' + response[i] + '"]').length == 0) {
        		$("<option value='" + response[i] + "'>" + response[i] + "</option>").appendTo("#speedRatingCombo");
        	} else {
        		logToConsole("Combo already contains " + response[i] + " (jquery/IE bug)");
        	}
        }
        if(response.length>0){
            $("#speedRatingCombo").attr("disabled",false);
        } else {
            $("#speedRatingCombo").attr("disabled",true);
        }
    });
};

function populateAllBasedOnSeasonType(){
	var oldWidthValue = "";
	if(document.getElementById('widthCombo').value != ""){
		oldWidthValue = document.getElementById('widthCombo').value;
		if(oldWidthValue.endsWith(".0")){
			oldWidthValue = oldWidthValue.substring(0,oldWidthValue.length-2);
		}
	}
	var oldAspectValue = "";
	if(document.getElementById('aspectRatioCombo').value != ""){
		oldAspectValue = document.getElementById('aspectRatioCombo').value;
	}
	var oldDiameterValue = "";
	if(document.getElementById('diameterCombo').value != ""){
		oldDiameterValue = document.getElementById('diameterCombo').value;
	}
	var oldLoadValue = "";
	if(document.getElementById('loadIndexCombo').value != ""){
		oldLoadValue = document.getElementById('loadIndexCombo').value;
	}
	var oldSpeedValue = "";
	if(document.getElementById('speedRatingCombo').value != ""){
		oldSpeedValue = document.getElementById('speedRatingCombo').value;
	}
	
//	document.getElementById('widthCombo').options.length = 0;
//	$("<option value=''>--</option>").appendTo("#widthCombo");
	
    $.getJSON("guest/products/fillWidthsForSeasonTypeJSON.action", {summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {
    	
		document.getElementById('widthCombo').options.length = 0;
		$("<option value=''>--</option>").appendTo("#widthCombo");
    	
        for(var i=0;i<response.length;i++){
        	if(response[i].endsWith(".0")){
        		response[i] = response[i].substring(0,response[i].length-2);
        	}
       		$("<option value='"+response[i]+"'>"+response[i]+"</option>").appendTo("#widthCombo");
        }
        if(response.length>0){
        	removeDuplicates($("#widthCombo"));
            $("#widthCombo").attr("disabled",false);
            document.getElementById('widthCombo').value = oldWidthValue;
        } else {
            $("#widthCombo").attr("disabled",true);
        }
    });
    
//    document.getElementById('aspectRatioCombo').options.length=0;
//    $("<option value=''>--</option>").appendTo("#aspectRatioCombo");
    
    $.getJSON("guest/products/fillAspectRatiosJSON.action", {width: $('#widthCombo').val(),summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {
    
    	document.getElementById('aspectRatioCombo').options.length=0;
    	$("<option value=''>--</option>").appendTo("#aspectRatioCombo");
      
        for(var i=0;i<response.length;i++){
            $("<option value='"+response[i]+"'>"+response[i]+"</option>").appendTo("#aspectRatioCombo");
        }
        if(response.length>0){
        	removeDuplicates($("#aspectRatioCombo"));
            $("#aspectRatioCombo").attr("disabled",false);
            document.getElementById('aspectRatioCombo').value = oldAspectValue;
        } else {
            $("#aspectRatioCombo").attr("disabled",true);
        }
    });


//    document.getElementById('diameterCombo').options.length=0;
//    $("<option value=''>--</option>").appendTo("#diameterCombo");
    
    $.getJSON("guest/products/fillDiametersJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(),summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {

      document.getElementById('diameterCombo').options.length=0;
      $("<option value=''>--</option>").appendTo("#diameterCombo");
    	
        for(var i=0;i<response.length;i++){
            $("<option value='"+response[i]+"'>"+response[i]+"</option>").appendTo("#diameterCombo");
        }
        if(response.length>0){
        	removeDuplicates($("#diameterCombo"));
            $("#diameterCombo").attr("disabled",false);
            document.getElementById('diameterCombo').value = oldDiameterValue;
        } else {
            $("#diameterCombo").attr("disabled",true);
        }
    });

//    document.getElementById('loadIndexCombo').options.length=0;
//    $("<option value=''>--</option>").appendTo("#loadIndexCombo");
    
    $.getJSON("guest/products/fillLoadIndexesJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(), rim: $('#diameterCombo').val(),summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {
    
    	document.getElementById('loadIndexCombo').options.length=0;
    	$("<option value=''>--</option>").appendTo("#loadIndexCombo");
    	
        for(var i=0;i<response.length;i++){
            $("<option value='"+response[i]+"'>"+response[i]+"</option>").appendTo("#loadIndexCombo");
        }
        if(response.length>0){
        	removeDuplicates($("#loadIndexCombo"));
            $("#loadIndexCombo").attr("disabled",false);
            document.getElementById('loadIndexCombo').value = oldLoadValue;
        } else {
            $("#loadIndexCombo").attr("disabled",true)
        }
    });

//    document.getElementById('speedRatingCombo').options.length=0;
//    $("<option value=''>--</option>").appendTo("#speedRatingCombo");
    
    $.getJSON("guest/products/fillSpeedRatingsJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(), rim: $('#diameterCombo').val(), load: $('#loadIndexCombo').val(), summer: $('#summertyres').is(':checked'), winter: $('#wintertyres').is(':checked')}, function(response) {
    
    	document.getElementById('speedRatingCombo').options.length=0;
    	$("<option value=''>--</option>").appendTo("#speedRatingCombo");
    	
        for(var i=0;i<response.length;i++){
            $("<option value='"+response[i]+"'>"+response[i]+"</option>").appendTo("#speedRatingCombo");
        }
        if(response.length>0){
        	removeDuplicates($("#speedRatingCombo"));
            $("#speedRatingCombo").attr("disabled",false);
            document.getElementById('speedRatingCombo').value = oldSpeedValue;
        } else {
            $("#speedRatingCombo").attr("disabled",true);
        }
    });
}

function populateSeasonTypes(){
	$("#widget-wide-tyre-size-winter").css("visibility", "hidden");
	$("#widget-wide-tyre-size-summer").css("visibility", "hidden");
	
	$("#widget-narrow-tyre-size-winter").css("visibility", "hidden");
	$("#widget-narrow-tyre-size-summer").css("visibility", "hidden");
	
    $.getJSON("guest/products/fillSeasonTypesJSON.action", {width: $('#widthCombo').val(), aspect: $('#aspectRatioCombo').val(), rim: $('#diameterCombo').val(), load: $('#loadIndexCombo').val(), speed: $('#speedRatingCombo').val()}, function(response) {
    
        for(var i=0;i<response.length;i++){
        	if(response[i] === "winter"){
        		$("#widget-wide-tyre-size-winter").css("visibility", "visible");
        		$("#widget-narrow-tyre-size-winter").css("visibility", "visible");
        	} else if(response[i] === "summer"){
        		$("#widget-wide-tyre-size-summer").css("visibility", "visible");
        		$("#widget-narrow-tyre-size-summer").css("visibility", "visible");
        	} 
        }
    });
}

function removeDuplicates(parentDiv){
	var seen = {};
	parentDiv.children().each(function() {
	    var txt = $(this).text();
	    if (seen[txt])
	        $(this).remove();
	    else
	        seen[txt] = true;
	});
}

function sortlist(id) {
	var lb = document.getElementById(id);
	arrTexts = new Array();

	for(i=0; i<lb.length; i++)  {
	  arrTexts[i] = lb.options[i].text;
	}

	arrTexts.sort();

	for(i=0; i<lb.length; i++)  {
	  lb.options[i].text = arrTexts[i];
	  lb.options[i].value = arrTexts[i];
	}
}

