//Ext.grid.EditorGrid.prototype.onEditComplete = function(ed, value, startValue){ 
//	this.editing = false;
//	ed.un("specialkey",this.onEditorKey,this);
//	if(value != startValue){
//		var r = this.dataSource.getAt(ed.row);
//		var field = this.colModel.getDataIndex(el,col);
//		if(this.fireEvent("afteredit",this,r,field,ed.row,ed.col,value) != false){
//			r.set(field,value);
//		}
//	}
//	this.view.focusCell(ed.row,ed.col);
//}

var GridGod = function(){
	this.grid = {};
	this.ds = {};
	this.render = function(){
		this.createGrid();
		this.gridHead_toolbar();
		this.gridFooter_toolbar();
	};
	this.renderTool = function(){
//		this.gridHead_toolbar();
		this.gridFooter_toolbar();
	};
	//check button is availabled
	_ActiveBtn = function(){
		if(this.grid.getSelectionModel().hasSelection()){
			paging.items.get('ClearSelections').enable();
			if(roleDelete==true){
				paging.items.get('DeleteSelections').enable();
			}
		}else{
			paging.items.get('ClearSelections').disable();
			if(roleDelete==true){
				paging.items.get('DeleteSelections').disable();
			}
		}
	}
	//create callback
	_cb = function(oE,bSuccess,oResponse){
		if(bSuccess){
			var el = getEl('cb');
			el.update('<img src='+PageInfo.base+'"/wpmres/css/yui-ext/images/check.gif" />'+oResponse.responseText);
			el.show().pause(3);
			el.fadeOut({endOpacity:.1,duration:2});
		}else{
			getEl('cb').update('<img src='+PageInfo.base+'"/wpmres/images/tel.gif"/>connection is failed');
		}
	}
}

function formatBoolean(value){
	return value ? message["common.yes"] : message["common.no"];  
};
    
function formatDate(value){
	return value ? value.dateFormat('M d, Y') : '';
};

GridGod.prototype={
	getds:function(){
		return this.ds;
	},
	createGrid:function(){
		var fm = Ext.form, Ed = Ext.grid.GridEditor;
		wiseObj.cm = new Ext.grid.ColumnModel(myHeadModel);
		wiseObj.record = Ext.data.Record.create(myColModel);
		wiseObj.ds = new Ext.data.Store({
			proxy: new Ext.data.DWRProxy(PageInfo.dwrHandler),
			reader: new Ext.data.ListRangeReader({
	            totalProperty: 'count',
	            id: 'id'
	        }, wiseObj.record)
		});
		wiseObj.grid = new Ext.grid.EditorGrid('grid-div',{
			ds: wiseObj.ds,
			cm: wiseObj.cm,
			selModel: new Ext.grid.RowSelectionModel(),
			enableColLock:false
		});
		
		wiseObj.ds.on('loadexception',function(ds,a,b,e){
			console.log(arguments);
		});
		
		wiseObj.grid.on('cellclick',this.cellclick,this,true);
		wiseObj.grid.on('celldblclick',this.celldblclick,this,true);
//		wiseObj.grid.on('afteredit',this.afteredit,this,true);
		wiseObj.grid.on('headerclick',this.headerclick,this,true);
//		wiseObj.grid.on("mouseover", this.onRowOver, this);
//	    wiseObj.grid.on("mouseout", this.onRowOut, this);
	    
		wiseObj.grid.render();
		
		wiseObj.ds.load({params:{start:0,limlit:PageInfo.pageSize}});
	},
//	onRowOver : function(e, t){
//		var gridView = wiseObj.grid.getView();
//        var row;
//        if((row = gridView.findRowIndex(t)) !== false){
//            gridView.getRowComposite(row).addClass("x-grid-row-over-cursor");
//        }
//    },
//
//    onRowOut : function(e, t){
//        var row;
//        var gridView = wiseObj.grid.getView();
//        if((row = gridView.findRowIndex(t)) !== false && row !== gridView.findRowIndex(e.getRelatedTarget())){
//            gridView.getRowComposite(row).removeClass("x-grid-row-over-cursor");
//        }
//    },
	gridHead_toolbar:function(){
		var obj = this;
		var gridHead = this.grid.getView().getHeaderPanel();
		gridHead.show();
		if(roleCreate==true){
			var tb = new Ext.Toolbar(gridHead, [{
				text: message["datagrid.add"],
				handler : function(){
					var createForm = $("formContainer");
					if(createForm!=null){
						doCreate();
						gridForm.createDialog();
					}
				}
			},'-','<span id="datagrid_multiSelect">'+message["datagrid.multiSelect"]+'</span>'
			]);
	}else{
		var tb = new Ext.Toolbar(gridHead, [
		'-','<span id="datagrid_multiSelect">'+message["datagrid.multiSelect"]+'</span>'
		]);
	}
	},
//	Please use CTRL to select multi records
//'Select All Record'
//'Cancel Selected'
//Delete Record
	gridFooter_toolbar:function(){
		var gridFoot = this.grid.getView().getFooterPanel(true);
		paging = new Ext.WisePagingToolbar(gridFoot,this.getds(),{
			pageSize:PageInfo.pageSize,
			displayInfo: true,
			displayMsg: '<span id="cb"></span>{0} - {1} {2}',
			emptyMsg: ''
		});
		paging.add('-',{
			pressed: false,
			enableToggle: true,
			text: message["datagrid.selectAll"],
			cls: 'x-btn-text-icon details',
			toggleHandler: function(){
				obj.grid.getSelectionModel().selectAll();
				_ActiveBtn.apply(obj);
			}
		});
		paging.add('-', {
			pressed: false,
			enableToggle:true,
			text: message["datagrid.cancellSelect"],
			cls: 'details',
			id: 'ClearSelections', 
			disabled: true,
			toggleHandler: function(){ 
				obj.grid.getSelectionModel().clearSelections();
				_ActiveBtn.apply(obj);
			}
		});
        if(roleDelete==true){
			paging.add('-', {
				pressed: false,
				enableToggle:true,
				text: message["datagrid.deleteRecord"],
				cls: 'x-btn-text-icon details',
				id: 'DeleteSelections', 
				disabled: true,
				toggleHandler:this.deleteRow.createDelegate(this) 
			});
		}
		var obj= this; 
		if(roleSearch==true){	
			paging.add('-', {
				pressed: false,
				enableToggle:true,
				text: message["datagrid.Search"],
				cls: 'x-btn-text-icon details',
				id:'queryBtn', // show Animation of Dialog form this Id
				toggleHandler: function(){
					var searchDiv = $("searchDiv");
					if(searchDiv!=null){
						query.show_dialog(obj)	//???createDelegate()??????
						setTimeout("focusSearchKey()",500);
					}else{
						doAlert(message["datagrid.noSearch"]);
					}
				}
			});	 
		}
		paging.add('-');		
		paging.add('<span id="cb"></span>');
		
	},
	deleteRow: function(btn,pressed){
		var selectedRows = this.grid.getSelectionModel().getSelections();
		var ids = new Array();
		for(var i=0;i<selectedRows.length;i++){
			var delId = selectedRows[i]["id"];
			ids[ids.length] = delId;
		}
		if(ids.length==0){
			doAlert(message["datagrid.noSelect"]);
		}else{
			doDeleteItems(ids);
		}
		return true;
	},
//	afteredit: function(grid,record,field,row,col,newValue){
//		return true;
//	},
	celldblclick : function(grid, rowIndex, columnIndex, e){
		if(roleModify==true){
			var pudID=this.ds.getAt(rowIndex).data["id"];
			doEdit(pudID);
			gridForm.createDialog();
		}else{
			doAlert(message["datagrid.havaNoEditRole"]);
		}
	},
	cellclick:function(grid,record,field,row,col,newValue){
		//var pudID=this.ds.getAt(rowIndex).data["id"];
		try{
			_ActiveBtn.call(this);
		}catch(e){}
	},
	headerclick: function (grid, columnIndex, e){
		var grid = this.grid;var cm = grid.getColumnModel();
		var sortField = cm.getDataIndex(columnIndex);
		var isSortAble = cm.isSortable(columnIndex);
		if(isSortAble){
			PageInfo.headColum = columnIndex;
			PageInfo.orderField = sortField;
			PageInfo.isAscend = (PageInfo.isAscend==true?false:true);
			fillTable(PageInfo.pageNumber);
		}
		return true;
	}
}
var wiseObj = null;
var gridFlag = false;
function initGrid(){
	if(wiseObj==null){
//		Ext.onReady(function(){
//			var t=0;
		    
//			for(var i =0 ; i< myHeadModel .length ;i++){
//		     	t= t+ myHeadModel[i].width;
//		     }
//		     var delt = PageInfo.tableWidth - t;
//		     var h = null;
//		     for(var i =0 ; i< myHeadModel .length ;i++){
//		     	if(myHeadModel[i].hidden != true){
//		     		h = myHeadModel[i];
//		     	}
//		     }
//		     if(h){
//		     	h.width = h.width+delt;
//		     }
		    wiseObj = new GridGod();
			wiseObj.render();
//		})
	}else{
		wiseObj.ds.load();
	}
}

//  ================= From ==================
var formContainer = $("formContainer");
var formDialog;
var gridForm= function(){
		var wait,error,errorMsg;
		var posting = false;
		return {
			init : function(){
			},
			createDialog : function(obj){
				if(!formDialog){
					formDialog = new Ext.BasicDialog('formContainer',{
						modal:true,
						autoTabs:false,
						width:680,
						height:350,
						shadow:true,
						minWidth:450,
						minHeight:260,
						shim:true,
						autoScroll:true
					});
					formDialog.addButton(message["common.save"]+"",this.SaveGridForm,formDialog);
					formDialog.addButton(message["datagrid.close"]+"",formDialog.hide,formDialog);
				}
				
				//reset
				//input textArea
				
				formDialog.show();
				formDialog.moveTo(40,20);
			},
			SaveGridForm :function (){
				doSave();
			}
		}
	}();
//================== Query =====================
var searchDiv = $("searchDiv");
var query = function(){
	var queryDialog;
	
		return {
			show_dialog:function(obj){
				this.obj = obj;
				var key=document.getElementById("key");
				if(key!=null){
					document.getElementById("key").value="";
				}
				if(!queryDialog){
					queryDialog = new Ext.BasicDialog('searchDiv',{
						modal:true,
						autoTabs:false,
						width:PageInfo.searchWidth,
						height:PageInfo.searchHeight,
						shadow:true,
						minWidth:260,
						shim:true,
						autoScroll:false
					});
					queryDialog.addKeyListener(27,queryDialog.hide,queryDialog);
					queryDialog.addKeyListener(13,this.query,query);
				
					queryDialog.addButton(message["datagrid.query"],this.query,query);
					queryDialog.addButton(message["datagrid.exit"],queryDialog.hide,queryDialog);
				}
				queryDialog.show(document.getElementById('queryBtn').dom);
//				queryDialog.moveTo(PageInfo.movex,PageInfo.movey);
					queryDialog.moveTo(PageInfo.movex*(Math.random()/10+1),PageInfo.movey*(Math.random()/10+1));
			},
			query:function(){
				doSearch();
				queryDialog.hide();
				
			}
			
		}
	}();
//====================== Page ===================
Ext.WisePagingToolbar = function(el, ds, config){
    Ext.PagingToolbar.superclass.constructor.call(this, el, null, config);
    this.ds = ds;
    this.cursor = 0;
    this.render(this.el);
    this.bind(ds);
};

Ext.extend(Ext.WisePagingToolbar, Ext.Toolbar, {
    pageSize: PageInfo.pageSize,
    displayMsg : 'Displaying {0} - {1}  {2}',
    emptyMsg : '',

    render : function(el){
        this.first = this.addButton({
            tooltip: this.firstText,
            cls: "x-btn-icon x-grid-page-first",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["first"])
        });
        this.prev = this.addButton({
            tooltip: this.prevText,
            cls: "x-btn-icon x-grid-page-prev",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["prev"])
        });
        this.addSeparator();
        this.add(message["common.currentPage"]);
        this.field = Ext.get(this.addDom({
           tag: "input",
           type: "text",
           id:	"inputPage",
           size: "3",
           value: PageInfo.pageNumber,
           cls: "x-grid-page-number"
        }).el);
//        this.field.addKeyListener(13,this.onPaging,this);
        this.field.on("keyup", this.onPagingKeydown, this);
//        this.field.on("focus", function(){this.dom.select();});
        this.afterTextEl = this.addText(String.format(this.afterPageText, PageInfo.pages));
        this.field.setHeight(18);
        this.addSeparator();
        this.next = this.addButton({
            tooltip: this.nextText,
            cls: "x-btn-icon x-grid-page-next",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["next"])
        });
        this.last = this.addButton({
            tooltip: this.lastText,
            cls: "x-btn-icon x-grid-page-last",
            disabled: true,
            handler: this.onClick.createDelegate(this, ["last"])
        });
        this.addSeparator();
        
        this.loading = this.addButton({
            tooltip: this.refreshText,
            cls: "x-btn-icon x-grid-loading",
            disabled: false
            //handler: this.onClick.createDelegate(this, ["refresh"])
        });

        if(this.displayInfo){
            this.displayEl = this.el.createChild({cls:'x-paging-info'});
        }
    },

    updateInfo : function(){
        if(this.displayEl){
            var count = PageInfo.itemCount;
            var pageLast = PageInfo.cursor+PageInfo.pageSize-1;
            var msg = count == 0 ?
                message["datagrid.noRecord"]:
                String.format(
                    this.displayMsg,
                    message["datagrid.currendRecord"]+"&nbsp;"+PageInfo.cursor, pageLast>count?count:pageLast,"&nbsp;&nbsp;"+message["common.total"]+"&nbsp;"+PageInfo.itemCount+"&nbsp;"+message["common.record"]    
                );
            this.displayEl.update(msg);
        }
    },

    onLoad : function(){
       var ap = PageInfo.pageNumber, ps = PageInfo.pages;

       this.afterTextEl.el.innerHTML = message["common.total"]+"&nbsp;"+String.format(this.afterPageText, PageInfo.pages)+"&nbsp;"+message["common.page"];
       this.field.dom.value = PageInfo.pageNumber;
       this.first.setDisabled((PageInfo.pageNumber == 1)||(PageInfo.pageNumber==0));
       this.prev.setDisabled((PageInfo.pageNumber == 1)||(PageInfo.pageNumber==0));
       this.next.setDisabled((PageInfo.pageNumber == ps|| PageInfo.pageNumber==0 || ps == 1));
       this.last.setDisabled((PageInfo.pageNumber == ps|| PageInfo.pageNumber==0 || ps == 1));
       this.loading.enable();
       this.updateInfo();
    },

    getPageData : function(){
        var total = PageInfo.itemCount;
        return {
            total : total,
            activePage : PageInfo.pageNumber,
            pages :  PageInfo.pages
        };
    },

    onLoadError : function(){
        this.loading.enable();
    },

    onPagingKeydown : function(e){
    	var pageDom = $F("inputPage");
    	 if(e.keyCode==13){
	    	if(!checkInt(pageDom)){
	    		doAlert(message["common.check.int"]);
	    		$("inputPage").value = PageInfo.pageNumber;
	    		return
	    	}else{
	    		if(pageDom<1||pageDom>PageInfo.pages){
		    		fillTable(PageInfo.pageNumber);
		    	}else{
		    		fillTable(pageDom);
		    	}
	    	}
    	 }
    },
    
    onPaging : function(e){
    	var pageDom = $F("inputPage");
    	if(!checkInt(pageDom)){
    		doAlert(message["common.check.int"]);
    		$("inputPage").value = PageInfo.pageNumber;
    		return
    	}else{
    		if(pageDom<1||pageDom>PageInfo.pages){
	    		fillTable(PageInfo.pageNumber);
	    	}else{
	    		fillTable(pageDom);
	    	}
    	}
    },

    beforeLoad : function(){
        if(this.loading){
            this.loading.disable();
        }
    },

    onClick : function(which){
        switch(which){
            case "first":
                fillTable(1);
            break;
            case "prev":
                fillTable(PageInfo.pageNumber-1);
            break;
            case "next":
                fillTable(PageInfo.pageNumber+1);
            break;
            case "last":
                fillTable(PageInfo.pages);
            break;
            case "refresh":
                var tmpPageEle = document.getElementById("inputPage");
            	var tmpPage = tmpPageEle.value;
            	if(checkInt(tmpPage)){
	            	PageInfo.pageNumber = tmpPage
	                fillTable(PageInfo.pageNumber);
            	}else{
            		doAlert(message["common.check.int"]);
            		tmpPageEle.value = PageInfo.pageNumber;
            		return false;
            	}
            break;
        }
    },

    unbind : function(ds){
        ds.un("beforeload", this.beforeLoad, this);
        ds.un("load", this.onLoad, this);
        ds.un("loadexception", this.onLoadError, this);
    },

    bind : function(ds){
        this.onLoad();
    },
  
    beforePageText :"",
    afterPageText : "{0}",
    firstText : "First Page",
    prevText : "Previous Page",
    nextText : "Next Page",
    lastText : "Last Page",
    refreshText : "Refresh"
});
// ==================   PageFunction =====================
function pageFunction(data){
	PageInfo.tableWidth = $("grid-div").offsetWidth;
	
	PageInfo.itemCount = data.count;
	PageInfo.cursor = (data.page-1)*data.ps+1;
	PageInfo.pageNumber = data.page;
	if(data.count==0){
		PageInfo.pageNumber = 1;
	}
	PageInfo.pageSize = data.ps;
	if(data.totalPage==0){
		data.totalPage=1;
	}
	PageInfo.pages = data.totalPage;
}
