(function ($) {
$.fn.quicksearch = function (options) {
var defaults = $.extend({
ver: 1.0,
branchId: null,
stockpage: 'http:\/\/' + document.domain + '\/vehicle.html',
jsonpath: 'http://jquery.dealerbase.co.nz',
title: 'SEARCH ALL STOCK',
pagecookiename: null, //<--use page as cookiename
enablecookie: false, //<--no saving to cookie
reload: false, //<--call this only when reloading with no extra param
hidefield: null//<--future extra parameters
}, options);
var trademe = {
cssclass: {
"quicksearch": "quick-search",
"quicksearchrange": "quick-search-range",
"quicksearchpricerange": "quick-search-price-range",
"quicksearchto": "quick-search-to",
"quicksearchyearrange": "quick-search-year-range"
},
pagename: function () {
return window.location.href.substr(window.location.href.lastIndexOf("/") + 1).split(".")[0].replace(" ", "").replace("-", "");
},
id: {
"quicksearch": "quick-search",
"quicksearchmake": "quick-search-make",
"quicksearchtitle": "quick-search-title",
"quicksearchmodel": "quick-search-model",
"quicksearchbody": "quick-search-body",
"quicksearchpricefrom": "quick-search-price-from",
"quicksearchpriceto": "quick-search-price-to",
"quicksearchyearfrom": "quick-search-year-from",
"quicksearchyearto": "quick-search-year-to",
"quicksearchsubmit": "quick-search-submit",
"quicksearchall": "quick-search-all"
},
structure: {
target: null,
create: function (nodename, nodeid, nodeclass) {
var node = document.createElement(nodename);
if (nodeid) {
$(node).attr("id", nodeid);
}
if (nodeclass) {
$(node).addClass(nodeclass);
}
return $(node);
},
hidefields: function () {
if (defaults.hidefield && defaults.hidefield.length > 0) {
var field = [{ name: "make", id: trademe.id.quicksearchmake }, { name: "model", id: trademe.id.quicksearchmodel }, { name: "type", id: trademe.id.quicksearchbody }, { name: "title", id: trademe.id.quicksearchtitle}];
$.each(field, function (i, v) {
if ($.inArray(v.name, defaults.hidefield) > -1) {
$("#" + v.id).hide();
}
});
}
},
createquicksearch: function () {
var qsform = trademe.structure.create("div", trademe.id.quicksearch, trademe.cssclass.quicksearch);
var qstitle = trademe.structure.create("h1", trademe.id.quicksearchtitle, "cufon").html(defaults.title);
var make = trademe.structure.create("select", trademe.id.quicksearchmake, null).addClass("first-child");
var model = trademe.structure.create("select", trademe.id.quicksearchmodel, null);
var body = trademe.structure.create("select", trademe.id.quicksearchbody, null);
var pricefrom = trademe.structure.create("select", trademe.id.quicksearchpricefrom, trademe.cssclass.quicksearchrange + " " + trademe.cssclass.quicksearchpricerange);
var priceto = trademe.structure.create("select", trademe.id.quicksearchpriceto, trademe.cssclass.quicksearchrange + " " + trademe.cssclass.quicksearchpricerange);
var pricelabelto = trademe.structure.create("span", null, trademe.cssclass.quicksearchto).html("to");
var yearfrom = trademe.structure.create("select", trademe.id.quicksearchyearfrom, trademe.cssclass.quicksearchrange + " " + trademe.cssclass.quicksearchyearrange);
var yearto = trademe.structure.create("select", trademe.id.quicksearchyearto, trademe.cssclass.quicksearchrange + " " + trademe.cssclass.quicksearchyearrange);
var yearlabelto = trademe.structure.create("span", null, trademe.cssclass.quicksearchto).html("to");
var browseall = trademe.structure.create("a", trademe.id.quicksearchall, null).html("Browse All").attr("href", "#");
var submit = trademe.structure.create("a", trademe.id.quicksearchsubmit, null).html("Submit").attr("href", "#");
trademe.structure.target.append(qsform.append(qstitle).append(make).append(model).append(body).append(pricefrom).append(pricelabelto).append(priceto).append(yearfrom).append(yearlabelto).append(yearto).append(submit).append(browseall));
trademe.structure.hidefields();
$("#" + trademe.id.quicksearchall).bind("click", function () {
cookie("ManufacturerId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
cookie("ModelId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
cookie("VehicleTypeId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
cookie("PriceFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
cookie("PriceTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
cookie("YearFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
cookie("YearTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), null);
});
$("#" + trademe.id.quicksearchall).bind("click", trademe.structure.event.searchall);
$("#" + trademe.id.quicksearchsubmit).bind("click", trademe.structure.event.submit);
},
loadcookie: function () {
//make
if ($("#" + trademe.id.quicksearchmake).length > 0 && cookie("ManufacturerId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
$("#" + trademe.id.quicksearchmake).val(cookie("ManufacturerId" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
}
//model
if ($("#" + trademe.id.quicksearchmodel).length > 0) {
trademe.structure.modelcallback();
if (cookie("ModelId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
$("#" + trademe.id.quicksearchmodel).val(cookie("ModelId" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
}
}
//vehicletype
if ($("#" + trademe.id.quicksearchbody).length > 0 && cookie("VehicleTypeId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
$("#" + trademe.id.quicksearchbody).val(cookie("VehicleTypeId" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
}
//pricefrom
if ($("#" + trademe.id.quicksearchpricefrom).length > 0 && cookie("PriceFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
$("#" + trademe.id.quicksearchpricefrom).val(cookie("PriceFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
}
//priceto
if ($("#" + trademe.id.quicksearchpriceto).length > 0 && cookie("PriceTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
var priceto = parseInt(cookie("PriceTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
if (priceto > 0) {
priceto = (priceto / 1000) >= 1 && (priceto / 1000) <= 99 ? parseInt(priceto / 1000) * 1000 : priceto;
priceto = (priceto / 100000) >= 1 && (priceto / 100000) <= 99 ? parseInt(priceto / 100000) * 100000 : priceto;
}
$("#" + trademe.id.quicksearchpriceto).val(priceto);
}
//yearfrom
if ($("#" + trademe.id.quicksearchyearfrom).length > 0 && cookie("YearFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
$("#" + trademe.id.quicksearchyearfrom).val(cookie("YearFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
}
//yearto
if ($("#" + trademe.id.quicksearchyearto).length > 0 && cookie("YearTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""))) {
$("#" + trademe.id.quicksearchyearto).val(cookie("YearTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : "")));
}
},
modelcallback: null,
binddata: function () {
//todo: create binding per version of quicksearch and per branch
if ($("#" + trademe.id.quicksearch).length == 0) return;
if (!defaults.branchId) return;
$.getJSON(defaults.jsonpath + "/quicksearchdata.js?branchId=" + defaults.branchId + "&callback=" + (browser && browser.msie ? "?" : ""), function (data) {
if (typeof trademe.quicksearchdatafetched == 'undefined' && data) {
trademe["quicksearchdatafetched"] = true;
}
trademe["quicksearchdata"] = data;
/*binding make*/
if ($("#" + trademe.id.quicksearchmake).length > 0 && typeof trademe["quicksearchdata"]["manufacturermodel"] != 'undefined') {
$("#" + trademe.id.quicksearchmake).find("option").remove().end().append("");
$.each(trademe["quicksearchdata"]["manufacturermodel"], function (i, v) {
$("#" + trademe.id.quicksearchmake).append($("").attr("value", v.ManufacturerId).text(v.ManufacturerName));
});
}
/*binding model*/
if ($("#" + trademe.id.quicksearchmodel).length > 0 && typeof trademe["quicksearchdata"]["manufacturermodel"] != 'undefined') {
trademe.structure.modelcallback = function () {
$("#" + trademe.id.quicksearchmodel).find("option").remove().end().append("");
$.each(trademe["quicksearchdata"]["manufacturermodel"], function (i, v) {
if (v.ManufacturerId == $("#" + trademe.id.quicksearchmake).val()) {
$.each(this.Models, function (_i, _v) {
$("#" + trademe.id.quicksearchmodel).append($("").attr("value", _v.ModelId).text(_v.ModelName));
});
}
});
};
trademe.structure.modelcallback();
$("#" + trademe.id.quicksearchmake).bind("change", function () {
trademe.structure.modelcallback();
});
}
/*binding body*/
if ($("#" + trademe.id.quicksearchbody).length > 0 && typeof trademe["quicksearchdata"]["vehicletype"] != 'undefined') {
$("#" + trademe.id.quicksearchbody).find("option").remove().end().append("");
$.each(trademe["quicksearchdata"]["vehicletype"], function (i, v) {
$("#" + trademe.id.quicksearchbody).append($("").attr("value", v.Id).text(v.Name));
});
}
/*binding Price */
if ($("." + trademe.cssclass.quicksearchpricerange).length > 0 && typeof trademe["quicksearchdata"]["price"] != 'undefined') {
$("." + trademe.cssclass.quicksearchpricerange).find("option").remove().end().append("");
$.each(trademe["quicksearchdata"]["price"], function (i, v) {
$("." + trademe.cssclass.quicksearchpricerange).append($("").attr("value", v.Value).text(v.Text));
});
}
/* bind Year */
if ($("." + trademe.cssclass.quicksearchyearrange).length > 0 && typeof trademe["quicksearchdata"]["year"] != 'undefined') {
$("." + trademe.cssclass.quicksearchyearrange).find("option").remove().end().append("");
var y = [];
$.each(trademe["quicksearchdata"]["year"], function (i, v) {
y.push({ "Year": parseInt(v.Year) });
});
y.sort(function (a, b) { return b.Year - a.Year; });
trademe["quicksearchdata"]["year"] = y;
//descending
$.each(trademe["quicksearchdata"]["year"], function (i, v) {
$("." + trademe.cssclass.quicksearchyearrange).append($("").attr("value", v.Year).text(v.Year));
});
}
trademe.structure.loadcookie();
})
.error(function (jqxhr, settings, exception) {
var x = 0;
});
$("#" + trademe.id.quicksearchmake).append($(""));
$("#" + trademe.id.quicksearchmodel).append($(""));
$("." + trademe.cssclass.quicksearchpricerange).append($(""));
$("." + trademe.cssclass.quicksearchyearrange).append($(""));
},
hasQuickSearch: function () {
return ($("#" + trademe.id.quicksearch).length > 0);
},
loaddefaultstyle: function () {
if ($("head").find("link#_quicksearch-theme").length == 0) {
var link = trademe.structure.create("link", "_quicksearch-theme", null);
var url = defaults.jsonpath + "/css/quicksearch.css";
link.attr("rel", "stylesheet").attr("type", "text/css").attr("href", url);
//for IE
if ((typeof $.browser != 'undefined' && $.browser.msie) || document.createStyleSheet) { document.createStyleSheet(url); }
$("head").prepend(link);
}
},
fetch: function (url, callback, dataType) {
dataType = !dataType ? "text" : dataType;
$.ajax({
url: url,
dataType: dataType, cache: true, ifModified: true,
success: function (jqxhr, settings, exception) {
if (!jqxhr) return;
if (callback) {
callback(jqxhr, settings, exception);
}
}
});
},
event: {
searchall: function (e) {
//this will clear all cookies
var allcookies = document.cookie.split(";");
var names = ["ManufacturerId", "ModelId", "VehicleTypeId", "PriceFrom", "PriceTo", "YearFrom", "YearTo"];
$.each(allcookies, function (i, v) {
var name = v.split("=")[0].split("_")[0].replace(/^\s+|\s+$/g, '');
if ($.inArray(name, names) > -1) {
cookie(v.split("=")[0].replace(/^\s+|\s+$/g, ''), null);
}
});
window.location.href = defaults.stockpage + (defaults.stockpage.indexOf("showall=1") == -1 ? "?showall=1" : "");
},
submit: function (e) {
var query = [];
cookie("ManufacturerId" + "_" + trademe.pagename(), null);
cookie("ModelId" + "_" + trademe.pagename(), null);
cookie("VehicleTypeId" + "_" + trademe.pagename(), null);
cookie("PriceFrom" + "_" + trademe.pagename(), null);
cookie("PriceTo" + "_" + trademe.pagename(), null);
cookie("YearFrom" + "_" + trademe.pagename(), null);
cookie("YearTo" + "_" + trademe.pagename(), null);
//ManufacturerId
if ($("#" + trademe.id.quicksearchmake).length > 0 && $("#" + trademe.id.quicksearchmake).val() && $("#" + trademe.id.quicksearchmake).val() != "0") {
query.push("ManufacturerId=" + $("#" + trademe.id.quicksearchmake).val());
if (defaults.enablecookie) {
cookie("ManufacturerId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), $("#" + trademe.id.quicksearchmake).val());
}
}
//ModelId
if ($("#" + trademe.id.quicksearchmodel).length > 0 && $("#" + trademe.id.quicksearchmodel).val() && $("#" + trademe.id.quicksearchmodel).val() != "0") {
query.push("ModelId=" + $("#" + trademe.id.quicksearchmodel).val());
if (defaults.enablecookie) {
cookie("ModelId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), $("#" + trademe.id.quicksearchmodel).val());
}
}
//VehicleType
if ($("#" + trademe.id.quicksearchbody).length > 0 && $("#" + trademe.id.quicksearchbody).val() && $("#" + trademe.id.quicksearchbody).val() != "0") {
query.push("VehicleTypeId=" + $("#" + trademe.id.quicksearchbody).val());
if (defaults.enablecookie) {
cookie("VehicleTypeId" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), $("#" + trademe.id.quicksearchbody).val());
}
}
//Price
if ($("." + trademe.cssclass.quicksearchpricerange).length > 0) {
var pricefrom = $("#" + trademe.id.quicksearchpricefrom).val() && $("#" + trademe.id.quicksearchpricefrom).val() != "0" ? parseInt($("#" + trademe.id.quicksearchpricefrom).val()) : 0;
var priceto = $("#" + trademe.id.quicksearchpriceto).val() && $("#" + trademe.id.quicksearchpriceto).val() != "0" ? parseInt($("#" + trademe.id.quicksearchpriceto).val()) : 0; ;
if (pricefrom > priceto) {
$("#" + trademe.id.quicksearchpricefrom).val(priceto);
$("#" + trademe.id.quicksearchpriceto).val(pricefrom);
pricefrom = $("#" + trademe.id.quicksearchpricefrom).val() && $("#" + trademe.id.quicksearchpricefrom).val() != "0" ? parseInt($("#" + trademe.id.quicksearchpricefrom).val()) : 0;
priceto = $("#" + trademe.id.quicksearchpriceto).val() && $("#" + trademe.id.quicksearchpriceto).val() != "0" ? parseInt($("#" + trademe.id.quicksearchpriceto).val()) : 0;
}
if (pricefrom > 0 || priceto > 0) {
query.push("PriceFrom=" + pricefrom);
if (priceto > 0) {
priceto = (priceto / 1000) >= 1 && (priceto / 1000) <= 99 ? priceto + 999 : priceto;
priceto = (priceto / 100000) >= 1 && (priceto / 100000) <= 99 ? priceto + 99999 : priceto;
}
query.push("PriceTo=" + priceto);
if (defaults.enablecookie) {
cookie("PriceFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), pricefrom);
cookie("PriceTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), priceto);
}
}
}
//Year
if ($("." + trademe.cssclass.quicksearchyearrange).length > 0) {
var yearfrom = $("#" + trademe.id.quicksearchyearfrom).val() && $("#" + trademe.id.quicksearchyearfrom).val() != "0" ? parseInt($("#" + trademe.id.quicksearchyearfrom).val()) : 0;
var yearto = $("#" + trademe.id.quicksearchyearto).val() && $("#" + trademe.id.quicksearchyearto).val() != "0" ? parseInt($("#" + trademe.id.quicksearchyearto).val()) : 0; ;
if (yearfrom > yearto) {
$("#" + trademe.id.quicksearchyearfrom).val(yearto);
$("#" + trademe.id.quicksearchyearto).val(yearfrom);
yearfrom = $("#" + trademe.id.quicksearchyearfrom).val() && $("#" + trademe.id.quicksearchyearfrom).val() != "0" ? parseInt($("#" + trademe.id.quicksearchyearfrom).val()) : 0;
yearto = $("#" + trademe.id.quicksearchyearto).val() && $("#" + trademe.id.quicksearchyearto).val() != "0" ? parseInt($("#" + trademe.id.quicksearchyearto).val()) : 0; ;
}
if (yearfrom > 0 || yearto > 0) {
query.push("YearFrom=" + yearfrom);
query.push("YearTo=" + yearto);
if (defaults.enablecookie) {
cookie("YearFrom" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), yearfrom);
cookie("YearTo" + (defaults.pagecookiename ? "_" + trademe.pagename() : ""), yearto);
}
}
}
//show all
if ($.inArray("showall=1", query) == -1 && defaults.stockpage.indexOf("showall=1") == -1) {
query.push("showall=1");
}
window.location.href = defaults.stockpage + (query.length > 0 ? (defaults.stockpage.indexOf("?") == -1 ? "?" : "&") + query.join("&") : "");
}
}
}
};
return this.each(function (i, obj) {
trademe.structure.target = $(this);
if (defaults.reload) {
var param = eval("[{" + $(this).attr("param") + "}]");
defaults = $.extend(defaults, param[0]);
defaults.reload = false;
}
//if hidden dont do this
if ($(this).is(":visible")) {
//get default theme for stockpage
trademe.structure.loaddefaultstyle();
if (!trademe.structure.hasQuickSearch()) {
trademe.structure.createquicksearch();
trademe.structure.binddata();
} else {
trademe.structure.binddata();
}
}
});
};
})(jQuery);
$(document).ready(function () {
if ($("#quick-search-form").length > 0) {
var param = eval("[{"+$("#quick-search-form").attr("param")+"}]");
$("#quick-search-form").quicksearch(param[0]);
}
});