/***
 *@author      : ShawnYoung
 *@namespace   : XL
 *@version     : 1.0.0
 *@date        : 2008.08.02
   BASIC Object   
***/
var XL = {};

/*
 function/methods overrider
*/
var winAlert = window.alert;
window.alert = function(str,isDbg){
    if((XL.Debugger.isDebug && isDbg) || XL.Obj.isEmpty(isDbg)){
        winAlert(str);
    }
}

/*
 @class       :prototype class
*/
XL.Class = {
    create:function(){
      var ret = function(){
        this.__EVT_ARR={};
        this.addEventListener = XL.Class.addEventListener;
        this.removeEventListener = XL.Class.removeEventListener;
        this.dispatchEvent = XL.Class.dispatchEvent;
        this.toString = XL.Class.toString;
        if(this.initialize instanceof Function) {
            this.dispatchEvent(XL.EVENT.ON_INITIAL,this);
            this.initialize.apply(this,arguments);            
        }
        this.getClassName = function(){
            
        }
      }      
      return ret;
    },
    toString:function(){
       var str='';       
       for(a in this){
		 if(str) str += ',\n';
         str+=a+':'+XL.Obj.getString(this[a]);         
       }
       str = '{\n'+str+'\n}';
       return str;
    },
    removeEventListener:function(evt,func){    
      if(!XL.Obj.isFunction(func)){
        this.__EVT_ARR[evt] = null;
        delete(this.__EVT_ARR[evt]);
      }else{
        var argL = this.__EVT_ARR[evt].length;
        for(var i=0;i<argL;i++){
            if(this.__EVT_ARR[evt][i]==func){
                this.__EVT_ARR[evt].remove(i);
                break;
            }
        }
      }
    },
    dispatchEvent:function(evt){
      if(!XL.Obj.isEmpty(this.__EVT_ARR[evt])){
        try{
            var al = this.__EVT_ARR[evt].length;
            for(var i=0;i<al;i++){
                if(XL.Obj.isFunction(this.__EVT_ARR[evt][i])){
                try{
                    this.__EVT_ARR[evt][i].apply(this,arguments);
                   }catch(e){}
                }
            }
        }catch(e){alert(e,true);}
      }else{
        //'未定义事件!'.showMsg();
      }
    },
    addEventListener:function(evt,fun){
      if(!XL.Obj.isArray(this.__EVT_ARR[evt])){
        this.__EVT_ARR[evt]=[];
      }
      this.__EVT_ARR[evt][this.__EVT_ARR[evt].length] = fun;
    },
    extend:function(obj,pro,func){
        if(typeof(pro)=='object'){
          for(v in pro){
            obj.prototype[v]=pro[v];
          }
        }else{
          if(typeof(func)!='function'){
            //alert('sdfe');
            return;
          }
          try{
            obj.prototype[pro]=func;
          }catch(e){alert(e,true);}
        }
    },
    bindMethod:function(method,obj,args){
        //alert(XL.Obj.isFunction(method));
        if(!XL.Obj.isFunction(obj) && !XL.Obj.isObject(obj) || !XL.Obj.isFunction(method)){
          '绑定失败！'.showMsg();
          return false;
        }
        if(!args || args==undefined){
            args = [];
        }
        //alert(method);
        return function(){method.apply(obj,args)};        
    }
};

/*
 @namespace :XL.EVENT
*/
XL.EVENT ={
    BF_CHANGE:'beforechange',AF_CHANGE:'afterchange',BF_LOAD:'beforeload',AF_LOAD:'afterload',
    BF_START:'beforestart',AF_START:'afterStart',ON_LOAD:'onload',ON_LOADING:'onloading',ON_READYSTATECHANGE:'onreadystatechange',
    ON_CLICK:'onclick',ON_MOUSEWHEEL:'onmousewheel',BF_SEND:'beforesend',ON_COMPLETE:'oncomplete',ON_INITIAL:'oninitialize',ON_TIMER:'ontimer',
    ON_CHANGE:'onchange',ON_NORESULT:'onnoresult',ON_INSERTROW:'oninsertrow',ON_INSERTCELL:'oninsertcell',ON_MOUSEROVER:'onmouseover',ON_MOUSEOUT:'onmouseout',ON_MOUSEDOWN:'onmousedown',ON_LOADFAILD:'error',
	ON_RESIZE:'onresize'
};
/*
*/
XL.Debugger = {
    isDebug:true,
    showMsg:function(){
        
    }
}
/*
*/
XL.Agent = {
    isIE:((navigator.userAgent.indexOf('IE')>0) && document.all),
    isFF:(navigator.userAgent.indexOf('Firefox')>0)
}

XL.Client = {
  Engine: {'name': 'unknown', 'version': ''},
  Features: {}
};

XL.Client.Features.xhr = !!(window.XMLHttpRequest);
XL.Client.Features.xpath = !!(document.evaluate);

if (window.opera) XL.Client.Engine.name = 'opera';
else if (window.ActiveXObject) XL.Client.Engine = {'name': 'ie', 'version': (XL.Client.Features.xhr) ? 7 : 6};
else if (!navigator.taintEnabled) XL.Client.Engine = {'name': 'webkit', 'version': (XL.Client.Features.xpath) ? 420 : 419};
else if (document.getBoxObjectFor != null) XL.Client.Engine.name = 'gecko';
XL.Client.Engine[XL.Client.Engine.name] = XL.Client.Engine[XL.Client.Engine.name + XL.Client.Engine.version] = true;

/*
 @namespace:XL.Obj
*/
XL.Obj = {
  NULLFunc:function(){},
  isNull:function(obj){
    return (obj===null);
  },
  isUndefined:function(obj){
    return (obj===undefined);
  },
  isEmpty:function(obj){
    if(XL.Obj.isArray(obj)){
        return obj.length<=0;
    }else{        
        return (XL.Obj.isNull(obj) || XL.Obj.isUndefined(obj) || (!obj && obj!==false));
    }
  },
  isFunction:function(obj){
    return (obj instanceof Function);
  },
  isObject:function(obj){
    return (typeof(obj)=='object');
  },
  isString:function(obj){
    return (typeof(obj)=='string');
  },
  isArray:function(obj){
    return (obj instanceof Array);
  },
  isDate:function(obj){
    try{
        if(XL.obj.isString(obj)){
            var dt = new Date(obj);
            if(XL.obj.isNumber(dt.getFullYear())){
                return true;
            }else{
                return false;
            }
        }else{
            if(obj.getFullYear){
                return true;
            }else{
                return false;
            }
        }
    }catch(e){
        return false;
    }
  },
  isNumber:function(obj){
    return !(isNaN(obj) || XL.Obj.isNull(obj) || XL.Obj.isUndefined(obj));
  },
  getString:function(obj){
    var ret='';
    if(!obj) return ret;
    if(XL.Obj.isObject(obj)){        
        ret+='{\n';
        for(var a in obj){
            try{
                ret+=a+':'+XL.Obj.getString(obj[a])+',\n';
            }catch(e){
                alert('getStringError:'+typeof(obj[a]),true);
                ret+=a+':\n';
            }
        }
        ret = ret.substr(0,ret.length-2);
        ret+='}\n';
        //alert(ret);
    }else{
        ret = String(obj);       
    }
    return ret;
  },
  getLenStr:function(val,len,padd,ifLeft){
    if(XL.Obj.isEmpty(ifLeft)){ifLeft = false;}
    if(XL.Obj.isEmpty(padd)){padd = ' ';}
    
    val = String(val);
    
    while(val.length<len){
        if(ifLeft){
          val = padd+val;
        }else{
          val +=padd;
        }
    }    
    return val;
  },
  Try:function(){
    if(arguments.length<=0) return false;
    for(var i=0;i<arguments.length;i++){
        if(XL.Obj.isFunction(arguments[i])){
            try{
                return arguments[i]();
            }catch(e){
                continue;
            }
        }
    }
    return false;
  },
  nullFunction:function(){},
  getNumber:function(str){
    if(XL.Obj.isNumber(str)){
        return Number(str);
    }else{
        return 0;
    }
  }
};

/*
  String extend
*/
XL.Class.extend(String,{
        showMsg:function(){
           alert(this);
        },
        trim:function(){
           return this.replace(/(^\s*)|(\s*$)/gi,'');
        },
        format:function(){
           var args = null;
           if(!arguments){return this;}
           if(arguments[0] instanceof Array){
             args = arguments[0];
           }else{
             args = arguments;
           }
           var argc = args.length;    
           var ret = this;
           for(var i=0;i<argc;i++){
             var reg = new RegExp('\\{'+i.toString()+'\\}','gi');
             ret = ret.replace(reg,String(args[i]));
           }
           return ret;
        },
        toNumber:function(){
            if(this.isEmpty() || isNaN(this)){
                return 0;
            }else{
                return Number(this);
            }
        },
        isEmpty:function(){
            return (this===null || this===undefined || !this.trim());
        }
});

/*
 Array property extend
*/
XL.Class.extend(Array,{         
         remove:function(index){
           this.splice(index,1); 
         },
         insert:function(index,obj){
            
         },
         toString:function(){
            var ret='(';
            for(var i=0;i<this.length;i++){
                if(XL.Obj.isObject(this[i])){
                    ret+=XL.Obj.getString(this[i]);
                    if(i<this.length-1){
                        ret+=',';
                    }
                }
            }
            ret+=')';
            
            return ret;
         },
		 each:function(func){			
			if(XL.Obj.isFunction(func)){
				for(var i=0;i<this.length;i++){
					var last = null;
					//var nxt = null;
					if(i>0){
						last = this[i-1];
					}
					/*
					if(i<this.length-1){
						nxt = this[i+1];
					}*/

					func(last,this[i],i);
				}
			}
		 }
});

XL.Class.extend(Date,{
    toFormat:function(str){
        var val = 'YyMmDd';
        for(var i =0;i<val.length;i++){
            var sFlag = val.substr(i,1);
            if(str.indexOf(sFlag)>=0){
                try{
                 var reg  =new RegExp(sFlag,'g');
                }catch(e){
                    alert(e);
                }
                var v =0;
                switch(sFlag.toLowerCase()){
                    case 'y':
                        v = this.yearValue(sFlag);
                        break;
                    case 'm':
                        v = this.monthValue(sFlag);
                        break;
                    case 'd':
                        v = this.dayValue(sFlag);
                        break;
                }
                str = str.replace(reg,v);
            }
        }
        return str;
    },
    getMonthValue:function(){
      return this.getFullYear()*12+this.getMonth()+1;  
    },
    addMonth:function(f){
            if(!XL.Obj.isNumber(f)){
                    f = 1;
            }
            var y = this.getFullYear();
            var m = this.getMonth()+1;
            var d = this.getDate();
            m+=f;
            if(m>12){
                    y+=Math.floor(m/12);
                    m = m % 12;
            }else if(m <1){
                    if(m==0){
                        y--;
                    }else{
                      y-= Math.ceil((0-m)/12);
                    }
                    m = 12-((0-m) % 12);
            }
            
            var md = Date.getMonthDays(y,m);
            if(d>md){
              d = md;
            }
            
            var dstr = y+'/'+m+'/'+d;
            return (new Date(dstr));
    },
	monthDays:function(){
		return Date.getMonthDays(this.getFullYear(),this.getMonth()+1);
	},
	addDay:function(days){
		var addDs = XL.Obj.getNumber(days);
		if(!addDs) return this;
		var y = this.getFullYear();
		var m = this.getMonth()+1;
		var d = this.getDate()+addDs;
		var tmds = this.monthDays();
		/********************************************************************/
		if(days>0){
		    var nmds = Date.getMonthDays(this.addMonth(1).toFormat('Y-M-D'));
		}else{
			var nmds = Date.getMonthDays(this.addMonth(-1).toFormat('Y-M-D'));
		}
		
		if(d>tmds){
			while(d>tmds){
				if(m<12){
					m++;
					d-=tmds;					
				}else{
					
				}
			}
		}else{
			while(d<0){
				
			}
		}
	},
    yearValue:function(fmt){
        if(XL.Obj.isEmpty(fmt)){
            fmt = 'Y';
        }else if(fmt.toLowerCase()!='y'){
            fmt = 'Y';
        }
        var yval = this.getFullYear();        
        if(fmt=='Y'){
            return XL.Obj.getLenStr(yval,4,'0',true);
        }else{
            return yval.toString();
        }
    },
    monthValue:function(fmt){
        if(XL.Obj.isEmpty(fmt)){
            fmt = 'M';
        }else if(fmt.toLowerCase()!='m'){
            fmt = 'M';
        }
        var mval = this.getMonth()+1;
        if(fmt=='M'){
            return XL.Obj.getLenStr(mval,2,'0',true);
        }else{
            return mval.toString();
        }
    },
    dayValue:function(fmt){
        if(XL.Obj.isEmpty(fmt)){
            fmt = 'D';
        }else if(fmt.toLowerCase()!='d'){
            fmt = 'D';
        }
        var dval = this.getDate();
        if(fmt=='D'){
            return XL.Obj.getLenStr(dval,2,'0',true);
        }else{
            return dval.toString();
        }
    }
});

Date.compare=function(dt1,dt2){
       if(!(dt1 instanceof Date)){
		   dt1 = new Date(dt1.replace(/\-/g,'/'));
	   }
	   if(!(dt2 instanceof Date)){
		   dt2 = new Date(dt2.replace(/\-/g,'/'));
	   }
	   return (dt1>dt2);
}
Date.getMonthDays=function(y,m){
    if(arguments.length>1){        
	  var day = [31,28,31,30,31,30,31,31,30,31,30,31];
	  if(( y%4 ==0) && m==2){
	    return 29;
	  }else{
	    return day[m-1];
	  }
    }else{
        if(arguments[0] instanceof Date){
            var dt = arguments[0];
        }else{
            var str = arguments[0];
            if(!str) return 0;
            str = str.replace(/\-/g,'/');
            var dt = new Date(str);
        }
        return Date.getMonthDays(dt.getFullYear(),dt.getMonth()+1);
    }
}
Date.getMonthFirstDay=function(){
    if(arguments.length==2){
        var y = arguments[0];
        var m = arguments[1];
        var st = y+'/'+m+'/1';
        var strDt = new Date(y+'/'+m+'/1');        
        return strDt.getDay();
    }else{
        if(arguments[0] instanceof Date){
          var dt = arguments[0];
        }else{
          var str = arguments[0];
          if(!str) return 0;
          str = str.replace(/\-/g,'/');
          var dt = new Date(str);
        }
        return Date.getMonthFirstDay(dt.getFullYear(),dt.getMonth()+1);
    }
}

XL.point = XL.Class.create();
XL.point.prototype = {
    _x:0,
    _y:0,
    initialize:function(x,y){
        this._x = XL.Obj.getNumber(x);
        this._y = XL.Obj.getNumber(y);
    }
};



/*
 @requires cls_base.js
 @author : shawn young
 @date   : 2008-08-01
*/


/*
 @namespace : XL.XML 
*/
XL.XML = {};
XL.XML.XMLDOMDoc = XL.Class.create();
XL.XML.XMLDOMDoc.prototype = {
    __XMLDOM__:null,
    parseError:null,
    Elements:null,
    initialize:function(){
        this.__XMLDOM__ = this.createObj();
        this.parseError = '';
    },
    createObj:function(){
        if(window.ActiveXObject){
            return XL.Obj.Try(function(){
               return new ActiveXObject('Msxml2.DOMDocument');
            },
            function(){
               return new ActiveXObject('Microsoft.XMLDOM');
            });
        }else{
            if(document.implementation && document.implementation.createDocument){
                return document.implementation.createDocument("text/xml","",null);
            }else{
                return null;
            }
        }
    },
    load:function(file,async){
        this.parseError = '';
        
        if(XL.Obj.isUndefined(async)){
            async = true;
        }
        
        this.__XMLDOM__.async = async;
        
        if(XL.Obj.isEmpty(file)) return false;
        
        this.dispatchEvent(XL.EVENT.BF_LOAD);
        if(XL.Agent.isIE){
            this.__XMLDOM__.onreadystatechange = XL.Class.bindMethod(this.onreadystatechange,this);
        }else{
            this.__XMLDOM__.onload = XL.Class.bindMethod(this.onload,this);
        }
        try{
          this.__XMLDOM__.load(file);
        }catch(e){        
          this.parseError+=(this.parseError?'|':'')+e;
          alert(e,true);
        }
        return true;
    },
    onreadystatechange:function(){
      this.dispatchEvent(XL.EVENT.ON_LOADING,this.__XMLDOM__.readyState);
      if(this.__XMLDOM__.readyState =='4'){        
        this.Elements = null;
        this.Elements = this.extract(this.__XMLDOM__.documentElement);
        
        //处理监听事件
        this.dispatchEvent(XL.EVENT.ON_COMPLETE,this.__XMLDOM__);
      }
    },
    onload:function(){
        this.dispatchEvent(XL.EVENT.ON_COMPLETE,this.__XMLDOM__);
    },
    extract:function(DomRoot){
        var eObj ={};
        if(XL.Obj.isEmpty(DomRoot)){
          DomRoot = this.__XMLDOM__.documentElement;
        }        
        eObj.nodeName = DomRoot.nodeName;
        eObj.nodeType = DomRoot.nodeType;
        eObj.nodeVale = DomRoot.nodeValue;
        eObj.attributes = DomRoot.attributes;
        
        if(DomRoot.attributes){
            try{
                for(var i=0;i<DomRoot.attributes.length;i++){
                    eObj[DomRoot.attributes[i].name] = DomRoot.attributes[i].value;
                }
            }catch(e){alert(e,true);}
        }else{
            '无此对象!'.showMsg();
        }
        
        
        if(DomRoot.hasChildNodes()){
            var chnds = DomRoot.childNodes;
            eObj.childNodes = new Array();
            for(var i=0;i<chnds.length;i++){
                eObj.childNodes[i] = this.extract(chnds[i]);
            }
        }
        
        return eObj;
    },
    free:function(){
        delete(this.__XMLDOM__);
    }
};

XL.XML.HttpRequestor = XL.Class.create();
XL.XML.HttpRequestor.prototype = {
    __XMLObj_:null,
    initialize:function(){
      this.__XMLObj_ = this.createObj();
    },
    createObj:function(){
        
    },
    post:function(){
        this.dispatchEvent(XL.EVENT.BF_SEND);
    },
    get:function(){
        this.dispatchEvent(XL.EVENT.BF_SEND);
    }
}

/************************************************/

XL.DOM = {
    htmlEncode:function(str){
        var dv = document.createElement('span');        
        XL.Agent.isIE?(dv.innerText = str):(dv.textContent = str);
        str = dv.innerHTML;
        delete(dv);
        return str;
    },
	addOnload:function(_obj,func){
		if(XL.Agent.isIE){
			if(_obj.readyState=='complete'){
				func();
			}else{
				var oldF = _obj.onload;
				if(!oldF)oldF = function(){};

				_obj.onload = function (){
					oldF();
					func();
				}
			}
		}else{
			if(_obj){
				
			}
		}
	},
    $:function(){
        var arg=arguments;
        var al = arg.length;        
        var ret = null;
                
        
        if(XL.Obj.isEmpty(arg)) return null;
        
        if(al == 1){
            ret = document.getElementById(arg[0]);    
        }else{
            ret = new Array();
            for(var i =0 ;i<al;i++){
                ret[ret.length] = document.getElementById(arg[i]);
            }
        }        
        return ret;
    },
    addEventListener:function(obj,evt,func,ifreplace){
        if(XL.Obj.isEmpty(obj) || XL.Obj.isEmpty(evt) || !XL.Obj.isFunction(func)){
            return false;
        }else{
            if(XL.Obj.isEmpty(ifreplace)){
                ifreplace = false;
            }
            
            if(ifreplace){
              //直接覆盖方法
              obj = XL.DOM.$(obj);
              if(!XL.Obj.isObject(obj)){return false;}
              try{
                eval(obj+'.'+evt+'='+XL.Obj.getString(func));
              }catch(e){}
            }else{                
                if(XL.Agent.isIE){
                    if(evt.substr(0,2)!='on'){
                        evt='on'+evt;
                    }                    
                    obj.attachEvent(evt,func);
                }else{
                    if(evt.substr(0,2)=='on'){
                        evt=evt.substr(2);
                    }
                    obj.addEventListener(evt,func,false);
                }
            }
            return true;
        }
    },
    removeEventListener:function(obj,evt,func){
        if(XL.Obj.isEmpty(obj) || XL.Obj.isEmpty(evt) || !XL.Obj.isFunction(func)){
            return false;
        }else{
            if(XL.Agent.isIE){
                if(evt.substr(0,2)!='on'){
                    evt='on'+evt;
                }
                obj.detachEvent(evt,func);               
            }else{
                if(evt.substr(0,2)=='on'){
                    evt=evt.substr(2);
                }
                obj.removeEventListener(evt,func);
            }
        }   
        return true;
    },
    getEvent:function(){
        if(XL.Agent.isIE){           
            return window.event;
        }else{            
            func=XL.DOM.getEvent.caller;
            while(func!=null){
               var arg0=func.arguments[0];
               if(arg0){
                    if((arg0.constructor==Event || arg0.constructor ==MouseEvent) || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation)){   
                      return arg0;
                    }
               }
               func=func.caller;
            }
            return null;
        }
    },
    initFF:function(){
        if(!XL.Agent.isIE){
            window.constructor.prototype.__defineGetter__("event",function (){return XL.DOM.getEvent();});            
            Event.prototype.__defineGetter__("srcElement",function(){return this.target;});
            if(window.HTMLElement){
                HTMLElement.prototype.__defineSetter__("innerText",function(sText){			
			this.innerHTML=sText;//parsedText;
			return sText;
			});
		HTMLElement.prototype.__defineGetter__("innerText",function(){
			var r=this.ownerDocument.createRange();
			r.selectNodeContents(this);
			return r.toString();
			});
                HTMLElement.prototype.insertAdjacentElement=function(where,parsedNode){
			switch(where.toLowerCase()){
				case "beforebegin":
						this.parentNode.insertBefore(parsedNode,this);
						break;
				case "afterbegin":
						this.insertBefore(parsedNode,this.firstChild);
						break;
				case "beforeend":
						this.appendChild(parsedNode);
						break;
				case "afterend":
						if(this.nextSibling)
								this.parentNode.insertBefore(parsedNode,this.nextSibling);
						else
								this.parentNode.appendChild(parsedNode);
						break;
				}
			}
		HTMLElement.prototype.insertAdjacentHTML=function(where,htmlStr){
			var r=this.ownerDocument.createRange();
			r.setStartBefore(this);
			var parsedHTML=r.createContextualFragment(htmlStr);
			this.insertAdjacentElement(where,parsedHTML);
			}
		HTMLElement.prototype.insertAdjacentText=function(where,txtStr){
			var parsedText=document.createTextNode(txtStr);
			this.insertAdjacentElement(where,parsedText);
			}
            }
        }
    }
};
//初始化Firefox常用属性
XL.DOM.initFF();



XL.DOM.Table = XL.Class.create();
XL.DOM.Table.prototype ={
    ContentTable:null,
    Rows:null,
    css:'',
    initialize:function(rows,cols,parent){
        if(!XL.Obj.isNumber(rows)){
            rows = 0;
        }
        if(!XL.Obj.isNumber(cols)){
            cols = 0;
        }
        
        //创建Table
        this.ContentTable = document.createElement('table');
        if(this.css){
            this.ContentTable.className = String(this.css).trim();
        }
        
        this.ContentTable.setAttribute('border','1');
        
        //指定父对象        
        if(!XL.Obj.isEmpty(parent)){
          if(!XL.Obj.isObject(parent))
            parent = XL.DOM.$(parent);
        }else{
          parent = null;
        }
        
        
        
        if(!parent){
            parent = document.body;
        }
        parent.appendChild(this.ContentTable);
        
        
        
        //插入指定行和列数
        for(var i=0;i<rows;i++){            
            var r=this.insertRow(-1);            
            for(var j=0;j<cols;j++){
                var c = r.insertCell(-1);
                this.dispatchEvent(XL.EVENT.ON_INSERTCELL,c);
            }
        }
        this.Rows = this.ContentTable.rows;
    },
    applyCss:function(cssName){
        this.ContentTable.className = cssName;
    },
    setBorder:function(thickness,col){
        this.ContentTable.setAttribute('border',thickness);
        
        if(!XL.Obj.isEmpty(col))
          this.ContentTable.setAttribute('bordercolor',col);
    },
    setProperty:function(pro,val){
        if(XL.Obj.isEmpty(pro) || XL.Obj.isEmpty(val)){
            throw('Parameters required!');
        }
        this.ContentTable.setProperty(pro,val);
    },
    insertRow:function(flag){
        if(!XL.Obj.isNumber(flag)){
            flag = -1;
        }
        if(this.ContentTable){
            var r= this.ContentTable.insertRow(flag);
            this.dispatchEvent(XL.EVENT.ON_INSERTROW,r);
            return r;
        }else{
            return false;
        }
    },
    insertCell:function(r,flag,txt){
      if(!XL.Obj.isNumber(r)){
        r = 0;
      }      
      if(!XL.Obj.isNumber(flag)){
        flag = -1;
      }
                        
      var c =this.Rows[r].insertCell();
      if(!XL.Obj.isEmpty(txt)){
        if(XL.Agent.isIE){
            c.innerText = txt;
        }else{
            c.textContent = txt;
        }
      }
      this.dispatchEvent(XL.EVENT.ON_INSERTCELL,c);
      return c;
    },
    insertTH:function(r,flag,txt){
      if(!XL.Obj.isNumber(r)){
        r = 0;
      }
      if(r<0) r=0;
      
      if(!XL.Obj.isNumber(flag)){
        flag = -1;
      }
      if(flag <-1) flag = -1;
      
      var th = document.createElement('th');
      if(!XL.Obj.isEmpty(txt)){
            th.innerText = txt;
      }
      this.Rows[r].appendChild(th);      
      this.dispatchEvent(XL.EVENT.ON_INSERTCELL,th);
      
      return th;
    }
}

XL.Timer = XL.Class.create();
XL.Timer.prototype = {
    _handler:null,
    delay:500,
    initialize:function(){
      this._handler = null;  
    },
    begin:function(){
        if(!XL.Obj.isEmpty(this._handler)) return;
        
        if(!XL.Obj.isNumber(this.delay)){
            this.delay = 500;
        }
        this._handler = setInterval(this.onTimer,this.delay);
    },
    end:function(){
        clearInterval(this._handler);
        this._handler = null;
    },
    onTimer:function(){
        this.dispatchEvent(XL.EVENT.ON_TIMER);
    }
};



/*
var d=new Array();
var f=[];
f[0]={a:1,b:2};
alert(XL.Obj.isArray(f));
*/
