// $Id: ymaps-city.js,v 0.5 2011/02/16 16:16:45 rogozhin Exp $
/**
 * (c) Atr. Lebedev Studio
 * Author - Lev Rogozhin (lev@design.ru | lev@reijii.ru)
 */
var iZoomLevel = 16;
var iMaxZoomLevel = 17;
var iMaxSliderHeight = 320;
var oMap;
var trafficFilter = {
	busy:false,
	soso:false,
	free:false,
	all:false
};
var filterList = new Array();

var s;
function load() {
	if (typeof YMaps == "undefined") {
		return;
	}
	var container = document.getElementById("google_map");
	var init_data = {
		lon:iLon,
		lat:iLat,
		zoom:iDepartmentID != 0 ? iZoomLevel : 11,
		zoomComtrol:true
	};
	if (!(typeof thisIsSmall != 'undefined' && thisIsSmall)) {
		init_data.maxZoomHeight = 460;
		init_data.zoomPosition = new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Size(-7, 0));
	}
	
	alfamap.init({
		container:container,
		init:init_data
	});
	if (typeof iCityID != 'undefined' && iCityID == 21) {
		initTrafficOptions();
	}

	var _search = new YMaps.SearchControl({resultsPerPage:5, useMapBounds: 1}),
		_search_position = new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Point(10, 10));
	alfamap.map.addControl(_search, _search_position);
	
	getMarker();
	// if (iDepartmentID != 0) {
	// 	alfamap.addOverlay({
	// 		lon:iLon,
	// 		lat:iLat,
	// 		name:sDepartmentName,
	// 		description:''
	// 	});
	// }
	return;
}
function initTrafficOptions () {
	$(Templates.traffic_filter)
		.appendTo("div.gmap-points-legend table td.traffic-options")
		.find('input')
		.bind($.browser.msie ? 'propertychange': 'change', setTrafficFilter());
	showTrafficOptionsIfNeed();
}
var pauseTrafficFiltering = false;
function setTrafficFilter () {
	var $c = $('div.traffic-filter-container'),
		fB = $c.find("input[name='trf-many']"),
		fS = $c.find("input[name='trf-soso']"),
		fF = $c.find("input[name='trf-free']"),
		fA = $c.find("input[name='trf-all']");
	return function (do_all) {
		if (pauseTrafficFiltering) {
			return;
		}
		var old_all = trafficFilter.all;
		trafficFilter = {
			busy:fB.attr('checked'),
			soso:fS.attr('checked'),
			free:fF.attr('checked'),
			all:fA.attr('checked')
		};
		if (old_all != trafficFilter.all || typeof do_all == "boolean") {
			trafficFilter.busy = trafficFilter.soso = trafficFilter.free = trafficFilter.all;
			pauseTrafficFiltering = true;
			$c.find("input").attr("checked", trafficFilter.all);
			showTrafficOptionsIfNeed();
			// #TODO all visual
		}
		
		filterMapByFeatures();
		pauseTrafficFiltering = false;
	}
}
var _showTrafficOptions = null;
function showTrafficOptionsIfNeed () {
	if (!_showTrafficOptions) {
		_showTrafficOptions = {
			div: $('div.traffic-filter-container div.traffic-filter-options'),
			inputs: $('div.traffic-filter-container div.traffic-filter-options input')
		};
	}
	if (trafficFilter.all) {
		_showTrafficOptions.div.removeClass('tdisabled');
		_showTrafficOptions.inputs.attr("disabled", false);
	} else {
		_showTrafficOptions.div.addClass('tdisabled');
		_showTrafficOptions.inputs.attr("disabled", true);
	}
}
function showTrafficIfNeed () {
	if (!trafficFilter.all) {
		$("#google_map div.alfa-traffic-flag-icon-block").addClass("alfa-traffic-flag-icon-hidden");
	} else {
		$("#google_map div.alfa-traffic-flag-icon-block").removeClass("alfa-traffic-flag-icon-hidden");
	}
}
function getTrafficSize (wait_time) {
	var ret = {size: -1};
	switch (true) {
		case (wait_time == null): 
		case (wait_time == -1):
			break;
			
		case (wait_time < 15):
			ret = {size: 1};
			break;
		case (wait_time < 30):
			ret = {size: 2};
			break;
		default:
			ret = {size: 3};
			break;
	}
	return ret;
}

//var pointsByFeatures = {};
if (typeof alfamap != 'undefined') {
	var allPoints = alfamap.createObjectCollection();
}
var pointsOnMap = [];
function getMarker(oMap, icon){
	$.ajax({
		url: "/_/ajax/_get_offices_coords.html",
		data:{ cityID: iCityID, departmentID: iDepartmentID, rnd: Math.random()*100000000, direct: (isDirectPoints()?'1':'0') },
		dataType: 'text',
		success: function(data) {
			try {data = eval(data);}catch(e){console.log(e);return;}
			$.each(data.marker, function() {
				var meta = {
					features: this.features.split(',')
				};
				meta.traffic = getTrafficSize(this.wait_time);
	
				var placemark = alfamap.addOverlay({
					lon:parseFloat(this.lng),
					lat:parseFloat(this.lat),
					description:this.info,
					icon: this.is_legal == 1 ? 'gray' : (this.is_aclub == 1 ? 'black' : (this.is_everyday == 1 ? 'dark' : 'normal')),
					meta: meta
				});
	
				alfamap.appendObjectCollection(allPoints, placemark);
				
				pointsCache.push(this.lng+','+this.lat);
			});
			if (iDepartmentID != 0) {
				alfamap.addOverlay({
					lon:iLon,
					lat:iLat,
					name:sDepartmentName,
					description:''
				});
			}
			
			setTimeout('getMarkersByBound(1);',10);

		} 
	});
}

var pointsCache = [];
function getMarkersByBound (all) {
	var bounds = alfamap.getBounds(),
		left = all ? -180 : bounds.getLeft(),
		right = all ? 180 : bounds.getRight(),
		top = all ? 90 : bounds.getTop(),
		bottom = all ? -90 : bounds.getBottom();

		$.getJSON(
			"/_/ajax/_get_depatments_for_bounds.html",
			{
				left: left,
				right: right,
				top: top,
				bottom: bottom,
				exclude: pointsCache.join('~'),
				rnd: Math.random()*100000000,
				direct:(isDirectPoints()?'1':'0')
			},
			function(data) {
				$.each(data.marker, function() {
					var meta = {
						features: this.features.split(',')
					};
					meta.traffic = getTrafficSize(this.wait_time);
					var placemark = alfamap.addOverlay({
						lon:parseFloat(this.lng),
						lat:parseFloat(this.lat),
						description:this.info,
						icon: this.is_legal == 1 ? 'gray' : (this.is_aclub == 1 ? 'black' : (this.is_everyday == 1 ? 'dark' : 'normal')),
						meta: meta
					});

					alfamap.appendObjectCollection(allPoints, placemark);
					
				});
				filterMapByFeatures();
			}
		);
	
}
function removeOverlays () {
	try{
		allPoints.forEach(alfamap.removeOverlay);
	} catch (e) {}
	
	return;
}

function isAllIn (aWhat, aIn) {
	//console.log(aWhat, aIn);
	if (!aWhat instanceof Array || aWhat.length == 0) return false;
	var f21 = false;
	for (var i = 0; i < aWhat.length; i++) {
		if (aWhat[i] == 21) {
			f21 = true;
		}
	}
	for (var i = 0; i < aWhat.length; i++)  {
		var _in = false;
		
		for (var j = 0; j < aIn.length; j++) {
			if (aIn[j] == aWhat[i]) _in = true;
			if (f21 && aIn[j] == 15) _in = true;
		}
		
		if (!_in) return false;
	}
	
	return true;
}

function isTrafficFilter () {
	return (trafficFilter.all && !(trafficFilter.busy && trafficFilter.soso && trafficFilter.free));
}
function isPassTrafficFilter (meta) {
	meta.size = typeof meta.size == 'undefined' || meta.size == null ? -1 : meta.size;
	switch (true) {
		case !isTrafficFilter():
		case meta.size == -1:
			return true;
		case trafficFilter.busy && meta.size == 3:
		case trafficFilter.soso && meta.size == 2:
		case trafficFilter.free && meta.size == 1:
			return true;
	}
	return false;
}

function filterMapByFeatures () {
	var block = document.getElementById("google_map_outer_big") || document.getElementById("google_map_outer");
	
	if (block.style.display == 'block' && typeof filterList != 'undefined') {
		if (!filterList.length) {
			try{
				alfamap.hideOverlays();
			}catch(e){}
			if (isTrafficFilter) {
				var bound = alfamap.map.getBounds();
				alfamap.stopDelayedShow();
				allPoints.forEach(function(placemark){
					var meta = placemark.metaDataProperty;
					if (isPassTrafficFilter(meta.traffic)) {
						alfamap.showOverlay(placemark, bound);
					}
				});
				alfamap.showOverlayDelayed();
			} else {
				allPoints.forEach(alfamap.showOverlay);
			}
		} else {
			try{
				removeOverlays();
			}catch(e){}
			
			var bound = alfamap.map.getBounds();
			alfamap.stopDelayedShow();
			allPoints.forEach(function(placemark){
				var meta = placemark.metaDataProperty;
				if (isAllIn(filterList, placemark.metaDataProperty.features) && isPassTrafficFilter(meta.traffic)) {
					alfamap.showOverlay(placemark, bound);
				}
			});
			alfamap.showOverlayDelayed();
		}
	}
	showTrafficIfNeed();
}

function createMarker(point, icon, info) {
	var marker = new GMarker(point, icon);
		GEvent.addListener(marker, 'click', function() {
			marker.openInfoWindowHtml(info);
		});

	return marker;
}

var bLoaded = false;

function closeGoogleMap () {
	mapLink.close();
}
function onCloseMap () {
	$('#google_map_outer_big,#google_map_outer').hide();
	// $('#googleLink a').removeClass('selected');
	$('#googleLink').removeClass('selected');
	
	if ($("#full_map_container").length != 0) {
		$(".content").height("auto");
		if ($.browser.msie) {
			setTimeout("$('#ratingHeader, #googleLink a').hide().show()", 1);
		}
	}
}

//function openGoogleMap(){
function onOpenMap(){
	if($('#google_map').length > 0){
		$('#google_map_outer_big,#google_map_outer').show();
		$('#googleLink').addClass('selected');

		if(!bLoaded){
			load();

			// $(".slider_bg").click(function(e){
			// 	var x = e.pageX - this.offsetLeft;
			// 	var y = e.pageY - this.offsetTop - 320;
			// 
			// 	var z=Math.round(y*iMaxZoomLevel/iMaxSliderHeight);
			// 	z = iMaxZoomLevel - z;
			// 	oMap.setZoom(z);
			// });
		}

		bLoaded = true;
	}
	if ($("#full_map_container").length != 0) {
		if ($(".content").height() < $("#google_map_outer").height()) {
			var height = $("#google_map_outer").height();
			$(".content").height(height+"px");
		}
	}
	filterMapByFeatures();
}

$(document).ready(function() {
	if (typeof YMaps == "undefined") {
		$("#googleLink").remove();
		return;
	}
	
	if (typeof iLat == 'undefined' || typeof iLon == 'undefined') {
		$('#googleLink').hide();
		return;
	}
	if($('#google_map').length == 0){
		$('#googleLink').hide();
	}

	mapLink
		.open(onOpenMap)
		.close(onCloseMap);

	// $('#googleLink a').click(function() {
	// 	if($(this).hasClass('selected')){
	// 		closeGoogleMap();
	// 	}else{
	// 		$(this).addClass('selected');
	// 		$('#googleLink').addClass('selected');
	// 		openGoogleMap();
	// 	}
	// 	return false;
	// });
	$.getJSON(
		"/_/ajax/_get_offices_coords.html",
		{ cityID: iCityID, departmentID: iDepartmentID, direct:(isDirectPoints()?'1':'0') },
		function(data) {
			$("#googleLink").show();
		}
	);
	if (isDirectPoints()) {
		$(".gmap-points-legend").hide();
	}
});

if (String.prototype.sprintf == undefined) {
	String.prototype.sprintf = function () {
		if (arguments.length) {
			var _arguments = arguments,
				_i = -1;
			return this.replace(/%s/g, function(){
				_i++;
				return _arguments[_i] == undefined ? '' : _arguments[_i] ;
			});
		} else {
			return this.replace(/%s/g, '');
		}
	}
}

var Templates = {
	traffic_filter:'<div class="traffic-filter-container">'
				+'<div class="traffic-filter-enabler">'
					+'<div>'
						+'<input type="checkbox" name="trf-all" id="trf-all" '+(trafficFilter.all ? 'checked="checked"' : '')+'/>'
						+'<label for="trf-all">&#1057;&#1090;&#1077;&#1087;&#1077;&#1085;&#1100; &#1079;&#1072;&#1075;&#1088;&#1091;&#1079;&#1082;&#1080; &#1086;&#1090;&#1076;&#1077;&#1083;&#1077;&#1085;&#1080;&#1081; &#1076;&#1083;&#1103; &#1095;&#1072;&#1089;&#1090;&#1085;&#1099;&#1093; &#1083;&#1080;&#1094;</label>'
					+'</div>'
				+'</div>'
				+'<div class="traffic-filter-options">'
					+'<div class="green">'
						+'<input type="checkbox" name="trf-free" id="trf-free" '+(trafficFilter.free ? 'checked="checked"' : '')+'/>'
						+'<label for="trf-free">&#1057;&#1074;&#1086;&#1073;&#1086;&#1076;&#1085;&#1086;</label>'
					+'</div>'
					+'<div class="yellow">'
						+'<input type="checkbox" name="trf-soso" id="trf-soso" '+(trafficFilter.soso ? 'checked="checked"' : '')+'/>'
						+'<label for="trf-soso">&#1057;&#1088;&#1077;&#1076;&#1085;&#1103;&#1103; &#1079;&#1072;&#1075;&#1088;&#1091;&#1078;&#1077;&#1085;&#1085;&#1086;&#1089;&#1090;&#1100;</label>'
					+'</div>'
					+'<div class="red">'
						+'<input type="checkbox" name="trf-many" id="trf-many" '+(trafficFilter.busy ? 'checked="checked"' : '')+'/>'
						+'<label for="trf-many">&#1047;&#1072;&#1075;&#1088;&#1091;&#1078;&#1077;&#1085;&#1086;</label>'
					+'</div>'
				+'</div>'
			+'</div>'
}

function isDirectPoints () {
	return (typeof _isDirectPointsList != "undefined" && _isDirectPointsList);
}
