/**
 * 关于DOM：
 * DOM是w3c定义了针对HTML、XML文档编程的一系列接口。通过这些接口，我们可以改变文档结点的结构、样式、
 * 内容。DOM只是一系列接口，实现的语言可以是java,Python等，这里我们的实现语言是javascript
 * 
 * 这个文件中描述的是对针javascript dom实现的封装。
 */
document.writeln("<script   type=\"text/javascript\"   src=\"http://images.zhenai.com/zhenai2/js/api/core/jscore.js\"><\/script>");
document.writeln("<script   type=\"text/javascript\"   src=\"http://images.zhenai.com/zhenai2/js/api/dom/adapter.js\"><\/script>");
Event = {}
/**
 * 跨平台的方式为对象注册事件监听器
 * @author zhouxiaoming
 * @param target 事件监听对象
 * @param type	事件类型
 * @param method 事件触发时调用的方法
 * @param flag 事件起泡类型.
 */
Event.addListener = function(target,type,method,flag){
	if(!Type.isString(type))
		throw new Error("参数类型,必须是字符串类型");
	type = type.toLowerCase();
	var typeIe = null;
	var typeStand = null;
	var index = type.indexOf("on");
	if(index!=-1){
		typeIe = type;
		typeStand = type.substring(index+2);
	}else{
		typeIe = "on"+type;
		typeStand = type;
	}
	if(navigator.getNameAndVersion().name.ie)	
		target.attachEvent(typeIe,method);
	else
		target.addEventListener(typeStand,method,flag);
}
/**
 * 跨平台的方式得到事件触发对象
 * @author zhouxiaoming
 * @param evt 事件对象
 * @return	触发事件的html对象
 */
Event.getTarget = function(evt){
	evt = Event.getEvent(evt);
	return navigator.getNameAndVersion().name.ie? evt.srcElement:evt.target;
}
/**
 * 跨平台的方式返回事件类型
 * @author zhouxiaoming
 */
Event.getType = function(evt){
	evt = Event.getEvent(evt);
	return evt.type;
}
/**
 * @author	zhouxiaoming
 * 跨平台的方式得到事件对象
 * 如果将来因为浏览器平台的原因,直接在此改动代码,不必各处去改.
 */
Event.getEvent = function(evt){
	return evt||window.event;
}
/**
 * @author	zhouxiaoming
 * 
 * 判断当前的事件是否在关闭页面
 * @param evt	事件对象
 */
Event.isCloseWin = function(evt){
	var ua = window.navigator.userAgent;
	var version = null;
    var isIe = ua.indexOf ( "MSIE " )>0;
    if(isIe);
    	version = parseInt (ua.substring (ua.indexOf ( "MSIE " )+5, ua.indexOf (".", ua.indexOf ( "MSIE " ) )));
	if(window.screenLeft < 10004&&isIe)//刷新
			return false;
	var event = Event.getEvent(evt);
	if(event.clientX>document.body.clientWidth&&event.clientY<0||event.clientY<-10&&event.clientY>-25||version==6)
		return true;
	return false;
}
/**
 * 针对html的dom结点操作的api
 */
var Dom = {}
/**
 * @author	zhouxiaoming
 * 创建html文档的一个元素
 * @param name		字符串类型,表示元素的名称.这个参数必不可少
 * @param attribute 对象类型,表示元素的属性,可以为null.对象定义的最简单方式是var obj={id:"xx",class:"reg",……省略}
 * @param text		字符串类型，表示元素的结点内容，可以为null
 * @param doc		窗口所在的document，为null时方法内会取当前窗口的document
 * 
 * 例如要创建一个结点<img src="http://photocdn.sohu.com/20070130/Img247922824.jpg" alt="我倒"/>
 * var img = dom.createElement("img",{src:"http://photocdn.sohu.com/20070130/Img247922824.jpg",alt:"我倒",null};
 * 
 */
Dom.createElement = function(name,attribute,text,doc){
	if(!doc) doc = document;
	if(Type.isString(name)){
		var elem = doc.createElement(name);
		if(attribute){
			for(property in attribute){
				if("clazz"==property)
					elem.className = attribute[property];
				else if("id"==property)
					elem.id = attribute[property];
				else if("style"==property)
					Dom.setCss(elem,attribute[property]);
				else
					elem.setAttribute(property,attribute[property]);
			}
		}
		if(text)
			elem.appendChild(doc.createTextNode(text));
		return elem;
	}else
		throw new Error("name的参数必须是字符串类型");
}
/**
 * @author	zhouxiaoming
 * 设置elem元素的style属性
 * @param elem	给定的dom元素
 * @param style	style属性的字符串格式
 */
Dom.setCss = function(elem,style){
	if(navigator.getNameAndVersion().name.ie)
		elem.style.cssText = style;
	else
		elem.setAttribute("style",style);
} 
/**
 * @author Richard.Zhou
 * 向指定的文档对象，追加css文件
 * @param doc	窗口的document对象，不可以为null;
 * @param sFile	css文件的路径
 */
Dom.appendStyleFile = function(doc,sFile){
	var head = doc.getElementsByName('head')[0]||doc.getElementsByTagName('head')[0];
	if(!head) head=doc.createElement('head'), doc.appendChild(head);
	var link = Dom.createElement('link',{href:sFile,rel:'stylesheet',type:'text/css'},null,doc);
	head.appendChild(link);
}
/**
 * @author Richard.Zhou
 * 获取指定元素所在的document的对象
 * @param element 不可以为null，必须是dom对象的结点元素
 */
Dom.getDocument = function(element){
	return element.ownerDocument || element.document ;
}
/**
 * @author Richard.Zhou
 * 获取指定元素所在的窗口对象
 * @param element 不可以为null，必须是dom对象的结点元素
 */
Dom.getDocWindow = function(document){
	return document.parentWindow || document.defaultView ;
}
/**
 * @author Richard.Zhou
 * 获取指定结点元素所在的窗口
 * @param element 不可以为null，必须是dom对象的结点元素
 */
Dom.getEleWindow = function(element){
	return Dom.getDocWindow(Dom.getDocument(element));
}
/**
 * @author Richard.Zhou
 * 判断指定的文档对象css装饰模式是兼容还是严格模式，返回值为true表示是兼容模式
 * @param document	窗口的document对象，不可以为null;
 */
Dom.isStrictMode = function( document ){
	return ( 'CSS1Compat' == ( document.compatMode || 'CSS1Compat' ) ) ;
}

/**
 * @author zhouxiaoming
 * 在树形文档中获取与source元素结构上同一级别、相邻的并且结点名称与给定的targetTagName相同的结点元素
 * @param source		树形结点元素对象，不可以为null
 * @param flag			boolean值，表示遍历方式：为true时表示后向遍历，为false表示前身遍历。不可以为null
 * @param targetTagName String类型，与要寻找的目标结点名称相同。不可以为null
 */
Dom.getAroundElem = function(source,flag,targetTagName){
	var str = null;
	targetTagName = targetTagName.toLowerCase();
	if(flag){
		do{
			source = source.nextSibling;
			str = source.tagName;
			if(str!=null) str = str.toLowerCase();
		}while(str!=targetTagName)
	}else{
		do{
			source = source.previousSibling;
			str = source.tagName;
			if(str!=null) str = str.toLowerCase();
		}while(str!=targetTagName)
	}
	return source;
}
/**
 * @author	zhouxiaoming
 * 
 * 获取浏览器的名称及版本号。
 */
navigator.getNameAndVersion = function(){
	result={name:{ie:false,firefox:false,opera:false},version:null};
	var ua = window.navigator.userAgent;
    var msie = ua.indexOf ( "MSIE " );
    var firefox = ua.indexOf("Firefox/");
    var opera = ua.indexOf("Opera/");
    if ( msie > 0 ) {// If Internet Explorer, return version number
    	result.name.ie = true;
    	result.version = parseInt (ua.substring (msie+5, ua.indexOf (".", msie )));
    	return result;
    }     
    if(firefox>0){
    	result.name.firefox = true;
    	result.version = parseInt(ua.substr(firefox+8));
    	return result;
    }
    if(opera>0){
    	result.name.opera = true;
    	result.version = parseInt(ua.substr(opera+6));
    	return result;
    }
}
/**
 * 判断浏览器是否为IE
 */
navigator.isIE = function() {
	var ua = window.navigator.userAgent;
    var msie = ua.indexOf ( "MSIE " );
    return (msie > 0) ? true:false;
}
/**
 * @author Richard.Zhou
 * 这个方法返回的是页面通过url方式传递的参数，如果url没有传参，都返回null值
 * 例如url = http://www.richard.com/t.jsps?x=1;
 * 那么var result = location.params();
 * var value result.get("x");
 * 此时value的值是1
 */
location.params = function(){
	var symbol1 = "&";
	var symbol2 = "=";
	var map = function(){
		var m = [];
		this.put = function(key,value){
			m["\""+key+"\""] = value;
		}
		this.get = function(key){
			return m["\""+key+"\""];
		}
	}
	var param = null;
	var getParam = function(temp){
		temp = String.trim(temp);
		var index = temp.indexOf(symbol2);
		if(index<1) return null;
		var array = new Array();
		array[array.length] = temp.substr(0,index);
		array[array.length] = temp.length-1==index? "":temp.substr(index+1);
		return array;
	}

	if(null==location.search) return null;
	var str = String.trim(location.search.substr(1));
	if(str.length==0) return null;
	var results = str.split(symbol1);
	for(var i=0 ; i<results.length ; i++){
		var p = getParam(results[i]);
		if(p==null) continue;
		if(null==param) param = new map();
		param.put(p[0],p[1]);
	}
	return param;
}
