﻿/// <reference path="jquery.intellisense.js" />
/// <reference path="jquery.json.js" />
/// <reference path="jquery.pagemethods.js" />
/// <reference path="firebug/firebug.js" />
// JQuery Ajax Grid for Linq.Net
// Version: 1.2
// Author: Omer DUZYOL
// jQuery 1.2+
//
// Basic usage example of AjaxGrid2
//var gridView = $('#gridView_search').ajaxGrid({
//    Service: $.Page.SearchEntities, 
//    ServiceArgs: ['ömer',1],
//    PageSize: 10,
//    Sort: ['Member_FirstName', 'asc'],
//    Columns: {
//        Keys: {
//            Member_ID: 'Integer',
//            Member_FirstName: 'String',
//            Member_LastName: 'String',
//            Member_Email: 'String',
//            CreatedOn: 'Date:dd.MM.yyyy',
//            Member_LastLoginDate: 'Date'
//        },
//        Class: 'es_grid_header',
//        Values: [$('<th scope="col" width="20"><input type="checkbox" id="chkAll" rel="chkRemove" /></th>'),
//                                    $('<th scope="col" rel="Member_FirstName" sortable="sortable"><a href="javascript:;">Ad</a></th>'),
//                                    $('<th scope="col" rel="Member_LastName" sortable="sortable"><a href="javascript:;">Soyad</a></th>'),
//                                    $('<th scope="col" rel="Member_Email" sortable="sortable"><a href="javascript:;">E-Posta</a></th>'),
//                                    $('<th scope="col" rel="CreatedOn" sortable="sortable"><a href="javascript:;">Üyelik Tarihi</a></th>'),
//                                    $('<th scope="col" rel="Member_LastLoginDate" sortable="sortable"><a href="javascript:;">Son Giriş Tarihi</a></th>'),
//                                    $('<th scope="col" width="30"><a href="javascript:;">Düzenle</a></th>'),
//                                    $('<th scope="col" width="30"><a href="javascript:;">Sil</a></th>')]
//    },
//    RowTemplate: '<tr class="es_grid_even">' +
//                                    '<td><input type="checkbox" value="{Member_ID}" name="chkRemove" /></td>' +
//                                    '<td><a rel="history" href="#viewDetail/{Member_ID}">{Member_FirstName}</a></td>' +
//                                    '<td>{Member_LastName}</td>' +
//                                    '<td>{Member_Email}</td>' +
//                                    '<td>{CreatedOn}</td>' +
//                                    '<td>{Member_LastLoginDate}</td>' +
//                                    '<td><a rel="history" href="#viewEdit/{Member_ID}"><img src="_i/icon_edit.gif"/></a></td>' +
//                                    '<td><a href="javascript:;" onclick="return removeItem({Member_ID});"><img src="_i/icon_delete.gif"/></a></td>' +
//                                   '</tr>',
//    RowTemplateAlternate: '<tr class="es_grid_odd">' +
//                                    '<td><input type="checkbox" value="{Member_ID}" name="chkRemove" /></td>' +
//                                    '<td><a rel="history" href="#viewDetail/{Member_ID}">{Member_FirstName}</a></td>' +
//                                    '<td>{Member_LastName}</td>' +
//                                    '<td>{Member_Email}</td>' +
//                                    '<td>{CreatedOn}</td>' +
//                                    '<td>{Member_LastLoginDate}</td>' +
//                                    '<td><a rel="history" href="#viewEdit/{Member_ID}"><img src="_i/icon_edit.gif"/></a></td>' +
//                                    '<td><a href="javascript:;" onclick="return removeItem({Member_ID});"><img src="_i/icon_delete.gif"/></a></td>' +
//                                   '</tr>',
//    RowTemplateNoRecords: '<tr class="es_grid_odd">' +
//                                    '<td colspan="8"> Kayıt bulunamadı</td>' +
//                                   '</tr>'
//});
//
//
// AjaxGrid jquery events
// - gridPreload
// - gridPageChange
// - gridSort
// - gridFinish
// - gridError
//
;(function() {
    var $$;
    $$ = jQuery.fn.ajaxGrid = function(params) {
        // ajax grid base prototype
        var ajaxGrid = {
            totalRows: 0,
            totalPages: 0,
            pageSize: 0,
            pageIndex: 0,
            dataSource: null,
            targetGrid: this,
            sorters: null,
            parameters: params
        };

        if (ajaxGrid.targetGrid == null || params.Service == null)
            throw new Error('AjaxGrid: Invalid Service definition!');

        if (ajaxGrid.targetGrid.length == 0)
            throw new Error('AjaxGrid: params.targetGrid is null or not an object!');

        if (ajaxGrid.parameters.Columns == null || ajaxGrid.parameters.Columns.Keys == null)
            throw new Error('AjaxGrid: params.Columns is null or not an object!');

        if (params.RowTemplate == null)
            throw new Error('AjaxGrid: params.RowTemplate');

        // Binding default events if defined
        if (params.onPreload != null)
            ajaxGrid.targetGrid.bind('gridPreload', params.onPreload);

        if (params.onPageChange != null)
            ajaxGrid.targetGrid.bind('gridPageChange', params.onPageChange);

        if (params.onSort != null)
            ajaxGrid.targetGrid.bind('gridSort', params.onSort);

        if (params.onFinish != null)
            ajaxGrid.targetGrid.bind('gridFinish', params.onFinish);

        if (params.onError != null)
            ajaxGrid.targetGrid.bind('gridError', params.onError);
        else
            ajaxGrid.targetGrid.bind('gridError', function() { throw new Error('AjaxGrid: An error occured while loading grid!'); });


        var sorters = params.Sort != null ? params.Sort : new Array();
        var wsArgs = params.ServiceArgs != null ? params.ServiceArgs : new Array();
        var pagerDisabled = params.PageSize <= 0 || params.DisablePaging;

        if (!params.DisablePaging) {
            ajaxGrid.pageIndex = params.PageIndex != null ? params.PageIndex : 1;
            ajaxGrid.pageSize = params.PageSize != null ? params.PageSize : 10;
        } else {
            ajaxGrid.pageIndex = 0;
            ajaxGrid.pageSize = 0;
        }

        function parseServiceArgs(args) {
            var arrResult = new Array();
            for (var i = 0; i < args.length; i++) {
                arrResult.push(args[i]);
            }
            return arrResult;
        }
        ajaxGrid.sorters = sorters;

        // extending ajaxGrid prototype with Reload() function
        $.extend(ajaxGrid, {
            Reload: function() {
                var callerArgs;
                if (arguments.length > 0) {
                    if (!this.internalCall)
                        ajaxGrid.pageIndex = 1;

                    wsArgs = parseServiceArgs(arguments);
                }
                callerArgs = [ajaxGrid.pageIndex, ajaxGrid.pageSize, ajaxGrid.sorters.convertJSON()];
                callerArgs = callerArgs.concat(wsArgs);

                // trigger jquery event
                ajaxGrid.targetGrid.trigger('gridPreload');

                // call service indirectly
                params.Service.apply(this, callerArgs);
            }
        });

        // extending ajaxGrid prototype with Sort() function
        $.extend(ajaxGrid, {
            Sort: function(column, direction) {
                sorters = new Array();
                if (column != null)
                    sorters.push(column);
                if (direction != null)
                    sorters.push(direction);

                ajaxGrid.sorters = sorters;

                // trigger jquery event
                ajaxGrid.targetGrid.trigger('gridSort', [column, direction]);

                // reload table
                ajaxGrid.Reload.apply({ internalCall: true });
            }
        });

        // extending ajaxGrid prototype with Page() function
        $.extend(ajaxGrid, {
            Page: function(newIndex) {
                if (ajaxGrid.totalPages > 0) {
                    ajaxGrid.pageIndex = newIndex;
                    // trigger jquery event
                    ajaxGrid.targetGrid.trigger('gridPageChange', [newIndex]);
                    // reload table
                    ajaxGrid.Reload.apply({ internalCall: true });
                }
            }
        });

        params.Service.Events.onError = function(e) {
            ajaxGrid.targetGrid.trigger('gridError', [e]);
        };

        params.Service.Callback = function(wsResult) {
            if (wsResult.Succeed) {
                ajaxGrid.dataSource = wsResult.Response.DataSource;
                ajaxGrid.totalRows = wsResult.Response.TotalRows;

                var gw = $(ajaxGrid.targetGrid);
                gw.empty();
                gw.append('<thead></thead>' +
                        '<tbody class="rows"></tbody>' +
                        '<tfoot></tfoot>');

                // Creating pager
                if (!pagerDisabled && ajaxGrid.dataSource != null && ajaxGrid.dataSource.length > 0) {
                    gw.find('tfoot').append('<tr class="pagerCont">' +
			            '<td colspan="' + params.Columns.Values.length + '">' +
			                '<table width="100%" cellpadding="0" cellspacing="0" border="0">' +
				                '<tr>' +
					                '<th class="algnRight">' +
						                '<table cellpadding="0" cellspacing="0" align="center" class="pageNumbers"></table>' +
					                '</th>' +
				                '</tr>' +
				                '<tr>' +
					                '<th ><span class="recordsSummary"></span></th>' +
				                '</tr>' +
			                '</table>' +
                        '</td>' +
		            '</tr>');
                }
                // Creating columns
                var jCols = $('<tr></tr>');
                jCols.addClass('columns');
                jCols.addClass(params.Columns.Class);

                //gw.find('thead').append(jCols);
                //jCols = gw.find('thead>tr.columns');

                $.each(params.Columns.Values, function() {
                    if (this != null)
                        jCols.append(this);
                });

                function getTemplate(obj) {
                    var value = '';
                    if ($.isFunction(obj)) {
                        value = obj.apply(this);
                    } else if (typeof obj === 'string') {
                        value = obj;
                    } else if ((typeof obj === 'object') && obj['jquery'] != null) {
                        value = obj.outerHTML().replace(/%7B/g, '{').replace(/%7D/g, '}');
                    } else {
                        value = obj.toString();
                    }
                    return value;
                }

                gw.find('thead').append(jCols);

                var gwRows = gw.find('tbody.rows');
                var summary = gw.find('span.recordsSummary');
                var pager = gw.find('.pageNumbers');
                var columns = ajaxGrid.parameters.Columns.Keys;
                var thColumns = gw.find('thead th[scope=col]');

                var evenRowTemplate, oddRowTemplate;

                if (params.RowTemplateAlternate == null)
                    params.RowTemplateAlternate = params.RowTemplate;

                evenRowTemplate = getTemplate(params.RowTemplate);
                oddRowTemplate = getTemplate(params.RowTemplateAlternate);


                //  Clear grid data
                gwRows.empty();

                if (ajaxGrid.dataSource != null && ajaxGrid.dataSource.length > 0) {

                    //  Datarow loop
                    for (var currentRow = 0; currentRow < ajaxGrid.dataSource.length; currentRow++) {
                        //  Fetch record
                        var objRecord = ajaxGrid.dataSource[currentRow];
                        //  Even, odd row template
                        var currentRowTemplate = (currentRow % 2 == 0) ? evenRowTemplate : oddRowTemplate;
                        var currentRowData = currentRowTemplate;

                        //  Datacolumn loop
                        for (var colName in columns) {
                            try {
                                var evaulator = columns[colName];
                                var format = null;
                                var formatPos = evaulator.indexOf(':');
                                if (formatPos > -1) {
                                    format = evaulator.substring(formatPos + 1);
                                    evaulator = evaulator.substring(0, formatPos);
                                }

                                currentData = objRecord[colName];

                                if ('Eval' + evaulator in window) {
                                    try {
                                        currentData = window['Eval' + evaulator].apply(gw, [currentData, format]);
                                    } catch (ex) { };
                                }

                            } catch (ex) {
                                currentData = '';
                            }
                            var rex = new RegExp('{' + colName + '}', 'g');
                            currentRowData = currentRowData.replace(rex, currentData);
                        }

                        //  Append row to grid
                        gwRows.append(currentRowData);
                    }


                    // bind sortings
                    //  Datacolumn loop
                    thColumns.each(function() {
                        var currColumn = $(this);
                        var currentColumnName = currColumn.attr('rel');
                        var isSortable = currColumn.attr('sortable');
                        var direction = (currColumn.attr('direction') == 'desc') ? 'desc' : 'asc';
                        if (isSortable != null && isSortable != '' && (isSortable == 'sortable' || isSortable == 'true')) {
                            currColumn.find('a').unbind('click').bind('click', function() {
                                ajaxGrid.Sort(currentColumnName, direction);
                                if (direction == 'asc')
                                    currColumn.attr('direction', 'desc');
                                else
                                    currColumn.attr('direction', 'asc');
                            });
                        }
                    });

                    // Calc. total pages
                    ajaxGrid.totalPages = Math.ceil(ajaxGrid.totalRows / ajaxGrid.pageSize);
                } else {

                    var noRecordTemplate = getTemplate(params.RowTemplateNoRecords || '<tr class="es_grid_odd"><td colspan="' + thColumns.length + '">Kayıt bulunamadı.</td></tr>');

                    ajaxGrid.totalPages = 0;
                    gwRows.append(noRecordTemplate);
                }


                // create pager
                pager.empty();
                if (!pagerDisabled && ajaxGrid.totalPages > 0) {
                    pager.append('<tbody>\r\n<tr>\r\n</tr></tbody>\r\n');
                    pager = pager.find('tr');

                    var pagerLength = 11;
                    var pagerStart = ajaxGrid.pageIndex;
                    if (pagerStart <= 5)
                        pagerStart = 1;
                    else
                        pagerStart = pagerStart - 5;
                    var pagerEnd = pagerStart + (pagerLength - 1);
                    if (pagerEnd > ajaxGrid.totalPages)
                        pagerEnd = ajaxGrid.totalPages;

                    pagerEnd++;

                    //console.log('start:' + pagerStart + ' - end:' + pagerEnd + ' total:' + ajaxGrid.totalPages);

                    var moveFirst = $('<td><a href="javascript:;"><img src="/_i/doktorbul/btn_left.gif" alt="Geri" align="absmiddle" /></a></td>\r\n');
                    moveFirst.find('a').bind('click', function() {
                        ajaxGrid.Page(1);
                        //console.log('move first');
                    });
                    pager.append(moveFirst);

                    var movePrevious = $('<td><a href="javascript:;"><img src="/_i/doktorbul/btn_left.gif" alt="Geri" align="absmiddle" /></a></td>\r\n');
                    movePrevious.find('a').bind('click', function() {
                        var page2go = ajaxGrid.pageIndex - 1;
                        page2go = page2go <= 0 ? 1 : page2go;
                        ajaxGrid.Page(page2go);
                        //console.log('move previous');
                    });
                    pager.append(movePrevious);

                    for (var i = pagerStart; i < pagerEnd; i++) {
                        var pageLink;
                        if (i == ajaxGrid.pageIndex) {
                            pageLink = $('<td class="current">' + i + '</td>');
                        } else {
                            pageLink = $('<td><a href="javascript:;">' + i + '</a></td>');
                            pageLink.find('a').bind('click', function() {
                                ajaxGrid.Page(parseInt($(this).text()));
                                //console.log('move to page ' + parseInt($(this).text()));
                            });
                        }
                        pager.append(pageLink);
                    }

                    var moveNext = $('<td><a href="javascript:;"><img src="/_i/doktorbul/btn_right.gif" alt="İleri" align="absmiddle" /></a></td>');
                    moveNext.find('a').bind('click', function() {
                        var page2go = ajaxGrid.pageIndex + 1;
                        page2go = page2go >= ajaxGrid.totalPages ? ajaxGrid.totalPages : page2go;
                        ajaxGrid.Page(page2go);
                        //console.log('move next');
                    });
                    pager.append(moveNext);

                    var moveLast = $('<td><a href="javascript:;"><img src="/_i/doktorbul/btn_right.gif" alt="İleri" align="absmiddle" /></a></td>');
                    moveLast.find('a').bind('click', function() {
                        ajaxGrid.Page(ajaxGrid.totalPages);
                        //console.log('move last');
                    });
                    pager.append(moveLast);


                    if (ajaxGrid.totalPages > 0) {
                        // set summary
                        // Record 1 to 20 of 416
                        //summary.text('Records ' + (ajaxGrid.pageIndex * ajaxGrid.pageSize - ajaxGrid.pageSize + 1) + ' to ' + ((ajaxGrid.pageIndex * ajaxGrid.pageSize) < ajaxGrid.totalRows ? (ajaxGrid.pageIndex * ajaxGrid.pageSize) : ajaxGrid.totalRows) + ' of ' + ajaxGrid.totalRows);
                        var startPoint = (ajaxGrid.pageIndex * ajaxGrid.pageSize - ajaxGrid.pageSize + 1), endPoint = ((ajaxGrid.pageIndex * ajaxGrid.pageSize) < ajaxGrid.totalRows ? (ajaxGrid.pageIndex * ajaxGrid.pageSize) : ajaxGrid.totalRows);
                        summary.text('Toplam ' + ajaxGrid.totalRows + ' kayıttan ' + startPoint + ' ile ' + endPoint + ' arasındaki kayıtlar görüntüleniyor.');
                    } else {
                        summary.text('Kayıt bulunamadı.');
                    }
                }

                // trigger jquery event
                ajaxGrid.targetGrid.trigger('gridFinish', [wsResult.Response.DataSource]);
				
            }else{
                // trigger jquery event
                ajaxGrid.targetGrid.trigger('gridError', [wsResult.Exception, wsResult.Message]);
            }
        };

        // reload table
        if (ajaxGrid.parameters.LoadDefault != null && ajaxGrid.parameters.LoadDefault)
            ajaxGrid.Reload.apply({ internalCall: true });

        return ajaxGrid;
    };

})(jQuery);