GMCERTIFIED.search = {
	UNLIMITED : "Unlimited",
	isBadDistanceEntry : function(val) {
		return val != this.UNLIMITED && !isInteger(val);
	},
	getASModelItem : function(data, index, templateHTMLID) {
		var id = "id" + index;
		var bs = data.bs;
		var ma = data.ma;
		var mo = data.mo;
		var moi = GMCERTIFIED.MMTBDB.bsImages[bs];
		var s = $("#" + templateHTMLID).html();
		s = s.replace("%modelImg%", moi);
		s = s.replace("%model2%", escape(mo));
		s = s.replace("%model3%", mo);
		s = s.replace("%title1%", ma + " " + mo);
		s = s.replace("%make%", ma);
		s = s.replace("%id1%", id);
		s = s.replace("%id2%", id);
		s = s.replace("%id3%", id);
		return s;		
	},	
	getQSModelItem : function(data, index) {
		var id = "id" + index;
		var t = $("#qsModelDivTemplate").html();
		t = t.replace("%id2%", id);
		t = t.replace("%id3%", id);
		t = t.replace("%modelImg%", GMCERTIFIED.MMTBDB.bsImages[data.bs]);
		t = t.replace("%model1%", escape(data.mo));
		t = t.replace("%model2%", data.mo);
		t = t.replace("%model3%", data.mo);
		t = t.replace("%make%", data.ma);
		t = t.replace("%title1%", data.ma + " " + data.mo);
		return t;		
	},	
	snapToSliderInterval : function() {
		var sVal = $.trim($("#distance").val());
		if (isEmpty(sVal))
			sVal = "25";
		if (sVal == this.UNLIMITED)
			sVal = "525";
		if (this.isBadDistanceEntry(sVal)) {
			return sVal;
		}
		var ii = parseInt(sVal);
		if (ii < 25) {
			ii = 25;
		} else if (ii > 25 && ii < 50) {
			ii = 50;
		} else if (ii > 50 && ii < 75) {
			ii = 75;
		} else if (ii > 75 && ii < 100) {
			ii = 100;
		} else if (ii > 100 && ii < 250) {
			ii = 250;
		} else if (ii > 250 && ii < 500) {
			ii = 500;
		} else if (ii > 500) {
			ii = this.UNLIMITED;
			$("#nod").val("1");
			$("#distance").addClass("invisi-border");
		}
        if (ii < 500) {
			$("#distance").removeClass("invisi-border");
		}

		return ii;
	},
	chompComma : function(str){
		if (str.length == 0) return str;
		return str.substring(0,str.length-1);
	},
	onModelCheck : function(cbox) {
		var results = GMCERTIFIED.MMTBDB.vehicles.get(GMCERTIFIED.search.getWhereClauseObj(GMCERTIFIED.search.getWhereClause()));		
		if ($("#select-trims").attr("checked") == true) {
			if (!GMCERTIFIED.search.doTrimWarn()) {
				GMCERTIFIED.search.onSuccess(results,"trimsRadioDivTemplate","trimsRadioDivCar");
			}	
		}	
	},
	onBodyStyleCheck : function(cbox){
		$("input[type=checkbox][name=model]").each(function(){
				$(this).attr("checked",false);
		});
		var results = GMCERTIFIED.MMTBDB.vehicles.get(this.getWhereClauseObj(this.getWhereClause()));		
		if ($("#select-models").attr("checked") == true) {
			this.onSuccess(results,"modelRadioDivTemplate","modelRadioDivCar");
		}	
		if ($("#select-trims").attr("checked") == true) {
			GMCERTIFIED.search.hideTrims();
		}	
	},
	onMakeCheck : function(cbox){
		$("input[type=checkbox][name=model]").each(function(){
				$(this).attr("checked",false);
		});
		var results = GMCERTIFIED.MMTBDB.vehicles.get(this.getWhereClauseObj(this.getWhereClause()));		
		if ($("#select-models").attr("checked") == true) {
			this.onSuccess(results,"modelRadioDivTemplate","modelRadioDivCar");
		}	
		if ($("#select-trims").attr("checked") == true) {
			GMCERTIFIED.search.hideTrims();
		}	
	},
	hideTrims : function(){
	 	$("#select-trims").attr("checked",false);
	 	$("#all-trims").attr("checked",true);
		$("input[type=checkbox][name=trim]").each(function(){
				$(this).attr("checked",false);
		});
		$("#trimsRadioDivCar").hide();
		$.uniform.update("input[type=radio][name=trimsRadio]");
	},
	onTrimCheck : function(cbox){
	},
	getWhereClauseObj : function(txt){
		return eval('(' + "{" + txt + "}" + ')');
	},
	getWhereClause : function(){
		var useBS = false;
		var bsClause = "bs:[";
		$("input:checkbox[name='bodyStyle'][checked='true']").each(function(){
			useBS = true;
			bsClause += "\"" + $(this).val() + "\"" + ",";
		});
		bsClause = this.chompComma(bsClause);
		bsClause += "]";
		var maClause = "ma:[";
		var useMake = false;
		$("input:checkbox[name='make'][checked='true']").each(function(){
			useMake = true;
			maClause += "\"" + $(this).val() + "\"" + ",";
		});
		maClause = this.chompComma(maClause);
		maClause += "]";
		
		var moClause = "mo:[";		
		var useModel = false;
		$("input:checkbox[name='model'][checked='true']").each(function(){
			useModel = true;
			moClause += "\"" + $(this).val() + "\"" + ",";
		});
		moClause = this.chompComma(moClause);
		moClause += "]";
		
		var trClause = "tr:[";		
		var useTrim = false;
		$("input:checkbox[name='trim'][checked='true']").each(function(){
			useTrim = true;
			trClause += "\"" + $(this).val() + "\"" + ",";
		});
		trClause = this.chompComma(trClause);
		trClause += "]";
		
		var whereClause="";
		if (useBS == true) {
			whereClause += bsClause + ","
		}
		if (useMake == true) {
			whereClause += maClause + ","
		}
		if (useModel == true) {
			whereClause += moClause + ","
		}
		if (useTrim == true) {
			whereClause += trClause + ","
		}
		whereClause = this.chompComma(whereClause);
		return whereClause;
	},
	makemodelSort: function(a,b) {
		 var maA = a.ma.toLowerCase();
		 var maB = b.ma.toLowerCase();
		 var moA = a.mo.toLowerCase();
		 var moB = b.mo.toLowerCase();
		 
		 if (maA < maB) {
		   return -1;
		 } else if  (maA > maB) {
		 	return 1;
		 } else {
			 if (moA < moB) {
			   return -1;
			 } else if  (moA > moB) {
		 		return 1;
		 	 } else {	
				 return 0; 
			}	 
		 }	 
	},
	onSuccess : function(results, templateHTMLID, targetDivID){

		var allTrimsEmpty = true;		
		if (templateHTMLID.indexOf("trims") >= 0) {
			for (var i = 0; i < results.length; ++i) {
				if (results[i].tr != "(null)") {
					allTrimsEmpty = false;
					break;
				} 
			}
		}
		
		if (results.length == 0 && templateHTMLID.indexOf("model") >= 0) {
		
			
			$("#" + targetDivID).hide();
			$("input[type=checkbox][name=model]").each(function() {
				$(this).attr("checked", false);
			});
			$("#all-models").parent().addClass("checked");
			$("#all-models").attr("checked", true);
			$("#select-models").parent().removeClass("checked");
			$("#select-models").attr("checked", false);
			$("#advSearchNoModels").fadeIn(200,function(){$(this).html("<font size='-2' color='red'>No models to show.</font>")});
			$("#advSearchNoModels").fadeOut(5000, function(){$(this).html("")});
			return;	
	   }		
		
		if (templateHTMLID.indexOf("trim") >= 0 && (results.length == 0 || allTrimsEmpty == true)) {
			$("#" + targetDivID).hide();
			$("input[type=checkbox][name=trim]").each(function() {
				$(this).attr("checked", false);
			});
			$("#all-trims").parent().addClass("checked");
			$("#all-trims").attr("checked", true);
			$("#select-trims").parent().removeClass("checked");
			$("#select-trims").attr("checked", false);
			$("#advSearchNoTrims").fadeIn(200,function(){$(this).html("<font size='-2' color='red'>No trim levels to show.</font>")});
			$("#advSearchNoTrims").fadeOut(5000, function(){$(this).html("")});
			return;	
	   }		
		
		
		if (results.length > 0 && templateHTMLID.indexOf("model") >= 0) {
			results.sort(GMCERTIFIED.search.makemodelSort);
		}
		
		
		var modelsRendered = new ArrayList();
		var uniqueModelData = new ArrayList();
		var total = "";
		var outerUL = "";
		var carouselid = "c" + templateHTMLID;
		
		var outerUL = "";
		if (templateHTMLID.indexOf("trim") >= 0) {
			outerUL = "<ul id='" + carouselid + "' class='jcarousel-skin-gmcert'>";
		} else if (templateHTMLID.indexOf("model") >= 0) {
			outerUL = "<ul id='" + carouselid + "' class='jcarousel-skin-gmcert-mo'>";
		} 

		for (var i = 0; i < results.length; ++i) {
			var s = $("#" + templateHTMLID).html();
			var id = "id" + i;
			var data = results[i];
			var bs = data.bs;
			var ma = data.ma;
			var mo = data.mo;
			var tr = data.tr;
			
			var moi = GMCERTIFIED.MMTBDB.bsImages[bs];
			if (templateHTMLID.indexOf("model") >= 0) {
				if (modelsRendered.contains(mo)  == false) {
					modelsRendered.add(mo);
					uniqueModelData.add(data);
				}
			} else if (templateHTMLID.indexOf("trims") >= 0) {
				  if (tr != "(null)") {
					s = s.replace("%make%", ma);
					s = s.replace("%model%", mo);
					s = s.replace("%trim1%", tr);
					s = s.replace("%trim2%", tr);
					s = s.replace("%maket%", ma);
					s = s.replace("%id1%", id);
					s = s.replace("%id2%", id);
					s = s.replace("%id3%", id);
					total += s;
				}	
			}
		}	
		outerUL += total;
		outerUL += "</ul>";
		
		if (results.length > 0) {

			$("#" + targetDivID).html(outerUL);			
			$("#" + targetDivID).show();						
			
			if (templateHTMLID.indexOf("model") >= 0) {
			
				var INIT = uniqueModelData.size() < 10 ? uniqueModelData.size() : 10;
				var SCROLL = 7;
				var TOTAL = uniqueModelData.size();
				var current = INIT;
				$('#' + carouselid).jcarousel({
					scroll:SCROLL,
					initCallback : function (carousel, state) {
						for (var i=1; i <= INIT; ++i){
							var data = uniqueModelData.get(i-1);
							if (data != null) {
								var html = GMCERTIFIED.search.getASModelItem(data, i-1, templateHTMLID);
								carousel.add(i,html);
								var x = i-1;
								var id = "id" + x;
								$("#mo-" + id).uniform();
							}	
						}
						carousel.size(TOTAL);
					},
					itemLoadCallback : function (carousel, state) {
						if (state == 'next') {
						  if (current > TOTAL) {
							return;	
						  } else {
							 var i = 1;	
							 while (i <= SCROLL) {
								  ++current;	
								  if (current > TOTAL) break;
								  if (!carousel.has(current)) {
								  	var data = uniqueModelData.get(current - 1);
								  	if (data != null) {
										carousel.add(current, GMCERTIFIED.search.getASModelItem(data, current, templateHTMLID));
										var id = "id" + current
										$("#mo-" + id).uniform();
									}	
								  } 
								  ++i;
						 	}					
						  }
						} 	
					}
				});
			}else if (templateHTMLID.indexOf("trim") >= 0) {
				$('#' + carouselid).jcarousel({vertical:true, visible:10});
				$("input[type= checkbox][name = trim]").uniform();
			}				
		}	
	},
	doTrimWarn : function (){
		var modelChecked = false;
		var wasWarned = false;
		$("input[type=checkbox][name=model]").each(function(){
			if ($(this).attr("checked")) {
				modelChecked = true;
				return;
			}
		});
		if (modelChecked == false) {
			$("#all-trims").parent().addClass("checked");
			$("#all-trims").attr("checked", true);
			$("#select-trims").parent().removeClass("checked");
			$("#select-trims").attr("checked", false);
			$("#advSearchNoTrims").fadeIn(200,function(){$(this).html("<font size='-2' color='red'>Select model(s) before selecting trim levels.</font>")});
			$("#advSearchNoTrims").fadeOut(5000, function(){$(this).html("")});
			wasWarned =  true;
			$("#trimsRadioDivCar").hide();
		}	
		return wasWarned;	
	},
	doAdvancedSearch : function(){
		$("#searchForm").attr("action", "/gate/advancedSearch");
		$("#searchForm").submit();
	},
	prepareQuickSearchModelCheckBoxes: function() {
		$("input[type=checkbox][name=model]").click(function(){
			if ($(this).attr("checked") == true) {
				$(this).parent().addClass("checked");
			} else {
				$(this).parent().removeClass("checked");
			}	
		});				
	},
	validateSearchForm : function () {
	
		var ignoreEmptyZip = $("#ignoreEmptyZip").val();
		
		var gmBadZipMessage = "Zip code has 5 digits";
	
		var ready = true;
		$("#zipError").html("");
		$("#zipError").hide();
		var val = $.trim($("#zip").val());	
		if (isEmpty(val)) {
			if (isEmpty(ignoreEmptyZip) || ignoreEmptyZip == 'false') {
				$("#zipError").html(gmBadZipMessage);
				$("#zipError").show();
				ready = false;
				$("#zip").focus();
			}	
		} else {
			if (!isZipCode(val)) {
				$("#zipError").html(gmBadZipMessage);
				$("#zipError").show();
				ready = false;
				$("#zip").focus();
			}
		}
		val = $.trim($("#distance").val());	
		if (!isInteger(val) && val != GMCERTIFIED.search.UNLIMITED) {
			val = $("#slider-distance").slider('value');
		}
		
		var yearminval = $.trim($("#yearMin").val());	
		if (isEmpty(yearminval) || !isInteger(yearminval)) yearminval = yearSliderMinGlobal;
		var yearmaxval = $.trim($("#yearMax").val());	
		if (isEmpty(yearmaxval) || !isInteger(yearmaxval)) yearmaxval = yearSliderMaxGlobal;
		
		var priceminval = $.trim($("#priceMin").val());	
		if (isEmpty(priceminval) || !isInteger(priceminval)) priceminval = priceSliderMinGlobal;
		var pricemaxval = $.trim($("#priceMax").val());	
		if (isEmpty(pricemaxval) || !isInteger(pricemaxval)) pricemaxval = priceSliderMaxGlobal;
		
		var mileageminval = $.trim($("#mileageMin").val());	
		if (isEmpty(mileageminval) || !isInteger(mileageminval)) mileageminval = mileageSliderMinGlobal;
		var mileagemaxval = $.trim($("#mileageMax").val());	
		if (isEmpty(mileagemaxval) || !isInteger(mileagemaxval)) mileagemaxval = mileageSliderMaxGlobal;
		
		return ready;	
	},
	refreshQuickSearchModelDropDown : function() {
		
		var proceed = $("#all-models").attr("checked");
		if (proceed == true) {
		  $("#qsModels").hide();
		  $("input[type=checkbox][name=model]").each(function(){$(this).attr("checked", false);});
		  $.uniform.update("input[type=checkbox][name=model]");
		  return;
		}
	
	    var make = $("#makeSel").val();
	    var bs = $("#bodyStyleSel").val();
	    var results;
	    if (!isEmpty(make)) {
		    var txt = "";
			txt += "ma:[\"" + make + "\"],";
		    if (!isEmpty(bs) && make == 'Chevrolet') {
				txt += "bs:[\"" + bs + "\"],";
		    }
		    txt = GMCERTIFIED.search.chompComma(txt);
			results = GMCERTIFIED.MMTBDB.vehicles.get(GMCERTIFIED.search.getWhereClauseObj(txt));
		} else {
			results = GMCERTIFIED.MMTBDB.allModels.get();
		}    


		if (results != null) {
			
			results.sort(GMCERTIFIED.search.makemodelSort);
			var modelsRendered = new ArrayList();
			var uniqueModelData = new ArrayList();
			for (var i =0; i < results.length; ++i) {
				var data = results[i];
				if (!modelsRendered.contains(data.mo)) {
					modelsRendered.add(data.mo);
					uniqueModelData.add(data);
				}
			}
			
			var o = "<ul id='models-carousel' class='jcarousel-skin-gmcert'></ul>";
			var carouselid = "models-carousel";
			$("#qsModels").html(o);
			$("#qsModels").show();
			
			var SCROLL = 2;
			var INIT = uniqueModelData.size() < SCROLL ? uniqueModelData.size() : SCROLL;
			var TOTAL = uniqueModelData.size();
			var current = INIT;
			$('#' + carouselid).jcarousel({
					scroll:SCROLL,
					initCallback : function (carousel, state) {
						for (var i=1; i <= INIT; ++i){
							var data = uniqueModelData.get(i-1);
							if (data != null) {
								var html = GMCERTIFIED.search.getQSModelItem(data, i-1);
								carousel.add(i,html);
								var x = i-1;
								var id = "id" + x;
								$("#" + id).uniform();
							}	
						}
						carousel.size(TOTAL);
					},
					itemLoadCallback : function (carousel, state) {
						if (state == 'next') {
						  if (current > TOTAL) {
							return;	
						  } else {
							 var i = 1;	
							 while (i <= SCROLL) {
								  ++current;	
								  if (current > TOTAL) break;
								  if (!carousel.has(current)) {
								  	var data = uniqueModelData.get(current - 1);
								  	if (data != null) {
										carousel.add(current, GMCERTIFIED.search.getQSModelItem(data, current));
										var id = "id" + current
										$("#" + id).uniform();
									}	
								  } 
								  ++i;
						 	}					
						  }
						} 	
					}
				});
				
		} 
	}
	
}
 
 