var lbform = {

	dom: {},
	url: '',

	show: function(arg) {

		if((typeof arg == 'string' && (arg != lbform.url ||
			lbform.ismsg(lbform.dom.form))) || typeof arg == 'object') {

			if(typeof arg == 'string') lbform.url = arg;

			if(lbform.dom.root) {
				document.body.removeChild(lbform.dom.root);
				lbform.dom = {};
			}
		}

		if(arg === false || arg === 0) {

			if(lbform.dom.root) {
				lbform.dom.root.style.opacity = 0;
				setTimeout(function() {
					lbform.dom.root.style.display = 'none';
					lbform.hideac(false);
				}, 250);
			}

			return;
		}

		if(!lbform.dom.root) {

			var n = lbform.dom.root = document.createElement('DIV');
			n.id = 'lbform-root';

			n.innerHTML = '<table id="lbform-wtbl"><tr><td id="lbform-wctd">'
			+ '<div id="lbform-frame"><div id="lbform-header">'
			+ '<button id="lbform-close" title="Close"></button>'
			+ '<div id="lbform-htext">Content not loaded...</div></div>'
			+ '<div id="lbform-inner"></div></div></td></tr></table>';

			document.body.appendChild(n);

			if(n.currentStyle && n.currentStyle.position != 'fixed') {
				n.style.position = 'absolute';
				n.style.top = document.body.scrollTop + 'px';
			}

			var a = n.getElementsByTagName('*'), i = 0

			while(n = a[i++]) {
				if(n.id.search(/lbform-(\w+)/) == 0)
					lbform.dom[RegExp.$1] = n;
			}

			lbform.dom.close.onclick = function(){ lbform.show(false); };

			if(typeof arg == 'object' && arg.action) {
				lbform.next(arg);
				try { arg.reset(); } catch(e) {;}
			} else {
				lbform.next(null);
			}
		}

		lbform.hideac(true);
		lbform.dom.root.style.display = '';

		setTimeout(function() {
			lbform.dom.root.style.opacity = 1;
		}, 10);
	},

	ismsg: function(form) {
		return (!form || !form.getAttribute('action') ||
			form.getAttribute('action').charAt(0) === '#');
	},

	hideac: function(hide) {

		var i, tag = ['object','embed','iframe','video'];

		for(i in tag) {
			var n, j = 0, a = document.body.getElementsByTagName(tag[i]);
			while(n = a[j++]) {
				if(hide) {
					if(n.style.visibility)
						n.setAttribute('_visbak', n._visbak = n.style.visibility);
					n.style.visibility = 'hidden';
				} else {
					if(n.getAttribute('_visbak')) {
						n.style.visibility = n.getAttribute('_visbak');
						n.removeAttribute('_visbak');
					} else {
						n.style.visibility = '';
					}
				}
			}
		}
	},

	update: function(str, inner, htext) {

		inner.innerHTML = str;

		var a = inner.getElementsByTagName('SCRIPT');

		for(var i = 0; i < a.length; i++) {
			try { eval(a[i].innerHTML); }
			catch(e) {;}
		}

		a = inner.getElementsByTagName('FORM');
		var frame = lbform.dom.frame;

		frame.className = '';
		htext.innerHTML = '';

		if(lbform.dom.form = a[0]) {

			if(frame.className = (a[0].getAttribute('class') || '')) {
				a[0].removeAttribute('class');
			} else {
				if(frame.className = (a[0].getAttribute('className') || ''))
					a[0].removeAttribute('className');
			}

			if(htext.innerHTML = (a[0].getAttribute('title') || ''))
				a[0].removeAttribute('title');

			a[0].onsubmit = function() {
				lbform.next(lbform.dom.form);
				return false;
			};
		}
	},

	next: function(form) {

		if(form && lbform.ismsg(form)) {
			lbform.show(false);
			return;
		}

		var r = lbform.query(form ? form.action : lbform.url,
		function(res, s) {

			if(res) lbform.update(res, lbform.dom.inner, lbform.dom.htext);
			else alert('HTTP Error (' + s + ').');

			setTimeout(function() {
				lbform.dom.frame.style.visibility = '';
				lbform.dom.frame.style.opacity = 1;
			}, 10);

		}, form ? lbform.serialize(form) : null);

		if(r) {
			lbform.dom.frame.style.visibility = 'hidden';
			lbform.dom.frame.style.opacity = 0;
		}
	},

	serialize: function(form) {

		var out = '', n, i = 0;

		while(n = form[i++]) {

			if(n.name && (!/radio/i.test(n.type) || n.checked)) {

				var val = n.value;

				if(!val && /select/i.test(n.tagName)) {
					var o = n.options[n.selectedIndex];
					val = (o.value || o.innerHTML);
				}

				out += (out ? '&' : '') + encodeURIComponent(n.name)
					+ '=' + encodeURIComponent(val || '');
			}
		}

		return out;
	},

	query: function(url, callback, data) {

		var req = null;

		try { req = new XMLHttpRequest(); }
		catch(e) {
			try { req = new ActiveXObject('Microsoft.XMLHTTP'); }
			catch(e) {
				try { req = new ActiveXObject('Msxml2.XMLHTTP'); }
				catch(e) {;}
			}
		}

		try { req.open(data ? 'POST' : 'GET', url, true); }
		catch(e) {
			alert('HTTP Request Error' + (req ? (' (' + e + ').') : '.'));
			return false;
		}

		req.setRequestHeader('X-Requested-With', 'XMLHttpRequest');

		if(data) req.setRequestHeader('Content-Type',
			'application/x-www-form-urlencoded');

		req.onreadystatechange = function() {
			if(req.readyState == 4) {
				callback((req.status == 200) ? req.responseText : null, req.status);
				req.onreadystatechange = null;
				req = null;
			}
		};

		try { req.send(data || null); }
		catch(e) {
			alert('HTTP Request Error (' + e + ').');
			return false;
		}

		return true;
	}
};

