////////////////// Правильный escape ////////////////////////////////
	
	// Сохраняем стандартную функцию escape()
	escapeOriginal = window.escape;
	
	// Переопределяем функцию escape()
	window.escape = function(s){
		var ret = [];
		if ( s == undefined ) return "";
		var str = s.toString()
		// Составляем массив кодов символов, попутно переводим кириллицу
		for (var i = 0; i < str.length; i++){
			var ChCode = str.charCodeAt(i);
			
			if(ChCode == 43){
				ret.push(0x2B);
			}else{
				if (typeof escape.trans[ChCode] != 'undefined')
					ret.push(escape.trans[ChCode]);
				else 
					ret.push(ChCode);
			}
		}
		var st_rt = escapeOriginal(String.fromCharCode.apply(null, ret))
		return st_rt.replace(/\+/, "%2B");
	}
	
	// Инициализируем таблицу перевода
	escape.trans = [];
	for (escape.i = 0x410; escape.i <= 0x44F; escape.i++)
		escape.trans[escape.i] = escape.i - 0x350;	// А-Я а-я
		
		escape.trans[0x401]  = 0xA8;    			// Ё
		escape.trans[0x451]  = 0xB8;    			// ё
		escape.trans[0x2116] = 0xB9;    			// №
		escape.trans[0x2026] = 0x85;    			// ...	
	
/////////////////////////////////////////////////////////////////////////

var SENDto = function(file){
	var  self = this;
	this.ajax = null;
	this.indicator = 'loading';
	
	this.createAJAX = function(){			// создание XMLHttpRequest обьекта
		try {
			this.ajax = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e1) {
			try {
				this.ajax = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e2) {
				this.ajax = null;
			}
		}

		if (! this.ajax) {
			if (typeof XMLHttpRequest != "undefined") {
				this.ajax = new XMLHttpRequest();
				this.ajax.overrideMimeType('text/xml');
			} else {
				this.failed = true;
			}
		}
	};
	
	this.setVar = function(name, value){	// создание переменных для POST запроса
		this.sendVars[escape(name)] = value;
	};
	
	this.POST = function(){					//POST запрос
		var sendData = ""; 
		var temp = [];
		
		this.setVar("rnd", new Date().getTime()); /* привентим кеширование */
		
		if (this.failed){
			this.onFail();
		} else {
			for (var key in this.sendVars){
				temp.push(key + "=" + this.sendVars[key]);
			}
			sendData = temp.join("&");
			
			if (this.ajax) {
				this.ajax.open("POST", this.requestFile, true);
				
				try { 
				this.ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
				} catch (e) { }
				
				this.ajax.onreadystatechange = this.onReady;
				this.ajax.send(sendData);
			}
		}	
	};
	this.GET = function(){					//GET запрос
		if (this.failed){
			this.onFail();
		} else {
			if (this.ajax) {
				this.ajax.open("GET", this.requestFile, true);
				this.ajax.onreadystatechange = this.onReady;
				this.ajax.send("");
			}
		}		
	};
	
	this.onReady = function(){				// обработка данных пришедших от сервера
		switch (self.ajax.readyState){
			case 1:
				self.onLoading();
				break;
			case 2:
				self.onLoaded();
				break;
			case 3:
				self.onInteractive();
				break;
			case 4:
				self.response = self.ajax.responseText;
				self.responseXML = self.ajax.responseXML;
				self.responseStatus[0] = self.ajax.status;
				self.responseStatus[1] = self.ajax.statusText;
				
				if(self.element){
					var elementObj = document.getElementById(self.element);
					var elemNodeName = elementObj.nodeName;
						elemNodeName.toLowerCase();
						
					if (elemNodeName == "input" || elemNodeName == "select" || elemNodeName == "option" || elemNodeName == "textarea")
						elementObj.value 	 = self.response;
					else
						elementObj.innerHTML = self.response;
				}
				if(self.execute) window.eval(self.response);
				if(self.responseStatus[0] == "200") self.onCompletion(); else self.onError();
				break;
		}
	};
	
	this.resetFunc = function(){
  		this.onLoading = 		function() { 
									//$(this.indicator).style.display = 'block';
									document.body.style.cursor = 'progress';
								};
  		this.onLoaded = 		function() { };
  		this.onInteractive = 	function() {
									//var t1 = setTimeout("($('" + this.indicator+ "').style.display = 'none')",700);
									var t2 = setTimeout("(document.body.style.cursor = 'default')",1000);
								};
  		this.onCompletion = 	function() { };
  		this.onError = 			function() { };
		this.onFail = 			function() { };
	};	
	this.resetData = function(){
		this.requestFile = file;
		this.sendVars    = [];
		
		this.element = null;
  		this.execute = false;
  		
		this.responseStatus = new Array(2);
  	};
	this.reset = function(){
		this.resetFunc();
		this.resetData();
	};	
	
	this.reset();
	this.createAJAX();
}

SENDto.prototype = {
	setFormVars : function(form_obj){		// поля формы через this.setVar() передаются запросу POST
			for(var i = 0; i < form_obj.elements.length; i++)
			{
				if(form_obj.elements[i].name){
					switch(form_obj.elements[i].type)
					{
					case 'checkbox':
						if(form_obj.elements[i].checked)
							this.setVar(form_obj.elements[i].name, form_obj.elements[i].value);
						break;
					case 'text':
					case 'hidden':
					case 'password':
					case 'select-one':
						if(form_obj.elements[i].value.length != 0)
							this.setVar(form_obj.elements[i].name, form_obj.elements[i].value);
						break;
					default:
						this.setVar(form_obj.elements[i].name, form_obj.elements[i].value);
					}
				}
			}
			if(form_obj.id){
				this.setVar('form_id', form_obj.id);
			}	
	},
	setForms    : function(form_obj){  		// поля формы передаются как forms[name_el][...]    (для нескольких форм)
			if(form_obj.id){
				for(var i = 0; i < form_obj.elements.length; i++)
				{
					if(form_obj.elements[i].name){
						switch(form_obj.elements[i].type)
						{
						case 'checkbox':
							if(form_obj.elements[i].checked)
								this.setVar('forms['+ form_obj.id +']['+ form_obj.elements[i].name +']', form_obj.elements[i].value);
							break;
						case 'text':
						case 'password':
						case 'select-one':
						case 'hidden':
							if(form_obj.elements[i].value.length != 0)
								this.setVar('forms['+ form_obj.id +']['+ form_obj.elements[i].name +']', form_obj.elements[i].value);
							break;						
						default:
							this.setVar('forms['+ form_obj.id +']['+ form_obj.elements[i].name +']', form_obj.elements[i].value);
						}
					}
				}
			}	
	}
}

var to_POST = function (arr, arr_name){		//конвертирует JS_Обьект в в масив с элементамивида  -->>  "arr_name[elem_name][elem_name]" : elem_val
	var buffer 	= Array(arr_name);
	var rez 	= Array();

	function do_POST(arr){
			for(var a in arr){
					buffer.push( '[' + a + ']' );
					
					if(arr[a].constructor == Array || arr[a].constructor == Object){
						do_POST(arr[a])
					}else{
						rez[buffer.join('')] = arr[a]
						buffer.pop();
					}	
			}
			buffer.pop();
	}
	
	do_POST(arr);
	return rez;	
}

var ajaxSubmit = function(form_obj, target_element, from_file){  // onClick="ajaxSubmit(this.form, 'box-el', 'action.php')"
	var ajax = new SENDto(from_file);
		ajax.setFormVars(form_obj);
		ajax.element = target_element;
		ajax.POST();
};

function ajaxAddProgress( txt ) {
	_container = document.getElementById( "ajax_progress_container" );

	var idx = ajaxProgressIndex++;
	//
	var progEl = new DivModel();
	progEl.generate("#FFFFCC", "ajax_progress_" + idx, "<p style=\"white-space: nowrap\"><img src=\"" + _IMG_ROOT + "images/loading.gif\" style=\"float: left; width: auto\"/>" + txt + "</p>" );
	//progEl.getElement().setAttribute( "style", "background-color: #FFFFCC; border: 1px solid gray; margin: 1px; width: 200px" );

	/*
	var progressEl = document.createElement( "DIV" );
	progressEl.id = "ajax_progress_" + idx;
	progressEl.setAttribute( "style", "background-color: #FFFFCC; border: 1px solid gray; margin: 1px; width: 200px" );
	//
	progressEl.innerHTML = "";*/
	//
	document.getElementById( "ajax_progress_container" ).appendChild( progEl.getElement() );
	progEl.doAppear();
	divModels.setItem( idx, progEl );
	//
	return idx;
}

function ajaxRemoveProgress( idx ) {
	//document.getElementById("ajax_progress_container").removeChild(document.getElementById("ajax_progress_" + idx));
	 divModels.getItem(idx).doZoomOut();
}
