﻿(function ($) {
/**
 * jqGrid 2.0 - jQuery Grid plugin 04/08/2007
 *
 * http://trirand.com/blog/
 *
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * 
 *
 */
$.fn.jqGrid = function( p ) {
	p = $.extend({
		url: null,
		height: 150,
		page: 1,
		rowNum: 20,
		records: 0,
		pager: "",
		colModel: [],
		rowList: [],
		colNames: [],			
		sortorder: "asc",
		sortname: "",
		imgpath: "",
		sortascimg :  "sort_asc.gif",
		sortdescimg : "sort_desc.gif",
		firstimg: "first.gif",
		previmg: "prev.gif",
		nextimg: "next.gif",
		lastimg: "last.gif",
		altRows: true,
		subGrid: false,
		subGridModel :[],
		lastpage: 0,
		lastsort: -1,
		selrow: null,
		onSelectRow: null,
		onSortCol: null,
		ondblClickRow: null,
		datatype:"xml",
		viewrecords: false,
		recordtext:"Record(s)",
		rowheight:null,
		barDraging: false, //rainpher adds
		startPosX: 0,
		barAreaWidth:250,
		pageStepLen:0
	}, p || {});

	var grid = {         
		headers: [],
		cols: [],
		dragStart: function(i,x) {
			this.resizing = { idx: i, startX: x};
			// opera does not support col-resize
			this.hDiv.style.cursor = "e-resize";
		},
		dragMove: function(x) {
			if(this.resizing) {
				var diff = x-this.resizing.startX;
				var h = this.headers[this.resizing.idx];
				var newWidth = h.width + diff;
				if(newWidth > 30) { 
					h.el.style.width = newWidth+"px";
					h.newWidth = newWidth; 
					this.cols[this.resizing.idx].style.width = newWidth+"px";
					this.newWidth = this.width+diff;
					$('table',this.bDiv).css("width",this.newWidth + "px");
					this.hTable.style.width = this.newWidth + "px";
					this.hDiv.scrollLeft = this.bDiv.scrollLeft;
				}
			}
		},
		dragEnd: function() {
			this.hDiv.style.cursor = "default";
			if(this.resizing) {
				var idx = this.resizing.idx;
				this.headers[idx].width = this.headers[idx].newWidth;
				this.width = this.newWidth;
				this.resizing = false;
			}
		},
		scroll: function() {
			this.hDiv.scrollLeft = this.bDiv.scrollLeft;
	  	}
	} // end grid
	this.getUrl = function() { return p.url; };           
	this.getSortName = function() { return p.sortname; };
	this.getSortOrder = function() { return p.sortorder; };
	this.getSelectedRow = function() {return p.selrow; };
	this.getPage = function() {return p.page; };
	this.getRowNum = function() {return p.rowNum; };
	this.setUrl = function (newurl) { p.url=newurl; };
	this.setSortName = function (newsort) { p.sortname=newsort; };
	this.setSortOrder = function (neword) { p.sortorder=neword; };
	this.setPage = function (newpage) { 
		if( typeof newpage === 'number' && newpage > 0) {p.page=newpage;}
	};
	this.setRowNum = function (newrownum) { 
		if( typeof newrownum === 'number' && newrownum > 0) {p.rowNum=newrownum;}
	};
	if(p.imgpath !== "" ) {
		p.sortascimg = p.imgpath+"/"+p.sortascimg;
		p.sortdescimg = p.imgpath+"/"+p.sortdescimg;
		p.firstimg = p.imgpath+"/"+p.firstimg;
		p.previmg = p.imgpath+"/"+p.previmg;
		p.nextimg = p.imgpath+"/"+p.nextimg;
		p.lastimg = p.imgpath+"/"+p.lastimg;
	}
	return this.each( function() {
		if(this.grid) {return false;}
		if( p.colNames.length === 0 || p.colNames.length !== p.colModel.length ) {
			alert("列名长度为0！");
			return false;
		}
		var onSelectRow = p.onSelectRow, ondblClickRow = p.ondblClickRow, onSortCol=p.onSortCol;
		if(typeof onSelectRow !== 'function') {onSelectRow=false;}
		if(typeof ondblClickRow !== 'function') {ondblClickRow=false;}
		if(typeof onSortCol !== 'function') {onSortCol=false;}

		var formatCol = function (elem, pos){
			var rowalign1 = p.colModel[pos].align;
			rowalign1 = rowalign1 ? rowalign1 : "left";
			$(elem).css("text-align",rowalign1);
		}

		var resizeFirstRow = function (t){
			$("tbody tr:eq(1) td",t).each( function( k ) {
				$(this).css("width",grid.headers[k].width+"px");
				grid.cols[k] = this;
			});
		}
		var addXmlData = function addXmlData (xml,t) {
			if(xml) { $("tbody tr:gt(0)", t).remove(); } else { return false; }
			var row,td, gi=0;
			var rowh=0;
			$("rows/page",xml).each( function() { p.page = this.textContent  || this.text ; });
			$("rows/total",xml).each( function() { p.lastpage = this.textContent  || this.text ; }  );
			$("rows/records",xml).each( function() { p.records = this.textContent  || this.text ; }  );
			$("rows/row",xml).each( function( j ) {
			row = document.createElement("tr");
			row.id = this.getAttribute("id") || j;
			if (p.subGrid) { 
				td = document.createElement("td");
				$(td,t).html("<img src='./plus.gif'/>")
          		.toggle( function() { 
            		$(this).html("<img src='./minus.gif'/>"); 
            		var req = populatesubgrid( row.id );
   					var subdata = "<tr class='subgrid'><td><img src='line3.gif'/></td><td colspan='"+parseInt(p.colNames.length-1)+"'><div class='tablediv'>"; 
            		$(this).parent().after( subdata+ req +"</div></td></tr>" ); }, 
            		function() { $(this).parent().next().remove(".subgrid"); $(this).html("<img src='./plus.gif'/>");
            	});
				formatCol($(td,t), 0);
				row.appendChild(td);
				gi = 1;
        	}
			$("cell",this).each( function (i) {
				td = document.createElement("td");
//				$(td,t).html( $(this).text() ); //slower
				$(td,t).html( this.textContent /*mozilla*/ || this.text /*ie*/ || '&nbsp;' /*ie bad formating*/);
				formatCol($(td,t), i+gi);
				row.appendChild(td);
			});
			$("tbody",t).append(row);
			if(p.rowheight) rowh = rowh+p.rowheight;
			});
			if( !$.browser.msie ) { /* dummy operation for non msie*/ t.scrollLeft = t.scrollLeft; resizeFirstRow(t); }
		  	t.scrollTop = 0;
		  	if(p.rowheight) $(grid.bDiv).css({height:rowh+2+'px'});
		 	if( p.altRows === true ) { $("tbody tr:odd", t).addClass("alt"); }
			grid.hDiv.loading = false;
			$("div.loading",grid.hDiv).fadeOut("fast");
			xml = null;
			if(p.pager) {
				$(p.pager).find('span:eq(1)').html(p.page+"/"+p.lastpage );
				if (p.viewrecords)
					$(p.pager).find('span:eq(0)').html(p.records+"&nbsp;"+p.recordtext+"&nbsp;");
			}
			return false;
		}
		var addJSONData = function(data,t) {
			if(data) { $("tbody tr:gt(0)", t).remove(); } else { return false; }
			p.page = data.page;
			p.lastpage= data.total;
			p.records= data.records;
			var row = ""
			var cur = ""
			for (var i=0;i<data.rows.length;i++) {
				cur = data.rows[i];
				row = '<tr id="'+cur.id+'">';
				for (var j=0;j<cur.cell.length;j++) { 
					row += "<td>"+cur.cell[j]+"</td>";
					formatCol($(row,t), j);
				}
				row += '</tr>';
				$("tbody",t).append(row);		
			}
			if( !$.browser.msie ) { t.scrollLeft=t.scrollLeft; resizeFirstRow(t); }
		  	t.scrollTop = 0;
		 	if( p.altRows === true ) { $("tbody tr:odd", t).addClass("alt"); }
			grid.hDiv.loading = false;
			$("div.loading",grid.hDiv).fadeOut("fast");
			if(p.pager) {if(p.lastpage==0)p.lastpage=1;
				$(p.pager).find('span:eq(1)').html(p.page+"/"+p.lastpage+"页&nbsp;每页显示：");
				if (p.viewrecords)
					$(p.pager).find('span:eq(0)').html(p.records+""+p.recordtext);
			}
			p.pageStepLen=parseInt(($("div.r_area",p.pager).width()-10)/p.lastpage);
			if(p.pageStepLen==0) p.pageStepLen=1;
			$(p.pager).append("<div class='floatdiv' id='dragTipDiv'>当前为第"+parseInt(parseInt($("div.r_area",p.pager).css("left"))-5.1)/p.pageStepLen+"页<br />拖动前为第"+p.page+"页</div>");
			return false;
		}
		var populate = function () {
			if(!grid.hDiv.loading) {
				grid.hDiv.loading = true;
				$("div.loading",grid.hDiv).fadeIn("fast");
				switch(p.datatype)
				{
				case "json":
//					$.getJSON(p.url,{page: p.page, rows: p.rowNum, sidx: p.sortname, sord:p.sortorder}, function(JSON) { addJSONData (JSON,grid.bDiv) });
  					if(window.getNews)
				    {
				        getNews(p.page,p.rowNum,p.sortname,p.sortorder,addJSONData,grid.bDiv);
            	     }  
                	break    
				case "xml":
					$.ajax({ url: p.url,method:"GET",dataType:"xml",data :{page: p.page, rows: p.rowNum, sidx: p.sortname, sord:p.sortorder}, complete:function(xml) { addXmlData(xml.responseXML,grid.bDiv); } });
  				break
				}
			}
		}
		var populatesubgrid = function( sid ) {
			var res;
			if(!grid.hDiv.loading) {
				grid.hDiv.loading = true;
				$("div.loading",grid.hDiv).fadeIn("fast");
				$.ajax({type:"GET", url: p.subGridUrl, dataType:"xml",data: "id="+sid, async: false,success: function(sxml) { res = subGridXml(sxml.responseXML); } });
      		}
			return res;
    	}
    	var subGridXml = function( sxml ){
      		var trdiv, tddiv, result = "", i;
      		if (sxml){
        		var dummy = document.createElement("span");
        		trdiv = document.createElement("div");
        		trdiv.className="rowdiv";
        		for (i = 0; i<= p.subGridModel[0].name.length-1; i++) {
          			tddiv = document.createElement("div");
          			tddiv.className = "celldivth";
          			$(tddiv).html(p.subGridModel[0].name[i]);
          			$(tddiv).width( p.subGridModel[0].width[i]);
          			trdiv.appendChild(tddiv);
        		}
        		dummy.appendChild(trdiv);
        		$("rows/row", sxml).each( function(){
          			trdiv = document.createElement("div");
          			trdiv.className="rowdiv";
          			$("cell",this).each( function(i) {
            			tddiv = document.createElement("div");
            			tddiv.className = "celldiv";
            			$(tddiv).html(this.firstChild.nodeValue);
            			$(tddiv).width( p.subGridModel[0].width[i] );
            			trdiv.appendChild(tddiv);
					});
          			dummy.appendChild(trdiv);
        		});
        		result += $(dummy).html();
        		sxml = null
        		grid.hDiv.loading = false;
        		$("div.loading",grid.hDiv).fadeOut("fast");
      		}
      		return result;
    	}
		var setPager = function (){
			$(p.pager).append("<span></span><img id='first' src='"+p.firstimg+"' /><img id='prev' src='"+p.previmg+"' /><div class='r_area' style='width:"+p.barAreaWidth+"px' id='bar_area'><div class='r_slider' style='left: 5px; width: 10px; height: 20px'></div></div><img id='next' src='"+p.nextimg+"' /><img id='last' src='"+p.lastimg+"' /><span></span>");
			if(p.rowList.length >0){
				var str="<SELECT class='selbox'>";
				for(var i=0;i<=p.rowList.length-1;i++){
					str +="<OPTION value="+p.rowList[i]+">"+p.rowList[i];
				}
				str +="</SELECT>";
				$(p.pager).append(str);
				$(p.pager).find("select").bind('change',function() { 
					p.rowNum = this.value>0 ? this.value : p.rowNum;p.page=1; populate();
					 if(onSelectRow) {onSelectRow(p.selrow = null);} else {p.selrow = null;}
				});
			}
			var areaWidth= parseInt($("div.r_area",p.pager).width());
			var currntLeft=0,offset=0;
			var barPos=$("div.r_slider",p.pager).offset();
			$("div.r_slider",p.pager).mousedown(function(ev){
			    p.barDraging=true;
			    if($.browser.msie)
			        p.startPosX=event.clientX;
			    else if($.browser.mozilla)
			    {
			        p.startPosX=ev.pageX;
			    }
			    window.document.onmousemove=function(ev){
			        if(p.barDraging)
			        {
			            barPos=$("div.r_slider",p.pager).offset();
			            currntLeft=parseInt($("div.r_slider",p.pager).css("left"));
			            if($.browser.msie)
			            {
			                offset=event.clientX-barPos.left;
			            }
			            else if($.browser.mozilla)
			            {
			                offset=ev.pageX-barPos.left;
			            }
    			        
			            if(offset>0)
			            {
			                if(offset+currntLeft>=5&&offset+currntLeft<=areaWidth-5)
			                {
			                    while(offset>0)
			                    {
			                        currntLeft++;
			                        $("div.r_slider",p.pager).css("left",currntLeft);
			                        offset--;
			                    }
			                }
			                else
			                {
			                    while(currntLeft!=areaWidth-5&&currntLeft!=5)
			                    {
			                        currntLeft++;
			                        $("div.r_slider",p.pager).css("left",currntLeft);
			                    }
			                }
			            }
			            else if(offset<0)
			            {
			                if(offset+currntLeft>=5&&offset+currntLeft<=areaWidth-5)
			                {
			                    while(offset<0)
			                    {
			                        currntLeft--;
			                        $("div.r_slider",p.pager).css("left",currntLeft);
			                        offset++;
			                    }
			                }
			                else
			                {
			                    while(currntLeft>5)
			                    {
			                        currntLeft--;
			                        $("div.r_slider",p.pager).css("left",currntLeft);
			                    }
			                }
			            }
			            var crt=parseInt((parseInt($("div.r_slider",p.pager).css("left"))-5.1)/p.pageStepLen)+1;
			            if($.browser.msie)
			                $("div.floatdiv",p.pager).css({"left":document.documentElement.scrollLeft+event.clientX+10,"top":document.documentElement.scrollTop+event.clientY+5}).html("当前为第"+crt+"页,<br />拖动前为第"+p.page+"页");
			            else if($.browser.mozilla)
			                $("div.floatdiv",p.pager).css({"left":ev.pageX+10,"top":ev.pageY+5}).html("当前为第"+crt+"页,<br />拖动前为第"+p.page+"页");
			        }
			        else {return false;}
			    };
			    window.document.onmouseup=function(){
			        p.barDraging=false;
		            document.onmousedown=null;
		            document.onmousemove=null;
		            document.onmouseup=null;
			        var c=parseInt(parseInt($("div.r_slider",p.pager).css("left"))-5.1);
			        var pp=parseInt(c/p.pageStepLen)+1;
			        $("div.floatdiv",p.pager).css("visibility","hidden");
			        $("div.r_slider",p.pager).css("left",(pp-1)*p.pageStepLen);
			        if(pp!=p.page)
			        {
			            p.page=pp;
			            populate();
			        }
			    }; 
			}).mouseover(function(ev){
			    if(!p.barDraging)
			    {
			        if($.browser.msie)
			            $("div.floatdiv",p.pager).css({"left":document.documentElement.scrollLeft+event.clientX+10,"top":document.documentElement.scrollTop+event.clientY+5,"visibility":"visible"}).html("当前为第"+p.page+"页");
			        else if($.browser.mozilla)
			            $("div.floatdiv",p.pager).css({"left":ev.pageX+10,"top":ev.pageY+5,"visibility":"visible"}).html("当前为第"+p.page+"页");
			    }
			}).mouseout(function(){
			    if(!p.barDraging)
			    {
			        $("div.floatdiv",p.pager).css("visibility","hidden");
	            }
			});
			
			$(p.pager).find('img').click( function() {
				var cp = parseInt(p.page,10);
				var last = parseInt(p.lastpage,10), selclick = false;
				var fp=true; var pp=true; var np=true; var lp=true;
				if(last ===0 || last===1) {fp=false;pp=false;np=false;lp=false; }
				else if( last>1 && cp >=1) {
					if( cp === 1) { fp=false; pp=false; } 
					else if( cp>1 && cp <last){ }
					else if( cp===last){ np=false;lp=false; }
				} else if( last>1 && cp===0 ) { np=false;lp=false; cp=last-1;}
				if( $(this).attr('id') === 'first' && fp ) { p.page=1; populate(); selclick=true;} 
				if( $(this).attr('id') === 'prev' && pp) { p.page=(cp-1);populate(); selclick=true;} 
				if( $(this).attr('id') === 'next' && np) { p.page=(cp+1);populate(); selclick=true;} 
				if( $(this).attr('id') === 'last' && lp) { p.page=last;populate(); selclick=true;}
				if(selclick) 
				{
				    $("div.r_slider",p.pager).css("left",(p.page-1)*p.pageStepLen);
				    if(onSelectRow) {onSelectRow(p.selrow = null);} else {p.selrow = null;}
				}
			}).hover(function() { $(this).addClass("jsHover"); },
				function () { $(this).removeClass("jsHover"); }  
			);
		}
		var sortData = function (index, idxcol){
			if( p.sortname === index) { 
				if( p.sortorder === 'asc') {
					p.sortorder = 'desc';
			} else if(p.sortorder === 'desc') { p.sortorder='asc';}
			} else { p.sortorder='asc';}
			var imgs = p.sortorder==='asc' ? p.sortascimg : p.sortdescimg;
			imgs = "<img src='"+imgs+"'>";
			var thd= $("thead:first",grid.hDiv).get(0);
			$("tr th div#"+p.sortname+" img",thd).remove();
			$("tr th div#"+index,thd).append(imgs);
			p.lastsort = idxcol;
			p.sortname = index;
			p.page = 1;
			if(onSortCol) {onSortCol(index,idxcol);}
			populate();
			if(onSelectRow) {onSelectRow(p.selrow = null);} else{p.selrow = null;}
		}
		var setGridWidth = function () {
			var initwidth = 0; 
			for(var l=0;l<=p.colModel.length-1;l++)
				initwidth = parseInt(initwidth) + parseInt(p.colModel[l].width || 150);
			var tblwidth = p.width ? p.width : initwidth;
			for(l=0;l<=p.colModel.length-1;l++)
				p.colModel[l].width = Math.round(tblwidth/initwidth*p.colModel[l].width);
		}
		if( p.subGrid ) {
		  p.colNames.unshift("");
		  p.colModel.unshift({name:'', width:30});
		}
		if (p.width) setGridWidth();
		var thead = document.createElement("thead");
		var trow = document.createElement("tr");
		thead.appendChild(trow); 
		var i, th, idn, thdiv;
		for(i=0;i<=p.colNames.length-1;i++){
			th = document.createElement("th");
			idn = p.colModel[i].name;
			idn = idn ? idn : i+1;
			thdiv = document.createElement("div");
			thdiv.id = ""+idn+"";
			$(thdiv).html(p.colNames[i]+"&nbsp;");
			th.appendChild(thdiv);
			trow.appendChild(th);
		}
		this.appendChild(thead);
		thead = $("thead:first",this).get(0);
		var w, res, sort;
		$("tr:first th",thead).each(function ( j ) {
			w = p.colModel[j].width || 150;
			res = document.createElement("span");
			$(res).html("&nbsp;");
			$(res).mousedown(function (e) {
				grid.dragStart( j ,e.clientX);
				return false;
			});
			$(this).css("width",w+"px").prepend(res);
			grid.headers[j] = { width: w, el: this };
		});
		$("tr:first th div",thead).each(function(l) {
			sort = p.colModel[l].sortable;
			if( typeof sort == 'boolean') {sort = sort;} else {sort =  true;}
			if(sort) { 
				$(this).css("cursor","pointer");
				$(this).click(function(){ sortData( this.id, l ); });
				}
		});

		var tbody = document.createElement("tbody");
		trow = document.createElement("tr");
		trow.style.display="none";
		tbody.appendChild(trow);
		var td, ptr;
		for(i=0;i<=p.colNames.length-1;i++){
			td = document.createElement("td");
			trow.appendChild(td);
		}
		this.appendChild(tbody);
		$("tbody tr:first td",this).each(function(ii) {
			w = p.colModel[ii].width || 150;
			$(this).css("width",w+"px");
			grid.cols[ii] = this ;
		});
		grid.width = $.css ? $.css(this,"width") : $.css(this,"width");
		grid.bWidth = grid.width;
		grid.hTable = document.createElement("table");
		grid.hTable.cellSpacing="0"; 
		grid.hTable.className = "scroll";
		grid.hTable.appendChild(thead);
		grid.hDiv = document.createElement("div");
		$(grid.hDiv)
		  	.css({ width: grid.width+"px", overflow: "hidden"})
			.prepend('<div class="loading">Loading...</div>')					
			.append(grid.hTable)
			.bind("selectstart", function () { return false; });

		$(this).mouseover(function(e) {
			td = (e.target || e.srcElement);
			ptr = $(td).parents("tr");
			if($(ptr).attr("class") != "subgrid") {
			$(ptr).addClass("over");
			td.title =$(td).text();// td.innerHTML;
			}
		}).mouseout(function(e) {
			td = (e.target || e.srcElement);
			ptr = $(td).parents("tr");
			$(ptr).removeClass("over");
			td.title = "";
		}).css("width", grid.width+"px").before(grid.hDiv).click(function(e) {
			td = (e.target || e.srcElement);
			ptr = $(td).parents("tr");
			if( p.selrow ) { $("tbody tr#"+p.selrow,grid.bDiv).removeClass("selected");}
			p.selrow = $(ptr).attr("id");
			if($(ptr).attr("class") != "subgrid") $(ptr).addClass("selected");
			if( onSelectRow ) { onSelectRow(p.selrow); }
		}).dblclick(function (e) {
			td = (e.target || e.srcElement);
			if( ondblClickRow ) {ondblClickRow(td.parentNode.id);}
		}).bind('reloadGrid', function(e) {
			populate();
			if(onSelectRow) {onSelectRow(p.selrow = null);} else{ p.selrow=null;}
		});
		grid.bDiv = document.createElement("div");
		$(grid.bDiv)
		  	.scroll(function (e) {grid.scroll()})
			.css({ height: p.height+"px", padding: "0px", margin: "0px", overflow: "auto", width: (grid.width+20)+"px"})
			.append(this);
		// remove the two tbody elements when ie (bug in 1.1.2)
		if( $.browser.msie ) {
			if( $("tbody",this).size() === 2 ) { $("tbody:first",this).remove(); }
		}
		$(grid.hDiv).mousemove(function (e) {grid.dragMove(e.clientX);}).after(grid.bDiv);

		populate();

		if(p.pager){
			if( $(p.pager).attr("class") === "scroll") $(p.pager).css({ width: (grid.width-4)+"px", overflow: "hidden"});
			setPager();
		}
		$(document).mouseup(function (e) {grid.dragEnd();});
		this.grid = grid;
		// MSIE memory leak
		$(window).unload(function () {
			this.grid = null;
		});
	});
};
})(jQuery);

