<!--
/*
	Name: 		CStd.js
	Ver: 		1.0a
	Author: 	Andrey Korolkov
*/
function CHTTPClient() {
	/* Медоты */
	var randomCacheString = function () {
		var rNum = null;
		var random_str = '';
		var x = null;

		for (x = 0; x < 32; x++) {
			random_str += Math.floor(Math.random() * (9));
		}

		return random_str;
	}

	var processRequest = function (callback_func, callback_func_params, http_req) {
		if (http_req.readyState == 4) {
			if (http_req.status == 200) {
				var xml = null;

				if (http_req.responseXML != null) {
					xml = http_req.responseXML.documentElement;
				}

				if (xml != null) {
					xml = new ActiveXObject("Msxml2.DOMDocument");
					xml.async = false;
					xml.loadXML(http_req.responseText);

					if (xml) {
						response = xml
					} else {
						alert('HTTPClient:processRequest: Не удалось инициализировать парсер XML');
						return;
					}
				}

				// Вызываем callback-функцию
				if (callback_func) {
					callback_func(xml, http_req.responseText, callback_func_params);
				} else {
					alert('HTTPClient:processRequest: Отсутствует определение callback-функции.');
				}
			} else if (http_req.status == 400) {
				alert('HTTPClient:processRequest: Неправильный запрос');
			} else if (http_req.status == 500) {
				alert('HTTPClient:processRequest: Внутреняя ошибка на сервере');
			} else if (http_req.status == 503) {
//				var time = requestObj.getResponseHeader('Retry-After') * 1000;
//				alert('Сервер перегружен. Запрос будет повторен через: ' + time + ' секунд');
//				setTimeout(sendRequest(, callback_func, callback_func_params),time);
			} else {
				alert('HTTPClient:processRequest: Недопустимый статус HTTP запроса: ' + http_req.statusText);
			} 
		}
	}

	var encode = function (str) {
		if (str == 'undefined' || str == null) {
			alert('HTTPClient.encode: Error:' + str);
			return '';
		}

		var win = {1040:192,1041:193,1042:194,1043:195,1044:196,1045:197,1046:198,1047:199,1048:200,1049:201,1050:202,1051:203,1052:204,1053:205,1054:206,1055:207, 1056:208,1057:209,1058:210,1059:211,1060:212,1061:213,1062:214,1063:215,1064:216,1065:217,1066:218,1067:219,1068:220,1069:221,1070:222,1071:223, 1072:224,1073:225,1074:226,1075:227,1076:228,1077:229,1078:230,1079:231,1080:232,1081:233,1082:234,1083:235,1084:236,1085:237,1086:238,1087:239, 1088:240,1089:241,1090:242,1091:243,1092:244,1093:245,1094:246,1095:247,1096:248,1097:249,1098:250,1099:251,1100:252,1101:253,1102:254,1103:255, 1025:168, 1105:184, 8470:185};     
		var ret = '';

		for (i = 0; i < str.length; i++) {
			var n = str.charCodeAt(i);

			if (win[n]) {
				n = win[n];
			}
			if (n < 16) {
				ret += '%0'+n.toString(16);
			} else {
				ret += '%'+n.toString(16);
			}
		}

		return ret;
	}

	// Преобразуем хеш в строку QUERY_STRING
	var hash2query = function(hash) {
		var query = '';
		if (hash instanceof Object) {
			for (var k in hash) {
				var v = hash[k];
				query += '&' + k + '=' + encode(v);
			}
		} else {
			query = '';
		}
		return query;
	}

	// Посылаем запрос
	this.sendRequest = function (method, url, params, func, func_params) {
		var http_req = null;

		// Проверяем, содержит ли URL параметры для GET
		url += (url.indexOf('?') >= 0 ? '&' : '?') +'anticache=' + randomCacheString();

		// Инициализируем XMLHttpRequest
		if (window.XMLHttpRequest) {
			http_req = new XMLHttpRequest();
		} else if (window.ActiveXObject) {
			try {
				http_req = new ActiveXObject('Msxml2.XMLHTTP');
			} catch (e) {
				try {
					http_req = new ActiveXObject('Microsoft.XMLHTTP');
				} catch (oc) {
					http_req = null;
					alert('HTTPClient:sendRequest: Не удалось инициализировать объект XMLHTTP');
				}
			}
		}

		// Если инициализация прошла успешно, до делаем запрос
		if (http_req) {
			http_req.open(method, url, false);
//			http_req.onreadystatechange = (function () {processRequest(func, func_params, http_req);});

			if (method == 'POST') {
				http_req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
				http_req.setRequestHeader("Accept-Language", "ru, en");
				http_req.setRequestHeader("Accept-Charset", "windows-1251");
				params = hash2query(params);
			} else {
				if (params) {
					url += '&' + hash2query(params);
				}
				params = null;
			}
			http_req.send(params);
			processRequest(func, func_params, http_req);
		} else {
			alert('HTTPClient:sendRequest: Не возможно свершить HTTP запрос.');
		}
	}

	// Генерирует строку параметров из формы form_name
	this.generateHashFromForm = function (form_name) {
		if (!document.forms[form_name]) {
			alert('HTTPClient.generateHashFromForm: Неверно указано имя формы: ' + form_name);
		}
		
		var params = {};
		var uploads_counter = 0;

		for (i = 0; i < document.forms[form_name].length; i++) {
			if (document.forms[form_name][i].type == 'radio' && !document.forms[form_name][i].checked) {
				continue;
			}
			if (document.forms[form_name][i].type == 'checkbox' && !document.forms[form_name][i].checked) {
				continue;
			}
			if (document.forms[form_name][i].type == 'file') {
				if (document.forms[form_name][i].value != '') {
					params[document.forms[form_name][i].name] = uploads_counter + '_tmp';//document.forms[form_name][i].value;
					uploads_counter++;
				}
				continue;
			}
			if(document.forms[form_name][i].name == null || document.forms[form_name][i].value == null || document.forms[form_name][i].type == null) {
				continue;
			}
//alert(document.forms[form_name][i].type);
			params[document.forms[form_name][i].name] = document.forms[form_name][i].value;
		}

		return params;
	}
}
//-->