/** Defines the Tracking_WT class.
 *
 * @author Josh Zerin <josh.zerin@standingdog.com>
 * @since Tuesday, February 17, 2009
 *
 * @package HiltonFamilyBoston
 * @subpackage Library
 */

/** Provides methods for generating tracking codes.
 *
 * IMPORTANT:
 * Be sure Tracking_WT._enabled is set to true, or else tracking codes will not
 *  get output!
 *
 * @package Tracking
 * @subpackage WT
 */
Tracking_WT =
  function(  )
  {
  };

/** Used to set default brand/cluster/region values for Hilton Worldwide
 *   Boston.
 *
 * @var int
 */
Tracking_WT.HILTON_FAMILY_BOSTON = 1;

/**#@+ Used to set hotel-specific values. */
  Tracking_WT.HOTEL_BOSBH = 'BOSBH';
  Tracking_WT.HOTEL_BOSLH = 'BOSLH';
  Tracking_WT.HOTEL_BOSCH = 'BOSCH';
  Tracking_WT.HOTEL_BOSSB = 'BOSSB';
  Tracking_WT.HOTEL_BOSOW = 'BOSOW';
  Tracking_WT.HOTEL_BOSCO = 'BOSCO';
/**#@-*/

/**#@+ Hotel brand codes.
 *
 * @var String
 */
  Tracking_WT.BRAND_CONRAD                = 'CI';
  Tracking_WT.BRAND_DOUBLETREE            = 'DT';
  Tracking_WT.BRAND_EMBASSY               = 'ES';
  Tracking_WT.BRAND_GARDEN_INN            = 'GI';
  Tracking_WT.BRAND_HAMPTON               = 'HX';
  Tracking_WT.BRAND_HHONORS               = 'HN';
  Tracking_WT.BRAND_HILTON                = 'HH';
  Tracking_WT.BRAND_HILTON_FAMILY         = 'HF';
  Tracking_WT.BRAND_HILTON_INTERNATIONAL  = 'HI';
  Tracking_WT.BRAND_HOMEWOOD              = 'HW';
  Tracking_WT.BRAND_WAC                   = 'WA';
/**#@-*/

/** Channel code for Cluster.
 *
 * @var String
 */
Tracking_WT.CHANNEL_CLUSTER = 'CL';

/** Region code for Boston.
 *
 * @var String
 */
Tracking_WT.REGION_BOSTON = 'Boston';

/** The global on/off switch for tracking codes.
 *
 * IMPORTANT:
 * When this value is false, Tracking_WT.generateCode() returns an empty string!
 *
 * @var Boolean
 */
Tracking_WT._enabled = true,

/** The default brand code, used when a null brand is passed to code().
 *
 * @var String
 */
Tracking_WT._defaultBrand = null,

/** The default channel code, used when a null channel is passed to code().
 *
 * @var String
 */
Tracking_WT._defaultChannel = null,

/** The default region code, used when a null region is passed to code().
 *
 * @var String
 */
Tracking_WT._defaultRegion = null,

/** The default campaign code, used when a null campaign value is passed to
 *   code().
 *
 * @var String
 */
Tracking_WT._defaultCampaign = null,

/** The default placement code, used when a null placement value is passed
 *   to code().
 *
 * Use of this property is not recommended; placements are generally unique
 *  per link.
 *
 * @var String
 */
Tracking_WT._defaultPlacement = null,

/** The default hotel code, used when a null CTYHOCN value is passed to
 *   code().
 *
 * @var String
 */
Tracking_WT._defaultHotel = null;

/** Accessor for Tracking_WT._enabled.
 *
 * @return Boolean
 */
Tracking_WT.getEnabled = function(  )
{
  return Tracking_WT._enabled;
}

/** Modifier for Tracking_WT._enabled.
 *
 * @param Boolean $enabled
 *
 * @return void
 */
Tracking_WT.setEnabled = function( $enabled /* = true */ )
{
  Tracking_WT._enabled = ($enabled !== false);
}

/** Clears all default values.
 *
 * @return void
 */
Tracking_WT.clearDefaults = function(  )
{
  Tracking_WT._defaultBrand     =
  Tracking_WT._defaultCampaign  =
  Tracking_WT._defaultChannel   =
  Tracking_WT._defaultHotel     =
  Tracking_WT._defaultPlacement =
  Tracking_WT._defaultRegion    = null;
}

/** Sets default values for a specific hotel or family.
 *
 * @param Number  $key   Use class constants.
 * @param Boolean $clear If true, clear all existing defaults before setting.
 *
 * @return void
 */
Tracking_WT.setDefaults = function( $key, $clear )
{
  Tracking_WT.setDefaultsArray(Tracking_WT.getDefaults($key), $clear);
}

/** Sets multiple default values.
 *
 * @param Object  $values
 * @param Boolean $clear  If true, clear all existing defaults before setting.
 *
 * @return void
 */
Tracking_WT.setDefaultsArray = function( $values, $clear )
{
  if( $clear === true )
  {
    Tracking_WT.clearDefaults();
  }

  if( $values )
  {
    var
      $map =
      {
        'brand'    : 'setDefaultBrand',
        'campaign' : 'setDefaultCampaign',
        'channel'  : 'setDefaultChannel',
        'hotel'    : 'setDefaultHotel',
        'placement': 'setDefaultPlacement',
        'region'   : 'setDefaultRegion'
      };
  
    for( var $key in $map )
    {
      if( typeof($values[$key]) != 'undefined' )
      {
        Tracking_WT[$map[$key]]($values[$key]);
      }
    }
  }
}

/** Gets default values for a hotel brand or family.
 *
 * @param Number $key
 *
 * @return Object
 */
Tracking_WT.getDefaults = function( $key )
{
  /* Javascript is a little finicky about returning Object literals, so we'll
   *  store the result in a variable before returning it.
   */
  var $result = ({});

  switch( $key )
  {
    case Tracking_WT.HILTON_FAMILY_BOSTON:
      $result =
        ({
          'brand'  : Tracking_WT.BRAND_HILTON_FAMILY,
          'channel': Tracking_WT.CHANNEL_CLUSTER,
          'region' : Tracking_WT.REGION_BOSTON
        });
    break;

    case Tracking_WT.HOTEL_BOSBH:
    case Tracking_WT.HOTEL_BOSLH:
      $result =
        ({
          'brand'  : Tracking_WT.BRAND_HILTON_FAMILY,
          'channel': Tracking_WT.CHANNEL_CLUSTER,
          'region' : Tracking_WT.REGION_BOSTON,
          'hotel'  : $key
        });
    break;

    case Tracking_WT.HOTEL_BOSCH:
    case Tracking_WT.HOTEL_BOSSB:
    case Tracking_WT.HOTEL_BOSOW:
    case Tracking_WT.HOTEL_BOSCO:
      $result =
        ({
          'brand'  : Tracking_WT.BRAND_DOUBLETREE,
          'channel': Tracking_WT.CHANNEL_CLUSTER,
          'region' : Tracking_WT.REGION_BOSTON,
          'hotel'  : $key
        });
    break;
  }

  return $result;
}

/** Returns the default brand.
 *
 * @return String
 */
Tracking_WT.getDefaultBrand = function(  )
{
  return Tracking_WT._defaultBrand;
}

/** Sets the default brand for code() calls.
 *
 * @param string $brand
 *
 * @return String
 */
Tracking_WT.setDefaultBrand = function( $brand )
{
  return Tracking_WT._defaultBrand = $brand;
}

/** Returns the default channel.
 *
 * @return String
 */
Tracking_WT.getDefaultChannel = function(  )
{
  return Tracking_WT._defaultChannel;
}

/** Sets the default channel for code() calls.
 *
 * @param string $channel
 *
 * @return String
 */
Tracking_WT.setDefaultChannel = function( $channel )
{
  return Tracking_WT._defaultChannel = $channel;
}

/** Returns the default region.
 *
 * @return String
 */
Tracking_WT.getDefaultRegion = function(  )
{
  return Tracking_WT._defaultRegion;
}

/** Sets the default region for code() calls.
 *
 * @param string $region
 *
 * @return String
 */
Tracking_WT.setDefaultRegion = function( $region )
{
  return Tracking_WT._defaultRegion = $region;
}

/** Returns the default campaign.
 *
 * @return String
 */
Tracking_WT.getDefaultCampaign = function(  )
{
  return Tracking_WT._defaultCampaign;
}

/** Sets the default campaign value for code() calls.
 *
 * @param string $campaign
 *
 * @return String
 */
Tracking_WT.setDefaultCampaign = function( $campaign )
{
  return Tracking_WT._defaultCampaign = $campaign;
}

/** Returns the default placement.
 *
 * @return String
 */
Tracking_WT.getDefaultPlacement = function(  )
{
  return Tracking_WT._defaultPlacement;
}

/** Sets the default placement value for code() calls.
 *
 * @param string $placement
 *
 * @return String
 */
Tracking_WT.setDefaultPlacement = function( $placement )
{
  return Tracking_WT._defaultPlacement = $placement;
}

/** Returns the default hotel.
 *
 * @return String
 */
Tracking_WT.getDefaultHotel = function(  )
{
  return Tracking_WT._defaultHotel;
}

/** Sets the default hotel value for code() calls.
 *
 * Note:  setting the default hotel here does not set matching
 *  brand/channel/region values.  For best results, use
 *  Tracking_WT.setDefaults() instead.
 *
 * @param string $hotel
 *
 * @return String
 */
Tracking_WT.setDefaultHotel = function( $hotel )
{
  return Tracking_WT._defaultHotel = $hotel;
}

/** Generates a tracking code for a URL.
 *
 * @param array $params:
 *  - brand
 *  - channel
 *  - region
 *  - campaign
 *  - placement
 *  - hotel
 *
 * Null values are allowed; the default values will be used instead (see
 *  setDefault*() methods).
 *
 * To use no value for placement/campaign, pass false as the value instead of
 *  null.
 *
 * @return String WT.mc_id=1aa2bb3ccccc4xxxxx5yyyyy6zzzzz
 */
Tracking_WT.generateCode = function( $params )
{
  if( Tracking_WT._enabled )
  {
    /* Check to see if a hotel value was passed in. */
    if( typeof($params.hotel) != 'undefined' )
    {
      /* Performing a passive array_merge() in Javascript is a little tricky. */
      var $switch = Tracking_WT.getDefaults($params.hotel);

      for( var $key in $params )
      {
        $switch[$key] = $params[$key];
      }

      $params = $switch;
    }
    
    /* Validate parameters. */
    var $brand =
      typeof($params.brand) == 'undefined' || $params.brand === null
        ? Tracking_WT._defaultBrand
        : $params.brand;
  
    var $channel =
      typeof($params.channel) == 'undefined' || $params.channel === null
        ? Tracking_WT._defaultChannel
        : $params.channel;
  
    var $region =
      typeof($params.region) == 'undefined' || $params.region === null
        ? Tracking_WT._defaultRegion
        : $params.region;
        
    /* Brand/Channel/Region are not optional. */
    if( ! ($brand && $channel && $region) )
    {
      return '';
    }
  
    var $code = 'WT.mc_id=1' + $brand + '2' + $channel + '3' + $region;
    
    /* Campaign/placement/hotel codes only get added if they exist. */
    var $campaign =
      typeof($params.campaign) == 'undefined' || $params.campaign === null
        ? Tracking_WT._defaultCampaign
        : $params.campaign;
  
    if( $campaign )
    {
      $code += '4' + $campaign;
      
      var $placement =
        typeof($params.placement) == 'undefined' || $params.placement === null
          ? Tracking_WT._defaultPlacement
          : $params.placement;
  
      if( $placement )
      {
        $code += '5' + $placement;
  
        var $hotel =
          typeof($params.hotel) == 'undefined' || $params.hotel === null
            ? Tracking_WT._defaultHotel
            : $params.hotel;
  
        if( $hotel )
        {
          $code += '6' + $hotel;
        }
      }
    }
  
    return $code;
  }
  else
  {
    /* Tracking codes disabled (Tracking_WT._enabled == false). */
    return '';
  }
}