﻿/*
Author:Ankit
*/
(function($) {
    $.fn.createTable = function(data) {
        var parentID = $(this).attr("id");
        var tblID = "tbl" + parentID;
        var tbl = document.createElement("table");
        //****Add buttons area to the top of the table
        if (data.buttons.length > 0) {
            var ul = $("<ul>");
            $(ul).addClass("btnArea");
            for (var i = 0; i < data.buttons.length; i++) {
                var li = $("<li>");
                if (!data.buttons[i].separator) {
                    var btn = $("<input type=\"button\" value=\"" + data.buttons[i].name + "\" name=\"" + data.buttons[i].name + "\" class=\"" + data.buttons[i].bclass + "\" />");
                    //Associate the on press function.
                    if (data.buttons[i].onpress) {
                        $(btn).click(data.buttons[i].onpress);
                    }
                    $(li).append(btn);
                }
                else {

                    $(li).addClass("btnSeparator");
                    $(li).append("&nbsp;");
                }
                $(ul).append(li);
            }
            $(this).append(ul);
        } //**End button area.
        tbl.setAttribute("id", tblID);
        $(tbl).addClass("gridTable");
        $(tbl).addClass("gridTable");
        $(tbl).attr("width", data.width);
        $(tbl).attr("cellspacing", "0");
        $(tbl).attr("cellpadding", "0");
        var tr = document.createElement("tr");
        $(tr).addClass("TRhead");
        for (var i = 0; i < data.cols.length; i++) {
            var th = document.createElement("th");
            th.setAttribute("id", data.cols[i].id);
            th.setAttribute("width", data.cols[i].width);
            if (data.cols[i].hide) { $(th).addClass("hide"); }
            if (data.cols[i].sort) { $(th).addClass("allowSort"); $(th).bind("click", function() { SortJQTableData(this, parentID) }); }
            $(th).html(data.cols[i].text);
            tr.appendChild(th);
        }
        $(tbl).append(tr);
        $(this).append(tbl);
    }
    //Add a header row to table
    $.fn.titleRow = function(title) {
        tblID = "tbl" + $(this).attr("id");
        var tr = document.createElement("tr");
        var td = "<td class = \"titleRow\" colspan=\"100%\">" + title + "</td>"
        $(tr).html(td);
        $("#" + tblID).append(tr);
    }
    //Add a empty to table
    $.fn.emptyRow = function(msg) {
        tblID = "tbl" + $(this).attr("id");
        var tr = document.createElement("tr");
        var td = "<td class = \"emptyRow\" colspan=\"100%\">" + msg + "</td>"
        $(tr).html(td);
        $("#" + tblID).append(tr);
    }
    //Add a row to table
    $.fn.addRow = function(data, dblClickFn) {
        tblID = "#tbl" + $(this).attr("id");
        var thCount = $(tblID + " tr.TRhead>th").length;
        var tr = document.createElement("tr");
        tr.setAttribute("id", data[0].id);
        var mselect = $(this).hasClass("multiSelect");
        $(tr).bind("click", function() { trSelected(this, mselect); }); //Attach event for onclick
        if (dblClickFn)
            $(tr).bind("dblclick", function() { trDblClicked(dblClickFn); }); //Attch event for onclick
        for (var i = 0; i < thCount; i++) {
            var td = document.createElement("td");
            if ($(tblID + " tr.TRhead>th:nth-child(" + (i + 1) + ")").hasClass("hide"))
                $(td).addClass("hide");
            else
                $(td).removeClass("hide");
            $(td).html(data[0].cell[i]);
            $(tr).append(td);
        }
        $(tblID).append(tr);
        $(tblID + " tr:nth-child(even)").addClass("evenRow");
    }
    //** Hide table column
    $.fn.hideColumn = function(thID) {
        tblID = "#tbl" + $(this).attr("id");
        var thIndex = 0;
        var i = 1;
        $(tblID + " th").each(function() { if ($(this).attr("id") == thID) { thIndex = i; return; }; i++; })
        $(tblID + " tr.TRhead>th:nth-child(" + thIndex + ")").addClass("hide");
    };
    //**Show table column
    $.fn.showColumn = function(thID) {
        tblID = "#tbl" + $(this).attr("id");
        var thIndex = 0;
        var i = 1;
        $(tblID + " th").each(function() { if ($(this).attr("id") == thID) { thIndex = i; return; }; i++; })
        $(tblID + " tr.TRhead>th:nth-child(" + thIndex + ")").removeClass("hide");
    };
    //**Get the selected row.
    $.fn.selected = function() {
        tblID = "tbl" + $(this).attr("id");
        return $("#" + tblID + " tr.selected");
    };
    //**Clear all rows
    $.fn.clear = function() {
        tblID = "tbl" + $(this).attr("id");
        $("#" + tblID).find("tr:gt(0)").remove();
    };
    $.fn.dblClick = function(fn) { fnName = fn; };
    //**MultiSelect
    $.fn.allowMultiSelect = function() {
        $(this).addClass("multiSelect");
    };
    //**Fill Data To table, Param: data is supposed of the type , FlexigridObject
    $.fn.fillData = function(data, fnForDblClick) {
        var hdData = ReadHidden(this);
        try {
            data = eval('(' + data + ')');
        }
        catch (ex) {
            return;
        }
        this.clear();
        WriteHidden(this, hdData.url, hdData.pageSize, hdData.pageIndex, hdData.queryType, hdData.query, hdData.sortColumnName, hdData.sortOrder, hdData.onDblClick);
        if (data.rows.length > 0) {
            for (var i = 0; i < data.rows.length; i++)
                this.addRow([{ id: data.rows[i].id, cell: data.rows[i].cell}], fnForDblClick);
            $(this).pager(data.page, data.total);
        }
        else
            this.emptyRow("There is no result to display.");
    }
    //**Render table
    $.fn.jQTable = function(data) {
        data = $.extend({
            url: "",
            cols: "",
            buttons: "",
            pageSize: 10,
            queryType: "",
            query: "",
            sortColumnName: "",
            sortOrder: "asc",
            onDblClick: "",
            width: "100%",
            isMultiSelect: false
        }, data);
        WriteHidden(this, data.url, data.pageSize, 0, data.queryType, data.query, data.sortColumnName, data.sortOrder, data.onDblClick);
        var tbl = this;
        $(tbl).createTable(data);
        $.get(GetPagedUrl(data.url, 0, data.pageSize, '', '', '', ''), function(response) {
            $(tbl).fillData(response, data.OnDblClick); //data passed must be of the type
        });
        if (data.isMultiSelect)
            $(this).addClass("multiSelect");

    }
    //**Refresh Table
    $.fn.reLoad = function(restoreFromSameIndex) {
        var data = ReadHidden(this); //Read settings
        WriteHidden(this, data.url, data.pageSize, data.pageIndex, '', '', data.sortColumnName, data.sortOrder, data.onDblClick);
        var index = 0;
        if (restoreFromSameIndex)
            index = GetPageIndex(this)
        ReloadTableData(index, $(this).attr("id"));
    }
    //**Refresh Table
    $.fn.reLoadWhere = function(url, queryType, query) {
        var data = ReadHidden(this); //Read settings
        if (!url) url = data.url;
        WriteHidden(this, url, data.pageSize, data.pageIndex, queryType, query, data.sortColumnName, data.sortOrder, data.onDblClick);
        ReloadTableData(0, $(this).attr("id"));
    }

    //**Pager Details
    $.fn.pager = function(page, total) {
        var paretnID = $(this).attr("id");
        var tblID = "#tbl" + paretnID; //Table id
        var data = ReadHidden(this);
        var ps = Math.ceil((total / data.pageSize));
        var recordsFrom = page * data.pageSize;

        if (ps > 1) {

            var recordsInPage = $(tblID + ">tbody>tr").length;
            recordsInPage--;
            var tr = document.createElement("tr");
            $(tr).addClass("pager");
            var lis = '';
            lis += '<li class="first"><a href="javascript:;"  OnClick="ReloadTableData(0,\'' + paretnID + '\');return false;"></a></li>';
            lis += '<li class="previous"><a href="javascript:;"  OnClick="PagerMover(false,\'' + paretnID + '\',' + ps + ');return false;"></a></li>';

            lis += '<li class="goToPage"><span >Page</span><form id="frm' + paretnID + '" method="post">';
            lis += '<input type="text" style="width:40px" maxlength="6" id="txtPageNo' + paretnID + '" value="' + (parseInt(data.pageIndex) + parseInt(1)) + '"/>';
            lis += '</form> <span >of ' + ps + '</span></li>';

            lis += '<li class="next"><a href="javascript:;"  OnClick="PagerMover(true,\'' + paretnID + '\',' + ps + ');return false;"></a></li>';
            lis += '<li class="last"><a href="javascript:;"  OnClick="ReloadTableData(' + (ps - 1) + ',\'' + paretnID + '\');return false;"></a></li>';
            var td = "<td class = \"pager\" colspan=\"100%\"><ul>" + lis + "</ul>  </td>"
            //Displaying <strong>" + (parseInt(recordsFrom) + parseInt(1)) + "</strong> to <strong>" + (parseInt(recordsFrom) + parseInt(recordsInPage)) + "</strong> of " + total + " records 

            $(tr).html(td);
            $(tblID).append(tr);

            //Bind events with pager
            $("#txtPageNo" + paretnID).numeric();
            $("#frm" + paretnID).submit(function() {
                var goToPage = parseInt($("#txtPageNo" + paretnID).val());
                goToPage--;
                if (goToPage >= 0 && goToPage < ps) {
                    ReloadTableData(goToPage, paretnID);
                }
                return false;
            });
        }
    }
})(jQuery);
//**Sort the column
function SortJQTableData(th, parentID) {
    var self = $("#" + parentID);
    var settings = ReadHidden(self);
    var sortBy = $(th).attr("id");
    var sortDirection = settings.sortOrder;
    if (sortDirection == 'asc')
        sortDirection = 'desc';
    else
        sortDirection = 'asc';

    WriteHidden(self, settings.url, settings.pageSize, settings.pageIndex, settings.queryType
    , setInterval.query, sortBy, sortDirection, settings.onDblClick);
    $(self).reLoad(true);
}

//**Write the hiddan values
function WriteHidden(self, url, pageSize, pageIndex, queryType, query, sortColumnName, sortOrder, fnDblClick) {
    var id = "hidden" + $(self).attr("id");
    var hdData;
    if ($("#" + id).html() != null) { $("#" + id).html(''); hdData = $("#" + id); }
    else {
        hdData = document.createElement("div");
        $(hdData).attr("id", id);
        $(hdData).css({ display: "none" });
    }
    $(hdData).html('{url: \'' + url
        + '\', pageSize: \'' + pageSize
        + '\', pageIndex: \'' + (pageIndex != null ? pageIndex : 0)
        + '\', queryType: \'' + (queryType != null ? queryType : '')
        + '\', query: \'' + (query != null ? query : '')
        + '\', sortColumnName: \'' + (sortColumnName != null ? sortColumnName : '')
        + '\', sortOrder: \'' + (sortOrder != null ? sortOrder : 'asc')
        + '\', onDblClick: \'' + fnDblClick + '\'}');
    $(self).append(hdData);
}
//**Read the hiddan values
function ReadHidden(self) { return eval('(' + $("#hidden" + $(self).attr("id")).html() + ')'); }
//**Get data again
function GetPagedUrl(baseUrl, pageIndex, pageSize, queryType, query, sortColumnName, sortOrder) {
    if (pageIndex < 0)
        pageIndex = 0;
    var url = baseUrl;
    if (url.indexOf('?') < 0) url += "?";
    else url += "&";
    url += "PageIndex=" + pageIndex + "&PageSize=" + pageSize + "&QueryType=" + queryType
    + "&Query=" + query + "&SortColumnName=" + sortColumnName + "&SortOrder=" + sortOrder
    + "&temp=" + tempGuid();
    return url;
}
//**Reload data to table again
function ReloadTableData(pageIndex, parentID) {
    var ele = $("#" + parentID);
    var data = ReadHidden(ele);
    WriteHidden(ele, data.url, data.pageSize, pageIndex, data.queryType
    , data.query, data.sortColumnName, data.sortOrder, data.onDblClick);

    $.get(GetPagedUrl(data.url, pageIndex, data.pageSize, data.queryType, data.query, data.sortColumnName, data.sortOrder), function(response) {
        $(ele).fillData(response, data.onDblClick);
    });
}
function trSelected(tr, multiSelect) {
    if (multiSelect) {
        if ($(tr).hasClass("selected")) $(tr).removeClass("selected")
        else $(tr).addClass("selected")
    }
    else {
        $(tr).parent().children("tr.selected").each(function() { $(this).removeClass("selected"); });
        $(tr).addClass("selected");
    }
}
//Get selected page index.
function GetPageIndex(self) {
    var index = ReadHidden(self).pageIndex;
    return index;
}
function PagerMover(isNext, self, totalPages) {
    var data = ReadHidden($("#" + self));
    var index = 0;

    if (isNext) {
        index = (parseInt(data.pageIndex) + parseInt(1));
    }
    else {
        index = (parseInt(data.pageIndex) - parseInt(1));
    }
    if (index >= 0 && index < totalPages)
        ReloadTableData(index, self);
}

function trDblClicked(strFn) { if (strFn.length > 0) { var fnCall = strFn + "();"; var ret = eval(fnCall); } }
function tempGuid() { return (Str4() + Str4() + "-" + Str4() + "-" + Str4() + "-" + Str4() + "-" + Str4() + Str4() + Str4()).toUpperCase() }
function Str4() { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1) }

