window.extSearch = (function(){
	"use strict";

	function open() {
		uui.dialog({
			width: '450px',
			title: 'Поиск плитки',
			name: 'search',
			content: '<div id="search-dialog"></div>',
			buttons: [
				{title: 'Искать', action: function() {search();}},
				{title: 'Закрыть', action: 'close'}
			]
		}).open();
	}
	
	
	function search() {
		alert('Starting search');
	}
	
	
	function getCTargetById(id) {
		for (var i in window.searchData.struct) {
			if (window.searchData.struct[i].id == id)
				return window.searchData.struct[i];
		}
		return null;
	}
	
	
	function changeCTarget(id) {
		curCollTarget = id;
		$.cookie('ctarget', id, {path: '/'});
		
		var cTarget = getCTargetById(id);
		var newTTarget = false;
		for (var i in cTarget.subs) {
			if (newTTarget === false || cTarget.subs[i].id == curTileTarget)
				newTTarget = cTarget.subs[i].id;
		}
		
		changeTTarget(newTTarget);
	}
	
	
	function changeTTarget(tId) {
		curTileTarget = tId;
		$.cookie('ttarget', tId, {path: '/'});
		
		updateProps();
	}
	
	
	function createCTarget(tabs, cTarget) {
		var bodyElId = 'search-coll-target' + cTarget.id;
		
		var tabEl = $('<span class="tab">' + cTarget.name + '</span>');
		var bodyEl = $('<div class="tile-targets" id="' + bodyElId + '"></div>');
		
		tabs.addTab(tabEl, bodyEl, {value: cTarget.id, current: (cTarget.id == curCollTarget)});
		var tileTargets = uui.selector({id: bodyElId, name: 'ttarget' + cTarget.id, callback: function(v){changeTTarget(v)}});

		for (var j in cTarget.subs) {
			var tTarget = cTarget.subs[j];
			var tEl = $('<span class="option">' + tTarget.name + '</span>');

			tileTargets.addOption(tEl, {value: tTarget.id, checked: (tTarget.id == curTileTarget)});
		}
	}
	
	
	function changeXSize(min, max) {
		curXMin = min;
		curXMax = max;
		
		updateProps();
	}
	
	
	function changeYSize(min, max) {
		curYMin = min;
		curYMax = max;
		
		updateProps();
	}
	
	function changePrice(min, max) {
		curPriceMin = min;
		curPriceMax = max;
		
		updateProps();
	}
	
	function changeSizeType(type) {
		
	}
	
	
	function updateProps() {
		
		var cnt = 0;
		var mats = new Array();
		var sizeKeys = new Array();
		var minPrice = false;
		var maxPrice = false;
		
		currentSizes = new Object();
		
		
		for (var i in window.searchData.data) {
			var c = window.searchData.data[i];
			if ( (c.map & curCollTarget) == 0 || (c.tmap & curTileTarget == 0) )
				continue;
			
			for (var j in c.t) {
				var t = c.t[j];
				
				if ( (t.map & curTileTarget) == 0)
					continue;
				
				// Price
				if (minPrice === false)
					minPrice = Math.round(t.price);
				else
					minPrice = Math.min(Math.round(t.price), minPrice);
				if (maxPrice === false)
					maxPrice = Math.round(t.price);
				else
					maxPrice = Math.max(Math.round(t.price), maxPrice);
				
				if (curPriceMin && t.price < curPriceMin)
					continue;
				if (curPriceMax && t.price > curPriceMax)
					continue;
				
				// Size
				if (t.x > 0 && t.y > 0) {
					if (typeof(currentSizes[t.x]) == 'undefined') {
						currentSizes[t.x] = new Array();
						sizeKeys.push(t.x);
					}
					
					if (currentSizes[t.x].indexOf(t.y) == -1)
						currentSizes[t.x].push(t.y);
						
					if (typeof(currentSizes[t.y]) == 'undefined') {
						currentSizes[t.y] = new Array();
						sizeKeys.push(t.y);
					}
						
					if (currentSizes[t.y].indexOf(t.x) == -1)
						currentSizes[t.y].push(t.x);
				}
			  
				// Materials
				if (mats.indexOf(t.mat) == -1)
					mats.push(t.mat);
			}
		}
		
		// Price
		priceSlider.setValues(minPrice, maxPrice);
		
		
		// Sizes
		sizeKeys.sort(function(a, b) {return a-b;});
		var sizeXEl = $('#search-sizes-exact-x');
		sizeXEl.text('');
		for (var i in sizeKeys) {
			var option = $('<option>' + String(sizeKeys[i]).replace(/\./, ',') + '</option>');
			option.attr('value', sizeKeys[i]);
			sizeXEl.append(option);
		}
		
		
		var sizeYEl = $('#search-sizes-exact-y');
		sizeYEl.text('');
		var ySizes = currentSizes[sizeKeys[0]];
		ySizes.sort();
		for (var i in ySizes) {
			var option = $('<option>' + String(ySizes[i]).replace(/\./, ',') + '</option>');
			option.attr('value', ySizes[i]);
			sizeYEl.append(option);
		}
		
		// Create materials
		var matSelector = uui.selector({id: 'search-mats', name: 'materials', multiple: true});
		matSelector.removeOptions();
		for (var matNum in window.searchData.mats) {
			var m = window.searchData.mats[matNum];
			var matId = parseInt(m.id, 10);
			if (mats.indexOf(matId) >= 0) {
				var optionEl = $('<span class="option">' + m.name + '</span>');
				matSelector.addOption(optionEl, {value: matId, checked: true});
			}
		}
	}
	
	
	function updateExactX() {
		
	}
	
	
	function updateExactY() {
		
	}


	function loadContent() {
		isContentLoaded = true;
		
		var d = $('#search-dialog');
		d.append('<table>\
			<tr><td class="title">Назначение:</td><td id="search-targets"></td></tr>\
			<tr><td class="title">Цена, р./м²:</td><td><div id="search-price" class="slider-bar"></div></td></tr>\
			<tr><td class="title">Размер:</td><td class="size-container"><div id="search-sizes"></div></td></tr>\
			<tr><td class="title">Материал:</td><td id="search-mats"></td></tr>\
			</table>');
		
		var approxContainer = $('<div id="search-sizes-approx">\
			<select id="search-sizes-approx-x"></select> см\
			<span class="sizes-separator">×</span>\
			<select id="search-sizes-approx-y"></select> см\
			</div>');
		
		var exactContainer = $('<div id="search-sizes-exact">\
			<select id="search-sizes-exact-x"/></select> см \
			<span class="sizes-separator">×</span>\
			<select id="search-sizes-exact-y"/></select> см\
			</div>');
		
		
		
		var sizeTabs = uui.tabs({id: 'search-sizes', name: 'sizes', callback: function(v){changeSizeType(v);}});
		sizeTabs.addTab($('<span class="tab">Не важно</span>'), $('<div></div>'), {value: 'no', current: true});
		sizeTabs.addTab($('<span class="tab">Примерно</span>'), approxContainer, {value: 'approx'});
		sizeTabs.addTab($('<span class="tab">Точно</span>'), exactContainer, {value: 'exact'});
		
		priceSlider = uui.regionSlider({id: 'search-price', callback: function(min, max){changePrice(min, max)}});
		
		
		if (curCollTarget == 0 || curTileTarget == 0) {
			curCollTarget = window.searchData.struct[0].id;
			curTileTarget = window.searchData.struct[0].subs[0].id;
		}
		
		var targetTabs = uui.tabs({id: 'search-targets', callback: function(v){changeCTarget(v)}});
		for (var i in window.searchData.struct)
			createCTarget(targetTabs, window.searchData.struct[i]);
		
		changeCTarget(curCollTarget);
	}
	
	
	// Примерные размеры
	var approxSizes = new Array(
		{title: '10', min: 5, max: 16},
		{title: '20', min: 15, max: 27},
		{title: '30', min: 24, max: 39},
		{title: '45', min: 38, max: 55},
		{title: '60', min: 50, max: 80},
		{title: '90', min: 75, max: 10000}
	);

	// Текущие точные размеры
	var currentSizes = new Object();
	
	
	// Назначения
	var curCollTarget = parseInt($.cookie('ctarget'), 10);
	if (isNaN(curCollTarget) || curCollTarget < 0)
		curCollTarget = 0;
	
	var curTileTarget = parseInt($.cookie('ttarget'), 10);
	if (isNaN(curTileTarget) || curTileTarget < 0)
		curTileTarget = window.searchData.struct[0].subs[0].id;
	
	// Размеры
	var curXMin = 0;
	var curXMax = 0;
	var curYMin = 0;
	var curYMax = 0;
	
	// Цена
	var curPriceMin = 0;
	var curPriceMax = 0;
	
	var isContentLoaded = false;
			
	// sliders
	var xSlider;
	var ySlider;
	var priceSlider;
	
	// Return object
	return  {
		
		open: function() {
			open();
			if (!isContentLoaded)
				loadContent();
		}
	}
	
}());
