/*---------------------------------------------------------------------------*\
|  title:         table类                                                     |
|  Author:        谢昕                                                        |
|  Created:       2009-07-23                                                  |
|  LastModified:  2009-8-27                                                   |
|  Modified:2009-8-27 增加RSH框架处理前进，后退问题，引入json.js，rsh.js      |
var table=new xrbsTable({
   url:'<%=request.getContextPath()%>/news?type=QueryPage',
   table:'newList',
   colModel : [
	            {display: '图片', name : 'imgname', align: 'center',formula:'<img src="<%=request.getContextPath()%>/index/images/bbpindex_pic_65.jpg" width=9 height=9 />'},
				{display: '名称', name : 'title',className:'titleClass',formula:'<a name=showTip href="<%=request.getContextPath()%>/news?type=QueryInfo&id={%tableid%}" titleText="{%news_hint%}" titleName="{%newstype_name%}"  class=" new ellipsis" >{%title%}</a>', align: 'left'},
				{display: '日期', name : 'billdate',className:'date', align: 'center'}
   ],
   hidden:['tableid'],
   pageSize:10,
   usepager: true,
   onSuccess:function(t){
	  eachObj(document.getElementsByName("showTip"),function(i,o){
		 try{XRTip.init(o,{title:o.titleName})}catch(e){alert(e.message);};
	  });
   }
});
//新闻类别改变
function changeType(obj,no){
   table.option.url='<%=request.getContextPath()%>/news?type=QueryPage&newsType='+no;
   table.gotoPage(1);//重新查询
   eachObj(document.getElementsByName("newsType"),function(i,o){
	   o.style.fontWeight='';	
   });
   obj.style.fontWeight='bold';
   $('newsTypeName').innerText=obj.innerText;
}
\*---------------------------------------------------------------------------*/
var xrbsTable = Class.create();
xrbsTable.prototype = {
  initialize: function(op) {
    op=op||{};
	this.option={};
    Object.extend(this.option,op);
	if(typeof(this.option.table)=='string')
         this.option.table=$(this.option.table);
	if(!this.option.table){
		alert('表格创建失败,未找到对应TABLE!');
		return;
	}
	this.tableId=this.option.table.id;
	if(!this.option.table.getElementsByTagName("thead").length>0){
		xrbsTable.empty(this.option.table);
		//表头不存在
		var thead=document.createElement('thead');
		var tr=document.createElement('tr');
		thead.appendChild(tr);
		var td;
        xrbsTable.each(this.option.colModel,function(i,obj){//创建表头
			td=document.createElement('td');
			td.className=obj.headclass;
			td.id=obj.name+'_head';
			td.innerHTML=obj.display;
			tr.appendChild(td);
			td=null;
		});
        this.option.table.appendChild(thead);
		tr=null,thead=null;
	}
	if(this.option.usepager){//需要翻页信息
        this.showPager();
	}
    this.option.table.style.display='inline';
  },
  addData:function(array){
	 var x=0;//本次增加的记录条数
	 var table=this.option.table,op=this.option,temp=this;
	 var tbody = table.getElementsByTagName("tbody").length>0?table.getElementsByTagName("tbody")[0]:document.createElement('tbody');
	 var reg = new RegExp("\\{%(#?[A-Za-z0-9_]*)%}", "g");
	 var getCol=function (s){
		for(var i in op.colModel){
			if(op.colModel[i]["name"]==s){
				return op.colModel[i];
			}
		}
		return null;
	 };
     xrbsTable.empty(tbody);
	 table.appendChild(tbody);
     if(array&&array.length>0){//array对象中有数据且表头数据存在
	     xrbsTable.each(array,function(i,row){
				if(temp.option.pageSize&&i>temp.option.pageSize)
					return;
				x++;
				var tr = document.createElement('tr');
				tbody.appendChild(tr);
				tr.id = 'row' + i;
                tr.className='erowB';
				if (i % 2) tr.className = 'erowA';
				xrbsTable.each(op.colModel,function(r,col){
				    var td = document.createElement('td');
					tr.appendChild(td);
					td.align = col.align;
					td.name=col.name;
					if(col.className)
                       className.add(td,col.className);//给TD添加样式
					if(col.style)
						td.style.cssText=col.style;
					var value=(row[col.name]+'').valueFormat(col);
					if(col.formula){
						  value=col.formula;
						  while (reg.test(col.formula)){
								var tc=RegExp.$1!=col.name?getCol(RegExp.$1):col;
								var tempreg = new RegExp("{%"+ RegExp.$1 +"%}", "g");
                                value=value.replace(tempreg,tc!=null?((row[RegExp.$1]+'').valueFormat(tc)):(row[RegExp.$1]?row[RegExp.$1]:""));
								tc=null;tempreg=null;
						  }
					}
					td.innerHTML =value;
					td = null;
			   });
			  //增加隐藏控件
			  if(op.hidden){
				  xrbsTable.each(op.hidden,function(r,h){
					  var input =document.createElement('input');
                      input.type='hidden';
					  input.name=h;
					  input.value=row[h];
					  tr.appendChild(input);
					  input=null;
				 });
			  }
			  tr = null;
		  });
		//this.addRowProp(table);
	 }
	 if(this.option.pageSize&&this.option.pageSize>x){//每页显示记录条数存在且本次增加记录条数小于每页显示记录条数
	    for(;x<this.option.pageSize;x++){
            var tr = document.createElement('tr');
			tbody.appendChild(tr);
            xrbsTable.each(op.colModel,function(r,col){
				var td = document.createElement('td');
				if(col.className)
                    className.add(td,col.className);//给TD添加样式
				if(col.style)
						td.style.cssText=col.style;
				td.innerHTML ='&nbsp;';
				tr.appendChild(td);
			    td = null;
			});
			tr = null;
		}
	 }
	 if(this.option.onSuccess){
          this.option.onSuccess(tbody);
	 }
	 table=null,op=null,getCol=null,reg=null,tbody=null,x=null;
  },
  addRowProp:function(tbody){
      xrbsTable.each(tbody.getElementsByTagName('tr'),function(i,tr){
		 if(tr.id){
			 EventManager.Add(tr,"onmouseover", function(){
				 className.add(tr,'trOver');
			 });
             EventManager.Add(tr,"onmouseout", function(){
				 className.remove(tr,'trOver');
			 });
             EventManager.Add(tr,"onclick", function(){
                 xrbsTable.each(tbody.getElementsByTagName('tr'),function(j,t){
                     className.remove(t,'trSelected');
				 });//删除所有选中样式
				 className.add(tr,'trSelected');
			 });
		 }
	  });
  },
  showPager:function(page){
	 page=page||this.option.table.page;
	 if(arguments.length>0)//翻页后先删除原来的翻页条信息
          removeUtil.remove($(this.tableId+'_pager'));
	 var intPage=0,sumpage=0,count=0;
     try{
		 if(typeof(page)=='string')
			 eval('page='+page);
     }catch(e){
  	     page=false;
     }
	 if(page){
		 intPage=parseInt(page.intPage,10);//当前页码
		 sumpage=parseInt(page.sumpage,10);//记录总数
         count=parseInt(page.count,10);//分页总数
		 intPage=count==0?0:intPage;
	 }
	 var temp=this;
     var mainDiv=document.createElement('div');
     this.option.table.insertAdjacentElement('afterEnd', mainDiv);
     mainDiv.id=this.tableId+'_pager';
     className.add(mainDiv,'toolbar-box');
	 var toolbar=document.createElement('div');
	 mainDiv.appendChild(toolbar);
	 className.add(toolbar,'toolbar');
	 toolbar.appendChild(document.createElement('<DIV class="toolbar-text" style="width:30px;"></DIV>'));
     var pageList=['first-page','prev-page','next-page','last-page'];
     xrbsTable.each(pageList,function(i,p){
        var a=document.createElement('a');
		className.add(a,'image-button');
		a.href='#a';
        var div=document.createElement('div');
        div.className=p;
        a.appendChild(div);
        toolbar.appendChild(a);
		if(!page){
           className.add(a,'button-disable');
		   div=null,a=null;
		   return;
		}
		if(p=='first-page'){//第一页
		   a.title='第一页';
		   if(intPage!=1&&intPage!=0){//按钮可用
			   a.pager=1;
		   }else{
			   className.add(a,'button-disable');
		   }
		}else if(p=='prev-page'){//上一页
		    a.title='第一页'; 
		   if(intPage>1){//按钮可用
			   a.pager=intPage-1;
		   }else{
			   className.add(a,'button-disable');
		   }
		}else if(p=='next-page'){//下一页
		   a.title='下一页'; 
		   if(intPage<sumpage){//按钮可用
			  a.pager=intPage+1;
		   }else{
			   className.add(a,'button-disable');
		   }
		}else if(p=='last-page'){//最后一页
		    a.title='最末页'; 
		   if(intPage!=sumpage){//按钮可用
			  a.pager=sumpage;
		   }else{
			   className.add(a,'button-disable');
		   }
		}
		 a.onclick=function(){
			if(this.pager)
				temp.gotoPage(this.pager);
			xrbsTable.stopEvent(event);
		};
		div=null,a=null;
	 });
     toolbar.appendChild(document.createElement('<DIV class="button-split"></DIV>'));
	 var a=document.createElement('a');
	 className.add(a,'image-button');
	 a.href='#a';
	 a.title='跳转到指定的页';
     var div=document.createElement('div');//跳转到指定的页
     div.className='goto-page';
	 toolbar.appendChild(a);
     a.appendChild(div);
	 if(intPage!=0){
        EventManager.Add(a,"onclick",function(){
			temp.gotoPage($F(temp.tableId+'_pagerInput'));
			xrbsTable.stopEvent(event);
		});
	 }else{
		 className.add(a,'button-disable');
	 }
	 div=document.createElement('div');
	 div.className='toolbar-text';
     div.innerHTML='第';
	 toolbar.appendChild(div);
     var input =document.createElement('input');
	 input.className='page-input';
	 input.id=this.tableId+'_pagerInput';
	 input.value=page?intPage:0;
	 toolbar.appendChild(input);
	 input=null;
	 div=document.createElement('div');
	 div.className='toolbar-text';
     div.innerHTML='页';
	 toolbar.appendChild(div);
	 toolbar.appendChild(document.createElement('<DIV class="button-split"></DIV>'));
	 div=document.createElement('div');
	 div.className='page-state';
	 /**计算显示条数begin**/
	 var number1=count==0?0:((intPage-1)*this.option.pageSize+1);//如果count=0则显示为0
	 var number2=count==0?0:(intPage==sumpage&&count%this.option.pageSize!=0)?(((intPage-1)*this.option.pageSize)+count%this.option.pageSize):(intPage)*this.option.pageSize;
	 /**end**/
     div.innerHTML='&nbsp;显示&nbsp;'+number1+'-'+number2+'&nbsp;条, 共&nbsp;'+sumpage+'页&nbsp;&nbsp;'+count+'条数据&nbsp;&nbsp;&nbsp;';
     toolbar.appendChild(div);
     mainDiv=null,toolbar=null,div=null,input=null,a=null,intPage=null,sumpage=null,count=null,number1=null,number2=null,pageList=null;
  },
  gotoPage:function(page,flag){//页面翻页 flag 用于判断是否需要记录历史
     var temp=this;
	 var url=this.option.url;
     xrbsTable.maskStart();
     new _AJAX.Request(url, {method: 'post',parameters: '&page='+page,onFailure:function(){
		  xrbsTable.maskStop();
          alert('数据查询出错,请检查网络设置!');
        },onSuccess:function(r){
        var obj=null;
        try{
            eval("obj="+r.responseText.replace(/^\s+|\s+$/g,""));
            if(obj.error){
                alert(obj.error);
                return;
            }
			temp.addData(obj.rows);
            temp.showPager(obj.pager);
			if(!flag)//rsh框架记录历史
				xrbsTable.addDhtmlHistory({data:obj,url:url,page:page});
			obj=null;
        }catch(e){
        }
		xrbsTable.maskStop();
    }});
  },
  executeDhtmlHistory:function(data,fn){//回调方法在RSH记录地址改变时调用
	  if(data){
		  this.option.url=data.url;
		  if(data.data){
              this.addData(data.data.rows);
              this.showPager(data.data.pager);
		  }else if(data.url){
			  this.gotoPage(data.page,true);//重新查询
		  }
		  if(fn)
			fn.call(window,data);
	  }
  }
};
//样式操作类 add 添加 romove  删除 has 判断
className={
	add:function(t,c){
         t.className += ( t.className ? " " : "" ) + c;
	},
	remove:function(t,c){
        var arry=new Array();
        xrbsTable.each(t.className.split(/\s+/),function(i,o){
			if(o!=c) arry.push(o);
		});
        t.className=arry.join(' ');
        arry=null;
	},
    has:function(t,c) {
		var arry=t.className.split(/\s+/);
		for(var i=0;i<arry.length;i++){
			if(o==c) return true;
		}
        return false;
	}
};
//扩展STRING对象用于TABLE数据格式化
Object.extend(String.prototype,{
	  valueFormat: function(o){
		  if(!this||this=='') return '';
		  var o = o || {};
		  if(o.type=='number'||o.type=='money'){
			  if(!o.mask) o.mask='nnnnnnnn.nn';
			  if(o.type=='number'){
				  return this.getMyFloat(o.mask);
			  }else{
				  return this.getMyFloat(o.mask).changeMoney();
			  }
		  }else if(o.type=='date'){
			  if(this.length>10) return this.substring(0,10);//格式化时间
		  }else if(o.type=='datetime'){
			  if(this.length>19) return this.substring(0,19);//格式化时间
		  }
		   return this;
	  },
	  getMyFloat: function(mask) {
		_m = mask.split('.');
		_o = (this+'').split('.');
		decimal='';
		if(_m.length > 1) {//有小数存在
			if(_o.length > 1) {//原数也有小数存在
				if(_m[1].length > _o[1].length) {
					decimal = _o[1];
					for(var i = 0; i < (_m[1].length - _o[1].length);i++) {
						decimal += '0';
					}
				} else if(_m[1].length < _o[1].length) {
					decimal += _o[1].substring(0,_m[1].length);
				} else {
					decimal += _o[1];
				}
			} else {//原数为整数
				for(var i = 0; i < _m[1].length;i++) {
					decimal += '0';
				}
			}
			return (_o[0]+'.'+decimal);
		} else {
			return _o[0];
		}
	  },
	  changeMoney:function() {
		var s = new Array();
		var moneytoString = "";
		var Stingmoney = this;
		var decimal = "";
		var Int = "";
		var d = Stingmoney.indexOf(".");
		var f = Stingmoney.indexOf("-");
		if (d != -1) {
			decimal += Stingmoney.substring(d, Stingmoney.length);
			if (f == -1) {
				Int += Stingmoney.substring(0, d);
			} else {
				moneytoString += "-";
				Int += Stingmoney.substring(f + 1, d);
			}
		} else {
			decimal += "";
		if (f == -1) {
				Int += Stingmoney;
			} else {
				moneytoString += "-";
				Int += Stingmoney.substring(f + 1, Stingmoney.length);
			}
		}
		var m = Int.length % 3;
		var i = 0;
		if (m == 0) {
			i = parseInt(Int.length / 3,10) - 1;
			moneytoString += Int.substring(0, 3);
		} else {
			i = parseInt(Int.length / 3,10);
			moneytoString += Int.substring(0, m);
		}
		for (var j = 0; j < i; j++) {
			s.push(","+Int.substring(Int.length - (j + 1) * 3, Int.length- j * 3));
		}
		while (s.length>0) {
			moneytoString += s.pop();
		}
		return moneytoString + decimal;
	  },
	  endsWith:function(f){
		  var reg = new RegExp("\\s*"+f+"($)", "i"); 
		  if (reg.test(this))
			return true; return false;
	  },
	  startsWith:function(f){
		  var reg = new RegExp("(^)"+ f +"\\s*", "i"); 
		  if (reg.test(this))
			return true; return false;
	  }
});
Object.extend(xrbsTable,{
    //对象循环
	each:function(obj,fn) {
		if (obj.length == undefined )
			for ( var i in obj )
				fn.call( obj[i], i, obj[i] );
		else
			for ( var i = 0, ol = obj.length, val = obj[0]; i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
				return obj;
	},
    mask:false,
	maskStart:function(){
       if(!xrbsTable.mask)
		  try{xrbsTable.mask=new Mask({title:"&nbsp;数据加载中，请稍候......",color:"#0099ff"});}catch(e){alert(e.message);}
	   try{if(xrbsTable.mask) xrbsTable.mask.ScreenConvert();}catch(e){}
	},
	maskStop:function(){
       try{if(xrbsTable.mask) xrbsTable.mask.ScreenClean();}catch(e){}
	}, 
	empty:function(obj){
		while (obj.firstChild ){
			 removeUtil.remove(obj.firstChild);
		}
	},
	indexHistory:0,
	hashName:'xr',
	addDhtmlHistory:function(data){
		var name=this.hashName+'#'+data.page+'#';
		name=escape(name);
		dhtmlHistory.add(name+this.indexHistory,data);
        this.indexHistory++;
	},
	executeDhtmlHistory:function(table,data,fn){
		if(table&&data){
			table.executeDhtmlHistory(data,fn);
		}
	},
	stopEvent:function(event){
		try{
			event=event||window.event;
			event.returnValue = false;
			event.cancelBubble = true;
		}catch(e){}
	},
	/**
	*功能传入 表头(op)及JSON数据显示表结构
    *op格式如:
	var op={
		字段名:{
			name:"显示名称"
			type:"类别"
		}
	}
	json={"rows":[{
		"orgname":"新希望集团",
		"plan_detailid":12505,
		"approve_number":12,
		"requir_name":"系统管理员",
		"aquir_deliver_date":"2009-05-31 14:01:50.0"
	}]}
	**/
	showTable:function(op,json){
        if(json&&json.rows&&op){//JSON对象中有数据且表头数据存在
           var table=document.createElement("table");
           table.className='tableList';
		   var tr=table.insertRow(0);	
		   tr.id='realTitleTR';
		// class='tableHead' 
		   var td,value;
		   this.each(op,function(i,o){
              td=tr.insertCell();
			  td.className='tableHead';
			  td.id=i+'_head';
			  td.innerHTML=o.name;
		   });
           this.each(json.rows,function(i,o){
                tr=table.insertRow(table.rows.length);
				if(i%2==0){
                   tr.className='listColorA';
				}else{
				   tr.className='listColorB';
				}
				xrbsTable.each(op,function(r,s){
				  td=tr.insertCell();
				  value=o[r]?o[r]:' ';
				  if(s.type=='datetime'){
					  if(value.length>19)
						  value=value.substring(0,19);
				  }
				  if(s.type=='number')
					 td.style.textAlign ='right';
					 td.innerHTML=value;
			   });
		   });
		   return table;
		}
		return null;
	}
});
(function(){
   if(!xrbsTable.mask){
	   var head = document.getElementsByTagName("head")[0];
	   var script = document.createElement("script");
	   try{
		   script.src = '/'+ xrbs.WEB_APP_NAME +'/js/newmask.js';
		   head.appendChild(script);
	   }catch(e){
		   script.src = '/xrgp/js/newmask.js';
		   head.appendChild(script);
	   }
   }
})();
