/**
* Creates a filter input box for grid column.
*
* @method ColumnFilter constructor
* @param filterDivId - id of div container
* @param filterId - id of input box
* @param gridController - grid controller
* @param columnDef - column definition object
* @param inputBoxValue - input box will be filled by this value
*/
function ColumnFilter(mediator, filterDiv, filterId, gridController, columnDef, inputBoxValue, searchFunction) {
    this.mediator = mediator;
    this.filterDiv = filterDiv;
    this.filterId = filterId;
    this.gridController = gridController;
    this.columnDef = columnDef;
    this.inputBoxValue = inputBoxValue;
    this.inputElement = null;
    this.searchFunction = searchFunction;
    
    // Delay timeout.
    this.delayID = -1;

    // Number of miliseconds to delay before submitting a query request.
    this.queryDelay = 750;

    this.createFilterElement = function() {
        //var div = YAHOO.util.Dom.get(this.filterDivId);
        this.inputElement = document.createElement('input');
        this.inputElement.id = this.filterId;
        this.inputElement.setAttribute("type", "text");
        YAHOO.util.Dom.addClass(this.inputElement, "filterInputBox");
        if (columnDef.key != "systemName") {
            YAHOO.util.Dom.setStyle(this.inputElement, "width", "3em");
        }
        this.inputElement.value = this.inputBoxValue;
        if (!this.columnDef.gridData.canHaveFilter) {
            // I need existing input element to have clearInstrumensColumnFilter method simple.
            // Can not substitute it by &nbsp; for instance!
            YAHOO.util.Dom.setStyle(this.inputElement, "display", "none");
            //this.inputElement.setAttribute("disabled", "disabled");
        }
        this.filterDiv.appendChild(this.inputElement);
        YAHOO.util.Event.addListener(this.inputElement, "keyup", this.onTextboxKeyUp, this);
        return this.inputElement;
    },

    this.onTextboxKeyUp = function(event, self) {
        var sText = this.value; //string in textbox

        // Filter out chars that don't trigger queries
        var nKeyCode = event.keyCode;
        if (self.ignoreKey(nKeyCode)) {
            return;
        }

        // Clear previous timeout
        if (self.delayID != -1) {
            clearTimeout(self.delayID);
        }

        // Set new timeout
        self.delayID = setTimeout(function() {
            self.sendQuery(sText);
        }, (self.queryDelay));
    },

    this.sendQuery = function(inputBoxValue) {
        var columnType = this.columnDef.gridData.type;
        var parsed = this.parseUserInput(inputBoxValue, columnType);
        this.mediator.widgetChanged(globals.SEARCH_BY_NAME, this);
        this.gridController.setFilter(this.columnDef, parsed.relationAdjusted, parsed.valueAdjusted);
        this.searchFunction(this.gridController, this.columnDef.key, parsed.relation, parsed.value);
    },


    this.ignoreKey = function(nKeyCode) {
        if ((nKeyCode == 9) || (nKeyCode == 13) || // tab, enter
                (nKeyCode == 16) || (nKeyCode == 17) || // shift, ctl
                (nKeyCode >= 18 && nKeyCode <= 20) || // alt, pause/break,caps lock
                (nKeyCode == 27) || // esc
                (nKeyCode >= 33 && nKeyCode <= 35) || // page up,page down,end
        /*(nKeyCode >= 36 && nKeyCode <= 38) || // home,left,up
        (nKeyCode == 40) || // down*/
                (nKeyCode >= 36 && nKeyCode <= 40) || // home,left,up, right, down
                (nKeyCode >= 44 && nKeyCode <= 45) || // print screen,insert
                (nKeyCode == 229) // Bug 2041973: Korean XP fires 2 keyup events, the key and 229
            ) {
            return true;
        }
        return false;
    },

    this.parseUserInput = function(anInput, aType) {
        var result = {};
        result.relation = "";
        result.value = "";
        result.relationAdjusted = "";
        result.valueAdjusted = "";

        // remove all spaces
        //var input = anInput.replace(/\s+/g, "");
        // remove leading and trailing spaces
        var input = anInput.replace(/(^\s+)|(\s+$)/g, '');

        if (input == "") {
            result.relation = "";
            result.value = "";
            return result;
        }
        
        // if user input is just a number we add '>=' relation and fire
        //if (String(parseFloat(input)) == input) {
        if (aType === 'number' && String(parseFloat(input)) !== "NaN") {
            result.relation = "ge";
            result.value = parseFloat(input);
            result.relationAdjusted = ">=";
            result.valueAdjusted = result.value;
            return result;
        }

        if ((input.indexOf('<=') == 0) || (input.indexOf('=<') == 0)) {
            result.relation = "le";
            result.relationAdjusted = "<=";
            input = input.substring(2);
        }

        if ((input.indexOf('>=') == 0) || (input.indexOf('=>') == 0)) {
            result.relation = "ge";
            result.relationAdjusted = ">=";
            input = input.substring(2);
        }

        if ((input.indexOf('<>') == 0) || (input.indexOf('!=') == 0)) {
            result.relation = "ne";
            result.relationAdjusted = "<>";
            input = input.substring(2);
        }

        if (input.indexOf('<') == 0) {
            result.relation = "lt";
            result.relationAdjusted = "<";
            input = input.substring(1);
        }

        if (input.indexOf('>') == 0) {
            result.relation = "gt";
            result.relationAdjusted = ">";
            input = input.substring(1);
        }

        if (input.indexOf('=') == 0) {
            result.relation = "eq";
            result.relationAdjusted = "=";
            input = input.substring(1);
        }

        if ((input.length == 0) && (aType === "number")) {
            input = "0";
        }

        if (aType === "number") {
            var f = String(parseFloat(input));
            if (f === "NaN") {
                result.value = "";
                result.valueAdjusted = result.value;
                result.relation = "";
            }
            else {
                result.value = f;
                result.valueAdjusted = result.value;
            }
        }
        else {
            result.relation = "like";
            result.relationAdjusted = "";
            result.value = input;
            result.valueAdjusted = result.value;
        }
        return result;
    }

}
