/**
 *	Сбор доступной информации (единовременной выполнение)
 *
 *	@author	icw82
 *	@constructor
 *	@this {kzInfo}
 *	@param {string} ua Информация о браузере
 *	@return {kzInfo} Новый объект kzInfo.
 */
function kzInfo(){
	this.ua = navigator.userAgent;
	this.pattern = {
		ie: /MSIE\s([\d\.]+)/
	},

	/**
	 *	Версия Internet Explorer
	 */
	this.ie = this.pattern.ie.exec(this.ua);
	this.ie = this.ie ? parseFloat(this.ie[1]) : null;

};

var info = new kzInfo();

/**
 *	Представить объект в читабельном виде
 *
 *	@author	icw82
 *
 */
function readObject(o){
	if(typeof(o) == 'array' || typeof(o) == 'object'){
		out = '<ul>';

		for(p in o){
			if(typeof(o[p]) == 'array' || typeof(o[p]) == 'object'){
				out += '<li><strong class="key">['+p+']</strong> → <em>'+typeof(o[p])+'</em>';
				out += readObject(o[p]);
				out += '</li>';
			}else{
				if(typeof(o[p]) != 'function')
					out += '<li><strong class="key">['+p+']</strong> → <em class="value">'+o[p]+'</em></li>';
			}
		}

		out += '</ul>';

		return out;
	}else
		return '<em class="value">'+o+'</em>';
}

// Copyright 2008 George McGinley Smith
$.extend($.easing,{def:'easeOutQuad',swing:function(x,t,b,c,d){return $.easing[$.easing.def](x,t,b,c,d);},
easeInQuad:function(x,t,b,c,d){return c*(t/=d)*t+b;},easeOutQuad:function(x,t,b,c,d){return-c*(t/=d)*(t-2)+b;},
easeInOutQuad:function(x,t,b,c,d){if((t/=d/2)< 1)return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},
easeInCubic:function(x,t,b,c,d){return c*(t/=d)*t*t+b;},easeOutCubic:function(x,t,b,c,d){return c*((t=t/d-1)*t*t+1)+b;},
easeInOutCubic:function(x,t,b,c,d){if((t/=d/2)< 1)return c/2*t*t*t+b;return c/2*((t-=2)*t*t+2)+b;},
easeInQuart:function(x,t,b,c,d){return c*(t/=d)*t*t*t+b;},easeOutQuart:function(x,t,b,c,d){return-c*((t=t/d-1)*t*t*t-1)+b;},
easeInOutQuart:function(x,t,b,c,d){if((t/=d/2)< 1)return c/2*t*t*t*t+b;return-c/2*((t-=2)*t*t*t-2)+b;},
easeInQuint:function(x,t,b,c,d){return c*(t/=d)*t*t*t*t+b;},easeOutQuint:function(x,t,b,c,d){return c*((t=t/d-1)*t*t*t*t+1)+b;},
easeInOutQuint:function(x,t,b,c,d){if((t/=d/2)< 1)return c/2*t*t*t*t*t+b;return c/2*((t-=2)*t*t*t*t+2)+b;},easeInSine:function(x,t,b,c,d){return-c*Math.cos(t/d*(Math.PI/2))+c+b;},
easeOutSine:function(x,t,b,c,d){return c*Math.sin(t/d*(Math.PI/2))+b;},easeInOutSine:function(x,t,b,c,d){return-c/2*(Math.cos(Math.PI*t/d)-1)+b;},easeInExpo:function(x,t,b,c,d){return(t==0)? b :c*Math.pow(2,10*(t/d-1))+b;},easeOutExpo:function(x,t,b,c,d){return(t==d)? b+c :c*(-Math.pow(2,-10*t/d)+1)+b;},
easeInOutExpo:function(x,t,b,c,d){if(t==0)return b;if(t==d)return b+c;if((t/=d/2)< 1)return c/2*Math.pow(2,10*(t-1))+b;return c/2*(-Math.pow(2,-10*--t)+2)+b;},
easeInCirc:function(x,t,b,c,d){return-c*(Math.sqrt(1-(t/=d)*t)-1)+b;},easeOutCirc:function(x,t,b,c,d){return c*Math.sqrt(1-(t=t/d-1)*t)+b;},easeInOutCirc:function(x,t,b,c,d){if((t/=d/2)< 1)return-c/2*(Math.sqrt(1-t*t)-1)+b;return c/2*(Math.sqrt(1-(t-=2)*t)+1)+b;},
easeInElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(a < Math.abs(c)){a=c;var s=p/4;}else var s=p/(2*Math.PI)*Math.asin(c/a);return-(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;},
easeOutElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d)==1)return b+c;if(!p)p=d*.3;if(a < Math.abs(c)){a=c;var s=p/4;}else var s=p/(2*Math.PI)*Math.asin(c/a);return a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b;},
easeInOutElastic:function(x,t,b,c,d){var s=1.70158;var p=0;var a=c;if(t==0)return b;if((t/=d/2)==2)return b+c;if(!p)p=d*(.3*1.5);if(a < Math.abs(c)){a=c;var s=p/4;}else var s=p/(2*Math.PI)*Math.asin(c/a);if(t < 1)return-.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b;},
easeInBack:function(x,t,b,c,d,s){if(s == undefined)s=1.70158;return c*(t/=d)*t*((s+1)*t-s)+b;},
easeOutBack:function(x,t,b,c,d,s){if(s == undefined)s=1.70158;return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b;},easeInOutBack:function(x,t,b,c,d,s){if(s == undefined)s=1.70158;if((t/=d/2)< 1)return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b;return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b;},
easeInBounce:function(x,t,b,c,d){return c-$.easing.easeOutBounce(x,d-t,0,c,d)+b;},
easeOutBounce:function(x,t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b;}else if(t <(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b;}else if(t <(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b;}else {return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b;}},
easeInOutBounce:function(x,t,b,c,d){if(t < d/2)return $.easing.easeInBounce(x,t*2,0,c,d)*.5+b;return $.easing.easeOutBounce(x,t*2-d,0,c,d)*.5+c*.5+b;}});


/**
 *	Расширение функционала
 *
 *	@author icw82
 */
function defOptions(options){
	defaultOptions = {
		delay: 0,
		time: 500,
		easing: false
	}

	if(typeof(options) == 'object'){
		options.delay = options.delay || defaultOptions.delay;
		options.time = options.time || defaultOptions.time;
		options.easing = options.easing || defaultOptions.easing;

		return options;
	}else
		return defaultOptions;
}

function autoHeight(){
	$(this).css({height: 'auto'})
}

$.fn.wait = function(time, type){
	var time = time || 1000;
	var type = type || "fx";
	
	return
		this.queue(type, function(){
			var self = this;
			setTimeout(function(){
				$(self).dequeue();
			}, time);
		});
};


$.fn.extend({

	// Функция оставляет элементы, изменившие свой размер
	isResize: function(){
		var ret = this;
		var i;
		
		// Перебор элементов
		for(i = 0, l = this.length; i < l; i++){
			var e = $(ret[i]);
			
			// Если стара ширина известна
			if(e.data('oldWidth')){
				// Если элемент изменил свой размер
				if(e.width() != e.data('oldWidth')){
						
				}else{
					ret.splice(i, 1);	
				}
			}else{
				// Первое назначение параметра
				e.data('oldWidth', e.width())
			}
			// выризаем ненужные элементы
			
		}
		
		
		return ret;
	},
	
	zShow: function(options){
		options = defOptions(options);

		this.each(function(){
			var element = $(this)
			var wrapper = $(this).children('div');

			setTimeout(function(){
				if(!options.easing){
					wrapper.css({marginTop: 0});
					element.css({height: 'auto'});
				}else{
					var height = wrapper.height();
					options.time = options.speed ? Math.floor((height/options.speed) * 1000) : options.time;
	
					wrapper
						.delay(options.delay)
						.stop(true, true)
						.animate({marginTop: 0}, options.time, options.easing);
	
					element
						.delay(options.delay)
						.stop(true, true)
						.animate({height: height}, options.time, options.easing);
				}
			}, options.delay)
		});

		return this;
	},
	
	zHide: function(options){
		options = defOptions(options);

		this.each(function(){
			var element = $(this)
			var wrapper = $(this).children('div');

			setTimeout(function(){
				if(!options.easing){
					wrapper.css({marginTop: -wrapper.height()});
					element.css({height: 0});			
				}else{
					var height = wrapper.height();
					options.time = options.speed ? Math.floor((height/options.speed)*1000) : options.time;

					wrapper
						.delay(options.delay)
						.stop(true, true)
						.animate({marginTop: -height}, options.time, options.easing);
	
					element
						.delay(options.delay)
						.stop(true, true)
						.animate({height: 0}, options.time, options.easing);
				}
			}, options.delay)	
		});
		
		return this;
	},
	
	zToggle: function(options){
		this.each(function(){
			if(this.style.height == 0)
				$(this).zShow(options);
			else
				$(this).zeHide(options);
		});
	},
	
	/**
	 *	Обязательные условия:
	 *	Наличие .sw-switch и идущие прямо за этим элементом .sw-content
	 */
	zSwitch: function(){
		this.each(function(){
			if($(this).hasClass('sw-switch')){
				var contentBlocks = $(this).nextUntil('*:not(.sw-content)')
				
				contentBlocks.each(function(){
					$(this).wrapInner('<div class="conductor" style="margin:0; position:static; overflow: hidden" />');
					var innerWrapper = $(this).children('div').eq(0);
					innerWrapper.css({marginTop: -innerWrapper.height()});
				})

				/**
				 *	показываем активный контент, соответствующий кнопке с классом .active
				 */
				activeIndex = $(this).find('.item.active').eq(0).index();
				contentBlocks.eq(activeIndex).zShow();
				
				/**
				 *	Клики прикручиваем
				 */
				$(this).find('.item').click(function(){
					if(!$(this).hasClass('active')){
						$(this).addClass('active')
						var newIndex = $(this).index();
						var oldIndex = $(this).siblings('.item.active').removeClass('active').index();
						contentBlocks.eq(newIndex).zShow();						
						contentBlocks.eq(oldIndex).zHide();
					}
				})
			}
		})
	},
	
	// Добавлено в флекс декоре 
	zSlider: function(){
		this.each(function(){
			if($(this).hasClass('zSlider') && $(this).attr('data-slidename')){
				var slide = $(this);
				var closeButton = slide.find('.close-button');
				var trigger = $('[data-target="' + $(this).attr('data-slidename') + '"]');
				var group = $('[data-group="' + $(this).attr('data-group') + '"]');
				
				slide.wrapInner('<div class="conductor" style="margin:0; position:static; overflow: hidden" />');
				var innerWrapper = $(this).children('div').eq(0);
				innerWrapper.css({marginTop: -innerWrapper.height()});
				
				trigger.click(function(){
					if(!$(this).hasClass('active')){
						/* на потом */
						//group.filter('.active').zHide();
						//trigger.filter().removeClass('active');					
						
						$(this).addClass('active');
						slide.zShow({time: 700,	easing: 'easeInOutExpo'}).addClass('active');
						
						var slidePos = slide.position();
						slidePos = slidePos.top;
						
						var pageHeight = $('html').innerHeight() + innerWrapper.innerHeight();
						
						if(info.ie > 8 || !info.ie){
							//window.pageYOffset
							if(slidePos + window.innerHeight < pageHeight){
								var position = slidePos;
							}else{
								var position = pageHeight - window.innerHeight;
							}
						}
						
						$('html, body').animate({'scrollTop': position}, 701, 'easeInOutExpo');

					}else{
						$(this).removeClass('active');
						slide.zHide({time: 700, easing: 'easeInOutExpo'});
					}
				})
				
				closeButton.click(function(){
					trigger.trigger('click');
				})
			}
		})
	},
	

	/**
	 *	Функция адаптивной сетки (хуй поймёшь, да?)
	 */
	adaptiveGrid: function(){
		this.each(function(){
			// Максимальное количество строк
			var maxRows = $(this).attr('data-max-rows') || false;

			// Минимальная ширина блока
			var minItemWidth = $(this).attr('data-min-item-width') || false;

			// Тип распределения
			var type = $(this).attr('data-type') || 'rows';

			// Обозначена ли минимальная ширина (нет — хуй)
			if(minItemWidth){

				// Выборка всех элементов
				var items = $(this).children('.i');

				// Количество элементов
				var itemsCount = items.size();

				// Ширина контейнера
				var width = $(this).innerWidth();

				// Если ширина элемента меньше ширины контейнера
				if(minItemWidth <= width){

					// Максимальное кол-во элементов в строке
					var cols = Math.floor(width/minItemWidth);

					// Ширина элемента в процентах
					// (cols <= itemsCount) ? cols : itemsCount)
					var itemWidth = Math.floor(100000/cols);
					itemWidth/=1000;
				}else{

					// Максимальное кол-во элементов в строке
					var cols = 1;

					// Ширина элемента в процентах
					var itemWidth = 100;
				}

				// если есть ограничение на строки
				if(maxRows){
					// Указать ширину и Показать элементы
					items.nextUntil(':eq('+(cols * maxRows)+')')
						.andSelf()
						.css('width',itemWidth+'%')
						.show();
	
					// Скрыть ненужные элементы				
					items.eq(cols * maxRows - 1).nextUntil(':not(.i)').hide();
				}else{
					// (все элементы видны)
					items.css('width',itemWidth+'%');
				}
			}
		})

		return this;
	},

	zScalableFontSize: function(){
		this.each(function(){
			// Ширина первого элемента
			base = Number($(this).attr('data-base-container-width')) || 960;
			
			// Ширина контейнера в данный момент
			curentContainerWidth = $(this).innerWidth();
			
			// Масштабирование
			$(this).css({
				fontSize: curentContainerWidth/base * 100 + '%'
			})
			
		})

		return this
	}
	
});

function getRandomInt(min, max){
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function numderTypo(input){
	var output = '';

	if(input && input != ''){
		var numbers = String(input);
		numbers = numbers.split('');
		
		for(n = numbers.length - 1; n >= 0; n--){
			output = numbers[n] + output;
			if((numbers.length - n) % 3 == 0)
				output = ' ' + output;
		}
	}

	return output;
}


$(document).ready(function(){

	// Вычислитель, ага, ок
	var itemsParam = false;
	if(
		typeof main != 'undefined' &&
		typeof facturs != 'undefined' &&
		typeof addonPrices != 'undefined'
	){
		if(typeof main[0].elements[0] != 'undefined'){
			$('.calc-list .top-decor').removeClass('invisible');
			$('.calc-list').append('<ul></ul>')
			var list = $('.calc-list ul');
			var itemsParam = Array();

			for(g = 0; g < main.length; g++){
				for(e = 0; e < main[g].elements.length; e++){
					// Проверка
					if(!main[g].elements[e].name || main[g].elements[e].name == '')
						main[g].elements[e].name = '—';
					
					// Постороение
					var colorsHTML = '';
					for(c = 0; c < main[g].elements[e].colors.length; c++){
						var colorStat = {color: true, img: true};

						if(typeof main[g].elements[e].colors[c].name == 'undefined')
							main[g].elements[e].colors[c].name = '';
						
						if(typeof main[g].elements[e].colors[c].color == 'string' && main[g].elements[e].colors[c].color != ''){
							var rgbmatches = main[g].elements[e].colors[c].color.match(/(rgb\(\d{0,3},\d{0,3},\d{0,3}\))/);
							colorStat.color = rgbmatches[1] ? true : false;
						}else
							colorStat.color = false;
							
						if(typeof main[g].elements[e].colors[c].img != 'string' || main[g].elements[e].colors[c].img == '')
							colorStat.img = false;

						if(colorStat.color || colorStat.img){
							colorsHTML += '<div class="color"><div class="area"';

							if(rgbmatches && colorStat.color)
								colorsHTML += ' style="background-color:' + rgbmatches[1] + '">';
							else
								colorsHTML += '>';

							if(main[g].elements[e].colors[c].img)
								colorsHTML += '<img src="' + main[g].elements[e].colors[c].img + '" />'

							colorsHTML += '</div><p>' + main[g].elements[e].colors[c].name + '</p></div>';
						}
					}
					
					list.append('<li><div class="col-price"></div>' + 
						'<div class="col-items"><p class="title">' +
						main[g].elements[e].name + '</p>' + colorsHTML +
						'</div><div class="col-control"></div></li>');
					
					itemsParam[list.children('li').size() - 1] = {
						prices: main[g].elements[e].prices,
						profile : main[g].elements[e].profile || main[g].profile
					}
				}
			}
			// Список построен
		}
	}else{
		$('.calc-list').append('<p>Отсутсвуют данные о ценах</p>');
	}

	// Вычисления
	if(itemsParam){
		var items = $('.calc-list li');

		function getCalcParam(){
			var output = {
				s: Number($('#calc-sq').val()) || false,
				c: Number($('#calc-c').val()) || false,
				p: Number($('#calc-p').val()) || false,
				
				lustra: Number($('#calc-lustra').val()) || false,
				otop: Number($('#calc-otop').val()) || false,
				kr: Number($('#calc-kr').val()) || false,
				lenta: $('#calc-lenta').attr('checked') ? true : false,
				plintus: $('#calc-plintus').attr('checked') ? true : false,
				svet: Number($('#calc-svet').val()) || false,
				vent: Number($('#calc-vent').val()) || false,
			}

			if (output.s <= 0){
				output.s = 1; $('#calc-sq').val(output.s)
			}

			if (output.c < 4){output.c = 4; $('#calc-c').val(output.c)}
			/*if (output.p <= Math.floor(4 * Math.sqrt(output.s))){
				output.p = Math.floor(4 * Math.sqrt(output.s));
				$('#calc-p').val(output.p)
			}*/
			var sqp = Math.floor(4 * Math.sqrt(output.s));

			pLabel.attr('data-val', sqp);
			pLabel.html('(<em>' + sqp + '?</em>)')
			//if($('.label[for="calc-p"] span'))
	
			return output;
		}

		function calcThisBitch(){
			var param = getCalcParam()
			for(i = 0; i < items.length; i++){
				var result = '';
				var bestPrice = 0;
				var bestSq = 0;
				
				// ищем цену соответсвующую площади
				for(p=0; p < itemsParam[i].prices.length; p++){
					if(param.s > itemsParam[i].prices[p].sq && bestSq <= itemsParam[i].prices[p].sq){
						bestSq = itemsParam[i].prices[p].sq;
						bestPrice = itemsParam[i].prices[p].price;
					}
				}
				
				if(bestPrice && param.p > 3.6 * Math.sqrt(param.s)){
					// стоимость потолка собственно
					result = bestPrice * param.s;
					// стоимость профиля
					if(typeof itemsParam[i].profile == 'number')
						result += param.p * addonPrices.profiles[itemsParam[i].profile].price;
					// доп. углы
					result += (param.c - 4) * addonPrices.corners;
					
					//alert(param.lustra)
					
					if(param.lustra) result += param.lustra * addonPrices.lustra;
					if(param.otop) result += param.otop * addonPrices.otop;
					if(param.kr) result += param.kr * addonPrices.kr;
					if(param.svet) result += param.svet * addonPrices.svet;
					if(param.vent) result += param.vent * addonPrices.vent;

					if(param.lenta) result += param.p * addonPrices.lenta;
					if(param.plintus) result += param.p * addonPrices.plintus;
					
					//if(param.svet) result += param.svet * addonPrices.svet;
					result = '<span class="number">' + numderTypo(result) + '</span> <span class="rur">₶</span';
				}else{
					result = '';
				}

				items.eq(i).children('.col-price').html(result);
			}
		}

		var pLabel = $('.label[for="calc-p"] span');
		
		pLabel.click(function(){
			if($(this).attr('data-val')){
				$('#calc-p').val($(this).attr('data-val'))
				calcThisBitch()
			}
		})

		$('.calc-form input[type="text"]').keyup(calcThisBitch);
		$('.calc-form input[type="checkbox"]').change(calcThisBitch);
	}

	// эксперементальные слайдеры
	$('.zSlider').zSlider();

	$('.block-photos').each(function(){
		if(photos){
			var path = 'layout/images/photos/';

			// первый рандомный слайд
			currentPhoto = getRandomInt(1, photos.length); currentPhoto--;
			$(this).children('.photo').html('<img src="' + path + photos[currentPhoto]['name'] + '.jpg" alt="" />' +
			'<div class="title">' + photos[currentPhoto]['title'] + '</div>');
			bigImage = $(this).children('.photo').children('img');
			titlePlace = $(this).children('.photo').children('.title');

			// навигация по слайдам
			for(i = 0; i < photos.length; i++){
				$(this).children('.thumbnails').append('<div class="item" title="' + photos[i]['title'] + '">' +
				'<span class="stencil bg-stencil"></span><span class="wrapper">' +
				'<img src="' + path + 'thumbnails/' + photos[i]['name'] + '.png" alt="' + photos[i]['title'] + '" />' +
				'</span></div>')
			}
			thumbnails = $(this).children('.thumbnails').children('.item');
			thumbnails.eq(currentPhoto).addClass('active');

			thumbnails.click(function(){
				if(!$(this).hasClass('active')){
					selected = $(this).index();
					bigImage.attr('src', path + photos[selected]['name'] + '.jpg');
					titlePlace.text(photos[selected]['title']);
					thumbnails.removeClass('active');
					$(this).addClass('active');
					currentPhoto = selected;
				}
			})

			// следующий слайд
			bigImage.click(function(){
				if(currentPhoto + 1 < photos.length){
					thumbnails.eq(currentPhoto + 1).trigger('click');
				}else{
					thumbnails.eq(0).trigger('click');
				}
			})
		}
	})	

	/**
	 *	Присвоение класса .hover всем ссылкам на один и тот же документ
	 *	при наведение курсора на одну из них
	 */
	$('a').mouseover(function(){
		$('a[href="' + $(this).attr('href') + '"]').addClass('hover');
	}).mouseout(function(){
		$('a[href="' + $(this).attr('href') + '"]').removeClass('hover');
	});
})
