﻿function AjaxGrid(){
    var _dataTable;
    var _totalLabel;
    var _gridElements=new GridElements();
    var _gridColumns=new Array();
    var _gridColumnWidths=new Array();
    var _gridColumnTitles=new Array();
    var _elementsCount=0;
    var _lazyLoadIndex=1;
    var that=this;
    var _loadNumber=0;
    var displayErrorMessage=false;
    
    this.pageIndex=1;
    this.maxPage=1;
	this.selectedIndex=-1;
	this.previousSortingColumn=null;
	this.previousSelectedRow=null;
	this.previousHoveredRow=null;
	this.selectedPage=null;
	
	this.finishedLoadingWithElements=null;
	this.finishedLoadingZeroElements=null;
   
    this.getDataTable=function(){
        return _dataTable;
    }
    this.getGridElements=function(){
        return _gridElements;
    }
    this.initObject=function(resetObject){
        if(resetObject){
            for(var idx=gebid(that.controlId +'_tablePlaceHolder').childNodes.length;idx>0;idx--){
                gebid(that.controlId +'_tablePlaceHolder').removeChild(gebid(that.controlId +'_tablePlaceHolder').childNodes[0]);
            }
            _dataTable=null;
            _totalLabel=null;
            _lazyLoadIndex=1;
            _loadNumber++;
        }
        getGridData();
    };
    
    function failedCallback(error){
        if(!that.enableLazyLoad){
            displayErrorMessage=false;
        }
        if(displayErrorMessage==true){
            alert("Service Error: " + error.get_message());
        }
    };
    function callbackGridDataCount(res){
        _elementsCount=res;
    };
    function callbackGridData(res){
	    if (res != undefined && res.loadNumber == _loadNumber){
	        that.resData=res.data;
	        var createFooter=false;
            if(res.array.length>0){
	            populateArray(res.array);
	            if(!_dataTable){
	                createFooter=true;
	                setGridColumns();
	                setGridColumnWidths();
	                setGridColumnTitles();
                    createTableHeader();
	                _dataTable=gebid(that.controlId+'_DataGrid');
	            }
	            createTableBody(true);
		        if(that.enableLazyLoad){
		            if(_elementsCount>=(_lazyLoadIndex-1)*that.lazyLoadBulkSize){
		                getGridData();
		            }else{
		               _lazyLoadIndex=1;
		            } 
		        }
                if(createFooter && that.enablePaging){
                    that.createTableFooter(that, _gridColumns.length, _elementsCount);
                }
		    }
	        if (res.array.length>0){
	            if(that.finishedLoadingWithElements!=null&&typeof that.finishedLoadingWithElements=='function'){
	                that.finishedLoadingWithElements();
	            }
	        }else{
	            if(that.finishedLoadingZeroElements!=null&&typeof that.finishedLoadingZeroElements=='function'){
	                that.finishedLoadingZeroElements();
	            }
	        }
	    }
	    else{
	        _lazyLoadIndex=1;
	    }
	    if(!that.hideRecordCount){
	        addUpdateElementsNumber();
	    }
    };
    function getGridData(){
        var pageNumber=1;
        var sortDirectionAsc=true;
        var sortExpression='';
        pageNumber=that.pageIndex;
        if(that.previousSortingColumn&&that.previousSortingColumn.direction!=0){
            sortExpression=that.previousSortingColumn.sortExpression;
            sortDirectionAsc=that.previousSortingColumn.direction>0?true:false;
        }else{
            sortExpression='';
            sortDirectionAsc=true;
        }
        var pageSize=that.tablePageSize?that.tablePageSize:-1;
        if(that.enableLazyLoad){
            pageNumber=_lazyLoadIndex;
            pageSize=that.lazyLoadBulkSize;
            _lazyLoadIndex++;
        }
        if((that.enableLazyLoad && _lazyLoadIndex && _lazyLoadIndex==2)||!(that.enableLazyLoad)&&that.webMethodCount&&that.webMethodCount!=''){
            var strToEval=that.webServicePopulate+'.'+that.webMethodCount+'([';
            strToEval+=that.webMethodPopulateFilter+','+that.uSId+'],';
            strToEval+='callbackGridDataCount,failedCallback);';
            eval(strToEval);   
        }
        var strToEval=that.webServicePopulate+'.'+that.webMethodPopulate+'([';
        strToEval+=that.webMethodPopulateFilter+',';
        strToEval+=pageNumber+','+pageSize+',"'+sortExpression+'",'+sortDirectionAsc+','+_loadNumber+','+that.uSId+'],';
        strToEval+='callbackGridData,failedCallback);';
        eval(strToEval);   
    };
    function populateArray(elements){
        _gridElements.clear();
        for(var elIdx=0;elIdx<elements.length;elIdx++){
            _gridElements.add(elements[elIdx]);
        }
    };
    function setGridColumns(){
        _gridColumns=that.tableColumnFields.split(',');
    };
    function setGridColumnWidths(){
        _gridColumnWidths=that.tableColumnWidths.split(',');
        if(_gridColumnWidths.length!=_gridColumns.length){
            _gridColumnWidths=new Array();
            for(var idx=0;idx<_gridColumns.length;idx++){
                _gridColumnWidths[idx]='100%';
            }
        }
    };
    function setGridColumnTitles(){
        _gridColumnTitles=that.tableColumnTitles.split(',');
        if(_gridColumnTitles.length!=_gridColumns.length){
            _gridColumnTitles=new Array();
            for(var idx=0;idx<_gridColumns.length;idx++){
                _gridColumnTitles[idx]=_gridColumns[idx];
            }
        }
    };
    function createTableHeader(){
        var table=document.createElement('TABLE');
        table.className=that.cssClassTable;
        table.setAttribute('cellspacing','0');
        table.setAttribute('cellpadding','0');
        table.setAttribute('id',that.controlId+'_DataGrid');
        if(that.hideHeader==false){
            var headerT=document.createElement('THEAD');
            var header=document.createElement('TR');
            header.className = that.cssClassRowHeader;
            if(that.enableCheck){
                var td=document.createElement('TH');
                td.style.width=that.columnCheckBoxWidth?that.columnCheckBoxWidth:'100%';
                var input=document.createElement('INPUT');
                input.setAttribute('type','checkbox');
                input.id=that.controlId+'_DataGrid_chkMultiSelect';
                input.gridObject=that;
                input.onclick=that.changeCheckAll;
                td.appendChild(input);
                header.appendChild(td);
            }
            for(var idx=0;idx<_gridColumns.length;idx++){
                var td=document.createElement('TH');
                td.style.width=_gridColumnWidths[idx];
                td.setAttribute('align','center');
                td.setAttribute('width', '50%');
                var paragraph=document.createElement('P');
                var title=document.createElement(that.enableSort?'A':'SPAN');
                title.innerHTML=_gridColumnTitles[idx];
                title.href='#';
                paragraph.appendChild(title);
                if(that.enableSort){
                    var br=document.createElement('BR');
                    paragraph.appendChild(br);
                    paragraph.gridObject=that;
                    paragraph.onclick=that.sortTable;
                    paragraph.sortExpression=_gridColumns[idx];
                    var img=document.createElement('IMG');
                    if(that.previousSortingColumn&&that.previousSortingColumn.sortExpression==_gridColumns[idx]){
                        switch (that.previousSortingColumn.direction){        
                            case 1:
                                img.setAttribute('src',that.imageSortDesc);
                                break;
                            case -1:
                                img.setAttribute('src',that.imageSortAsc);
                                break;
                             case 0:
                                img.setAttribute('src',that.imageSortNone);
                                break;
                        }
                        paragraph.direction=that.previousSortingColumn.direction;
                    }else{
                        paragraph.direction=0;
                        img.setAttribute('src',that.imageSortNone);
                    }
                    paragraph.appendChild(img);
                }
                td.appendChild(paragraph);
                header.appendChild(td);
            }
            headerT.appendChild(header);
            headerT.className=that.cssClassRowHeader;
            table.appendChild(headerT);
        }
        gebid(that.controlId +'_tablePlaceHolder').appendChild(table);
    };
    function createTableBody(clearRows){
        var endIdx=_gridElements.getArray().length;
        var tBody=_dataTable.getElementsByTagName('TBODY')[0];
        if(!tBody){
            tBody=document.createElement('TBODY');
            tBody.className=that.cssClassBody;
            _dataTable.appendChild(tBody);
        }else{
            if(clearRows){
                var rowCount=tBody.rows.length
                for (var row=0;row<rowCount;row++){
                    tBody.deleteRow(0);
                }
            }
        }
        var alternate=false;
        for(var elIdx=0;elIdx<endIdx;elIdx++){
            var element=_gridElements.getArray()[elIdx];
            if(!element) break;
            addRowToBody(tBody,element,tBody.rows.length,elIdx,alternate);
            alternate=!alternate;
        }
    };
    function addRowToBody(body,element,position,index,alternate){
        var row = body.insertRow(position);
        row.className=alternate?that.cssClassRowAlternate:that.cssClassRow;
        row.gridObject=that;
        row.alternate=alternate;
        if(that.selectedIndex==index){
            that.previousSelectedRow=row;
            row.className=that.cssClassRowSelected;
        }
        row.id=element.id;
        if(that.enableHover){
            row.onmouseover=that.hoverRowIn;
            row.onmouseout=that.hoverRowOut;
        }
        if(that.enableSelect){
            row.onclick=that.selectRow;
        }
        row.rowNumber=index;
        row.deleted=element.isDeleted;
        if(that.enableCheck){
            that.addCheckBoxCellToRow(that,row,position,-1);
        }
        for(var idx=0;idx<_gridColumns.length;idx++){
            var elementName=_gridColumns[idx];
            var cell=row.insertCell(-1);
            that.addElementsToCell(that,cell,elementName,element[elementName],position);
        }  
    };
    function addUpdateElementsNumber(){
        if(_totalLabel){
            _totalLabel.innerHtml='Records: '+_elementsCount;
        }else{
            var label=document.createElement('LABEL');
            label.innerHTML='Records: '+_elementsCount;
            label.id=that.controlId +'_tablePlaceHolder_elementNumber';
	        gebid(that.controlId +'_tablePlaceHolder').appendChild(label);
	        _totalLabel=gebid(that.controlId +'_tablePlaceHolder_elementNumber');
        }
    }
};