/* $$$ JS file: nDynamic/nGMap.js: */
/**
* Google maps API fasade.
* --------------------------------------------------------------
* Interface methods:
*
* 	+ constructor(mapObj [, options])
*		Draws map inside a DOM object.
*		@param mapObj:	HTML element to draw map in.
*		@param options:	map configuration.
*			Available options:
*				lat:			latitude of the central map point
*				lng:		longitude of the central map point
*				zoom:		zoom value at the initialization
*
*	+ createEditableMarker(markerInputObj)
*
*		@param markerInputObj:		HTML input object that contains current marker coordinates.
*/
var cluster=null;
function nGMap(obj, options) {

	nDynamic(obj);
	obj.nName = 'nGMap';

	obj.initCenter = null;
	obj.markers = [];
	obj.editableMarker = null;

	obj.configure({
		lat:		null,
		lng:	null,
		zoom:	12,
		scrollZoom: false,
		searching: false,
		showScale: true,
		controlType: 0
	});




	function orderOfCreation(marker,b) {
		return 100;
	}

	//  map.addOverlay(new GMarker(new GLatLng(43.92,-79.5),{zIndexProcess:orderOfCreation}));

	obj.setMarker = function(lat, lng, infoHtml,type,id,name) {
		var newMarker;
		var point = new GLatLng(lat, lng);
		if(type){
			newMarker =new GMarker(point, {icon: obj.loadIcon(type),zIndexProcess:orderOfCreation,title:name} );
		}else{
			newMarker =new GMarker(point, { icon: obj.loadIcon(type),title:name } );
		}

		if (infoHtml) {
			var openInfo = function() {
				obj.map.openInfoWindowHtml(point, infoHtml);
			}
			//			openInfo();
			GEvent.addListener(newMarker, 'click', openInfo);
		}

		  //obj.map.addOverlay(newMarker);
		  if(type && type=='viewed'){
		  		obj.map.addOverlay(newMarker);
		  }else{
          		obj.markers.push(newMarker);
          }
		return newMarker;
	}

	obj.click=function(aim){
		GEvent.trigger(aim, 'click' ) ;
	}
	obj.createEditableMarker = function(markerInputObj, updateFromInput) {

		obj.editableMarker = new GMarker(obj.map.getCenter(), {
			draggable: true,
			dragCrossMove: false,
			clickable: false,
			icon: obj.loadIcon('viewed')
		});

		if (markerInputObj) {
			obj.markerInputObj = markerInputObj;

			obj.editableMarker.reportPosition = function(point) {
				obj.markerInputObj.value = this.getLatLng().toString().replace(new RegExp('[\\s\(\)]', 'gi'), '');
				obj.map.closeInfoWindow();
			}
			if (updateFromInput) {
				var position = obj.inputToPoint(obj.markerInputObj);
				obj.editableMarker.setLatLng(position);
				obj.map.setCenter(position);
			}
			GEvent.addListener(obj.editableMarker, 'dragend', obj.editableMarker.reportPosition);
		} else {
			obj.editableMarker.reportPosition = function() {}
		}

		GEvent.addListener(obj.editableMarker, 'click', function(){
			obj.map.openInfoWindowHtml(obj.editableMarker.getLatLng(), 'Select location of Your property.<br />Use controlls to pan and zoom the map.');
		});
		GEvent.addListener(obj.editableMarker, 'dragstart', function() {
			obj.map.closeInfoWindow();
		});

		updateEditableMarkerPosition = function(point) {
			if (obj.editableMarker) {
				var bounds = obj.map.getBounds();
				if (!bounds.contains(obj.editableMarker.getLatLng())) {
					obj.editableMarker.setLatLng(bounds.getCenter());
					if (obj.editableMarker.reportPosition) {
						obj.editableMarker.reportPosition();
					}
				}
			}
		}
		GEvent.addListener(obj.map, 'moveend', updateEditableMarkerPosition);

		obj.map.addOverlay(obj.editableMarker);
	}





	obj.loadMarkers = function() {
		//		var i, count = 0;
		//		if (obj.config.markers && obj.config.markers.length) {
		//			for (i in obj.config.markers) {
		//				obj.setMarker(obj.config.markers[i][0], obj.config.markers[i][1]);
		//				count++;
		//			}
		//		}
		//		return count;
	}


	obj.bindCenterToInput = function(inputObj, updateFromInput) {
		inputObj.reportPosition = function(point) {
			inputObj.value = obj.map.getCenter().toString().replace(new RegExp('[\\s\(\)]', 'gi'), '');
		}
		if (updateFromInput) {
			obj.map.setCenter(obj.inputToPoint(inputObj));
		}

		inputObj.reportPosition();
		inputObj.defaultValue = inputObj.value;
		GEvent.addListener(obj.map, 'moveend', inputObj.reportPosition);

		obj.centerInputObj = inputObj;
	}


	obj.inputToPoint = function(inputObj) {
		var coords = inputObj.value.split(',');
		if (coords.length == 2 && coords[0] && coords[1]) {
			return new GLatLng(coords[0], coords[1]);
		}
	}


	obj.bindZoomToInput = function(inputObj, updateFromInput) {
		inputObj.reportZoom = function(point) {
			inputObj.value = obj.map.getZoom().toString();
		}

		if (updateFromInput && !isNaN(inputObj.value)) {
			obj.map.setZoom(1 * inputObj.value);
		}

		inputObj.reportZoom();
		inputObj.defaultValue = inputObj.value;
		GEvent.addListener(obj.map, 'moveend', inputObj.reportZoom);

		obj.zoomInputObj = inputObj;
	}


	obj.loadIcon = function(iconType) {
		var icon = new GIcon();

		switch(iconType){
			case 'my':
			icon.image = '/images/gMapIconMy.png';
			break;
			case 'viewed':
			icon.image = '/images/gMapIconViewed.png';
			break;
			case 'un':
			icon.image = '/images/gMapIconUnaccepted.png';
			break;
			default:
			icon.image = '/images/gMapIcon.png';
			break;
		}
		icon.shadow = '/images/gMapIconShadow.png';
		icon.iconSize = new GSize(15, 55);
		icon.shadowSize = new GSize(38, 55);
		icon.iconAnchor = new GPoint(7, 55);
		icon.infoWindowAnchor = new GPoint(7, 5);
		return icon;
	}

	obj.clusterIcon=function(){
		var icon = new GIcon();
			icon.image = '/images/gMapGroupIcon.gif';
		icon.shadow = '/images/gMapIconShadow.png';
		icon.iconSize = new GSize(15, 42);
		icon.shadowSize = new GSize(38, 42);
		icon.iconAnchor = new GPoint(7, 42);
		icon.infoWindowAnchor = new GPoint(7, 5);
		return icon;

	}

		function myClusterClick(args) {
			obj.cluster.defaultClickAction=function(){
				obj.map.setCenter(args.clusterMarker.getLatLng(), obj.map.getBoundsZoomLevel(args.clusterMarker.clusterGroupBounds))
				delete obj.cluster.defaultClickAction;
			}
			var html='<div style="height:8em; overflow:auto; width:24em"><h4>'+args.clusteredMarkers.length+' Locations ( <a href="javascript:void(0)" onclick="mapObj.cluster.defaultClickAction()" class="zoomIn">zoom in</a> to see them):</h4>';
			for (i=0; i<args.clusteredMarkers.length; i++) {
				html+='<a href="javascript:mapObj.cluster.triggerClick('+args.clusteredMarkers[i].index+')">'+args.clusteredMarkers[i].getTitle()+'</a><br />';
			}
			html+='<br /><a href="javascript:void(0)" onclick="mapObj.cluster.defaultClickAction()">Zoom</a> in to show these locations</div>';
			//	args.clusterMarker.openInfoWindowHtml(html);
			obj.map.openInfoWindowHtml(args.clusterMarker.getLatLng(), html);
		}

		//var cluster=new ClusterMarker(obj.map, {clusterMarkerTitle:'Click to see info about %count locations' , clusterMarkerClick:myClusterClick });

	obj.init = function init() {
		obj.configure(options);

		//		obj.loadMarkers();

		obj.map = new GMap2(obj);
		obj.initCenter = new GLatLng(obj.config.lat, obj.config.lng);
		obj.map.setCenter(obj.initCenter, obj.config.zoom);
		switch(obj.config.controlType){
			case 1:
			obj.map.addControl(new GSmallZoomControl3D() );
			break;
			case 0:
			default:
			obj.map.addControl(new GLargeMapControl3D());
		}

		//obj.map.addControl(new GSmallZoomControl3D());

		obj.map.addControl(new GMenuMapTypeControl());
		//		obj.map.addControl(new GOverviewMapControl());
		if (obj.config.showScale)
		obj.map.addControl(new GScaleControl());

		if (obj.config.searching)
		obj.map.enableGoogleBar();
		if (obj.config.scrollZoom)
		obj.map.enableScrollWheelZoom();

		nConfig.addEvent(window, 'unload', function() {GUnload();});
		GEvent.addListener(obj.map, 'zoomend', function() { obj.map.closeInfoWindow(); });
	    obj.cluster=new ClusterMarker(obj.map, {clusterMarkerTitle:'Click to see info about %count locations' , clusterMarkerClick:myClusterClick,clusterMarkerIcon:obj.clusterIcon() });
	}

	if(typeof(GMap2) === 'function'){
		obj.init();
	}

	obj.ajaxLoad=function(){
		var w = window.location.href;
		jQuery.ajax({type: "POST",url: w,data: "ajaxload=1",success: function(r){
			eval(r);
		}});
	}


	return this;
}
