var lds = {
	previous : function(elem) {
		elem = elem || this;
		do {
			elem = elem.previousSibling
		} while (elem && 1 != elem.nodeType);
		return elem
	},
	next : function(elem) {
		elem = elem || this;
		do {
			elem = elem.nextSibling
		} while (elem && 1 != elem.nodeType);
		return elem
	},
	last : function(elem) {
		elem = elem || this;
		elem = elem.lastChild;
		return 1 != elem.nodeType ? lds.previous(elem) : elem
	},
	first : function(elem) {
		elem = elem || this;
		elem = elem.firstChild;
		return 1 != elem.nodeType ? lds.next(elem) : elem
	},
	parent : function(elem, num) {
		elem = elem || this;
		num = num || 1;
		for (var i = 0; i < num; i++) {
			if (elem)
				elem = elem.parentNode
		}
		return elem
	},
	id : function(id) {
		return document.getElementById(id)
	},
	tag : function(name, elem) {
		return (elem || document).getElementsByTagName(name)
	},
	text : function(elem) {
		var t = "";
		elem = elem || this;
		elem = elem.childNodes || elem;
		for (var j = 0; j < elem.length; j++) {
			t += elem[j].nodeType == 3 ? elem[j].nodeValue : lds
					.text(elem[j].childNodes)
		}
		return lds.trim(t)
	},
	trim : function(t) {
		return t.replace(/(^\s*)/g, "").replace(/(\s*$)/g, "")
	},
	attr : function(elem, name, value) {
		if (2 == arguments.length) {
			value = name;
			name = elem;
			elem = this
		} else if (1 == arguments.length) {
			name = elem;
			elem = this
		}
		if (!name || name.constructor != String)
			return;
		name = {
			"for" : "htmlFor",
			"class" : "className"
		}[name] || name;
		if (typeof value != "undefined") {
			elem[name] = value;
			if (elem.setAttribute)
				elem.setAttribute(name, value)
		}
		return elem[name] || elem.getAttribute(name) || ""
	},
	create : function(elem) {
		return document.createElementNS ? document.createElementNS(
				"http://www.w3.org/1999/xhtml", elem) : document
				.createElement(elem)
	},
	before : function(parent, before, elem) {
		if (!elem) {
			elem = before;
			before = parent;
			parent = before.parentNode
		}
		parent.insertBefore(lds.checkElem(elem), before)
	},
	append : function(parent, elem) {
		if (!elem) {
			elem = parent;
			parent = this
		}
		parent.appendChild(lds.checkElem(elem))
	},
	checkElem : function(elem) {
		return elem && elem.constructor == String ? document
				.createTextNode(elem) : elem
	},
	remove : function(elem) {
		if (elem)
			elem.parentNode.removeChild(elem)
	},
	empty : function(elem) {
		elem = elem || this;
		while (elem.firstChild)
			lds.remove(elem.firstChild)
	},
	stopBubble : function(e) {
		if (e && e.stopPropagation)
			e.stopPropagation();
		else
			window.event.cancelBubble = true
	},
	stopDefault : function(e) {
		if (e && e.preventDefault)
			e.preventDefault();
		else
			window.event.returnValue = false;
		return false
	},
	addEvent : function(elem, eventType, func) {
		if (!func) {
			func = eventType;
			eventType = elem;
			elem = this
		}
		if (document.all) {
			eventType = "on" + eventType;
			elem.attachEvent(eventType, func)
		} else {
			elem.addEventListener(eventType, func, false)
		}
	},
	getStyle : function(elem, name) {
		if (!name) {
			name = elem;
			elem = this
		}
		if (elem.style[name])
			return elem.style[name];
		else if (elem.currentStyle)
			return elem.currentStyle[name];
		else if (document.defaultView && document.defaultView.getComputedStyle) {
			name = name.replace(/([A-Z])/g, "-$1");
			name = name.toLowerCase();
			var s = document.defaultView.getComputedStyle(elem, "");
			return s && s.getPropertyValue(name)
		}
		return null
	},
	pageX : function(elem) {
		elem = elem || this;
		return elem.offsetParent ? elem.offsetLeft
				+ lds.pageX(elem.offsetParent) : elem.offsetLeft
	},
	pageY : function(elem) {
		elem = elem || this;
		return elem.offsetParent ? elem.offsetTop
				+ lds.pageY(elem.offsetParent) : elem.offsetTop
	},
	parentX : function(elem) {
		elem = elem || this;
		return elem.parentNode == elem.offsetParent ? elem.offsetLeft : lds
				.pageX(elem)
				- lds.pageX(elem.parentNode)
	},
	parentY : function(elem) {
		elem = elem || this;
		return elem.parentNode == elem.offsetParent ? elem.offsetTop : lds
				.pageY(elem)
				- lds.pageY(elem.parentNode)
	},
	posX : function(elem) {
		elem = elem || this;
		var result = parseInt(lds.getStyle(elem, "left"));
		return isNaN(result) ? 0 : result
	},
	posY : function(elem) {
		elem = elem || this;
		var result = parseInt(lds.getStyle(elem, "top"));
		return isNaN(result) ? 0 : result
	},
	setX : function(elem, pos) {
		if (!pos) {
			pos = elem;
			elem = this
		}
		elem.style.left = pos + "px"
	},
	setY : function(elem, pos) {
		if (!pos) {
			pos = elem;
			elem = this
		}
		elem.style.top = pos + "px"
	},
	addX : function(elem, pos) {
		if (!pos) {
			pos = elem;
			elem = this
		}
		lds.setX(elem, lds.posX(elem) + pos)
	},
	addY : function(elem, pos) {
		if (!pos) {
			pos = elem;
			elem = this
		}
		lds.setY(elem, lds.posY(elem) + pos)
	},
	getHeight : function(elem) {
		elem = elem || this;
		return parseInt(lds.getStyle(elem, "height"))
	},
	getWidth : function(elem) {
		elem = elem || this;
		return parseInt(lds.getStyle(elem, "width"))
	},
	fullHeight : function(elem) {
		elem = elem || this;
		if ("none" != lds.getStyle(elem, "display"))
			return lds.getHeight(elem);
		var oldCss = lds.resetCSS(elem, {
					visibility : "hidden",
					display : "block",
					position : "absolute"
				});
		var h = elem.clientHeight || lds.getHeight(elem);
		lds.restoreCss(elem, oldCss);
		return h
	},
	fullWidth : function(elem) {
		elem = elem || this;
		if ("none" != lds.getStyle(elem, "display"))
			return lds.getWidth(elem);
		var oldCss = lds.resetCSS(elem, {
					visibility : "hidden",
					display : "block",
					position : "absolute"
				});
		var w = elem.clientWidth || lds.getWidth(elem);
		lds.restoreCss(elem, oldCss);
		return w
	},
	resetCSS : function(elem, prop) {
		if (!prop) {
			prop = elem;
			elem = this
		}
		var oldCss = {};
		for (var i in prop) {
			oldCss[i] = elem.style[i];
			elem.style[i] = prop[i]
		}
		return oldCss
	},
	restoreCss : function(elem, prop) {
		if (!prop) {
			prop = elem;
			elem = this
		}
		for (var i in prop) {
			elem.style[i] = prop[i]
		}
	},
	hide : function(elem) {
		elem = elem || this;
		var curDisplay = lds.getStyle(elem, "display");
		if ("none" != curDisplay)
			elem.$oldDisply = curDisplay;
		elem.style.display = "none"
	},
	show : function(elem) {
		elem = elem || this;
		elem.style.display = elem.$oldDisplay || "block"
	},
	opacity : function(elem, level) {
		if (1 == arguments.length) {
			level = elem;
			elem = this
		}
		if (elem.filters)
			elem.style.filter = "alpha(opacity=" + level + ")";
		else
			elem.style.opacity = level / 100
	},
	slideDown : function(elem, level) {
		level = level || 2;
		elem = elem || this;
		var h = lds.fullHeight(elem);
		elem.style.height = "0px";
		lds.show(elem);
		for (var i = 0; i <= 100; i += 5) {
			(function() {
				var pos = i;
				setTimeout(function() {
							elem.style.height = (pos / 100) * h + "px"
						}, (pos + 1) * level)
			})()
		}
	},
	fadeIn : function(elem, level) {
		level = level || 50;
		elem = elem || this;
		lds.opacity(elem, 0);
		lds.show(elem);
		elem.style.visibility = "visible";
		for (var i = 0; i <= 100; i += 5) {
			(function() {
				var pos = i;
				setTimeout(function() {
							lds.opacity(elem, pos)
						}, (pos + 1) * level)
			})()
		}
	},
	mouseX : function(e) {
		e = e || window.event;
		return e.pageX || e.clientX + document.body.scrollLeft
	},
	mouseY : function(e) {
		e = e || window.event;
		return e.pageY || e.clientY + document.body.scrollTop
	},
	mouseElementX : function(e) {
		return (e && e.layerX) || window.event.offsetX
	},
	mouseElementY : function(e) {
		return (e && e.layerY) || window.event.offsetY
	},
	pageHeight : function() {
		return document.documentElement.clientHeight
	},
	pageWidth : function() {
		return document.documentElement.clientWidth
	},
	scrollX : function() {
		var de = document.documentElement;
		return self.pageXOffset || (de && de.scrollLeft)
				|| document.body.scrollLeft
	},
	scrollY : function() {
		var de = document.documentElement;
		return self.pageYOffset || (de && de.scrollTop)
				|| document.body.scrollTop
	},
	windowHeight : function() {
		var de = document.documentElement;
		return self.innerHeight || (de && de.clientHeight)
				|| document.body.clientHeight
	},
	windowWidth : function() {
		var de = document.documentElement;
		return self.innerWidth || (de && de.clientWidth)
				|| document.body.clientWidth
	},
	windowMax : function(win) {
		win = win || self;
		win.moveTo(0, 0);
		win.resizeTo(window.screen.availWidth, window.screen.availHeight)
	}
};
var ldsForm = {
	required : function(elem) {
		if ("checkbox" == elem.type || "radio" == elem.type)
			return ldsForm.getInputByName(elem.name).numChecked > 0;
		else
			return lds.trim(elem.value).length > 0 && elem.value != elem.defaultValue
	},
	getInputByName : function(name) {
		var results = [];
		results.numChecked = 0;
		var input = document.getElementsByTagName("input");
		for (var i = 0; i < input.length; i++) {
			if (input[i].name == name) {
				results.push(input[i]);
				if (input[i].checked)
					results.numChecked++
			}
		}
		return results
	},
	email : function(elem) {
		var reg = /^[a-z0-9_+.-]+\@([a-z0-9-]+\.)+[a-z-0-9]{2,4}$/i;
		return reg.test(elem.value)
	},
	url : function(elem) {
		var reg = /a-zA-z]+:\/\/[^\s]*/;
		return reg.test(elem.value)
	},
	chinese : function(elem) {
		var reg = /^[u4e00-u9fa5],{0,}$/;
		return reg.test(elem.value)
	},
	username : function(elem) {
		var reg = /^[a-zA-Z_][a-zA-Z0-9]{2,8}$/;
		return reg.test(elem.value)
	},
	phone : function(elem) {
		var reg = /0[1-9]\d{8,10}/g;
		return reg.test(elem.vlaue)
	},
	qq : function(elem) {
		var reg = /^[1-9][0-9]$/;
		return reg.test(elem.value)
	},
	zipCode : function(elem) {
		var reg = /[1-9]\d{5}(?!\d)/;
		return reg.test(elem.value)
	},
	idCard : function(elem) {
		var reg = /(^\d{15}$)|(^\d{17}([0-9]|x)$)/;
		return reg.test(elem.value)
	},
	ip : function(elem) {
		var reg = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
		return reg.test(elem.value)
	},
	date : function(elem) {
		var reg = /(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)/;
		return reg.test(elem.value)
	},
	mobile : function(elem) {
		var reg = /^(13[0-9]|145|15[0-9]|181|180|18[6-9])\d{8}$/;
		return reg.test(elem.value)
	}
};
