/* 
Copyright 2009 Expedia, Inc. All rights reserved. 
*/

/**
 * Utility for loading the dynamic map
 * @namespace YAHOO.cx.exp.map.loader
 */
YAHOO.namespace("cx.exp.map.loader");
/**
* Constant used for specifying the script location
* @type String
*/
var MAPPER_SCRIPT_LOCATION = "/static/default/default/scripts/exp/map/display";

/**
* Constant used for specifying the location of the mapper factory script.
* @type String
*/
var MAPPER_FACTORY_SRC = MAPPER_SCRIPT_LOCATION + "/expediaMap.js";

/**
* The MapLoader class is used for loading the mapping APIs and rendering the dynamic map.
* This class loads the APIs before renders the specified map type
* @param {String} mapType The map type, either Google or Microsoft
* @param {String} staticSrc The location of the static proprietary script.
* @param {String} dynamicSrc The location of the dynamic proprietary script.
* @param {String} params The map parameters.
* @param {String} gMapVersion the google map version, if value is '3' use google map version 3, if haven't value use google map version 2.
* @class YAHOO.cx.exp.map.loader.mapLoader
*/
YAHOO.cx.exp.map.loader.MapLoader = function (mapType /*:String */, staticSrc /*:String */, dynamicSrc /*:String */, params /* parameters */, gMapVersion/*only for google map*/){
	
	// validate the input, do nothing if it fails
	if(arguments.length < 3 ||
		!(YAHOO.lang.isString(mapType) && (mapType.length > 0)) ||
		!(YAHOO.lang.isString(staticSrc) && (staticSrc.length > 0)) ||
		!(YAHOO.lang.isString(dynamicSrc) && (dynamicSrc.length > 0)) ){
		return;
	}
	
	// instance variables
	var _static_external_src = staticSrc;	
	var _dynamic_external_src = dynamicSrc;	
	var _mapType = mapType;
	var _adapter_src = MAPPER_SCRIPT_LOCATION + "/mapApi_" + _mapType + ".js";
	var _params = "";
	if (YAHOO.lang.isString(params)) 
		_params = params;	
	
	//add for use google map v3.
	if(gMapVersion && '3' == gMapVersion){
		_adapter_src = MAPPER_SCRIPT_LOCATION + "/mapApi_" + _mapType + "3.js";
	}
		
	/**
	* Loads the script for the external proprietary APIs with the callback set to loadAdapterScript
	*/
	YAHOO.cx.exp.map.loader.MapLoader.loadExternalScript = function(){
		if(_mapType == "Google") {
			_dynamic_external_src = _dynamic_external_src + "?callback=YAHOO.cx.exp.map.loader.MapLoader.loadAdapterScript";
			YAHOO.cx.exp.util.loadScript(_dynamic_external_src);
		}
		else {
			var langCode = YAHOO.cx.exp.map.loader.MapLoader.getLanguageCode();
			if (langCode != "") {
				_dynamic_external_src += '&mkt=' + langCode;
			}
			YAHOO.cx.exp.util.loadScript(_dynamic_external_src, {callback: YAHOO.cx.exp.map.loader.MapLoader.loadAdapterScript});
		}
	};

	YAHOO.cx.exp.map.loader.MapLoader.getLanguageCode = function(){
		var langCode = "";
		
		switch (JSONMapConfig.LanguageCode) {
			case 'cs':
				langCode = 'cs-CZ';
				break;
			case 'da':
				langCode = 'da-DK';
				break;
			case 'nl':
				langCode = 'nl-NL';
				break;
			case 'en':
				langCode = 'en-US';
				break;
			case 'fi':
				langCode = 'fi-FI';
				break;
			case 'fr':
				langCode = 'fr-FR';
				break;
			case 'de':
				langCode = 'de-DE';
				break;
			case 'it':
				langCode = 'it-IT';
				break;
			case 'ja':
				langCode = 'ja-JP';
				break;
			case 'nb':
				langCode = 'nb-NO';
				break;
			case 'pt':
				langCode = 'pt-PT';
				break;
			case 'es':
				langCode = 'es-ES';
				break;
			case 'sv':
				langCode = 'sv-SE';
				break;
		}
		
		return langCode;
	}
	
	/**
	* Loads the script for the adapter APIs with a callback set to loadMapperScript
	*/
	YAHOO.cx.exp.map.loader.MapLoader.loadAdapterScript = function() {		
		YAHOO.cx.exp.util.loadScript(_adapter_src,{callback: YAHOO.cx.exp.map.loader.MapLoader.loadMapperScript});
	}

	/**
	 * Loads the script for the mapper factory APIs with a callback set to render
	 */
	YAHOO.cx.exp.map.loader.MapLoader.loadMapperScript = function(){		
		YAHOO.cx.exp.map.loader.registerAPILoadEvent.subscribe(render);
		YAHOO.cx.exp.util.loadScript(MAPPER_FACTORY_SRC,{callback:renderMap});		
	}	

	/**
	* This method will load the  map with the additional map parameters
	* @param {String} renderType The render type
	* @param {String} additional map parameters
	*/
	this.loadMap = function(renderType /*: String*/, params  /*: String*/){	
		if (renderType == "Static") {
			// construct the query string 
			var query = _params;
			if (YAHOO.lang.isString(params)) {
				if (query.length > 0)
					query  =  query + "&" + params
				else
					query = params;
			}			
			var src = _static_external_src;
			if (query.length > 0)
				var src = src + "?" + query;				

			// load the static image
			this.googleImage = YAHOO.util.Dom.get(JSONMapConfig.Container + "_image");
			this.googleImage.src = src ;	
			this.googleImage.style.cursor = 'hand';	
			this.googleImage.style.cursor = 'pointer';	
		} else {
			this.googleImage = null;
			// load all the API scripts, this will execute the render() callback method
			YAHOO.cx.exp.map.loader.MapLoader.loadExternalScript ();	
		}
	}
		
	var renderMap = function(){
		YAHOO.cx.exp.map.display.map.render();
	}
	
	/**
	 * Renders the map
	 */
	var render = function(){
		// create the map		
		YAHOO.cx.exp.map.display.map.createMap(_params);
	}	
};

/**
* This method will trigger all the registerd listeners after the map APIs have been loaded
*/
YAHOO.cx.exp.map.loader.registerAPILoadEvent = function(){
	var obj = new YAHOO.util.CustomEvent("YAHOO.cx.exp.map.loader.registerAPILoadEvent");
	return obj;
}();

