﻿(function ($) {

    function defaultSettings() {
        return {
            ajaxServiceUrl: '',
            portalID: '0',
            compositeID: '',
            tabID: '0',
            host: '',
            baseN: '',
            maxItem: 0,
            settings: [],
            settingIndex: 0,
            counter: 0,
            noResultDefault: '',
            noResultWithStateFilter: '',
            hideWhenNoResults: false,
            containerToHide: '',
            currentRecordID: '',
            paramsToKeepInUrl: '',
            container: null,
            loadingPanel: null,
            templateFunction: null,
            showState: false,
            trackingQuery: ''
        };
    }

    function getSelectedState() {
        var state = $.cookie('cross-link-state');
        if (!state || state == 'undefined')
            return "";

        return state;
    }

    function setSelectedState(state) {
        $.cookie('cross-link-state', state, { expires: 14, path: '/' });
    }

    function getStateAbbr(state) {
        if (state.length == 3)
            return state;

        if (state.indexOf("Australia") == 0)
            return "ACT";
        if (state.indexOf("Western") == 0)
            return "WA";
        if (state.indexOf("South") == 0)
            return "SA";
        if (state.indexOf("Queensland") == 0)
            return "QLD";
        if (state.indexOf("Tasmania") == 0)
            return "TAS";
        if (state.indexOf("New") == 0)
            return "NSW";
        if (state.indexOf("Victoria") == 0)
            return "VIC";
        if (state.indexOf("Northern") == 0)
            return "NT";

        return state;
    }

    function showNoResult(mod) {
        if (mod.hideWhenNoResults) {
            $(mod.containerToHide).hide();
        } else {
            var msg = mod.showState ? mod.noResultWithStateFilter : mod.noResultDefault;
            $("<p></p>").addClass("cl-noresult").html(msg).appendTo(mod.container);
        }
    }

    function htmlUpdated(mod, lastItemCount) {
        mod.counter += lastItemCount;
        if (mod.counter < mod.maxItem && mod.settingIndex < mod.settings.length - 1) {
            mod.settingIndex++;
            loadCrossLinkData(mod);
        } else {
            if (mod.counter == 0) {
                showNoResult(mod);
            }
            hideLoadingPanel(mod.container);
        }
    }

    function showLoadingPanel(container) {
        $("<div></div>").addClass("cl-loading").appendTo(container);
    }

    function hideLoadingPanel(container) {
        container.find(".cl-loading").remove();
    }

    function parseHtml(mod, items, resultUrl) {
        var setting = mod.settings[mod.settingIndex],
            title = setting[0],
            trackingParam = setting[2],
            trackingParamAll = setting[3],
            dataList = $("<ul></ul>").addClass("cross-link-" + mod.settingIndex + " cross-link").appendTo(mod.container);

        $("<li></li>").addClass("cl-header").html(title).appendTo(dataList);

		for (var i = 0; i < items.length; i++) {
			var item = items[i];
			var html;
			if (trackingParam.length > 0) {
				html = "<a class='cl-link' href='" + item.DetailUrl + (item.DetailUrl.indexOf("?") > 0 ? "&" : "?") + trackingParam + "'>";
			} else {
				html = "<a class='cl-link' href='" + item.DetailUrl + "'>";
			}
			html += "<div class='cl-item'>";
			html += "<h4>" + item.Title + "</h4>";
			html += "<div class='desc'>" + item.Description + "</div>";
			html += "<div class='info'>" + item.Info + "</div>";
			html += "</div>";
			html += "<img src='" + item.ImageUrl + "' />";
			html += "</a>";

            $("<li></li>").html(html).appendTo(dataList);

            if (mod.counter + i + 2 > mod.maxItem)
                break;
        }

        var footerText = "";
        if (resultUrl != null) {
            var footerUrl = resultUrl;
            if (trackingParamAll != null && trackingParamAll.length > 0)
                footerUrl += "&" + trackingParamAll;

            footerText = "<a href='" + footerUrl + "' target='_blank'><b>View all matching </b><span>" + title + "</span></a>";
        }

        $("<li></li>").addClass("cl-footer").html(footerText).appendTo(dataList);
    }

    function loadCrossLinkData(mod) {
        var setting = mod.settings[mod.settingIndex],
            url = (mod.ajaxServiceUrl + '&' +
                mod.portalID + '&' + mod.tabID + '&' + mod.compositeID + '&' +
                mod.baseN + '&' + mod.host + '&' + mod.currentRecordID + '&N=' + setting[1] + '&N_=' +
                getSelectedState() + "&" + mod.paramsToKeepInUrl);
        if (mod.trackingQuery != '')
            url = url + '&' + mod.trackingQuery;

        if (mod.settingIndex == 0) {
            showLoadingPanel(mod.container.empty());
        }

        jQuery.post(url, function (result) {
            var data = JSON.parse(result);
            if (data == null || data.length == 0) {
                htmlUpdated(mod, 0);
                return;
            }
            var items = data.CrossLinkItems;

            if (typeof (mod.templateFunction) !== "function") {
                parseHtml(mod, items, data.ResultUrl);
            } else {
                mod.templateFunction(mod, items, data.ResultUrl);
            }

            htmlUpdated(mod, items.length);
        });
    }

    function initStateList(stateDropDown, portalID, baseN, host) {
        $.post(
            '/ajax/execute.ashx?ajaxMN=GetDimension&ajaxCN=Tig.AjaxServices.Common,Rainbow&DimensionName=SearchLocation&' + portalID + '&' + baseN + '&' + host,
            function (data) {

                var items = JSON.parse(data);

                for (var i = 0; i < items.length; i++) {
                    var opt = new Option(getStateAbbr(items[i].Name), items[i].Value);
                    stateDropDown[0].options[stateDropDown[0].options.length] = opt;
                }

                var state = getSelectedState();
                if (state) {
                    stateDropDown.val(state);
                }
            }
        );
    }

    $.fn.bindEndecaCrossLinkAjax = function (options) {
        var stateDropDown = this.find("#Location"),
            mod = $.extend(defaultSettings(), options),
            updateOnChange = function () {
                mod.counter = mod.settingIndex = 0;
                loadCrossLinkData(mod);
            };

        mod.container = this.find("#cl-container");

        if (mod.showState) {
            initStateList(stateDropDown, mod.portalID, mod.baseN, mod.host);

            if (mod.ajaxServiceUrl.length > 0) {
                stateDropDown.change(function (ev) { setSelectedState($(ev.target).val()); updateOnChange(); })
                    .data("update", updateOnChange);
            } else {
                stateDropDown.change(function (ev) { setSelectedState($(ev.target).val()); });
            }
        }

        this.fadeIn("slow");

        if (mod.ajaxServiceUrl.length > 0)
            loadCrossLinkData(mod);
    }

    $.fn.endecaAjaxUpdate = function () {
        if (this.length == 1) {
            if (this.data("update")) {
                this.data("update")();
            }
        } else if (this.length > 1) {
            this.each(function (i, a) {
                if ($(a).data("update")) {
                    $(a).data("update")();
                }
            });
        }

        return this;
    }

})(jQuery);

function carsInStockTemplate(mod, dataItems, resultUrl) {
	var template = '<div class="data-column">' +
                        '<div class="vehicle-information"><h3>{Title}</h3>' +
                        '<ul class="images">' +
                        '<li><a href="{DetailUrl}"><img src="{ImageUrl1}" alt="{Title}" width="80" height="54"/></a></li>' +
                        '<li><a href="{DetailUrl}"><img src="{ImageUrl2}" alt="{Title}" width="80" height="54"/></a></li>' +
                        '</ul>' +
                        '</div><ul class="price-details">' +
                        '<li class="price">{Price}</li>' +
                        '<li class="PriceType">{Info}</li></ul>' +
                        '<span class="enq"><em>{Location}</em>' +
                        '<a href="{DetailUrl}" class="details-button">Dealer Enquiry <span class="arrow"></span></a>' +
                        '</span></div>',
        html, stockItem, summary, price, location, imgs, item,
        rePrice = /price'\>(\$[\d,\^\*]+)\</,
        reLocation = /location'\>([^\<]+)\</,
        reImages = /(http\:[^']+.jpg)/g;

	var setting = mod.settings[mod.settingIndex],
    title = setting[0],
    trackingParam = setting[2],
    trackingParamAll = setting[3];

	$("<div></div>").addClass("header").html(title).appendTo(mod.container);

	for (var i = 0, j = dataItems.length; i < j; i++) {
		item = dataItems[i];
		html = template.replace(/\{Title\}/g, item.Title);
		//check if url already has a "?"
		if (item.DetailUrl.indexOf('?') > -1)
		    html = html.replace(/\{DetailUrl\}/g, item.DetailUrl + "&" + trackingParam);
		else
		    html = html.replace(/\{DetailUrl\}/g, item.DetailUrl + "?" + trackingParam);
		if (rePrice.exec(item.Description)) {
			html = html.replace("{Price}", RegExp.$1);
		}
		if (reLocation.exec(item.Description)) {
			html = html.replace("{Location}", RegExp.$1);
		}
		html = html.replace("{Info}", item.Info);

		imgs = item.ImageUrl.match(reImages);
		html = html.replace("{ImageUrl1}", imgs[0]);
		if (imgs.length == 1) { imgs.push("/carcontent/cse/photo_na.gif"); }
		html = html.replace("{ImageUrl2}", imgs[1]);

		stockItem = $(html).appendTo(mod.container);
        stockItem.data("DetailUrl", item.DetailUrl);
        stockItem.click(function (ev) {
            var el = $(ev.target);
            if (!(el.is("a") || el.parents("a:first").length == 1)) {
                if ($(this).data("DetailUrl").indexOf('?') > -1)
                    window.location = $(this).data("DetailUrl") + "&" + trackingParam;
                else
                    window.location = $(this).data("DetailUrl") + "?" + trackingParam;
            }
        });
		summary = $(item.Description).appendTo(stockItem.find(".vehicle-information")).parent();
		summary.find("p").addClass("desc").find("br").remove();
		summary.find(".price,.location").remove();
		summary.find("ul:eq(1)").addClass("summary-list").find("li:even").addClass("left");

		if (mod.counter + i + 2 > mod.maxItem)
			break;
	}

	var footerText = "";
	if (resultUrl != null) {
		var footerUrl = resultUrl;
		if (trackingParamAll != null && trackingParamAll.length > 0)
			footerUrl += "&" + trackingParamAll;

		footerText = "<a href='" + footerUrl + "' target='_blank'>View all matching <var>" + title + "</var></a>";
	}

	$("<div></div>").addClass("footer").html(footerText).appendTo(mod.container);

	if (typeof refreshPriceTypePopupLink === "function") { refreshPriceTypePopupLink(mod.container); }
}
