
/**
 * Evaluates if received parameter is an array.
 * @param obj - The variable to evaluate if it is an array.
 * @returns {Boolean} Indicating if the element is an array or not.
 */
function isArray(obj) {
    return obj.constructor == Array;
}

/**
 * Standard jQuery initialization.
 */
( function( $ ){

	/**
	 * Custom class to wrap CarTrawler's booking engine.
	 */
	function BookingEngineWrapper( ){
		
		/**
		 * Takes care of initializing administrative pages.
		 */
		this._InitializeAdminPage = function( ){
			
			// If it is not an admin page, returns.
			if( !Drupal.settings.CH_BookingEngine.IsAdminPage ){
				return false;
			}

			// Loads all locations.
			$.getJSON( Drupal.settings.CH_BookingEngine.LocationFile, null, function( data ){
				
				// Loads the locations inside the booking engine namespace.
				Drupal.settings.CH_BookingEngine.Locations = data;
				
				// Removes locations hidden field.
				var hdfHidden = $( 'input.CascadedLocation' ).each( function( ){
				  					
					var prev = $( this ).prev( );
					var h = $( this ).remove( );
					var ddl = $( '<select id="' + h.attr( 'id' ) + '" name="' + h.attr( 'name' ) + '" class="' + h.attr( 'className' ) + '"><option value="">----------</option><option value="' + h.val( ) + '" selected="selected"></select>' );
					prev.after( ddl );
				  	  				  	  
				} );
			  
				// Gets all countries and locations drop downs.
				var countriesDDLs = $( 'select.CascadingCountry' );
				var locsDDLs = $( 'select.CascadedLocation' );
			  
				// Adds the "on change" handlers for the country selects.
				countriesDDLs.change( function( ){
				  
					// Gets the locations select box and currently selected country.
					var locDDL = locsDDLs.eq( countriesDDLs.index( $( this ) ) );			  
				  
					// Clears elements from list.
					locDDL.get( 0 ).options.length = 1;
				  
					// If a country was selected...
					if( $( this ).val( ) != '' ){
					  
						// Gets the locations select box and currently selected country.
						var countryCode = $( this ).val( );
					  
						// For each location of that country...
						for( i in Drupal.settings.CH_BookingEngine.Locations[ countryCode ] ){
						 
							// Appends the option.
							locDDL.append( $( '<option value="' + i + '">' +  Drupal.settings.CH_BookingEngine.Locations[ countryCode ][ i ] + '</value>' ) );
						  
						}
					  
					}else{
					  
						locDDL.disabled = true;
					  
					}
				  
				  
				} );

				// Foreach location drop down...
				locsDDLs.each( function( ){
				  
					// Gets location code.
					var locationCode = $( this ).val( );
				  
					// If location is provided, updates the field.
					if( locationCode ){
						countriesDDLs.eq( locsDDLs.index( $( this ) ) ).trigger( 'change' );
						$( this ).val( locationCode );
					}
				  
				} );
				  
				// Triggers change event.
				countriesDDLs.trigger( 'change' );
				
			} );			
			
		};
		
		/**
		 * Takes care of initializing the booking engine.
		 */
		this._InitializeBookingEngine = function( ){
			
			if( typeof( Drupal.settings.CH_BookingEngine.ClientId ) !== 'undefined' ){
				  
				 // If containers are created...
				 if( $( '#abe_CH_BookingEnginePage, #abe_CH_BookingEngineBlockContent' ).size( ) > 0 ){
					 
					 // If there is a client Id replacing the site's client ID.
					 if( isArray( Drupal.settings.CH_BookingEngine.ClientId ) ){
						 Drupal.settings.CH_BookingEngine.ClientId = Drupal.settings.CH_BookingEngine.ClientId[ Drupal.settings.CH_BookingEngine.ClientId.length - 1 ];
					 }				 
					 
					// If there is a client Id replacing the site's client ID.
					 if( isArray( Drupal.settings.CH_BookingEngine.IsEnginePage ) ){
						 Drupal.settings.CH_BookingEngine.IsEnginePage = Drupal.settings.CH_BookingEngine.IsEnginePage[ Drupal.settings.CH_BookingEngine.IsEnginePage.length - 1 ];
					 }
					 
					 // Defines the book engine object.
					 var ctOTAEngine = null;
		          
					 // If it is page, uses page element Id, otherwise uses block element Id.
					 if( Drupal.settings.CH_BookingEngine.IsEnginePage ){
		              
						 // New engine for page.
						 ctOTAEngine = new CT_OTA_Engine( 'CH_BookingEnginePage' );
		    
					 }else{
		            
						 // New engine for block.
						 ctOTAEngine = new CT_OTA_Engine( 'CH_BookingEngineBlockContent' );
		            
					 }
		    
					 // Sets the last element as the only option.
					 if( isArray( Drupal.settings.CH_BookingEngine.CurrentPageCountry ) ){
						 Drupal.settings.CH_BookingEngine.CurrentPageCountry = Drupal.settings.CH_BookingEngine.CurrentPageCountry[ Drupal.settings.CH_BookingEngine.CurrentPageCountry.length - 1 ];
					 }
		          
					 // Sets the last element as the only option.
					 if( isArray( Drupal.settings.CH_BookingEngine.CurrentPageLocation ) ){
						 Drupal.settings.CH_BookingEngine.CurrentPageLocation = Drupal.settings.CH_BookingEngine.CurrentPageLocation[ Drupal.settings.CH_BookingEngine.CurrentPageLocation.length - 1 ];
					 }

					 // Sets the last element as the only option.
					 if( isArray( Drupal.settings.CH_BookingEngine.BookingEnginePage ) ){
						 Drupal.settings.CH_BookingEngine.BookingEnginePage = Drupal.settings.CH_BookingEngine.BookingEnginePage[ Drupal.settings.CH_BookingEngine.BookingEnginePage.length - 1 ];
					 }
					 
					 // Default currency.
					 Drupal.settings.CH_BookingEngine.DefaultCurrency = Drupal.settings.CH_BookingEngine.DefaultCurrency ? Drupal.settings.CH_BookingEngine.DefaultCurrency : 'EUR';
					 
					 // Defines configuration options.
					 //ctOTAEngine.setDefaultURL("https://ota.cartrawler.com/cartrawlerabe/");
					 ctOTAEngine.setDefaultURL("https://ajaxgeo.cartrawler.com/cartrawlerabe/");
					 //ctOTAEngine.setURL( Drupal.settings.CH_BookingEngine.Path + "3rdParty/otaproxy.php");
					 ctOTAEngine.setURL( Drupal.settings.CH_BookingEngine.Path + "3rdParty/otaproxygeo.php");
					 ctOTAEngine.setTarget("Production"); // Target for the engine
					 ctOTAEngine.setClientID( Drupal.settings.CH_BookingEngine.ClientId ); // Provided by CarTrawler
					 ctOTAEngine.setCountryID( Drupal.settings.CH_BookingEngine.CurrentPageCountry ? Drupal.settings.CH_BookingEngine.CurrentPageCountry : Drupal.settings.CH_BookingEngine.DefaultCountry ? Drupal.settings.CH_BookingEngine.DefaultCountry : 'GB' ); // Default Country
					 ctOTAEngine.addCurrency(); // adds list of all available currencies
					 ctOTAEngine.setCurrency( Drupal.settings.CH_BookingEngine.DefaultCurrency ); // default Currency
					 ctOTAEngine.setDefaultLanguage( Drupal.settings.CH_BookingEngine.DefaultLanguage ? Drupal.settings.CH_BookingEngine.DefaultLanguage : 'EN' ); // Default Language
					 ctOTAEngine.setCarGroupID( Drupal.settings.CH_BookingEngine.DefaultCarGroup ? Drupal.settings.CH_BookingEngine.DefaultCarGroup : '0' ); // Default Car Group
					 ctOTAEngine.setErrorReportUrl("https://www.cartrawler.com/ajaxerror.asp");
			         ctOTAEngine.setDriversAge(30);
					 ctOTAEngine.displayOptionalInsurance();
					 ctOTAEngine.enableSortBy();
					 ctOTAEngine.popoutIFrame = Drupal.settings.CH_BookingEngine.RunAsIframe;
					 
					 // @TODO: Affiliates should have more features.
					 ctOTAEngine.setCurrency( Drupal.settings.CH_BookingEngine.ClientId == '305253' ? 'EUR' : Drupal.settings.CH_BookingEngine.DefaultCurrency );
					 				 
					 var location = Drupal.settings.CH_BookingEngine.CurrentPageLocation ? Drupal.settings.CH_BookingEngine.CurrentPageLocation : Drupal.settings.CH_BookingEngine.DefaultLocation ? Drupal.settings.CH_BookingEngine.DefaultLocation : 0;
					 if( location != 0 ){
						 ctOTAEngine.setPickupID( location );
					 }
					 
					 ctOTAEngine.setTemplate("hybrid1");
					 ctOTAEngine.enableAutoSuggest({style: "lightgray", flag: true});
					 ctOTAEngine.enableNewCalendar({style: "blue", daterange: true});
					 ctOTAEngine.addCustomStyle("https://www.cartrawler.com/affiliates/customstyle.css" );
		        	    		
			          // If it is page, uses page element Id, otherwise uses block element Id.
			          if( Drupal.settings.CH_BookingEngine.IsEnginePage ){
			              
			        	  // Configures additional page level settings.
			        	  ctOTAEngine.setWebsiteConditionsURL("http://www.cartrawler.com/bookingengineconditions.html");
			        	  ctOTAEngine.setErrorReportUrl("https://www.cartrawler.com/ajaxerror.asp");
			        	  ctOTAEngine.displayOptionalInsurance(); // Display Insurance on Step 3
			        	  ctOTAEngine.displayBookEngine();
			        	 
			          }else{
			    
			        	  // Copies function that displays booking engine.
			        	  ctOTAEngine.oldDisplayBookEngine = ctOTAEngine.displayBookEngine;
			        	  ctOTAEngine.displayBookEngine = function( ){
			        		  this.oldDisplayBookEngine( );
			        		  $( '#abe_searchButton' ).remove( );
			        	  };
		        	
		        	  
			        	  // Configures additional block level settings.        
			        	  ctOTAEngine.setStep2URL( Drupal.settings.CH_BookingEngine.BookingEnginePage );
			        	  ctOTAEngine.displayStep1();        
			        	  ctOTAEngine.enableCookie();
			        	  ctOTAEngine.enableSortBy();
			        
			          }
			          
			          // Executes each of the preconfigured callbacks.
			          for( var i = 0; i < Drupal.settings.CH_BookingEngine.OnScriptLoad.length; i++ ){
			        	  var f = Drupal.settings.CH_BookingEngine.OnScriptLoad[ i ];
			        	  eval( f + '( )' );
			          }
				    
				 }
				 
			 }		
			
		};
		
		/**
		 * Initializes page.
		 */
		this.InitializePage = function( ){
			
			this._InitializeBookingEngine( );
			this._InitializeAdminPage( );
			
		};
		
	}

	// On DOM Ready...
	$( function( ){ 
		( new BookingEngineWrapper( ) ).InitializePage( );
	} );
		  
} )( jQuery );
