/** 
 * Manages the custom maps for the phone selector
 */
var PhoneMapManager = function() {
	/**
	 * The id of the currently selected phone
	 */
	var _selectedPhone = 0;
	
	/**
	 * Stores the GMap object
	 */
	var _map;
	
	/**
	 * Stores Google Copyright Collection
	 */
	var _copyright_collection;
	
	/**
	 * Stores ajax requests to xml marker files
	 */
	var _xhr;
	
	/**
	 * Custom marker icon
	 */
	var _marker;
	
	/**
	 * Loads a custom tile image
	 * @param Int a
	 * @param Int b
	 * @return String
	 */	
	function _getTileUrl(a, b) {
    	var f = inq.settings.base_path + "mysite/maps/" + _selectedPhone + "/"+b+"_"+a.x+"_"+a.y+".png";
    	return f;
  	}

	/**
	 * Creates markers from xml file (mysite/maps/_selectedPhone/markers.xml)
	 */
	function _createMarkers() {	 
		if (_xhr) {
			_xhr.abort();
		}
		
		_xhr = $.get(inq.settings.base_path + "mysite/maps/" + _selectedPhone + "/markers.xml", function(doc) {
			if (!doc.documentElement) return; // the file isn't there
			var markers = doc.documentElement.getElementsByTagName("marker");
			
			
	      	for (var i = 0, j = markers.length; i < j; i++) {
				// obtain the attribues of each marker
		        var lat = parseFloat(markers[i].getAttribute("lat"));
		        var lng = parseFloat(markers[i].getAttribute("lng"));
		        var point = new GLatLng(lat,lng);
		        var url = markers[i].getAttribute("url");
		        var label = markers[i].getAttribute("label");
		        var point = new GLatLng(lat, lng);
		        var marker = new GMarker(point, _marker);
		
				marker.url = url;
				_map.addOverlay(marker);

				GEvent.addListener(marker, 'click', function() {
              		var hash = location.hash;
          	  		var parts = hash.split('/');
          	  		var label;
          	  
          	  		var customid = $('#' + _selectedPhone).attr('rel');
              
              		if (hash == '' || parts[1] != 'phones') {
		  				hash = '#/phones/' + customid + '/features/' + this.url;   
			    		label = customid;    
		            } else {
  					    hash = '#/' + parts[1] + '/' + parts[2] + '/features/' + this.url;      
  					    label = parts[2]; 
  					}

          			hash = hash.replace(/^.*#/, '');
          		          		
	          		$.history.load(hash);
		        });
			}
		});
	}
	
	var publicAPI = {
		/**
		 * Creates a Google Map instance for populating with custom tiles
		 * @param String id The initial phone to load
		 * @param Object Custom settings
		 */
		init : function(id, settings) {
			var copyright;
			var options;
			var settings = settings || {};
			var defaults = {
				domId: 'map',
				bgColor: '#e5e3df',
				copyrightText: 'iNQ'
			};
			
			
			options = $.extend(defaults, settings);
			
			// create map
			_map = new GMap2(document.getElementById(options.domId), { backgroundColor: options.bgColor });
			_map.addControl(new GLargeMapControl());
			
			// add copyright notice
			copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)), 3, "<span style='color: #fff'>" + options.copyrightText + "</span>");
			_copyright_collection = new GCopyrightCollection('');
			_copyright_collection.addCopyright(copyright);
			
			GEvent.addListener(_map, "zoomend", function(oldzoom, zoom) { 
			  	if (typeof oldzoom != 'undefined') {
          			TrackEvent.addLabel({action: 'Phones', label: _selectedPhone, value: 'Zoom level change from ' + oldzoom + ' to ' + zoom});
        		}
      		});

			// custom marker
			_marker = new GIcon(G_DEFAULT_ICON);
			_marker.image = inq.settings.base_path + 'themes/inq/images/pin.png';
			_marker.shadow = inq.settings.base_path + 'themes/inq/images/pin-shadow.png';
			_marker.iconSize = new GSize(25, 31);
			_marker.shadowSize = new GSize(25, 31);
			
			
			this.loadMap(id);
		},
		
		/**
		 * Loads a custom Google Map
		 * @param String id Phone id. Should correspond to the name of a directory in /mysite/maps
		 */
		loadMap: function(id) {
			var layers;
			var map;
			
			_map.clearOverlays();
			
			_selectedPhone = id;
			
			// TODO All this only needs to be done on set-up as well I think
			// Only need to change the selectedPhone and clear the overlays
			// add custom tile layers
			layers = [ new GTileLayer(_copyright_collection, 3, 6) ];
			layers[0].getTileUrl = _getTileUrl;
			
			// create custom map from layers
			map = new GMapType(layers, new GMercatorProjection(7), "Phone Map");
			
			// add custom map to Google map
			_map.setCenter(new GLatLng(74,-91, true), 3, map);
			_map.addMapType(map);
			
			_createMarkers();
		}
	}
	
	return publicAPI;
}();