/**
 * считывает данные с в указанной форме и передаёт их через ajax в скрипт
 */
(AjaxRequest = {
	queue_param : [],
	queue_id : 0,
	lock: false, // блокировка изменения параметров до того, как не будет возвращён результат
	get_brace_number : [], // проставляет нумерацию для переменных со скобочками на конце []
	forma : {}, // Форма, которую обрабатываем
	param : [], // Параметры, которые передаются в скрипт
	req : {}, // Объект JsHtppRequest
	preloaderId : 'ajaxPreloader',
	preloaderObj : {},
	layer_prefix : 'layer_',
	
	send : function (form_id, event_file, preloader_message, use_lock, advanced_params) {
		use_lock = true; // Без этого класс работать не будет
		this.preloaderObj = byId(this.preloaderId);

		
		if (this.lock == true && use_lock == true) {
			this.queue_id++;
			this.queue_param[ this.queue_id ] = new Array();
			this.queue_param[ this.queue_id ][0] = form_id;
			this.queue_param[ this.queue_id ][1] = event_file;
			this.queue_param[ this.queue_id ][2] = preloader_message;
			this.queue_param[ this.queue_id ][3] = use_lock;
			this.queue_param[ this.queue_id ][4] = new Array();
			for (key in advanced_params) {
				this.queue_param[ this.queue_id ][4][key] = advanced_params[key];
			}
			this.queue_param[ this.queue_id ][5] = 1;
			
			if (this.preloaderObj) {
				this.preloaderObj.innerHTML = 'Подождите...';
				centerDiv(this.preloaderObj.name);
			}
			
			return false;
		}
		
		this.get_brace_number = new Array();
		this.lock = true;
		this.param = new Array();
		if (document.getElementById(form_id)) {
			this.forma = byId(form_id);
		} else {
			this.forma = null;
		}
		this.req = new JsHttpRequest();
		this.req.caching = false;
		this.req.open('POST', event_file, true);
		
		this.req.onreadystatechange = function() {
			AjaxRequest.responseParser();
		}
		
		if (this.forma) {
			// Готовим параметры формы, которые необходимо передать
			var obj = this.forma.elements;
			var tag_name = '';
			for (var i=0; i<obj.length; i++) {
				tag_name = obj[i].tagName.toLowerCase();
				
				if (tag_name == 'input' && obj[i].type.toLowerCase() != 'radio' && obj[i].type.toLowerCase() != 'checkbox') {
					field_name = this.getBraceNumber(obj[i].name);
					this.param[ field_name ] = obj[i].value;
					
				} else if (tag_name == 'input' && obj[i].checked == true) {
					field_name = this.getBraceNumber(obj[i].name);
					this.param[ field_name ] = obj[i].value;
					
				} else if (tag_name == 'select' && obj[i].multiple == true) {
					for (var x=0; x < obj[i].options.length; x++) {
						if (obj[i].options[x].selected == true) {
							field_name = this.getBraceNumber(obj[i].name);
							this.param[ field_name ] = obj[i].options[x].value;
						}
					}
					
				} else if (tag_name == 'select') {
					field_name = this.getBraceNumber(obj[i].name);
					this.param[ field_name ] = obj[i].value;
					
				} else if (tag_name == 'textarea') {
					field_name = this.getBraceNumber(obj[i].name);
					this.param[ field_name ] = obj[i].value;
					
				}
			}
		}
				
		// Добавляем дополнтельные параметры
		if (advanced_params) {
			for (key in advanced_params) {
				field_name = this.getBraceNumber(key);
				this.param[ field_name ] = advanced_params[key];
			}
		}
		
		this.req.send(this.param);
		
		// Показываем preloader
		if (preloader_message.length != 0 && this.preloaderObj) {
			this.preloaderObj.style.display = 'block';
			this.preloaderObj.innerHTML = preloader_message;
			centerDiv(this.preloaderId);
		}
	},
	

	responseParser : function () {
		if (this.req.readyState != 4) {
			return;
		}
		if (this.req.responseText!='' && this.preloaderObj) {
			this.preloaderObj.style.textAlign="left";
			this.preloaderObj.style.display = 'block';
			this.preloaderObj.innerHTML = '<div style="text-align:right;"><a href="javascript:void(0);" onclick="byId(\'' + this.preloaderObj.id + '\').style.display=\'none\'">[x] Закрыть</a></div>'+this.req.responseText;
			centerDiv(this.preloaderObj.id);
		} else if (this.preloaderObj) {
			this.preloaderObj.style.display = 'none';
		}
		for (key in this.req.responseJS) {
			if (byId(this.layer_prefix + key)) {
				byId(this.layer_prefix + key).innerHTML = this.req.responseJS[key];
			}
		}
		
		this.lock = false;
		this.queueNext();
	},
	
	queueNext : function() {
		if (this.queue_param.length == 0) {
			return;
		}
		for (key in this.queue_param) {
			break;
		}
		// Если массив не заполнен, то делаем паузу 0,5 с
		if (!this.queue_param[key][5]) {
			window.setTimeout('AjaxRequest.queueNext();', 500);
			return false;
		}
		param = this.queue_param[key];
		this.queue_param.shift();
		this.send(param[0], param[1], param[2], param[3], param[4]);
	},
	
	// Для переменных типа name[] автоматически проставляет нумерацию.
	getBraceNumber : function (name) {
		field_name = name;
		if(name.substr( name.length - 2 ) == '[]') {
			field_name = name.substr(0, name.length - 2 );
			if (typeof(this.get_brace_number[ field_name ]) == 'undefined') {
				this.get_brace_number[ field_name ] = 0;
			} else {
				this.get_brace_number[ field_name ]++;
			}
			field_name += '['+ this.get_brace_number[ field_name ] +']';
		}
		return field_name;
	}	
	
}
)
