/**
 * Через этот объект организуется доступ к утилитам (микромодулям) сайта.
 */
var sAPI = {};

/* Флеш-планировки
------------------------------------------------------------------------------------------------------------------- */
sAPI.flashplan = {
	init: function() {
		var ns = this;
		
		this.dom.nav = $('#flashplan-nav');
		this.dom.content = $('#flashplan-content');
		
		if (this.dom.nav.length) {
			
			if (this.dom.content.length) {
				var flashvars = {};
				
				if (location.href.indexOf('floor=') != -1) {
					var floor = location.href.match(/floor=(\d+)/)[1];
					
					flashvars.goto_floor = floor;					
				}
				
				swfobject.embedSWF('sites/default/themes/default/media/sphere_plan.swf', 'flashplan-content', '620', '700', '8.0.0', 'sites/default/themes/default/media/expressInstall.swf', flashvars,  { wmode: 'opaque' }, null, function(props) {
					ns.dom.flash = props.ref;
				});
			}
			
			this.dom.nav.find('>li>a').click(function() {
				return false;
			});
			
			if ($('.room-plan-header').length) {
				this.dom.nav.find('>li:lt(2)>a').unbind('click');
			}
			
			this.dom.nav.delegate('li.options-selectable', 'mouseenter', function() {
				$(this).addClass('options-selecting');
			}).delegate('li.options-selectable', 'mouseleave', function() {
				$(this).removeClass('options-selecting');
			});
			
			if (!$('.room-plan-header').length) {
				this.dom.nav.find('>li:eq(0) ul').delegate('a', 'click', function() {
					var link = $(this), listElement = link.parent();
					
					ns.dom.flash.SetVariable('goto_floor', listElement.index() + 1);
					
					return false;
				});
			}
			
			var emailControlContainer = $('#node-reservationreq').find('div.mode-email');
			var phoneControlContainer = emailControlContainer.next();
			
			var emailControlInput = emailControlContainer.find('input');
			var phoneControlInput = phoneControlContainer.find('input');
			
			emailControlContainer.find('label').html('Контактная информация:<em>*</em><br /><span>Одно из полей обязательно для заполнения</span>').end().find('input').val('Email').data('val', 'Email');
			phoneControlContainer.find('label').css('visibility', 'hidden').end().find('input').val('Телефон').data('val', 'Телефон');
			
			emailControlContainer.add(phoneControlContainer).find('input').addClass('labels-in-inputs').click(function() {
				if ($(this).val() == $(this).data('val') ) {
					$(this).removeClass('labels-in-inputs').val('');
				}
				$(this).parents('div.control').removeClass('error');
			}).blur(function() {
				if ($(this).val() === '') {
					$(this).addClass('labels-in-inputs').val($(this).data('val') );
				}
			});
			
			$('#node-reservationreq').find('select option:first').remove();
			
			$('#node-reservationreq').submit(function() {
				var form = $(this), requiredFields = form.find('div.required input'), passed = true;
				
				requiredFields.each(function() {
					if ($(this).val() === '') {
						$(this).parents('div.control').addClass('error');
						passed = false;
					} else {
						$(this).parents('div.control').removeClass('error');
					}
				}).unbind('keyup.validate').bind('keyup.validate', function() {
					if ($(this).val() === '') {
						$(this).parents('div.control').addClass('error');
					} else {
						$(this).parents('div.control').removeClass('error');
					}
				});
				
				if ( (emailControlInput.val() == emailControlInput.data('val') || emailControlInput.val() === '') && (phoneControlInput.val() == phoneControlInput.data('val') || phoneControlInput.val() === '') ) {
					emailControlContainer.add(phoneControlContainer).addClass('error');
					passed = false;
				}
				
				return passed;
			});
			
			/* печать */
			$('.room-plan-header a.print').click(function() {
				window.print();				
				
				return false;
			});
			
			this.fixIE6ListWidth();
		}
		
	},
	dom: {},
	/**
	 * Здесь храняться данные, необходимые для работы с планом.
	 * Объект заполняется из HTML (чтобы не делать доп. запросы через JS).
	 * Структура заполненного объекта такая: массив корпусов, в них массив этажей, в них массив с данными о помещениях (id, статус):
	 * buildings: [
	 *   [
	 *     [
	 *       [{ id: 5, status: 3}],
	 *       [{ id: 6, status: 1}]
	 *     ]
	 *   ]
	 * ]
	 */
	// пока только 1 корпус
	buildings: [[]],
	showFloor: function(floor) {
		var floorName, floorLastDigit = parseInt(floor.substr(floor.length - 1, 1), 10), floorSuffix, ns = this;
		
		if (floorLastDigit == 2) {
			floorSuffix = 'ой';
		} else if (floorLastDigit == 3) {
			floorSuffix = 'ий';
		} else {
			floorSuffix = 'ый';
		}
		
		floorName = floor + '-' + floorSuffix + ' этаж';
		
		this.dom.nav.find('>li:eq(1)').addClass('active').removeClass('disabled').siblings().removeClass('active');
		this.dom.nav.find('>li:eq(0)').addClass('options-selectable').find('>a>span').text(floorName);
		
		this.fixIE6ListWidth();
		
		if (this.buildings[0][floor - 1]) {
			for (var i = 0; i < 50; i++) {
				ns.dom.flash.SetVariable('b' + (i + 1), this.buildings[0][floor - 1][i] ? this.buildings[0][floor - 1][i].status : 1);
			}
		}
	},
	showRoom: function(floor, room) {
		var roomData = this.buildings[0][floor - 1] ? this.buildings[0][floor - 1][room - 1] : {};
		
		if (roomData.id) {
			location.href = mcms.system.lp + '/node/' + roomData.id + '?floor=' + floor;
		}
		
	},
	fixIE6ListWidth: function() {
		/* ie6 как всегда прекрасен */
		if ($.browser.msie && $.browser.version == 6) {
			$('#flashplan-nav>li').each(function() {
				var listElement = $(this), listInside = listElement.find('ul');
				
				listInside.width(listElement.width() );
			});
		}
	}
};
/* ---------------------------------------------------------------------------------------------------------------- */


$(function() {
	
	$('body').addClass('js-enabled');
	
	var highlights = {
		dom: {
			elements: $('#highlights ul.list>li')
		},
		queued: 0,
		flushQueue: function() {
			var highlightsNamespace = this, active = this.dom.activeElement, queued = this.queued, next = this.dom.elements.eq(queued).show();
			
			this.busy = true;
			
			var nextLoaders = next.next().add(next.prev() ).find('img.loading');
			
			if (nextLoaders.length) {
				nextLoaders.each(function() {
					var el = $(this), imageSrc = el.attr('longdesc');
					//	setTimeout(function() {
					var img = $('<img class="object" alt="' + el.attr('title') + '" />').bind('load', function() {
						el.fadeOut(500, function() {
							el.remove();
						});
						img.animate({
							'opacity': 1
						}, 750);
					}).css('opacity', 0.01).appendTo(el.parent() ).attr('src', imageSrc);
					//} ,3000);
				});
			}
			
			active.fadeOut(750, function() {
				next.addClass('active').removeClass('next');
				active.removeClass('active');
				highlightsNamespace.busy = false;
				if (highlightsNamespace.queued != queued) {
					highlightsNamespace.flushQueue();
				}
			});
			
			highlights.dom.activeElement = next.addClass('next');
		},
		enqueue: function(direction) {
			if (direction == 'right') {
				this.queued++;
				if (this.queued == this.dom.elements.length) {
					this.queued = 0;
				}
			} else {
				this.queued--;
				if (this.queued < 0) {
					this.queued = this.dom.elements.length - 1;
				}
			}
			if (!this.busy) {
				this.flushQueue();
			}
		},
		busy: false
	};
	
	highlights.dom.activeElement = highlights.dom.elements.filter('.active');
	
	$(document).keyup(function(e) {
		if (e.keyCode == 37) {
			highlights.enqueue('left');
		} else if (e.keyCode == 39) {
			highlights.enqueue('right');
		}
	});
	
	if ($.browser.msie && $.browser.version < 7) {
		$('#logo img, #highlights img.left , #highlights img.right, img.special-offers, ul.states li img, ul.objects li.object div.illustration a img[src $= ".png"]').fixpng();
	}
	
	$('#highlights-map-left area').click(function() {
		highlights.enqueue('left');
		return false;
	});
	
	$('#highlights-map-right area').click(function() {
		highlights.enqueue('right');
		return false;
	});
	
	$('area').mouseup(function() {
		//this.blur();
	});
	
	$('#content-primary table tr:even').addClass('even');
	
	$('#content-primary ul.vacancies').delegate('li h3', 'click', function() {
		$(this).parent().toggleClass('expanded');
	});
	
	
	/* Блокировка страницы
	------------------------------------------------------------------------------------------------------------------- */
	var fader = {
		init: function() {
			var namespace = this;
			
			this.dom.fader = $('<div id="fader" />').appendTo('body').css('opacity', 0.6).bind('click.defaultHandler', function() {
				namespace.hide();
			});
			
			this.fit();
			
			$(window).resize(function() {
				namespace.fit();
			});
		},
		dom: {},
		fit: function() {
			this.dom.fader.width($(window).width() ).height($(document).height() );
		},
		show: function() {
			this.fit();
			this.dom.fader.fadeIn(250);
		},
		hide: function() {
			this.dom.fader.fadeOut(250);
		}
	};
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	
	/* Вакансии
	------------------------------------------------------------------------------------------------------------------- */
	var vacancies = {
		init: function() {
			var ns = this;
			
			fader.init();
			fader.dom.fader.bind('click.vacancies', function() {
				$('#pup').remove();
			});
			
			$('body').delegate('#pup a.close, #pup a.back', 'click', function() {
				fader.hide();
				$('#pup').remove();
				
				return false;
			});
			
			$('#content-primary ul.vacancies p.apply a').click(function() {
				var link = $(this);
				
				fader.show();
				
				fader.dom.fader.bind('click.resume-form', function() {
					$('#pup').remove();
					$(this).unbind('click.resume-form');
				});
				
				$.get('.', {
					'get-resume-form': location.href.match(/\d+/)[0]
				}, function(response) {
					var container = $(response).filter('#pup');
					
					$('<div class="post">' + link.parents('li:first').find('>h3').text() + '</div>').insertAfter(container.find('h2') );
					$('<div class="note">Выделенные поля обязательны для заполнения</div>').insertAfter(container.find('div.post') );
					
					container.appendTo('body').css('top', function() {
						var container = $(this), calculated = $(document).scrollTop() + $(window).height() / 2 - container.height() / 2, corrected = calculated;
						
						if (corrected < 18) {
							corrected = 18;
						}
						
						if (corrected + container.height() > $(document).height() && container.height() < $(document).height() ) {
							corrected = $(document).height() - container.height() - 18;
						}
						
						return corrected;
					});
					
					/* проверка введенных значений */
					container.find('form').submit(function() {
						/* при отправке */	
						var form = $(this), passed = true;
						
						form.find('div.required').each(function() {
							
							if (!ns.validateInput($(this) ) ) {
								passed = false;
							}
							
						});
						
						return passed;
					}).delegate('div.required.error input', 'keyup change', function() {
						/* при исправлении ранее неверно введенного значения */
						ns.validateInput($(this).parent() );
					}).delegate('div.required input', 'blur', function() {
						/* при переходе с поля */
						ns.validateInput($(this).parent() );
					});
					
				});
				
				return false;
			});
			
		},
		dom: {},
		emailRe: /^([0-9a-zA-Z]+[\-._+&amp;])*[0-9a-zA-Z]+@([\-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$/,
		/**
		 * Проверяет правильность заполения поля
		 * @param {Object} container
		 */
		validateInput: function(container) {
			var ns = this, value = container.find('input').val(), passed = true, message = '';
			
			container.removeClass('error').find('span.error').remove();
			
			if (container.is('.mode-email') && !ns.emailRe.test(value) ) {
				passed = false;
				message = 'Неправильный формат адреса электронной почты';
			}
			
			if (value === '') {
				passed = false;
				message = 'Это поле нужно заполнить';
			}
			
			if (!passed) {
				container.addClass('error').append('<span class="error">' + message + '</span>');
			}
			
			return passed;
		}
	};
	
	if ($('#content-primary ul.vacancies').length) {
		vacancies.init();
	}
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	/* Объект
	------------------------------------------------------------------------------------------------------------------- */
	var object = {
		init: function () {
			var namespace = this;
			
			this.total = this.dom.list.find('li').length;
			
			$('div.object-node div.dynamics img.next').click(function() {
				if (namespace.position < namespace.total - 5) {
					namespace.position++;
					namespace.dom.list.animate({
						'margin-left': - 144 * namespace.position
					}, 250);
				}
			});
			
			$('div.object-node div.dynamics img.prev').click(function() {
				if (namespace.position > 0) {
					namespace.position--;
					namespace.dom.list.animate({
						'margin-left': - 144 * namespace.position
					}, 250);
				}
			});
			
			$(document).keyup(function(e) {
				if (e.keyCode == 37) {
					$('div.object-node div.dynamics img.prev').click();
				} else if (e.keyCode == 39) {
					$('div.object-node div.dynamics img.next').click();
				}
			});
		},
		dom: {
			list: $('div.object-node div.dynamics ul')
		},
		position: 0
	};
	
	if ($('div.object-node').length) {
		object.init();
	}
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	
	/* Контакты
	------------------------------------------------------------------------------------------------------------------- */
	var contacts = {
		init: function() {
			var ns = this;
			
			this.dom.map = $('#map');
			this.dom.departmentSelect = $('#select-company-department select');
			this.dom.departmentFeedbackInput = $('<input type="hidden" name="topic" />').appendTo('#node-feedback>div:first');
			
			this.currentDepartmentIdx = this.dom.departmentSelect.find('option:selected').index();
			
			$('ul.contacts li').each(function() {
				var element = $(this), 
					rawLatlng = element.find('div.latlng').text().split(','), 
					latlng = new google.maps.LatLng(parseFloat(rawLatlng[0]), parseFloat(rawLatlng[1]) );
				
				var infoWindow = new google.maps.InfoWindow({
				    content: element.find('div.maptext').html(),
					position: latlng
				});
				
				var zoom = parseInt(element.find('div.zoom').text(), 10);
				
				ns.infoWindows.push(infoWindow);
				ns.zooms.push(zoom);
			});
			
			$('#node-feedback div.text label.t').each(function() {
				var label = $(this), input = label.siblings('textarea, input'), text = label.text();
				
				input.val(text.substring(0, text.length - 2) );
				
				label.remove();
			});
			
			this.echoDepartmentChange(this.dom.departmentSelect.val() );
			
			
			$('#node-feedback').delegate('div.text:not(.dirty)', 'focusin', function() {
				$(this).addClass('dirty').find('input, textarea').val('');
			});
			
			this.dom.departmentSelect.change(function() {
				var select = $(this);
				
				ns.currentDepartmentIdx = select.find('option:selected').index();
				
				$('ul.contacts li:eq(' + ns.currentDepartmentIdx + ')').addClass('active').siblings().removeClass('active');
				
				ns.fitMap();
				
				ns.map.setZoom(ns.zooms[ns.currentDepartmentIdx]);
				
				ns.map.setCenter(ns.infoWindows[ns.currentDepartmentIdx].getPosition() );
				
				$.each(ns.infoWindows, function() {
					this.close();
				});
				
				ns.infoWindows[ns.currentDepartmentIdx].open(ns.map);
				
				ns.echoDepartmentChange(select.val() );
			});
			
			$(window).load(function() {
				ns.fitMap();
				
				ns.map = new google.maps.Map(ns.dom.map[0], {
					zoom: ns.zooms[ns.currentDepartmentIdx],
					center: ns.infoWindows[ns.currentDepartmentIdx].getPosition(),
					mapTypeId: google.maps.MapTypeId.ROADMAP,
					navigationControlOptions: {
						style: google.maps.NavigationControlStyle.ZOOM_PAN
					}
				});
				
				ns.infoWindows[ns.currentDepartmentIdx].open(ns.map);
			});
			
			
			var emailRe = /^([0-9a-zA-Z]+[\-._+&amp;])*[0-9a-zA-Z]+@([\-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$/;
			
			$('#node-feedback').find('div.required.mode-email input').bind('blur', function() {
				var input = $(this), value = input.val();
				
				if (value !== '' && !emailRe.test(value) ) {
					input.parents('div:first').addClass('error');
				} else {
					input.parents('div:first').removeClass('error');
				}
			});
			
			$('#node-feedback').find('div.required input, div.required textarea').bind('keyup change', function() {
				var input = $(this), value = input.val(), controlContainer = input.parents('div:first');
				
				if (value !== '' && !controlContainer.is('.mode-email') || controlContainer.is('.mode-email') && emailRe.test(value) ) {
					controlContainer.removeClass('error');
				}
			});
		
			$('#node-feedback').submit(function() {		
				var form = $(this), passed = true;
				
				form.find('div.required').each(function() {
					var element = $(this), value = element.find('input, textarea').val();
					
					if (value === '' || element.is('.mode-email') && !emailRe.test(value) ) {
						element.addClass('error');
						passed = false;
					}
					
				});
				
				return passed;
			});
			
		},
		dom: {},
		map: null,
		infoWindows: [],
		zooms: [],
		currentDepartmentIdx: null,
		echoDepartmentChange: function(value) {			
			this.dom.departmentFeedbackInput.val(value);
		},
		fitMap: function() {
			var height = $('#content-secondary').height() - 60;
			
			this.dom.map.height(height);
			
			if (this.map) {
				google.maps.event.trigger(this.map, 'resize');
			}
			
		}
	};
	
	if ($('body.contacts').length) {
		contacts.init();
	}
	/* ---------------------------------------------------------------------------------------------------------------- */
	
	/* флешка в шапке */
	$('<div id="sphere" />').appendTo('#header');
	
	swfobject.embedSWF('sites/default/themes/default/media/sphere_video_fx.swf', 'sphere', '140', '140', '8.0.0', 'sites/default/themes/default/media/expressInstall.swf', null, { wmode: 'transparent' }, null);
	
	/* интро */
	swfobject.embedSWF('sites/default/themes/default/media/enter.swf', 'splash', '100%', '100%', '8.0.0', 'sites/default/themes/default/media/expressInstall.swf', { link: './?nosplash=1' }, null, null);
	
	// галереи
	$("a[rel^='prettyPhoto']").prettyPhoto();
});

$.fn.fixpng = function() {
	
	this.each(function() {
		var src = this.src;
		this.src = "sites/default/themes/default/images/pixel.png";
		this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='crop')";
	});
	
	return this;
};



$(function() {
	sAPI.flashplan.init();
});



