/*
 * agencypicker plug in
 * Depends on and is called from: /travel/_tnz/view/site/templates/trade/user/common/agencypicker/inc_agencypicker.cfm
 * Usage:
 * <cfmodule template="/travel/_tnz/view/site/templates/trade/user/common/agencypicker/inc_agencypicker.cfm">
 * 
 * Depends on: 
 * ** /travel/app_templates/javascript/jquery/jquery.select.js
 * ** /travel/_tnz/object/shift/ajax/proxy.js
 * 
 * will set the hidden input "agencyUUID" to the value of the currently selected agency
 */
( function( $ ) {

	//CONSTANTS
	var COMPONENT		= "travel._tnz.view.site.templates.trade.user.common.agencypicker.AjaxGateWay";
	var GLOBALDIV		= "#agencypicker-agencies-global";
	var GLOBALSELECT	= "#agencypicker-agencies-global-select";
	var COUNTRYDIV		= "#agencypicker-agencies-country";
	var COUNTRYSELECT	= "#agencypicker-agencies-country-select";
	var BRANCHDIV		= "#agencypicker-agencies-branch"; 
	var BRANCHSELECT	= "#agencypicker-agencies-branch-select"; 
	var COUNTRYFILTER	= "#agencypicker-country";
	var COUNTRYFILTERSELECT	= "#agencypicker-country-select";
	
	var CURRENTSELECTEDDIV		= "#agencypicker-currentSelected";
	var CURRENTSELECTEDNAME		= "#agencypicker-currentSelected-name";
	var CURRENTSELECTEDCOUNTRY	= "#agencypicker-currentSelected-country";
	var CURRENTSELECTEDLEVEL	= "#agencypicker-currentSelected-level";
	
	//the HTTP request type - should be "POST" in live.	
	var	TYPE			= "GET";

	var OTHERMARKET		= "other";
	var OTHERUUID		= "00000000-0000-0000-0000-000000000000";
	

	//Private vars
	var __UUID			= "";
	var __currentAgency	= {};//a pretendVO of the current agency picked
	var __countryUUID	= "";//UUID of the country we are including in the query
	var __hiddenFieldID	= "#agencyUUID";
	
	var __globalsCollection 	= {};
	var __countryCollection		= {};
	var __branchCollection		= {};
	
	//Private functions
	var init	= function()
	{
		$.agencypicker.getGlobalAgencies(
			function( data ){ $.agencypicker.loadGlobals( data ); }
		);
	}
	//filters out an instance based on UUID. collection is one of the collections we are searching
	var getAgencyFromCollection	= function( uuid , collection )
	{
		
		var returnValue	= { uuid : "" , name : "" , country :  "" };
		
		for( var i = 0 ; i < collection.ROWCOUNT ; i++ )
		{
			if( collection.DATA.UUID[ i ].toString().toLowerCase() == uuid.toString().toLowerCase() )
			{
				returnValue = {
					  uuid 		: collection.DATA.UUID[ i ]
					, country 	: collection.DATA.COUNTRYUUID[ i ].country
					, name		: collection.DATA.NAME[ i ]
					, level		: collection.DATA.AGENCYLEVEL[ i ]
				};
				
				break;//stop looking if we found it
			}
		}
		
		return returnValue;
	}
	var displayCurrentAgency		= function()
	{
		//now load the display
		$( CURRENTSELECTEDDIV ).hide()

		if( __currentAgency.uuid != "")
		{
			
			$( CURRENTSELECTEDNAME ).html( __currentAgency.name );
			$( CURRENTSELECTEDCOUNTRY ).html( __currentAgency.country );
			$( CURRENTSELECTEDLEVEL ).html( __currentAgency.level );
			
			$( CURRENTSELECTEDDIV ).slideDown();
		}
		
	}
	
	
	$.extend({
		
		agencypicker:		
		{
			//GETTERS/SETTERS
			 	UUID			: function( value )
				{
					if( typeof( value ) != "undefined" ) __UUID	= value;
					
					$( __hiddenFieldID ).val( __UUID );//set the value in the hidden field too
					
					return __UUID;
				}	
			, 	hiddenFieldID	: function( value )
				{
					if( typeof( value ) != "undefined" ) __hiddenFieldID	= "#" + value;
					return __hiddenFieldID;
				}
			,	countryUUID		: function( value )
				{
					if( typeof( value ) != "undefined" ) __countryUUID	= value;
					return __countryUUID;
					
				}
				
			/************************** DATA FUNCTIONS *************************/
			//global level agency
			,	getGlobalAgencies		: function( callBack )
				{
					$.TNZCFC.invoke({
						  component 			: COMPONENT
						, method 				: "getGlobalAgencyRecords"		
						, args					: {}
						, resultHandler 		: function( result )
												{
													callBack( result );
												}
						, dataType				: "json"
						, type					: TYPE
						, serializeQueryByColumns : true
					});
				}
			,	loadGlobals				: function( dataQuery )
				{
					
					__globalsCollection	= dataQuery;
					//empty it
					$( GLOBALSELECT ).html("");
					
					$( GLOBALSELECT ).addOption("","Select Agency");
					for( var i = 0 ; i < __globalsCollection.ROWCOUNT ; i ++ )
					{
						$( GLOBALSELECT ).addOption(__globalsCollection.DATA.UUID[ i ], __globalsCollection.DATA.NAME[ i ]);
					}
					$( GLOBALSELECT ).selectOptions("");//select the first option with value of ""
				}
			//country level agency
			,	getCountryAgencies		: function( globalUUID , callBack )
				{
					$.TNZCFC.invoke({
						  component 			: COMPONENT
						, method 				: "getCountryAgencyRecords"		
						, args					: { globalUUID : globalUUID , countryUUID : __countryUUID }
						, resultHandler 		: function( result )
												{
													callBack( result );
												}
						, dataType				: "json"
						, type					: TYPE
						, serializeQueryByColumns : true
					});
				}
			,	loadCountryAgencies		: function( dataQuery )
				{
					
					__countryCollection	= dataQuery;
					//empty it
					$( COUNTRYSELECT ).html("");
					
					$( COUNTRYSELECT ).addOption("","Select Agency");
					for( var i = 0 ; i < __countryCollection.ROWCOUNT ; i ++ )
					{
						$( COUNTRYSELECT ).addOption(__countryCollection.DATA.UUID[ i ], __countryCollection.DATA.NAME[ i ]);
					}
					$( COUNTRYSELECT ).selectOptions("");//select the first option with value of ""
				}
			//Branch level agencies
			,	getBranchAgencies		: function( countryLevelUUID , callBack )
				{
					$.TNZCFC.invoke({
						  component 			: COMPONENT
						, method 				: "getBranchAgencyRecords"		
						, args					: { countryLevelUUID : countryLevelUUID , countryUUID : __countryUUID }
						, resultHandler 		: function( result )
												{
													callBack( result );
												}
						, dataType				: "json"
						, type					: TYPE
						, serializeQueryByColumns : true
					});
				}
			,	loadBranchAgencies		: function( dataQuery )
				{
					__branchCollection	= dataQuery;
					//empty it
					$( BRANCHSELECT ).html("");
					
					$( BRANCHSELECT ).addOption("","Select Agency");
					for( var i = 0 ; i < __branchCollection.ROWCOUNT ; i ++ )
					{
						$( BRANCHSELECT ).addOption(__branchCollection.DATA.UUID[ i ], __branchCollection.DATA.NAME[ i ]);
					}
					$( BRANCHSELECT ).selectOptions("");//select the first option with value of ""
				}
			, 	getAgencyByUUID			: function( uuid , callBack )
				{
					
					$.TNZCFC.invoke({
						  component 			: COMPONENT
						, method 				: "getAgencyByUUID"		
						, args					: { uuid : uuid }
						, resultHandler 		: function( result )
												{
													callBack( result );
												}
						, dataType				: "json"
						, type					: TYPE
						, serializeQueryByColumns : true
					});
			
				}
			,	loadSingleAgency		: function( dataQuery )//this should be a single row query
				{
					if( dataQuery.ROWCOUNT == 1 )
					{
						__currentAgency	= {
							  uuid 		: dataQuery.DATA.UUID[ 0 ]
							, name		: dataQuery.DATA.NAME[ 0 ]
							, country	: dataQuery.DATA.COUNTRYUUID[ 0 ].country
							, level		: dataQuery.DATA.AGENCYLEVEL[ 0 ]
						};	
					}
					else
					{
						__currentAgency	= {
							  uuid 		: ""
							, name		: ""
							, country	: ""
							, level		: ""
						};	
						
					}
					displayCurrentAgency();
					
				}
				
			/**************** EVENT HANDLERS ********************/
			//Select option change handlers			
			,	onChange_globalSelect	: function()
				{
					var newUUID	= $( GLOBALSELECT ).val();
					if( newUUID  != "" )
					{
						$( COUNTRYSELECT ).html('<option>Loading</option>');
						$( COUNTRYDIV ).slideDown();
						$( BRANCHDIV ).slideUp();
						$.agencypicker.getCountryAgencies( 
							  newUUID
							, $.agencypicker.loadCountryAgencies
						);	
						
					}
					else
					{
						$( COUNTRYDIV ).slideUp();
						$( BRANCHDIV ).slideUp();
					}
					//hide the other selects if the have selected a agency
				}
			,	onChange_CountrySelect	: function()
				{
					var newUUID	= $( COUNTRYSELECT ).val();
					if( newUUID  != "" )
					{
						$( BRANCHSELECT ).html('<option>Loading</option>');
						$( BRANCHDIV ).slideDown();
						$.agencypicker.getBranchAgencies( 
							  newUUID
							, $.agencypicker.loadBranchAgencies
						);	
					}
					else
					{
						$( BRANCHDIV ).slideUp();
					}
				}
			,	onChange_branchSelect	: function()
				{
					$.agencypick.onClick_selectBranch();//we will just bubble this to the select, as if they select a branch it will mean they want that branch
				}
			//Selecting an agency button hanlders
			,	onClick_selectGlobal	: function()
				{
					var selectedUUID	= $( GLOBALSELECT ).val();
					if(  selectedUUID != "" && selectedUUID != $.agencypicker.UUID()  )
					{
						
						$( COUNTRYDIV ).slideUp();
						$( BRANCHDIV ).slideUp();
						
						$.agencypicker.UUID( selectedUUID );
						__currentAgency	= getAgencyFromCollection( selectedUUID , __globalsCollection ) 
						displayCurrentAgency();

					}
				}	
			
			,	onClick_selectCountry	: function()
				{
					var selectedUUID = $( COUNTRYSELECT ).val();
					if( selectedUUID != "" && selectedUUID != $.agencypicker.UUID()  )
					{
						
						$( BRANCHDIV ).slideUp();
						
						$.agencypicker.UUID( selectedUUID );
						__currentAgency	= getAgencyFromCollection( selectedUUID , __countryCollection ) 
						displayCurrentAgency();
						
					}
				}	
			
			,	onClick_selectBranch	: function()
				{
					var selectedUUID = $( BRANCHSELECT ).val();
					if( selectedUUID != "" && selectedUUID != $.agencypicker.UUID() )
					{
						$.agencypicker.UUID( selectedUUID );
						__currentAgency	= getAgencyFromCollection( selectedUUID , __branchCollection ) 
						displayCurrentAgency();
					}
				}	
			,	onChange_CountryPickerSelect	: function()
				{
					var countryUUID = $( COUNTRYFILTERSELECT ).val();
					//show all the levels with the options filter on the country they have selected
					$.agencypicker.countryUUID( countryUUID );
					$( GLOBALSELECT ).selectOptions("");
					$( BRANCHSELECT ).selectOptions("");
					$( COUNTRYSELECT ).selectOptions("");
					if( countryUUID == "")
					{
						$( BRANCHDIV ).slideUp();
						$( COUNTRYDIV ).slideUp();
						
					}
					else
					{
						
						$( BRANCHDIV ).slideDown();
						$( COUNTRYDIV ).slideDown();
						$.agencypicker.getBranchAgencies( "" , $.agencypicker.loadBranchAgencies );
						$.agencypicker.getCountryAgencies( "" , $.agencypicker.loadCountryAgencies );
					
					}
					
				}
			
		}
	});
	$( document ).ready( function(){ init(); } );
})( jQuery )