
/// <reference path="../../../../../jQuery/1.3.2/jquery-1.3.2-vsdoc.js" />

/**
 *
 * Location map feature
 *
 */
	
	if (!mrm.global.isNamespaceDefined("mrm.common.display.views")) mrm.global.createNamespace("mrm.common.display.views", "1.0");
	
	
	if (mrm.common.display.SwfExternalDataHost.subClass)
	{
			mrm.common.display.views.LocationMapFeature = mrm.common.display.SwfExternalDataHost.subClass(
			{
				
				
	//			
	//				=== DATA STRUCTURE ====
	//
	//				{
	//					"userCriteria" : 
	//					{
	//						"location"		: "AA1 1AA",	// [ String ]			[ non-selected = undefined ]
	//						"easting"		: 00000,		// [ int (5 digit)]		[ non-selected = -1 ]
	//						"northing"		: 00000,		// [ int (5 digit)]		[ non-selected = -1 ]
	//						"maxDistance"	: -1;			// [ int ]				[ non-selected = -1 ]
	//					},
	//					
	//					"centreData" : 
	//					[
	//						{
	//							"centreId"			: -1,		// [ int ]
	//							"centreName"		: "",		// [ String ]			[ non-selected = undefined ]
	//							"easting"			: 00000,	// [ int (5 digit)]		[ non-selected = -1 ]
	//							"northing"			: 00000,	// [ int (5 digit)]		[ non-selected = -1 ]
	//							"distance"			: -1;		// [ int ]				[ non-selected = -1 ]
	//						}
	//					]
	//				}
	//
				
				
				/*
				 =============================
				 CONSTANTS
				 =============================
				 */
					DISPLAY_MODE_DEFAULT	: "DISPLAY_MODE_DEFAULT",
					DISPLAY_MODE_NARROW		: "DISPLAY_MODE_NARROW",
				
					
					DISPLAY_HEIGHT			: 380,
					
					DISPLAY_WIDTH_DEFAULT	: 414,
					DISPLAY_WIDTH_NARROW	: 265,
					
					
					SELECTOR_LINKS_CONTAINER : "div.search-location-panel-container > div.panel-search-location div.panel-body > div.panel-body-footer > div.panel-body-footer-links",
					
					CLASS_PANEL_OPEN	: "panel-search-location-open",
					CLASS_PANEL			: "panel-search-location",
					
					CLASS_PANEL_BODY_CONTAINER			: "panel-body-container",
					CLASS_PANEL_BODY_CONTAINER_OPEN		: "panel-body-container-open",
					CLASS_PANEL_BODY_CONTAINER_CLOSED	: "panel-body-container-closed",
					
					CLASS_OPEN : "open",
					CLASS_CLOSE : "close",
					
					
					
					EVENT_TYPE_INVALID_LOCATION : "EVENT_TYPE_INVALID_LOCATION",
					EVENT_TYPE_UPDATE_DISTANCE	: "EVENT_TYPE_UPDATE_DISTANCE",
					
					
					EVENT_PROP_TYPE			: "type",
					EVENT_PROP_MAX_DISTANCE	: "distanceMax",
					
					
					
				/*
				 =============================
				 CONFIGURATION PROPERTIES (instance configuration)
				 =============================
				 */
				
				
				
				/*
				 =============================
				 CONSTRUCTOR
				 =============================
				 */
					init : function (classInstanceID, replacementTargetParentID, replacementTargetID, swfInstanceID, swfData, displayMode)
					{
						
						// Configure flash object attributes and properties
						var targetFlashVersion		= "9.0.48";
						//var targetFlashVersion	= "100";
						
						
						var width	= (displayMode == this.DISPLAY_MODE_NARROW) ? this.DISPLAY_WIDTH_NARROW : this.DISPLAY_WIDTH_DEFAULT;
						var height	= this.DISPLAY_HEIGHT;
						
						
						var swfAttributes				= {};
						swfAttributes.data				= "/assets/flash/MapLocationFeature.swf";
						swfAttributes.id				= swfInstanceID;
						swfAttributes.name				= swfInstanceID;
						swfAttributes.width				= width;
						swfAttributes.height			= height;
						swfAttributes.pluginspage		= "http://www.macromedia.com/go/getflashplayer";
						
						var swfParameters				= {};
						swfParameters.align				= "top";
						swfParameters.allowfullscreen	= true;
						swfParameters.allowscriptaccess	= "sameDomain";
						swfParameters.base				= "../../";
						swfParameters.bgcolor			= "#c7c7c7";
						swfParameters.devicefont		= false;
						swfParameters.loop				= false;
						swfParameters.menu				= true;
						swfParameters.play				= true;
						swfParameters.quality			= "best";
						swfParameters.salign			= "tl";
						swfParameters.scale				= "noscale";
						swfParameters.wmode				= "opaque"; //transparent || opaque
						
						
						//this._swfFlashVars = "&a=" + "a";
						
						this._swfData = swfData;
						
						// Call super class init()
						this._super(classInstanceID, replacementTargetParentID, replacementTargetID, swfInstanceID, targetFlashVersion, swfAttributes, swfParameters, "", swfData, true);
						
						
						
						
						// Configure panel open / close functionality
						this._configureOpenCloseMechanism();
						
				
						// TEMP :: Configure temporary testing links >>> REMOVE WHEN COMPLETE!!!
						this.__setupTestLinks();
					},
				
				
				
				/*
				 =============================
				 INTERNAL RUN-TIME PROPERTIES
				 =============================
				 */
				
				
				
				/*
				 =============================
				 PUBLIC METHODS
				 =============================
				 */
					
					
					/*
					 --------------------------------
					 [ OVERRIDE ] :: Triggers data load
					 --------------------------------
					*/
						setSwfObjectReady : function (b, swfObjectID)
						{
							//alert("setSwfObjectReady : swfObjectID = " + swfObjectID);
							this._super(b, swfObjectID);
							if (b && this.isSwfObjectInstanceDefined()) this.getSwfObject().triggerDataLoad();
						},
					
					
					
					/*
					 --------------------------------
					 --------------------------------
					*/
						processDistanceUpdate : function (distance)
						{
							// Pass to internal processing method
							var e = {};
							e[this.EVENT_PROP_TYPE] = this.EVENT_TYPE_UPDATE_DISTANCE;
							e[this.EVENT_PROP_MAX_DISTANCE] = distance;
							
							this._updateMapStatus(e);
						},
						
						
						processInvalidLocationUpdate : function ()
						{
							// Pass to internal processing method
							var e = { "type" : this.EVENT_TYPE_INVALID_LOCATION };
							this._updateMapStatus(e);
						},
						
						
						
						processDataUpdate : function (dataObject)
						{
							this._updateMapData(dataObject);
						},
						
						
						
				
				
				/*
				 =============================
				 INTERNAL METHODS
				 =============================
				 */
					/*
					 =============================
					 INTERNAL EVENT HANDLERS
					 =============================
					 */
						_handlePanelOpen : function (e)
						{
							var link = $(e.target);
							var open = (link.hasClass(this.CLASS_OPEN)) ? true : false;
							
							var panel		= link.closest("div." + this.CLASS_PANEL); 
							var panelBody	= link.closest("div." + this.CLASS_PANEL_BODY_CONTAINER);
							
							if (open)
							{
								panel.addClass(this.CLASS_PANEL_OPEN);
								panelBody.removeClass(this.CLASS_PANEL_BODY_CONTAINER_CLOSED);
								panelBody.addClass(this.CLASS_PANEL_BODY_CONTAINER_OPEN);
								
								// Create swf object if not already created
								if (!this.isSwfObjectInstanceDefined())
								{
									this._setupSwfObject();
								}
							}
							else
							{
								panel.removeClass(this.CLASS_PANEL_OPEN);
								panelBody.removeClass(this.CLASS_PANEL_BODY_CONTAINER_OPEN);
								panelBody.addClass(this.CLASS_PANEL_BODY_CONTAINER_CLOSED);
							}
						},
						
						
						
					/*
					 =============================
					 UTILITIES
					 =============================
					 */
				
				
				
					/*
					 =============================
					 SETUP
					 =============================
					 */
						_configureOpenCloseMechanism : function ()
						{
							var __this = this;
							
							var linksContainer = $(this.SELECTOR_LINKS_CONTAINER);
							var links = linksContainer.find("a.open-close");
							
							links.click(
								function (e)
								{
									__this._handlePanelOpen(e);
								}
							);
						},
				
				
				
					/*
					 =============================
					 DISPLAY CONTROL
					 =============================
					 */
						_updateMapStatus : function (e)
						{
							/*
							{
								"type"			: "EVENT_TYPE_UPDATE_DISTANCE" || "EVENT_TYPE_INVALID_LOCATION",
								"distanceMax"	: "200" (optional : include if == EVENT_TYPE_UPDATE_DISTANCE)
							}
							*/
							
							var type = e[this.EVENT_PROP_TYPE];
							
							// Store update in internal data object
							switch (type)
							{
								case this.EVENT_TYPE_INVALID_LOCATION :
									this._storeLocationDataInvalid();
									break;
								
								case this.EVENT_TYPE_UPDATE_DISTANCE :
									this._storeMaxDistance(e[this.EVENT_PROP_MAX_DISTANCE]);
									break; 
							}
							
							// Pass update into map if created
							if (this.getSwfObjectReady()) this.getSwfObject().remoteUpdateStatus(e);
						},
						
						
						
						_updateMapData : function (newMapData)
						{
							// Store new data
							this._swfData = newMapData;
							
							// Pass into map if created
							if (this.getSwfObjectReady()) this.getSwfObject().remoteUpdateNewData(newMapData);
						},
						
				
				
				
					/*
					 =============================
					 INTERNAL DATA STORAGE
					 =============================
					 */
						_storeLocationDataInvalid : function ()
						{
							var emptyData = 
							{
								"location"		: "",
								"easting"		: "-1",
								"northing"		: "-1",
								"distanceMax"	: -1,
								"localCentreId" : -1
							}
							
							this._swfData["userCriteria"] = emptyData;
						},
						


						_storeMaxDistance : function (distance)
						{
							try	{ this._swfData["userCriteria"]["distanceMax"] = distance; } catch (e){}
						},
					
					
					
					
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
						/////////////////////////////////////////
							/////////////////////////////////////////
								/////////////////////////////////////////
									/////////////////////////////////////////
										/////////////////////////////////////////
											
											
											__setupTestLinks : function ()
											{
												var __this = this;
												
												$("a.test-updateData").click(function (e){ __this.__TEST_newDataLoad(); });
												
												$("a.test-updateDistance").click(function (e){ __this.__TEST_distanceChange(); });
												
												$("a.test-updateInvalid").click(function (e){ __this.__TEST_invalidLocation(); });
											},
											
											
											
											
											__TEST_distanceChange : function ()
											{
												//alert("__TEST_distanceChange");
												this.processDistanceUpdate(300);
											},
											
											
											__TEST_invalidLocation : function ()
											{
												//alert("__TEST_invalidLocation");
												this.processInvalidLocationUpdate();
											},
											
					
											__TEST_newDataLoad : function ()
											{
												//alert("__TEST_newDataLoad");
												var newData = 
												{
													"userCriteria" : 
													{
														"location"		: "AA1 1AB",
														"easting"		: "30000",
														"northing"		: "30000",
														"distanceMax"	: 200,
														"localCentreId" : -1
													},
													
													"centreData" : 
													[
														{
															"centreId"			: 1,
															"centreName"		: "New centre 1",
															"easting"			: "00000",
															"northing"			: "00000",
															"distance"			: 70
														},
														{
															"centreId"		: 2,
															"centreName"	: "New centre 2",
															"easting"		: "05000",
															"northing"		: "05000",
															"distance"		: 200
														},
														{
															"centreId"		: 3,
															"centreName"	: "New centre 3",
															"easting"		: "10000",
															"northing"		: "10000",
															"distance"		: 400
														}
													]
						
												};
											
												this.processDataUpdate(newData);
											}
					
										/////////////////////////////////////////
									/////////////////////////////////////////
								/////////////////////////////////////////
							/////////////////////////////////////////
						/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					/////////////////////////////////////////
					
					
					
			
			}
		);
	}
	
	
	//alert("a");
