var DrawFilterTools = {
    All: [],
    HeaderType: ["None", "Text", "DateRange", "PriceRange", "Hidden", "Custom"],
    RegisterTable: function (table) {
        DrawFilterTools.All[table.Id] = table;
    }
}

function DrawFilterListTable(id,pagesize, func, requestObj) {
    this.Id = id;
    this.PageSize = pagesize;
    this.CurrentPage = 1;
    this.Func = func;
    this.RequestObject = requestObj;
    this.TotalRowCount = 0;
    this.Filters = [];
    this.Rendered = false;
}

DrawFilterListTable.prototype.GetFilter = function(name, no) {
    var ret = '';
    
    if (no) {
        if (this.Filters[name])
            if (this.Filters[name][no])
                ret = this.Filters[name][no];
    } else {
        if (this.Filters[name])
            ret = this.Filters[name][0];    
    }
    
    return ret;
}

DrawFilterListTable.prototype.GetFilterTitle = function(headerData, no) {
    if (headerData.FilterTitle[no]) {
        return headerData.FilterTitle[no];
    }
    
    return '';
}

function DrawFilterList(id, data) {
    var thisTable = DrawFilterTools.All[id];
    
    if (!thisTable.Rendered) {
        DrawFilterListFull(id, data);
    }
    
    DrawFilterListContent(id, data);
}

function DrawFilterListContent(id, data) {
    var thisTable = DrawFilterTools.All[id];
    
    thisTable.TotalRowCount = data.TotalRowCount;
    var headerCount = data.Headers.length;

    var divTableContainer = $get(id);
    var objTable = $get('table_' + id);
    var objTBody = $get('table_body_' + id);
    var objTFoot = $get('table_foot_' + id);
 
    if (objTBody) {
        while (objTBody.childNodes.length > 0)
            objTBody.removeChild(objTBody.childNodes[0]);
    }
    
    var rowCount = data.Rows.length;
    
    for (var i=0;i<rowCount;i++) {
        var dataRow = data.Rows[i].Columns;
        
        var objDataRow = document.createElement('tr');
        objDataRow.className = data.Rows[i].RowClass;
       
        objTBody.appendChild(objDataRow);
    
        for (var j=0;j<headerCount;j++) {
            if (dataRow.length > j) {
                var columnData = dataRow[j];
                
                var objDataCell = document.createElement('td');
                
                if(columnData.CssClass.length > 0) {
                    objDataCell.className = columnData.CssClass;
                }
 
                objDataCell.innerHTML = columnData.Text;
                objDataRow.appendChild(objDataCell);
                
                if (columnData.NeedsContentRow) 
                {
                    var objContentRow = document.createElement('tr');
                    objContentRow.className = "hide";                                                          
                                                                                         
                    var objContentCell = document.createElement('td');
                    objContentCell.innerHTML = '';
                    
                    objContentCell.setAttribute("id", "content_" + columnData.Id);

                    //setAttribute for colspan is not working in IE
                    objContentCell.colSpan = headerCount;
                    
                    objContentRow.appendChild(objContentCell);
                    objTBody.appendChild(objContentRow);
                }
            }
        }
    }
    
    if (objTFoot) {
        while (objTFoot.childNodes.length > 0)
            objTFoot.removeChild(objTFoot.childNodes[0]);
    }
    
    if (thisTable.PageSize < data.TotalRowCount) {
        var totalPages = data.TotalRowCount / thisTable.PageSize;
        var objFooterRow = document.createElement("tr");
        var objFooterColumn = document.createElement("td");
        objFooterColumn.className = "paging";
        objFooterColumn.colSpan = headerCount;
        
        var displayedPages = 0;
        
        var prevPages = 5;
        var nextPages = 5;
        
        objFooterColumn.innerHTML = '';
        
        if ((thisTable.CurrentPage - 1) < prevPages) {
            var diff = prevPages - (thisTable.CurrentPage - 1);
            prevPages -= diff;
            nextPages += diff;
        }
        
        if ((nextPages + thisTable.CurrentPage) > totalPages)
        {
            var diff = (nextPages + thisTable.CurrentPage) - totalPages;
            nextPages -= diff;
        }
        
        if(thisTable.CurrentPage > 1) {
            objFooterColumn.innerHTML += '<a href="javascript:FilterViewPage(\'' + thisTable.Id + '\', ' + (thisTable.CurrentPage - 1) + ')">' + Translate("product.previous") + '</a>&nbsp;';
        }

        for (var i=prevPages;i>0;i--) {
            var pageId = (thisTable.CurrentPage) - i;
            objFooterColumn.innerHTML += '<a href="javascript:FilterViewPage(\'' + thisTable.Id + '\', ' + pageId + ')">' + pageId + '</a>&nbsp;';   
        }
        
        objFooterColumn.innerHTML += '<strong class="current">' + thisTable.CurrentPage + '</strong>&nbsp;';   
        
        for (var i=1;i<(nextPages + 1);i++) {
            var pageId = thisTable.CurrentPage + i;
            objFooterColumn.innerHTML += '<a href="javascript:FilterViewPage(\'' + thisTable.Id + '\', ' + pageId + ')">' + pageId + '</a>&nbsp;';   
        }
        
        if(thisTable.CurrentPage < totalPages) {
            objFooterColumn.innerHTML += '<a href="javascript:FilterViewPage(\'' + thisTable.Id + '\', ' + (thisTable.CurrentPage + 1) + ')">' + Translate("product.next") + '</a>&nbsp;';   
        }
        
        objFooterColumn.innerHTML += '&nbsp;&nbsp; <input type="text" id="page_'+thisTable.Id+'" maxlength="4" size="2" /><a href="javascript:FilterViewGotoPage(\'' + thisTable.Id + '\')">' + Translate("forms.go") + '</a>&nbsp;';   
        
        
        objFooterRow.appendChild(objFooterColumn);
        objTFoot.appendChild(objFooterRow);
    }
}

function DrawFilterListFull(id, data) {
    var thisTable = DrawFilterTools.All[id];
    
    thisTable.TotalRowCount = data.TotalRowCount;
    
    var divTableContainer = $get(id);
    
    divTableContainer.innerHTML = '';
        
    var objTable = document.createElement('table');
    objTable.cellPadding = 4;
    objTable.cellSpacing = 0;
    objTable.setAttribute("id", 'table_' + id);
    objTable.className = "global_table";
    
    var objTHead = document.createElement('thead');
    var objTBody = document.createElement('tbody');
    objTBody.setAttribute("id", 'table_body_' + id);
    
    var objTFoot = document.createElement('tfoot');
    objTFoot.setAttribute("id", 'table_foot_' + id);
    
    var objHeaderRow = document.createElement('tr');
    objHeaderRow.className="header_bg";
    
    
   
    var headerCount = data.Headers.length;
    
    for (var i=0;i<headerCount;i++) {
        var header = data.Headers[i];
        
        var objHeaderCell = document.createElement('th');
        objHeaderCell.setAttribute("align","left");
        
        var headerLabelFor = "";
        
        var type = DrawFilterTools.HeaderType[header.Type];
        
        switch (type) {
            case 'Text':
                headerLabelFor = 'filter_cell_' + header.Value.toLowerCase();
                break;
            case 'Hidden':
                headerLabelFor = 'filter_cell_' + header.Value.toLowerCase();
                break;
            case 'DateRange':
                headerLabelFor = 'from_' + header.Value.toLowerCase();
                break;
            case 'PriceRange':
                headerLabelFor = 'from_' + header.Value.toLowerCase();
                break;
            default:
                headerLabelFor = 'filter_cell_' + header.Value.toLowerCase();
                break;
        }        
        objHeaderCell.innerHTML = '<label for="' + headerLabelFor + '">' + header.Header + '</label>';
        
        if(header.ColSpan > 0) {
            objHeaderCell.colSpan = header.ColSpan;
            //skip unnecessary headers
            i = i + header.ColSpan;
        }
        
        if (type != 'None') {
            switch (type) {
                case 'Text':
                    if(header.Value.toLowerCase() == "ssn")
                        objHeaderCell.className = "header_ssn";
                    if(header.Value.toLowerCase() == "id")
                        objHeaderCell.className = "header_id";    
                    else
                        objHeaderCell.className = "header_name";
                    objHeaderCell.innerHTML += '<br /><input type="text" size="20" id="filter_cell_' + header.Value.toLowerCase() + '" value="' + (thisTable.Filters[header.Value]?thisTable.Filters[header.Value]:'') + '" onkeyup="FilterViewChangeSingle(this, \'' + header.Value + '\', \'' + id + '\');" />';
                    break;
                case 'Hidden':
                    if(header.Value.toLowerCase() == "group")
                        objHeaderCell.className = "header_group";
                    objHeaderCell.innerHTML += '<br /><input type="hidden" id="filter_cell_' + header.Value.toLowerCase() + '" value="' + (thisTable.Filters[header.Value]?thisTable.Filters[header.Value]:'') + '" onchange="FilterViewChangeSingle(this, \'' + header.Value + '\', \'' + id + '\');" />';
                    break;
                case 'DateRange':
                    objHeaderCell.className = "header_date";
                    var filterToValue = (thisTable.GetFilter(header.Value, 1).length > 0) ? thisTable.GetFilter(header.Value, 1) : thisTable.GetFilterTitle(header, 1);
                    var filterFromValue = (thisTable.GetFilter(header.Value, 0).length > 0) ? thisTable.GetFilter(header.Value, 0) : thisTable.GetFilterTitle(header, 0);
                    objHeaderCell.innerHTML += '<br /><input type="text" size="5" id="from_' + header.Value.toLowerCase() + '" value="' + filterFromValue + '" onfocus="clearFilter(\'' + header.Value.toLowerCase() + '\', \'' + filterFromValue + '\', \'' + filterToValue + '\')" onkeyup="FilterViewChangeRange(\'' + header.Value + '\', \'' + id + '\', 1);" /> <img src="' + Translate("common.host") + '/img/calendar.gif"  onclick="pickDate(\'from_\',\'' + header.Value.toLowerCase() + '\',\'' + id + '\', 1)" class="datepicker"/> <input type="text" size="5" id="to_' + header.Value.toLowerCase() + '" value="' + filterToValue + '" onfocus="clearFilter(\'' + header.Value.toLowerCase() + '\', \'' + filterFromValue + '\', \'' + filterToValue + '\')" onkeyup="FilterViewChangeRange(\'' + header.Value + '\', \'' + id + '\', 2);" /> <img src="' + Translate("common.host") + '/img/calendar.gif"  onclick="pickDate(\'to_\',\'' + header.Value.toLowerCase() + '\',\'' + id + '\', 2)" class="datepicker"/><input type="hidden" name="rqstvalue" id="rqstvalue" />';
                    break;
                case 'PriceRange':
                    objHeaderCell.className = "header_price";
                    var filterToValue = (thisTable.GetFilter(header.Value, 1).length > 0) ? thisTable.GetFilter(header.Value, 1) : thisTable.GetFilterTitle(header, 1);
                    var filterFromValue = (thisTable.GetFilter(header.Value, 0).length > 0) ? thisTable.GetFilter(header.Value, 0) : thisTable.GetFilterTitle(header, 0);
                    objHeaderCell.innerHTML += '<br /><input type="text" size="5" id="from_' + header.Value.toLowerCase() + '" value="' + filterFromValue + '" onfocus="clearFilter(\'' + header.Value.toLowerCase() + '\', \'' + filterFromValue + '\', \'' + filterToValue + '\')" onkeyup="FilterViewChangeRange(\'' + header.Value + '\', \'' + id + '\', 1);" /> <input type="text" size="5" id="to_' + header.Value.toLowerCase() + '" value="' + filterToValue + '" onfocus="clearFilter(\'' + header.Value.toLowerCase() + '\', \'' + filterFromValue + '\', \'' + filterToValue + '\')" onkeyup="FilterViewChangeRange(\'' + header.Value + '\', \'' + id + '\', 2);" />';
                    break;
                case 'Custom':
                    if (header.CustomAction.length > 0) {
                        var customFunction = eval(header.CustomAction);
                        
                        customFunction(objHeaderCell, header, id);
                    }
                    
                    break;
                default:
                    objHeaderCell.innerHTML += '[ERR: ' + header.Type + '/' + type+ ' Unknown filter]';
                    break;
            }
        }
        
        objHeaderRow.appendChild(objHeaderCell);
    }
    objTHead.appendChild(objHeaderRow);

    
    /*** table design ***/
    
    var tableContainer = document.createElement('div');
    tableContainer.className = "global_table_container";

    var bottomLeftTable = document.createElement('div');
    bottomLeftTable.className = "corner bottom_left_corner bottom_left_table";
    
    var bottomRightTable = document.createElement('div');
    bottomRightTable.className = "corner bottom_right_corner bottom_right_table";
    
    var topLeftTable = document.createElement('div');
    topLeftTable.className = "corner top_left_corner top_left_table";
    
    var topRightTable = document.createElement('div');
    topRightTable.className = "corner top_right_corner top_right_table";
       
    tableContainer.appendChild(bottomLeftTable);
    tableContainer.appendChild(bottomRightTable);
    tableContainer.appendChild(topLeftTable);
    tableContainer.appendChild(topRightTable);
    tableContainer.appendChild(objTable);
    objTable.appendChild(objTHead);
    objTable.appendChild(objTBody);
    objTable.appendChild(objTFoot);
    divTableContainer.appendChild(tableContainer);
    
    thisTable.Rendered = true;
}

function OnSuccessFilterList(results, context) {
    var thisTable = DrawFilterTools.All[context];

    if(thisTable.CurrentPage <= 0)
	thisTable.CurrentPage = 1;    

    if (results.Rows.length == 0 && thisTable.CurrentPage > 1) {
        FilterViewPage(context, 1, false);
    } else {
        DrawFilterList(context, results);
    }
}

function OnErrorFilterList(error) {
    alert('ERR: ' + error.get_message());
}

var changeTimeout = null;
var execFunc = null;

function FilterViewChangeSingle(input, filter, id) {
    filter = filter.toLowerCase();
    
    if (changeTimeout != null)
        clearTimeout(changeTimeout);

    execFunc = 'OnFilterViewChangeSingle(\''+input.value+'\', \'' + filter + '\', \'' + id + '\');';
    
    changeTimeout = setTimeout(OnTimeout, 500);
}

function FilterViewChangeRange(filter, id) {
    filter = filter.toLowerCase();
    
    if (changeTimeout != null)
        clearTimeout(changeTimeout);
        
    var from = $get('from_' + filter).value;
    var to = $get('to_' + filter).value;

    execFunc = 'OnFilterViewChangeRange(\'' + from + '\', \'' + to + '\', \'' + filter + '\', \'' + id + '\');';
    
    changeTimeout = setTimeout(OnTimeout, 500);
}

function OnTimeout() {
    var tmpExec = execFunc;
    changeTimeout = null;
    
    if (window.execScript) {
        window.execScript(tmpExec);
    } else {
        eval(tmpExec);
    }
}

function OnFilterViewChangeRange(from, to, filter, id) {
    var thisTable = DrawFilterTools.All[id];
    thisTable.Filters[filter] = [];
    thisTable.Filters[filter][0] = from;
    thisTable.Filters[filter][1] = to;
    
    FilterViewPage(id, thisTable.CurrentPage, true);
}

function OnFilterViewChangeSingle(input, filter, id) {
    var thisTable = DrawFilterTools.All[id];
    thisTable.Filters[filter] = [];
        
    if(input.length > 0) {
        thisTable.Filters[filter][0] = input; 
    }
    
    FilterViewPage(id, thisTable.CurrentPage, true);
}

function FilterViewGotoPage(id) {
    var objPage = $get("page_" + id);
    
    if (objPage) {
        if (isNaN(objPage.value)) {
            alert('Input not a number');
            return;
        }
        
        pageId = parseInt(objPage.value);
        objPage.value = '';
        
        FilterViewPage(id, pageId);        
    }
}

function FilterViewPage(id, page, force) {
    var thisTable = DrawFilterTools.All[id];

    var totalPage = Math.ceil(thisTable.TotalRowCount / thisTable.PageSize);
    
    if (page < 1)
        page = 1;
        
    if (page > totalPage)
        page = totalPage;
        
    if (thisTable.CurrentPage == page && !force)
        return;
        
    var filters = [];
    for (var filter in thisTable.Filters) {
        var idx = filters.length;
        filters[idx] = new Array();
        filters[idx][0] = filter;
        
        for (var i=0;i<thisTable.Filters[filter].length;i++) {
            filters[idx][filters[idx].length] = thisTable.Filters[filter][i];
        }
    }
    
    thisTable.CurrentPage = page;
    thisTable.Func(thisTable.CurrentPage, thisTable.PageSize, thisTable.RequestObject, filters, OnSuccessFilterList, OnErrorFilterList, id);
}

function FiltersArray(input,id) {

 if(input.length > 0) {
        thisTable.Filters[filter][0] = input; 
    }
    
    var thisTable = DrawFilterTools.All[id];
        
    var filters = [];
    for (var filter in thisTable.Filters) {
        var idx = filters.length;
        filters[idx] = new Array();
        filters[idx][0] = filter;
        
        for (var i=0;i<thisTable.Filters[filter].length;i++) {
            filters[idx][filters[idx].length] = thisTable.Filters[filter][i];
        }
    }
    
    return filters;
    
}

function FilterViewRefresh(id) {
    var thisTable = DrawFilterTools.All[id];
    
    var filters = [];
    for (var filter in thisTable.Filters) {
        var idx = filters.length;
        filters[idx] = new Array();
        filters[idx][0] = filter;
        
        for (var i=0;i<thisTable.Filters[filter].length;i++) {
            filters[idx][filters[idx].length] = thisTable.Filters[filter][i];
        }
    }
    
    thisTable.Func(thisTable.CurrentPage, thisTable.PageSize, thisTable.RequestObject, filters, OnSuccessFilterList, OnErrorFilterList, id);
}

function ClearFilter(id)
{
    var thisTable = DrawFilterTools.All[id];
    for (var filter in thisTable.Filters) {
        thisTable.Filters[filter] = [];
    }
}

function FilterViewUpdate(id,request) {
    var thisTable = DrawFilterTools.All[id];
    
    var filters = [];
    for (var filter in thisTable.Filters) {
        var idx = filters.length;
        filters[idx] = new Array();
        filters[idx][0] = filter;
        
        for (var i=0;i<thisTable.Filters[filter].length;i++) {
            filters[idx][filters[idx].length] = thisTable.Filters[filter][i];
        }
    }
    
    thisTable.RequestObject = request;
    
    thisTable.Func(thisTable.CurrentPage, thisTable.PageSize, thisTable.RequestObject, filters, OnSuccessFilterList, OnErrorFilterList, id);
}

function LoadFilterList(id, pageSize, func, requestObj) {
    var divTableContainer = $get(id);
    
    divTableContainer.innerHTML = 'Loading...';
    var e = eval(func);
    
    DrawFilterTools.RegisterTable(new DrawFilterListTable(id, pageSize, e, requestObj));
    
    e(0, pageSize, requestObj, null, OnSuccessFilterList, OnErrorFilterList, id);
}

function FilterListContentGet(id) {
    return $get("content_" + id);
}

function FilterListContentShow(id) {
    var filterList = FilterListContentGet(id);
    
    if (filterList != null){
        filterList.parentNode.className="content";
     }   
}

function FilterListContentHide(id) {
    var filterList = FilterListContentGet(id);
    
    if (filterList != null){
       filterList.parentNode.className=filterList.parentNode.className.replace("content","hide");
     } 
}

function FilterListContentIsShown(id) {
    var filterList = FilterListContentGet(id);
    
    var ret = false;
    
    if (filterList) {
        //ret = filterList.parentNode.getAttribute("class") == "content"; not working for IE
        ret = filterList.parentNode.className == "content" ;
    }
    
    return ret;
}

function clearFilter(obj, from, to) {
    var fromObject = document.getElementById("from_" + obj);
    var toObject = document.getElementById("to_" + obj);
    
    if(fromObject.value == from)
        fromObject.value = "";
    
    if(toObject.value == to)
        toObject.value = "";
}

var tmpId;
var tmpObj;
var tmpNo;

function pickDate(returnType, returnObject, id, no) {
    document.getElementById('rqstvalue').value = returnType + returnObject;
    var html = '<iframe src="' + Translate("common.host") + '/js/calendar.htm" width="250" height="190" scrolling="no" frameborder="0"></iframe>';
    createAlert(html);
   
    tmpId = id;
    tmpObj = returnObject;
    tmpNo = no;
    
}

function dateSet(field, date){
	document.getElementById(field).value = date;
	deleteAlert();
	
	FilterViewChangeRange(tmpObj, tmpId, tmpNo);
	
	tmpObj = "";
	tmpId = "";
	tmpNo = "";
}


