var SlidersCollection = [];

var Nakopitel = {};


// Функция переключает видимость какой-либо страницы
Nakopitel.switchPage = function(id) {

	$('div.page').hide();
	$('#' + id).show();

}

// Сбрасывает настройки системы, обнуляет параметры, устанавливает главную страницу
Nakopitel.init = function() {

	Nakopitel.category = 1;
	Nakopitel.region = 23;
	Nakopitel.action = null;
	Nakopitel.formAttributes = [];
	Nakopitel.currentAttribute = 0;
	Nakopitel.formValues = [];
	Nakopitel.searchResult = [];
	Nakopitel.errorCounter = 0;

	Nakopitel.switchPage('Index');

}

// Сбрасывает настройки системы, обнуляет параметры, устанавливает главную страницу
Nakopitel.reset = function() {
	document.location.href = '/';
}


// Устанавливает категорию, загружает форму, инициализирует заполнятор формы и включает отображение страницы с формой
Nakopitel.setCategory = function(id, action) {

	// Показываем страницу "Подождите"
	Nakopitel.switchPage('Processing');

	// Устанавливаем текущую категорию
	Nakopitel.category = id;

	// Устанавливаем текущее действие
	Nakopitel.action = action;

	// Загружаем требуемую форму
	$.ajax({
		url: "/soap.php",
		error: function(XMLHttpRequest, textStatus, errorThrown){
			Nakopitel.errorCounter++;
			if( Nakopitel.errorCounter > 10 ) {
				Nakopitel.reset();
			}
			$('#Processing .message p').show();
			Nakopitel.setCategory(id, action);
		},
		type: "POST",
		data: ({'command': 'form', 'category' : id, 'type': action, 'detail': ( action == 'search' ? 1 : 2 ) }),
		dataType: "json",
		success: function(response){

			// Если была ошибка, заканчиваем работу
			if( response == false ) {

				alert('Hakuna Matata!');

			} else {

				// Помещаем элементы формы в текущее состояние системы
				Nakopitel.formAttributes = response;

				// Заполняем контейнер для хранения значений переменных
				for( var i in response ) {

					// Тип атрибута
					switch( response[i].type ) {

						// Число, дата
						case 'integer':
						case 'numeric':
						case 'date':

							// В зависимости от того, интервал это или нет
							if( response[i].is_range == true ) {
								Nakopitel.formValues[Nakopitel.formValues.length] = { id: response[i].attribute, value: {min: null, max: null} };
							} else {
								Nakopitel.formValues[Nakopitel.formValues.length] = { id: response[i].attribute, value: null };
							}

							break;

						// Логический, текст
						case 'boolean':
						case 'text':

							Nakopitel.formValues[Nakopitel.formValues.length] = { id: response[i].attribute, value: null };

							break;
							
						// Список
						case 'list':
							
							Nakopitel.formValues[Nakopitel.formValues.length] = { id: response[i].attribute, value: [] };
							
							break;

					} // switch


				} // for

				// Отрисовываем переключатель атрибутов
				Nakopitel.drawAttributesLine();

				// Включаем страницу заполнения формы
				Nakopitel.switchPage('Form_Fill');

			}

		}
	});

}









// Активирует экран выбора категории
Nakopitel.openCategorySelector = function(action) {

	// Устанавливаем текущее действие
	Nakopitel.action = action;

	// Включаем страницу заполнения формы
	Nakopitel.switchPage('Category');

	// Инициализируем загрузку информации о категории
	Nakopitel.selectCategory(1, 1);
	
}


// Устанавливает выбранной категорию, отрисовывает переключатели категорий, подгружает список дочерних категорий, если подкатегорий больше нет, отображает кнопку "Продолжить"
Nakopitel.selectCategory = function(id, index) {

	// Удаляем все слайдеры, которые находятся ниже указанной глубины
	$('#categoryStackHolder div.stack:gt(' + (index-2) + ')').remove();

	// Показываем индикатор загрузки
	$('#categoryStackHolder').append('<div id="loader">Подождите</div>');

	// Загружаем путь к выбранной категории
	$.ajax({
		url: "/soap.php",
		type: "POST",
		error: function(XMLHttpRequest, textStatus, errorThrown){
			Nakopitel.errorCounter++;
			if( Nakopitel.errorCounter > 10 ) {
				Nakopitel.reset();
			}
			$('#Processing .message p').show();
			Nakopitel.selectCategory(id, index);
		},
		data: ({'command': 'category', 'id' : id }),
		dataType: "json",
		complete: function() {

			// Скрываем индикатор загрузки после успешной загрузки информации
			$('#categoryStackHolder #loader').remove();

		},
		success: function(response){

			// Если была ошибка, заканчиваем работу
			if( response == false ) {

				alert('Hakuna Matata!');

			} else {

				// Попутно удаляем и кнопку "Продолжить"
				$('#categoryStackHolder .proceed').remove();

				// Если есть дочерние категории
				if( response.elements.length > 0 ) {

					// Сформировать набор элементов для слайдера
					var elements = response.elements;

					// Добавить контейнер для слайдера (если слайдеры уже были, то добавляем в конец, иначе просто добавляем)
					$('#categoryStackHolder').append('<div class="stack" id="categoryStack_' + index + '"></div>');

					// Инициализировать слайдер
					SlidersCollection[index] = new Slider('categoryStack_' + index, elements, null, index, Nakopitel.selectCategory);

				} else {
				// Если дочерних категорий нет	
			
					// Включаем кнопку "Продолжить"
					$('#categoryStackHolder').append('<div class="stack proceed"><button onclick="Nakopitel.setCategory(' + response.parent.id + ', Nakopitel.action)">Выбрать эту категорию и продолжить &raquo;</button></div>');

				} // if( response.element.length > 0 )

			}

		}
	});

}



// Устанавливает выбранный регион, отрисовывает переключатели регионов, подгружает список дочерних регионов, если подрегионов больше нет, отображает кнопку "Продолжить"
Nakopitel.selectRegion = function(id, index) {

	// Удаляем все слайдеры, которые находятся ниже указанной глубины
	$('#regionStackHolder div.stack:gt(' + (index-2) + ')').remove();

	// Показываем индикатор загрузки
	$('#regionStackHolder').append('<div id="loader">Подождите</div>');

	// Загружаем путь к выбранному региону
	$.ajax({
		url: "/soap.php",
		type: "POST",
		error: function(XMLHttpRequest, textStatus, errorThrown){
			Nakopitel.errorCounter++;
			if( Nakopitel.errorCounter > 10 ) {
				Nakopitel.reset();
			}
			$('#Processing .message p').show();
			Nakopitel.selectRegion(id, index);
		},
		data: ({'command': 'region', 'id' : id }),
		dataType: "json",
		complete: function() {

			// Скрываем индикатор загрузки после успешной загрузки информации
			$('#regionStackHolder #loader').remove();

		},
		success: function(response){

			// Если была ошибка, заканчиваем работу
			if( response == false ) {

				alert('Hakuna Matata!');

			} else {

				// Попутно удаляем и кнопку "Продолжить"
				$('#regionStackHolder .proceed').remove();

				// Устанавливаем текущим выбранный регион
				Nakopitel.region = response.parent.id;

				// Если есть дочерние регионы
				if( response.elements.length > 0 ) {

					// Сформировать набор элементов для слайдера
					var elements = response.elements;

					// Добавить контейнер для слайдера (если слайдеры уже были, то добавляем в конец, иначе просто добавляем)
					$('#regionStackHolder').append('<div class="stack" id="regionStack_' + index + '"></div>');

					// Инициализировать слайдер
					SlidersCollection[index] = new Slider('regionStack_' + index, elements, null, index, Nakopitel.selectRegion);

				} else {
				
					// Если дочерних регионов нет, пишем, что всё

					// Включаем кнопку "Продолжить"
					$('#regionStackHolder').append('<div class="stack proceed"><button onclick="Nakopitel.setRegion()">Выбрать и продолжить &raquo;</button></div>');

				} // if( response.element.length > 0 )

			}

		}
	});

}



// Устанавливает регион, выполняет команду добавить/найти, в зависимости от текущего действия
Nakopitel.setRegion = function() {

	// Выполняем команду
	switch(Nakopitel.action) {

		case 'add':
			Nakopitel.add();
			break;

		case 'search':
			Nakopitel.search();
			break;

	}

}



// Перелистывает линию атрибутов на указанное количество шагов
Nakopitel.attributeMove = function(step) {

	// Если перемещать некуда, то не перемещаем
	if( (Nakopitel.currentAttribute + step) < 0 || (Nakopitel.currentAttribute + step) > (Nakopitel.formAttributes.length-1) ) {
		return;
	}

	// Меняем текущий выбранный атрибут
	Nakopitel.currentAttribute = Nakopitel.currentAttribute + step;

	// Перерисовываем полосу атрибутов
	Nakopitel.drawAttributesLine();

}


// В редакторе с клавиатурой помечает активным выбранное поле, добавляет к нему бордюр выделения и снимает этот бордюр с конкурирующих полей
Nakopitel.setTargetField = function(id) {

	// Отмечаем в клавиатуре выбранное поле
	Nakopitel.keyboard.setTarget(id);

	// Убираем выделение с конкурирующих полей
	$('#attributeField input').removeClass('target');
	$('#attributeField textarea').removeClass('target');

	// Выделяем выбранное поле
	$('#' + id).addClass('target');
	
	// Убираем метку "Нажмите", если она была
	$('#'+id).removeClass('empty');

}

// Отрисовывает переключатель атрибутов
Nakopitel.drawAttributesLine = function() {

	// Очищаем поле ввода предыдущего атрибута
	$('#attributeField').empty();

	// Устанавливаем первую ячейку переключателя
	if( (Nakopitel.currentAttribute - 2) < 0 ) {
		$('#button_1').empty();
		$('#button_1').addClass('inactive');
	} else {
		$('#button_1').text(Nakopitel.formAttributes[Nakopitel.currentAttribute - 2].title);
		$('#button_1').removeClass('inactive');
	}

	// Устанавливаем вторую ячейку переключателя
	if( (Nakopitel.currentAttribute - 1) < 0 ) {
		$('#button_2').empty();
		$('#button_2').addClass('inactive');
	} else {
		$('#button_2').text(Nakopitel.formAttributes[Nakopitel.currentAttribute - 1].title);
		$('#button_2').removeClass('inactive');
	}

	// Устанавливаем третью ячейку переключателя
	$('#button_3').text(Nakopitel.formAttributes[Nakopitel.currentAttribute].title);

	// Устанавливаем четвертую ячейку переключателя
	if( (Nakopitel.currentAttribute + 1) >= Nakopitel.formAttributes.length ) {
		$('#button_4').empty();
		$('#button_4').addClass('inactive');
	} else {
		$('#button_4').text(Nakopitel.formAttributes[Nakopitel.currentAttribute + 1].title);
		$('#button_4').removeClass('inactive');
	}

	// Устанавливаем пятую ячейку переключателя
	if( (Nakopitel.currentAttribute + 2) >= Nakopitel.formAttributes.length ) {
		$('#button_5').empty();
		$('#button_5').addClass('inactive');
	} else {
		$('#button_5').text(Nakopitel.formAttributes[Nakopitel.currentAttribute + 2].title);
		$('#button_5').removeClass('inactive');
	}


	// Отображаем текущее поле ввода атрибута
	var attribute = Nakopitel.formAttributes[Nakopitel.currentAttribute];

	switch( attribute.type ) {

		// Число с точкой
		case 'numeric':
			
			var max_length	= null;
			var field_size	= null;
			var html		= '';
			
			// Определяем ограничение по длине поля
			if( attribute.solid_size > 0 && attribute.frac_size > 0 ) {
				
				max_length = parseInt(attribute.solid_size) + parseInt(attribute.frac_size) + 1;
				field_size = parseInt(attribute.solid_size) + parseInt(attribute.frac_size) + 1;
				
			} else {
				
				max_length = 30;
				field_size = 10;
				
			}

			// Позиция данных в контейнере
			var pos = Nakopitel.getAttrContainer(attribute.attribute);

			// Идентификатор поля, на которое будет нацелена клавиатура
			var keyboard_target = '';

			// Контейнер для хранения полей ввода
			html += '<div class="fields">';

			// В зависимости от того, интервал это или нет, рисуем два или одно поле
			if( attribute.is_range == true) {

				keyboard_target = 'input-' + attribute.attribute + '-min';

				html += "от <input class='target' type='text' id='input-" + attribute.attribute + "-min' size='" + field_size + "' maxlength='" + max_length + "' onfocus='Nakopitel.setTargetField(this.id)' onchange='Nakopitel.setValueNumeric(" + attribute.attribute + ",this,-1);' value='" + (Nakopitel.formValues[pos].value.min ? Nakopitel.formValues[pos].value.min : '') + "'>";
				html += " до <input type='text' id='input-" + attribute.attribute + "-max' size='" + field_size + "' maxlength='" + max_length + "' onfocus='Nakopitel.setTargetField(this.id)' onchange='Nakopitel.setValueNumeric(" + attribute.attribute + ",this,1); ' value='" + (Nakopitel.formValues[pos].value.max ? Nakopitel.formValues[pos].value.max : '') + "' class='" + (Nakopitel.formValues[pos].value.max ? '' : 'empty') + "'  >";
				html += ' ' + attribute.unit;

			} else {

				keyboard_target = 'input-' + attribute.attribute;

				html += "<input class='target' type='text' id='input-" + attribute.attribute + "' size='" + field_size + "' maxlength='" + max_length + "' onchange='Nakopitel.setValueNumeric(" + attribute.attribute + ",this,0)' value='" + (Nakopitel.formValues[pos].value ? Nakopitel.formValues[pos].value : '') + "'>";
				html += attribute.unit;

			}

			html += '</div>';

			// Добавляем клавиатуру
			html += '<div id="keyboard"></div>'

			// Помещаем поле в контейнер для поля
			$('#attributeField').html(html);

			// Создаем объект клавиатуры
			Nakopitel.keyboard = new Keyboard('numeric', 'keyboard');
			Nakopitel.keyboard.setTarget(keyboard_target);
			Nakopitel.keyboard.place();

			delete html, max_length, field_size, attribute;

			break;



		// Целое число
		case 'integer':

			var max_length	= null;
			var field_size	= null;
			var html		= '';

			// Определяем ограничение по длине поля
			if( attribute.solid_size > 0 ) {

				max_length = parseInt(attribute.solid_size);
				field_size = parseInt(attribute.solid_size);

			} else {

				max_length = 30;
				field_size = 10;

			}

			// Идентификатор поля, на которое будет нацелена клавиатура
			var keyboard_target = '';

			// Позиция данных в контейнере
			var pos = Nakopitel.getAttrContainer(attribute.attribute);
			
			// Контейнер для хранения полей ввода
			html += '<div class="fields">';

			// В зависимости от того, интервал это или нет, рисуем два или одно поле
			if( attribute.is_range == true) {

				keyboard_target = 'input-' + attribute.attribute + '-min';

				html += "от <input class='target' id='input-" + attribute.attribute + "-min' type='text' size='" + field_size + "' maxlength='" + max_length + "' onfocus='Nakopitel.setTargetField(this.id)' onchange='Nakopitel.setValueInteger(" + attribute.attribute + ",this,-1)' value='" + (Nakopitel.formValues[pos].value.min ? Nakopitel.formValues[pos].value.min : '') + "'>";
				html += " до <input type='text' id='input-" + attribute.attribute + "-max' size='" + field_size + "' maxlength='" + max_length + "' onfocus='Nakopitel.setTargetField(this.id)' onchange='Nakopitel.setValueInteger(" + attribute.attribute + ",this,1)' value='" + (Nakopitel.formValues[pos].value.max ? Nakopitel.formValues[pos].value.max : '') + "' class='" + (Nakopitel.formValues[pos].value.max ? '' : 'empty') + "'>";
				html += attribute.unit;

			} else {

				keyboard_target = 'input-' + attribute.attribute;

				html += "<input class='target' id='input-" + attribute.attribute + "' type='text' size='" + field_size + "' maxlength='" + max_length + "' onchange='Nakopitel.setValueNumeric(" + attribute.attribute + ",this,0)' value='" + (Nakopitel.formValues[pos].value ? Nakopitel.formValues[pos].value : '') + "'>";
				html += ' ' + attribute.unit;

			}

			html += '</div>';

			// Добавляем клавиатуру
			html += '<div id="keyboard"></div>'

			// Помещаем поле в контейнер для поля
			$('#attributeField').html(html);

			// Создаем объект клавиатуры
			Nakopitel.keyboard = new Keyboard('integer', 'keyboard');
			Nakopitel.keyboard.setTarget(keyboard_target);
			Nakopitel.keyboard.place();

			delete html, max_length, field_size, attribute;

			break;



		// Текст
		case 'text':

			var size	= null;
			var html		= '';

			// Определяем ограничение по длине поля
			if( attribute.max_text_length > 0 && attribute.max_text_length < 40 ) {

				size = parseInt(attribute.max_text_length) + 3;

			} else {

				size = 40;

			}

			// Позиция данных в контейнере
			var pos = Nakopitel.getAttrContainer(attribute.attribute);

			// Идентификатор поля, на которое будет нацелена клавиатура
			var keyboard_target = 'input-' + attribute.attribute;

			// Контейнер для хранения полей ввода
			html += '<div class="fields">';

			// Рисуем HTML
			html += "<input class='target' id='" + keyboard_target + "' type='text' size='" + size + "' maxlength='" + attribute.max_text_length + "' onblur='Nakopitel.setValueText(" + attribute.attribute + ", this, 0)' value='" + (Nakopitel.formValues[pos].value ? Nakopitel.formValues[pos].value : '') + "'>";

			html += '</div>';

			// Добавляем клавиатуру
			html += '<div id="keyboard"></div>'

			// Помещаем поле в контейнер для поля
			$('#attributeField').html(html);

			// Создаем объект клавиатуры
			Nakopitel.keyboard = new Keyboard('full', 'keyboard');
			Nakopitel.keyboard.setTarget(keyboard_target);
			Nakopitel.keyboard.place();

			delete html, size, attribute;

			break;



		// Логический
		case 'boolean':

			var html		= '';

			// Позиция данных в контейнере
			var pos = Nakopitel.getAttrContainer(attribute.attribute);

			html = '<div class="boolean"><label class="' + (Nakopitel.formValues[pos].value == true ? 'active' : '') + '" onclick="Nakopitel.setValueBoolean(' + attribute.attribute + ', this)">' + attribute.title + '</label></div>';

			// Помещаем поле в контейнер для поля
			$('#attributeField').html(html);

			delete html, attribute;

			break;



		// Список
		case 'list':

			var html		= '<div class="list">';

			// Позиция данных в контейнере
			var pos = Nakopitel.getAttrContainer(attribute.attribute);

			// Флаг того, что можно установить только одно значение
			var single = false;
			if( attribute.is_multiselect != true ) {
				single = true;
			}

			html += '<ul class="values">';

			// Перебираем все имеющиеся элементы атбирута и помещаем их в контейнер
			for( var i in attribute.elements ) {

				// Флаг того, что поле было выбрано
				var checked = false;

				// Проверяем, было ли выбрано это поле ранее
				for( var k in Nakopitel.formValues[pos].value ) {
					if( Nakopitel.formValues[pos].value[k] == attribute.elements[i].value ) {
						checked = true;
					}
				}

				html += '<li id="list-element-' + attribute.attribute + '-' + attribute.elements[i].value + '" class="' + (checked ? 'active' : '') + '" onclick="Nakopitel.setValueMulti(' + attribute.attribute + ', ' + attribute.elements[i].value + ', this, ' + single + ')">';
				// Слишком длинные метки укорачиваем
				if( attribute.elements[i].label.length > 23 ) {
					html += attribute.elements[i].label.substr(0,20) + '...';
				} else {
					html += attribute.elements[i].label;
				}
				html += '</li> '

			}

			html += '</ul></div>';

			// Помещаем поле в контейнер для поля
			$('#attributeField').html(html);

			delete html, attribute;

			break;

	}


	// Снимаем прослушку всех событий кнопки
	$('#finishFormFilling').unbind();

	// В зависимости от типа действия, устанавливаем на кнопку finishFormFilling требуемый шаг
	if( Nakopitel.action == 'add' ) {

		// При добавлении

		// Вешаем на кнопку переключатель страниц
		$('#finishFormFilling').bind( 'click', function(){

			// Переход на страницу заполнения контактов
			Nakopitel.switchPage('Contact_Fill');

			// Инициализируем клавиатуру
			Nakopitel.keyboard = new Keyboard('full', 'contactKeyboard');
			Nakopitel.keyboard.setTarget('contactField');
			Nakopitel.keyboard.place();

		} );

	} else {

		// При поиске

		// Вешаем поисковый запрос
		$('#finishFormFilling').click( function(){

			// Навешиваем на кнопку "город-по-умолчанию" событие
			$('#defaultCityButton').unbind().bind('click', Nakopitel.search );
			
			// Показываем примечания для поиска
			$('#Region_Default .search').show();

			// Переключаемся на страницу выбора региона
			Nakopitel.switchPage('Region_Default');

		} );

	}

}


// Печатает объявление
Nakopitel.print = function() {

	// Объявления для печати
	var text = '';
	var counter = 1;
	for(var i in Nakopitel.searchResult) {
		text += counter + '. ' + Nakopitel.searchResult[i].text + Nakopitel.searchResult[i].contact + "\n";
		counter++;
	}

	// Включаем метку "Печать", скрываем кнопку
	$('#printButton').hide();
	$('#printStatus').show();


	// Аяксовый запрос на печать
		$.ajax({
			/*url: "/soap.php",*/
			url: "/print.py/print_all",
			type: "POST",
			error: function(XMLHttpRequest, textStatus, errorThrown){
				Nakopitel.errorCounter++;
				if( Nakopitel.errorCounter > 10 ) {
					Nakopitel.reset();
				}
				$('#Processing .message p').show();
				Nakopitel.print();
			},
			/*data: ( { command: 'print', 'text' : text} ),*/
			data: ( { 'text' : text} ),
			dataType: "text",
			success: function(response){

				if(response == 'OK') {

					// Переходим на главную страницу
					Nakopitel.reset();
					
				} else {
				
					alert('В процессе печати возникла ошибка');
				
				}


			}
		});
	
}




// Ищет объявления
Nakopitel.search = function() {

	// Показываем страницу "Подождите"
	Nakopitel.switchPage('Processing');

	// Собираем данные формы в один массив
	var params = {};
	params.command = 'search';
	params.category = Nakopitel.category;
	params.region = Nakopitel.region;

	for( var i in Nakopitel.formValues ) {

		var attr = Nakopitel.formValues[i];

		// Получаем объект атрибута
		var field = Nakopitel.getField(attr.id);

		switch(field.type) {

			case 'integer':
			case 'numeric':
			case 'date':
				if(field.is_range) {
					if( attr.value.min != null ) {
						params['data-' + attr.id + '-min'] = attr.value.min;
					}
					if( attr.value.max != null ) {
						params['data-' + attr.id + '-max'] = attr.value.max;
					}

				} else {
					if( attr.value != null ) {
						params['data-' + attr.id] = attr.value;
					}
				}

				break;


			case 'boolean':
			case 'text':
				if( attr.value != null ) {
					params['data-' + attr.id] = attr.value;
				}
				break;

			case 'list':
				if( attr.value.length > 0 ) {
					params['data-' + attr.id + '[]'] = attr.value;
				}
				break;

		}
	}

	// Показываем страницу "Подождите"
	Nakopitel.switchPage('Processing');

	// Выполняем поисковый запрос
	$.ajax({
		url: "/soap.php",
		type: "POST",
		error: function(XMLHttpRequest, textStatus, errorThrown){
			Nakopitel.errorCounter++;
			if( Nakopitel.errorCounter > 10 ) {
				Nakopitel.reset();
			}
			$('#Processing .message p').show();
			Nakopitel.search();
		},
		data: ( params ),
		dataType: "json",
		success: function(response){

			// Если была ошибка, заканчиваем работу
			if( typeof(response) != 'object' ) {

				alert('Hakuna Matata!');

			} else {

				// Если ничего не найдено, сообщаем об этом
				if( response.length == 0 ) {

					Nakopitel.switchPage('Search_Result_Empty');

				} else {

					// Помещаем результат поиска в хранилище
					Nakopitel.searchResult = response;

					// Получаем несколько первых объявлений для показа
					var count = 3;
					if( Nakopitel.searchResult.length < 3 ) {
						count = Nakopitel.searchResult.length;
					}
					html = '';
					for( var i = 0; i < count; i++ ) {
						html += '<p>' + Nakopitel.searchResult[i].text + '</p>';
					}

					// Помещаем HTML в поле предпросмотра
					$('#searchPreview').html(html);

					// Склоняем слово "объявление" в зависимости от количества
					var word = '';
					var length = Nakopitel.searchResult.length + '';
					if( length.length == 1 || length.substr(-2,1) > 1 ) {
						var symbol = length.substr(-1,1);
						if( symbol == 1 ) {
							word = 'объявление';
						} else if( symbol >= 2 && symbol <= 4 ) {
							word = 'объявления';
						} else {
							word = 'объявлений';
						}
					} else {
						word = 'объявлений';
					}

					// Помещаем количество объявлений в счетчик найденных объявлений
					$('#foundCount').text(Nakopitel.searchResult.length);
					$('#printButton button').text('Напечатать ' + Nakopitel.searchResult.length + ' ' + word);

					// Выключаем метку "Печать", показываем кнопку печати
					$('#printButton').show();
					$('#printStatus').hide();

					// Включаем страницу с результатами поиска
					Nakopitel.switchPage('Search_Result');

				}

			}

		}
	});

}





// Подает объявление
Nakopitel.add = function() {

	// Если контактная информция не указана, ничего не делаем
	if( $('#contactField').val() == '' ) {
		return;
	}

	// Собираем данные для добавления в один массив
	var params = {};
	params.command = 'add';
	params.category = Nakopitel.category;
	params.region = Nakopitel.region;
	params.contact = $('#contactField').val();

	for( var i in Nakopitel.formValues ) {

		var attr = Nakopitel.formValues[i];

		// Получаем объект атрибута
		var field = Nakopitel.getField(attr.id);

		switch(field.type) {

			case 'integer':
			case 'numeric':
			case 'date':
				if(field.is_range) {
					if( attr.value.min != null ) {
						params['data-' + attr.id + '-min'] = attr.value.min;
					}
					if( attr.value.max != null ) {
						params['data-' + attr.id + '-max'] = attr.value.max;
					}

				} else {
					if( attr.value != null ) {
						params['data-' + attr.id] = attr.value;
					}
				}

				break;


			case 'boolean':
			case 'text':
				if( attr.value != null ) {
					params['data-' + attr.id] = attr.value;
				}
				break;

			case 'list':
				if( attr.value.length > 0 ) {
					params['data-' + attr.id + '[]'] = attr.value;
				}
				break;

		}
	}

	// Выполняем поисковый запрос
	$.ajax({
		url: "/soap.php",
		type: "POST",
		error: function(XMLHttpRequest, textStatus, errorThrown){
			Nakopitel.errorCounter++;
			if( Nakopitel.errorCounter > 10 ) {
				Nakopitel.reset();
			}
			$('#Processing .message p').show();
			Nakopitel.add();
		},
		data: ( params ),
		dataType: "json",
		success: function(response){

			// Если была ошибка, заканчиваем работу
			if( response == false ) {

				alert('Hakuna Matata!');

			} else {

				// Помещаем идентификатор объявления в контейнер
				$('#serial').text(response.id + '-' + response.code);

				// Включаем страницу с результатом добавления
				Nakopitel.switchPage('Add_Result');

			}

		}
	});


}



// Получает позицию объекта для значения атрибута по номеру атрибута в списке значений
Nakopitel.getAttrContainer = function(id) {

	for(var i in Nakopitel.formValues) {
		if(Nakopitel.formValues[i].id == id) {
			return i;
		}
	}

	return false;

}


// Получает объект поля
Nakopitel.getField = function(id) {

	for(var i in Nakopitel.formAttributes) {
		if(Nakopitel.formAttributes[i].attribute == id) {
			return Nakopitel.formAttributes[i];
		}
	}

	return false;

}



// Устанавливает значение числа с точкой
Nakopitel.setValueNumeric = function(id, obj, type) {

	// Получаем значение
	var value = obj.value;

	// Убираем посторонние символы
	value.replace(/[^0-9.,]/g, '');

	// Заменяем запятые на точки
	value.replace(',', '.');

	// Если у нас не настоящее дробное число, приводим его к числу
	if( isNaN(value) ) {
		value = parseFloat(value);
	}

	// Если полученное значение неправильное, очищаем поле
	if( isNaN(value) ) {
		obj.value = '';
		return;
	}

	// Помещаем новое значение в поле
	obj.value = value;

	// Получаем ссылку на контейнер, который хранит значение атрибута
	var pos = Nakopitel.getAttrContainer(id);

	// В зависимости от типа поля, помещаем значение в нужный кусок параметра
	switch(type) {

		// Интервал - min
		case -1:
			Nakopitel.formValues[pos].value.min = value;
			break;

		// Интервал - max
		case 1:
			Nakopitel.formValues[pos].value.max = value;
			break;

		// Одиночное значение
		case 0:
			Nakopitel.formValues[pos].value = value;
			break;

	}

}


// Устанавливает значение целого числа
Nakopitel.setValueInteger = function(id, obj, type) {

	// Приводим значение к числу
	var value = obj.value;
	value = parseInt(value);

	// Если значение неправильное, очищаем поле
	if( isNaN(value) ) {
		obj.value = '';
		return;
	}

	// Помещаем новое значение в поле
	obj.value = value;

	// Получаем ссылку на контейнер, который хранит значение атрибута
	var pos = Nakopitel.getAttrContainer(id);

	// В зависимости от типа поля, помещаем значение в нужный кусок параметра
	switch(type) {

		// Интервал - min
		case -1:
			Nakopitel.formValues[pos].value.min = value;
			break;

		// Интервал - max
		case 1:
			Nakopitel.formValues[pos].value.max = value;
			break;

		// Одиночное значение
		case 0:
			Nakopitel.formValues[pos].value = value;
			break;

	}

}



// Устанавливает значение текста
Nakopitel.setValueText = function(id, obj, type) {

	// В зависимости от типа, получаем содержимое поля
	if( type == 1 ) {

		// textarea
		var value = obj.value.toString();

	} else {

		// input
		var value = obj.value;

	}

	// Получаем ссылку на контейнер, который хранит значение атрибута
	var pos = Nakopitel.getAttrContainer(id);

	// Помещаем значение в контейнер
	Nakopitel.formValues[pos].value = value;

}


// Устанавливает значение чекбокса
Nakopitel.setValueBoolean = function(id, obj) {

	// Получаем ссылку на контейнер, который хранит значение атрибута
	var pos = Nakopitel.getAttrContainer(id);

	// Проверяем, установлено ли свойство ранее и в зависимости от этого меняем его
	if( Nakopitel.formValues[pos].value ) {

		// Очищаем свойство
		Nakopitel.formValues[pos].value = null;

		// Меняем оформление
		$('#attributeField .boolean label').removeClass('active');

	} else {

		// Устанавливаем свойство
		Nakopitel.formValues[pos].value = true;

		// Меняем оформление
		$('#attributeField .boolean label').addClass('active');

	}

}


// Очищает список
Nakopitel.setValueMultiClear = function(id) {

	// Получаем ссылку на контейнер, который хранит значение атрибута
	var pos = Nakopitel.getAttrContainer(id);

	// Очищает значение в контейнере
	Nakopitel.formValues[pos].value = [];

	// Снимает метку "Активно" для всех элементов списка
	$('#attributeField .list label').removeClass('active');

}


// Устанавливает список
Nakopitel.setValueMulti = function(id, value, obj, single) {

	// Контейнер значений
	var vals = [];

	// Получаем ссылку на контейнер, который хранит значение атрибута
	var pos = Nakopitel.getAttrContainer(id);

	// Получаем все имеющиеся на текущий момент значения
	var current_vals = Nakopitel.formValues[pos].value;

	// Если можно выбирать только одно значение
	if( single ) {

		// Очищаем все значения, а точнее не заполняем новый массив со значениями
		// nop

		// Перебираем имеющиеся значения.
		// Если в них есть выбранное, то снимаем оформление кнопки
		// и ничего не добавляем, в противном случае добавляем оформление и
		// помещаем выбранное значение в контейнер
		var found = false;
		for( var i in current_vals ) {
			if(current_vals[i] == value ) {
				found = true;
				break;
			}
		}

		// Выполняем очистку значений
		Nakopitel.setValueMultiClear(id);

		if( found ) {
			$('#' + obj.id).removeClass('active');
		} else {
			vals[0] = value;
			$('#' + obj.id).addClass('active');
		}

	} else {

		// Можно выбирать несколько значений

		vals = current_vals;

		// Нужно найти текущее значение в списке значений.
		// Если будет найдено, то нужно удалить его оттуда и снять выделение с метки.
		// Иначе добавить значение и установить выделение метки.

		var found = false;
		for( var i in vals ) {
			if(vals[i] == value ) {
				found = true;
				break;
			}
		}

		if( found ) {

			// ** Найдено

			// Убрать значение
			vals.splice(i, 1);

			// Снять выделение
			$('#' + obj.id).removeClass('active');

		} else {

			// ** Не найдено

			// Добавить значение
			vals[vals.length] = value;

			// Снять выделение
			$('#' + obj.id).addClass('active');

		}

	}

	// Помещаем значения в контейнер
	Nakopitel.formValues[pos].value = vals;

}

