﻿if(typeof(sina) != "object") {var sina = {};};
if(typeof(sina.D) != "object") {sina.D = {};};

Object.extend = function(target,src) {
	for (var property in src) {
		target[property] = src[property];
	}
	return target;
};

Function.prototype.bindNode = function(oNode) {
	var foo = this, iNodeItem;
	if(window._bindNodes==null) _bindNodes = [];
	_bindNodes.push(oNode);
	iNodeItem = _bindNodes.length - 1;
	oNode = null;
	return function(e) {
		foo.call(_bindNodes[iNodeItem],e||event);
	}
};

sina.D.set_ns = function(ns, func) {
	var root = window;
	var ns_p = ns.split(".");
	var current;
	for(var i=0; i<ns_p.length; i++) {
		current = ns_p[i];
		if (!root[current]) {
			root[current] = {};
		}
		if (i == ns_p.length - 1) {
			root[current] = func;
			return;
		}
		root = root[current];
	}
};

(function () {
	var browser = navigator.userAgent.toLowerCase();
	sina.D.isIE = /msie/.test(browser);
	sina.D.isFF = /firefox/.test(browser);
	sina.D.isSafari = /safari/.test(browser);
	sina.D.isOpera = /opera/.test(browser);
	
	function extend_method(obj) {
		Object.extend(obj,method);
		return obj;
	}
	function $(id) {
		var obj = document.getElementById(id);
		if(!obj) return null;
		return extend_method(obj);
	}
	sina.D.set_ns("sina.D.$", $);
	function $$(tag) {
		var obj = document.createElement(tag);
		return extend_method(obj);
	}
	sina.D.set_ns("sina.D.$$", $$);
	var method = {
		getWidth: function() {
			return this.offsetWidth;
		},
		getHeight: function() {
			return this.offsetHeight;
		},
		getLeft: function() {
			var obj = this;
			var aLeft = obj.offsetLeft;
			while(obj = obj.offsetParent) {
				aLeft += obj.offsetLeft;
			}
			return aLeft;
		},
		getTop: function() {
			var obj = this;
			var aTop = obj.offsetTop;
			while(obj = obj.offsetParent) {
				aTop += obj.offsetTop;
			}
			return aTop;
		},
		show: function() {
			this.style.display = 'block';
		},
		hide: function() {
			this.style.display = 'none';
		},
		toggle: function() {
			this.visible() ? this.hide() : this.show();
		},
		visible: function() {
			return this.style.display != 'none';
		},
		remove: function() {
			this.parentNode.removeChild(this);
		},
		updateHtml: function(content) {
			if(typeof(content)=='object') {
				if(content.innerHTML!='') this.innerHTML = content.innerHTML;
				else if(content.value!='') this.innerHTML = content.value;
				if(content.constructor==Array) this.innerHTML = content.join('');
			}
			if(typeof(content)=='string' || typeof(content)=='number') this.innerHTML = content.toString();
		},
		setClass: function(className) {
			this.className = className;
		},
		toggleClass: function(className1,className2) {
			this.className!=className1 ? this.setClass(className1) : this.setClass(className2);
		},
		hasClass: function(className) {
			var elementClassName = this.className;
			return (elementClassName.length > 0 && (elementClassName == className || new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
		},
		addClass: function(className) {
			if(!this.hasClass(className)) this.className += (this.className ? ' ' : '') + className;
		},
		delClass: function(className) {
			this.className = this.className.replace(new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').trim();
		},
		setWidth: function(w) {
			this.style.width = w + 'px';
		},
		setHeight: function(h) {
			this.style.height =  h + 'px';
		},
		setPosition: function(x,y) {
			var pos = this.style.position;
			if(pos == 'static' || !pos) {
				this.style.position = 'relative';
			}
			this.style.left = x + 'px';
			this.style.top = y + 'px';
		},
		addListener: function(type,fn) {
			if(this.addEventListener) this.addEventListener(type,fn,false);
			else this.attachEvent('on' + type,fn);
			return this;
		},
		removeListener: function(type,fn) {
			if(this.removeEventListener) this.removeEventListener(type,fn,false);
			else this.detachEvent('on' + type,fn);
			return this;
		},
		$T: function(el) {
			var obj = this.getElementsByTagName(el);
			var n = obj.length;
			for(var i=0;i<n;i++) {
				extend_method(obj[i]);
			}
			return obj;
		}
	};
	Object.extend(document, {
		addListener: function(type,fn) {
			if(this.addEventListener) this.addEventListener(type,fn,false);
			else this.attachEvent('on' + type,fn);
			return this;
		},
		removeListener: function(type,fn) {
			if(this.removeEventListener) this.removeEventListener(type,fn,false);
			else this.detachEvent('on' + type,fn);
			return this;
		},
		$T: function(el) {
			var obj = this.getElementsByTagName(el);
			var n = obj.length;
			for(var i=0;i<n;i++) {
				extend_method(obj[i]);
			}
			return obj;
		}
	});
	Object.extend(String.prototype, {
		trim: function() {
			return this.replace(/(^\s*)|(\s*$)/g, '');
		},
		trimTags: function() {
			return this.replace(/<\/?[^>]+>/gi, '');
		},
		trimScripts: function() {
			return this.replace(new RegExp('<script[^>]*>([\\S\\s]*?)<\/script>', 'img'), '');
		},
		toArray: function() {
			return this.split('');
		},
		toDate: function() {
			try {
				var reg = /^\d{8}$/;
				if(reg.test(this)) {
					var str = this;
					var year = str.slice(0,4);
					var month = str.slice(4,6) - 1;
					var day = str.slice(6,8);
					return new Date(year,month,day);
				}else throw "Format is error";
			}catch(e) {
				return null;
			}
		},
		cnLength: function() {
			var n = this.length;
			var len = n;
			for(var i=0;i<n;i++) {
				if(this.charCodeAt(i)<0 || this.charCodeAt(i)>255) len++;
			}
			return len;
		}
	});
	Object.extend(Date.prototype, {
		format: function(fmt) {
			var o = {
				"M+" : this.getMonth()+1,
				"D+" : this.getDate(),
				"h+" : this.getHours(),
				"m+" : this.getMinutes(),
				"s+" : this.getSeconds(),
				"Q+" : Math.floor((this.getMonth()+3)/3),
				"ms"  : this.getMilliseconds()
			};
			if (/(Y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
			for (var k in o) {
				if (new RegExp("("+ k +")").test(fmt)) {
					fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
				}
			}
			return fmt;
		},
		getDays: function(n) {
			var days = new Array();
			var _time = this.valueOf();
			var _n = Math.abs(n);
			var _m = n >= 0 ? 1 : -1;
			for (var i=0;i<_n;i++) {
				var _day = new Date(_time);
				days.push(_day);
				_time += (_m * 24 * 60 * 60 * 1000);
			}
			return days;
		}
	});
	function $F(id) {
		var obj = $(id);
		var method = obj.tagName.toLowerCase();
		return Form[method](obj);
	}
	sina.D.set_ns("sina.D.$F", $F);
	var Form = {
		input: function(element) {
			switch (element.type.toLowerCase()) {
				case 'checkbox':
					return element.checked ? element.value : null;
				case 'radio':
					var radioes = document.getElementsByName(element.name);
					for(var i=0; i<radioes.length; i++) {
						if(radioes[i].checked) return radioes[i].value;
					}
					return null;
				default:
					return Form.textarea(element);
			}
		},
		textarea: function(element) {
			return element.value;
		},
		select: function(element) {
			return this[element.type == 'select-one' ? 'selectOne' : 'selectMany'](element);
		},
		selectOne: function(element) {
			var index = element.selectedIndex;
			return index >= 0 ? this.optionValue(element.options[index]) : null;
		},
		selectMany: function(element) {
			var values, length = element.length;
			if(!length) return null;
			for(var i=0, values=[]; i<length; i++) {
				 var opt = element.options[i];
				 if(opt.selected) values.push(this.optionValue(opt));
			}
			return values;
		},
		optionValue: function(opt) {
			return opt.value ? opt.value : opt.text;
		}
	};
	function insertHtml(where, el, html) {
		where = where.toLowerCase();
		if(el.insertAdjacentHTML) {
			switch(where) {
				case "beforebegin":
					el.insertAdjacentHTML("BeforeBegin", html);
					return el.previousSibling;
				case "afterbegin":
					el.insertAdjacentHTML("AfterBegin", html);
					return el.firstChild;
				case "beforeend":
					el.insertAdjacentHTML("BeforeEnd", html);
					return el.lastChild;
				case "afterend":
					el.insertAdjacentHTML("AfterEnd", html);
					return el.nextSibling;
			}
			throw "错误的位置参数：" + where;
		}
		var range = el.ownerDocument.createRange();
		var frag;
		switch(where) {
			case "beforebegin":
				range.setStartBefore(el);
				frag = range.createContextualFragment(html);
				el.parentNode.insertBefore(frag, el);
				return el.previousSibling;
			case "afterbegin":
				if(el.firstChild){
					range.setStartBefore(el.firstChild);
					frag = range.createContextualFragment(html);
					el.insertBefore(frag, el.firstChild);
					return el.firstChild;
				}else{
					el.innerHTML = html;
					return el.firstChild;
				}
			case "beforeend":
				if(el.lastChild){
					range.setStartAfter(el.lastChild);
					frag = range.createContextualFragment(html);
					el.appendChild(frag);
					return el.lastChild;
				}else{
					el.innerHTML = html;
					return el.lastChild;
				}
			case "afterend":
				range.setStartAfter(el);
				frag = range.createContextualFragment(html);
				el.parentNode.insertBefore(frag, el.nextSibling);
				return el.nextSibling;
		}
		throw "错误的位置参数：" + where;
	}
	sina.D.set_ns("sina.D.insertHtml", insertHtml);
	function getElementsByClassName(className,parentElement) {
		var elems = (parentElement||document.body).getElementsByTagName("*");
		var result = [];
		for (i=0;j=elems[i];i++) {
			if ((" "+j.className+" ").indexOf(" "+className+" ")!=-1) {
				result.push(j);
			}
		}
		return result;
	}
	sina.D.set_ns("sina.D.$CN", getElementsByClassName);
	function getParamValue(paramName) {
		var url = window.location.search;
		if(url.indexOf("?") != -1) {
			var strs = url.substr(1).split("&");
			for(var i=0; i<strs.length; i++) {
				var ss = strs[i].split("=");
				if (ss[0] == paramName)
					return decodeURIComponent(ss[1]);
			}
		}
		return null;
	}
	sina.D.set_ns("sina.D.$P", getParamValue);
	if(!sina.D.isIE) {
		if(typeof(HTMLElement) != "undefined") {
			HTMLElement.prototype.contains = function (obj) {
				while(obj != null && typeof(obj.tagName) != "undefind") {
					if(obj == this) return true;
					obj = obj.parentNode;
				}
				return false;
			};
		}
	}
	function getPageScroll() {
		var yScroll;
		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){
			yScroll = document.documentElement.scrollTop;
		} else if (document.body) {
			yScroll = document.body.scrollTop;
		}
		return yScroll;
	}
	sina.D.set_ns("sina.D.getScroll", getPageScroll);
	function set_cookie(_name, _value, _time) {
		if(typeof _time == "number") {
			var time = _time*60*60*1000;
			var _exp = new Date();
			_exp.setTime(_exp.getTime() + time);
		}
		var _cookie = _name + "=" + _value;
		if(_exp && _exp.toUTCString) {
			_cookie += ";expires=" + _exp.toGMTString();
		}
		document.cookie = _cookie;
	}
	sina.D.set_ns("sina.D.set_cookie", set_cookie);
	function get_cookie(_name) {
		var res = eval('/'+_name+'=([^;]+)/').exec(document.cookie);
		return res == null ? false : res[1];
	}
	sina.D.set_ns("sina.D.get_cookie", get_cookie);
	function del_cookie(_name) {
		var _exp = new Date();
		_exp.setTime(_exp.getTime() - 1);
		var _value = get_cookie(_name);
		document.cookie = _name + "=" + _value + ";expires=" + _exp.toGMTString();
	}
	sina.D.set_ns("sina.D.del_cookie", del_cookie);
	function JSLoad(url, type, defer, language) {
		if (typeof url == "undefined" || url == "") return;
		type = type || "text/javascript";
		language = language || "javascript";
		defer = defer || false;
		try {
			var _head = document.getElementsByTagName("head")[0];
			var snode = document.createElement("script");
			snode.setAttribute("type", type);
			snode.setAttribute("language", language);
			snode.setAttribute("defer", defer);
			snode.setAttribute("src", url);
			_head.appendChild(snode);
		}catch(e) {}
	}
	sina.D.set_ns("sina.D.$import", JSLoad);
	function onReady(fn) {
		if (typeof fn != "function") return;
		if (window.addEventListener) {
			window.addEventListener("load", fn, false);
		}else {
			window.attachEvent("onload", fn);
		}
	}
	sina.D.set_ns("sina.D.onReady", onReady);
})();

(function () {
	if(document.implementation.hasFeature("XPath", "3.0")) {
		XMLDocument.prototype.selectNodes = function(cXPathString,xNode) {
			if(!xNode) xNode = this;
			var oNSResolver = this.createNSResolver(this.documentElement);
			var aItems = this.evaluate(cXPathString,xNode,oNSResolver,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
			var aResult = [];
			for(var i=0;i<aItems.snapshotLength;i++) {
				aResult[i] =  aItems.snapshotItem(i);
			}
			return aResult;
		};
		XMLDocument.prototype.selectSingleNode = function(cXPathString,xNode) {
			if(!xNode) xNode = this;
			var xItems = this.selectNodes(cXPathString,xNode);
			if(xItems.length > 0) {
				return xItems[0];
			}else {
				return null;
			}
		};
		Node.prototype.__defineGetter__(
			"xml",
			function() {
				return (new XMLSerializer).serializeToString(this);
			}
		);
	}
	var ajax = function(option) {
		this.url = option.url || null;
		this.targetDiv = sina.D.$(option.target) || null;
		this.method = option.method || "get";
		this.return_type = option.type || "xml";
		this.send = option.send || null;
		this.async = option.async != false ? true : false;
		this.onload_func = option.onload_func || null;
		this.onsuccess_func = option.onsuccess_func || null;
		this.onfailed_func = option.onfailed_func || null;
		this.first = true;
		this.http_request = this.get_req();
		this.request();
	};
	ajax.prototype = {
		request: function() {
			var self = this;
			if(!self.http_request) {
				if(this.targetDiv) this.targetDiv.updateHtml("不能创建对象实例");
				else alert("不能创建对象实例");
				return false;
			}
			self.http_request.onreadystatechange = function() {
				if(self.http_request.readyState == 4) {
					if(self.http_request.status == 200) {
						self.onsuccess();
					}else {
						self.onfailed();
					}
				}else {
					self.onload();
				}
			}
			self.http_request.open(self.method, self.url, self.async);
			if(self.method == "post") self.http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			self.http_request.send(self.send);
		},
		get_req: function() {
			var req = null;
			if(window.XMLHttpRequest) {
				req = new XMLHttpRequest();
				if(req.overrideMimeType) {
					req.overrideMimeType("text/xml");
				}
			}
			else if(window.ActiveXObject) {
				try {
					req = new ActiveXObject("Msxml2.XMLHTTP");
				} catch(e) {
					try {
						req = new ActiveXObject("Microsoft.XMLHTTP");
					} catch(e) {}
				}
			}
			return req;
		},
		onload: function() {
			if (this.first) {
				if(!this.onload_func) {
					if(this.targetDiv) this.targetDiv.updateHtml("数据读取中请稍候");
				}else {
					this.onload_func();
				}
			}
			this.first = false;
		},
		onfailed: function() {
			if(!this.onfailed_func) {
				if(this.targetDiv) this.targetDiv.updateHtml("您所请求的数据有异常");
				else alert("您所请求的数据有异常");
			}else {
				this.onfailed_func();
			}
		},
		onsuccess: function() {
			if(!this.onsuccess_func) {
				if(this.targetDiv) {
					if(this.return_type == "xml") {
						this.targetDiv.updateHtml(this.http_request.responseXML.xml);
					}else {
						this.targetDiv.updateHtml(this.http_request.responseText);
					}
				}else {
					if(this.return_type == "xml") {
						alert(this.http_request.responseXML.xml);
					}else {
						alert(this.http_request.responseText);
					}
				}
			}else {
				if(this.return_type == "xml") {
					this.onsuccess_func(this.http_request.responseXML);
				}else {
					this.onsuccess_func(this.http_request.responseText);
				}
			}
		}
	};
	sina.D.set_ns("sina.D.ajax", ajax);
})();
