// JavaScript Document


function rGrid() {
    this.init.apply(this, arguments);
}

rGrid.prototype = {
	/* initialize table object */
	init : function(dbTableName, actionLink){
		if(!$('#'+dbTableName).length){
			ex = "Element name '"+dbTableName+"' not found!";
			throw(ex);
		}
		
		this.dbTableName 	= dbTableName;
		this.actionLink 	= actionLink;
		this.loading		= false;
		this.rows			= new Array();
		this.extra			= new Array();
        this.sortDir   		= 'desc';
        this.sortCol   		= 1;
        this.page           = 1;
        this.pageLength     = 10;
        this.totalRecords   = 0;
		this.currentExtra   = null;
        
        var tableBody = $('#' + this.dbTableName);
        this.initPager(tableBody);     
		this._getGridData();
        this._initTableHead();
        
        
	}, /* end init function */
	
	isLoading : function(){
		return this.loading;
	},
	
    initPager: function(insertBeforeElement){
        var self = this;
        insertBeforeElement.before('<ul class="ui-widget ui-helper-clearfix pager">');   
        var pg = insertBeforeElement.prev();
        	
        pg.append('<li title=".ui-icon-circle-triangle-e" class="ui-state-default ui-corner-all" id="'+ this.dbTableName +'Back"><span class="ui-icon ui-icon-circle-triangle-w"></span></li>');    
        $('#'+ this.dbTableName +'Back').click(function(){self.back();});
        
 
        pg.append('<li title=".ui-icon-circle-triangle-e" class="ui-state-default ui-corner-all" id="'+ this.dbTableName +'Forward"><span class="ui-icon ui-icon-circle-triangle-e"></span></li>');
        $('#'+ this.dbTableName +'Forward').click(function(){self.forward();});
        
         //hover states on the static widgets
         $('ul#pager li').hover(
         function() { $(this).addClass('ui-state-hover'); },
         function() { $(this).removeClass('ui-state-hover'); }
         ); 
       
    },
    
    _initTableHead : function(){
         var self = this;
         $('#'+ this.dbTableName + ' th').each(function(index) {
            $(this).css("cursor","pointer");
            $(this).click(function(){
               
                $('#'+ self.dbTableName + ' th').eq(self.sortCol-1).removeClass('ui-state-active');
                self._sort(index+1);
                $(this).addClass('ui-state-active');
                });
            
            $(this).hover(
             function() { $(this).addClass('ui-state-hover'); },
             function() { $(this).removeClass('ui-state-hover'); }
             ); 
         });
    },
    
    _sort: function(col){
        if(this.sortCol == col){
            this.sortDir = (this.sortDir == "asc") ? "desc" : "asc"
        }
        this.sortCol = col;
        this._getGridData();
    },
    
	_getGridData : function(){
		/* local scope of 'self' variable */
		var self = this;
		var dataToSend = this._buildAJAXData();
        $('#error > p').empty();
        /* $('#error > p').append(dataToSend); */

        this.loading = true;
		$.ajax({ 
			   type: 'POST',
               url: this.actionLink,  
			   dataType:  "json",
               data: 'data='+dataToSend,
			   success: function(res)
			   {
				    self.rows = res.rows.data;
					self.extra = res.rows.extra;
                    self.totalRecords = res.totalRecords;
                    self.loading = false;
                    self.render();
                    
                    /* self.rows     = res.rows; */
      		   },
               
               error: function(req){
                    alert('error ' +  req.status + ' - ' + req.statusText);
               }

			   });
	},
    
    _buildAJAXData : function(){
        
        var JSONObject = {
                        "sortDir": this.sortDir,
                        "sortCol": this.sortCol,
                        "page": this.page,
                        "pageLength": this.pageLength
        };
 
        return JSON.stringify(JSONObject);
    },
    
    render: function(){
        if(this.rows){
            var self = this;
            var tableBody = $('#' + this.dbTableName + ' > tbody');
            tableBody.empty();
            var stringBuilder = '';
            var rCnt;
			self.currentRow = 0;
            for(rCnt = 0; rCnt < this.rows.length; rCnt++){
                stringBuilder = '<tr id="' + rCnt + '">';
                for(var cCnt = 0; cCnt < this.rows[rCnt].length; cCnt++)
                    stringBuilder += '<td>' + this.rows[rCnt][cCnt] + '</td>';
                                    
                stringBuilder += '</tr>';
                 currentRowDataExtra = self.extra[rCnt];
                
                var createdRow = $(stringBuilder).appendTo(tableBody);

                createdRow.hover(
                  function () {
                    $(this).addClass('rmbRowHover');
                  }, 
                  function () {
                    $(this).removeClass('rmbRowHover');
                  }
                );
                
                createdRow.find('td:has(a)').each(function(index,el) {
                        //alert(el);
                        $(el).click(function(event){event.stopPropagation();});
                    });
                //event.stopPropagation();
                if(typeof this.onRowClick == 'function') { 
                        createdRow.click(function(event) {							
                          self.onRowClick(self, this, event);
                        });
                }
                                
            }
            //alert(this.rows[0]['Code']);
        }
            
    },
    
    forward: function(){
        var self = this;
        
        if(Math.ceil(self.totalRecords/self.pageLength)  > self.page)
        {           
            self.page++;
            self._getGridData();
        }
            
    },
    
    back: function(){
        if(1 < this.page){
            this.page--;
            this._getGridData();
        }
            
    }
    
}




