function ajax_update_element(id, url, form) {
	Ajax.loadXMLDoc(
		url,
		function (xml) {
			var obj=document.getElementById(id);
			if (obj) {
				obj.innerHTML = nodeContent(xml);
				var scripts = xml.getElementsByTagName('script');
				for (var i=0; i < scripts.length; i++ ) {
					if (scripts[i].hasChildNodes()) {
						var tmpFunc = new Function(nodeContent(scripts[i]));
						tmpFunc(); 
					}
				}
			}
		},
		form
	);
}
/* ============================================================================================================ */
/*													NODES														*/
/* ============================================================================================================ */


function nodeAttributes(node){
	var attStr = "";
	if(node && node.attributes.length > 0){
		for(var a=0; a<node.attributes.length; a ++){
			attStr += " " + node.attributes.item(a).nodeName + "=\"";
			attStr += node.attributes.item(a).nodeValue + "\"";
		}
	}
	return attStr;
}

function nodeContent(node) {
	var strOuter = "";
	var c = node.firstChild;
	while (c) {
		strOuter += nodeOuterContent(c);
		c = c.nextSibling;
	}
	return strOuter;
}

function nodeOuterContent(node) {
	var strOuter = "";
	var iEmpty = /^(img|embed|input|br|hr|bgsound)$/i;
	switch(node.nodeType){
		case 1 :
			strOuter += "<" + node.nodeName.toLowerCase();
			strOuter += nodeAttributes(node);
			if(node.nodeName.match(iEmpty)){
				strOuter += " />";
			} else {
				strOuter += ">";
				strOuter += nodeContent(node);
				strOuter += "</" + node.nodeName.toLowerCase() + ">";
			}
		break;
		case 3 :
			strOuter += node.nodeValue;
		break;
		case 8 :
			cNodesStr += "<!--" + node.nodeValue + "-->";
			break;
	}
	return strOuter;
}


/* ============================================================================================================ */
/*													AJAX														*/
/* ============================================================================================================ */

var Ajax = {
	async : true,
	url : null,
	
	loadXMLDoc : function (url, func, form) {
		if (window.XMLHttpRequest) {
			request = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			request = new ActiveXObject("Microsoft.XMLHTTP");
		}
		
		if (request) {
			this.url = url;
			url += (url.indexOf('?') < 0 ? '?' : '&') +'rnd='+Math.random();
			request.onreadystatechange = this.processReqChange;
			
			if (typeof(func) != 'undefined') {
				this.processResponce = func;
			}
			
			if (typeof(form) != 'undefined') {
				var post_data = this.post(form);
				request.open("POST", url, this.async);
				request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8"); 
				request.send(post_data);
			} else {
				request.open("GET", url, this.async);
				request.send(null);
			}
		}  else alert('Can\'t create HTTP Request Object!');
	},
	
	getData : function (xml, element) {
		var e = xml.getElementsByTagName(element);
		if (e.length > 0 && e[0].hasChildNodes()) return e[0].firstChild.data;
	},

	post : function(form) {
		var url=form.action;
		var post_data = ''; 
		var i,j;
		if (!form) return;
		for (i=0; i<form.elements.length; i++) { 
			if (form.elements[i].name) {
				switch (form.elements[i].type) {
					case 'hidden':
					case 'text':
					case 'textarea':
						post_data += form.elements[i].name + '=';
						post_data += (form.elements[i].value);
						post_data += '&';
					break;
					case 'checkbox':
						if (form.elements[i].checked) {
							post_data += form.elements[i].name + '=';
							post_data += form.elements[i].value;
							post_data += '&';
						}
					break;
					case 'select-one':
						if (form.elements[i].options.length) {
							post_data += form.elements[i].name + '=';
							post_data += form.elements[i].options[form.elements[i].selectedIndex].value;
							post_data += '&';
						}
					break; 
					case 'radio':
						for (j=0; j<form.elements[i].length; j++) {
							if (form.elements[i][j].checked) {
								post_data += form.elements[i].name + '=';
								post_data += form.elements[i][j].value;
								post_data += '&';				
							}
						}
					break; 
					default: alert(form.elements[i].type);
				}
			}
		}
		post_data = post_data.substr(0,(post_data.length - 1)); 
		return post_data;
	},
	
	processReqChange : function () {
		if (request.readyState == 4) {
			if (request.status == 200) {
				if (request.responseXML) {
					if (Ajax.async) Ajax.processResponce(request.responseXML);
				} else if (request.responseText) {
					alert('AJAX: Text response received!');
				}
			} else {
				alert("There was a problem retrieving the XML data:\n" + request.statusText);
			}
		}
	},
	
	processResponce : function (xml) {
		alert('OOPS: processResponce() have to be revritten');
	}
}
