/*
 *
 *
 *
 */

function AJAX() {

	this.http_request = null;
	this.browser = "";
	this.container = "";
	
	if (window.XMLHttpRequest) { // Mozilla, Safari, Opera ...
		this.http_request = new XMLHttpRequest();
		this.browser = "gecko";
	}
	else if (window.ActiveXObject) { // IE
		try {
			this.http_request = new ActiveXObject("Msxml12.XMLHTTP");
		} catch (othermicrosoft) {
			try {
				this.http_request = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (failed) {
				this.http_request = null;
			}
   		}
//		this.http_request = new ActiveXObject("Microsoft.XMLHTTP");
		this.browser = 'ie';
	}
	if(!this.http_request)
		return 0;
	
	this.getXHTML = _get_XHTML;
	this.getPostXHTML = _post_XHTML;
	this.state = function() {return this.http_request.readyState};
	this.responseXML = function() {return this.http_request.responseXML};
	this.responseText = function() {return this.http_request.responseText};
	this.innerHTML = _inner_HTML;
	this.insertHTML = _insert_HTML;
	
	this.props = function() {return this.http_request};
	
	this.buildPOST = _build_POST;
	this.func = _Applay_Widget;
	this.Target = _Target;
	this.TargetPost = _Target_Post;
}

function _get_XHTML(url, func) {
	this.http_request.open('GET', url, true);
	// Ниже расположен хак. Дополнительная информация в определении
	// функции Function.prototype.bind
	this.http_request.onreadystatechange = function() { this.func() }.bind(this);
	this.http_request.send(null);
}

function _inner_HTML() {
	var xhtml = this.responseText();
	var reg = new RegExp();
	
	reg.compile("(?:.|\r|\n)*\\<\\!\\-\\- start \\-\\-\\>", "mi");
	xhtml = xhtml.replace(reg, "");
	reg.compile("\\<\\!\\-\\- end \\-\\-\\>(?:.|\r|\n)*", "mi");
	xhtml.replace(reg, "");
	reg.compile("\&amp;", "g");
	return xhtml.replace(reg, "&");
}

function _insert_HTML() {
	var xml_object = this.responseXML();
	var xhtml = this.responseText();
	
	// Вытаскиваем имя контейнера куда будет помещен код
	
//	var txt = "", i;
/*
	for (i in this.http_request.responseXML) {
		alert(i);
	}
*/
//	alert(xml_object);
//	document.getElementById(this.container).innerHTML = txt;
//	return 1;

	var container = document.getElementById(getParametr(xml_object, "container"));

	var err = getParametr(xml_object, "error");

	if (!container) {
		document.getElementById(this.container).innerHTML = "<p style=\"color:red;\">Ошибка вывода элемента</p>";
		return 1;
	}
	
	if(err != "OK") {
		document.getElementById(this.container).innerHTML = "<p style=\"color:red;\">Ошибка: " + err + "</p>";
		return 1;
	}

	window.scrollTo(0, getCrossOffsetTop(container));
	// Далее можно будет расширить количество необходимых полей

	// Удаляем все не нужное.
	// Думаю этот путь гораздо более простой, чем
	// рекурсивный парсинг XML
	var reg = new RegExp();
	reg.compile("(?:.|\r|\n)*\\<\\!\\-\\- start \\-\\-\\>", "mi");
	xhtml = xhtml.replace(reg, "");
	reg.compile("\\<\\!\\-\\- end \\-\\-\\>(?:.|\r|\n)*", "mi");
	xhtml = xhtml.replace(reg, "");
	reg.compile("\&amp;", "g");
	xhtml = xhtml.replace(reg, "&");
	// В итоге xhtml содержит нужный нам XHTML код
	
	container.innerHTML = xhtml;
	
	var jscr = getElemText(xml_object.getElementsByTagName("jscr").item(0));
	if (jscr != "") {
		jscr = jscr.replace(reg, "&");
		reg.compile("\&lt;", "g");
		jscr = jscr.replace(reg, "<");
		reg.compile("\&gt;", "g");
		jscr = jscr.replace(reg, ">");
		eval(jscr);
	}
	
	return 0;
}

function _post_XHTML(url, func, frm) {
	this.http_request.open('POST', url, true);
	this.http_request.onreadystatechange = function() { this.func() }.bind(this);
	this.http_request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	this.http_request.send(this.buildPOST(frm));
}

function _build_POST(frm) {
	var qs = "";
	var name = "";
	var value = "";
	var queue = new Array();
	for (e = 0; e < frm.elements.length; e++) {
		if (frm.elements.item(e).name != "") {
			if(frm.elements.item(e).type == "checkbox" && frm.elements.item(e).checked == false) {
				continue;
			}
			name = frm.elements.item(e).name;
			if (queue[name] == undefined) {
				queue[name] = "";
			}
			if (queue[name] != "") {
				queue[name] += ",";
			}
			queue[name] += frm.elements[e].value;
		}
	}
	for (i in queue) {
		qs += (qs == "") ? "" : "&";
		qs += i + "=" + escape(queue[i]);
	}

	return qs;
}

function _Applay_Widget() {
	if (this.state() == 4) {
		this.insertHTML();
	}
}

function _Target (container, targ, addon) {
	this.container = container;
	document.getElementById(container).innerHTML = "<p>Идет загрузка...</p>";
	this.getXHTML("/?container=" + container + ((targ == "") ? ("") : ("&targ=" + targ)) + ((addon == "") ? ("") : ("&" + addon)), this.func);
}

function _Target_Post (frm) {
	this.container = frm.container.value;
	document.getElementById(frm.container.value).innerHTML = "<p>Идет загрузка...</p>";
	this.getPostXHTML("/", this.func, frm);
}

/* Вспомогательные функции */

function getParametr(oxml, param) {
	try {
		return oxml.getElementsByTagName(param).item(0).attributes[0].value;
	}
	catch (err) {
		return 0;
	}
}

function getCrossOffsetTop (elem) {
	var offtop = parseInt(elem.offsetTop);
	while (elem.offsetParent) {
		elem = elem.offsetParent;
		offtop += ((elem.tagName != "HTML") ? parseInt(elem.offsetTop) : 0);
//		offtop += elem.offsetTop;
	}
	return offtop;
}

// Затычка для KHTML чтобы узнать текст ноды...
function getElemText(node){
	return node.text || node.textContent || (function(node){
		var _result = "";
		if (node == null) {
			return _result;
		}
		var childrens = node.childNodes;
		var i = 0;
		while (i < childrens.length) {
			var child = childrens.item(i);
			switch (child.nodeType) {
				case 1: // ELEMENT_NODE
				case 5: // ENTITY_REFERENCE_NODE
					_result += arguments.callee(child);
					break;
				case 3: // TEXT_NODE
				case 2: // ATTRIBUTE_NODE
				case 4: // CDATA_SECTION_NODE
					_result += child.nodeValue;
					break;
			}
			i++;
		}
		return _result;
	}(node));
 }

/*
	Необходима для сохранения объекта в callback функции.
	В данном случае нужна для свойства onreadystatechange объекта XMLHttpRequest.
	Так же может быть применена для setTimeout или addHandler.
*/
Function.prototype.bind = function(object) {
    var method = this;
    return function() {
        return method.apply(object, arguments);
    }
}

/* Системный AJAX объект */

var aobject = new AJAX();

function onimg(xs, srop)
{
document.getElementById(''+xs+'').src = srop;
}

