/*
@Class UIMap

@Author : Charles Demers

@version : 0.1

*/
var UIMap = {

	map : null,
	markerIcon : null,
	defaultCenter : null,
	markers : new Array(),
	directionsRenderer : null,
	directionsService : null,
	mapLoadingCallback : function(){},
	
	_map_id : "",

	/*
	@Function init
	
	@param (String) id,
	
	@param (Object) opts {
		
		(Object) defaultCenter {
			(Number) lat,
			(Number) lng,
			(Number) zoom
		},
		(String) 	lang
	}
	
	@param (Function) mapLoadingCallback
	*/
	init:function(id,opts, mapLoadingCallback){
		if(id && typeof id == "string"){
			UIMap._map_id = id;
		} else {
			throw "[UIMap] could not initialize; id was not provided or is not a string";
		}
		if(opts){
			UIMap.defaultCenter = (opts.defaultCenter) ? opts.defaultCenter : {lat:0,lng:0,zoom:1};;
			UIMap.lang = (opts.lang) ? opts.lang : "en";
			UIMap.mapLoadingCallback = (mapLoadingCallback) ? mapLoadingCallback : function(){};
		}
		var c = UIMap.defaultCenter;
		c.zoom = (c.zoom) ? c.zoom : 1;
		var mapOpts = {
			mapTypeControl:false,
			navigationControlOptions: {
				style: google.maps.NavigationControlStyle.ZOOM_PAN
			},
			zoom: c.zoom,
			center: new google.maps.LatLng(c.lat, c.lng),
			mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		
		UIMap.map = new google.maps.Map(document.getElementById(UIMap._map_id), mapOpts);
		google.maps.event.addListener(UIMap.map, "tilesloaded", function(){
			UIMap.mapLoadingCallback(UIMap.map);
		});
	},
	/*
	@Function createMarkerIcon
	
	@param (String) img_src,
	
	@param (Object) imgOpts {

		(Number) w,
		(Number) h

		(Number) x,
		(Number) y
	}
	
	@param (String) shad_src,
	
	@param (Object) shadOpts {

		(Number) w,
		(Number) h

		(Number) x,
		(Number) y
	}
	*/
	setMarkerIcon:function(img_src,imgOpts,shad_src,shadOpts){
		var iw = imgOpts.w;
		var ih = imgOpts.h;
		var ix = (imgOpts.x) ? imgOpts.x : iw/2;
		var iy = (imgOpts.y) ? imgOpts.y : ih;
		
		var i = new google.maps.MarkerImage(
			img_src,		 				/* image src	*/
			new google.maps.Size(iw,ih), 	/* image size	*/
			new google.maps.Point(0,0),		/* image origin	*/
			new google.maps.Point(ix,iy)	/* anchor point	*/
		);
		if(shadOpts){
			var sw = shadOpts.w;
			var sh = shadOpts.h;
			var sx = (shadOpts.x) ? shadOpts.x : sw/2;
			var sy = (shadOpts.y) ? shadOpts.y : sh;
			
			var s = new google.maps.MarkerImage(
				shad_src,		 				/* image src	*/
				new google.maps.Size(sw,sh), 	/* image size	*/
				new google.maps.Point(0,0),		/* image origin	*/
				new google.maps.Point(sx,sy)	/* anchor point	*/			
			);
		}
		UIMap.markerIcon = {icon:i,shadow:s};
	},
	createMarker:function(_id,pos,title,contents,z){
		var point = new google.maps.LatLng(pos.lat,pos.lng);
		var marker = new google.maps.Marker({
			id:_id,
			position:point,
			map:UIMap.map,
			title:title,
			icon:UIMap.markerIcon.icon,
			shadow:UIMap.markerIcon.shadow,
			zIndex:z
		});
		UIMap.markers.push(marker);
		
		// Info window if content is passed,
		if(contents) {
			var infowindow = new google.maps.InfoWindow({
				content:contents
			});
		
			google.maps.event.addListener(marker, "click", function(e){
				UIMap.map.setCenter(e.latLng);
				var zoom = (pos.zoom) ? pos.zoom : 12;
				UIMap.map.setZoom(zoom);
			
				infowindow.open(UIMap.map,marker);
			
				/* sends id and lat,lng to callback handler */
				UIMap.markerClickCallback(this.info_id,this.ra);
			});
		}
	},
	traceRoute:function(start,end,callback,travel_mode){
		UIMap.clearMarkers();
		if(UIMap.directionsRenderer) UIMap.directionsRenderer.setMap(null);
		UIMap.directionsRenderer = null;
		
		travel_mode = (travel_mode) ? travel_mode.toUpperCase() : "DRIVING";
		if(travel_mode != "DRIVING" && travel_mode != "WALKING") throw("[UIMap.traceRoute] travelMode must be 'DRIVING' or 'WALKING'");
		callback = (callback) ? callback : function(){};
		
		UIMap.directionsRenderer = new google.maps.DirectionsRenderer();
		UIMap.directionsRenderer.setMap(UIMap.map);
		UIMap.directionsService = new google.maps.DirectionsService();
		var request = {
			origin:start,
			destination:end,
			travelMode:google.maps.DirectionsTravelMode[travel_mode],
			language:UIMap.lang
		}
		UIMap.directionsService.route(request, function(result,status){
			if(status == google.maps.DirectionsStatus.OK){
				UIMap.directionsRenderer.setDirections(result);
				callback();
			}
		});
	},
	centerOnMarker:function(id,zoom){
		for(var i=0; i<UIMap.markers.length; i++){
			if(UIMap.markers[i].id == id){
				UIMap.map.setCenter(UIMap.markers[i].position);
				zoom = (zoom) ? zoom : 15;
				UIMap.map.setZoom(zoom);
				var contents = UIMap.markers[i].title;
				var infowindow = new google.maps.InfoWindow({
					content:contents
				});
				infowindow.open(UIMap.map,UIMap.markers[i]);
			}
		}
	},
	clearMarkers:function(a_markers){
		if(a_markers){
			var l = a_markers.length;
			var len = UIMap.markers.length;
			for(var i=0; i<l; i++){
				for(var k=0; k<len; k++){
					if(a_markers[i].id == UIMap.markers[k].id){
						UIMap.markers[k].setMap(null);
						UIMap.markers.splice(k,0);
					}
				}
			}
		} else {
			var l = UIMap.markers.length;
			for(var j=0; j<l; j++){
				UIMap.markers[j].setMap(null);
			}
			UIMap.markers = [];
		}
		
	}
}
