var table;
var tablecont = '';
var frozenHeader;
var frozenColumn;
var showFrozenColumn = false;
var showFrozenHeader = true;
var totalParams = 0;
var totalProducts = 0;
var productsMatching = 0;
var columnSelect;
var wind = $(window);
var docu = $(document);
var ww; //Window width
var dw; //Document width
var tableTop;
var tableLeft;
var tableBodyTop;
var wST = 0; //Window Scroll Top
var wSL = 0; //Window Scroll Left
var cs = []; //columns selected;
var qscol = []; //extra columns to show if doing quicksearch
//var sort = []; //initial sort [[column, direction], [column,direction], ...] 0=ASC,1=DESC
var sortDefault = sort;
var gtd = []; //What columns are showing gtd values
var s = []; //current sort
var h; //url hash value
var params = [];
var param = [];
var vals = [];
var srchFilters;
var pama = [];
var initfilter = []; //store initial filter values
var doinitfilter = false; //flag to filter on page load
var dscols = 8; //number of columns to show on load
var dlcols = 8; //max mumber of columns to create on load
var show = [];
var create = [];
var loaded = false;
var custom = []; //store custom columns
var openParam = false; //Currently opened checkbox box
var paramStartVal = false;//Current checkbox values, do we need to filter?
var lsvalue = false;//Last checked value (Used for checking a range)
var tablerows = []; //html of each table row, used to build table
var updatingHash = false; //Are we updating hash (or did the user hit the back button?)
var currentHash = unescape(window.location.hash); //Are we updating hash (or did the user hit the back button?)
var prcor = []; //current product sort
var prshow = []; //current products showing

//////////////////////////////////////////////////////////////
//DO STUFF AFTER PAGE LOAD
//////////////////////////////////////////////////////////////
$(function () {
    var wayt = $('#wayt');

    totalParams = pain.length;
    totalProducts = prin.length;
    productsMatching = prin.length;
    if (totalProducts < 400 && !$.browser.msie) {
        showFrozenColumn = true;
    }
    if ($.browser.msie && $.browser.version < 9.0) {
        showFrozenHeader = false;
    }

    //tableTop = table.offset().top;
    tableTop = $('#leftButtons').offset().top + $('#leftButtons').height();
    processHash();
    createHeaderRows();
    getProductRows();
    createColumnSelect();
    createFrozenHeader();
    table = $("#paraSearch");
    //Frozen header/column/column-select
    frozenHeader = $("#frozen-header");
    frozenColumn = $("#frozen-column");
    columnSelect = $("#column-select");
    //Show total products
    updatePartCount();
    addColRowClasses();

	window.setTimeout(function(){working('Setting Up Table, Please Wait.')},1);


    //Get column styles for faster show/hide
    var n = (document.styleSheets) ? document.styleSheets.length - 1 : 0;
    //incase css has been inserted by an extension/plugin also check that we have the right one
    while(n > -1){
    if (document.styleSheets[n].cssRules) {
		if(document.styleSheets[n].cssRules[0].selectorText == '.col0'){
        colcss = document.styleSheets[n].cssRules
		break;
		}
        
    } else if (document.styleSheets[n].rules) {
		if(document.styleSheets[n].rules[0].selectorText == '.col0'){
        colcss = document.styleSheets[n].rules
		break;
		}
    }
    n--;
	}

    //hide columns not set as show and set cs varaible if not set
    cs = [];
    for (var k in paor) {
        colcss[k].style.display = (show[k]) ? ($.browser.msie ? "block" : "table-cell") : "none";
        if (show[k]) {
            cs.push(paor[k])
        }
    }

    freshTable();
    if(create[paToKey(10002)] == true){$('#price-disclaimer').html(pricedisc);}
    
    saveChange();

//////////////////////////////////////////////////////////////////////////////////////////
// WATCH EVENTS
//////////////////////////////////////////////////////////////////////////////////////////

    //If hash changes (ie: back button or quicksearch) process it
    $(window).bind('hashchange', function() {
        thishash = unescape(window.location.hash);
		if(currentHash != thishash){
            currentHash = thishash;
            doinitfilter = true;
            working('Updating Table, Please Wait.');
            window.setTimeout(function(){
                processHash();
                setColumnSelect()
                updateCols()
                freshTable();
            working('');
            },100);
		saveChange();           
		}
	});
    
    //Handle press enter on text box conditionals
    $(".conditional-text").livequery('keypress', function (e) {
        if (e.keyCode == 13) {
            $(e.target).change();
            return false;
        }
    });

    //Multiselect Checkbox stuff
    $(document).bind('mousedown.multiselect', function (e) {
        if (openParam && !$.contains(openParam[0], e.target)) {
            openParam.hide().find('label').removeClass('ui-state-hover');  
            if(paramStartVal != openParam.find('input.multicheckbox').serialize()){
                if (openParam.attr('id') == 'column-checks') {
                    working('Updating Columns, Please Wait.');
                    window.setTimeout(function(){closeCol()},100)
                }else{
                    working('Filtering Table, Please Wait.');
                    window.setTimeout(function(){closeParam()},2);
                }
            }
        }
    });

    //Open/Close buttons
    buttons = $("button.ui-multiselect");
    buttons.livequery('click', function (e) {
        openParam = $(this).next().css('width', ($(this).width() + 100) + 'px').show().position({
            my: 'right top',
            at: 'right bottom',
            of: e.target,
            collision: 'fit'
        });
    paramStartVal = openParam.find('input.multicheckbox').serialize();
    });

    buttons.livequery('mouseenter', function (e) {
        $(this).addClass('ui-state-hover');
    });
    buttons.livequery('mouseleave', function (e) {
        $(this).removeClass('ui-state-hover');
    });
    buttons.livequery('focus', function (e) {
        $(this).addClass('ui-state-focus');
    });
    buttons.livequery('blur', function (e) {
        $(this).removeClass('ui-state-focus');
    });


    $("#column-select li label").livequery('click',function (e) {
           updateColSelLabel(); 
    });

    // Multiselect header links
    $(".ui-multiselect-header a").livequery('click', function (e) {
        // close link
        if ($(this).hasClass('ui-multiselect-close') && openParam) {
            openParam.hide().find('label').removeClass('ui-state-hover');
            if(paramStartVal != openParam.find('input.multicheckbox').serialize()){
			 if (openParam.attr('id') == 'column-checks') {
				working('Updating Columns, Please Wait.');
				window.setTimeout(function(){closeCol()},100)
             }else{
                working('Filtering Table, Please Wait.')
                window.setTimeout(function(){closeParam()},100);
             }
            }
        // show/hide GTD values
        }else if($(this).hasClass('ui-multiselect-gtd') && openParam) {
            if ($(this).hasClass('ui-state-active')) {
                $(this).removeClass('ui-state-active')
                showGTD(false);
            } else {
                $(this).addClass('ui-state-active')
                showGTD(true);
            }
        // check all / uncheck all
        }else if($(this).hasClass('ui-multiselect-all') && openParam) {
            checkAll(true);
        } else if (openParam) {
            checkAll(false);
        }
        e.preventDefault();
    });
    
    
    // header check uncheck all
    $(".ui-multiselect-header input").livequery('click', function (e) {
        // close link
        if ($(this).attr('checked') && openParam) {
            checkAll(true);
        } else if (openParam) {
            checkAll(false);
        }
        updateColSelLabel();
    });

    //Range Select Buttons
    $(".ui-multiselect-checkboxes a").livequery('click', function (e) {
        svalue = $(this).parent().find('.multicheckbox').attr('id');
        if (openParam) {
            toggleCheckedRange(svalue, $(this).hasClass('ui-multiselect-allfrom'));
        }
        e.preventDefault();
    });

    //Change multiselect lable state on hover
    $(".ui-multiselect-checkboxes label").livequery('mouseenter', function (e) {
        $(this).closest('ul').find('label').removeClass('ui-state-hover');
        if (!$(this).hasClass('ui-state-disabled')) {
            $(this).addClass('ui-state-hover').find('input').focus();
        }
    });

    //Text Conditionals
    $(".conditional-text").livequery('change', function (e) {
		window.setTimeout(function(){working('Filtering Table, Please Wait.')},1);
		$this=$(this);
		window.setTimeout(function(){
			$this.val($this.val().replace(/,/g, '.'));
			doSelectboxUpdate($this.attr('id'));
			filterTable();
			setFrozen();
			updateHash();
			saveChange();
        },2);
    });

    //SORTING
    $(".header").livequery('click', function (e) {
        if (!e['shiftKey'] && !e['ctrlKey']) {
            sort = [];
        }
		window.setTimeout(function(){working('Sorting, Please Wait.')},1);
        $this = $(this);
        window.setTimeout(function(){callSort($this)},2);
    });
    
        //SORTING
    $(".fheader").livequery('click', function (e) {
        if (!e['shiftKey'] && !e['ctrlKey']) {
            sort = [];
        }
		window.setTimeout(function(){working('Sorting, Please Wait.')},1);
        $this = $(this);
        window.setTimeout(function(){callSort($this)},2);
    });

    //Show Compare Window
    $('.compare-button').livequery('click', function (event) {
        event.preventDefault();
        if($('.compare-checks:checked').length > 0){
	// Display an external page using an iframe
        var mh = parseInt($(window).height() * .8);
        var mw = parseInt($(window).width() * .8);
        var src = "compare.php?category_id=" + category_id + "&";
        src += table.find('.compare-checks').serialize();
        $("html,body").css("overflow","hidden");
        $.modal('<iframe src="' + src + '" height="' + mh + '" width="' + mw + '" style="border:0">', {
            closeHTML: "<a class='modalCloseImg'> </a>",
            containerCss: {
                backgroundColor: "#fff",
                borderColor: "#fff",
                height: mh,
                padding: 0,
                width: mw
            },
            overlayClose: true,
            onShow: function (d){d.wrap.css('overflow','hidden');},
            onClose: function(){$("html,body").css("overflow","auto"); $.modal.close();}
        });
	}else{
		$comparedialog.dialog('open');
	}
    });

    //Show message if no part selected when trying to compare
	var $comparedialog = $('<div title="No Parts Selected"></div>')
		.html('<p>Please check the boxes next to the parts you would like to compare.</p>')
		.dialog({
			autoOpen: false,
			title: 'No Parts Selected'
		});

    //Export Current Table
    $('#export-btn').livequery('click', function (event) {
        event.preventDefault();
        exportit();
    });

    //Show add custom form
    $('#add-custom').click(function (event) {
        event.preventDefault();
        //Moved custom link to column select box so closing select box here also
        openParam.hide().find('label').removeClass('ui-state-hover');
        working('Updating Columns, Please Wait.');
		window.setTimeout(function(){closeCol()},100)
		//End close select box
        $("#add-custom-div").modal({
            containerCss: {
                backgroundColor: "#fff",
                fontSize: "14px",
                width: 550,
                height: 200
            }
        });
    });

    //Process add custom form
    $('#add-custom-form').submit(function (e) {
        e.preventDefault();
        window.setTimeout(function(){working('Adding Custom Column, Please Wait.')},1);
				window.setTimeout(function(){closeCol()},1);
        var topvalues = [];
        var botvalues = [];
        $(".topvals").each(function () {
            if ($(this).val()) {
                topvalues.push($(this).val());
            }
        });
        $(".botvals").each(function () {
            if ($(this).val()) {
                botvalues.push($(this).val());
            }
        });

        var cus = $("#col_name").val() + '|' + topvalues.join(',') + '|' + botvalues.join(',');
        custom.push(cus);
        addCustomColumn(cus);
        filterTable();
        setFrozen();
        updateHash();
        $.modal.close();
    });

    //scroll frozen elements 
    $(window).scroll(function () {

        wST = $(window).scrollTop();
        wSL = $(window).scrollLeft();
        tableLeft = $("#paraSearch").offset().left;
        tableBodyTop = $($("#paraSearch tr")[1]).offset().top + $($("#paraSearch tr")[1]).height();

        //position of top of header row so we know when to show frozen header
        //var t = $(window).scrollTop() - $('#btnContainer').offset().top - $('#btnContainer').outerHeight();
        if (showFrozenHeader) {
            //Scroll Frozen Header 
            var t = wST - tableTop;
            //current window scroll 
            if (t > 0) {
                frozenHeader.stop().css({
                    top: '0px',
                    left: (tableLeft - wSL) + 'px'
                });

            } else {
                frozenHeader.stop().css({
                    top: '-999px'
                });
            }
        }

        if (showFrozenColumn) {
            //Scroll Frozen  Column
            var t = tableBodyTop - wST;
            var l = wSL - tableLeft;
            if (l > 0) {
                if (!$.browser.msie) {
                    frozenColumn.stop().css({
                        left: '0px',
                        top: t + 'px'
                    });
                }
            } else {
                frozenColumn.stop().css({
                    left: '-999px'
                });
            }
        }

        //Scroll Column Select 
        if (!$.browser.msie) {
            columnSelectRight = ((dw - ww) > 0) ? 17 : $("#paraSearch").offset().left + 7;
        } else {
            columnSelectRight = ((dw - ww) > 20) ? 17 : (ww - $('#paraSearch').width()) / 2 + 7;
        }

        scrolltop = tableTop - columnSelect.height() - wST;
        columnSelect.css({
            top: scrolltop + 'px',
            right: columnSelectRight + 'px'
        });
        //columnSelect.css({top: tos + 'px',right: cos + 'px'});    
    });
    
	window.setTimeout(function(){working('')},2);
    loaded = true;

});

//////////////////////////////////////////////////////////////
//END   DO STUFF AFTER PAGE LOAD
//////////////////////////////////////////////////////////////


//
function processHash() {
    $('#qsform input').val(['']);
    qscol = [];
    h = unescape(window.location.hash);
    $('.conditional-text').val('');
    removeCustom();
    sort = sortDefault;
    if (h.length > 0) { //Do we have a hash value
        var parts = h.split('!');
        for (var k in parts) { //go through the key value pairs
            kv = parts[k].split('_');
            if (kv[0] == 'cols') { //set columns selected array 
                cs = kv[1].split(',');
                cs = $.map(cs, function (i) {
                    return +i;
                });
            } else if (kv[0] == 's') { //set column sort
                if (kv[1].length) {
                    sort = kv[1].split('|');
                    for (var sk in sort) {
                        sort[sk] = $.map(sort[sk].split(','), function (i) {
                            return +i;
                        });
                        //if column has sort set show it even if not in cols or not a default column
                        if ($.inArray(sort[sk][0], cs) < 0) {
                            qscol.push(sort[sk][0]);
                        }
                    }
                }
            } else if (kv[0] == 'cus') { //set custom columns
                if (kv[1].length) {
                    custom.push(kv[1]);
                }
            } else if (kv[0] == 'gtd') { //set custom columns
                if (kv[1].length) {
                gtd = kv[1].split(',');
                gtd = $.map(gtd, function (i) {
                    return +i;
                });
                }
            } else if (!isNaN(kv[0])) { //set filter values
                var paid = parseInt(kv[0]);
                var c = $.inArray(paid, paor); //get filter key
                if (c > -1) { //if found put initial value in parametric info array
                    pain[c][6] = kv[1];
                    //Set text-conditional
                    $('#tc'+paid).val(kv[1]);
                    //if column has filter set show it even if not in cols or not a default column
                    if ($.inArray(paid, cs) < 0) {
                        qscol.push(paid);
                    }
                }
                doinitfilter = true; //filter results on initial page load
                initfilter[kv[0]] = kv[1];
            } else if ($('#qsform input[name='+kv[0]+']').length) { //set quicksearch form input values
                $('#qsform input[name='+kv[0]+']').val([kv[1]]);
            } else if (kv[1] != null && $('#qsform select[name='+kv[0]+']').length) { //set quicksearch form select box values
                $('#qsform select[name='+kv[0]+']').val(kv[1]);
            }
        }
    }
}


function updateHash() {
	//updatingHash = true;
    h = '';
    var cols = [];
    $('#column-checks :checked').each(function () {
        cols.push($(this).val());
    });
    h += '!cols' + '_' + cols.join(',');
    h += '!s' + '_' + sort.join('|');
    h += '!gtd' + '_' + gtd.join(',');  
    if (custom.length > 0) {
        for (var k in custom) {
            h += '!cus' + '_' + custom[k];
        }
    }
    $('.conditional-text').each(function (i) {
        if ($(this).val()) {
            h += '!' + $(this).attr('id').replace(/tc/, "") + '_' + $(this).val();
        }
    });
    currentHash = '#' + h;
    window.location.hash = h;
    if (qscol.length > 0) {
        window.location = window.location.pathname + '#' + h;
    }
	window.setTimeout(function(){working('')},200);
}


function freshTable(){
    for(var k in pror){
        prcor.push(parseInt(k));
        prshow.push(parseInt(k));
	}

    setColumnSelect();
    
    //Add custom columns if found
    if (custom.length > 0) {
        for (var k in custom) {
            addCustomColumn(custom[k], k + 1);
        }
    }

    //SORT
    doSort();

    //Filter table on load if hash values found
    if (doinitfilter) {
        //window.setTimeout(function(){	
        srchFilters = $(".conditional-text");
        srchFilters.each(function (i) {
            //if ($(this).val() != '') {
                doSelectboxUpdate($(this).attr('id'));
            //}
        });

        filterTable();
        //},1);
    }


    //Drag and drop rows
/*
 	table.tableDnD({onDragClass: 'shaded',
			   onDrop: function(table,row){
				  setFrozen(); }
				});
    //update frozen column after sort
    table.bind("sortEnd",function() { 
        	setFrozen(); 
    }); 
    */


    //Set frozen header/column width/hight
    setFrozen();
}




function setFrozen() {
    ww = wind.width();
    dw = docu.width();
    wST = wind.scrollTop();

    //FROZEN HEADER
    if (showFrozenHeader) {
        //Set frozen header width and column width to match main table 
        $("#frozen-header").width($("#paraSearch").width() + 1);
        newh = $("#paraSearch tr:first").height() - 14;
        $("#frozen-header div:visible").each(function (i) {
            $(this).width($($("#paraSearch tr:eq(1) th:visible")[i]).width()).height(newh);
            //$(this).width(hdrrow.cells[i].offsetWidth).height(newh);	
        });
    }

    //FROZEN COLUMN
    if (showFrozenColumn) {
        //Set frozen column div heights/widths to match table rows
         $("#frozen-column").empty();
         var fcd= '<div></div>';
         for(var k in prshow){
             fcd+='<div></div>'
         }
         $("#frozen-column").html(fcd);
         $("#frozen-column div").each(function (i) {
            var pad = 0;
            //($.browser.msie)?8:7;
            var tc = $("#paraSearch tr:eq(" + (i + 2) + ")").find(':first-child');
            $(this).height(tc.height() - pad).width(tc.width()).html(tc.html());
            $(this)[tc.is(':visible') ? 'show' : 'hide']();
        });
         
        table.find('input.compare-checks').each(function (i) {
            var k = prToKey(parseInt($(this).val()));
            $(".cc" + k).attr('checked', $(this).is(":checked"));
        });

        //Scroll Frozen  Column
        var t = tableBodyTop - wST;
        var l = wSL - tableLeft;
        if (l > 0) {
            if (!$.browser.msie) {
                frozenColumn.stop().css({
                    top: t + 'px'
                });
            }
        } else {
            frozenColumn.stop().css({
                top: '-9999px'
            });
        }
    }

    //FROZEN COLUMN SELECT
    if (!$.browser.msie) {
        columnSelectRight = ((dw - ww) > 0) ? 17 : $("#paraSearch").offset().left + 7;
    } else {
        columnSelectRight = ((dw - ww) > 20) ? 17 : (ww - $('#paraSearch').width()) / 2 + 7;
    }
    columnSelect.css({
        top: tableTop - columnSelect.height() - wST + 'px',
        right: columnSelectRight + 'px'
    });
}


//////////////////////////////////////////////////////////////
//PARAMETRIC FILTERING
//////////////////////////////////////////////////////////////

function filterTable() {

    var searchArgs = [];
    var searchParams = [];
    var startRow = 3;
    var startCol = 1
    var ematch = true;
    var ap = '';
    productsMatching = 0
    var past = []; //set param keys
    srchFilters = $(".conditional-text");
    srchFilters.each(function (i) {
        searchArgs.push($(this).val().toLowerCase());
        searchParams.push(parseInt($(this).attr('id').replace(/tc/, "")));
    });
    //get params that are set	
    for (var j in searchArgs) {
        if (searchArgs[j] != "") {
            past.push(paToKey(searchParams[j]));
        }
        //clean out param match count		
        for (var p in pact[paToKey(searchParams[j])]) {
            pact[paToKey(searchParams[j])][p] = 0;
        }
    }
    prshow = [];
    for (var l in prcor) { //each row
        k = parseInt(prcor[l]);
        //var cell_value = new Array();
        var occurence = [];
        var vals = [];
        var isRowValid = true;
        pama[k] = []; //does product match each parametric argument
        //each cell
        for (var j in searchArgs) {
            var pakey = paToKey(searchParams[j]); //parametric key for current search arg
            var num = (pain[pakey][2] == 'numeric') ? true : false; //numeric?		
            var list = (pain[pakey][2] == 'list') ? true : false; //list?			
            var typgtd = (pain[pakey][3] == 1) ? true : false; //typ-gtd?	
            //var cell_data = (typgtd)?prva[k][j][0]:prva[k][j];//get typ if typ-gtd
            var cell_data = prva[k][pakey][0];
            //vals.push(cell_data);
            vals[pakey] = cell_data; //save value for each parametric for current part
            occurence[j] = true;
            if (searchArgs[j] != "" && cell_data !== "") { //if conditional set
                occurence[j] = false;
                var cell_data = (num) ? parseFloat(cell_data) : cell_data;
                args = searchArgs[j].split('|');
                for (var ky in args) {
                    arg = (num) ? parseFloat(args[ky].replace(/[<>]+=*/, "")) : args[ky].replace(/[<>]+=*/, "");
                    if (/<>/.test(args[ky])) { // first checks if there is an operator (<,>,<=,>=,<>)
                        cell_data != arg ? occurence[j] = true : occurence[j] = false;
                    } else if (/<=/.test(args[ky])) {
                        cell_data <= arg ? occurence[j] = true : occurence[j] = false;
                    } else if (/>=/.test(args[ky])) {
                        cell_data >= arg ? occurence[j] = true : occurence[j] = false;
                    } else if (/</.test(args[ky])) {
                        cell_data < arg ? occurence[j] = true : occurence[j] = false;
                    } else if (/>/.test(args[ky])) {
                        cell_data > arg ? occurence[j] = true : occurence[j] = false;
                    } else if (/:/.test(args[ky]) && num) {
                        var conds = args[ky].split(':');
                        cell_data >= parseFloat(conds[0]) && cell_data <= parseFloat(conds[1]) ? occurence[j] = true : occurence[j] = false;
                    } else if (/:/.test(args[ky])) {
                        var conds = args[ky].split(':');
                        cell_data >= conds[0] && cell_data <= conds[1] ? occurence[j] = true : occurence[j] = false;
                    } else {
                        // Improved by Cedric Wartel (cwl)
                        // automatic exact match for selects and special characters are now filtered
                        // modif cwl : exact match automatique sur les select
                        args[ky] = args[ky].replace(/^=+/, "");
                        if (!list) { //match numeric,boolean,text
                            var regexp;
                            if (ematch) regexp = new RegExp('(^)' + regexpEscape(args[ky]) + '($)', "gi");
                            else regexp = new RegExp(regexpEscape(args[ky]), "gi");
                            occurence[j] = regexp.test(cell_data);
                        } else { //match list
                            cellist = cell_data.split(',');
                            for (d in cellist) {
                                if (ematch) regexp = new RegExp('(^\\s*)' + regexpEscape(args[ky]) + '(\\s*$)', "gi");
                                else regexp = new RegExp(regexpEscape(args[ky]), "gi");
                                occurence[j] = regexp.test(cellist[d]);
                                if (occurence[j]) {
                                    break;
                                }
                            }
                        }
                    }
                    //if we have a true break
                    if (occurence[j]) {
                        break;
                    }
                } //each arg	
            }else{ //if searchArgs
                //if its numeric and the cell value is blank hide it
                //if(searchArgs[j] !== "" && cell_data === '' && num){
                //    occurence[j] = false;
                //}
            }
            pama[k][pakey] = (occurence[j]) ? 1 : 0;
        }; // each cell
        isRowValid = (occurence.length && $.inArray(false, occurence) > -1) ? false : true;
        //show or hide row and add to param match count
        if (!isRowValid) {
            //if product is visible hide it and set visible to 0 
            if (prin[k][5] == 1) {
                //$("#r"+k).hide();
                //colcss[parseInt(k) + totalParams].style.display = "none";
                prin[k][5] = 0;
            }

            //for set params check if matches other options 
            for (var x in past) {
                //loop through pama and if all values are 1 except current param then add to count	
                add = 1;
                for (var z in pama[k]) {
                    if (pama[k][z] == 0 && z != past[x]) {
                        add = 0;
                        break;
                    }
                }
                //if product would be shown if this parametric arg was changed add it to count
                if (add == 1) {

                    list = (pain[past[x]][2] == 'list') ? true : false; //list?   
                    if (list) {
                        lvals = vals[past[x]].split(',');
                        for (var m in lvals) {
                            //get array key of parametric values list for the current product value
                            pk = $.inArray(trim(lvals[m]), pava[past[x]])
                            if (pk > -1) {
                                //add to parametric match count 
                                pact[past[x]][pk]++;
                            }
                        }
                    } else {
                        //get array key of parametric values list for the current product value
                        pk = $.inArray(vals[past[x]], pava[past[x]])
                        if (pk > -1) {
                            //add to parametric match count 
                            pact[past[x]][pk]++;
                        }
                    }
                }
            }
        } else {
            productsMatching++;
            //if product is hidden show it
            if (prin[k][5] == 0) {
                //colcss[parseInt(k) + totalParams].style.display = "";
                //$("#r"+k).show();
                //and set visible to 1
                prin[k][5] = 1;
            }
            prshow.push(k);
            ap += tablerows[k];
            for (var h in vals) {
                //check if list
                list = (pain[h][2] == 'list') ? true : false; //list?   
                if (list) {
                    lvals = vals[h].split(',');
                    for (var m in lvals) {
                        pk = $.inArray(trim(lvals[m]), pava[h])
                        if (pk > -1) {
                            pact[h][pk]++;
                        }
                    }
                } else {
                    pk = $.inArray(vals[h], pava[h])
                    if (pk > -1) {
                        pact[h][pk]++;
                    }
                }
            }

        }

    }; //each row
    $('#paraSearch tbody').empty();		
    $('#paraSearch tbody').append(ap); 
    
    updatePartCount();
    disableOptions();
}

function updatePartCount() {
    $('#part-count').html('showing ' + productsMatching + ' of ' + totalProducts + ' total products');
}

function disableOptions() {
    $("#paraSearch .ui-multiselect-menu").each(function (i) {
        var pakey = paToKey(parseInt($(this).attr('id').replace(/c/, "")));
        $(this).find('input.multicheckbox').each(function (j) {
            $(this).parent()[pact[pakey][j] > 0 ? 'removeClass' : 'addClass']('ui-state-disabled');
        });
    });
}

function disableOptionsPaid(paid) {
    var pakey = paToKey(paid);
    $('#' + paid).find('input.multicheckbox').each(function (j) {
        $(this).parent()[pact[pakey][j] > 0 ? 'removeClass' : 'addClass']('ui-state-disabled');
    });
}

function doSelectboxUpdate(tcid) {
    var valsin = new Array();
    var stmts = $('#' + tcid).val().split('|');
    //get select box id from text box id
    var cid = tcid.substr(1);
    c = $.inArray(parseInt(tcid.replace(/tc/, "")), paor);
    var num = (pain[c][2] == 'numeric') ? true : false; //numeric?	
    //var num = $('#'+cid).hasClass('numeric');
    var slen = stmts.length;
    $('#' + cid).find('input.multicheckbox').each(function () {
        for (var i = 0; i < slen; i++) {
            var stmt = stmts[i];
            var thisval = (num) ? parseFloat($(this).val()) : $(this).val();
            if (stmt.substr(0, 2) == "<>") {
                stmt = stmt.substr(2);
                stmt = (num) ? parseFloat(stmt) : stmt;
                    if (thisval != stmt) {
                        valsin.push($(this).val());
                    }
            } else if (stmt.substr(0, 1) == "<") {
                stmt = stmt.substr(1);
                if (stmt.substr(0, 1) == "=") {
                    stmt = (num) ? parseFloat(stmt.substr(1)) : stmt.substr(1);
                    if (thisval <= stmt) {
                        valsin.push($(this).val());
                    }
                } else {
                    stmt = (num) ? parseFloat(stmt) : stmt;
                    if (thisval < stmt) {
                        valsin.push($(this).val());
                    }
                }
            } else if (stmt.substr(0, 1) == ">") {
                stmt = stmt.substr(1);
                if (stmt.substr(0, 1) == "=") {
                    stmt = (num) ? parseFloat(stmt.substr(1)) : stmt.substr(1);
                    if (thisval >= stmt) {
                        valsin.push($(this).val());
                    }
                } else {
                    stmt = (num) ? parseFloat(stmt) : stmt;
                    if (thisval > stmt) {
                        valsin.push($(this).val());
                    }
                }
            } else if (/:/.test(stmt)) {
                var rvals = stmt.split(':');
                rvals0 = (num) ? parseFloat(rvals[0]) : rvals[0];
                rvals1 = (num) ? parseFloat(rvals[1]) : rvals[1];
                if (thisval >= rvals0 && thisval <= rvals1) {
                    valsin.push($(this).val());
                }
            } else if (stmt) {
                //treat =value as just plain value
                stmt = stmt.replace(/^=*/, "");
                stmt = (num) ? parseFloat(stmt) : stmt;
                if (thisval == stmt) {
                    valsin.push($(this).val());
                }

            }
        }
    });

    $('#' + cid).find('input.multicheckbox').attr('checked', function () {
        return ($.inArray(this.value, valsin) > -1) ? true : false;
    });
    var btnval = (valsin.length > 0) ? valsin.length + ' vals' : '';
    $('#' + cid).prev('button').find('span.btn-label').html(btnval);

}


function doTextboxUpdate(cid) {
    var cvals = new Array(); //seleced values
    var pval = ''; //previous selected value
    var cnt = 0;
    var acnt = 0;
    var inrange = false;
    var paid = cid.replace(/c/, "");
    if (paid != 'cust') {
        c = $.inArray(parseInt(paid), paor);
        var num = (pain[c][2] == 'numeric') ? true : false; //numeric?	
    } else {
        var num = true;
    }
    //$('#'+cid).hasClass('numeric');
    if (num) { //Numeric
        $('#' + cid).find('input.multicheckbox').each(function () {
            // $(this).attr('disabled')
            if ($(this).attr('checked')) {
                if (!inrange) {
                    //assume we are starting a range from the first value
                    if (cnt == 0) {
                        cvals[acnt] = '<=';
                        //we are starting a mid range of have a single value
                    } else {
                        cvals[acnt] = $(this).val();
                        pval = $(this).val();
                    }
                    inrange = true;
                }
                pval = $(this).val();
            } else {
                if (inrange) {
                    //we have ended the range that started at the first value
                    if (cvals[acnt] == '<=') {
                        cvals[acnt] += pval;
                        //we have a single value
                    } else if (cvals[acnt] == pval) {
                        //we are ending a mid range
                    } else {
                        cvals[acnt] += ':' + pval;
                    }
                    acnt++;
                }
                inrange = false;
                close
            }

            cnt++;
        });

    } else { //Not Numeric
        $('#' + cid).find('input.multicheckbox').each(function () {
            if ($(this).attr('checked')) {
                cvals.push($(this).val());
            }
        });
    }
    if (inrange) {
        if (cvals[acnt] == '<=') {
            cvals[acnt] = '';
        } else {
            cvals[acnt] = '>=' + cvals[acnt];
        }
    }
    $('#t' + cid).val(cvals.join('|')).change();
    numvals = $('#' + cid).find('input.multicheckbox:checked').length;
    var btnval = (numvals > 0) ? numvals + ' vals' : '';
    $('#' + cid).prev('button').find('span.btn-label').html(btnval);
}


//////////////////////////////////////////////////////////////
//CREATE INITIAL VIEW 
//////////////////////////////////////////////////////////////

function addColRowClasses() {
    var rcs = '<style type="text/css" charset="utf-8">';
    for (var k in pain) {
        rcs += ' .col' + k + '{}';
    }
    for (var k in prin) {
        rcs += ' #r' + k + '{}';
    }
    rcs += '</style>';
    $("head").append(rcs);
}

function createHeaderRows() {
    var t = '<table cellspacing="0" id="paraSearch">'
    //pain 0=>name,1=>unit,2=>datatype,3=>typ_gtd,4=>no-filter,5=>visible,6=>cond_value
    //Headings
    r = '<thead><tr class="headers"><th abbr="p" class="colp header">Product</th>';
    //run through all params and create/show needed columns
    for (var k in paor) {
        if (cs.length) {
            show[k] = ($.inArray(paor[k], cs) > -1) ? true : false;
        } else {
            show[k] = (k < dscols || $.inArray(paor[k], qscol) > -1) ? true : false;
        }
        create[k] = (k < dlcols || show[k]) ? true : false;
        if (create[k]) {
            r += '<th abbr="' + k + '" class="col' + k + ' header">' + pain[k][0] + ' ' + pain[k][1] + '</th>';
        }
    }
    r += '</tr>';
    t += r;

    //Selections
    r = '<tr class="shaded static nodrag nodrop"><th>Selections</th>';
    for (var k in paor) {
        if (create[k]) {
            r += '<th class="col' + k + '"><button type="button" class="ui-multiselect ui-widget ui-state-default ui-corner-all" title="" aria-haspopup="true" tabindex="0" style="width: 99%; "><span class="ui-icon ui-icon-triangle-2-n-s"></span><span class="btn-label"></span></button>';
            //r += '<div id="c' + paor[k] + '" class="ui-multiselect-menu ui-widget ui-widget-content ui-corner-all" style="display: none; "><div class="ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix"><ul class="ui-helper-reset"><li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span></span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span></span></a></li>';
            r += '<div id="c' + paor[k] + '" class="ui-multiselect-menu ui-widget ui-widget-content ui-corner-all" style="display: none; "><div class="ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix"><ul class="ui-helper-reset"><li><span><input type="checkbox" />All</span></li>';

            //if typ-gtd add checkbox
            if (pain[k][3] == 1) {
                gact = ($.inArray(parseInt(paor[k]),gtd) > -1)?' ui-state-active':'';
                r += '<li><a class="ui-multiselect-gtd' + gact + '" href="#"><span>Show GTD</span></a></li>';
            }
            r += '<li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-check"></span></a></li></ul></div>';
            r += '<ul class="ui-multiselect-checkboxes ui-helper-reset" style="height: 175px; ">';
            for (var kk in pava[k]) {
                r += '<li><label for="ui-multiselect-c' + paor[k] + '-option-' + kk + '" class="ui-corner-all"><a class="range-select ui-multiselect-allto" href="#"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></a><a class="range-select ui-multiselect-allfrom" href="#"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></a><input type="checkbox" class="multicheckbox" name="c' + paor[k] + '" id="ui-multiselect-c' + paor[k] + '-option-' + kk + '" value="' + pava[k][kk] + '"><span>' + pava[k][kk] + '</span></label></li>';
            }
            r += '</ul></div></th>';
        }
    }
    r += '</tr>';
    t += r;
    //Text-boxes	
    r = '<tr class="shaded static nodrag nodrop"><th><button class="compare-button" id="compare">Compare</button></th>';
    for (var k in paor) {
        if (create[k]) {
            r += '<th class="col' + k + '"><input class="conditional-text" type="text" id="tc' + paor[k] + '" value="' + pain[k][6] + '"/></th>';
        }
    }
    r += '</tr></thead><tbody></tbody></table>';
    t += r;
    t += '<p class="footnote"> If you need help finding a part, please <a href="http://www.' + base_domain + '/contact">contact your local sales representative for assistance</a></p><span id="price-disclaimer"></span>';
    $('#main').append(t);
}


function createColumnSelect() {
    t = '<div id="column-select">';
    t += '<table><tr>';
    t += '<th>Add/Remove Columns</th></tr>';
    t += '<tr><td><button type="button" class="ui-multiselect ui-widget ui-state-default ui-corner-all" title="" aria-haspopup="true" tabindex="0" style="width: 99%; "><span class="ui-icon ui-icon-triangle-2-n-s"></span><span></span></button>';
    t += '<div id="column-checks" class="ui-multiselect-menu ui-widget ui-widget-content ui-corner-all" style="display: none; "><div class="ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix"><ul class="ui-helper-reset"><li><input type="checkbox" /><span>All</span></a></li><li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-check"></span></a></li></ul></div>';
    //t += '<div id="column-checks" class="ui-multiselect-menu ui-widget ui-widget-content ui-corner-all" style="display: none; "><div class="ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix"><ul class="ui-helper-reset"><li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span></span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span></span></a></li><li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-check"></span></a></li></ul></div>';
    t += '<ul class="ui-multiselect-checkboxes ui-helper-reset" style="height: 175px; ">';
    for (var k in pain) {
        t += '<li><label for="ui-multiselect-columns-option-' + k + '" class="ui-corner-all"><input type="checkbox" class="multicheckbox" name="columns" id="ui-multiselect-columns-option-' + k + '" value="' + paor[k] + '"><span>' + pain[k][0] + '</span></label></li>';
    }
    t += '</ul>';
    t += '<a id="add-custom" href="#" style="float:right;font-size:10px;">Add Custom Column</a>';
    t += '<div></td></tr>';
    t += '<tr><td align="right">';
    //t += '<input id="add-custom" type="image" src="/assets/images/btn_add_custom.gif">';
    t += '<!--<a id="add-custom" href="#" style="font-size:10px;">Add Custom Column</a>-->';
    t += '</td></tr></table></div>';
    $('#main').append(t);
}

function createFrozenHeader() {
    if (showFrozenHeader) {
        var t = '<div id="frozen-header"><div abbr="p" class="colp">Product</div>';
        //run through all params and create/show needed columns
        for (var k in paor) {
            t += '<div abbr="' + k + '" class="col' + k + ' fheader">' + pain[k][0] + ' ' + pain[k][1] + '</div>';
        }
        t += '</div>';
        $('#main').append(t);
    }
    if (showFrozenColumn) {
        createFrozenColumn();
    }
}

function createFrozenColumn() {
    var t = '<div id="frozen-column"><div class="shaded"></div>';
    //run through all params and create/show needed columns
    for (var k in prin) {
        t += '<div class="r' + k + '"></div>';
    }
    t += '</div>';
    $('#main').append(t);
}




//////////////////////////////////////////////////////////////
//UPDATE COLUMNS
//////////////////////////////////////////////////////////////

function updateCols() {
        var addcol = false;
        var remcol = false;
        var remcond = false; //if conditional removed re-filter
        $("#column-checks").find('input.multicheckbox').each(function (i) {
            var paid = $(this).val();
            issel = $(this).is(':checked');
            //Add column if it is selected but was not created yet
            if (issel && !create[i]) {
                addColumn(paor[i]);
                create[i] = true;
                addcol = true;
            }
            //remove column if it is not selected has been created and is not a column created by default
            if (!issel && create[i] && i > dlcols - 1) {
                var tc = $('#tc' + paid);
                if (tc.val() != '') {
                    remcond = true;
                }
                create[i] = false;
                removeColumn(paor[i]);
                remcol = true;

            }
            //if removing a default column that had filter set 
            //clear conditional and do filterTable()
            if (!issel && i < dlcols) {
                var tc = $('#tc' + paid);
                if (tc.val() != '') {
                    tc.val('');
                    doSelectboxUpdate('tc' + paid);
                    remcond = true;
                }
            }
            //set css to hide all coumns not selected
            colcss[i].style.display = (issel) ? ($.browser.msie ? "block" : "table-cell") : "none";
        });
        getProductRows();
        if (remcond) {
            filterTable();
        }
        
        //Add/remove price disclaimer
        if(create[paToKey(10002)] == true){$('#price-disclaimer').html(pricedisc);}else{$('#price-disclaimer').html('');}
}

function addColumn(paid) {
    var addPos;
    var k = paToKey(paid);
    //find position where we should insert column
    table.find('tr:first th').each(function (i) {
        if ($(this).attr('abbr') > k) {
            return (false);
        }
        addPos = i;
    });
    //header row
    r = '<th abbr="' + k + '" class="col' + k + ' header">' + pain[k][0] + ' ' + pain[k][1] + '</th>';
    $('#paraSearch tr:first th:eq(' + addPos + ')').after(r);
    //select conditionals row
    r = '<th class="col' + k + '"><button type="button" class="ui-multiselect ui-widget ui-state-default ui-corner-all" title="" aria-haspopup="true" tabindex="0" style="width: 99%; "><span class="ui-icon ui-icon-triangle-2-n-s"></span><span class="btn-label"></span></button>';
    r += '<div id="c' + paid + '" class="ui-multiselect-menu ui-widget ui-widget-content ui-corner-all" style="display: none; "><div class="ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix"><ul class="ui-helper-reset"><li><span><input type="checkbox" />All</span></li>';
    //if typ-gtd add checkbox
    if (pain[k][3] == 1) {
        gact = ($.inArray(parseInt(paid),gtd) > -1)?' ui-state-active':'';
        r += '<li><a class="ui-multiselect-gtd' + gact + '" href="#"><span>Show GTD</span></a></li>';
    }
    r += '<li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-check"></span></a></li></ul></div>';
    r += '<ul class="ui-multiselect-checkboxes ui-helper-reset" style="height: 175px; ">';
    for (var kk in pava[k]) {
        r += '<li><label for="ui-multiselect-c' + paid + '-option-' + kk + '" class="ui-corner-all"><a class="range-select ui-multiselect-allto" href="#"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></a><a class="range-select ui-multiselect-allfrom" href="#"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></a><input type="checkbox" class="multicheckbox" name="c' + paid + '" id="ui-multiselect-c' + paid + '-option-' + kk + '" value="' + pava[k][kk] + '"><span>' + pava[k][kk] + '</span></label></li>';
    }
    r += '</ul></div></th>';
    $('#paraSearch tr:eq(1) th:eq(' + addPos + ')').after(r);
    //text conditionals row
    r = '<th class="col' + k + '"><input class="conditional-text" type="text" id="tc' + paid + '" value="' + pain[k][6] + '"/></th>';
    $('#paraSearch tr:eq(2) th:eq(' + addPos + ')').after(r);
    //Product rows
    for (var x in prin) {
        r = '<td class="col' + k + '">' + prva[x][k][0] + '</td>';
        $('#r' + x + ' td:eq(' + addPos + ')').after(r);
        //});
    }
    disableOptionsPaid(paid);
}


function addCustomColumn(cus, cusid) {

    cus = cus.split("|");
    tp = $.map(cus[1].split(","), function (i) {
        return +i;
    });
    bp = $.map(cus[2].split(","), function (i) {
        return +i;
    });
    topunits = [];
    botunits = [];
    custvals = [];
    cusid = (cusid) ? parseInt(cusid) : custom.length;
    for (var tpk in tp) {
        if (tp[tpk] == 0) {
            topunits.push(1);
        } else {
            var pak = paToKey(tp[tpk]);
            var pu = pain[pak][1].replace(/[\s()]/g, "");
            topunits.push(pu);
        }
    }
    for (var bpk in bp) {
        if (bp[bpk] == 0) {
            botunits.push(1);
        } else {
            var pak = paToKey(bp[bpk]);
            var pu = pain[pak][1].replace(/[\s()]/g, "");
            botunits.push(pu);
        }
    }
    var cunits = topunits.join("*") + "/" + botunits.join("*");


    //product rows
    for (var x in prin) {

        var topval = 1;
        var botval = 1;
        if (tp[0] > 0) {
            for (var tpk in tp) {
                topval *= prva[x][paToKey(tp[tpk])][0];
            }
        }
        if (bp[0] > 0) {
            for (var bpk in bp) {
                botval *= prva[x][paToKey(bp[bpk])][0];
            }
        }

        var custv = topval / botval;
        custvals.push(custv);
        //add custom value to product value array 
        prva[x].push([custv]);


        r = '<td>' + custv + '</td>';
        $('#r' + x).append(r);
    }

    custvals = arrayUnique(custvals).sort(function (a, b) {
        return a - b
    });


    paor.push(cusid);
    pain.push([cus[0], cunits, "numeric", "1", "", "", ""]);
    pava.push(custvals);
    var pactadd = [];

    //header row
    r = '<th abbr="' + (paor.length - 1) + '" class="col' + (paor.length - 1) + ' header">' + cus[0] + ' (' + cunits + ')</th>';
    $('#paraSearch tr:first').append(r);
    fr = '<div class="col' + (paor.length - 1) + '">' + cus[0] + ' (' + cunits + ')</div>';
    $('#frozen-header').append(fr);  
    //select conditionals row
    r = '<th class="col' + (paor.length - 1) +'"><button type="button" class="ui-multiselect ui-widget ui-state-default ui-corner-all" title="" aria-haspopup="true" tabindex="0" style="width: 99%; "><span class="ui-icon ui-icon-triangle-2-n-s"></span><span class="btn-label"></span></button>';
    r += '<div id="c' + cusid + '" class="ui-multiselect-menu ui-widget ui-widget-content ui-corner-all" style="display: none; "><div class="ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix"><ul class="ui-helper-reset"><li><span><input type="checkbox" />All</span></li><li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-check"></span></a></li></ul></div>';
    r += '<ul class="ui-multiselect-checkboxes ui-helper-reset" style="height: 175px; ">';
    for (var kk in custvals) {
        r += '<li><label for="ui-multiselect-c' + cusid + '-option-' + kk + '" class="ui-corner-all"><a class="range-select ui-multiselect-allto" href="#"><span class="ui-icon ui-icon-arrowthickstop-1-n"></span></a><a class="range-select ui-multiselect-allfrom" href="#"><span class="ui-icon ui-icon-arrowthickstop-1-s"></span></a><input type="checkbox" class="multicheckbox" name="c' + cusid + '" id="ui-multiselect-c' + cusid + '-option-' + kk + '" value="' + custvals[kk] + '"><span>' + custvals[kk] + '</span></label></li>';
    }
    r += '</ul></div></th>';

    $('#paraSearch tr:eq(1)').append(r);
    //test conditionals row
    var filterval = '';
    if (initfilter[cusid] != undefined) {
        filterval = initfilter[cusid];
    }
    r = '<th class="col' + (paor.length - 1) +'"><input class="conditional-text" type="text" id="tc' + cusid + '" value="' + filterval + '"/></th>';
    $('#paraSearch tr:eq(2)').append(r);

    pact.push(pactadd);
    create[paor.length - 1] = true;
    getProductRows();
    filterTable()
    //$("#c"+cusid).multiselect();
}

function removeCustom(){
    for(var k in custom){
        $('#paraSearch .col' + (paor.length -1)).remove();   
        for (var x in prin) {
            prva[x].pop();
        }
        paor.pop();
        pain.pop();
        pava.pop();
        pact.pop();
     $('#frozen-header div:last').remove();    
    }
    custom = [];
}

function removeColumn(paid) {
    var k = paToKey(paid);
    if (k > -1) {
        $('#paraSearch .col' + k).remove();
    }
}


function setColumnSelect() {
    //Set column select values
    $('#column-select').find('input.multicheckbox').attr('checked', function () {
        return ($.inArray(parseInt(this.value), cs) > -1 || $.inArray(parseInt(this.value), qscol) > -1) ? true : false;
    }).length;
    updateColSelLabel(); 
}

function closeParam() {
    doTextboxUpdate(openParam.attr('id'));
    var numchk = openParam.find('input.multicheckbox:checked').length;
    var btnval = (numchk > 0) ? numchk + ' vals' : '';
    openParam.find('span.btn-label').html(btnval);
    openParam = false;
    lsvalue = false;
}

function closeCol() {
    updateColSelLabel(); 
    updateCols();
    setFrozen();
    updateHash();
    openParam = false;
}

function updateColSelLabel() {
    $('#column-select span:eq(1)').html($('#column-select input.multicheckbox:checked').length + ' of ' + $('#column-select input.multicheckbox').length + ' Selected');
}


function checkAll(chk) {
    openParam.find('input.multicheckbox').each(function () {
        $(this).attr('checked', chk);
    });
    if(openParam.attr('id') == 'column-checks'){
       updateColSelLabel(); 
    }
    lsvalue = false;
}

function showGTD(sh) {
    paid = openParam.attr('id').replace(/c/, '');
    $(".gtd" + paid)[sh ? 'removeClass' : 'addClass']('hide');
    paid = parseInt(paid);
    if(sh){
        $gk = $.inArray(paid,gtd);
        //add element if not set
        if($gk < 0){gtd.push(paid);}
    }else{
        $gk = $.inArray(paid,gtd);
        //remove element if set
        if($gk > -1){gtd.splice($gk,1);}
    }
    getProductRows();
}

function rowChk(el) {
    var k = prToKey(parseInt(el.value));
    $("#r" + k)[$(el).is(":checked") ? 'addClass' : 'removeClass']('row-selected');
    $(".cc" + k).attr('checked', $(el).is(":checked"));
}

function toggleCheckedRange(svalue, flag) {
    svalue = parseInt(svalue.substr(svalue.lastIndexOf("-") + 1));
    var $inputs = openParam.find('input.multicheckbox');
    //flag true:selectall >= (from) , false:selectall <= (to) 
    if (flag) {
        // toggle state on inputs
        $inputs.attr('checked', function () {
            //var tv = (num)?parseFloat(this.value):this.value;	
            var tv = parseInt($(this).attr('id').substr($(this).attr('id').lastIndexOf("-") + 1));
            return (lsvalue && lsvalue > svalue) ? tv >= svalue && tv <= lsvalue : tv >= svalue;
        });
    } else {
        $inputs.attr('checked', function () {
            var tv = parseInt($(this).attr('id').substr($(this).attr('id').lastIndexOf("-") + 1));
            return (lsvalue && lsvalue < svalue) ? tv <= svalue && tv >= lsvalue : tv <= svalue;
        });
    }

    lsvalue = svalue;
}

//////////////////////////////////////////////////////////////
//SORTING
//////////////////////////////////////////////////////////////

function getProductRows() {
    //prin 0=>name,1=>title,2=new,3=featured,4=variation_id,5=visible
    tablerows = [];
    r = '';
    for (var k in prin) {
        var thisprod = '<span><input onclick="rowChk(this)" type="checkbox" name="compare[]" class="cc' + k + ' checkbox-align compare-checks" value="' + prin[k][4] + '" /></span><a class=\"product-name\" target="_Blank" href=\"http://www.' + base_domain + '/product/' + prin[k][0] + '\">' + prin[k][0] + '</a><br />';
        thisprod += (prin[k][2] == 1) ? '<span class="product-tag-new">New</span>' : '';
        thisprod += (prin[k][3] == 1) ? '<span class="product-tag-featured">Featured</span>' : '';
        r = '<tr id="r' + k + '"><td>' + thisprod + '</td>';
        for (var kk in paor) {
            if (create[kk]) {
                // if typ_gtd
                //var thisval = (pain[kk][3] == 1)?prva[k][kk][0]:prva[k][kk];
                //should gtd value be visable
                gvis = ($.inArray(parseInt(paor[kk]),gtd) > -1)?'':' hide';
                var thisval = prva[k][kk][0];
                thisval += (pain[kk][3] == 1 && prva[k][kk][1] != '') ? '<span class="gtd' + paor[kk] + gvis +'"> (' + prva[k][kk][1] + ')</span>' : '';
                r += '<td class="col' + kk + '">' + thisval + '</td>';
            }
        }
        r += '</tr>';
        tablerows[k] = r;
        //Dont add rows since we are going to have to sort anyway
        //t+=r;
    }
}

function callSort(el) {
    //sort ascending by default
    var dir = 0;
    //if has class headerSortDown(asc) then sort descending
    if (el.hasClass('headerSortDown')) {
        dir = 1;
    }
    if (el.attr('abbr') == 'p') {
        var paid = 0;
    } else {
        var paid = paor[parseInt(el.attr('abbr'))];
    }
    //update if already sorting on that column
    var ns = true;
    if (sort.length > 0) {
        for (var k in sort) {
            if (sort[k][0] == paid) {
                sort[k][1] = dir;
                ns = false;
            }
        }
    }
    if (ns == true) {
        sort.push([paid, dir]);
    }
    doSort();
    setFrozen();
    updateHash();
}



function doSort() {
    var thisprva = [];
    $('.header').removeClass('headerSortUp headerSortDown');
    $('#frozen-header div').removeClass('headerSortUp headerSortDown');
    var i = 0;
    for (var k in prin) {
	//for (var l in prcor) {
		//k= parseInt(prcor[l]);
        //build temporary prod value array
        thisprva[k] = ([parseInt(k)]);
        //add values for each sort column
        for (var kk in sort) {

            //product sort
            if (sort[kk][0] == 0) {
                var c = 'p';
                thisprva[k].push(prin[k][0]);
            } else {
                var c = paToKey(sort[kk][0]);
                thisprva[k].push(prva[k][c][0]);
            }
            if (i == 0) {
                $('.headers th.col' + c).addClass(sort[kk][1] > 0 ? 'headerSortUp' : 'headerSortDown');
                $('#frozen-header div.col' + c).addClass(sort[kk][1] > 0 ? 'headerSortUp' : 'headerSortDown');
            }
        }
        i++;
    }

    //Sort the temporary array
    thisprva.sort(sortFunc);

    //Build sorted rows
    
    prcor = [];
    var ap = '';
    for (var k in thisprva) {
        //$('#paraSearch').tBodies[0].appendChild(tablerows[thisprva[k][0]]);
        //$('#paraSearch').append(tablerows[thisprva[k][0]]);
        //ap += '<tr id="'+tablerows[thisprva[k][0]].attr('id')+'" >'+tablerows[thisprva[k][0]].html()+'</tr>';
        if($.inArray(thisprva[k][0],prshow) > -1){
        ap += tablerows[thisprva[k][0]];
		}
        //save the current sort order 
        prcor.push(thisprva[k][0]);
    }

    //remove original rows
    //delete tablerows;
    $('#paraSearch tbody').empty();
    //$('#paraSearch').append('<tbody></tbody>');		
    $('#paraSearch tbody').append(ap);
}

function sortFunc(a, b) {
    //loop through sorts 
    for (var k in sort) {
        var o1 = a[parseInt(k) + 1];
        var o2 = b[parseInt(k) + 1];
        //Sort price properly
        if( typeof o1 == 'string' && typeof o2 == 'string'){
        o1 = (o1.indexOf('$') == 0)?parseFloat(o1.substr(1)):o1;
        o2 = (o2.indexOf('$') == 0)?parseFloat(o2.substr(1)):o2;
	    }
        //var p1 = a[1].toLowerCase();
        //var p2 = b[1].toLowerCase();
        //if they are equal skip to next sort
        if (o1 != o2) {
            //are we sortin 0-asc or 1-desc
            if (sort[k][1] == 0) {
                //if (o1 != o2) {
                if (o1 < o2) return -1;
                if (o1 > o2) return 1;
                return 0;
            } else {
                if (o1 > o2) return -1;
                if (o1 < o2) return 1;
                return 0;
            }
        }
    }
    return 0;
}


function exportit(){
    var pa = [];
    var pr = [];
    $("#column-checks").find('input.multicheckbox').each(function(i){
        if($(this).is(':checked')){
            pa.push($(this).val());      
        }
        
    });
   /* for(var k in create){
        if(create[k] == true){
            pa.push(paor[k]);
        }
    }*/
    
    $("#pa").val(pa.join(','));
     for(var k in prshow){
            pr.push(prin[parseInt(prshow[k])][4]);
        }
    $("#pr").val(pr.join(','));  
    
    $("#export").submit();

}

function saveChange(){
	if(currentHash !=''){
		$.post("savechange.php", { ci: category_id, h: currentHash });
	}
}


//////////////////////////////////////////////////////////////
//UTILITY
//////////////////////////////////////////////////////////////


//Show hide working message
function working(msg){
	if(msg.length){
	$('#btnContainer').css('backgroundColor','#F3E2A9');
	$('#working').html('&nbsp;&nbsp;&nbsp;<b>' + msg + '</b>');
	}else{
	$('#btnContainer').css('backgroundColor','transparent');
	$('#working').html('');		
	}
}

//Get parametric array key from parametric id
function paToKey(paid) {
    return $.inArray(paid, paor);
}

//Get product array key from variation id
function prToKey(prid) {
    return $.inArray(prid, pror);
}


function arrayUnique(ar) {
    var f = {},
        i = 0,
        l = ar.length,
        r = [];
    while (i < l) {
        !f[ar[i]] && r.push(ar[i]);
        f[ar[i++]] = 1;
    }
    return r;
}


function trim(stringToTrim) {
    return stringToTrim.replace(/^\s+|\s+$/g, "");
}


function regexpEscape(s)
/*====================================================
	- escapes special characters [\^$.|?*+() 
	for regexp
	- Many thanks to Cedric Wartel for this fn
=====================================================*/
{
    // traite les caractères spéciaux [\^$.|?*+()
    //remplace le carctère c par \c


    function escape(e) {
        a = new RegExp('\\' + e, 'g');
        s = s.replace(a, '\\' + e);
    }
    chars = new Array('\\', '[', '^', '$', '.', '|', '?', '*', '+', '(', ')');
    //chars.each(escape); // no prototype framework here...
    for (e in chars) escape(chars[e]);
    return s;
}


function trim(stringToTrim) {
    return stringToTrim.replace(/^\s+|\s+$/g, "");
}

// Accurate Math Functions


function aMul(arg1, arg2) {
    var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length
    } catch (e) {}
    try {
        m += s2.split(".")[1].length
    } catch (e) {}
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
}

function aDiv(arg1, arg2) {
    var t1 = 0,
        t2 = 0,
        r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length
    } catch (e) {}
    try {
        t2 = arg2.toString().split(".")[1].length
    } catch (e) {}
    with(Math) {
        r1 = Number(arg1.toString().replace(".", ""))
        r2 = Number(arg2.toString().replace(".", ""))
        return (r1 / r2) * pow(10, t2 - t1);
    }
}


