/*
 * jQuery Ajax Grid
 * Uses jQuery v1.2.3
 *
 * Copyright (c) 2008 Constantine Bodunov (bitworks-software.com)
 * Licensed under the GPL (GPL-LICENSE.txt) license.
 *
 * $Date: 2008-09-09 10:42:25 +0600 (Tue, 09 Sep 2008) $
 * $Rev: 1 $
 */

(function($) {

	$.extend({

		grid: new function() {

		    this.defaults = {
                jcallback:     '',  // ajax callback
                scallback:     function() {}, // success load callback
                curPage:       1,   // current page
                perPage:       10,  // records per page
                sortPriField:  0,   // sort field number
                sortPriDirect: 0,   // sort direction (0 = asc, 1 = desc)
                sortSecField:  0,   // sort field number
                sortSecDirect: 0,   // sort direction (0 = asc, 1 = desc)
                totalPages:    1,   // private: total pages (return jCallback)
                pagination:    1,   // pagination type
                extraParams:   {}
		    };

		    /**
		     * Ctor
		     *
		     */
			this.construct = function(settings)
			{
				return this.each(function()
				{
				    this.container = $(this);

				    // configure grid with settings
					this.config = {};
					config = $.extend(this.config, $.grid.defaults, settings);

					// initialize grid
					initializeGrid(this.config, this.container);
				});
			};

			/**
			 * Initialize grid
			 * Insert grid table to container
			 *
			 */
			function initializeGrid(config, container)
			{
                $.getJSON(this.config.jcallback, {"initialize": true}, function(json) {
                    if(typeof json == 'object') {
                        var html = '<table id="'+container.attr('id')+'-table" class="grid-table" cellspacing="0" cellpadding="5" border="0"><thead></thead><tbody></tbody></table>';
        				if(config.pagination == 1) {
        				    html += '<table id="'+container.attr('id')+'-pager" class="grid-pager" cellspacing="0" cellpadding="3" border="0" align="right"><tr><td><a id="'+container.attr('id')+'-pager-firstPage" class="grid-firstPage" href="">&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td><a id="'+container.attr('id')+'-pager-prevPage" class="grid-prevPage" href="">&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td class="admin-preferences-tablecell"> <span id="'+container.attr('id')+'-pager-curPage">1</span> of <span id="'+container.attr('id')+'-pager-totalPages">1</span></td><td> <a id="'+container.attr('id')+'-pager-nextPage" class="grid-nextPage" href="">&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td> <a id="'+container.attr('id')+'-pager-lastPage" class="grid-lastPage" href="">&nbsp;&nbsp;&nbsp;&nbsp;</a></td><td>&nbsp;<select id="'+container.attr('id')+'-pager-perPage"><option value="10" '+(config.perPage == 10 ? 'selected' : '')+'>10</option><option value="30" '+(config.perPage == 30 ? 'selected' : '')+'>30</option><option value="50" '+(config.perPage == 50 ? 'selected' : '')+'>50</option><option value="100" '+(config.perPage == 100 ? 'selected' : '')+'>100</option><option value="500" '+(config.perPage == 500 ? 'selected' : '')+'>500</option><option value="1000" '+(config.perPage == 1000 ? 'selected' : '')+'>1000</option></select></td></tr></table>';
        				}
    				    else if(config.pagination == 2) {
        				    html += '<table id="'+container.attr('id')+'-pager" class="grid-pager" cellspacing="0" cellpadding="0" border="0" width="100%" align="right"><tr><td align="left"><a id="'+container.attr('id')+'-pager-prevPage" href="">Previous</a></td><td align="right"><a id="'+container.attr('id')+'-pager-nextPage" href="">Next</a><input type="hidden" id="'+container.attr('id')+'-pager-perPage" value="'+config.perPage+'"></td></tr></table>';
    				    }

        				container.html(html);

        				// get current grid table
        			    var table = $("#"+container.attr('id')+"-table");

        			    // get current grid table head section
        			    var tableHeadSection = $("thead", table);

        			    // set grid headers
        			    tableHeadSection.html(json.head);

        				// set grid headers callbacks
        			    var tableHeaders = $("thead th.grid-sort", table);
        				tableHeaders.each(function(index)
        				{
        				    $(this).click(function()
        				    {
        				        if (config.sortPriField == index) {
        				            config.sortPriDirect = (config.sortPriDirect == 0) ? 1 : 0;
        				            if (config.sortPriDirect == 1) {
        				                $(this).attr('class', 'grid-sort grid-sortUp');
        				            } else {
        				                $(this).attr('class', 'grid-sort grid-sortDown');
        				            }
        				        } else {

        				            // set secField simple class
        				            var secHead = $(tableHeaders[config.sortSecField]);
        				            if (config.sortSecDirect == 1) {
        				                secHead.attr('class', 'grid-sort');
        				            } else {
        				                secHead.attr('class', 'grid-sort');
        				            }

        				            // set priField as secondary sort class
        				            var priHead = $(tableHeaders[config.sortPriField]);
        				            if (config.sortPriDirect == 1) {
        				                priHead.attr('class', 'grid-sortUp2');
        				            } else {
        				                priHead.attr('class', 'grid-sortDown2');
        				            }

        				            config.sortSecField  = config.sortPriField;
        				            config.sortSecDirect = config.sortPriDirect;
        				            config.sortPriField  = index;
        				            config.sortPriDirect = 0;
        				            if (config.sortPriDirect == 1) {
        				                $(this).attr('class', 'grid-sort grid-sortUp');
        				            } else {
        				                $(this).attr('class', 'grid-sort grid-sortDown');
        				            }
        				        }

        				        jCallback(config, container);
        				    });
        				});

        			    $("#"+container.attr('id')+"-pager-firstPage").click(function()
        			    {
        			        if (config.curPage > 1) {
        			            config.curPage = 1;
        			            $("#"+container.attr('id')+"-pager-curPage").html(config.curPage);
        			            jCallback(config, container);
        			        }

                            return false;
        			    });
        			    $("#"+container.attr('id')+"-pager-prevPage").click(function()
        			    {
        			        if (config.curPage > 1) {
        			            config.curPage--;
        			            $("#"+container.attr('id')+"-pager-curPage").html(config.curPage);
        			            jCallback(config, container);
        			        }

                            return false;
        			    });
        			    $("#"+container.attr('id')+"-pager-nextPage").click(function()
        			    {
        			        if (config.curPage < config.totalPages) {
        			            config.curPage++;
        			            $("#"+container.attr('id')+"-pager-curPage").html(config.curPage);
        			            jCallback(config, container);
        			        }

                            return false;
        			    });
        			    $("#"+container.attr('id')+"-pager-lastPage").click(function()
        			    {
        			        if (config.curPage != config.totalPages) {
        			            config.curPage = config.totalPages;
        			            $("#"+container.attr('id')+"-pager-curPage").html(config.curPage);
        			            jCallback(config, container);
        			        }

                            return false;
        			    });
        			    $("#"+container.attr('id')+"-pager-perPage").change(function()
        			    {
        			        config.curPage = 1;
    			            $("#"+container.attr('id')+"-pager-curPage").html(config.curPage);

        			        config.perPage = this.value;
        			        jCallback(config, container);
        			        //alert('perPage: '+this.value);
                            return false;
        			    });

        				jCallback(config, container);
                    }
                });
			}

			function jCallback(config, container)
			{
				// get current grid table
			    var table = $("#"+container.attr('id')+"-table");

			    // get current grid table body section
			    var tableBodySection = $("tbody", table);

			    //tableBodySection.empty();
			    //tableBodySection.html('<tr><td colspan="'+config.cols.length+'">Loading data...</td></tr>');

			    var arr = {"curPage": config.curPage, "perPage": config.perPage, "sortPriField": config.sortPriField, "sortPriDirect": config.sortPriDirect, "sortSecField": config.sortSecField, "sortSecDirect": config.sortSecDirect};

			    for (var s in config.extraParams) {
			        arr[s] = config.extraParams[s];
			    }

                $.getJSON(config.jcallback, arr, function(json) {
                    if(typeof json == 'object') {
                        var totalPages = json.totalPages;
                        if (totalPages == 0) {
                            totalPages = 1;
                        }
                        config.totalPages = totalPages;
                        $("#"+container.attr('id')+"-pager-totalPages").html(config.totalPages);
                        $("#"+container.attr('id')+"-total").html(" ("+json.total+")");

        				// get current grid table
        				var table = $("#"+container.attr('id')+"-table");

        			    // get current grid table body section
        			    var tableBodySection = $("tbody", table);
        				tableBodySection.html(json.data);

                        config.scallback();
                    }
                });
			};

			this.reload = function(extraParams)
			{
			    this[0].config.extraParams = extraParams;
			    jCallback(this[0].config, this[0].container);
			}
		}
	});

	$.fn.extend({
        grid:   $.grid.construct,
        reload: $.grid.reload
	});

})(jQuery);