//Создадим переменную AJAX которая будет основным интерфейсом AJAX технологии
AJAX = new Object();

//Создадим два события, для загрузки и для ошибки
AJAX.onload  = null;
AJAX.onerror = null;

//Так же нам понадобятся два масива для хранения GET и POST параметров
AJAX.GET  = new Array();
AJAX.POST = new Array();

//Эта переменная будет хранить ID элемента в котором нужно обновить данные
AJAX.element_id_reload = null;

//Эта переменная будет хранить метод обновления (перезаписать=0; дописать=1)
AJAX.rewrite = null;

//Эта переменная будет хранить куда перейти после выполнения ajax
AJAX.goto_link = null;

//Эта переменная будет указывать открывать окно ожидания в одельном блоке или в блоке обновления (одельный блок=0; обновления=1)
AJAX.wait_block = null;

//Создадим две переменные, которые будут хранить результат
AJAX.text = null;
AJAX.xml  = null;

//Эта переменная при ошибке будет хранить описание ошибки
AJAX.errtext = null;

//Переменная для хранения таймера соеденения
AJAX.TIMEOUT = null;
AJAX.element_id = null;
AJAX.file 		= null;
AJAX.metod		= 'get';

//Инициализируем технологию AJAX
if (window.XMLHttpRequest){
	AJAX.HTTP = new XMLHttpRequest();
	if (AJAX.HTTP.overrideMimeType) {
		AJAX.HTTP.overrideMimeType('text/xml');
	}
} else if(window.ActiveXObject) {
	AJAX.HTTP = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!AJAX.HTTP) {
	alert('Giving up :( Cannot create an XMLHTTP instance');
}

//Две функции для добавления GET, POST параметров
AJAX.setGET = function(vname, value) {
	num = AJAX.GET.length;
	if (num>0) num++;
	AJAX.GET[num] 			= new Array();
	AJAX.GET[num][vname] 	= value;
}

AJAX.setPOST = function(vname, value) {
	num = AJAX.POST.length;
	if (num>0) num++;
	AJAX.POST[num] 			= new Array();
	AJAX.POST[num][vname] 	= value;
}

//Функция для отправки запроса серверу, в параметре передается путь и имя файла
AJAX.request = function(file) {
	var i;
	var v;
	var post;
	AJAX.HTTP.abort(); //Закрываем предыдущие соеденение
	var url = file;
	if(AJAX.GET.length !== 0) {
		if (!file.match(/\?/g))	url += "?";
		else url += '&';
		for(i in AJAX.GET) {
			for(v in AJAX.GET[i]) {
				url += v + "=" + encodeURIComponent(AJAX.GET[i][v]) + "&";
			}
		}
	}
	if(AJAX.POST.length === 0) {
		AJAX.HTTP.open("GET", url, true);
		post = null;
	} else {
		AJAX.HTTP.open("POST", url, true);
		post = "";
		for(i in AJAX.POST) {
			for(v in AJAX.POST[i]) {
				post += v + "=" + encodeURIComponent(AJAX.POST[i][v]) + "&";
			}
		}
		AJAX.HTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		AJAX.HTTP.setRequestHeader("Content-Length", post.length);
	}
	AJAX.HTTP.send(post);

	//Создадим функцию для обработки состояния соеденения
	AJAX.HTTP.onreadystatechange = function() {
		if(AJAX.HTTP.readyState == 4) {
			clearTimeout(AJAX.TIMEOUT);
			AJAX.TIMEOUT = null;
			if(AJAX.HTTP.status == 200) {
				AJAX.text = AJAX.HTTP.responseText;
				AJAX.xml = AJAX.HTTP.responseXML;
				//Если событие onload отслеживается, то сгенерируем его
				if(AJAX.onload !== null) AJAX.onload();
			} else {
				//Ошибка!!! Если событие onerror отслеживается, то сгенерируем его
				if (AJAX.HTTP.statusText) AJAX.errtext = AJAX.HTTP.statusText;
				if(AJAX.onerror !== null) AJAX.onerror();
			}
		}
	}

	AJAX.GET  = new Array();
	AJAX.POST = new Array();
	AJAX.TIMEOUT = setTimeout("AJAX.etimeout();", 300000);
}

//Создадим функцию для обработки таймаута
AJAX.etimeout = function() {
	AJAX.HTTP.abort();
	AJAX.errtext = "Timeout";
	if(AJAX.onerror !== null) AJAX.onerror();
}

AJAX.onload = function(content) {
	//Здесь обрабатываем удачную загрузку
	if (AJAX.text=='reload_page') window.location.reload();
	if (AJAX.text=='close_page') window.close();
	if (document.getElementById(AJAX.element_id_reload)) {
		if (AJAX.rewrite==1) document.getElementById(AJAX.element_id_reload).innerHTML += AJAX.text;
		else document.getElementById(AJAX.element_id_reload).innerHTML = AJAX.text;
	} else {
		if (document.getElementById('wait_ajax')) document.getElementById('wait_ajax').innerHTML = AJAX.text;
	}
	if (AJAX.goto_link!=null) location.replace(AJAX.goto_link);
	setTimeout("AJAX.stop();", 500);
}

AJAX.onerror = function() {
	//здесь обрабатываем ошибки
	document.getElementById('ajax_error').innerHTML = 'Error: '+AJAX.errtext;
}

AJAX.start = function(element_id,file,metod) {
	if (!metod) metod='get';
	setTimeout("AJAX.data('"+element_id+"','"+file+"','"+metod+"');", 100);
}

AJAX.start_arr = function(data,element_id,file,metod) {
	if (data) {
		AJAX.element_id_reload = element_id;
		AJAX.arr_params = data;
		if (!metod) metod='get';
		setTimeout("AJAX.data_arr('"+element_id+"','"+file+"','"+metod+"');", 100);
	}
}

AJAX.data_arr = function (element_id,file,metod){
	AJAX.metod = metod;
	for (i=0; i<=AJAX.arr_params.length; i++){
		if (AJAX.arr_params[i]){
			if (AJAX.metod=="get") AJAX.setGET(AJAX.arr_params[i]['name'],AJAX.arr_params[i]['value']); 
			if (AJAX.metod=="post") AJAX.setPOST(AJAX.arr_params[i]['name'],AJAX.arr_params[i]['value']); 
		}
	}
	AJAX.element_id = element_id;
	AJAX.file		= file;
	AJAX.load_block();
	if (AJAX.GET.length!==0 || AJAX.POST.length!==0){
		AJAX.request(AJAX.file);
	}
}

AJAX.data = function(element_id,file,metod){
	AJAX.element_id = element_id;
	AJAX.file		= file;
	AJAX.metod		= metod;
	AJAX.load_block();
	if (AJAX.metod=="get"){
		vname = document.getElementById(AJAX.element_id).name;
		value = document.getElementById(AJAX.element_id).value;
		AJAX.setGET(vname,value);
	}
	if (AJAX.metod=="post"){
		vname = document.getElementById(AJAX.element_id).name;
		value = document.getElementById(AJAX.element_id).value;
		AJAX.setPOST(vname,value);
	}
	if (AJAX.GET.length!==0 || AJAX.POST.length!==0){
		AJAX.request(AJAX.file);
	}
}

AJAX.load_block = function(){
	if (navigator.appName == 'Microsoft Internet Explorer') var position = 'absolute;';
	else var position = 'fixed;';
	AJAX.LOAD 				= new Array();
	AJAX.LOAD['width'] 		= window.outerWidth/2-60;
	AJAX.LOAD['height'] 	= window.outerHeight/2-100;
	AJAX.LOAD['style']		= 'position: '+position;
	AJAX.LOAD['style']		+='left: '+AJAX.LOAD['width']+'px;';
	AJAX.LOAD['style']		+='top: '+AJAX.LOAD['height']+'px;';
	AJAX.LOAD['style']		+='padding: 2px 2px 2px 2px;';
	AJAX.LOAD['style']		+='height: 60px;';
	AJAX.LOAD['style']		+='width: 140px;';
	AJAX.LOAD['style']		+='background-color: Yellow;';
	AJAX.LOAD['style']		+='border-style: solid;';
	AJAX.LOAD['style']		+='font-family: System;';
	AJAX.LOAD['style']		+='font-size: 12px;';
	AJAX.LOAD['style']		+='text-align: center;';
	AJAX.LOAD['style']		+='border-width: 1px 1px 1px 1px;';

	AJAX.LOAD['style_b']	= 'background-color: Silver;';
	AJAX.LOAD['style_b']	+='border-width: 1px 1px 1px 1px;';
	AJAX.LOAD['style_b']	+='border-color: Gray;';
	AJAX.LOAD['style_b']	+='border-style: solid;';
	AJAX.LOAD['style_b']	+='font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;';
	AJAX.LOAD['style_b']	+='font-weight: bold;';
	AJAX.LOAD['style_b']	+='color: #001500;';
	AJAX.LOAD['style_b']	+='font-size: 11px;';
	AJAX.LOAD['style_b']	+='width: 60px;';
	
	AJAX.LOAD['block']		= '<div id="wait_ajax" style="'+AJAX.LOAD['style']+'">';
	AJAX.LOAD['block']		+='<span>Wait...</span><br/>';
	AJAX.LOAD['block']		+='<span><img src="/inc/classes/ajax_class/wait.gif" border="0" height="22"></span><br/>';
	AJAX.LOAD['block']		+='<span><input type="button" style="'+AJAX.LOAD['style_b']+'" value="Restart" onclick="AJAX.start(\''+AJAX.element_id+'\',\''+AJAX.file+'\');">&nbsp;</span>';
	AJAX.LOAD['block']		+='<span><input type="button" style="'+AJAX.LOAD['style_b']+'" value="Stop" onclick="AJAX.stop();"></span><br/>';
	AJAX.LOAD['block']		+='<span style="color: red;" id="ajax_error"></span>';
	AJAX.LOAD['block']		+='</div>';
	if (AJAX.wait_block==1) {
		document.getElementById(AJAX.element_id_reload).innerHTML = AJAX.LOAD['block'];
	}
	else {
		if (document.getElementById('ajax_block') && AJAX.wait_block!='-1') {
			document.getElementById('ajax_block').innerHTML = AJAX.LOAD['block'];
		}
	}
}

AJAX.stop = function (){
	AJAX.HTTP.abort();
	AJAX.ABORT 				= new Array();
	AJAX.ABORT['width'] 	= window.outerWidth/2-60;
	AJAX.ABORT['height'] 	= window.outerHeight/2-100;
	if (navigator.appName == 'Microsoft Internet Explorer') var position = 'absolute;';
	else var position = 'fixed;';
	AJAX.ABORT['style']		= 'position: '+position;
	AJAX.ABORT['style']		+='left: '+AJAX.LOAD['width']+'px;';
	AJAX.ABORT['style']		+='top: '+AJAX.LOAD['height']+'px;';
	AJAX.ABORT['style']		+='padding: 2px 2px 2px 2px;';
	AJAX.ABORT['style']		+='height: 82px;';
	AJAX.ABORT['style']		+='width: 122px;';
	AJAX.ABORT['style']		+='border-style: solid;';
	AJAX.ABORT['style']		+='font-family: System;';
	AJAX.ABORT['style']		+='font-size: 12px;';
	AJAX.ABORT['style']		+='text-align: center;';
	AJAX.ABORT['style']		+='border-width: 0px 0px 0px 0px;';
	AJAX.ABORT['block']		= '<div id="wait_ajax" style="'+AJAX.ABORT['style']+'">';
	AJAX.ABORT['block']		+='</div>';
	if(document.getElementById('ajax_block')) document.getElementById('ajax_block').innerHTML = '';
}

AJAX.find_js = function(){
	var ajax_return 	= AJAX.text;
	var js_start 		= '<script language="JavaScript" type="text/javascript">';
	var new_js_start 	= '<script language="JavaScript" type="text/javascript">eval("';
	var js_end			= '</script>';
	var new_js_end		= '");</script>';
	ajax_return = AJAX.str_replace(ajax_return,js_start,new_js_start);
	ajax_return = AJAX.str_replace(ajax_return,js_end,new_js_end);
	AJAX.text = ajax_return;
}

AJAX.str_replace = function (haystack, needle, replacement) {
	var temp = haystack.split(needle);
	return temp.join(replacement);
}
