
c3YMapsWrapper = function(params)
{
	var map;
	var placemarks=[];
	var defaults={
		container: document.body,	/* где создать карту, - что-нибудь вроде '#YMapsID-1633', после # идентификатор элемента */
		center: null,	/* какое место показывать на карте после открытия*/
		type: YMaps.MapType.MAP, /* тип карты по-умолчанию */
		zoom: 12,	/* масштабирование карты по-умолчанию */ 
		/* Элементы управления, показываемые на карте, вместо true для всех кроме minimap, ruler, toolbar и type может быть указан объект с настройками (см. документации Yandex).
		 * для ruler и toolbar настроек нет.
		 * для type может быть передан массив допустимых видов показа карт, например [YMaps.MapType.MAP, YMaps.MapType.HYBRYD]
		 */
		controls: {	
			zoom: true,
			smallZoom: false,
			toolbar: true,
			type: true,
			minimap: 0,
			ruler: false,
			search: false
		},
		/*
		 * Массив объектов, описывающих добавляемые на карту места.
		 * пример:
		 * {
		 * 		name: 'cCube', 
		 * 		description: 'Офис cCube',
		 * 		position: [38.233411, 47.233441],
		 * 		iconContent: '',
		 * 		options: {
		 * 			style: 'hospital',
		 * 			hasHint: true
		 * 		}
		 * }
		 * Все параметры, кроме position, не обязательные.
		 * name - показывается в заголовке открывающегося бална и при наведении на метку.
		 * description - описание. Видно в балуне
		 * position - задает координаты метки на карте
		 * iconContent - текст, отображаемый внутри метки. Будет отображаться для стандартных стилей. 
		 * 		Можно сделать и свой стиль, но не так как показано внизу. Дальше см. документацию Yandex.
		 * options - различные опции (их много, см. документацию Yandex - PlacemarkOptions). 
		 * 		Например, style - стиль, т.е. как будет показываться метка. 
		 * 			Один из стандартных стилей (http://api.yandex.ru/maps/jsapi/doc/ref/reference/styles.xml)
		 * 			hasHint - показывать всплывающую подсказку при наведении. 
		 */
		places: [],
		/*
		 *	Массив стилей. Стили определяют как будут показываться метки на карте.
		 *	Пример стиля:
		 *	{
		 *			name: 'hospital',
		 *			iconStyle : 
		 *			{
     *           href : "/images/placemarks/hospital.png",
     *           size : new YMaps.Point(28,29),
     *           offset: new YMaps.Point(-8,-27)
     *      }
		 *	}	
		 * 	единственный обязательный параметр - name.
		 */
		styles: [],
		init: function()
		{
			map=new YMaps.Map(YMaps.jQuery(this.container)[0]);
			if(this.center&&this.center[0]&&this.center[1])
				map.setCenter(new YMaps.GeoPoint(this.center[0],this.center[1]), this.zoom, this.type);
			
			/* Элементы управления */
			if(this.controls.zoom)
				map.addControl(new YMaps.Zoom(typeof(this.controls.zoom)=='object'?this.controls.zoom:{}));
			if(this.controls.smallZoom)
				map.addControl(new YMaps.SmallZoom(typeof(this.controls.smallZoom)=='object'?this.controls.smallZoom:{}));
			if(this.controls.toolbar)
				map.addControl(new YMaps.ToolBar());
			if(this.controls.type)
				map.addControl(new YMaps.TypeControl(typeof(this.controls.type)=='object'?this.controls.type:[]));
			if(this.controls.minimap)
				map.addControl(new YMaps.Zoom(typeof(this.controls.minimap)=='number'?this.controls.minimap:3));
			if(this.controls.ruler)
				map.addControl(new YMaps.ScaleLine());
			if(this.controls.search)
				map.addControl(new YMaps.SearchControl(typeof(this.controls.search)=='object'?this.controls.search:{}));
				
			for(var i=0;i<this.styles.length;i++)
			{
				YMaps.Styles.add(this.styles[i].name, this.styles[i]);
			}


			for(var i=0;i<this.places.length;i++)
			{
				this.addPlace(this.places[i]);
			}
		},
		addPlace: function(place)
		{
			place.name = place.name || '';
			place.description = place.description || place.name;
			place.iconContent = place.iconContent || '';
			place.id = place.id || place.name || 'c3';
			place.position = place.position || [0, 0];
			place.options=place.options||{};
			place.options.hasBalloon = !! place.description;
			place.options.style=place.options.style||{};
			place.options.style.hasHint = typeof(place.options.style.hasHint=='undefined')? !! place.name: place.options.style.hasHint;
			var pm=new YMaps.Placemark(new YMaps.GeoPoint(place.position[0],place.position[1]),place.options);
			pm.name=place.name;
			pm.description=place.description;
			if(place.iconContent)
				pm.setIconContent(place.iconContent);
			var counter=2;
			var rid=place.id;
			while(typeof(placemarks[rid])!='undefined')
				rid=place.id+'-'+counter++;
			placemarks[rid]=pm;
			map.addOverlay(pm);
		}, 
		focus: function(id)
		{
			if(typeof(placemarks[id])=='undefined')
				return;
			var placemark=placemarks[id];
			map.panTo(placemark.getCoordPoint(),{flying: true, callback: function(){placemark.openBalloon();}});
		}
	};
	var obj=Object.extend(defaults,params);
	YMaps.jQuery(function (){obj.init.call(obj)});
	return obj;
}

