window.onload = function () {

	// yandex webkit mobilizer
	// made by V.Smirnoff (http://orl.sumy.ua)
	var YaMapWeb = function () {
	
		var dblClickLast,myPositionFlag,gpsTrackH = 0;
		var mapContainer = YMaps.jQuery('.YMaps-layer-container'); 
		YMaps.jQuery('*').css('-webkit-touch-callout','none').css('-webkit-user-select','none').bind('touchmove',function(event){event.preventDefault()}); 
		YMaps.jQuery('input').css('-webkit-touch-callout','behavior').css('-webkit-user-select','auto'); 
	
		this.checkInstalled = function () {return window.navigator.standalone}
		
		bindEvent = function (eventN,eventF) {mapContainer[0].addEventListener(eventN,eventF,false);}
				
		this.initEvents = function () {
			bindEvent ('touchstart',touchEvents);
			bindEvent ('touchmove',touchEvents);
			bindEvent ('touchend',touchEvents);
			bindEvent ('gesturechange',gestureEvents);
			bindEvent ('gestureend',gestureEvents);
		}
		
		touchEvents = function (event) {
			event.preventDefault();
			var eventT = event.type;
			var eventH = document.createEvent('MouseEvents');
			var eventN = '';
			
			if (event.touches.length == 1 || eventT == 'touchend') {
				event = event.touches[0];
				switch (eventT) {
					case 'touchstart'	: 	eventN = 'mousedown'; emulateDblClick(event); break;
					case 'touchmove'	: 	eventN = 'mousemove'; break;
					case 'touchend'		: 	eventN = 'mouseup'; break;
				}
				if (eventT != 'touchend')
					eventH.initMouseEvent(eventN,true,true,window,1,event.screenX,event.screenY,event.clientX,event.clientY,0,false,false,false,false,0,null);
				else
					eventH.initMouseEvent(eventN,true,true,window,1,0,0,0,0,0,false,false,false,false,0,null);
				mapContainer[0].dispatchEvent(eventH);
			} 
		}
		
		emulateDblClick = function (event) {
			var now = new Date().getTime()/1000;
			if (Math.round((now - dblClickLast)*1000)<400) {	
				var position = map.converter.clientPixelsToCoordinates(new YMaps.Point(event.clientX,event.clientY));
				map.zoomBy (2,{"smooth":true,"position":position,"centering":true})
			};
			dblClickLast = now;
		}

		gestureEvents = function (event) {
			if (event.type == 'gesturechange'  && event.scale !=0 && event.scale != 1) {
				if (event.scale != 0) {
					var curZoomLevel = map.getZoom();
					(event.scale>1)?curZoomLevel++:curZoomLevel--;					
					map.setZoom(curZoomLevel,{'smooth':true});
				}
			} else if (event.type == 'gestureend' && event.scale == 1) twoFingerClick(event);
		}
		
		this.setCenterGPS = function (zoomLvl,onErrorCoord) {
			if (navigator.geolocation) {
				navigator.geolocation.getCurrentPosition(
					function (position) {
					map.setCenter(new YMaps.GeoPoint(position.coords.longitude,position.coords.latitude),zoomLvl)},
					map.setCenter(onErrorCoord,zoomLvl));
			} else map.setCenter(onErrorCoord,zoomLvl);
		}
		
		this.markMyPosition = function (flagText,flagStyle) {
			if (navigator.geolocation) {
				gpsTrackH = navigator.geolocation.watchPosition(function (position) {
					if (!myPositionFlag) {
						myPositionFlag = new YMaps.Placemark(new YMaps.GeoPoint(position.coords.longitude,position.coords.latitude),flagStyle);
						myPositionFlag.setIconContent(flagText); 
						map.addOverlay(myPositionFlag); 
					} else myPositionFlag.setGeoPoint(new YMaps.GeoPoint(position.coords.longitude,position.coords.latitude));
				});
			}
		}
		
		this.setMapType = function (type) { 
			switch (type){
				case "MAP":			map.setType(YMaps.MapType.MAP);break;
				case "SATELLITE":	map.setType(YMaps.MapType.SATELLITE);break;
				case "HYBRID":		map.setType(YMaps.MapType.HYBRID);break;
				default:			map.setType(YMaps.MapType.MAP);type="MAP";break;
			}
			return type;			
		}
			
	}
			
			
	
	var map = new YMaps.Map(YMaps.jQuery('#ymap')[0]); 		
	var mpmob = new YaMapWeb ();
	
	mpmob.initEvents();
	mpmob.setCenterGPS(10, new YMaps.GeoPoint(37.64, 55.76));	
	
	YMaps.jQuery('#clickpos').bind('click',function(){mpmob.setCenterGPS(15, new YMaps.GeoPoint(37.64, 55.76))});
	
	var iter = 0;
	twoFingerClick = function (event) {
		if (iter == 0) {
		YMaps.jQuery('#header').slideToggle('slow');
		YMaps.jQuery('#footer').slideToggle('slow');
		iter=1}
		else iter=0;
	}
	
	footerMapTypeSelectors = function (typeClicked) {
		var typeSelected = mpmob.setMapType(typeClicked);
		YMaps.jQuery('#footer .button').css('background-image','url(buttonbkg.png)');
		YMaps.jQuery('#footer #'+typeSelected).css('background-image','url(buttonbkg_s.png)');
	}
	
	YMaps.jQuery('#footer .button').bind('click',function(){footerMapTypeSelectors(YMaps.jQuery(this).attr('id'))});
	
	YMaps.jQuery('#header .button').bind('click',function(){
		var geocoder = new YMaps.Geocoder(YMaps.jQuery('#searchf').val(),{results: 8});
		YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
			YMaps.jQuery('#searchresult').text(' ');
			if(!geocoder.length()) alert ('Ничего не найдено.'); else {
				for(iter=0;iter != geocoder.length(); iter++) {
					var result = geocoder.get(iter);
					YMaps.jQuery('#searchresult').append("<div class='line' coord='"+result.getGeoPoint().toString()+"'>"+result.text.substr(0,35)+'</div>');
				}
				YMaps.jQuery('#searchresult .line').bind ('click',function(){
					var coord = YMaps.jQuery(this).attr('coord');
					var geop = YMaps.GeoPoint.fromString(coord);
					map.setCenter(geop,13);
					YMaps.jQuery('#searchresult').slideUp('slow');
				});
				YMaps.jQuery('#searchresult').slideDown('slow');
			}
		});
		
		
		YMaps.Events.observe(geocoder, geocoder.Events.Fault, function (error) {
			alert(error.message)
		});
		
	});
	

	footerMapTypeSelectors ();
	mpmob.markMyPosition('<b>Я</b> тут',{style:"default#greenSmallPoint"});
	if (!mpmob.checkInstalled()) {
		YMaps.jQuery('body').html('<center><h1>Добавьте приложение в "Домой"<br/> (кнопка + чуть ниже)</h1></center>');
	}
}