/* (c) gosha bine, 2007 | www.tagarga.com/blok */

var Ajaxik = {
	attrName: 'jtarget',
	init: function() {
		function coll(cc) {
			for(var i = 0; i < cc.length; i++)
				if(cc[i].getAttribute(Ajaxik.attrName))
					Ajaxik.enable(cc[i], cc[i].getAttribute(Ajaxik.attrName));
		}
		coll(document.forms);
		coll(document.links);
	},
	submit: function(form, target) {
		form = Ajaxik.$(form);
		return !Ajaxik.send(form.action, target, form.method, Ajaxik.formData(form));
	},
	click: function(link, target) {
		link = Ajaxik.$(link);
		return !Ajaxik.send(link.href, target);
	},
	get: function(url, proc) {
		var key = Ajaxik.getReq();
		if(key < 0) return false;
		Ajaxik.reqBuf[key].proc = proc;
		var r = Ajaxik.reqBuf[key].r;
		try {
			r.open('GET', url, true);
			r.onreadystatechange = function() { Ajaxik.onreadystatechange(key) }
			r.send(null);
			return true;
		} catch(e) { return false; }
	},
	post: function(url, data, proc) {
		var key = Ajaxik.getReq();
		if(key < 0) return false;
		Ajaxik.reqBuf[key].proc = proc;
		var r = Ajaxik.reqBuf[key].r;
		try {
			r.open('POST', url, true);
			r.onreadystatechange = function() { Ajaxik.onreadystatechange(key) }
			r.setRequestHeader('Connection', 'close');
			r.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			r.send(data);
			return true;
		} catch(e) { return false; }
	},
	//
	enable: function(element, target) {
		element = Ajaxik.$(element);
		if(!element || !element.tagName)
			return false;
		var tag = element.tagName.toUpperCase();
		if(tag == 'A')
			return Ajaxik.assign(element, 'click', target);
		if(tag == 'FORM')
			return Ajaxik.assign(element, 'submit', target);
		return false;
	},
	assign: function(element, evt, target) {
		var id = Ajaxik.id(element);
		var tid = Ajaxik.id(target);
		if(element['on' + evt])
			element._ajaxik_handler = element['on' + evt];
		element['on' + evt] = function(e) {
			var elem = Ajaxik.$(id);
			if(elem._ajaxik_handler && !elem._ajaxik_handler(e)) return false;
			return Ajaxik[evt](elem, tid);
		}
		return true;
	},
	send: function(url, target, method, query) {
		if(!Ajaxik.$(target))
			return false;
		var tid = Ajaxik.id(target);
		url = url || location.href;
		query = (query || '') + '&__ajax__=1' + Math.random().toString().substr(2);
		method = (method || 'GET').toUpperCase();
		var proc = function(rs, text) { Ajaxik.onsend(rs, text, tid) }
		if(method == 'GET') {
			var q = url.indexOf('?') < 0 ? '?' : '&';
			return Ajaxik.get(url + q + query, proc);
		} else {
			return Ajaxik.post(url, query, proc);
		}
	},
	formData: function(form) {
		function add(name, value) {
			buf[buf.length] = Ajaxik.escape(name) + '=' + Ajaxik.escape(value);
		}
		function elem(e) {
			if(!e.name || !e.tagName) return;
			var tag = e.tagName.toLowerCase();
			if(tag == 'input')
				tag = (e.type || 'text').toLowerCase();
			switch(tag) {
				case 'radio': case 'checkbox':
					if(e.checked) add(e.name, e.value);
					break;
				case 'select':
					for(var i = 0; i < e.options.length; i++)
						if(e.options[i].selected)
							add(e.name, e.options[i].value);
					break;
				default:
					add(e.name, e.value);
					break;
			}
		}
		Ajaxik.escape = Ajaxik.escape || encodeURIComponent || escape;
		var buf = [];
		for(var i = 0; i < form.elements.length; i++)
			elem(form.elements[i]);
		return buf.join('&');
	},
	onsend: function(rs, text, tid) {
		var target = Ajaxik.$(tid);
		if(!target) return;
		var func = target.onajax || target.getAttribute('onajax');
		if(func) {
			if(typeof func != "function")
				target.onajax = new Function('readyState,text', func);
			target.onajax(rs, text);
		} else if(rs == 4)
			target.innerHTML = text;
	},
	onreadystatechange: function(key) {
		var p = Ajaxik.reqBuf[key];
		var rs = 0, text = '';
		try {
			rs = p.r.readyState;
			text = p.r.responseText;
		} catch(e) {}
		if(p.proc)
			p.proc(rs, text, p.r);
		if(rs == 4) {
			p.r.onreadystatechange = function() {}
			p.r.abort();
			p.proc = null;
			p.free = true;
		}
	},
	reqBuf: [],
	getReq: function() {
		var len = Ajaxik.reqBuf.length;
		for(var key = 0; key < len; key++) {
			if(Ajaxik.reqBuf[key].free) {
				Ajaxik.reqBuf[key].free = false;
				return key;
			}
		}
		var r = Ajaxik.xmlhttp();
		if(!r) return -1;
		Ajaxik.reqBuf[len] = { r: r, free: false };
		return len;
	},
	xmlhttp: function() {
		try { return new XMLHttpRequest()                   } catch(e) {}
		try { return new ActiveXObject('Msxml2.XMLHTTP')    } catch(e) {}
		try { return new ActiveXObject('Microsoft.XMLHTTP') } catch(e) {}
		return null;
	},
	idc: 0,
	id: function(obj) {
		if(typeof obj == 'string')
			return obj;
		if(!obj.id)
			obj.id = '_ajaxikID_' + (++Ajaxik.idc);
		return obj.id;
	},
	$: function(s) {
		return (typeof s == 'string') ? document.getElementById(s) : s;
	}
}


if(window.addEventListener)
	window.addEventListener('load', Ajaxik.init, false);
else if(window.attachEvent)
	window.attachEvent('onload', Ajaxik.init);

