var defaultYandexContainer='yMap';
var defaultYandexParentContainer='yMapContainer';
var defaultYandexZoom=15;

YandexMap=function(container, parentContainer){
	this.container=container||defaultYandexContainer;
	this.parentContainer=parentContainer||defaultYandexParentContainer;
	return this;
}

YandexMap.prototype={
	x: 0, y: 0, name: '', zoom: 0, cur_width: 0, cur_height: 0, controls: [],
	addControl: function(constructor, x, y){
		var control=new constructor();
		this.map.addControl(control, new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Point(x, y)));
		this.controls[this.controls.length]={control: control, x: x, y: y};
	},
	onResize: function(){

		var parent=$('#'+this.parentContainer);
		var container=$('#'+this.container);
		if(!parent.length) return;

		var dx=(parent.width()-container.width())/2;
		var dy=(parent.height()-container.height())/2;

		container.css("left", dx);
		container.css("top", dy);

		for(var i=0; i<this.controls.length; i++){
			this.map.removeControl(this.controls[i].control);
			this.map.addControl(this.controls[i].control, new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Point(this.controls[i].x-dx, this.controls[i].y-dy)));
		}

/*
		if(!this.cur_width) this.cur_width=container.width();
		var new_width=parent.width();

		if(!this.cur_height) this.cur_height=container.height();
		var new_height=parent.height();

		if(this.cur_width==new_width && this.cur_height==new_height) return;

		var cPoint=this.map.getCenter();
		var p1=this.map.converter.localPixelsToCoordinates(new YMaps.Point(this.cur_width, this.cur_height));
		var p2=this.map.converter.localPixelsToCoordinates(new YMaps.Point(new_width, new_height));
		this.map.setCenter(new YMaps.GeoPoint(cPoint.getLng()-(p2.getLng()-p1.getLng())/2, cPoint.getLat()-(p2.getLat()-p1.getLat())/2), this.zoom);

		this.cur_width=new_width;
		this.cur_height=new_height;
*/
	}
}

var defaultYandexMap=new YandexMap();

function showYandexMap(x, y, zoom, yandexMap, name, descr){
 if(!x||!y) return '';
 zoom=zoom||defaultYandexZoom;

 var yandexMap=yandexMap||defaultYandexMap;
 yandexMap.x=x;
 yandexMap.y=y;
 yandexMap.zoom=zoom;
 yandexMap.zoom=defaultYandexZoom;
 yandexMap.map = new YMaps.Map( document.getElementById(yandexMap.container) );
 yandexMap.map.setCenter(new YMaps.GeoPoint(yandexMap.x, yandexMap.y), yandexMap.zoom, YMaps.MapType.MAP);
 var s = new YMaps.Style();
 s.iconStyle = new YMaps.IconStyle();
 s.iconStyle.offset = new YMaps.Point(-8, -28);
 s.iconStyle.href = "/images/metka.png";
 s.iconStyle.size = new YMaps.Point(27, 28);

 var pm=new YMaps.Placemark(new YMaps.GeoPoint(yandexMap.x, yandexMap.y), {style: s});
 pm.name=name||"";
 pm.description=descr||"";
 yandexMap.map.addOverlay(pm);
}

function showYandexMapByBounds(leftBottom, rightTop, yandexMap, name, descr){
 if(!leftBottom || !rightTop) return '';

 var yandexMap=yandexMap||defaultYandexMap;
 yandexMap.map = new YMaps.Map( document.getElementById(yandexMap.container) );

 var mBounds=new YMaps.GeoBounds(leftBottom, rightTop);
// yandexMap.map.setBounds(mBounds);
 var mCenter=mBounds.getCenter();
 yandexMap.x=mCenter.getLng();
 yandexMap.y=mCenter.getLat();
 yandexMap.zoom=mBounds.getMapZoom(yandexMap.map);
 if(yandexMap.zoom>defaultYandexZoom) yandexMap.zoom=defaultYandexZoom;
 yandexMap.zoom=defaultYandexZoom;

 yandexMap.map.setCenter(new YMaps.GeoPoint(yandexMap.x, yandexMap.y), yandexMap.zoom, YMaps.MapType.MAP);

 var s = new YMaps.Style();
 s.iconStyle = new YMaps.IconStyle();
 s.iconStyle.offset = new YMaps.Point(-8, -28);
 s.iconStyle.href = "/images/metka.png";
 s.iconStyle.size = new YMaps.Point(27, 28);

 var pm=new YMaps.Placemark(new YMaps.GeoPoint(yandexMap.x, yandexMap.y), {style: s});
 pm.name=name||"";
 pm.description=descr||"";
 yandexMap.map.addOverlay(pm);
}

function showYandexMapByAddr(addr, obj, yandexMap, name, descr){
 if(!addr) return '';
 if(typeof obj!="undefined") obj=$(obj);

 var name=name||"";
 var descr=descr||"";

 var yandexMap=yandexMap||defaultYandexMap;
 yandexMap.map = new YMaps.Map( document.getElementById(yandexMap.container) );

 var geocoder = new YMaps.Geocoder(addr, {results: 1});
 YMaps.Events.observe(geocoder, geocoder.Events.Load, function(){
  if(this.length()){
   geoResult = this.get(0);
//this command results in errors in ie...
//need more understanding. is this simply a point? o_o   yandexMap.map.addOverlay(geoResult);
   var mCenter=geoResult.getBounds().getCenter();
   yandexMap.x=mCenter.getLng();
   yandexMap.y=mCenter.getLat();
   yandexMap.zoom=geoResult.getBounds().getMapZoom(yandexMap.map);
   if(yandexMap.zoom>defaultYandexZoom) yandexMap.zoom=defaultYandexZoom;
   yandexMap.zoom=defaultYandexZoom;
   yandexMap.map.setCenter(new YMaps.GeoPoint(yandexMap.x, yandexMap.y), yandexMap.zoom, YMaps.MapType.MAP);
   var s = new YMaps.Style();
   s.iconStyle = new YMaps.IconStyle();
   s.iconStyle.offset = new YMaps.Point(-8, -28);
   s.iconStyle.href = "/images/metka.png";
   s.iconStyle.size = new YMaps.Point(27, 28);

   pm=new YMaps.Placemark(mCenter, {style: s});
   pm.name=name||"";
   pm.description=descr||"";
   yandexMap.map.addOverlay(pm);
   var x=yandexMap.x,y=yandexMap.y,zoom=yandexMap.zoom;
   saveGeocoderCache(addr, x, y, zoom);

   if(typeof obj=="undefined") return;
   obj.onmouseover=null;
   obj.unbind('mouseover');
   obj.tooltip({
    delay: 0,
    track: true,
    bodyHandler: function(){
        window.setTimeout(function(){showYandexMap(x, y, zoom);}, 10);
        return '<div id="yMap" style="width: 300px; height: 200px;">&nbsp;</div>'; 
    }, 
    showURL: false
   });
  } else {
   if(typeof obj=="undefined") return;

   obj.onmouseover=null;
   obj.unbind('mouseover');

   var text=obj.innerHTML;
   obj.parentNode.innerHTML=text;
//   document.getElementById(yandexMap.container).innerHTML="Адрес не найден на Яндекс.Картах";
  }
 });
}

function saveGeocoderCache(addr, x, y, zoom){
	var zoom=zoom||defaultYandexZoom;
	var data=addr+':'+x+','+y+','+zoom;
	$.ajax({
		url: "/scripts_infos/ajax_geocoder_cache.php",
		data: {data: data, action: 'save'},
		dataType: 'text',
		success: function(){
			//
		}
	});
}

