var ROLLUP_UA = "UA-11503763-1";
var DATA_PER_MARKET_ID = {
  "0"   : { ua: "UA-11785886-2",  dn: ".freya.com" },
  "1"   : { ua: "UA-11503763-4",  dn: ".hotelopia.com" }, /* Antiguo .co.uk */
  "2"   : { ua: "UA-11503763-17", dn: ".hotelopia.com" },
  "6"   : { ua: "UA-11503763-12", dn: ".hotelopia.de" },
  "7"   : { ua: "UA-11503763-13", dn: ".hotelopia.nl" },
  "8"   : { ua: "UA-11503763-24", dn: ".hotelopia.com" }, /* Antiguo .ca */
  "9"   : { ua: "UA-11503763-14", dn: ".hotelopia.com" }, /* Antiguo .ie */
  "24"  : { ua: "UA-11503763-16", dn: ".hotelopia.it" },
  "25"  : { ua: "UA-11503763-11", dn: ".hotelopia.fr" },
  "29"  : { ua: "UA-11503763-2",  dn: ".hotelopia.es" },
  "59"  : { ua: "UA-11503763-18", dn: ".hotelopia.dk" },
  "60"  : { ua: "UA-11503763-19", dn: ".hotelopia.se" },
  "61"  : { ua: "UA-11503763-22", dn: ".hotelopia.ch" },
  "62"  : { ua: "UA-11503763-21", dn: ".hotelopia.es" }, /* Antiguo .com.mx */
  "142" : { ua: "UA-11503763-15", dn: ".hotelopia.pt" },
  "155" : { ua: "UA-11503763-23", dn: ".hotelopia.br" },
  "156" : { ua: "UA-11503763-20", dn: ".hotelopia.cat" }
};

/**
 * Container for the tracking related code. For Google Analytics and AdWords.
 *
 * @namespace TrackingActions
 */
var TrackingActions = {
  /**
   * Initializes the namespace, instantiating the tracker objects that will be
   * used in later calls.
   *
   * @function {public void} ?
   * @param {string} pageName    Page name
   * @param {string} domainName  Domain name
   * @param {string} marketId    Market identifier (used for detecting local/test domains)
   * @param {string} partnerId   'session_P_ID' CustomVar value
   * @param {string} varName     Optional name of an additional CustomVar (used in the destination and infohotel pages)
   * @param {string} varValue    Optional value of an additional CustomVar
   * @return Nothing
   */
  init: function(pageName, domainName, marketId, partnerId, varName, varValue) {
    // The XSLT parser replaces ampersands by their escaped sequence.
    // This replacement has to be undone, as GA does not understand the resulting URL
    this.pageName = pageName.replace(/\&amp;/g, '&');
    this.domainName = domainName;
    this.marketId = marketId;
    this.partnerId = partnerId;

    if (domainName.match('.+(freya|localhost).+')) {
      log("Freya domain. Using test Google Analytics account");
      this.marketId = 0;
    }

    this.data = DATA_PER_MARKET_ID[this.marketId];
    if (this.data === null || this.data.ua === "") {
      log("Market ID " + this.marketId + " unsupported");
      return;
    }
    
    if (this.marketId != 0 && ROLLUP_UA) {
      // Except for the local servers, send tracking information to the rollup account
      this.roll_up = this.getTracker(ROLLUP_UA, varName, varValue);
    }

    this.tracker = this.getTracker(this.data.ua, varName, varValue);
  },

  /**
   * Creates a tracker instance.
   *
   * @function {public gaTracker} ?
   * @param {string} ua
   * @param {string} varName   CustomVar name
   * @param {string} varValue  CustomVar value
   */
  getTracker: function(ua, varName, varValue) {
    var tr = _gat._getTracker(ua);
    var slot = 1;

    tr._setDomainName(this.data.dn);
    tr._setAllowHash(false);
    tr._setAllowLinker(true);
    if (this.partnerId) {
      tr._setCustomVar(slot++, "session_P_ID", this.partnerId, 2);
    }
    if (varName && varValue) {
      tr._setCustomVar(slot++, varName, varValue, 3);
    }
    return tr;
  },
  trackPageView: function() {
    try {  
      if (this.pageName > '') {
        if (this.tracker) this.tracker._trackPageview(this.pageName);
        if (this.roll_up) this.roll_up._trackPageview(this.pageName);
        log("Page view tracked with name '" + this.pageName + "'");
      } else {
        if (this.tracker) this.tracker._trackPageview();
        if (this.roll_up) this.roll_up._trackPageview();
        log("Page view tracked");
      }
    } catch(err) {
      log(err);
    }
  },
  trackTrans: function(data) {
    try {
      if (data) {
        if (!!data.currency) {
          log("Transaction currency: " + data.currency);
        }
        var exchange = data.exchange.toFloat();
        if (!exchange) {
          exchange = 1.0;
        }

        if (this.tracker) this.tracker._addTrans(data.reserva, data.partner, data.total / exchange, data.tax, data.shipping, data.city, data.state, data.country);
        if (this.roll_up) this.roll_up._addTrans(data.reserva, data.partner, data.total / exchange, data.tax, data.shipping, data.city, data.state, data.country);

        for (var i = 0; i < data.items.length; i++) {
          var item = data.items[i];
          var total = item.precio.toFloat() / exchange;
          var nights = item.noches.toInt();
          var rooms  = item.rooms.toInt();
          item.quantity = nights * rooms;
          item.price = (item.quantity == 0) ? total : total / item.quantity;

          if (this.tracker) this.tracker._addItem(data.reserva, item.codHot, item.nomHot, item.category, item.price, item.quantity);
          if (this.roll_up) this.roll_up._addItem(data.reserva, item.codHot, item.nomHot, item.category, item.price, item.quantity);
        }

        if (this.tracker) this.tracker._trackTrans();
        if (this.roll_up) this.roll_up._trackTrans();

        log("Tracked transaction: ", data);
      }
    } catch(err) {
      log("Error tracking transaction: ", data);
      log(err);
    }
  },
  initPage: function() {
    if (this.pageName === '/Home') {
      TrackingActions.addEvent("my_booking",    "submit", "Home", "Information", "Access_booking");
      TrackingActions.addEvent("langcur",       "submit", "Home", "Information", "Cambio Idioma");
      TrackingActions.addEvent("searcherForm",  "submit", "Home", "Buscador",    "Boton_busqueda");
      TrackingActions.addEvent("search_type_1", "click",  "Home", "Buscador",    "Busqueda_avanzada");
      TrackingActions.addEvent("search_type_2", "click",  "Home", "Buscador",    "Busqueda_avanzada");
    } else if (this.pageName.match("^/Results")) {
      
    }
  },
  addEvent: function(id, eventName, category, action, label) {
    var elem = $(id);
    if (elem === null) {
      log("No element " + id);
    } else {
      elem.addEvent(eventName, function() {
        TrackingActions.trackEvent(category, action, label);
      });
    }
  },
  
  /**
   * Notifies an event to the Google Analytics system.
   *
   * @event eventTrack
   * @param {string} category  Event category
   * @param {string} action    Event action
   * @param {string} label     Event label
   */
  trackEvent: function(category, action, label, value) {
    if (value) {
      if (TrackingActions.tracker) TrackingActions.tracker._trackEvent(category, action, label + "=" + value);
      if (TrackingActions.roll_up) TrackingActions.roll_up._trackEvent(category, action, label + "=" + value);
      log("Event tracked: [ " + category + "; " + action + "; " + label + "=" + value + " ]");
    } else {
      if (TrackingActions.tracker) TrackingActions.tracker._trackEvent(category, action, label);
      if (TrackingActions.roll_up) TrackingActions.roll_up._trackEvent(category, action, label);
      log("Event tracked: [ " + category + "; " + action + "; " + label + " ]");
    }
  },
  
  /**
   * Links session data between different domains.
   *
   * @param url The target link URL
   */
  link: function(url) {
    if (TrackingActions.roll_up) {
      return TrackingActions.roll_up._link(url);
    } else if (TrackingActions.tracker) {
      return TrackingActions.tracker._link(url);
    } else {
      document.location.href = url;
      return false;
    }
  }
};
