/*
 * 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)
			{
                var params = $.extend({"initialize": true}, config.extraParams);

                $.getJSON(this.config.jcallback, params, function(json) {

                    if(typeof json == 'object') {
                        var tableClass = (typeof config.extraParams.tableClass !== 'undefined') ? config.extraParams.tableClass : 'grid-table';
                        var html = '<table id="'+container.attr('id')+'-table" class="' + tableClass + '" 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>';
    				    }
						else if (config.pagination == 3 && typeof customPaginationTemplate == 'function') {
							html += customPaginationTemplate(container.attr('id'), json.extra);
						}

        				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 {
                                    // only preSort
                                    var priHead = $(tableHeaders[config.sortPriField]);
        				            priHead.attr('class', 'grid-sort');

                                    config.sortPriField  = index;
        				            config.sortPriDirect = 0;

                                    var priHead = $(tableHeaders[config.sortPriField]);
        				            priHead.attr('class', 'grid-sort grid-sortDown');
                                    // only preSort END
         

                                    /*
        				            // 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);

				//if (tableBodySection.children().length == 0) {
					var cols = $("#"+container.attr('id')+"-table th");
					tableBodySection.empty();
					tableBodySection.html('<tr><td colspan="'+cols.length+'"><p style="padding-left: 10px;"><img src="/images/ajax/indicator.white.gif" />&nbsp;Loading data...</p></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];
			    }
                // to prevent caching
                arr["__rand__"] = Math.random();

                $.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(json, container.attr('id'));
                    }
                });
			};

			this.reload = function(extraParams)
			{
			    if(typeof extraParams !== 'undefined')
                    this[0].config.extraParams = extraParams;
			    jCallback(this[0].config, this[0].container);
			}
		}
	});

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

})(jQuery);

