/*
v1.01 Added specials
v1.02 Properly handled querystring for return to stock page, added viewport autoheight depends on comments,remove features field if has no value, efficiency ratings added, data access security, preload images, added thumbnails, extrascript
*/
(function ($) {
$.fn.TradeMeMotorsStockList = function (options) {
var defaults = $.extend({
ver: 1.02,
datasource: null,
pagetype: 0, /*0 - stocklist, 1 - details, 2- compare*/
detailspage: 'http:\/\/' + document.domain + '\/details.html',
stockpage: 'http:\/\/' + document.domain + '\/vehicle.html',
viewtype: 0, /*0 - galleryview, 1 - listview*/
marker: null,
loancalculator: false,
financethisvehicle: false,
playvideo: false,
maxgalleryview: 12,
maxlistview: 5
}, options);
var fuelefficiency = {
"rating": null,
"value": null,
"cost": null,
"message": null,
"toString": function () {
var effinfo = [];
if (this.rating) {
effinfo.push("This vehicle has a Fuel Economy Star Rating of " + this.rating + " out of 6.");
}
if (this.value && parseFloat(this.value) > 0) {
effinfo.push("It consumes " + this.value + "L litres per 100km travelled.");
}
if (this.cost) {
effinfo.push("The Estimated Annual Cost of running this vehicle is " + this.cost + ".");
}
if (this.message) {
effinfo.push(this.message);
}
//blank fillup
if (parseFloat(this.value) == 0) {
effinfo.push("
");
}
if (effinfo.length > 0) {
return effinfo.join(" ");
}
return null;
},
"tooltip": function () {
var tooltip = trademe.structure.create("div", "fuel-economy-tooltip", "ui-curve-med ui-shadow-large");
if (this.toString()) {
tooltip
.append(trademe.structure.create("div", null, "arrow-left-border"))
.append(trademe.structure.create("div", null, "arrow-left"))
.append(trademe.structure.create("div", null, "fuel-rating-medium fuel-rating-medium-" + this.rating.replace(".", "_")))
.append(trademe.structure.create("h5", null, null).html("Vehicle Fuel Economy Labelling"))
.append(trademe.structure.create("p", null, null).html(this.toString()))
.append(trademe.structure.create("p", null, "disclaimer").html("Disclaimer: The Fuel Saver Information displayed here is provided for comparative purposes. Your actual cost per year and fuel consumption will vary from that shown, depending on factors such as vehicle condition and any vehicle modifications, driving style, traffic conditions, distance travelled and fuel price variations. You should not expect to meet exactly what this information says. Visit www.fuelsaver.govt.nz to find out more about this information and fuel saver labels, and how to improve fuel economy."));
//return tooltip;
if ($("#fuel-economy-tooltip").length > 0) {
$("#fuel-economy-tooltip").remove();
}
$("body").prepend(tooltip);
$("." + trademe.cssclass.fueleconomyhelp).TradeMeMotorsTooltip({ tooltipid: "fuel-economy-tooltip" });
return true;
}
return null;
}
};
var carousel = {
"create": function () {
if ($("#carousel").length > 0) {
$("#carousel").remove();
}
var c = trademe.structure.create("div", "carousel", null);
trademe.structure.target.after(c);
$("#carousel").TradeMeMotorsCarousel({ datasource: vehicles, carouseltype: 0 });
$("#carousel").appendTo("#details-viewport .details-form");
}
};
var listing = {
minpage: 0, maxpage: 0, totalpage: 0, currentpage: 0, currentmakeId: 0, currentsortby: 7, currentviewtype: 0, populatecallback: null,
init: function () {
if (!listing.hasViewport()) {
return;
}
if (!trademe.structure.target.hasClass(trademe.cssclass.viewportcontainer)) {
trademe.structure.target.addClass(trademe.cssclass.viewportcontainer);
}
//do load cookie 1st
listing.loadcookie();
if (!listing.hasHeader()) {
listing.createHeader();
trademe.structure.fetchlistingextra();
listing.addFilterOption();
}
if (!listing.hasFooter()) {
listing.createFooter();
}
listing.createContainer();
},
hasViewport: function () {
if (defaults.pagetype == trademe.enume.pagetype.stock) {
return (trademe.structure.target.attr("id") == trademe.id.viewport);
}
return false;
},
hasHeader: function () {
return (trademe.structure.target.find("." + trademe.cssclass.header).length > 0);
},
hasFooter: function () {
return (trademe.structure.target.find("." + trademe.cssclass.footer).length > 0);
},
loadcookie: function () {
//can be optimized, todo next
var cookienames = [{ listingobj: "currentpage", name: "currentpage" }, { listingobj: "currentmakeId", name: "ManufacturerId" }, { listingobj: "currentsortby", name: "SortBy" }, { listingobj: "currentviewtype", name: "viewtype"}];
$.each(cookienames, function (i, v) {
if (cookie(v.name) && typeof listing[v.listingobj] != 'undefined') {
listing[v.listingobj] = $.IsNumber(cookie(v.name)) ? parseInt(cookie(v.name)) : cookie(v.name);
}
});
},
createHeader: function () {
var header = trademe.structure.create("div", null, trademe.cssclass.header);
var galleryview = trademe.structure.create("a", null, trademe.cssclass.galleryview).attr("href", "");
var listview = trademe.structure.create("a", null, trademe.cssclass.listview).attr("href", "");
var label = trademe.structure.create("span", trademe.id.totallisting, null);
var makelabel = trademe.structure.create("span", trademe.id.makelabel, null).html("Make");
var sortbylabel = trademe.structure.create("span", trademe.id.sortbylabel, null).html("Sort By");
var makeselect = trademe.structure.create("select", trademe.id.makeoption, null);
var sortbyselect = trademe.structure.create("select", trademe.id.sortoption, null);
trademe.structure.target
.append(header
.append(galleryview)
.append(listview)
.append(label)
.append(sortbyselect)
.append(sortbylabel)
.append(makeselect)
.append(makelabel)
);
galleryview.bind("click", trademe.event.galleryviewclicked);
listview.bind("click", trademe.event.listviewclicked);
$("#" + trademe.id.makeoption).bind("change", trademe.event.makeoptionclicked);
$("#" + trademe.id.sortoption).bind("change", trademe.event.sortbyclicked);
},
createFooter: function () {
var footer = trademe.structure.create("div", null, trademe.cssclass.footer);
var poweredby = trademe.structure.create("div", null, trademe.cssclass.poweredby).html("Powered by ").append($("").attr("href", "http://www.trademe.co.nz/motors").attr("target", "_new").html("TradeMe Motors"));
trademe.structure.target
.append(footer.append(poweredby));
footer.css({ marginTop: parseInt(trademe.structure.target.css("height").replace("px", "")), width: trademe.structure.target.width() });
},
createContainer: function () {
var container = trademe.structure.create("div", trademe.id.itemcontainerlist, trademe.cssclass.itemcontainerlist);
if (trademe.structure.target.find("." + trademe.cssclass.itemcontainerlist).length == 0) {
trademe.structure.target.append(container);
}
},
arrangeGalleryView: function () {
if ($(".item-container").length == 0) return;
var parentWidth = $(".gallery-view").innerWidth();
var item_per_row = Math.floor(parentWidth / $(".item-container").innerWidth());
var marginLeft = parseInt($(".item-container").css("marginLeft").replace("px", ""));
var marginTop = parseInt($(".item-container").css("marginTop").replace("px", ""));
//set position of each item-container
var item_index = 1;
var item_left = 0;
var item_top = 0;
$.each($(".gallery-view .item-container"), function (i, v) {
if (item_index > item_per_row) {
item_index = 1;
item_left = 0;
item_top += $(".item-container").outerHeight() + marginTop;
}
$(this).css({ 'left': item_left, 'top': item_top });
item_left = ($(".item-container").outerWidth() + marginLeft) * item_index;
$(this).data("imageindex", 0);
//$(this).prepend("
");
item_index++;
});
},
setpage: function (a) {
var maxpaging = listing.currentviewtype == trademe.enume.pagetype.stock ? defaults.maxgalleryview : defaults.maxlistview;
listing.totalpage = Math.ceil((a.length) / maxpaging);
listing.currentpage = listing.totalpage > 0 && listing.currentpage == 0 ? listing.currentpage = 1 : listing.currentpage;
listing.minpage = Math.min(Math.round(Math.max(1, listing.currentpage - (maxpaging / 2))), Math.max(1, listing.totalpage - maxpaging + 1));
listing.maxpage = Math.max(maxpaging, listing.minpage + maxpaging);
listing.maxpage = (listing.maxpage > listing.totalpage ? listing.totalpage : listing.maxpage);
$("." + trademe.cssclass.pagecontainer).remove();
if (listing.maxpage == 1) return;
var pg = trademe.structure.create("div", null, trademe.cssclass.pagecontainer);
pg.append(trademe.structure.create("a", null, trademe.cssclass.pageprev + " ui-curve-small ui-shadow-small").html("Prev").attr("href", ""));
for (var i = listing.minpage; i <= listing.maxpage; i++) {
var p = trademe.structure.create("a", null, trademe.cssclass.pagelink + " ui-curve-small ui-shadow-small" + (listing.currentpage == i ? " selected" : "")).html(i).attr("href", "").data("number", i);
pg.append(p);
}
pg.append(trademe.structure.create("a", null, trademe.cssclass.pagenext + " ui-curve-small ui-shadow-small").html("Next").attr("href", ""));
$("." + trademe.cssclass.footer).append(pg);
$("." + trademe.cssclass.pagelink).bind("click", trademe.event.pagelinkclicked);
$("." + trademe.cssclass.pagenext).bind("click", trademe.event.pagenextclicked);
$("." + trademe.cssclass.pageprev).bind("click", trademe.event.pageprevclicked);
if (listing.currentpage <= 1) {
$("." + trademe.cssclass.pageprev).hide();
} else {
$("." + trademe.cssclass.pageprev).show();
}
if (listing.currentpage >= listing.maxpage) {
$("." + trademe.cssclass.pagenext).hide();
} else {
$("." + trademe.cssclass.pagenext).show();
}
},
populate: function () {
if (!defaults.datasource) {
return;
}
var container = trademe.structure.target.find("." + trademe.cssclass.itemcontainerlist);
container.html("");
container.focus();
container.removeClass("gallery-view").removeClass("list-view");
//get from querystring
var _datasource = [];
$.each(defaults.datasource, function (i, v) {
if (trademe.structure.foundinquery({
"ManufacturerId": v.manufacturerId,
"ModelId": v.modelId,
"PriceFrom": v.price.replace("$", "").replace(",", ""),
"PriceTo": v.price.replace("$", "").replace(",", ""),
"TransmissionTypeId": v.transmissiontypeid,
"OdometerFrom": v.odometer.replace(",", ""),
"OdometerTo": v.odometer.replace(",", ""),
"VehicleTypeId": v.vehicletypeid,
"new": v.isnew == "true" ? "1" : "0",
"specials": v.isspecial == "true" ? "1" : "0"
}) && trademe.structure.foundinfilter({ "ManufacturerId": v.manufacturerId })) {
_datasource.push(v);
}
});
//lets sort
_datasource = trademe.structure.sortthis(_datasource);
//set page control
listing.setpage(_datasource);
//initially display all counts
if (_datasource.length > 0) {
$("#" + trademe.id.totallisting).html("We have " + _datasource.length + " vehicle(s) listed.");
}
//gallery view
if (listing.currentviewtype == trademe.enume.viewtype.galleryview) {
container.addClass("gallery-view");
$.each(_datasource.slice((listing.currentpage * (defaults.maxgalleryview)) - defaults.maxgalleryview, listing.currentpage * (defaults.maxgalleryview)), function (i, v) {
/**************/
//create items
var item = trademe.structure.create("div", "item-" + v.id, "item-container");
var img = trademe.structure.create("img", null, "preview-image").attr("src", v.images.length > 0 ? v.images[0] : "images\/imageunavailable_medium.png");
var price = trademe.structure.create("label", null, "price").html(v.price);
//var year = trademe.structure.create("label", null, "year").html(v.year);
var pricelabel = trademe.structure.create("label", null, "pricelabel").html("Price");
var title = trademe.structure.create("label", null, "title").html((v.year ? v.year + " " : "") + "" + v.makemodel + "" + (v.modeldetails ? " " + v.modeldetails : ""));
var previcon = trademe.structure.create("a", null, "prev-icon").attr("href", "");
var nexticon = trademe.structure.create("a", null, "next-icon").attr("href", "");
var imgindex = trademe.structure.create("span", null, "img-index").html((v.images.length > 0 ? "1" + " of " + v.images.length : ""));
if (v.images.length == 0) {
previcon.attr("style", "display:none;");
nexticon.attr("style", "display:none;");
}
item.append("\r\n");
item.append(img).append("\r\n")
.append(price).append("\r\n")
.append(pricelabel).append("\r\n")
.append(title).append("\r\n")
.append(previcon).append("\r\n")
.append(imgindex).append("\r\n")
.append(nexticon).append("\r\n");
//execute extrascript
if (typeof listing.fetchedlistingextra != 'undefined' && listing.fetchedlistingextra == true) {
if (listing.listingextraescript) {
listing.listingextraescript(v, item);
}
}
container.append("\r\n");
container.append(item.clone()).append("\r\n");
item = null;
/**************/
});
listing.arrangeGalleryView();
$(".item-container a.prev-icon").bind("click", trademe.event.prevclick);
$(".item-container a.next-icon").bind("click", trademe.event.nextclick);
}
//[2] list view type
if (listing.currentviewtype == trademe.enume.viewtype.listview) {
container.addClass("list-view");
$.each(_datasource.slice((listing.currentpage * (defaults.maxlistview)) - defaults.maxlistview, listing.currentpage * (defaults.maxlistview)), function (i, v) {
if (trademe.structure.foundinquery({ "ManufacturerId": v.manufacturerId, "ModelId": v.modelId,
"PriceFrom": v.price.replace("$", "").replace(",", ""),
"PriceTo": v.price.replace("$", "").replace(",", ""),
"TransmissionTypeId": v.transmissiontypeid,
"OdometerFrom": v.odometer.replace(",", ""),
"OdometerTo": v.odometer.replace(",", ""),
"VehicleTypeId": v.vehicletypeid,
"new": v.isnew == "true" ? "1" : "0",
"specials": v.isspecial == "true" ? "1" : "0"
})) {
//create items
var item = trademe.structure.create("div", "item-" + v.id, "item-container");
var img = trademe.structure.create("img", null, "preview-image").attr("src", v.images.length > 0 ? v.images[0] : "images\/imageunavailable_medium.png");
var price = trademe.structure.create("label", null, "price").html(v.price);
var title = trademe.structure.create("label", null, "title").html((v.year ? v.year + " " : "") + "" + v.makemodel + "" + (v.modeldetails ? " " + v.modeldetails : ""));
var description = trademe.structure.create("label", null, "description").html(v.description);
item.append("\r\n");
item.append(img).append("\r\n")
.append(price).append("\r\n")
.append(title).append("\r\n")
.append(description).append("\r\n");
//execute extrascript
if (typeof listing.fetchedlistingextra != 'undefined' && listing.fetchedlistingextra == true) {
if (listing.listingextraescript) {
listing.listingextraescript(v, item);
}
}
container.append("\r\n");
container.append(item.clone()).append("\r\n");
}
});
var marginTop = parseInt($(".item-container").css("marginTop").replace("px", ""));
var item_top = 0;
$.each($(".list-view .item-container"), function (i, v) {
$(this).css({ 'top': item_top });
item_top += $(".item-container").outerHeight() + marginTop;
});
}
//bind item click
$(".item-container").bind("click", trademe.event.itemclick);
},
populatemakeoption: function () {
if (typeof trademe.selection.fetched == 'undefined') {
trademe.structure.fetchselectionjson(
'http://' + document.domain + '/scripts/selectionjson.js?cached=1',
function (jqxhr, settings, exception) {
if (typeof trademe.selection.fetched == 'undefined') {
trademe.selection["fetched"] = true;
}
var arr_data = jqxhr.replace(new RegExp('\r', 'g'), '').replace(new RegExp('\n', 'g'), '').split(";");
$.each(arr_data, function (i, v) {
if (v) {
var o = v.replace(new RegExp('var', 'g'), '').split("=");
if (typeof trademe.selection[o[0].trim()] == 'undefined') {
trademe.selection[o[0].trim()] = eval(o[1].trim());
}
}
});
var c = window.setTimeout(function () {
$("#" + trademe.id.makeoption).html("");
$("#" + trademe.id.makeoption).append($("").attr("value", "0").attr("selected", "true").html("All Makes"));
$.each(trademe.selection.makeoption, function (i, v) {
$("#" + trademe.id.makeoption).append($("").attr("value", v.value).html(v.display));
});
if (listing.currentmakeId) {
$("#" + trademe.id.makeoption).val(listing.currentmakeId);
}
$.each(trademe.selection.sortoption, function (i, v) {
$("#" + trademe.id.sortoption).append($("").attr("value", v.value).html(v.display));
});
if (listing.currentsortby) {
$("#" + trademe.id.sortoption).val(listing.currentsortby);
}
if (listing.populatecallback) {
listing.populatecallback();
}
window.clearTimeout(c);
}, 10);
});
}
},
addFilterOption: function () {
listing.populatemakeoption();
}
};
var trademe = {
"cssclass": {
"itemcontainerlist": "item-container-list",
"viewportcontainer": "viewport-container",
"detailscontainer": "details-container",
"header": "headerbar",
"footer": "footerbar",
"poweredby": "poweredby",
"viewoption": "view-option",
"galleryview": "icon gallery-icon gallery-view-link",
"listview": "icon gallery-list-icon list-view-link",
"galleryviewlink": "gallery-view-link",
"listviewlink": "list-view-link",
"detailsform": "details-form",
"vehicleattribute": "vehicle-attribute",
"vehiclefeatures": "vehicle-features",
"vehiclecomments": "vehicle-comments",
"closemedium": "close-medium",
"emailseller": "email-seller",
"fueleconomylabel": "fuel-economy-label",
"fueleconomyhelp": "fuel-economy-help",
"pagecontainer": "page-container",
"pagelink": "page-link",
"pagenext": "page-next",
"pageprev": "page-prev"
},
id: {
"itemcontainerlist": "item-container-list",
"viewport": "gallery-viewport",
"totallisting": "total-listing-count",
"makelabel": "make-label",
"sortbylabel": "sortby-label",
"sortoption": "sort-option",
"makeoption": "make-option",
"detailsviewport": "details-viewport",
"detailsform": "details-form",
"detailstitle": "title",
"detailsprice": "price",
"vehicleattribute": "vehicle-attribute",
"vehiclefeatures": "vehicle-features",
"vehiclecomments": "vehicle-comments",
"actionlinks": "action-links",
"printvehicle": "print-vehicle",
"loancalculator": "loan-calculator",
"financethis": "finance-this",
"playvideo": "play-video",
"emailseller": "email-seller",
"carousel": "carousel-basic"
},
selection: {
sortoption:
[
{ "value": 0, "display": "Lowest Price", "classname": "price", "sortorder": 0, "objectname": "price" },
{ "value": 1, "display": "Highest Price", "classname": "price", "sortorder": 1, "objectname": "price" },
{ "value": 2, "display": "Oldest Vehicle", "classname": "year", "sortorder": 0, "objectname": "year" },
{ "value": 3, "display": "Newest Vehicle", "classname": "year", "sortorder": 1, "objectname": "year" },
{ "value": 4, "display": "Lowest Km", "classname": "odometer", "sortorder": 0, "objectname": "odometer" },
{ "value": 5, "display": "Highest Km", "classname": "odometer", "sortorder": 1, "objectname": "odometer" },
{ "value": 6, "display": "Latest Listing", "classname": "created", "sortorder": 1, "objectname": "created" },
{ "value": 7, "display": "Make/Model (A-Z)", "classname": "makemodel", "sortorder": 0, "objectname": "makemodel" }
],
hiddendata:
[
"price", "odometer", "cc", "year", "makemodel"
]
},
"enume": {
viewtype: { "galleryview": 0, "listview": 1 },
rotate: { "right": 0, "left": 1 },
pagetype: { "stock": 0, "details": 1, "compare": 2 }
},
selectedvalue: {
viewtype: 0, commenttop: 310
},
link: {
plugincsspath: "http://" + document.domain + "/css/trademe.motors.stocklist.css"
},
structure: {
target: null,
populatedetailscallback: null,
hasHeader: function () {
return (this.target.find("." + trademe.cssclass.header).length > 0);
},
hasViewport: function () {
if (defaults.pagetype == trademe.enume.pagetype.stock) {
return (this.target.attr("id") == trademe.id.viewport);
}
if (defaults.pagetype == trademe.enume.pagetype.details) {
return (this.target.attr("id") == trademe.id.detailsviewport);
}
return false;
},
hasTMMotorsCss: function () {
return ($("head").find("script[src*='" + trademe.link.plugincsspath.replace("http:\/\/" + document.domain + "\/", "") + "']").length > 0);
},
hasDetailsForm: function () {
if (defaults.pagetype == trademe.enume.pagetype.details) {
return (this.target.find(trademe.cssclass.detailsform).length > 0);
}
return false;
},
addHeadCss: function () {
var css = this.createCssLink(trademe.link.plugincsspath);
if (!this.hasTMMotorsCss()) {
if (document.createStyleSheet) {
document.createStyleSheet(css);
} else {
$("head").append(css);
}
}
},
createHeader: function () {
this.target.append(
$("")
.addClass(trademe.cssclass.header)
.append($("VIEW BY
")
.addClass(trademe.cssclass.viewoption)
));
this.target
.find("." + trademe.cssclass.viewoption + " span")
.after($("").attr("href", "javascript:return false;")
.addClass(trademe.cssclass.galleryview)
.click(trademe.event.galleryviewclick));
this.target
.find("." + trademe.cssclass.viewoption + " span")
.after($("").attr("href", "javascript:return false;")
.addClass(trademe.cssclass.listview)
.click(trademe.event.listviewclick));
},
createcontainer: function () {
//create item-container-list
var containerlist = this.create("div", trademe.id.itemcontainerlist, trademe.cssclass.itemcontainerlist);
if (this.target.find("." + trademe.cssclass.itemcontainerlist).length == 0) {
this.target.append(containerlist);
}
},
createdetailsform: function () {
var detailsform = this.create("div", null, trademe.cssclass.detailsform);
var qs = [];
$.each(window.location.search.substring(1).split("&"), function (i, v) {
if (v.split("=")[0] != "id") {
qs.push(v);
}
});
var closebutton = this.create("a", null, trademe.cssclass.closemedium).attr("href", defaults.stockpage + (qs && qs.length > 0 ? "?" + qs : ""));
var title = this.create("h1", trademe.id.detailstitle, null);
var price = this.create("div", trademe.id.detailsprice, "price-tag")
.append(this.create("div", null, "arrow-right"));
var actionlink = trademe.structure.create("div", trademe.id.actionlinks, null)
.append(trademe.structure.create("a", trademe.id.printvehicle, null).html("Print Vehicle").attr("href", "#"));
if (defaults.loancalculator) {
actionlink.append(trademe.structure.create("a", trademe.id.loancalculator, null).html("Loan Calculator").attr("href", "#"));
}
if (defaults.financethisvehicle) {
actionlink.append(trademe.structure.create("a", trademe.id.financethis, null).html("Finance this Vehicle").attr("href", "finance.aspx?id=" + querystring("id")));
}
if (defaults.playvideo) {
actionlink.append(trademe.structure.create("a", trademe.id.playvideo, null).html("Play Video").attr("href", "#"));
}
if ($("." + trademe.cssclass.emailseller).length == -1) {
actionlink.append(trademe.structure.create("a", trademe.id.emailseller, trademe.cssclass.emailseller).html("Email the Seller").attr("href", "#"));
} else if ($("#" + trademe.id.actionlinks).find("." + trademe.cssclass.emailseller).length == 0) {
actionlink.append($("." + trademe.cssclass.emailseller));
}
var attribute = this.create("dl", trademe.id.vehicleattribute, trademe.cssclass.vehicleattribute);
var features = this.create("div", trademe.id.vehiclefeatures, trademe.cssclass.vehiclefeatures);
var comments = this.create("div", trademe.id.vehiclecomments, trademe.cssclass.vehiclecomments);
if (!trademe.structure.hasDetailsForm()) {
this.target.append(detailsform);
}
var margin = detailsform.css("marginTop") ? parseInt(detailsform.css("marginTop")) : 10;
detailsform
.width(detailsform.parent().innerWidth() - (margin * 2))
//.height(detailsform.parent().innerHeight() - (margin * 2))
.css({ "marginTop": margin, "marginLeft": margin, "height": "100%" })
.addClass("ui-shadow-med")
.addClass("ui-curve-small")
.append(closebutton)
.append(title)
.append(price)
.append(actionlink)
.append(attribute)
.append(features)
.append(comments);
$("#" + trademe.id.printvehicle).bind("click", trademe.event.printthis);
},
initcontainerview: function () {
//add class to viewport
if (!this.target.hasClass(trademe.cssclass.viewportcontainer)) {
this.target.addClass(trademe.cssclass.viewportcontainer);
}
//add header bar
if (!trademe.structure.hasHeader()) {
trademe.structure.createHeader();
}
this.createcontainer();
},
createCssLink: function (path) {
return "";
},
initdetails: function () {
//add class to viewport
if (!this.target.hasClass(trademe.cssclass.detailscontainer)) {
this.target.addClass(trademe.cssclass.detailscontainer);
}
//add form
if (!trademe.structure.hasDetailsForm()) {
trademe.structure.createdetailsform();
}
//add post script
trademe.structure.fetchdetailsextra();
},
foundinquery: function (queryStrings, tofind) {
var isfound = false;
if (window.location.search) {
var ismatchedarr = [];
$.each(queryStrings, function (i, v) {
if (querystring(i) && i.indexOf("From") == -1 && i.indexOf("To") == -1) {
if (querystring(i) == v) {
ismatchedarr.push(true);
} else {
ismatchedarr.push(false);
}
}
if (i == "PriceFrom" || i == "PriceTo") {
var ismatched = false;
if (querystring("PriceFrom") != "0" && querystring("PriceTo") != "0" &&
parseInt(querystring("PriceFrom")) <= parseInt(v) && parseInt(querystring("PriceTo")) >= parseInt(v)) {
ismatched = true;
}
if (querystring("PriceFrom") != "0" && querystring("PriceTo") == "0" &&
parseInt(querystring("PriceFrom")) <= parseInt(v)) {
ismatched = true;
}
if (querystring("PriceFrom") == "0" && querystring("PriceTo") != "0" &&
parseInt(querystring("PriceTo")) >= parseInt(v)) {
ismatched = true;
}
if (querystring(i)) {
if (ismatched) {
ismatchedarr.push(true);
} else {
ismatchedarr.push(false);
}
}
}
if (i == "OdometerFrom" || i == "OdometerTo") {
var ismatched = false;
if (querystring("OdometerFrom") != "0" && querystring("OdometerTo") != "0" &&
parseInt(querystring("OdometerFrom")) <= parseInt(v) && parseInt(querystring("OdometerTo")) >= parseInt(v)) {
ismatched = true;
}
if (querystring("OdometerFrom") != "0" && querystring("OdometerTo") == "0" &&
parseInt(querystring("OdometerFrom")) <= parseInt(v)) {
ismatched = true;
}
if (querystring("OdometerFrom") == "0" && querystring("OdometerTo") != "0" &&
parseInt(querystring("OdometerTo")) >= parseInt(v)) {
ismatched = true;
}
if (querystring(i)) {
if (ismatched) {
ismatchedarr.push(true);
} else {
ismatchedarr.push(false);
}
}
}
});
isfound = true;
$.each(ismatchedarr, function (index, val) {
if (!val) {
isfound = false;
}
});
return isfound;
} else {
return true;
}
},
foundinfilter: function (filterparams) {
var isfound = false;
if ($("#" + trademe.id.makeoption).children().length == 0 ||
$("#" + trademe.id.makeoption + " option:selected").val() == 0) {
return true;
}
var ismatchedarr = [];
$.each(filterparams, function (i, v) {
if (parseInt($("#" + trademe.id.makeoption + " option:selected").val()) == v) {
ismatchedarr.push(true);
} else {
ismatchedarr.push(false);
}
});
isfound = true;
$.each(ismatchedarr, function (index, val) {
if (!val) {
isfound = false;
}
});
return isfound;
},
populatedetails: function () {
//check datasource, need value
if (!defaults.datasource) {
return;
}
$.each(defaults.datasource, function (i, v) {
if (v.id == querystring("id")) {
//title
if ($("#" + trademe.id.detailstitle).length > 0) {
$("#" + trademe.id.detailstitle).html((v.year && v.year>0?v.year:"") + " " + v.title);
}
//price
if ($("#" + trademe.id.detailsprice).length > 0) {
$("#" + trademe.id.detailsprice).prepend(trademe.structure.create("span", null, null).append(v.price));
}
//details
if (v.details && $("#" + trademe.id.vehicleattribute).length > 0) {
var attribute = $("#" + trademe.id.vehicleattribute);
$.each(v.details, function (text, val) {
attribute.append("\r\n");
attribute.append(trademe.structure.create("dt", null, null).html(text))
.append("\r\n")
.append(trademe.structure.create("dd", null, null).html((val ? val : " ")))
.append("\r\n");
});
//efficiency rating
if (parseFloat(v.efficiencyrating) > 0) {
var effInfo = [];
if (v.efficiency && parseFloat(v.efficiency)) {
effInfo.push(v.efficiency + "L per 100km");
}
if (v.efficiencyfuelcost) {
effInfo.push("Annual fuel cost of " + v.efficiencyfuelcost);
}
attribute.append("\r\n");
attribute.append(trademe.structure.create("dt", null, trademe.cssclass.fueleconomylabel).html("Fuel Economy Info (Source: Fuelsaver)
"))
.append("\r\n")
.append(
trademe.structure.create("dd", null, "fuel-economy-label")
.append(trademe.structure.create("div", null, "fuel-economy fuel-rating-" + v.efficiencyrating.replace(".", "_"))
.html(effInfo.length > 0 ? "
" + effInfo.join("
") : " ")
.attr("title", v.efficiencyrating + " of 6"))
)
.append("\r\n");
fuelefficiency.cost = v.efficiencyfuelcost;
fuelefficiency.message = v.efficiencymessage;
fuelefficiency.rating = v.efficiencyrating;
fuelefficiency.value = v.efficiency;
var tooltip = fuelefficiency.tooltip();
}
$("#" + trademe.id.vehicleattribute).show();
} else {
$("#" + trademe.id.vehicleattribute).hide();
}
//features
if (v.features && v.features.length > 0 && $("#" + trademe.id.vehiclefeatures).length > 0) {
$("#" + trademe.id.vehiclefeatures).append("Features : ");
$("#" + trademe.id.vehiclefeatures).append(trademe.structure.create("p", null, null).html(v.features.join()));
if ($("#" + trademe.id.vehicleattribute).length > 0) {
$("#" + trademe.id.vehiclefeatures).css({ top: parseInt($("#" + trademe.id.vehicleattribute).outerHeight()) + parseInt($("#" + trademe.id.vehicleattribute).css("top")) + 16 });
}
}
//features = 0
if (v.features && v.features.length == 0) {
$("#" + trademe.id.vehiclefeatures).remove();
}
//comments
if (v.comments && $("#" + trademe.id.vehiclecomments).length > 0) {
//$("#" + trademe.id.vehiclecomments).append("\r\n\r\n");
$("#" + trademe.id.vehiclecomments).append(trademe.structure.create("p", null, null).html("\r\n" + v.comments + "\r\n"));
if ($("#" + trademe.id.vehiclefeatures).length > 0) {
$("#" + trademe.id.vehiclecomments).css({ top: parseInt($("#" + trademe.id.vehiclefeatures).outerHeight()) + parseInt($("#" + trademe.id.vehiclefeatures).css("top")) });
} else {
$("#" + trademe.id.vehiclecomments).css({ top: parseInt($("#" + trademe.id.vehicleattribute).outerHeight()) + parseInt($("#" + trademe.id.vehicleattribute).css("top")) + 125 +
(parseInt($("#" + trademe.id.vehicleattribute).outerHeight()) < trademe.selectedvalue.commenttop ? trademe.selectedvalue.commenttop - parseInt($("#" + trademe.id.vehicleattribute).outerHeight()) : 0)
});
}
}
//fix details-container height based on comments
var detailsHeight = parseInt($("#" + trademe.id.vehiclecomments + " p").outerHeight()) + parseInt($("#" + trademe.id.vehiclecomments).css("top").replace("px"));
if ($("#" + trademe.id.detailsviewport).parent().height() < (detailsHeight + 80)) {
$("#" + trademe.id.detailsviewport).parent().height(detailsHeight + 80);
}
if (typeof trademe.structure.fetcheddetailsextra != 'undefined' && trademe.structure.fetcheddetailsextra == true) {
trademe.structure.detailsextrascript(v);
}
}
});
},
sortorder: { "asc": 0, "desc": 1 },
sort: function () {
var sortby = 7;
var orderby = trademe.structure.sortorder.asc;
var classname = null;
var sorted_elements = new Array();
var unsorted_elements = new Array();
$.each(trademe.selection.sortoption, function (i, v) {
if (v.value == sortby) {
orderby = v.sortorder;
classname = v.classname;
}
});
var parent = $("." + trademe.cssclass.itemcontainerlist);
$(parent.find(".item-container")).each(function (i, v) {
var val = $(this).find("." + classname).html();
val = val.replace("$", "").replace(",", "");
if ($.IsNumber(val)) {
val = parseInt(val);
}
//save unsorted elements
unsorted_elements.push(new Array(val, $(this).clone(true)));
});
var sortedR = [];
for (var i = 0; i < unsorted_elements.length; i++) {
sortedR.push(unsorted_elements[i][0]);
}
//start sorting
sortedR.sort();
if (orderby == trademe.structure.sortorder.desc) {
sortedR.reverse();
}
var max = unsorted_elements.length * 2;
for (var si = 0; si < sortedR.length; si++) {
var ui = 0;
while (unsorted_elements.length > -1) {
if (unsorted_elements[ui][0] == sortedR[si]) {
sorted_elements.push(unsorted_elements[ui][1]);
unsorted_elements.splice(ui, 1);
break;
}
ui++;
if (ui > max) {
break;
}
}
}
var _temp_sorted_elements = [];
parent.html("");
$.each(sorted_elements, function (i, v) {
var id = v.attr("id");
if ($("#" + trademe.id.itemcontainerlist).find(id).length == 0) {
v.appendTo($("#" + trademe.id.itemcontainerlist));
}
});
$(".hidden").hide();
//$(".listing-stat").html(parent.children().length + " found");
},
sortthis: function (data) {
var sortby = 7;
var sortorder = trademe.structure.sortorder.desc;
var objectname = null;
var sorted_elements = new Array();
var unsorted_elements = new Array();
if ($("#" + trademe.id.sortoption).children().length == 0) {
return data;
}
if ($("#" + trademe.id.sortoption).children().length > 0 && $("#" + trademe.id.sortoption).find("option:selected").val() > -1) {
sortby = $("#" + trademe.id.sortoption).find("option:selected").val();
}
//load what and how to sort the datasource
$.each(trademe.selection.sortoption, function (i, v) {
if (v.value == sortby) {
sortorder = v.sortorder;
//orderby = v.sortby;
objectname = v.objectname;
}
});
//save unsorted yet and save sortlabel
var sortedlabel = [];
var isnum = null;
$.each(data, function (i, v) {
if (v[objectname]) {
var val = !$.IsNumber(v[objectname]) ? v[objectname].replace('$', '').replace(new RegExp(',', 'g'), '') : parseInt(v[objectname]);
sortedlabel.push(!$.IsNumber(val) ? val : parseInt(val));
unsorted_elements.push(new Array(!$.IsNumber(val) ? val : parseInt(val), v));
if (isnum == null) {
isnum = $.IsNumber(val);
}
}
});
//start sorting alphabet
if (!isnum) {
sortedlabel.sort();
if (sortorder == trademe.structure.sortorder.desc) {
sortedlabel.reverse();
}
} else {
sortedlabel.sort(function (a, b) { return a - b });
if (sortorder == trademe.structure.sortorder.desc) {
sortedlabel.reverse(function (a, b) { return b - a });
}
}
var max = unsorted_elements.length * 2;
for (var si = 0; si < sortedlabel.length; si++) {
var ui = 0;
while (unsorted_elements.length > -1) {
if (unsorted_elements[ui][0] == sortedlabel[si]) {
sorted_elements.push(unsorted_elements[ui][1]);
unsorted_elements.splice(ui, 1);
break;
}
ui++;
if (ui > max) {
break;
}
}
}
return sorted_elements;
},
create: function (nodename, nodeid, nodeclass) {
var node = document.createElement(nodename);
if (nodeid) {
$(node).attr("id", nodeid);
}
if (nodeclass) {
$(node).addClass(nodeclass);
}
return $(node);
},
rotateimg: function (rotatedirection, target) {
var parent = target.parent("div");
var vId = parseInt(parent.attr("id").replace("item-", ""));
var currentImageIndex = parseInt(parent.data("imageindex"));
$.each(vehicles, function (i, v) {
if (v.id == vId) {
if (rotatedirection == trademe.enume.rotate.left) {
if (currentImageIndex == 0) {
currentImageIndex = v.images.length;
}
parent.find(".img-index").html(currentImageIndex + " of " + v.images.length);
parent.children(".preview-image").attr("src", v.images[currentImageIndex - 1]);
parent.data("imageindex", currentImageIndex - 1);
}
if (rotatedirection == trademe.enume.rotate.right) {
if (currentImageIndex >= (v.images.length - 1)) {
currentImageIndex = -1;
}
parent.find(".img-index").html(parseInt(currentImageIndex + 2) + " of " + v.images.length);
parent.children(".preview-image").attr("src", v.images[currentImageIndex + 1]);
parent.data("imageindex", currentImageIndex + 1);
}
}
});
},
fetchselectionjson: function (url, callback) {
//this is a flag that fetched has been done
if (typeof trademe.selection.fetched != 'undefined' && trademe.selection.fetched == true) {
return;
}
trademe.structure.fetch(url, callback);
},
fetchlistingextra: function () {
if (listing.fetchedlistingextra != 'undefined' && listing.fetchedlistingextra == true) {
return;
}
trademe.structure.fetch(
'http://' + document.domain + '/scripts/listingextrascript.js?cached=1',
function (jqxhr, settings, exception) {
//remove comment
jqxhr = jqxhr.replace(new RegExp('\r', 'g'), '').replace(new RegExp('\n', 'g'), '').replace(new RegExp("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)", "g"), "");
if (typeof listing.fetchedlistingextra == 'undefined' && jqxhr) {
listing["fetchedlistingextra"] = true;
}
var arr_data = jqxhr; //.split(";");
if (listing) {
listing["listingextraescript"] = eval(arr_data);
}
}, "script");
},
fetchdetailsextra: function () {
if (typeof trademe.structure.fetcheddetailsextra != 'undefined' && trademe.structure.fetchdetailsextra == true) {
return;
}
trademe.structure.fetch(
'http://' + document.domain + '/scripts/detailsextrascript.js?cached=1',
function (jqxhr, settings, exception) {
//remove comment
jqxhr = jqxhr.replace(new RegExp('\r', 'g'), '').replace(new RegExp('\n', 'g'), '').replace(new RegExp("(?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)", "g"), "");
if (typeof trademe.structure.fetcheddetailsextra == 'undefined' && jqxhr) {
trademe.structure["fetcheddetailsextra"] = true;
}
var arr_data = jqxhr;
trademe.structure["detailsextrascript"] = eval(arr_data);
trademe.structure.populatedetailscallback();
}, "script");
},
fetch: function (url, callback, dataType) {
dataType = !dataType ? "text" : dataType;
$.ajax({
type: "GET",
url: url,
dataType: dataType, cache: true, ifModified: true,
success: function (jqxhr, settings, exception) {
if (!jqxhr) return;
if (callback) {
callback(jqxhr, settings, exception);
}
}
});
}
},
event: {
makeoptionclicked: function () {
cookie("ManufacturerId", $(this).find("option:selected").val());
listing.currentpage = 0;
listing.populate();
},
sortbyclicked: function () {
cookie("SortBy", $(this).find("option:selected").val());
listing.populate();
},
galleryviewclicked: function () {
//reset
listing.maxpage = 0; listing.minpage = 0; listing.currentpage = 0;
listing.currentviewtype = trademe.enume.viewtype.galleryview;
cookie("viewtype", trademe.enume.viewtype.galleryview);
listing.populate();
return false;
},
listviewclicked: function () {
//reset
listing.maxpage = 0; listing.minpage = 0; listing.currentpage = 0;
listing.currentviewtype = trademe.enume.viewtype.listview;
cookie("viewtype", trademe.enume.viewtype.listview);
listing.populate();
return false;
},
prevclick: function (e) {
if (e) { e.stopPropagation(); }
else { window.event.cancelBubble = true; }
trademe.structure.rotateimg(trademe.enume.rotate.left, $(this));
return false;
},
nextclick: function (e) {
if (e) { e.stopPropagation(); }
else { window.event.cancelBubble = true; }
trademe.structure.rotateimg(trademe.enume.rotate.right, $(this));
return false;
},
itemclick: function () {
if (defaults.detailspage) {
var qs = window.location.search.substring(1);
//window.location.href = defaults.detailspage + "?id=" + $(this).attr("id").replace("item-", "") + (querystring("branchId") ? "&branchId=" + querystring("branchId") : "") + (querystring("new") ? "&new=" + querystring("new") : "") + (querystring("specials") ? "&specials=" + querystring("specials") : "");
window.location.href = defaults.detailspage + "?id=" + $(this).attr("id").replace("item-", "") + (qs ? "&" + qs : "");
}
},
printthis: function () {
//window.print();
//$("#" + trademe.id.detailsviewport).print({ csspath: '../../App_Themes/trademe.motors.stocklist.css' });
window.open('http:\/\/' + document.domain + '\/vehicle-print.aspx?id=' + querystring("id"), '_blank');
return false;
},
pagelinkclicked: function () {
cookie("currentpage", $(this).data("number"));
listing.currentpage = parseInt($(this).data("number"));
listing.populate();
return false;
},
pagenextclicked: function () {
listing.currentpage += 1;
cookie("currentpage", listing.currentpage);
listing.populate();
return false;
},
pageprevclicked: function () {
listing.currentpage -= 1;
cookie("currentpage", listing.currentpage);
listing.populate();
return false;
}
}
};
return this.each(function (i, obj) {
$this = $(this);
trademe.structure.target = $this;
//add the trademe motors css
if (!trademe.structure.hasTMMotorsCss()) {
trademe.structure.addHeadCss();
}
//setup stock list page
if (defaults.pagetype == trademe.enume.pagetype.stock) {
listing.init();
listing.populatecallback = function () {
listing.currentpage = 0; //reset at 1st page load
listing.currentviewtype = cookie("viewtype") ? parseInt(cookie("viewtype")) : defaults.viewtype;
listing.populate();
};
}
//setup details list page
if (defaults.pagetype == trademe.enume.pagetype.details) {
trademe.structure.initdetails();
///display details
trademe.structure.populatedetailscallback = trademe.structure.populatedetails;
//display carousel
carousel.create();
}
});
};
})(jQuery);
function querystring(name)
{
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regexS = "[\\?&]" + name + "=([^]*)";
var regex = new RegExp(regexS);
var results = regex.exec(window.location.search);
if(results == null)
return "";
else
return decodeURIComponent(results[1].replace(/\+/g, " "));
}
//USAGE: cookie([name],value); cookie([name]); cookie([name],[value],{expires:[value]})
function cookie() { return cookie.params.apply(this, arguments); }
cookie.params = function (key, value, options) {
if (arguments.length > 1 && String(value) !== "[object Object]") {
if (options == undefined) { options = {} }
if (value === null || value === undefined) { options.expires = -1; }
if (typeof options.expires === 'number') { var days = options.expires, t = options.expires = new Date(); t.setDate(t.getDate() + days); }
value = String(value);
return (document.cookie = [encodeURIComponent(key), '=', options.raw ? value : encodeURIComponent(value), options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
options.path ? '; path=' + options.path : '', options.domain ? '; domain=' + options.domain : '', options.secure ? '; secure' : ''].join(''));
}
options = value || {};
var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
}
jQuery.IsNumber = function (n) {
return typeof (n) != "boolean" && !isNaN(n);
}