var selectedLeverandor;
var bestFromSelectedLeverandor;
var leverandorerNavn = [];
var leverandorer = {};
var startOfQueryParms = window.location.href.indexOf('?');
var naa_kalkulator;
var CALC_COOKIE_NAME = 'fipoBankProvider';

/**
 * Make sure that all checkboxes identified by the provided jQuery selectors are
 * in a state where at least one is "on" 
 * @param arrayOfSelectors
 * @return undefined
 */
function assertStateOfCheckboxses(arrayOfSelectors)
 {
    var allIsOff = true;
    $.each(arrayOfSelectors,
    function(i, v) {
        if (allIsOff) {
            if ($(v).attr("checked")) {
                allIsOff = false;
            }
        }
    });

    if (allIsOff) {
        $.each(arrayOfSelectors,
        function(i, v) {
            $(v).attr("checked", true);
        });
    }
}

function showLoader() {
    if (0 == $('#loader_image').length) {
        $("#footer").after(
        '<div id="loader_image" style="display: none; z-index: 1500;"><img src="/images/ventesymbol_stort.gif" alt="Laster data..."/></div>');
    }
    // See http://jquery.malsup.com/block/
    $("#blockContainer, #calc_filter, #calc_result, #belaningsgrad, .ad-banner").block({
        message: $('#loader_image'),
        css: {
            border: 'none',
            backgroundColor: '#fff',
            centerY: false,
            opacity: 0.9,
            top: '600px',
            left: ($(window).width() - 80) / 2 + 'px',
            margin: 0,
            padding: 0,
            width: '80px',
            cursor: 'default'
        },
        overlayCSS: {
            backgroundColor: '#fff',
            opacity: 0.96
        },
        fadeOut: $.objectAll ? 50: 400,
        fadeIn: $.objectAll ? 0: 200
    });
}

function hideLoader() {
    // See http://jquery.malsup.com/block/
    $("#blockContainer, #calc_filter, #calc_result, #belaningsgrad, .ad-banner").unblock();
    if (oTable) {
        updateLinkableValueFromDatatables(oTable);
    }
}

function createServiceUrl(url) {
    services_url = "/services/";
    return services_url + url;
}

function getIntervallOutput(row, rente, fromDate, toDate, skipPercent) {
    if (rente) {
        gyldighet = '';
        if (fromDate) {
            gyldighet += 'Gyldig fra ' + fromDate;
        }
        if (toDate) {
            if (gyldighet == '') {
                gyldighet += 'Gyldig til ' + toDate;
            } else {
                gyldighet += ' til ' + toDate;
            }
        }
        var ret = '<a rel="#intervall_info_' + row + '" class="load-local pointer" href="javascript:;">' + rente + (skipPercent ? '': '%') + '</a>'
        + '<span class="hidden"><a href="/Gyldighetsintervall+skjermleser?tekst=Renten er gyldig fra ' + fromDate + '" target="_blank"></a></span>'
        + '<div class="hidden" id="intervall_info_' + row + '"><p>' + gyldighet + '</p></div>';
        return ret;
    } else {
        return '';
    }
}

function extractNumericId(ref) {
    match = ref.match(/^.*\/(\d+)$/);
    if (match[1]) {
        return match[1];
    } else {
        return '';
    }
}

function getFondslink(pageurl, navn, id) {
    if (id) {
        var url = pageurl + id;
        return '<a href="' + url + '">' + navn + '</a>';
    } else return navn;
}

function getProduktlink(navn, id, url) {
    if (id) {
        var completeUrl = encodeURI(url + '?key=' + extractNumericId(id));
        return '<a href="' + completeUrl + '" rel="' + completeUrl + '">' + navn + '</a>';
    } else
    return navn;
}

function getLeverandorWww(caption, url) {
    if (url != null && url.length < 11) return caption;
    else return '<a href="' + url + '" target="_blank">' + caption + '</a>';
}

function getMarkedsomradeOutput(row, caption, info) {
    var ret = '<a rel="#markedsomrade_info_' + row + '" class="load-local pointer" href="javascript:;">' + caption + '</a>'
    + '<span class="hidden"><a href="/Markedsomrade+skjermleser?info=' + info + '" target="_blank"></a></span>'
    + '<div class="hidden" id="markedsomrade_info_' + row + '"><p>' + info + '</p></div>';
    return ret;
}

function getBankBytteLink(providerRef) {
    var bankBytteUrl = getBankBytteUrl(providerRef, $('#kalkulatortype').val());
    return '<a href="' + bankBytteUrl + '">Bytt bank</a>';
}

function jsonToArray(json, fields) {
    output = [];
    for (var i = 0, l = json.length; i < l; i++) {
        row = [];
        rowData = json[i];
        var value;
        for (var j = 0, k = fields.length; j < k; j++) {
            field = fields[j];
            if (field == '') {
                value == '';
            } else if (field.charAt(0) == '@') {
                eval("value = rowData['" + field + "'];");
            } else {
                try {
                    eval("value = rowData." + field + ";");
                } catch(ex) {
                    value = '';
                }
            }

            if (value == undefined) {
                value = '';
            }
            row.push(value);
        }
        output.push(row);
    }
    return output;
}

var _ajax_request = function(url, data, callback, type, method) {
    if (jQuery.isFunction(data)) {
        callback = data;
        data = {};
    }
    return jQuery.ajax({
        type: method,
        url: url,
        data: data,
        success: callback,
        dataType: type
    });
};

var _ajax_json = function(url, data, success, method) {
    return jQuery.ajax({
        url: url,
        type: method,
        data: JSON.stringify(data),
        dataType: 'json',
        contentType: "application/json; charset=utf-8",
        success: success
    });
};

function replaceComma(s) {
    return s.replace(',', '.');
}

jQuery.fn.dataTableExt.oSort['missingnum-asc'] = function(a, b) {
    if (a == '') {
        return 1;
    }
    if (b == '') {
        return - 1;
    }
    var x = parseFloat(replaceComma(a));
    var y = parseFloat(replaceComma(b));
    return ((x < y) ? -1: ((x > y) ? 1: 0));
};

jQuery.fn.dataTableExt.oSort['missingnum-desc'] = function(a, b) {
    if (a == '') {
        return 1;
    }
    if (b == '') {
        return - 1;
    }
    var x = parseFloat(replaceComma(a));
    var y = parseFloat(replaceComma(b));
    return ((x < y) ? 1: ((x > y) ? -1: 0));
};

jQuery.fn.dataTableExt.oSort['num-html-asc'] = function(a, b) {
    var x = a.replace(/<.*?>/g, "").replace(",", ".").replace(" ", "");
    var y = b.replace(/<.*?>/g, "").replace(",", ".").replace(" ", "");
    x = parseFloat(x);
    y = parseFloat(y);
    if (isNaN(x)) x = Number.MAX_VALUE;
    if (isNaN(y)) y = Number.MAX_VALUE;
    return ((x < y) ? -1: ((x > y) ? 1: 0));
};

jQuery.fn.dataTableExt.oSort['num-html-desc'] = function(a, b) {
    var x = a.replace(/<.*?>/g, "").replace(",", ".").replace(" ", "");
    var y = b.replace(/<.*?>/g, "").replace(",", ".").replace(" ", "");
    x = parseFloat(x);
    y = parseFloat(y);
    if (isNaN(x)) x = -1;
    if (isNaN(y)) y = -1;
    return ((x < y) ? 1: ((x > y) ? -1: 0));
};

jQuery.fn.dataTableExt.oSort['num-asc'] = function(a, b) {
    var x = a.replace(",", ".").replace(/[^\d\-\.\/]/g, '');
    var y = b.replace(",", ".").replace(/[^\d\-\.\/]/g, '');
    x = parseFloat(x);
    y = parseFloat(y);
    if (isNaN(x)) x = Number.MAX_VALUE;
    if (isNaN(y)) y = Number.MAX_VALUE;
    return ((x < y) ? -1: ((x > y) ? 1: 0));
};

jQuery.fn.dataTableExt.oSort['num-desc'] = function(a, b) {
    var x = a.replace(",", ".").replace(/[^\d\-\.\/]/g, '');
    var y = b.replace(",", ".").replace(/[^\d\-\.\/]/g, '');
    x = parseFloat(x);
    y = parseFloat(y);
    if (isNaN(x)) x = -1;
    if (isNaN(y)) y = -1;
    return ((x < y) ? 1: ((x > y) ? -1: 0));
};

jQuery.fn.dataTableExt.oSort['string-asc'] = function(a, b) {
    var x = ('' + a).toLowerCase();
    var y = ('' + b).toLowerCase();
    return x.localeCompare(y);
};

jQuery.fn.dataTableExt.oSort['string-desc'] = function(a, b) {
    var x = ('' + a).toLowerCase();
    var y = ('' + b).toLowerCase();
    return y.localeCompare(x);
};

jQuery.fn.dataTableExt.oSort['html-asc'] = function(a, b) {
    var x = a.replace(/<.*?>/g, "").replace(/^\s+|\s+$/g, "").toLowerCase();
    var y = b.replace(/<.*?>/g, "").replace(/^\s+|\s+$/g, "").toLowerCase();
    if (x == '' || y == '') {
        return y.length - x.length;
    } else {
        return x.localeCompare(y);
    }
};

jQuery.fn.dataTableExt.oSort['html-desc'] = function(a, b) {
    var x = a.replace(/<.*?>/g, "").replace(/^\s+|\s+$/g, "").toLowerCase();
    var y = b.replace(/<.*?>/g, "").replace(/^\s+|\s+$/g, "").toLowerCase();
    if (x.length == 0 || y.length == 0) {
        return y.length - x.length;
    } else {
        return y.localeCompare(x);
    }
};


jQuery.extend({
    postJSON: function(url, data, success) {
        return _ajax_json(url, data, success, 'POST');
    },
    putJSON: function(url, data, success) {
        return _ajax_json(url, data, success, 'PUT');
    },
    put: function(url, data, callback, type) {
        return _ajax_request(url, data, callback, type, 'PUT');
    },
    getUrlVars: function() {
        var vars = [],
        hash;
        var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for (var i = 0; i < hashes.length; i++)
        {
            hash = hashes[i].split('=');
            vars.push(hash[0]);
            vars[hash[0]] = hash[1];
        }
        return vars;
    },
    getUrlVar: function(name) {
        return $.getUrlVars()[name];
    }
});

oTable = null;

function createArgs() {
    var args = $('.kalkulatorskjema').serialize();
    if (typeof kalkulatorsettings.filterContainers == "object") {
        $.each(kalkulatorsettings.filterContainers,
        function(i, container) {
            var selected = false;
            $.each($(container + ' .filter_active'),
            function(idx, item) {
                args += '&' + $(item).attr('id') + '=ja';
                selected = true;
            });
            // ingen valgt, velg alle
            if (!selected) {

                // li:visible funker ikke når vi skjuler filtrene. Doh. Egentlig bare et issue for smålån uansett.
                $.each($(container + ' li .filter'),
                function(idx, item) {
                    args += '&' + $(item).attr('id') + '=ja';
                });
            }
        });
    }
    return args;
}

function loadTableData() {
    
    toggleNedbetalingsvalg(naa_kalkulator);

    if ($('#kalkulatortype').text().search('fond') > -1) {
        kalkulatorsettings.initialSortingColumn = [ defaultSortColumn(), "desc" ];
    }
    
    if ((typeof loaded != "undefined") && kalkulatorsettings.noreload) {
        showLoader();
        setTimeout('doFilter()', 500);
        return false;
    }
    loaded = true;
    $('.kalkulatorskjema').find('input').removeClass("inputerror");
    if (isValidInput()) {
        if (kalkulatorsettings.mockResponse) {
            outputTableData(jQuery.parseJSON(kalkulatorsettings.mockResponse));
        }
        else {
            $.ajax({
                url: $('.kalkulatorskjema').attr("action") + '?howManyRoads=' + new Date().getTime(),
                data: createArgs(),
                success: outputTableData,
                error: handleErrors,
                beforeSend: function() {
                    // For some reason .ajaxStart() doesn't fire for this req.?
                    showResultsAndFilters();
                    showLoader();
                    $('#content div.errormessage').hide().text('');
                },
                dataType: "json"
            });
        }
    } else {
        $('#content div.errormessage').text('Manglende eller ugyldige data').show();
        outputTableData({
            data: {},
            metadata: {}
        });
    }
    return false;
}

function handleErrors(result) {
    try {
        elements = jQuery.parseJSON(result.responseText);
        for (var index in elements.metadata.errors) {
            $('#' + elements.metadata.errors[index]).addClass("inputerror");
        }
        outputTableData(elements);
    } catch(ex) {

        }
    hideLoader();
}
var array;
var arrayWatermark = -1;
function proceedTableInsert() {
    if (0 < arrayWatermark) {

        oTable.fnAddData(array.slice(arrayWatermark), false);

        $(".dataTables_paginate").show();
        oTable.fnDraw();
        arrayWatermark = -1;
    }
};
function outputTableData(json, status, xhr) {
    if (kalkulatorsettings.metadata != null) {
        kalkulatorsettings.metadata(json.metadata);
    }

    $('.kalkulatorresultat tfoot').show();
    $('#belaningsgrad').show();


    var sistOppdatert;
    if ($('#kalkulatortype').text().indexOf('fond') > 0) {
        var filedate = xhr.getResponseHeader('Last-Modified');
        var date = new Date(Date.parse(filedate));
        sistOppdatert = date.getDate() + '.' + (date.getMonth() + 1) + "." + date.getFullYear();
    } else {
        sistOppdatert = json.metadata.sistOppdatert;
    }
    $('#sistOppdatert').text('Sist oppdatert ' + sistOppdatert + '. ');

    array = jsonToArray(json.data, kalkulatorsettings.fields);
    if (!oTable)
    {
        // initialiserer datatable
        oTable = $('.kalkulatorresultat').dataTable({
            "fnDrawCallback": function(oSettings) {
                for (var i = 0, iLen = oSettings.aiDisplay.length; i < iLen; i++)
                {
                    $('td:eq(0)', oSettings.aoData[oSettings.aiDisplay[i]].nTr).text(i + 1);
                }
                // See function removeOverClass()
                if ("-1" != $(".dataTables_length SELECT").val()) {
                    $('TD:nth-child(' + (oSettings.aaSorting[0][0] + 1) + ')', $('TBODY TR', oSettings.nTable)).addClass('over');
                }
                if (kalkulatorsettings.postprocess) kalkulatorsettings.postprocess();
                if (selectedLeverandor) {
                    prependBestFromSelectedLeverandor();
                }
            },
            "fnRowCallback": function(node, data, visibleRow, rowInSet) {
                $('.load-local', $(node)).cluetip({
                    local: true,
                    activation: 'hover',
                    showTitle: false,
					mouseOutClose: true,
					hoverIntent: {
					    sensitivity:  1,
					    interval:     750,
					    timeout:      750    
					  }
                });
                $('.produkt_link A', $(node)).cluetip({
                    activation: 'click',
                    attribute: 'href',
                    width: 550,
                    positionBy: 'fixed',
                    topOffset: '-300',
                    leftOffset: '-400',
                    showTitle: false
                });
                $('.produkt_link_fond A', $(node)).cluetip({
                    activation: 'click',
                    attribute: 'href',
                    width: 550,
                    positionBy: 'fixed',
                    topOffset: '-300',
                    leftOffset: '-50',
                    showTitle: false
                });

                return node;
            },
            //            "bProcessing": true,
            //Due to catch-22 with fnDrawCallback, oTable needs to have value first.
            //            "aaData": array.slice(0, 20), // Start med 20 stk.
            "aoColumns": kalkulatorsettings.columnSetup,
            "bStateSave": false,
            "bFilter": kalkulatorsettings.filtering,
            "bAutoWidth": false,
            "oLanguage": {
                //             sProcessing:   "Laster...",
                sLengthMenu: "Vis: <select>"
                + "<option value='10'>10</option>"
                + "<option value='25'>25</option>"
                + "<option value='50'>50</option>"
                + "<option value='100'>100</option>"
                + "<option value='-1'>Alle</option>"
                + "</select> linjer",
                sZeroRecords: kalkulatorsettings.noMatchingRows,
                sInfo: "Viser _START_ til _END_ av _TOTAL_ linjer",
                sInfoEmpty: "Viser 0 til 0 av 0 linjer",
                sInfoFiltered: "",
                //"(filtrert fra _MAX_ totalt antall linjer)",
                sInfoPostFix: "",
                sSearch: "Søk:",
                sUrl: "",
                oPaginate: {
                    sFirst: "Første",
                    sPrevious: "< Forrige",
                    sNext: "Neste >",
                    sLast: "Siste"
                }
            },
            "bSortClasses": false,
            "aaSorting": [kalkulatorsettings.initialSortingColumn],
            "sPaginationType": "full_numbers"
        });
        var tmp = linkableDatatablesProperties['aaSorting'].split(',');
        var sortArgs = [[tmp[0], tmp[1]]];
        if (sortArgs[1]) {
            oTable.fnSort(sortArgs);
        }
        var displayStart = linkableDatatablesProperties['iDisplayStart'];
        var displayLength = linkableDatatablesProperties['iDisplayLength'];
        if ('' != displayStart && '' != displayLength && !isNaN(displayStart) && !isNaN(displayLength)) {
            oTable.fnSettings()._iDisplayStart = displayStart;
            oTable.fnSettings()._iDisplayLength = displayLength;
        }
        oTable.fnAddData(array.slice(0, 20));
        // Start med 20 stk.)
        if (kalkulatorsettings.preprocess) {
            kalkulatorsettings.preprocess();
        }
        if (!kalkulatorsettings.insertAllInFirstGo) {
            // La resten av dataene dilte inn etter 300ms.
            $(".dataTables_info").text("Laster mer data...");
            $(".dataTables_paginate").hide();
            arrayWatermark = 20;
            setTimeout("proceedTableInsert();", 300);
        }
        else {
            oTable.fnAddData(array.slice(20), false);
            oTable.fnDraw();
        }

    } else {
        oTable.fnClearTable();
        oTable.fnAddData(array, false);
        // don't draw on insert.
        oTable.fnDraw();
        // draw now.
    }

    hideLoader();
}

if(!Array.indexOf){
	Array.prototype.indexOf = function(obj){
		for(var i=0; i<this.length; i++){
			if(this[i]==obj){
				return i;
			}
		}
		return -1;
	}
}

function prependBestFromSelectedLeverandor() {
    var prisIndex = kalkulatorsettings.fields.indexOf(kalkulatorsettings.minLeverandor.pris)
    var leverandorIndex = kalkulatorsettings.fields.indexOf(kalkulatorsettings.minLeverandor.leverandor)
    if (!bestFromSelectedLeverandor && oTable) {
        // find the best .. unfortunately this is a O(n) search.
        // ... should be possible to do at the same time as insert... fnRowCallback p'haps?
        var data = oTable.fnSettings().aoData;
        var bestFromSelectedLeverandor = null;
        var bestSum = -1;
        var regex = new RegExp('/.*provider=' + selectedLeverandor.id + '.*/');
        $.each(data,
        function(i, elem) {
            if (regex.test(elem._aData[leverandorIndex])) {
                if (null != bestFromSelectedLeverandor) {
                    var curTotal = parseInt(elem._aData[prisIndex].replace(/[\s\u00A0]/g, ''));
                    if (curTotal < bestSum) {
                        bestFromSelectedLeverandor = elem._aData;
                        bestSum = curTotal;
                    }
                } else {
                    bestFromSelectedLeverandor = elem._aData;
                    bestSum = parseInt(bestFromSelectedLeverandor[prisIndex].replace(/[\s\u00A0]/g, ''));
                }
            }
        });
    }

    if (bestFromSelectedLeverandor && 0 == $('#my_provider_info TD').length) {
        var newTr = '<td class="border_left"><img src="/images/ic_myprovider_bank.gif"/></td>';
        $.each(bestFromSelectedLeverandor.slice(1),
        function(i, elem) {
            if (false != kalkulatorsettings.columnSetup[i + 1]['bVisible']) {
                var colClass = kalkulatorsettings.columnSetup[i + 1]['sClass'];
                if (colClass) {
                    newTr = newTr + '<td class="' + colClass + '">' + elem + '</td>';
                }
                else {
                    newTr = newTr + '<td>' + elem + '</td>';
                }
            }
        });
        $('#my_provider_info').append(newTr).show();
        if (typeof(kalkulatorsettings.minLeverandor.postprocess) == 'function') {
            kalkulatorsettings.minLeverandor.postprocess();
        }
    } else if (0 == $('#my_provider_info TD').length) {
        $('#my_provider_info').append('<td colspan="10">Din leverandør har ingen treff i ditt resultatsett</td>').show();
    }
}

function getBankBytteUrl(providerRef, product)
 {
    var bankId = providerRef.substr(providerRef.lastIndexOf('/') + 1);
    return '/Bank/Bytte+bank?provider=' + bankId + '&product=' + product;
}

function isValidInput(element)
 {
    var isValid = true;
    for (var selector in kalkulatorsettings.validationMap) {
        if (jQuery.isFunction(kalkulatorsettings.validationMap[selector])) {
            if (kalkulatorsettings.validationMap[selector](selector) == true) {
                $(selector).removeClass("inputerror");
            } else {
                $(selector).addClass("inputerror");
                isValid = false;
            }
        } else if (!$(selector).val().match(kalkulatorsettings.validationMap[selector])) {
            $(selector).addClass("inputerror");
            isValid = false;
        } else {
            $(selector).removeClass("inputerror");
        }
    }
    return isValid;
}

var isCrosstripeMeDetached = true;
function attachCrosstripeMeLiveEvent() {
    if (isCrosstripeMeDetached) {
        $('.kalkulatorresultat td, .kalkulatorresultat th').live('mouseenter',
        function() {
            $('.kalkulatorresultat tbody tr td:nth-child(' + ($(this).index() + 1) + ')').addClass('over');
            if ($(this).is('td')) {
                $('.kalkulatorresultat tbody tr:nth-child(' + ($(this).parent().index() + 1) + ') td').addClass('over');
            }
            $(this).addClass('current');
        });
        $('.kalkulatorresultat td, .kalkulatorresultat th').live('mouseleave',
        function() {
            $('.kalkulatorresultat tbody tr td:nth-child(' + ($(this).index() + 1) + ')').removeClass('over');
            if ($(this).is('td')) {
                $('.kalkulatorresultat tbody tr:nth-child(' + ($(this).parent().index() + 1) + ') td').removeClass('over');
            }
            $(this).removeClass('current');
        });
        isCrosstripeMeDetached = false;
    }
}
function deattachCrosstripeMeLiveEvent() {
    if (!isCrosstripeMeDetached) {
        $('.kalkulatorresultat td, .kalkulatorresultat th').die('mouseenter');
        $('.kalkulatorresultat td, .kalkulatorresultat th').die('mouseleave');
        isCrosstripeMeDetached = true;
    }
}
/**
 * Click callback som forventer å ligge på en TD/TH.
 * Vil fjerne alle 'sort' CSS klasser fra TDer i samme kollonne
 */
function removeOverClass() {
    var table = $(this).closest('TABLE');
    var index = $(table).index(this);
    $('.over', table).removeClass('over');
}


function disable(elem) {
    elem.attr('disabled', true);
    elem.addClass("input_disabled");
    elem.removeClass("inputerror");
}

function enable(elem) {
    elem.attr('disabled', false);
    elem.removeClass("input_disabled");
}

function updateLinkableValueFromDatatables(oTable) {
    var settings = oTable.fnSettings();
    var sort = settings.aaSorting[0];
    updateLinkableValue('aaSorting', '' + sort[0] + ',' + sort[1]);
    updateLinkableValue('iDisplayStart', settings._iDisplayStart);
    updateLinkableValue('iDisplayLength', settings._iDisplayLength);
}
function updateLinkableValue(attrName, value) {
    linkableDatatablesProperties[attrName] = value;
}

var linkableDatatablesProperties = {
    aaSorting: '',
    iDisplayStart: '',
    iDisplayLength: ''
};

function populateFormFromUrlAndSubmit() {
    // decompose the URL (window.location.href) into the kalkulator FORM,
    // If form is filled in (partial or complete) then perform submit.
    if ( - 1 < window.location.href.indexOf('?')) {
        var decoded = decodeURIComponent(window.location.href);
        var hashes = decoded.slice(decoded.indexOf('?') + 1).split('&');

        var sortArg = null;
        var displayStart = null;
        var displayLength = null;

        $.each(hashes,
        function(idx, item) {
            var elems = item.split('=');
            if (0 == $('input[name=' + elems[0] + ']').val(elems[1].replace(/\+/g, ' ')).length) {
                updateLinkableValue(elems[0], elems[1]);
            }
        });
    }

    // Update "link" textfield when :
    //          - navigating in pages
    $('.paginate_button').live('click',
    function() {
        var thisVal = $(this).text();
        var nextStart;
        var tableSettings = oTable.fnSettings();
        if (isNaN(thisVal)) {
            // i.e Forrige/Neste or Første/Siste
            if ($(this).hasClass('first')) {
                nextStart = 0;
            }
            else if ($(this).hasClass('last')) {
                var mod = tableSettings.aiDisplay.length % tableSettings._iDisplayLength;
                if (0 == mod) {
                    nextStart = tableSettings.aiDisplay.length - tableSettings._iDisplayLength;
                }
                else {
                    nextStart = tableSettings.aiDisplay.length - mod;
                }
            }
            else if ($(this).hasClass('next')) {
                nextStart = tableSettings._iDisplayStart + tableSettings._iDisplayLength;
            }
            else if ($(this).hasClass('previous')) {
                nextStart = tableSettings._iDisplayStart - tableSettings._iDisplayLength;
            }
        }
        updateLinkableValue('iDisplayStart', nextStart);
        updateLinkableValue('iDisplayLength', tableSettings._iDisplayLength);
    });
    //          - number of results displayed
    $('.dataTables_length SELECT').live('change',
    function() {
        updateLinkableValue('iDisplayLength', $(this).val());

    });
    //          - sorting changes
    $('.sorting,.sorting_asc,.sorting_desc').live('click',
    function() {
        // Assume that classes has already been set.
        var colPosition = $(this).parent().children().index($(this));
        //oTable.fnGetPosition(this)[1];
        /*if( $(this).hasClass('sorting') ) {
            updateLinkableValue('aaSorting', '' + colPosition + ',asc');
        }
        else */
        if ($(this).hasClass('sorting_asc')) {
            updateLinkableValue('aaSorting', '' + colPosition + ',asc');
        }
        else {
            updateLinkableValue('aaSorting', '' + colPosition + ',desc');
        }
    });

    $('A.get_bookmark_link').live('click',
    function() {
        var queryParms = createArgs();
        var baseUrl;
        queryParms = queryParms + '&aaSorting=' + linkableDatatablesProperties.aaSorting +
        '&iDisplayStart=' + linkableDatatablesProperties.iDisplayStart +
        '&iDisplayLength=' + linkableDatatablesProperties.iDisplayLength;


        if ( - 1 == startOfQueryParms)
        baseUrl = window.location.href;
        else
        baseUrl = window.location.href.substring(0, startOfQueryParms);

        checkOrInsertLinkDiv();
        $('INPUT[name=bookmark_link]').val(baseUrl + '?' + queryParms);
        $("#get_bookmark_div").show();
        $('INPUT[name=bookmark_link]').focus();

        return false;
    });
    
}

function checkOrInsertLinkDiv() {
    if (0 == $('#get_bookmark_div').length) {
        $('A.get_bookmark_link').after(
        '<div id="get_bookmark_div" style="display: none; z-index: 10; position: absolute; background: white; border: 1px solid black;">' +
        'Under finner du en lenke til dette resultatet.<span class="bookmark_close" title="Klikk for å lukke">x</span><br/>' +
        'Kopier lenken i tekstboksen under for å sende i epost, eller kopiere til ett bokmerke.' +
        '<input name="bookmark_link" width="80"></div>'
        );
        $('.bookmark_close').click(function() {
            $("#get_bookmark_div").hide();
        });

        $('input[name=bookmark_link]').focus(function() {
            $(this).select();
            return false;
        });
        // Fix for bug related to Chrome (possibly Safari/WebKit)
        $('input[name=bookmark_link]').mouseup(function() {
            return false;
        });
    }
}

function leverandorSelected(event, data, formatted) {
    if (leverandorer && 0 < leverandorerNavn.length) {
        selectedLeverandor = leverandorer[data];
        // dette feiler i IE
        $.cookie(CALC_COOKIE_NAME, selectedLeverandor.visningsnavn + '|' + selectedLeverandor.id);
    }
    // else from $(document).ready()
    $('#my_provider_selected span').html('Din leverandør: <strong>' + formatted + '</strong> ');

    $("#my_provider_find").hide();

    //   updateProviderInfo( data ); //i.e find result and place at index 0.
    if (0 < $(".kalkulatorresultat TBODY TR").length) {
        prependBestFromSelectedLeverandor();
    }
    //   $(".result_list LI.desk").not('.my_provider').hide();
    $("#my_provider_selected").show().removeClass('hide');
    $('.result_list').removeClass('hide');
}

function resetServiceProviderSelection() {
    $.cookie(CALC_COOKIE_NAME, null);
    selectedLeverandor = undefined;
    bestFromSelectedLeverandor = undefined;
    $('.my_provider').removeClass('hide').removeClass('my_provider');

    $("#my_provider_selected").hide();
    $("#my_provider_info").hide().html("");
    $("#my_provider_find").show();
    $("#myProvider").val('Velg bank');
}

function showResultsAndFilters() {
    $('#calc_filter,.kalkulatorresultat,.get_bookmark_link,#customize_text,#customize_header,.ad-banner').fadeIn();
    $('.section-interact').hide();
    $('.ab_takk').hide();
    $('.formcontainer').show();
}

function hideResultsAndFilters() {
    $('#calc_filter').hide();
    $('.kalkulatorresultat').hide();
    $('.get_bookmark_link').hide();
    $('#customize_text').hide();
    $('#customize_header').hide();
    $('.section-interact').hide();
    $('.ad-banner').hide();
}

$(document).ready(function() {
    hideResultsAndFilters();
    
    naa_kalkulator = $('#kalkulatortype').val();
    if (naa_kalkulator == 'laan') {
        if ($('#laan_type').val() == 'bolig')
            naa_kalkulator = 'boliglan';
        else
            naa_kalkulator = 'smalan';
    }    

    $.getJSON(createServiceUrl('leverandor/bank/list'),
    function(json) {
        leverandorerNavn = [];

        //called from below loop
        function addNewLeverandorMatch(v) {
            leverandorerNavn.push(v.visningsnavn);
            leverandorer[v.visningsnavn] = v;
        }

        $.each(json,
        function(i, val) {
            if (0 > $.inArray(val.visningsnavn, leverandorerNavn))
            {
                switch ($('#kalkulatortype').val())
                {
                case 'laan':
                    if ($('#laan_type').val() == 'bolig')
                    {
                        if (val.tilbyr_boliglan)
                        {
                            addNewLeverandorMatch(val);
                        }
                    }
                    else
                    {
                        if (val.tilbyr_forbrukslan)
                        {
                            addNewLeverandorMatch(val);
                        }
                    }
                    break;
                case 'dagligbank':
                    if (val.tilbyr_dagligbank)
                    {
                        addNewLeverandorMatch(val);
                    }
                    break;
                case 'banksparing':
                    if (val.tilbyr_banksparing)
                    {
                        addNewLeverandorMatch(val);
                    }
                    break;
                case 'kredittkort':
                    if (val.tilbyr_kredittkort)
                    {
                        addNewLeverandorMatch(val);
                    }
                    break;
                case 'alle':
                    if (val.tilbyr_boliglan && val.tilbyr_banksparing && val.tilbyr_dagligbank)
                    {
                        addNewLeverandorMatch(val);
                    }
                    break;
                default:
                    //fill all, just in case. Better safe than sorry...
                    addNewLeverandorMatch(val);
                }
            }
        });

        leverandorerNavn.sort();
        if (null != levName && -1 == leverandorerNavn.indexOf(levName)) {
            resetServiceProviderSelection();
        }

        $('#myProvider').autocomplete(
        leverandorerNavn, {
            minChars: 0,
            max: 200,
            width: 310,
            matchContains: true,
            autoFill: false,
            mustMatch: false,
            multiple: false
        }).result(leverandorSelected);
        var cookieValue = $.cookie(CALC_COOKIE_NAME);
        var levName = null;

        if (cookieValue) {
            levName = cookieValue.split('|')[0];
            var levId = cookieValue.split('|')[1];
            selectedLeverandor = leverandorer[levName];
            leverandorSelected(undefined, levName, levName);
        }
    });


    $('#content div.errormessage').ajaxError(function(event, request, settings, exception) {
        if (400 === request.status) {
            $(this).text('Manglende eller ugyldige data').show();
        }
    });
    $('#content div.errormessage').ajaxError(function(event, request, settings, exception) {
        if ((settings.url.indexOf(createServiceUrl('/kalkulator')) > -1) && (400 < request.status)) {
            $(this).html('Vi beklager, men en feil oppstod på tjeneren (feilkode ' + request.status
            + ').<br/>Vennligst prøv igjen om en liten stund.').show();
        }
    });

    $.blockUI.defaults.onUnblock = function() {
        // Make sure that datatables doesn't reset this.
        $("FORM").closest("DIV.calc").css('position', 'static');
    };
    if (!kalkulatorsettings.inhibitAutomaticLoad) {
        setTimeout('loadTableData();', 600);
    }
    else {
        $('#content div.errormessage').hide().text('');
    }

    $('.beregnLink a, .beregnRadio').click(function() {
        setTimeout('loadTableData();', 600);
    });

    // Click callback for å slå av klasser etter columnHover, slik at vi ikke får "prikker"
    $('.sorting').live('click', removeOverClass);
    $('.sorting_desc').live('click', removeOverClass);
    $('.sorting_asc').live('click', removeOverClass);

    attachCrosstripeMeLiveEvent();
    $('.dataTables_length SELECT').live('change',
    function() {
        var val = $(this).val();
        if ("-1" == val) {
            $(".dataTables_wrapper .over").removeClass("over");
            deattachCrosstripeMeLiveEvent();
        }
        else {
            attachCrosstripeMeLiveEvent();
        }
    });

    populateFormFromUrlAndSubmit();

    $("#clear_provider").click(function() {
        resetServiceProviderSelection();
    });
    $("#myProvider").focus(function() {
        $(this).val('');
        $('#myProvider').trigger('change');
    });
    $("#myProvider").change(function(ev) {
        if ($("#myProvider").val() == 'Velg bank') {
            resetServiceProviderSelection();
        }
    });
    $("#myProvider").blur(function() {
        if ('' == $(this).val()) {
            $(this).val('Velg bank');
            selectedProvider = undefined;
        }
    });


});

function updateAllFilter(wrapperLI) {
    var wrapperOutmost = wrapperLI.closest('.filter_wrapper');
    if (0 != $('LI .filter_active :visible', wrapperOutmost).length) {
        $('.all,.all_active', wrapperOutmost).removeClass('all_active').addClass('all');
    }
    else {
        $('.all_active,.all', wrapperOutmost).addClass('all_active').removeClass('all');
    }
    loadTableData();
}

function deselectAllFilterItems(filterItems) {
    $.each(filterItems,
    function(i, items) {
        var wrapperLI = $(this).closest('LI');
        var button = $('IMG.deselect_filter', wrapperLI);

        $(this).removeClass('filter_active').addClass('filter');
        $(button).hide();
    });
}

function selectAllFilterItems(filterItems) {
    $.each(filterItems,
    function(i, items) {
        var wrapperLI = $(this).closest('LI');

        $('IMG.deselect_filter', wrapperLI).show();
        $(this).removeClass('filter').addClass('filter_active');
        updateAllFilter(wrapperLI);
    });
}

function selectOrDeselectAll() {
    if ($(this).hasClass('all')) {
        deselectAllFilterItems($('.filter_active', $(this).closest('.filter_wrapper')));
        $(this).removeClass('all').addClass('all_active');
        loadTableData();
    }
    else {
        // Don't actually do anything.
        //        selectAllFilterItems($('.filter', $(this).closest('.filter_wrapper')) );
        //        $(this).addClass('all').removeClass('all_active');
        }
    return false;
}

function selectFilter() {
    var wrapperLI = $(this).closest('LI');
    $('IMG.deselect_filter', wrapperLI).show();
    $(this).removeClass('filter').addClass('filter_active');
    updateAllFilter(wrapperLI);
    return false;
    //disallow navigation
}

function deselectFilter() {
    var wrapperLI = $(this).closest('LI');
    var activeSpan = $('.filter_active', wrapperLI);

    $(activeSpan).removeClass('filter_active').addClass('filter');
    $(this).hide();
    updateAllFilter(wrapperLI);
}

function deselectAllFilterItems(filterItems) {
    $.each(filterItems,
    function(i, items) {
        var wrapperLI = $(this).closest('LI');
        var button = $('IMG.deselect_filter', wrapperLI);

        $(this).removeClass('filter_active').addClass('filter');
        $(button).hide();
    });
}

function selectAllFilterItems(filterItems) {
    $.each(filterItems,
    function(i, items) {
        var wrapperLI = $(this).closest('LI');

        $('IMG.deselect_filter', wrapperLI).show();
        $(this).removeClass('filter').addClass('filter_active');
        updateAllFilter(wrapperLI);
    });
}

function selectRadioFilter() {
    var wrapperLI = $(this).closest('LI');
    wrapperLI.children('span').removeClass('radio').addClass('radio_active');
    wrapperLI.siblings('li').children('span').removeClass('radio_active').addClass('radio');
    switch ($(this).attr('id')) {
    case 'fast_rente':
        $('.fastrente_wrapper').show();
        break;
    case 'flytende_rente':
        $('.fastrente_wrapper').hide();
        break;
    case 'utenAvdragsfrihet':
        $('.avdragsfrihet_wrapper').hide();
        break;
    case 'medAvdragsfrihet':
        $('.avdragsfrihet_wrapper').show();
        break;
    }
}

function toggleNedbetalingsvalg(kalkulator) {

    var lopetidtermin = $("input[name='lopetidtermin']:checked").val();

    if (lopetidtermin == 'm_lopetid') {
        $('#tidsfiltertype').html("Betaling pr. mnd");
        if (kalkulator == 'smalan') {
            $('#periode').show();
            $('#lopetidtermin_value').removeClass('input_large');
            $('#lopetidtermin_value').addClass('input_special');
        }
    } else {
        $('#tidsfiltertype').html("Nedbet. tid (år/mnd)");
        if (kalkulator == 'smalan') {
            $('#periode').hide();
            $('#lopetidtermin_value').removeClass('input_special');
            $('#lopetidtermin_value').addClass('input_large');
        }
    }
}

function setDefaultRadiobuttons() {
    $('#flytende_rente').attr('checked', 'checked');
    $('#annuitet').attr('checked', 'checked');
    $('#utenAvdragsfrihet').attr('checked', 'checked');
}

function disableEnableDebetcardField() {
    if ($("#debetkort_antall").val() == '0') {
        disable($(".debetkort"));
    } else {
        enable($(".debetkort"));
    }
}

function disableEnableCreditcardField() {
    if ($("#kredittkort_antall").val() == '0') {
        disable($(".kredittkort"));
    } else {
        enable($(".kredittkort"));
    }
}

function disableCreditcardIfAgeUnder18() {
    if ($("#alderstilbudAr").val() < 18 && $("#alderstilbudAr").val() != '') {
        $("#kredittkort_antall").val("0");
        disable($("#kredittkort_antall"));
        disable($(".kredittkort"));
    } else {
        enable($("#kredittkort_antall"));
        enable($(".kredittkort"));
    }
}

function disableNetbankFields() {
    $("#har_nettbank_nei").click(function() {
        disable($(".nettbank"));
    });

    $("#har_nettbank_ja").click(function() {
        enable($(".nettbank"));
    });
}

function showHideUsagepattern() {
    $('#button_detail').click(function() {
        if ($(this).hasClass('button_details_bgblue')) {
            $('#calc_customize').show();
            $('#calc_calculate').show();
            $(this).removeClass('button_details_bgblue').addClass('button_hide');
            $(this).children('span').html("Skjul bruksmønster");
        } else if ($(this).hasClass('button_hide')) {
            $('#calc_customize').hide();
            $('#calc_calculate').hide();
            $(this).removeClass('button_hide').addClass('button_details_bgblue');
            $(this).children('span').html("Vis bruksmønster");
        }
    });
}


function insertPublishedUserData(url) {
    var populert = $("#populert").val();
    if (populert != 'j' && - 1 == startOfQueryParms) {
        $.getJSON(url,
        function(data) {
            $.each(data.items,
            function(i, item) {
                $("#" + item.key + "_" + item.val).attr("checked", true);
                if (item.val != '') {
                    $("#" + item.key).val(item.val);
                }
            });
        });
        $("#populert").val('j');
    }
}

function disable(elem) {
    elem.attr('disabled', true);
    elem.addClass("input_disabled");
    elem.removeClass("inputerror");
}

function enable(elem) {
    elem.attr('disabled', false);
    elem.removeClass("input_disabled");
}

function setDefaultFilter(filterArray, first) {
    if ( - 1 != startOfQueryParms && first) {
        var queryParams = window.location.href;

        $('.all_active').removeClass('all_active').addClass('all');
		
        $.each(filterArray,
        function(i, val) {
            if (queryParams.indexOf(val) != -1) {
                var element = $('#' + val);
			    var wrapperLI = $(element).closest('LI');
                if (element.siblings('img').length > 0) {
                    $('IMG.deselect_filter', wrapperLI).show();
                    $(element).removeClass('filter').addClass('filter_active');
                } else {
                    wrapperLI.children('span').removeClass('radio').addClass('radio_active');
                    wrapperLI.siblings('li').children('span').removeClass('radio_active').addClass('radio');
                    $(element).attr('checked', 'checked');
					if(val === "fast_rente"){
						$('.fastrente_wrapper').show();
					}
					if(val === "medAvdragsfrihet"){
						$('.avdragsfrihet_wrapper').show();
					}
							
                }

            }
        });
    }
}

$(document).ready(function() {
    $('IMG.deselect_filter').live('click', deselectFilter);
    $('.filter').live('click', selectFilter);
    $('.filter_wrapper > SPAN').live('click', selectOrDeselectAll);

    $("#calc_input .big_button").click(function() {
        $('.filter_active').addClass('filter').removeClass('filter_active');
        $('.all').addClass('all_active').removeClass('all');
    });
});
