if (typeof(console) == "undefined"){
    console = {
        log: function(){
            
        }
    }
}

function _displayMsg(msg){
    updateSavedCarsCounter(msg)
    $("#messages-root-container").append("<div class='msg' onclick='$(this).remove();'>" + msg + "</div>")
    var msgJustAdded = $("#messages-root-container div.msg:last");
    setTimeout(function(){
        $(msgJustAdded).remove();
    }, 1000 * 3);
}

function displayMsg(jsonRsp){
    if (typeof(jsonRsp.rsp.msgs) != "undefined"){
        var msgs = $.makeArray(jsonRsp.rsp.msgs)
        _.each(msgs, function(msg){
            _displayMsg(msg)
        })
    }
}

function _displayErrorMsg(msg){
    $("#messages-root-container").append(
        "<div class='error-msg' onclick='$(this).remove();'>" + msg + "</div>")
}

function displayErrorMsg(jsonRsp){
    if (typeof(jsonRsp.rsp.msgs) != "undefined"){
        var msgs = $.makeArray(jsonRsp.rsp.errorMsgs)
        _.each(msgs, function(msg){
            _displayErrorMsg(msg)
        })
    }
}

function displayAjaxMsg(jsonRsp){
    displayMsg(jsonRsp)
    displayErrorMsg(jsonRsp)
}

function updateSavedCarsCounter(msg){
    if (msg.indexOf("<!--totalcars") > -1){
        var matches = msg.match(/<!--(.*?)=(.*?)-->/)
        if (matches != null && matches.length){
            var totalCars = matches[2]
            $("#saved-vehicles-counter").text("(" + totalCars + ")");
        }
    }
}

$.fn.dataTableExt.afnFiltering.push(
    function( oSettings, aData, iDataIndex ) {

        var formDiv = $(oSettings.nTable).data("filterFormAndDataTableContainer")
        var columnOrderingHash = null;
        
        if (typeof(formDiv) == "undefined"){
            // store a reference to the filter and data table container so that do not
            // have to do a dom find for the container on every row in the table
            formDiv = $(oSettings.nTable).parents(".filter-form-and-data-table-container")[0]
            $(oSettings.nTable).data("filterFormAndDataTableContainer", formDiv)
            columnOrderingHash = $(oSettings.nTable).parents(".mmc-datatable-info").data('dataTableColumnOrderingHash')
            $(oSettings.nTable).data("cachedJsColumnOrderingHash", columnOrderingHash)
        }
        else{
            columnOrderingHash = $(oSettings.nTable).data("cachedJsColumnOrderingHash")
        }

        // check that the p11d, co2 and mpg filters are on the page
        if (typeof(formDiv) != "undefined"){

            var filters = {
                description: "",
                priceMin: null,
                priceMax: null,
                maintained: null,
                months: null,
                miles: null
            }
            
            if (typeof($(oSettings.nTable).data("cachedFormFilterElements")) != "undefined"){
                filters = $(oSettings.nTable).data("cachedFormFilterElements")
            }
            else{
                filters = {
                    description: $(formDiv).find(".description"),
                    priceMin: $(formDiv).find(".min-price"),
                    priceMax: $(formDiv).find(".max-price"),
                    maintained: $(formDiv).find(".maintained-select"),
                    months: $(formDiv).find(".months-select"),
                    miles: $(formDiv).find(".miles-select")
                }
                $(oSettings.nTable).data("cachedFormFilterElements", filters)
            }

            /*
            // get all fields
            // make any empty min fields be 0
            // make any empty max fields be 9999999

            var rangeFields = [
            {
                name: "price",
                min: 0,
                max: 9999999,
                colNum: columnOrderingHash["price"]
            },
            {
                name: "p11d",
                min: 0,
                max: 9999999,
                colNum: columnOrderingHash["p11d"]
            },

            {
                name: "c02",
                min: 0,
                max: 9999999,
                colNum: columnOrderingHash["c02"]
            },

            {
                name: "mpg",
                min: 0,
                max: 9999999,
                colNum: columnOrderingHash["mpg"]
            }

            ]

            // for each column check that the column is within the range given
            //  if any column is not within the range return false
            //  if all columns are within range return true
            var isColumnInRange = function(rangeObj){
                //debugger
                var min = parseInt($(formDiv).find(".min-" + rangeObj.name).val());
                var max = parseInt($(formDiv).find(".max-" + rangeObj.name).val());
                isNaN(min) ? (min = rangeObj.min) : null
                isNaN(max) ? (max = rangeObj.max) : null

                var columnValue = parseInt(aData[rangeObj.colNum])

                if ( min < columnValue && columnValue < max )
                {
                    return true;
                }
                return false;
            }



            var results = _.map(rangeFields, function(rangeObj){
                return isColumnInRange(rangeObj);
            })

            var min = parseInt($(filters.priceMin).val());
            var max = parseInt($(filters.priceMax).val());
            isNaN(min) ? (min = 0) : null
            isNaN(max) ? (max = 9999999) : null

            var columnValue = parseInt(aData[columnOrderingHash["price"]])

            results.push(min < columnValue && columnValue < max)*/

            var results = [];

            var description = $.trim($(filters.description).val());
            if (description != ""){
                var regex = new RegExp(description, "i")
                var vehicleLabel = aData[columnOrderingHash["vehicle_label"]]
                if (vehicleLabel.match(regex) != null){
                    results.push(true)
                }
                else{
                    results.push(false)
                }
            }

            var maintainedSelection = $(filters.maintained).val();
            if (maintainedSelection != ""){
                results.push(maintainedSelection == $.trim(aData[columnOrderingHash["maintained"]]))
            }

            var monthsSelection = $(filters.months).val();
            if (monthsSelection != ""){
                results.push(monthsSelection == $.trim(aData[columnOrderingHash["months"]]))
            }

            var milesSelection = $(filters.miles).val();
            if (milesSelection != ""){
                results.push(milesSelection == $.trim(aData[columnOrderingHash["miles"]]))
            }

            return _.indexOf(results, false) == -1
        }
        else{
            // returning true as the p11d, co2 and mpg filters are not on
            // the page
            return true;
        }
        return true;
    });


var JQueryDataTableHelper = {

    initialiseAllDataTables: function(){
        $(".mmc-datatable-info").each(function(){
            var dataTableConfigObj = $(this).data("dataTableHash")
            var dataTable = $(this).find(".mmc-datatable")
            console.log(dataTable)
            $(this).data("instance", $(dataTable).dataTable(dataTableConfigObj))
        })
    },

    // this function works on the assumption that the element provided
    // is inside the expected data table format (my own not datatables) where
    // every data table is stored in a div.mmc-datatable-info container using
    // jqueries data methods
    getDataTableFromElement: function(element){
        return $(element).parents(".mmc-datatable-info").data("instance")
    },

    getRowRecordIdFromElement: function(element){
        return $(this.getRowFromElement(element)).attr("data-id")
    },

    getRowFromElement: function(element){
        return $(element).parents("tr:first")[0];
    },

    getRowNumFromElement: function(element){
        var row = this.getRowFromElement(element)
        return this.getDataTableFromElement(element).fnGetPosition(row)
    },

    updateRowColumns: function(elementInRow, newContentObj){
        //debugger
        var self = this;
        var rowNum = self.getRowNumFromElement(elementInRow);
        var dataTable = self.getDataTableFromElement(elementInRow)
        self.highlightRow(elementInRow)
        self._updateRowColumns(rowNum, dataTable, newContentObj)
        setTimeout(function(){
            self.unhighlightRow(elementInRow)
        }, 1000)
    },

    highlightRow: function(element){
        if (!$(element).is("tr")){
            element = this.getRowFromElement(element)
        }
        $(element).addClass("highlight")
    },

    unhighlightRow: function(element){
        if (!$(element).is("tr")){
            element = this.getRowFromElement(element)
        }
        $(element).removeClass("highlight")
    },

    _updateRowColumns: function(rowNum, dataTableObj, newContentObj){
        var self = this;
        $.each(newContentObj, function(key, value){
            var columnNum = key;
            dataTableObj.fnUpdate(value, rowNum, columnNum);
        });
    },

    addDefaultDeleteRecordListeners: function(selectors, options){

        var defaultOptions = {
            onDelete: function(){},
            onDeleteFail: function(){},
            onError: function(){
                alert("An unexpected error has occurred, please try again");
            }
        }

        defaultOptions = $.extend(defaultOptions, options)

        $(selectors).live("click", function(){
            var link = this;
            if(confirm("Are you sure you want to delete this record?")){
                $.ajax({
                    url: link.href,
                    dataType: "json",
                    success: function(response){
                        console.log(response)
                        if (processAjaxRequestSuccess(response)){
                            // get the table row the link was clicked in
                            JQueryDataTableHelper.deleteRowContainingElement(link);
                            defaultOptions.onDelete(response, link)
                        }
                        else{
                            defaultOptions.onDeleteFail(response, link)
                        }
                    },
                    error: function(response){
                        defaultOptions.onError(response, link)
                    }
                })
            }
            return false;
        })
    },


    // create fancy boxes
    //  add onstart callback which will start timer
    //  add onshow callback which will stop timer
    //  if page does not show after 45 seconds make the dialog close
    //      diaplsy message
    //  add close call back
    //      when closed update select list and update table


    /*var defaultOptions = {
            onDialogClose: function(){},
            onError: function(){
                alert("An unexpected error has occurred, please try again");
            }
        }



        defaultOptions = $.extend(defaultOptions, options)

        $(selectors).live("click", function(){
            var link = this;
            $.ajax({
                url: link.href,
                dataType: "json",
                success: function(response){
                    console.log(response)
                    if (processAjaxRequestSuccess(response)){
                        // get the table row the link was clicked in
                        JQueryDataTableHelper.deleteRowContainingElement(link);
                        defaultOptions.onUpdate(response, link)
                    }
                    else{
                        defaultOptions.onUpdateFail(response, link)
                    }
                },
                error: function(response){
                    defaultOptions.onError(response, link)
                }
            })
            return false;
        })*/

    // deletes the table row from the jquery data table which the element
    // is in
    deleteRowContainingElement: function(element, dataTable){
        var self = this;
        if (_.isUndefined(dataTable)){
            dataTable = self.getDataTableFromElement(element)
        }
        var tableRow = $(element).parents("tr.even, tr.odd")
        if (_.isEmpty(tableRow) == false){
            tableRow = tableRow[0]
            $(tableRow).fadeOut("slow", function(){
                var pos = dataTable.fnGetPosition(tableRow)
                dataTable.fnDeleteRow(pos)
            });
        }
    }
}


var FancyBoxHelper = {

    fancyBoxLinkClicked: null,

    _closeFancyBoxTimer: function(){
        console.log("in _closeFancyBoxTimer")
        // wait 45 seconds and then close fancybox and display error message
        this.closeTimer = setTimeout(function(){
            $.fn.fancybox.close();
            addFlashErrorMsg("Error : Could not display page, please try again")
        }, 1000 * 45)
    },

    _stopFancyBoxCloseTimer: function(){
        console.log("in _stopFancyBoxCloseTimer")
        clearTimeout(this.closeTimer)
    },

    addDefaultEditRecordListeners: function(selectors, options){
        var self = this;

        var fancyBoxOptions = {
            frameWidth: 580
        }

        fancyBoxOptions = $.extend(fancyBoxOptions, options.fancybox)

        $(selectors).fancybox({
            frameWidth: 580,
            callbackOnStart: function(){
                self._closeFancyBoxTimer();
                console.log("in callbackOnStart")
                console.log(arguments)
            },
            callbackOnShow: function(){
                self._stopFancyBoxCloseTimer();
                console.log("in callbackOnShow")
                console.log(arguments)
            },
            callbackOnClose: function(){
                console.log("in callbackOnClose")
                console.log(arguments)
                if (fancyBoxOptions.close){
                    fancyBoxOptions.close();
                }
                self.fancyBoxLinkClicked = null;
            }
        })

        // when the fancy box link is clicked set the fancyBoxLinkClicked to
        // the link clicked
        $(selectors).click(function(){
            self.fancyBoxLinkClicked = this;
        })
    }
}

function showTableLoadingMsg(){
    $("#table-loading-msg").show();
}

function hideTableLoadingMsg(){
    $("#table-loading-msg").hide();
}

function getMaxAndMinRangesForFilters(){

    // for each table with filters
    $("div.filter-form-and-data-table-container").each(function(){
        var tableAndFormContainer = this;

        // get the min and max for each column
        var dataTableObject = $(tableAndFormContainer)
        .find(".mmc-datatable-info").data('instance')

        // check that there is data in the table before trying to get the
        //  max and min values
        if (dataTableObject.fnSettings().aoData.length > 0){
            
            var columnOrderingHash = $(tableAndFormContainer)
            .find(".mmc-datatable-info").data('dataTableColumnOrderingHash')

            var columnData = {
                "price": []
            /*"maintained": [],
            "months": [],
            "miles": []*/
            }

            console.log("table data")
            console.log(dataTableObject.fnSettings().aoData)
            _.each(dataTableObject.fnSettings().aoData, function(rowObj){
                console.log(rowObj._aData)
                columnData["price"].push(parseInt($.trim(rowObj._aData[columnOrderingHash["price"]])));
            /*columnData["maintained"].push(parseInt($.trim(rowObj._aData[columnOrderingHash["maintained"]])));
            columnData["months"].push(parseInt($.trim(rowObj._aData[columnOrderingHash["months"]])));
            columnData["miles"].push(parseInt($.trim(rowObj._aData[columnOrderingHash["miles"]])));*/
            })


            $.each(columnData, function(fieldName, arrayOfValues){
                console.log(arrayOfValues)
                var temp = _.compact(arrayOfValues)
                console.log(temp)
                temp = temp.sort(function tempSort(a, b){
                    if(a > b)
                        return 1
                    if(a < b)
                        return -1
                    return 0
                })
                // set the relevant field max and min for each column
                console.log(temp)
                console.log(_.first(temp))
                console.log(_.last(temp))
                $(tableAndFormContainer).find(".min-" + fieldName).val(_.first(temp) - 1)
                $(tableAndFormContainer).find(".max-" + fieldName).val(_.last(temp) + 1)
            })

        }


    })


    

}


/*FormValidator = {

    clearFormValidationMessages: function(form){
        $(form).data("valid", true);
        $(form).find("input, select").data("validation-msgs", "")
    },

    validateForm: function(form){
        FormValidator.clearFormValidationMessages(form)
        var validations = [
        "validatePresent"
        ]

        $.each(validations, function(index, validation){
            // look for any form input elements with validation classes
            form.find("." + validation).each(function(){
                var element = this;
                FormValidator[validation](element)
            })
        })

        if (form.data("valid") == false){
            FormValidator.displayErrors(form);
        }

        return form.data("valid");
    },

    validatePresent: function(element, form){
        if ($.trim($(element).val()) == "" || $(element).val() == "-1"){
            FormValidator.addMsgToElement("this field is required")
            form.data("valid", false)
            
        }
    },

    addMsgToElement: function(element, msg){
        if (typeof($(element).data("validation-msgs")) == "undefined" ||
            $(element).data("validation-msgs") == ""){
            $(element).data("validation-msgs") = [msg]
        }
        else{
            $(element).data("validation-msgs").push(msg)
        }
    },

    displayErrors: function(form){
        //$()
    }
}*/


function waitUntilConditionTrue(conditionFunction, onComplete, options){

    var defaultOptions = {
        delay: (200),
        timeout: (30 * 1000),
        onTimeout: function(){}
    }

    defaultOptions = $.extend(defaultOptions, options)

    if (conditionFunction()){
        console.log("condition already true")
        onComplete();
    }
    else{

        var clearTimers = function(){
            clearInterval(timer);
            clearTimeout(timeoutTimer)
        }

        var timer = setInterval(function(){
            if (conditionFunction()){
                console.log("condition true")
                clearTimers();
                onComplete();
            }
        }, defaultOptions.delay)

        var timeoutTimer = setTimeout(function(){
            console.log("timed out")
            clearTimers();
            defaultOptions.onTimeout();
        }, defaultOptions.timeout)

    }
}

function displayFilterMsg(){

    console.log("in displayFilterMsg")
    // should see the reminder in development mode to ensure any changes do
    // not effect it unexpectedly
    var filterMsgDivs = $(".filter-msg-helper");

    // make sure that the message is not displayed more than once every page
    // load
    if (_.isUndefined(window.filterMsgDisplayedThisPageLoadFlag)){

        window.filterMsgDisplayedThisPageLoadFlag = true;

        console.log("filterMsgDivs : " + filterMsgDivs.length)

        if (filterMsgDivs.length > 0 &&
            ($.cookie("filterMessageDisplayed") == null
                || TcEnv.isDevelopmentMode())){

            console.log("filterMsgDivs.length : " + filterMsgDivs.length)
            console.log("cookie.filterMessageDisplayed : " +
                $.cookie("filterMessageDisplayed"))
            console.log("isDevelopmentMode : " + TcEnv.isDevelopmentMode())

            var removeOverlay = function(){
                $("#tc-overlay").remove();
                $(".filter-msg-helper").remove();
            }

            if ($("#tc-overlay").length == 0){
                $("body").append("<div id='tc-overlay'></div>")
            }
            else{
                $("body").show();
            }

            waitUntilConditionTrue(function(){
                return $(".description:first").offset().top > 0
            }, function(){
                setTimeout(function(){
                    var topOffset = $(".description:first").offset().top;
                    $(".filter-msg-helper").css("top", topOffset - 75)
                    $(".filter-msg-helper").fadeIn("fast", function(){
                        $("#tc-overlay, .filter-msg-helper").click(function(){
                            removeOverlay();
                        })
                    });
                    $.cookie("filterMessageDisplayed", "true", {
                        path: "/", 
                        expires: 30
                    })
                }, 1000)
            })

        }
    }
}


function positionFiltersAboveColumns(){
    var fields = [
    {
        table_headers: "th.vehicle_label",
        filters: ".description-container"
    },

    {
        table_headers: "th.maintained",
        filters: ".maintained-select"
    },

    {
        table_headers: "th.months",
        filters: ".months-select"
    },

    {
        table_headers: "th.miles",
        filters: ".miles-select"
    }
    ]

    $.each(fields, function(item, object){
        var headers = $(object.table_headers);
        var filters = $(object.filters);

        $(headers).each(function(index){
            var offset = $(this).offset();
            $(filters[index]).css('position', 'absolute');
            $(filters[index]).css('left', offset.left);
            $(filters[index]).css('top', offset.top - 30);
            $(filters[index]).css('z-index', 1001);
        })
    })

    displayFilterMsg();
}

function displayCookiesRequiredMsgIfNotTurnedOn(){
    console.log("in displayCookiesRequiredMsgIfNotTurnedOn")
    $.cookie("test", "testing")
    console.log($.cookie("test"))
    if (typeof($.cookie("test")) == "undefined" ||
        $.cookie("test") == null){
        console.log("displaying cookie message")
        _displayErrorMsg("WARNING : Cookies are needed to use the site but they " +
            "are currently TURNED OFF, " +
            "please enable cookies to use this site")
    }
}

$(document).ready(function(){

    $(".tabs").tabs()

    $(".mmc-datatable tbody tr").find("td:last").css("borderRight", "1px solid #C5DBF7")

    JQueryDataTableHelper.initialiseAllDataTables();

    // find all data tables which have the p11d, co2 and mpg filters
    // add the footer callback which hides any loading

    //getMaxAndMinRangesForFilters();

    $('.filter-form').submit( function(e) {
        e.preventDefault();
        e.stopPropagation();
        var self = this;
        console.log("1")
        showTableLoadingMsg()
        setTimeout(function(){
            $(self).parents("div:first").find('.mmc-datatable-info').data("instance").fnDraw();
        }, 200)
        console.log("2")
    });

    $(window).resize(function(){
        positionFiltersAboveColumns();
    })

    // run positionFiltersAboveColumns whenever a tab is clicked as sometimes
    // the datatables will be on the page but they will be hidden behind a tab
    // when the page first loads so the positionFiltersAboveColumns will
    // set the form elements to the wrong place, so this will run
    // positionFiltersAboveColumns every time a tab is selected and will wait
    // until the datatable has had time to be displayed before calling
    // the positioning function
    $('.tabs').bind('tabsselect', function(event, ui) {
        var tabDisplayed = ui.panel;
        console.log(arguments)
        waitUntilConditionTrue(function(){
            console.log($(tabDisplayed).find(".mmc-datatable:visible").length)
            return $(tabDisplayed).find(".mmc-datatable:visible").length > 0;
        }, function(){
            positionFiltersAboveColumns();
        }, {
            timeout: (10 * 1000)
        })
    });

    /*setTimeout(function(){
        positionFiltersAboveColumns();
        $(".description-container, .maintained-select, .months-select, .miles-select").fadeIn("slow")
    }, 1000)*/

    $(".vehicle-label-help").hover(function(){
        $(this).siblings(".vehicle-label-help-full-text").show();
    },
    function(){
        $(this).siblings(".vehicle-label-help-full-text").hide();
    })

})

function showFormPart(partNumShow, partNumHide){
    $(".form-part-" + partNumShow).show();
    $(".form-part-" + partNumHide).hide();
}


// fix to make datatable sort by uk date strings dd/mm/yy
jQuery.fn.dataTableExt.aTypes.unshift(
    function ( sData )
    {
        if (sData.match(/^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(19|20|21)\d\d$/))
        {
            return 'uk_date';
        }
        return null;
    } );

jQuery.fn.dataTableExt.oSort['uk_date-asc']  = function(a,b) {
    var ukDatea = a.split('/');
    var ukDateb = b.split('/');

    var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
    var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

    return ((x < y) ? -1 : ((x > y) ?  1 : 0));
};

jQuery.fn.dataTableExt.oSort['uk_date-desc'] = function(a,b) {
    var ukDatea = a.split('/');
    var ukDateb = b.split('/');

    var x = (ukDatea[2] + ukDatea[1] + ukDatea[0]) * 1;
    var y = (ukDateb[2] + ukDateb[1] + ukDateb[0]) * 1;

    return ((x < y) ? 1 : ((x > y) ?  -1 : 0));
};

function setFiltersToSubmitFormIfChanged(){
    $('.filter-form-and-data-table-container select').change(function(){
        console.log("here")
        $(this).parents('form').submit();
    })
}

$(window).load(function(){
    displayCookiesRequiredMsgIfNotTurnedOn();
    setFiltersToSubmitFormIfChanged()
})

