/**
 * @author Vlad Yakovlev (scorpix@design.ru)
 * @copyright Art.Lebedev Studio (http://www.artlebedev.ru)
 * @version 0.1.1 (2009-07-27)
 * @requires jQuery
 * @requires PopupBlock 2.1.4
 * @requires GMap2
 */
var addresses = (function() {

	var MetroFilter = (function() {

		var
			stationPrefix = 'station_';

		var
			literaList,
			mapList,
			fullList,
			stationList;

		var
			stations,
			data = [],
			curText = '';

		function createMapItems() {
			var imageSrc = stationList.find('img').attr('src');

			for (var stationId in stations) {
				if (!stations[stationId].officies.length) continue;

				var labelCoords = stations[stationId].label_coords.split(',');
				var coords = stations[stationId].coords.split(',');

				$('<ins class="label"></ins>').css({
					left: parseInt(labelCoords[0], 10),
					top: parseInt(labelCoords[1], 10),
					width: parseInt(labelCoords[2], 10) - parseInt(labelCoords[0], 10),
					height: parseInt(labelCoords[3], 10) - parseInt(labelCoords[1], 10),
					backgroundImage: 'url(' + imageSrc + ')',
					backgroundPosition: (-parseInt(labelCoords[0], 10)).toString() + 'px ' + (-parseInt(labelCoords[1], 10)).toString() + 'px'
				}).addClass('label_' + stationId).appendTo(stationList);
				$('<ins class="station"></ins>').css({
					left: parseInt(coords[0], 10),
					top: parseInt(coords[1], 10),
					width: parseInt(coords[2], 10) - parseInt(coords[0], 10),
					height: parseInt(coords[3], 10) - parseInt(coords[1], 10),
					backgroundImage: 'url(' + imageSrc + ')',
					backgroundPosition: (-parseInt(coords[0], 10)).toString() + 'px ' + (-parseInt(coords[1], 10)).toString() + 'px'
				}).addClass('station_' + stationId).appendTo(stationList);
			}
		}

		function filter(text) {
			text = $.trim(text);
			curText = text;

			if ('' == text || 'поиск' == text) {
				fullList.filter('.hidden').removeClass('hidden');
				literaList.filter('.hidden').removeClass('hidden');
				stationList.find('.label.hidden, .station.hidden').removeClass('hidden');

				return;
			}

			var findText = text.toLowerCase();

			fullList.addClass('hidden');
			literaList.addClass('hidden');
			stationList.find('.label, .station').addClass('hidden');

			for (var i = 0; i < data.length; i++) {
				var match = false;

				if (-1 < data[i].address.toLowerCase().indexOf(findText)) {
					match = true;
				} else {
					for (var j = 0; j < data[i].metro.length; j++) {
						if (-1 < data[i].metro[j].name.toLowerCase().indexOf(findText)) {
							match = true;
							break;
						}
					}
				}

				if (match) {
					fullList.eq(i).removeClass('hidden');
					literaList.eq(data[i].literaIndex).removeClass('hidden');

					for (var j = 0; j < data[i].metro.length; j++) {
						stationList.find('.label_' + data[i].metro[j].id + ', .station_' + data[i].metro[j].id).removeClass('hidden');
					}
				}
			}
		}

		function filterWithStation(stationId) {
			fullList.addClass('hidden');
			literaList.addClass('hidden');

			var findText = curText.toLowerCase();

			for (var i = 0; i < stations[stationId].officies.length; i++) {
				var index = stations[stationId].officies[i];
				var match = false;

				if ('' == findText) {
					match = true;
				} else if (-1 < data[index].address.toLowerCase().indexOf(findText)) {
					match = true;
				} else {
					for (j = 0; j < data[index].metro.length; j++) {
						if (-1 < data[index].metro[j].name.toLowerCase().indexOf(findText)) {
							match = true;
							break;
						}
					}
				}

				if (match) {
					fullList.eq(index).removeClass('hidden');
					literaList.eq(data[index].literaIndex).removeClass('hidden');
				}
			}
		}

		function getId(el, prefix) {
			var classes = $(el).attr('class').split(' ');

			for (var i = 0; i < classes.length; i++) {
				if (prefix == classes[i].substr(0, prefix.length)) {
					return classes[i].substr(prefix.length);
				}
			}

			return false;
		}

		function onMapClick(evt) {
			var el = $(evt.target);

			if (el.hasClass('label') || el.hasClass('station')) {
				var stationId = getId(el, el.hasClass('label') ? 'label_' : 'station_');
				filterWithStation(stationId);
				$('#addresses .selector_mode .selector_list .pseudo_link').click();
			}

			return false;
		}

		return function(metroStations) {
			stations = metroStations;

			for (var id in stations) {
				stations[id].officies = [];
			}

			literaList = $('#addresses .section_list tr.litera');
			mapList = $('#addresses .section_map');
			fullList = $('#addresses .section_list tr.office');
			stationList = $('#addresses .section_map .map');

			var officeIndex = -1;
			var literaIndex = -1;

			$('#addresses .section_list').find('.litera, .office').each(function() {
				var el = $(this);

				if (el.hasClass('litera')) {
					literaIndex++;
				} else {
					officeIndex++;

					var metro = [];

					el.find('.metro').each(function() {
						var stationId = getId(this, stationPrefix);
						stations[stationId].officies.push(officeIndex);
						metro.push({
							id: stationId,
							name: $(this).find('.em').text()
						});
					});

					data.push({
						address: el.find('td:first address').html(),
						place: el.find('td').eq(1).html(),
						literaIndex: literaIndex,
						metro: metro
					});
				}
			});

			createMapItems();

			filter($('#address_search').val());
			$('#address_search').bind('click change keyup blur', function() {
				filter($(this).val());
			});
			stationList.click(onMapClick);
		};
	})();

	var viewSelector = (function() {

		var
			sections = $('#addresses .section'),
			selectors = $('#addresses .selector_mode li'),
			selectorPrefix = 'selector_';

		selectors.each(function() {
			var sectionId = getSectionId(this);
			$(this).hasClass('selected') && change(sectionId);
			$(this).find('.pseudo_link').click(function() {
				change(sectionId);
			});
		});

		function change(sectionId) {
			sections.not('.section_' + sectionId).addClass('hidden');
			sections.filter('.section_' + sectionId).removeClass('hidden');
			selectors.not('.' + selectorPrefix + sectionId).removeClass('selected');
			selectors.filter('.' + selectorPrefix + sectionId).addClass('selected');
		}

		function getSectionId(el) {
			var classes = $(el).attr('class').split(' ');

			for (var i = 0; i < classes.length; i++) {
				if (selectorPrefix == classes[i].substr(0, selectorPrefix.length)) {
					return classes[i].substr(selectorPrefix.length);
				}
			}

			return false;
		}
	});

	var exampleInput = (function() {
		$('#addresses .example_input .pseudo_link').click(function() {
			$('#address_search').val($(this).text()).blur();
		});
	});
	
	return function(metroStations) {
		$(function() {
			viewSelector();
//			exampleInput();
			
			if(metroStations){
				var metroFilter = MetroFilter(metroStations);
			}
		});
	};
})();
