﻿/*
* Copyright (c) 2008 Justin Britten justinbritten at gmail.com
*
* Some code was borrowed from:
* 1. Greg Weber's uiTableFilter project (http://gregweber.info/projects/uitablefilter)
* 2. Denny Ferrassoli & Charles Christolini's TypeWatch project (www.dennydotnet.com)
*
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
*/


(function($) {
    $.extend({
        tablesorterFilter: new function() {

            function has_words(str, words, caseSensitive) {
                var text = caseSensitive ? str : str.toLowerCase();

                for (var i = 0; i < words.length; i++) {
                    if (text.indexOf(words[i]) === -1) return false;
                }

                return true;
            }


            function doFilter(table) {
                var findStrCategory = "";
                var findStrDate = "";
                var findStrMarket = "";
                var phraseCategory = "";
                var phraseDate = "";
                var phraseMarket = "";
                
                var resultRowsCategory = [];
                var resultRowsDate = [];
                var resultRowsMarket = [];
                var tmpDateArray = [];
                var dateArrayCounter = 0;
                
                if (table.config.debug) { var cacheTime = new Date(); }

                var successCategory = function(elem) {
                    elem.show();
                    resultRowsCategory.push(elem);
                }
                var successDate = function(elem, date) {
                    elem.show();
                    tmpDateArray[dateArrayCounter] = new Array(date,elem);
                    dateArrayCounter++;
                    resultRowsDate.push(elem);
                }
                var successMarket = function(elem) {
                    elem.show();
                    resultRowsMarket.push(elem);
                }
                var failure = function(elem) { ; }
                
                findStrCategory += "*[class='category']";
                findStrDate += "*[class='date']";
                findStrMarket += "*[class='market']";
                
                if($('#filterSelection0').val().indexOf('(') != -1){
                    phraseCategory = $('#filterSelection0').val().substring(0, $('#filterSelection0').val().indexOf('('));
                } else {
                    phraseCategory = $('#filterSelection0').val();
                } 
                
                if($('#filterSelection1').val().indexOf('(') != -1){
                    phraseDate = $('#filterSelection1').val().substring(0, $('#filterSelection1').val().indexOf('('));
                } else {
                    phraseDate = $('#filterSelection1').val();
                }
                
                if($('#filterSelection2').val().indexOf('(') != -1){
                    phraseMarket = $('#filterSelection2').val().substring(0, $('#filterSelection2').val().indexOf('('));
                } else {
                    phraseMarket = $('#filterSelection2').val();
                }   
                
                var phraseCategory_length = phraseCategory.length;
                var phraseDate_length = phraseDate.length;
                var phraseMarket_length = phraseMarket.length;
                var caseSensitive = table.config.filterCaseSensitive;
                var wordsCategory = caseSensitive ? phraseCategory.split(" ") : phraseCategory.toLowerCase().split(" ");
                var wordsDate = caseSensitive ? phraseDate.split(" ") : phraseDate.toLowerCase().split(" ");
                var wordsMarket = caseSensitive ? phraseMarket.split(" ") : phraseMarket.toLowerCase().split(" ");

                var search_text_category = function() {
                    var elem = jQuery(this);
                    
                    has_words(elem.find(findStrCategory).text(), wordsCategory, caseSensitive) ? successCategory(elem) : failure(elem);
                }
                
                var search_text_date = function() {
                    var elem = jQuery(this);
                    var a = new Array();
                    var date;
                    
                    var elemString = elem.find(findStrDate).text();
                    
                    if (currentLanguage == "DEU") {     
                        // Umwandlung von deutschen Datumsformat dd.mm.yyyy in Millisekunden seit 1. Jan 1970               
                        a = elemString.split('.');
                        a[1] = a[1].replace(/^[0]+/g,"");
                        date = new Date(a.reverse().join("/")).getTime();    
                    } else {
                        // Umwandlung von internationalem Datumsformat mm/dd/yyyy in Millisekunden seit 1. Jan 1970
                        a = elemString.split('/'); 
                        dateString = a[2]+"/"+a[0]+"/"+a[1];
                        date = new Date(dateString).getTime();                           
                    }                    

                    has_words(elem.find(findStrDate).text(), wordsDate, caseSensitive) ? successDate(elem, date) : failure(elem);
                }
                
                var search_text_market = function() {
                    var elem = jQuery(this);

                    has_words(elem.find(findStrMarket).text(), wordsMarket, caseSensitive) ? successMarket(elem) : failure(elem);
                }

                // Walk through all of the table's rows and search.
                // Rows which match the string will be pushed into the resultRows array.
                var allRows = table.config.cache.row;

                for (var i = 0; i < allRows.length; i++) {
                    allRows[i].each(search_text_category);                    
                }
                
                for (var i = 0; i < resultRowsCategory.length; i++) {
                    resultRowsCategory[i].each(search_text_date);
                }
                
                var dateArray = tmpDateArray.sort(sortMultipleArray);
                
                for (var i = 0; i < dateArray.length; i++) {
                    dateArray[i][1].each(search_text_market);
                }
                
                // Clear the table
                $.tablesorter.clearTableBody(table);

                // Push all rows which matched the search string onto the table for display.
                for (var i = 0; i < resultRowsMarket.length; i++) {
                    $(table.tBodies[0]).append(resultRowsMarket[i]);
                }

                // Update the table by executing some of tablesorter's triggers
                // This will apply any widgets or pagination, if used.
                
                $(table).trigger("update");
                $(table).trigger("appendCache");

                if (table.config.debug) { $.tablesorter.benchmark("Apply filter:", cacheTime); }

                return table;
            };

            function clearFilter(table) {
                if (table.config.debug) { var cacheTime = new Date(); }

                var allRows = table.config.cache.row;

                $.tablesorter.clearTableBody(table);

                for (var i = 0; i < allRows.length; i++) {
                    $(table.tBodies[0]).append(allRows[i]);
                }

                $(table).trigger("update");
                $(table).trigger("appendCache");

                if (table.config.debug) { $.tablesorter.benchmark("Clear filter:", cacheTime); }

                return table;
            };
            
            function dropdownFromElement(element, dropdown) {
                var findStr = "";
                var counter = 0;
                var entryValueLength = "";
                var dropDownEntries = new Array();
                var dropDownDublicateEntries = new Array();
                var labelDropDown = "";
                
                if (element == 'category'){
                    labelDropDown = labelDropDown1;
                } else if (element == 'date'){
                    labelDropDown = labelDropDown2;
                } else {
                    labelDropDown = labelDropDown3;
                }
               
                findStr += "*[class='" + element + "']";
                
                $(dropdown).html("");

                var search_text = function() {
                    var elem = jQuery(this);
                    var isInDropdown = false;
                    
                    if(element == 'date'){
                        dropDownDublicateEntries.push(elem.find(findStr).text().substring(elem.find(findStr).text().length-4));
                    } else {
                        dropDownDublicateEntries.push(elem.find(findStr).text());
                    }
                }
                
                var allRows = table.config.cache.row;

                for (var i = 0; i < allRows.length; i++) {
                    allRows[i].each(search_text);
                }
                
                dropDownDublicateEntries.sort();
                
                if(element == 'date'){
                    dropDownDublicateEntries.reverse();
                }
                
                for (var i = 0; i < dropDownDublicateEntries.length; i++) {
                    counter = countDuplicatesInArray(dropDownDublicateEntries, dropDownDublicateEntries[i], element);
                    dropDownEntries[i] = dropDownDublicateEntries[i] + ' (' + counter + ')';
                }
                
                dropDownEntries = removeDuplicatesFromArray(dropDownEntries);
                
                $(dropdown).append(
                    $('<option></option>').val(" ").html(labelDropDown)
                );
                for (var i = 0; i < dropDownEntries.length; i++) {
                    entryValueLength = dropDownEntries[i].lastIndexOf(" ");
                    $(dropdown).append(
                        $('<option></option>').val(dropDownEntries[i].substring(0, entryValueLength)).html(dropDownEntries[i])
                    );
                }
            };
            
            function dropdownFromSelection(targetElement, targetDropdown) {
                var findStrCategory = "";
                var findStrDate = "";
                var findStrMarket = "";
                var findStr = "";
                var phraseCategory = "";
                var phraseDate = "";
                var phraseMarket = "";    
                var entryValueLength = "";            
                var dropDownEntries = new Array();        
                var dropDownDublicateEntries = new Array();        
                
                var resultRowsCategory = [];
                var resultRowsDate = [];
                var resultRowsMarket = [];
                
                var labelDropDown = "";
                
                if (targetElement == 'category'){
                    labelDropDown = labelDropDown1;
                } else if (targetElement == 'date'){
                    labelDropDown = labelDropDown2;
                } else {
                    labelDropDown = labelDropDown3;
                }

                var successCategory = function(elem) {
                    elem.show();
                    resultRowsCategory.push(elem);
                }
                var successDate = function(elem) {
                    elem.show();
                    resultRowsDate.push(elem);
                }
                var successMarket = function(elem) {
                    elem.show();
                    resultRowsMarket.push(elem);
                }
                var failure = function(elem) { ; }

                findStrCategory += "*[class='category']";
                findStrDate += "*[class='date']";
                findStrMarket += "*[class='market']";
                findStr += "*[class='" + targetElement + "']"; 
                
                if($('#filterSelection0').val().indexOf('(') != -1){
                    phraseCategory = $('#filterSelection0').val().substring(0, $('#filterSelection0').val().indexOf('('));
                } else {
                    phraseCategory = $('#filterSelection0').val();
                } 
                
                if($('#filterSelection1').val().indexOf('(') != -1){
                    phraseDate = $('#filterSelection1').val().substring(0, $('#filterSelection1').val().indexOf('('));
                } else {
                    phraseDate = $('#filterSelection1').val();
                }
                
                if($('#filterSelection2').val().indexOf('(') != -1){
                    phraseMarket = $('#filterSelection2').val().substring(0, $('#filterSelection2').val().indexOf('('));
                } else {
                    phraseMarket = $('#filterSelection2').val();
                }   
                
                var phraseCategory_length = phraseCategory.length;
                var phraseDate_length = phraseDate.length;
                var phraseMarket_length = phraseMarket.length;
                var caseSensitive = table.config.filterCaseSensitive;
                var wordsCategory = caseSensitive ? phraseCategory.split(" ") : phraseCategory.toLowerCase().split(" ");
                var wordsDate = caseSensitive ? phraseDate.split(" ") : phraseDate.toLowerCase().split(" ");
                var wordsMarket = caseSensitive ? phraseMarket.split(" ") : phraseMarket.toLowerCase().split(" ");
                
                var dropdownDefault = "";
                if($(targetDropdown).val().indexOf('(') != -1){
                    dropdownDefault = $(targetDropdown).val().substring(0, $(targetDropdown).val().indexOf('('));
                } else {
                    dropdownDefault = $(targetDropdown).val();
                }
                $(targetDropdown).html("");
                
                var search_text_category = function() {
                    var elem = jQuery(this);

                    has_words(elem.find(findStrCategory).text(), wordsCategory, caseSensitive) ? successCategory(elem) : failure(elem);
                }
                
                var search_text_date = function() {
                    var elem = jQuery(this);

                    has_words(elem.find(findStrDate).text(), wordsDate, caseSensitive) ? successDate(elem) : failure(elem);
                }
                
                var search_text_market = function() {
                    var elem = jQuery(this);

                    has_words(elem.find(findStrMarket).text(), wordsMarket, caseSensitive) ? successMarket(elem) : failure(elem);
                }
                
                var search_text = function() {
                    var elem = jQuery(this);
                    var isInDropdown = false;

                    if(targetElement == 'date'){
                        dropDownDublicateEntries.push(elem.find(findStr).text().substring(elem.find(findStr).text().length-4));
                    } else {
                        dropDownDublicateEntries.push(elem.find(findStr).text());
                    }
                }
                
                var allRows = table.config.cache.row;

                for (var i = 0; i < allRows.length; i++) {
                    allRows[i].each(search_text_category);                    
                }
                
                for (var i = 0; i < resultRowsCategory.length; i++) {
                    resultRowsCategory[i].each(search_text_date);
                }
                
                for (var i = 0; i < resultRowsDate.length; i++) {
                    resultRowsDate[i].each(search_text_market);
                }
                
                for (var i = 0; i < resultRowsMarket.length; i++) {
                    resultRowsMarket[i].each(search_text);
                }
                
                dropDownDublicateEntries.sort();
                
                if(targetElement == 'date'){
                    dropDownDublicateEntries.reverse();
                }
                
                for (var i = 0; i < dropDownDublicateEntries.length; i++) {
                    counter = countDuplicatesInArray(dropDownDublicateEntries, dropDownDublicateEntries[i], targetElement);
                    dropDownEntries[i] = dropDownDublicateEntries[i] + ' (' + counter + ')';
                }
                
                dropDownEntries = removeDuplicatesFromArray(dropDownEntries);
                
                $(targetDropdown).append(
                    $('<option></option>').val(" ").html(labelDropDown)
                );
                for (var i = 0; i < dropDownEntries.length; i++) {
                    entryValueLength = dropDownEntries[i].lastIndexOf(" ");
                    $(targetDropdown).append(
                        $('<option></option>').val(dropDownEntries[i].substring(0, entryValueLength)).html(dropDownEntries[i])
                    );
                }
                
                $(targetDropdown).val(dropdownDefault);
            };
            
            this.createDropdownFromElement = function(element, dropdown) {
                dropdownFromElement(element, dropdown);   
            };
            
            this.createDropdownFromSelection = function() {
                dropdownFromSelection('category', '#filterSelection0');
                dropdownFromSelection('date', '#filterSelection1');
                dropdownFromSelection('market', '#filterSelection2');
                if($('#filterSelection0').val() == category1){
                    $("#filterSelection2 option[value=' ']").remove();
                }
            };
            
            this.initFilterOnLoad = function() {
                doFilter(table);
            };            

            this.defaults = {
                filterContainer: '#filter-box',
                filterClearContainer: '#filter-clear-button',
                filterColumns: null,
                filterCaseSensitive: false
            };

            this.construct = function(settings) {

                return this.each(function() {

                    config = $.extend(this.config, $.tablesorterFilter.defaults, settings);

                    var table = this;

                    // Create a timer which gets reset upon every keyup event.
                    //
                    // Perform filter only when the timer's wait is reached (user finished typing or paused long enough to elapse the timer).
                    //
                    // Do not perform the filter is the query has not changed.
                    //
                    // Immediately perform the filter if the ENTER key is pressed.

                    function checkInputBox(inputBox, override) {
                        var value = inputBox.value;

                        if ((value != inputBox.lastValue) || (override)) {
                            inputBox.lastValue = value;
                            doFilter(table);
                        }
                    };

                    var timer;
                    
                    var selectionString = '';
                    var selection1String = '';
                    var selection2String = '';
                    var selection3String = '';
                    
                    $('#showResult').click(function(){
                        if ($('#filterSelection0').val() != '')
                            selection1String = $('#filterSelection0').val() + ' ';
                        if (($('#filterSelection1').val() != '') && ($('#filterSelection1').length > 0))
                            selection2String = $('#filterSelection1').val() + ' ';    
                        if (($('#filterSelection2').val() != '') && ($('#filterSelection2').length > 0))
                            selection3String = $('#filterSelection2').val();    
                            
                        selectionString = selection1String + selection2String + selection3String;    
                        
                        if (selectionString != ''){
                            $('#filterBox').val(selectionString);
                        } else {
                            return false;
                        }
                        
                        var timerWait = 500;
                        var overrideBool = false;
                        var inputBox = this;
                        
                        // Was ENTER pushed?
                        if (inputBox.keyCode == 13) {
                            timerWait = 1;
                            overrideBool = true;
                        }

                        var timerCallback = function() {
                            checkInputBox($('#filterBox').get(0), overrideBool)
                        }

                        // Reset the timer      
                        clearTimeout(timer);
                        timer = setTimeout(timerCallback, timerWait);

                        return false;
                    });

                    $(config.filterClearContainer).click(function() {
                        clearFilter(table);
                        $(config.filterContainer).val("").focus();
                    });

                    $(table).bind("clearFilter", function() {
                        clearFilter(table);
                    });
                });
            };

        }
    });

    // extend plugin scope
    $.fn.extend({
        tablesorterFilter: $.tablesorterFilter.construct
    });

})(jQuery);  
