/**
 * AjaxForms 0.7
 * Данный код является составной частью продукта AjaxForms
 * @author Мухарёв Максим [carw.master@gmail.com]
 * @copyright ООО "Артима" (http://www.artima.ru)
 * @include "/Spros/www/assets/snippets/ajaxforms/js/prototype.js"
 */

var urlHome = 'http://spros66.ru/';
//var urlHome = '/spros66n/';
var url = urlHome + 'index-ajax.php';

var tmpCity; // временное хранилище

var debug = false; // включение режима дебагинга

var tId; // идентификатор таймера
var submitReady = true; // Переключатель, который определяет готовность к отправке формы. Некоторые сервисы могут отправку блокировать.

/**
 * Обработчик проихошедшего события
 * @param {Element} element Объект поля для передачи данных
 */
function q(element) {
	
	// Показываем прелоадер
	ShowPreloader('Загрузка дополнительных полей...');

	// Берем значение, которое вызвало событие
	V = gv(element);
	
	// Название поля, которое вызвало событие
	N = gn(element);
	
	// Берем значения скрытого поля	
	HV = fJSON(gh(N));
	
	// Определяем тип выбора (множественный или альтернативный)
	mult = m(element);
	
	// Проверка на наличие повторного нажатия
	td = inh(HV,V,N);
	
	// удаление необходимых полей
	
	// Здесь есть какой-то подвох мне кажется
	
	// Если это множественый выбор и значение было выключено, то
	if(mult && (val == undefined)) {
		// удаляем поле привязанное к выключенному значению
		HV = reh(HV,V); 
		HidePreloader();
	// Если поле включили, то
	} else if(val == 'on') {
		// ничего не делаем.
	// В любом другом случае
	} else {
		// Удаляем значение
		//alert('!!' + td);
		if (!td) HV = reh(HV,V,true);
	}
	
	// Теперь нам надо определить повторный вызов значения.
	// Если значение не вызывается повторно, то
	if(!td && (val != undefined)) {
		// Нет повторного вызова
		// Значит нам нужно сделать запрос на сервер и загрузить динамические поля.
		
		// Определяем необходимые параметры для отправки на сервер
		var pars = 'q=assets/snippets/ajaxforms/ajax/ajaxforms.ajax.php' + '&value=' + V + '&name=' + N;
		
//		$('elem7').value = pars;
		
		// Защита от повторной загрузки
		HV[V] = [0];
		sh(HV,N);
		
		// Делаем вызов
		var myAjax = new Ajax.Request(url, {method: 'post', parameters: pars, onComplete: showResponse});
	} else {
		// Повторный вызов
		sh(HV,N);
		HidePreloader();
	}
	
	function showResponse(originalRequest) {

		R = originalRequest.responseText;
		
		if (debug) {
			console.log(R);
		}
		
		NE = fJSON(R);
		
		if(NE.type == 'insert') {
		
			new Insertion.After(NE.insertID,NE.html);
		
			// NE.insertID - идентификатор поля в которое попадает значение
			// NE.bindID - идентификатор нового поля, которое будет вставлено
		
			HV[V] = NE.bindID;
		} else if(NE.type == 'none') {
			delete HV[V];
		}
		
		sh(HV,N);
		HidePreloader();
	}
}

/**
 * Функция отсылки данных на сервер и получения результата
 * @param {String} inurl путь до обработчика
 * @param {Element} data данные для обработки
 * @param {String} text сообщение показываемое прелоадером
 * @param {Element} objid объект, в который записывается результат обработки сервером
 * @param {String} fx функция, которую необходимо запустить после загрузки данных.
 */
function send(inurl,data,text,objid,fx){

	ShowPreloader(text);
	
	var pars = 'q=assets/snippets/ajaxforms/ajax/' + inurl + '&' + data;
	
	var myAjax = new Ajax.Request(url, {method: 'post', parameters: pars, onComplete: Response});
	
	function Response(originalRequest) {

		R = originalRequest.responseText;
		
		if (debug) {
			console.log(R);
		}
		
		NE = fJSON(R);
		
		//alert(NE.html);
		
		HidePreloader();
		
		switch (NE.type) {
			case 'none':
				// ничего делать не нужно, похоже данных нет
				break;
			case 'raw':
				if(NE.raw == undefined) NE.raw = NE.html;
				// Этот метод предполагает передачу данных в чистом виде.
				// Далее эти данные должны быть обработаны специальной функцией
				break;
			case 'replace':
				$(objid).innerHTML = NE.html;
				$(objid).show();
				break;
			case 'remove':
			default:
				$(objid).innerHTML = '';
				break
		}
		
		//alert(NE.raw);
		
		// Запуск последующей обработки
		if(fx != undefined) {
			//runFx(fx,NE.raw,objid);
			fx(NE,objid);
		}
		
		return NE;
		//return true;
	}
}

/** Обработчик zero для радиобатонов. */
function z(element) {
	// Этот обработчик пустой и не должен делать вызов к серверу, но при этом он должен убирать поля, которые были вызваны значениями с привязкой.
	// Принцип такой - каждому полю, которое мы загружаем будет привязано скрытое поле со значением предка. Соответственно их мы и будем убирать.

	// Название поля, которое вызвало событие
	N = gn(element);
	
	// Берем значения скрытого поля	
	HV = fJSON(gh(N));
	
	// Удаляем все поля
	HV = reh(HV,0,true);
	
	sh(HV,N);
	
}

// Отображение всплывающей подсказки
function o(element) {

	q(element);
	
}

// функция получения значения скрытого поля
function gh(N) {
	// Название поля
	name = N;
	he = 'hlabel_' + name; // скрытое поле
	hvalue = $(he).value;
	
	return hvalue;
}

// Установка значения скрытого поля
function sh(HV,N) {
	// Название поля
	
	//alert(tJSON(HV));
	
	he = 'hlabel_' + N;
	
	$(he).value = tJSON(HV);
}

/**
 * функция получения значения
 * @param {} element
 * @return {}
 */
function gv(element) {
	var value= $F(element);
	var name = $(element).name;
	
	spl = name.indexOf('[');
	if(spl > 0) {
		value = name.substring(spl+1,name.length-1);
	}
	
	return value;
}

/**
 * Получение названия поля
 * @param {} element
 * @return {}
 */
function gn(element) {
	var name = $(element).name;
	
	spl = name.indexOf('[');
	if(spl > 0) {
		name = name.substring(0,spl);
	}
	
	return name;
}

/**
 * Получение управляющего элемента по названию любого включенного поля
 * @param {} elem
 * @return {}
 */
function gpe(elem) {
	
	// Записываем название id элемента
	var name = $(elem).id;
	
	// если название ID нет
	if(name == undefined) {
		// записываем название поля
		name = $(elem).name;
	}
	
	// ищем разделитель, который выделяет название управляющего элемента
	spl = name.indexOf('_');
	if(spl > 0) {
		name = name.substring(spl+1);
	}
	
	return name;
}

/**
 * Удаление динамического поля по значению скрытого поля
 * @param {} hid
 * @param {} val
 * @param {} all
 * @return {}
 */
function reh(hid,val,all) {
	// Если указано значение, то удаляем только поля, которые к нему относятся
	// Если значение не указано, значит необходимо удалять все динамические поля
	
	// Создаем объект по данным скрытого поля
	obj = hid;
	
	if(all == true) {
		// Удаляем все значения
		//alert('Удаляем все динамические поля');
		
		for (var i in obj) {
			obj[i].each(function(s) {
				if($(s)) $(s).remove();
			});
			delete obj[i];
		}
		
	} else {
		// Удаляем только необходимое значение
		// Удаляем все соответствующие поля
		obj[val].each(function(s) {
			$(s).remove();
		});
		delete obj[val];
	}

	return obj;
}

/**
 * определяет наличие записи в скрытом поле
 * @param {} hid
 * @param {} val
 * @param {} name
 * @return {Boolean}
 */
function inh(hid,val,name) {

	otype = typeof(hid[val]);
	
	if((otype == undefined) || (otype == 'undefined') || (tJSON(hid) == "{}")) {
		return false;
	} else {
		return true;
	}
	
	return s;
}

/**
 * функция определения множественного выбора
 * @param {} element
 * @return {}
 */
function m(element) {
	val = $F(element);
	mult = ((val == undefined) || (val == 'on')) ? true : false;
	return mult;
}

/**
 * Функция перевода из JSON
 * @param {} v
 * @return {}
 */
function fJSON(v) {

	return v.evalJSON();
	
	/*if(v != '') {
		return eval('(' + v + ')');
	} else {
		return {};
	}*/
}

/**
 * Функция преобразования в JSON
 * @param {} v
 * @return {}
 */
function tJSON(v) {
	r = Object.toJSON(v);
	if(r.substring(0,1) == "(") {
		// Скобки есть и мы их убираем
		r = r.substring(1,r.length-1);
	}
	//alert(r);
	return r;
}

/**
 * Функция поиск объявлений
 * @param {} event
 */
function sr(event){
	
	if(submitReady == true) {
		inurl='search_records.ajax.php';
		
		id = $('form');
		data = Form.serialize('form');
		
		text = 'Поиск объявлений...';
	
		send(inurl,data,text,'reclist');
	}

	Event.stop(event);
}

/**
 * Функция сохранения объявления
 * @param {} event
 */
function svr(event){
	
	if(submitReady == false) {
		Event.stop(event);
	}
}

/**
 * Функция получения следующей страницы
 * @param {} n
 */ 
function p(n,s) {
	inurl='search_records.ajax.php';
	data = 'page=' + n;
	if(s != undefined) {
		s = '&s=' + s; 
	} else {
		s = '';
	}
	data = data + s;
	text = 'Загрузка страницы...';
	Element.scrollTo('reclist');
	
	send(inurl,data,text,'reclist');
}

/**
 * Функция получения следующей поисковой страницы
 * @param {} n
 */ 
/*function sp(n) {
	
	inurl='search_records.ajax.php';
	data = 'page=' + n;
	text = 'Загрузка страницы...';
	
	Element.scrollTo('reclist');
	
	send(inurl,data,text,'reclist');
}*/

/**
 * Функция показа прелоадера
 * @param {} text
 * @return {Boolean}
 */
function ShowPreloader(text) {
	
	obj = $('preloader');
	
	if(text == false) {
		return false;
	}
	
	obj.style.display = 'block';
	topPosition = document.viewport.getScrollOffsets().top;
	Position.absolutize(obj);
	//alert(document.viewport.getScrollOffsets().top);
	obj.style.top = topPosition + 'px';
}

/**
 * Функция скрытия прелоадера
 */
function HidePreloader() {
	$('preloader').style.display = 'none';
}

/**
 * Функция отправки файла на сервер
 * @param {} elem
 */
function uploadFile(elem) {

	if($F('maxupload_' + elem) > 0) {
		// Включаем прелоадер
		ShowPreloader('Загрузка фотографии...');
		// Записываем обработчик формы
		act = $('form').action;
		trg = $('form').target;
		// Переписываем его на обработчик для загрузки файлов
		$('form').action = urlHome + 'assets/snippets/ajaxforms/ajax/insert.ajax.php';
		// Меняем направление загрузки результата на фрэйм.
		$('form').target = 'iframe_' + elem;
		// Отправляем форму
		$('form').submit();
		// Вертаем старые настройки фирмы взад.
		$(elem).disable();
		$('form').target = trg;
		$('form').action = act;
	}
	Form.Element.clear(elem);
	
	
	//window.frames['iframe_' + elem].document.body.innerHTML = 'Hello!';
}

/**
 * Функция обработки результата загрузки файла
 * @param {} elem
 */
function uploadRequest(elem) {

	resp = window.frames['iframe_' + elem].document.body.innerHTML;
	
	// Определяем количество разрешенных загрузок
	maxUpload = $F('maxupload_' + elem);
	
	if(resp != '') {
		
		obj = fJSON(window.frames['iframe_' + elem].document.body.innerHTML);
		
		if(obj['type'] != 'none') { 
			data = '<div class="tmbupload" id="' + obj['id'] + '"><img class="tmbdelete" src="' + urlHome + 'assets/templates/spros/images/tmbupload.gif" onclick="deleteFile(\'' + obj['id'] + '\',\'' + elem + '\')"><div style="background-image: url(' + obj['src'] + ');"></div></div>';
		
			new Insertion.After(elem,data);
			addSub(elem,obj['id']);
		}
		
		// уменьшаем счетчик разрешенных загрузок
		maxUpload--;
		// Устанавливаем новое значение счетчика
		Form.Element.setValue('maxupload_' + elem, maxUpload);	
	}
	
	// Если счетчик не равен нулю
	if(maxUpload != 0) {
		// включаем поле загрузки
		$(elem).enable();
	} else {
		$(elem).hide();
	}
	HidePreloader();
}

/**
 * Функция удаления миниатюры загруженного файла
 * @param {} elem
 * @param {} parElem
 */
function deleteFile(elem,parElem) {
	
	hmaxupl = 'maxupload_' + parElem;
	
	// Определяем количество разрешенных загрузок
	maxUploadVal = $F(hmaxupl);
	
	// Если счетчик не равен нулю
	if(maxUploadVal == 0) {
		Element.show(parElem);
		$(parElem).enable();
	}
	
	maxUploadVal++;
	// Устанавливаем новое значение счетчика
	Form.Element.setValue(hmaxupl, maxUploadVal);
	
	delSub(parElem,elem);
	
	$(elem).remove();
}

/**
 * Функция добавления значения в служебное поле
 * @param {} elem
 * @param {} val
 * @return {Boolean}
 */
function addSub(elem,val) {
	
	subElem = 'sub_' + elem;
	
	if (!$(subElem)) {
		return false;
	}
	
	arr = fJSON($F(subElem));
	
	// Проверяем существование значения
	if(arr.indexOf(val) == -1) {
		// Значения нет
		arr.push(val);
		Form.Element.setValue(subElem, tJSON(arr));
		return true;
	} else {
		return false;
	}
}

/**
 * Функция удаления значения из служебного поля
 * @param {} elem
 * @param {} val
 * @return {Boolean}
 */
function delSub(elem,val) {
	subElem = 'sub_' + elem;
	// Берем массив значений
	if(!$(subElem)) {
		return false;
	} else {
		arr = fJSON($F(subElem));
		// Возвращаем значение за исключением искомого
		Form.Element.setValue(subElem, tJSON(arr.without(val)));
	}
}

/**
 * Получение значения служебного поля
 * @param {} elem
 * @return {Boolean}
 */
function getSub(elem) {
	
	subElem = 'sub_' + elem;
	if(!$(subElem)) {
		return false;
	} else {
		// Берем массив значений
		arr = fJSON($F(subElem));
		
		return arr;
	}
}

/**
 * Определение количества элементов в служебном поле
 * @param {} elem
 * @return {Boolean}
 */
function cntSub(elem) {
	subElem = 'sub_' + elem;
	
	if(!$(subElem)) {
		return false;
	} else {
		arr = fJSON($F(subElem));
		return arr.size();
	}
}

/**
 * Функция которая убирает выделение у дочерних элементов заданного элемента
 * @param {} elem
 */
function desel(elem) {
	selList = $$('#' + rid + ' li.select');
	selList.each(function(s) {
		s.removeClassName('select');
	});
}

/**
 * Функция получения id вида elemAAA_BB из elemAAA[BB]
 * @param {} key
 * @return {}
 */
function KeyToEnum(key) {
	return	gn(key) + '_' + gv(key);
}

/**
 * Функция организации редиректа через некоторое время
 * @param {} url
 * @param {} time
 */
function timeRedirect(url,time) {
	setTimeout("redirect('" + url + "');",time); 
}

/**
 * Редирект на заданный урл
 * @param {} url
 */
function redirect(url) {
	window.location = url;
}
