String.prototype.trimSpaces = function() {
	string = this.replace(/\s+/g, '');
	return parseInt(string);
};

String.prototype.getArray = function() {
	var array = [];
	var letter;
	
	for(var i = 0; i < this.length; i++ ) {
		letter = this.charAt(i);
		array.push(parseInt(letter));
	}
	return array;
};

Number.prototype.insertSpaces = function(number) {
	var number = this.toString();
	var index = number.length;
	var partsOfNumber = [];
	
	while(index > 3) {
		index -= 3;
		partsOfNumber.unshift(number.substr(index,3));
	}
	partsOfNumber.unshift(number.substr(0,index));
	
	return partsOfNumber.join(" ");
};
var LightBoxSettings = {
	overlayBgColor: '#fff',
	overlayOpacity:	0.6,
	imageLoading: '/i/s/lbox/loading.gif',
	imageBtnPrev: '/i/s/lbox/prev.gif',
	imageBtnNext: '/i/s/lbox/next.gif',
	imageBtnClose: '/i/s/lbox/close.gif',
	imageBlank:	'/i/s/lbox/blank.gif',
	txtImage: 'Изображение',
	txtOf: 'из'
};

var NewsSlider = {
	init: function() {
		this.slider = $("#newsSlider");
		
		this.prev = $(this.slider).children("div.leftScroll");
		this.next = $(this.slider).children("div.rightScroll");
		
		var container = $(this.slider).children("ul");
		var news = $(container).children();
		
		this.origin = $(news).eq(0);
		this.step = $(this.origin).outerWidth();
		this.stepLength = $(news).length;
		this.stepInWindow = $(container).width() / this.step;
		
		this.current = 0;
		
		$(this.next).click(function(e){
			e.preventDefault();
			e.stopPropagation();
			
			NewsSlider.current--;
			NewsSlider.slide();
		});
		
		$(this.prev).click(function(e){
			e.preventDefault();
			e.stopPropagation();
			
			NewsSlider.current++;
			NewsSlider.slide();
		});
		
		this.check();
	},
	slide: function() {
		var newOffset = this.current * this.step;
		
		this.check();
		this.origin.animate({marginLeft: newOffset}, {
			duration: 600,
			queue: false
		});
	},
	check: function() {
		var diff = this.current + this.stepLength;
	
		if (diff <= this.stepInWindow ) {
			this.next.hide();
			
		} else {
			this.next.show();
		}
		
		if (this.current >= 0) {
			this.prev.hide();
			
		} else {
			this.prev.show();
		}
	}
};

var IconMovement = {
	init: function() {
		this.container = $("#content");
		this.items = $("div.frame, a.link, a.title", this.container);
		this.globalZIndex = 100;
		
		$(this.items).click()
		
		this.items.bind({
			mousedown: function(e) {
				e.preventDefault();
				IconMovement.catchIcon(e);
			},
			click: function(e) {
				e.preventDefault();
			}
		});
		
	},
	catchIcon: function(e) {
		
		this.icon = $(e.target).closest("div.item");
		this.iconOffset = $(this.icon).offset();
		
		var containerOffset = $(this.container).offset();
		
		this.correctX = e.clientX - this.iconOffset.left + containerOffset.left;
		this.correctY = e.clientY - this.iconOffset.top + containerOffset.top;
		
		$(this.icon).css("z-index", this.globalZIndex++);
		
		$(document).bind("mousemove", this.drag);
		$(document).bind("mouseup", this.drop);
	},
	drag: function(e) {
		var SELF = IconMovement;
		e.preventDefault();
		
		SELF.icon.css({
				left: e.clientX - SELF.correctX + "px",
				top: e.clientY - SELF.correctY + "px"
			});
	},
	drop: function(e) {
		e.preventDefault();
		
		$(document).unbind("mousemove",this.drag);
		$(document).unbind("mouseup",this.drop);
		
		IconMovement.checkChanges(e);
	},
	checkChanges: function(e) {
		var SELF = IconMovement;
		var offset = $(SELF.icon).offset();
		
		if (offset.left === SELF.iconOffset.left && offset.top === SELF.iconOffset.top) {
			location.href = $("a:first", SELF.icon).attr("href");
		}
	}
};

var SidebarMenu = {
	init: function() {
		var SELF = this;
		
		this.items = $("#sidebar > ul > li").filter(function(index, element) {
			return SELF.hasSubMenu(element);
		});
		
		$(" > a", this.items).click(function(e) {
			e.preventDefault();
			SidebarMenu.menuItemSwitch(e.target);
		});
	},
	hasSubMenu: function(element) {
		var submenu = $("ul", element).length;
		return !!submenu;
	},
	menuItemSwitch: function(link) {
		var subMenu = $(link).next('ul');
		var isOpen = $(subMenu).is(':visible');
		
		if (isOpen) {
			this.close(subMenu);
		} else {
			this.open(subMenu);
		}
	},
	open: function(subMenu) {
		$(subMenu).slideDown('400');
	},
	close: function(subMenu) {
		$(subMenu).slideUp('400');
	}
};

var Storage = {
	data: {
	},
	changeMonthValue: function(prefix, position, value) {
		var rowID = position[1];
		var index = position[0];
		
		if (!this.data[rowID]) {
			this.addRow(rowID);
		}
		if (this.data[rowID][index] !== 1) {
			this.data[rowID][index] = value;
		}
		
		this.send(prefix, rowID);
	},
	changeRowValue: function(prefix, rowID, value) {
		var counter = 0;
		
		if (!this.data[rowID]) {
			this.addRow(rowID);
		}
		for(var i = 0; i < this.data[rowID].length; i++ ) {
			if (this.data[rowID][i] !== 1 && this.data[rowID][i] !== value) {
				this.data[rowID][i] = value;
				counter++;
			}
		}
		
		this.send(prefix, rowID);
		return counter;
	},
	addRow: function(storageID) {
		var storageString = $("#" + storageID).html();
		
		this.data[storageID] = storageString.getArray();
	},
	send: function(prefix, storageID) {
		var storageString = this.data[storageID].join('');
		var objectToSend = {};
		objectToSend['order'] = {};
		
		objectToSend['order'][storageID] = storageString;
		objectToSend['location'] = prefix;
		
		$.post("/outdoor/order?location=" + prefix, objectToSend);
	}
};

var BookingTable = {
	init: function() {
		this.discountFactor = 0.9;
		this.table = $("#bookingTable");
		this.prefix = $("tbody").attr("rel");
		
		this.cost = $("#price em");
		this.discount = $("#discount em");
		this.costValue = $(this.cost).html().trimSpaces();
		
		var allRows = $("tr:not(.first, .month)", this.table);
		
		allRows.each(function(index, row) {
			BookingTable.initRow(row);
		});
	},
	initRow: function(row) {
		var rowID = $(row).attr('id');
		var storageID = rowID.replace(/\D*/, '');  // clear if relocate price
		
		var storage = $("#" + storageID);  // clear if relocate price
		
		this.Prices[storageID] = parseInt($(storage).attr('rel'));
		this.Months[storageID] = $("td > div", row);

		this.Months[storageID].each(function(index, element) {
			$(element).attr('index', index);
		});
		
		this.Months[storageID].mousedown(function(event) {
			var month = $(event.target).closest('div');
			
			BookingTable.bookToggle(month, ['bookOnMonth', 'cancelBookOnMonth']);
		});
		
		$("td:first ins.checkbox", row).mousedown(function(event) {
			var row = $(event.target).closest('tr');
			BookingTable.bookToggle(row, ['bookOnYear', 'cancelBookOnYear']);
		});
	},
	bookToggle: function(element, handlers) {
		var handler = $(element).hasClass('selected') ? handlers[1] : handlers[0];
		
		this[handler].call(this, element);
	},
	bookOnMonth: function(month) {
		var row = $(month).closest('tr');
		var rowID = $(row).attr('id').replace(/\D*/, '');
		var monthIndex = $(month).attr('index');
		var price = BookingTable.Prices[rowID];
		
		$(month).addClass('selected');
		
		Storage.changeMonthValue(this.prefix, [monthIndex, rowID], 2);
		this.updateCost(price, 'raise');
	},
	cancelBookOnMonth: function(month) {
		var row = $(month).closest('tr');
		var rowID = $(row).attr('id').replace(/\D*/, '');
		var monthIndex = $(month).attr('index');
		var price = BookingTable.Prices[rowID];
		
		$(month).removeClass('selected');
		
		Storage.changeMonthValue(this.prefix, [monthIndex, rowID], 0);
		this.updateCost(price, 'lower');
	},
	bookOnYear: function(row) {
		var rowID = $(row).attr('id').replace(/\D*/, '');
		var price = BookingTable.Prices[rowID];
		var changedMonths;
		
		$(row).addClass('selected');
		this.Months[rowID].addClass('selected');
		
		changedMonths = Storage.changeRowValue(this.prefix, rowID, 2);
		this.updateCost(price, 'raise', changedMonths);
	},
	cancelBookOnYear: function(row) {
		var rowID = $(row).attr('id').replace(/\D*/, '');
		var price = BookingTable.Prices[rowID];
		var changedMonths;
		
		$(row).removeClass('selected');
		this.Months[rowID].removeClass('selected');
		
		changedMonths = Storage.changeRowValue(this.prefix, rowID, 0);
		this.updateCost(price, 'lower', changedMonths);
	},
	updateCost: function(price, action, count) {
		var count = count || 1;
		var cost;
		var discount;
		
		switch(action) {
			case 'raise':
				this.costValue += price * count;
				break;
			case 'lower':
				this.costValue -= price * count;
				break;
		}
		
		cost = this.costValue.insertSpaces();
		discount = (this.costValue * this.discountFactor).insertSpaces();
		
		$(this.cost).html(cost);
		$(this.discount).html(discount);
	},
	Months: {
	},
	Prices: {
	}
};
var Basket = {
	init: function() {
		this.discountFactor = 0.9;
		
		this.cost = $("#price em");
		this.discount = $("#discount em");
		this.costValue = $(this.cost).html().trimSpaces();
				
		$('table .checked input').click(function(e) {
			Basket.orderToggle(e.target);
		});
	},
	orderToggle: function(checkbox) {
		var isChecked = $(checkbox).is(":checked");
		
		var board = $(checkbox).closest('tr');
		var orderCost = $(checkbox).closest('td').prev('td.cost').html();
		
		if (isChecked) {
			this.confirmOrder(board);
			this.updateCost(orderCost.trimSpaces(), board, 'raise');
		} else {
			this.cancelOrder(board);
			this.updateCost(orderCost.trimSpaces(), board, 'lower');
		}
	},
	confirmOrder: function(board) {
		var rowParams = $(board).attr('id');
		var rowID = rowParams.match(/\d+(?=_)/);
		var prefix = rowParams.match(/\d+$/);
		
		$(board).removeClass('disabled');
		Storage.addRow(rowID);
		Storage.send(prefix, rowID);
	},
	cancelOrder: function(board) {
		var rowParams = $(board).attr('id');
		var rowID = rowParams.match(/\d+(?=_)/);
		var prefix = rowParams.match(/\d+$/);
		
		$(board).addClass('disabled');
		Storage.changeRowValue(prefix, rowID, 0);
	},
	updateCost: function(orderCost, board, action) {
		var cost;
		var discount;
		var localCost = $(board).closest('table').next('div.cost').children('em');
		var localCostValue = localCost.html().trimSpaces();

		switch(action) {
			case 'raise':
				localCostValue += orderCost;
				this.costValue +=orderCost;
				break;
			case 'lower':
				localCostValue -= orderCost;
				this.costValue -=orderCost;
				break;
		}

		localCostValue = localCostValue.insertSpaces();

		cost = this.costValue.insertSpaces();
		discount = (this.costValue * this.discountFactor).insertSpaces();
		
		$(localCost).html(localCostValue);
		$(this.cost).html(cost);
		$(this.discount).html(discount);
	}
};
var relatestLink = {
	init: function() {
		var links = $("ul.relatedLinks a");
		
		$("span", links).fadeTo(0,0);
		$(links).hover(this.purchaseColor, this.lossColor);
	},
	purchaseColor: function(e) {
		$(e.target).animate({opacity:1},{duration: 300, queue: false});
	},
	lossColor: function(e) {
		$(e.target).animate({opacity:0},{duration: 300, queue: false});
	}
};

var ImageSwitcher = {
	init: function(container, animateSettings) {
		this.container = container;
		this.animateSettings = animateSettings;
		
		this.heading = $(this.container).prev("div.title");
		this.leftButton = $("i.left", this.container);
		this.rightButton = $("i.right", this.container);
		this.loader = $("i.loader", this.container);
		this.imageBox = $("div.images", this.container);
		this.storage = $("div.storage", this.container);
		
		this.currentImage = $("img", this.imageBox);
		this.currentImageIndex = 0;
		
		this.storageInit();
		
		$(this.leftButton).mousedown(function(e) {
			e.preventDefault();
			ImageSwitcher.switchImage('left');
		});
		
		$(this.rightButton).mousedown(function(e) {
			e.preventDefault();
			ImageSwitcher.switchImage('right');
		});
	},
	storageInit: function() {
		var pointer = $("span", this.storage);
		var element;
		
		this.Queue[0] = {};
		this.Queue[0].subj = this.currentImage;
		this.Queue[0].heading = this.heading.html();
		this.Queue[0].ready = 1;
		
		for (var index = 1; index < pointer.length; index++) {
			element = pointer.eq(index);
			
			this.Queue[index] = {};
			this.Queue[index].ready = 0;
			this.Queue[index].subj = this.createImageElement(element, index);
			this.Queue[index].heading = this.createImageHeading(element);
			
			this.checkState(index);
		}
	},
	createImageElement: function(element, index) {
		var title = $(element).attr('title');
		var src = $(element).html();
		var imageElement = $("<img src=\"" + src + "\" title=\"" + title + "\" class=\"notReady\" index=\"" + index + "\"/>");
		
		imageElement.appendTo(this.imageBox);
		return imageElement;
	},
	createImageHeading: function(element) {
		var title = $(element).attr('title');
		var link = $(element).attr('rel') || '';
		
		if (link) {
			title += " <a href=\"" + link + "\">" + link + "</a>";
		}
		return title ;
	},
	checkState: function(index) {
		var imageElement = this.Queue[index].subj;
		var isImageReady = $(imageElement).get()[0].complete;
		
		if (isImageReady) {
			this.readyHandler.call(imageElement);
		} else {
			$(imageElement).load(this.readyHandler);
		}
	},
	readyHandler: function() {
		var imageElement = this;
		var index = $(imageElement).attr('index');
		
		$(imageElement).removeClass('notReady');
		$(imageElement).fadeTo(0, 0);
		ImageSwitcher.Queue[index].ready = 1;
	},
	switchImage: function(direction) {
		this.hideImage()
		
		switch (direction) {
			case 'right':
				this.currentImageIndex++;
				if (this.currentImageIndex >= this.Queue.length) {
					this.currentImageIndex = 0;
				}
				break;
			case 'left':
				this.currentImageIndex--;
				if (this.currentImageIndex < 0) {
					this.currentImageIndex = this.Queue.length - 1;
				}
				break;
		}
		
		var imageObj = this.Queue[this.currentImageIndex];
		
		if (imageObj.ready) {
			this.showImage();
		} else {
			this.loader.show();
			$(imageObj.subj).load(function() {
				ImageSwitcher.showImage();
			});
		}
	},
	hideImage: function() {
		this.Queue[this.currentImageIndex].subj.animate(this.animateSettings, "slow");
	},
	showImage: function() {
		var heading = this.Queue[this.currentImageIndex].heading;
		
		this.Queue[this.currentImageIndex].subj.animate({
			"left": 0,
			"top": 0, 
			"opacity": 1
		}, {
			duration: 600,
			complete: function() {
				ImageSwitcher.loader.hide('fast');
			}
		});
		$(this.heading).html(heading);
	},
	Queue: []
};
var AuthorizationFork = {
	init: function() {
		
		var SELF = this;
		this.toggle = $("p.toggle");
		
		$(".button8 a").click(function(e) {

			e.preventDefault();
			SELF.submitForm();
		});
		
		$(this.toggle).click(function(e) {
			e.stopPropagation();
			
			SELF.changeForm($(e.target).closest('form'));
		});
		this.changeForm($("form.newBuyer"));
	},
	checkInput: function(input) {
		$('input', this.toggle).removeAttr('checked');
		$(input).attr('checked', 'checked');
	},
	changeForm: function(form) {
		var input = $('input[name=formType]', $(form));
		
		this.checkInput(input);
		this.form = form;
	},
	submitForm: function() {
		$(this.form).submit();
	}
};
var Interview = {
	init: function() {
		this.form = $("form.interview");
		
		$(".button span", this.form).click(function(e){
			e.preventDefault();
			Interview.submit();
		})
	},
	submit: function() {
		var params = $(this.form).serialize();
		
		if (params.length) {
			this.submitImitation();
			$.post('/vote', params);
		} else {
			alert("Вариант ответа не выбран");
		}
	},
	submitImitation: function() {
		var message = "<p>Благодарим Вас за проявленную активность.<br>Ваш голос будет учтен.</p>";
		
		$("fieldset, .button", this.form).remove();
		$(this.form).append(message);
	}
};


function getMap() {
	var coordsString = $("#locationMapCoords").html();
	var map = new YMaps.Map($("#lightbox-text"));
	var point;
	var coords;
	var zoom;
	
	if (!!coordsString) {
		coords = coordsString.split(",");
		zoom = coords[2] || 16;
		
		point = new YMaps.GeoPoint(coords[0], coords[1]);
		map.addOverlay(new YMaps.Placemark(point));
	} else {
		point = new YMaps.GeoPoint(30.313497, 59.938531);
		zoom = 10;
	}
	
    map.setCenter(point, zoom);
	map.addControl(new YMaps.TypeControl());
	map.addControl(new YMaps.ToolBar());
	map.addControl(new YMaps.Zoom());
	map.addControl(new YMaps.MiniMap());
	map.enableScrollZoom();
		
	return map;
}

var Buttons = {
	init: function() {
		var target = $.browser.msie || $.browser.opera ? "div.button span, div.button a" : "div.button span, div.button a, div.button input";
		
		$(target).bind({
			mousedown: this.press,
			mouseup: this.release,
			mouseout: this.release
		});
	},
	press: function(e) {
		var padding = [];
		
		e.preventDefault();
		padding[0]=parseInt($(this).css('padding-top'));
		padding[1]=parseInt($(this).css('padding-bottom'));
		padding[2]=parseInt($(this).css('padding-left'));
		padding[3]=parseInt($(this).css('padding-right'));
		
		$(this).css({
			'padding':  (padding[0] + 1) + 'px ' + (padding[3] - 1) + 'px ' + (padding[1] - 1) + 'px ' + (padding[2] + 1) + 'px'
		});
		
		this.padding = padding;
	},
	release: function (e) {
		if (this.padding) {
			var padding = this.padding;
		
			e.preventDefault();
			$(this).css({
				'padding': padding[0]+'px '+padding[2]+'px '+padding[1]+'px '+padding[3]+'px'
			});
		}
	}
}
function formInit(formClass) {
	var form = $(formClass);
	var successText = "<div class=\"title\">Отправить заявку</div><p>Спасибо, Ваша заявка принята к рассмотрению.</p><p>Мы свяжемся с Вами в ближайшее время.</p>";
	var checkboxes = $("fieldset input:visible", form);
	
	form.submit(function(e) {
		e.preventDefault();
		var params = form.serialize();
		$.post("/internet/marketing/", params, function() {
			form.html(successText);
		})
	})
	checkboxes.eq(0).change(function() {
		var checked = $(this).is(':checked');
		
		if (checked) {
			checkboxes.attr("checked", "checked");
		}		
	});
	checkboxes.not(":eq(0)").click(function() {
		checkboxes.eq(0).removeAttr("checked");
	})
	
}

var initSwitcher = function () {
	var moduleName = $.trim(document.body.className);
	
	switch (moduleName) {
		case 'outdoor':
			IconMovement.init();
			if ($("form").length) {
				AuthorizationFork.init();
			} else if ($("#bookingTable").length) {
				BookingTable.init();
				
				$("#locationMap").lightBox(LightBoxSettings, {
					width: 700,
					height: 500,
					ymap: getMap,
					title: $("h1").html()
				});
				$("#locationInfo").lightBox(LightBoxSettings, {
					width: 600,
					height: 400,
					textContainer: $("#locationInfoContent"),
					title: $("h1").html()
				});
			} else if ($(".locationGroupWrapper table").length) {
				Basket.init();
			}
			break;
		case 'indoor':
			IconMovement.init();
			break;
		case 'news':
			$("a.newsLogo").lightBox(LightBoxSettings);
			$("a.zoom").lightBox(LightBoxSettings);
		break;
		case 'internet':
			var animateSettings = {
				"top": -410, 
				"opacity": 0
			};
			var container = $("#imageSwitcher");
			ImageSwitcher.init(container, animateSettings);
			formInit("form.request");
			break;
		case 'photo':
			$("#content a").lightBox(LightBoxSettings);
			break;
		case 'about':
			relatestLink.init();
			break;
		case 'default':
			NewsSlider.init();
			Interview.init();
			break;
	}
};

$(document).ready(function(){
	SidebarMenu.init();
	$("a[rel=gallery]").lightBox(LightBoxSettings);
	initSwitcher();
	Buttons.init();
});

