/*!
*  motorsutilities.js
*/

/* used on homepage so it has to double up here */
if (typeof motors == 'undefined')
    motors = {};
if (typeof motors.error == 'undefined')
    motors.error = {};
if (typeof motors.utils == 'undefined')
    motors.utils = {};

if (typeof motors.filter == 'undefined') {
    motors.filter = {};
}

$.extend(motors.utils, {
    getValueCss: function(attrClass, rx) {
        var match = attrClass.match(rx);
        var val = '';
        if (match && match.length > 1) {
            val = match[1];
        }
        return val;
    },
    // Does a display toggle using the DOM, as jQuery doesn't work (no idea why not)
    toggle: function(id) {
        var elem = document.getElementById(id);
        var d = elem.style.display;
        if (d == '' || d == 'block')
            elem.style.display = 'none';
        else
            elem.style.display = 'block';
    }
});

$.extend(motors.error, {
    add: function(summary, description, selector) {
        var $list = $('.error-wrapper ul');
        var $item = $list.find('li:contains(' + summary + ')');
        if ($item.length == 0) {

            // $item doesn't exist, create it
            $item = $(document.createElement('li'));
            var $head = $(document.createElement('div'));
            $head.addClass('error-item')
                     .text(summary)
                     .appendTo($item);
            var $desc = $(document.createElement('div'));
            $desc.addClass('error-description')
                     .text(description)
                     .appendTo($item);

            if (selector) {
                $item.click(function() {
                    $(selector).focus();
                });
            }

            $list.append($item);

        } else {

            // $item already exists, so just update it
            $item.find('.error-description')
                     .text(description)
                     .end()
                     .unbind('click')
                     .click(function() {
                         $(selector).focus();
                     });

        }

        $('.error-notification').fadeIn("slow");
        // For some reason, this doesn't work in FF with just fade in.
        $('.error-notification').show();
    },

    remove: function(summary) {
        var $list = $('.error-wrapper ul');
        $list.find('li:contains(' + summary + ')').remove();

        if ($list.find('li').length == 0)
            $('.error-notification').fadeOut("fast");
    }
});

$.extend(motors, {

    getSelectedTab: function () {

        return $('#sortbyOptions option:selected').val()
    },

    checkForKeyWord: function () {

        if (motors.filter.keyWordArray.length > 0) {
            return true;
        } else {
            return false;
        }

    },


    handleUpdates: function () {

        for (var item in motors.constants.jsonfilter.document.data) {
            item.forceupdate = 1;
        }
    },
    displayNoResults: function () {

        var _result = "";

        _result += "<div>";
        _result += "<div class='noResultText'>";
        _result += "</div>";
        _result += "<div class='textSearchResult'>";
        _result += "Search results</div>";
        _result += "<div class='textOops'>";
        _result += "Ooops!</div>";
        _result += "<div class='textSorry'>";
        _result += "We're sorry but there are no results which match your request.</div>";
        _result += "<div class='textNormal'>";
        _result += "We do not have any cars matching your exact search criteria listed just now. ";
        //      _result += "matching your search criteria for sale just now.</div>";
        _result += "<div class='textNormal'>";
        _result += "Please remove one or more of your search criteria to return more results.</div>";

        _result += "</div>";

        return _result;
    },

    //    isValidPostcodeBlur: function(_obj) {

    //        if (!motors.isValidPostcode(_obj.value)) {

    //            _obj.focus();
    //            alert("Postcode has invalid format")
    //            return false;
    //        }
    //    },


    // The original postcode match was this: ((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))( ?)[0-9][A-Z-[CIKMOV]]{2})
    // .. but it doesn't work in JavaScript
    // Substitutions:
    //  [A-Z-[QVX]] with [A-PR-UWYZ]
    //  [A-Z-[IJZ]] with [A-HK-Y]
    //  [A-Z-[CIKMOV]] with [ABD-HJLNP-UW-Z]
    //rxPostcode: /^((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))))( ?)([0-9][ABD-HJLNP-UW-Z]{2})?)$/i,
    rxPostcode: /^((([A-PR-UWYZ][0-9][0-9]?)|(([A-PR-UWYZ][A-HK-Y][0-9][0-9]?)|(([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY])))) ?([0-9][ABD-HJLNP-UW-Z]{2}))$/i,

    isValidPostcode: function (postcode) {
        var match = postcode.match(motors.rxPostcode);
        //        // We can add the space into the postcode if we want to...
        //        if (postcode.indexOf(' ') == -1) {
        //            var outCode = RegExp.$2;
        //            var inCode = postcode.substring(outCode.length);
        //            postcode = outCode + ' ' + inCode;
        //        }
        return (match && (match.length > 0));
    },
    postcodeChange: function () {

        //motors.constants.jsonfilter.document.postcode = $('#nav-postcode').val();
        //$.cookie('motorsPostcode', null);
        //$.cookie('motorsPostcode', $('#nav-postcode').val(), motors.constants.cookieOptions);

        motors.setLocationCookie();
        motors.getLocationCookie();

        motors.handleUpdates();
        motors.triggerDataRequest();

    },

    freeSearch: function (para) {

        if (!motors.validate()) { return false; }

        if (para) { $('#nav-freesearch')[0].value = ""; _iskeyword = false; return false; }

        motors.handleUpdates();
        motors.triggerDataRequest();
    },

    orderBy: function (para) {

        motors.triggerDataRequest();
    },
    initPagination: function (num_entries, num_edge_entries, num_display_entries, items_per_page, current_page) {

        var count = parseInt(num_entries, 10);

        if (!isNaN(count) && (count > 0)) {

            if (count > 4005)
                count = 4005;

            var page = parseInt(current_page);
            if (!isNaN(page) && page > 0)
                page -= 1;
            else
                page = 0;

            $('.paging-hold').pagination(count, {
                num_edge_entries: 0,
                num_display_entries: num_display_entries,
                current_page: page,
                callback: motors.pageselectCallback,
                items_per_page: items_per_page,
                next_text: 'Next page',
                prev_text: 'Previous page'
            });

        } else {
            $('.paging-hold').html('');
        }
    },
    getPageCount: function (pageNumber, itemsPerPage, totalRecords) {

        /* 6    - pageNumber   */
        /* 15   - itemsPerPage */
        /* 8643 - totalRecords */

        var startNumber = ((pageNumber - 1) * itemsPerPage) + 1;
        var endNumber = (pageNumber * itemsPerPage);

        if (endNumber >= totalRecords) { endNumber = totalRecords };

        if (startNumber < 1) { startNumber = 1; }

        return "" + startNumber + " - " + endNumber + ""
    }
    , startPagination: function () {

        var c = motors.constants;
        if (c.jsonfilter.document.totalresults == "") {
            c.jsonfilter.document.totalresults = 0;
        }

        if (c.jsonfilter.document.numberofresultsperpage == "") {
            c.jsonfilter.document.numberofresultsperpage = c.para_items_per_page;
        }

        if (c.jsonfilter.document.totalpages != 0) {
            motors.initPagination(c.jsonfilter.document.totalresults, c.para_num_edge_entries, c.para_num_display_entries, c.jsonfilter.document.numberofresultsperpage, 0);
        }
    },

    pageselectCallback: function (page_index, jq) {

        if (!motors.validate())
            return false;

        motors.filter.transitionStart();

        //motors.sliders.buildSlidersQuery(''); // this is all the function did
        motors.constants.jsonfilter.document.postcode = $('#nav-postcode').attr('value');

        motors.ajax.ajaxGenerix('Pagination', page_index);
        return false;

    },
    isNumber: function (val) {
        return /^-?((\d+\.?\d?)|(\.\d+))$/.test(val);
    },
    validate: function () {

        var isValid = true;
        var ignoreValidation = motors.constants.jsonfilter.document.ignorevalidation;

        if (!ignoreValidation || ignoreValidation != "1") {

            var postcode = $('#nav-postcode').attr('value');
            if (!postcode || postcode.length == 0) {
                isValid = validateSearch();
            }

        }

        return isValid;

    }, triggerDataRequest: function () {

        var keyWordString = '';

        if (motors.validate()) {

            motors.filter.transitionStart()

            for (var i = 0; i < motors.filter.keyWordArray.length; i++) {
                keyWordString += motors.filter.keyWordArray[i] + ' ';
            }

            motors.constants.jsonfilter.document.keywordsearch = motors.filter.keyWordArray;

            //            var postcode = $('#nav-postcode').val();
            //            $.cookie('motorsPostcode', null);
            //            $.cookie('motorsPostcode', postcode, motors.constants.cookieOptions);
            //            motors.constants.jsonfilter.document.postcode = postcode;

            motors.setLocationCookie();
            motors.getLocationCookie();


            motors.handleUpdates();
            motors.ajax.requestData('');

            omnitureAuto('event1'); // update search results: omniture tracking trigger
        }

    }, showPane: function (para, myObj) {

        $(myObj).parent('div').find('.details-tab.open').removeClass('open');
        $(myObj).addClass("open");

        if ($(myObj).parent('div').siblings('.tabsContent').length > 0) {

            $(myObj).parent('div').siblings('.tabsContent').find('.pane').addClass('hide-me');
            $(myObj).parent('div').siblings('.tabsContent').find('#' + para).removeClass('hide-me').find('div').show();

        } else {

            $(myObj).parent('div').siblings('.compareTabsContent').find('.pane').addClass('hide-me');
            $(myObj).parent('div').siblings('.compareTabsContent').find('#' + para).removeClass('hide-me').find('div').show();
        }

        return false;

    }, getCarCompPosition: function (vehicleid) {

        var carPosition = -1;

        for (var i = 0; i < motors.carscompare.carsdata.item.length; i++) {
            //if (motors.carscompare.carsdata.item[i].cardata.carid == vehicleid) { carPosition = i; }
            carPosition = motors.carscompare.carsdata.item.length - 1;
        }

        return carPosition;

    }, setLocationCookie: function () {

        var $postcode = $('#nav-postcode');
        if ($postcode.length != 0) {
            var postcode = $.trim($postcode.val());
            if ((postcode != '')) {
                setCookie('motorsPostcode', postcode, 30);
            }
        }

    }, getLocationCookie: function () {

        if (getCookie("motorsPostcode") == null) {
            motors.setLocationCookie();
        }
        var locString = getCookie("motorsPostcode");
        // if no postcode cookie exists then look to see if we have a default postcode cookie
        if (locString == null) {
            locString = getCookie("motorsDefaultPostcode");
        }
        if (locString != null) {
            //remove location id
            var actualPostcode = locString.split('~')[0];
            motors.constants.jsonfilter.document.postcode = actualPostcode;
            $('#nav-postcode').val(motors.constants.jsonfilter.document.postcode);
        }

    }, addCarToCompare: function (vehicleid) {

        var carPosition = motors.getCarCompPosition(vehicleid);

        var carItem = document.createElement('div');
        carItem.className = "carItem c" + vehicleid;

        var carItemImage = document.createElement('div');
        carItemImage.className = "carItemImage";

        var carImage = document.createElement('img');

        carImage.src = motors.carscompare.carsdata.item[carPosition].cardata.summary.carimageurl;
        carImage.alt = motors.carscompare.carsdata.item[carPosition].cardata.summary.make + ' ' + motors.carscompare.carsdata.item[carPosition].cardata.summary.model;

        var carItemMake = document.createElement('div');
        carItemMake.className = "carItemMake";

        var carItemPrice = document.createElement('div');
        carItemPrice.className = "carItemPrice";

        var textPrice = document.createTextNode(motors.carscompare.carsdata.item[carPosition].cardata.summary.price);
        carItemPrice.appendChild(textPrice);

        var carLink = document.createElement('a');
        var textCarMake = document.createTextNode(motors.carscompare.carsdata.item[carPosition].cardata.summary.make + ' ' + motors.carscompare.carsdata.item[carPosition].cardata.summary.model);

        carLink.appendChild(textCarMake);
        carLink.setAttribute('href', '#');

        var carItemDistance = document.createElement('div');
        carItemDistance.className = "carItemDistance";

        var textDistance = document.createTextNode(motors.carscompare.carsdata.item[carPosition].cardata.summary.distance);
        carItemDistance.appendChild(textDistance);

        var carItemAction = document.createElement('div');
        carItemAction.className = "carItemAction";

        var removeCompare = document.createElement('div');
        removeCompare.className = "removeCompare";
        removeCompare.setAttribute("onclick", "motors.removeCarCompare(" + vehicleid + "); return false;");

        var imageEmail = document.createElement('img');
        imageEmail.src = "http://cdn2.motors.co.uk/v2live/images/carCompare/email.png";

        var imageSend = document.createElement('img');
        imageSend.src = "http://cdn2.motors.co.uk/v2live/images/carCompare/iconAdd.png";

        var removeCarLink = document.createElement('a');

        var textRemoveCar = document.createTextNode("Remove Car");
        removeCarLink.appendChild(textRemoveCar);
        removeCarLink.setAttribute("href", "#");

        carItemImage.appendChild(carImage);
        carItemMake.appendChild(carLink);

        carItemAction.appendChild(imageEmail);
        carItemAction.appendChild(imageSend);

        removeCompare.appendChild(removeCarLink);
        carItemAction.appendChild(removeCompare);

        carItem.appendChild(carItemImage);
        carItem.appendChild(carItemMake);
        carItem.appendChild(carItemPrice);
        carItem.appendChild(carItemDistance);
        carItem.appendChild(carItemAction);

        $('.carList').append(carItem);

        var rowOptions = {
            //  tabName: "pane1",
            addTitle: false,
            carPosition: carPosition,
            vehicleid: vehicleid
        };


        rowOptions.addTitle = false;
        motors.createCompareTableCell(rowOptions);

    }, removeCarCompare: function (vehicleid) {

        var carPosition = motors.getCarCompPosition(vehicleid);

        if (carPosition != -1) {
            motors.carscompare.carsdata.item.splice(carPosition, 1);
        }

        $('.compareTableItem.compareTabCell.c' + vehicleid).remove();
        $('.carItem.c' + vehicleid).remove();


        var $myLink = $('.removeCar' + vehicleid);

        if ($myLink.length > 0) {

            $myLink.find('a').text('Add to Compare');
            $myLink.removeClass('removeCar-' + vehicleid);

        }

        if (motors.carscompare.carsdata.item.length == 0) {

            $('.carcompare').hide("slow");
            return false;

        }

    }


});

this.tooltip = function() {
    /* CONFIG */
    xOffset = 10;
    yOffset = 20;
    // these 2 variable determine popup's distance from the cursor
    // you might want to adjust to get the right result
    /* END CONFIG */

    //    li class="rangeSegmentsLeft" title="ABC123">0</li>
    //    <li class="floatR rangeSegmentsRight"


    //$(".rangeSegments").css("cursor", "help")
    //        $("#tooltip")
    //			.css("top", (e.pageY - xOffset) + "px")
    //			.css("left", (e.pageX + yOffset) + "px")
    //			.css("display","block")

    $(".rangeSegments").css("cursor", "help")

    $(".rangeSegmentsLeft,.rangeSegmentsRight").hover(function(e) {
        this.t = this.title;
        this.title = "";
        //$("body").append("<p id='tooltip'>" + this.t + "</p>");

        $("#tooltip")
			.css("top", (e.pageY - xOffset) + "px")
			.css("left", (e.pageX + yOffset) + "px")
			.css("display", "block")[0].innerHTML = "Based on your current selection, only this " + this.t + " value is available"

        //.innerHTML
    },
	function() {
	    this.title = this.t;
	    $("#tooltip").css("display", "none")
	});
    $(".rangeSegmentsLeft,.rangeSegmentsRight").mousemove(function(e) {
        $("#tooltip")
			.css("top", (e.pageY - xOffset) + "px")
			.css("left", (e.pageX + yOffset) + "px");
    });
};

$(document).ready(function () {

    $('#nav-postcode, #mainBody').keydown(function (e) {
        var key = (e.which) ? e.which : e.keyCode;
        if (key == 13) {
            $('.suggestMenu').hide();
            if ($('#btnnav-postcode').length > 0) {
                $('#btnnav-postcode').trigger('click');
            } else if ($('#srch-btn input').length > 0) {
                $('#srch-btn input').trigger('click');
            }
        }
    });

});
