﻿/**
 * Download class.
 * @constructor
 */
earth.Download = function() {
  /**
   * Contains locale information (domain, language code).
   * @type {Object}
   */
  this.locale = earth.getLocale();

  /**
   * Localized domain
   * @type {String}
   */
  this.domain = 'http://earth.google' + this.locale['domain'] +
                '/intl/' + this.locale['lang'];

  /**
   * @type {Object} Contains gws locales which should redirect to cider.
   * Maps those locales to appropriate lang codes used in cider url.
   * Example: {'intl_dir': 'cider_locale'}
   *
    'cs': 'cs',
    'da': 'da',
    'de': 'de',
    'el': 'el',
    'en': 'en',
    'en_uk': 'en-gb',
    'es': 'es',
    'es_es': 'es',
    'fi': 'fi',
    'fr': 'fr',
    'it': 'it',
    'ja': 'ja',
    'ko': 'ko',
    'nl': 'nl',
    'no': 'no',
    'pl': 'pl',
    'pt-BR': 'pt-br',
    'ru': 'ru',
    'zh-TW': 'zh-tw',
    'sv': 'sv',
    'th': 'th',
    'tr': 'tr',
    'zh-CN': 'zh-cn'
   */
  this.ciderLocales = {

  };

  /**
   * Cider url customized based on the current locale.
   * @type {String}
   */
  this.ciderUrl = 'http://pack.google.com/integrated_download' +
                  '?ciint=ci_earth' +
                  '&hl=' + this.ciderLocales[this.locale['lang']] +
                  '&utm_source=' + this.ciderLocales[this.locale['lang']] +
                  '-cdr-earth4' + '&utm_medium=cdr' +
                  '&utm_campaign=' + this.ciderLocales[this.locale['lang']];

  /**
   * URL of the thank you page
   * @type {String}
   */
  this.thanksUrl = this.domain + '/thanks.html';

  /**
   * Operating system and browser information.
   * @type {String}
   */
  this.os = navigator.userAgent.toLowerCase();
};

earth.Download.CURR_VER_MAC_PRO = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProMac.dmg';
earth.Download.PREV_VER_LINUX = 'http://dl.google.com/earth/client/advanced/previous/GoogleEarthLinux.bin';
earth.Download.PREV_VER_MAC = 'http://dl.google.com/earth/client/advanced/previous/GoogleEarthMac.dmg';
earth.Download.PREV_VER_MAC_PRO = 'http://dl.google.com/earth/client/advanced/previous/GoogleEarthProMac.dmg';
earth.Download.PREV_VER_WIN = 'http://dl.google.com/earth/client/advanced/previous/GoogleEarthWin.exe';
earth.Download.PREV_VER_WIN_PRO = 'http://dl.google.com/earth/client/advanced/previous/GoogleEarthProWin.exe';
earth.Download.NON_ADMIN_WIN = 'http://dl.google.com/earth/client/advanced/current/googleearthwin-peruser.exe';
earth.Download.NO_UPDATER_ADMIN_WIN = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthWin.exe';
earth.Download.NO_UPDATER_ADMIN_MAC = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthMacNoUpdate.dmg';
earth.Download.NO_UPDATER_WIN_PRO = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProWin.exe';
earth.Download.NO_UPDATER_MAC_PRO = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProMacNoUpdate.dmg';

earth.Download.CURR_VER_MAC_INTEL = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthMac-Intel.dmg';
earth.Download.CURR_VER_MAC_UNIV = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthMac-Universal.dmg';
earth.Download.NO_UPDATER_MAC_INTEL = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthMacNoUpdate-Intel.dmg';
earth.Download.NO_UPDATER_MAC_UNIV = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthMacNoUpdate-Universal.dmg';
earth.Download.CURR_VER_MAC_PRO_INTEL = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProMac-Intel.dmg';
earth.Download.CURR_VER_MAC_PRO_UNIV = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProMac-Universal.dmg';
earth.Download.NO_UPDATER_MAC_PRO_INTEL = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProMacNoUpdate-Intel.dmg';
earth.Download.NO_UPDATER_MAC_PRO_UNIV = 'http://dl.google.com/earth/client/advanced/current/GoogleEarthProMacNoUpdate-Universal.dmg';

/**
 * Chooses download page based on the locale and the OS.
 * @return {string} string indicating whether we redirected to cider or not
 */
earth.Download.prototype.chooseDownload = function() {
  // Not a Windows XP/Vista machine
  if (this.os.match('windows nt 5.1') || this.os.match('windows nt 6.0')) {
    for (ciderLocale in this.ciderLocales) {
      // Cider exists for this locale, redirect
      if (ciderLocale == this.locale['lang']) {
        this.track('cider');
        this.redirect(this.ciderUrl);
        return 'cider';
      }
    }
  }
  // Not a windows machine or not on cider list
  this.track('non_cider');
  this.redirect(this.domain + '/download-earth.html');
  return 'non_cider';
};


/**
 * Attach appropriate redirects to Agree and Cancel buttons.
 */
earth.Download.prototype.initDownloadPage = function() {
  var dlAdminUser = document.getElementById('dlAdminUser');
  var dlForm = document.getElementById('dlForm');
  var dlAgree = document.getElementById('dlAgree');
  var dlAgreeChrome = document.getElementById('dlAgreeChrome');
  var dlCancel = document.getElementById('dlCancel');
  var dlSingle = document.getElementById('dlSingle');
  var dlStats = document.getElementById('dlStats');
  var dlUpdater = document.getElementById('dlUpdater');
  var dlVersion = document.getElementById('dlVersion');
  var downloadUrl = 'thanks.html';

  dlAgree.value = AGREE;
  dlCancel.value = CANCEL;

  initDownloadButtons();
  initVersionButtons();
  showChromePromo();
  showUpdaterCheck();
  showAdminUserCheck(dlForm);
  showUserStatsCheck();
  showEarthProLink();

  /**
   * Initializes event handlers for Download and Cancel buttons.
   */
  function initDownloadButtons() {
    var isLinux = 'linux' == _GU_getPlatform();
    var isMac = 'mac' == _GU_getPlatform();
    var isWin = 'win' == _GU_getPlatform();

    function getVersion() {
      // Get selected version
      var verOptions = document.getElementsByName('dlVersion');
      for (var i = 0, verOption; verOption = verOptions[i]; i++) {
        if (verOption.checked) {
          return verOption.value;
        }
      }
      return 'current';
    }

    function downloadEarthFree() {
      // Download Google Earth

      // Download previous version of Google Earth
      if (getVersion() != 'current') {
        downloadUrl += '#release=previous';
      }

      if (isMac) {
        /*
         * Mac
         */
        earth.download.track('non_cider_mac_thanks');
        downloadUrl += '#os=mac';

        // Intel-based Mac
        if (earth.download.os.match('intel')) {
          downloadUrl += '#intel=yes';
        }

        // Install google updater
        if (!dlUpdater || (dlUpdater && dlUpdater.checked)) {
          downloadUrl += '#updater=yes';
        }
      } else if (isLinux) {
        /*
         * Linux
         */
        earth.download.track('non_cider_linux_thanks');
        downloadUrl += '#os=linux';
      } else if (isWin) {
        /*
         * Windows
         */
        earth.download.track('non_cider_windows_thanks');
        downloadUrl += '#os=win';

        // Agree to install chrome
        if (dlAgreeChrome && dlAgreeChrome.checked) {
          downloadUrl += '#chrome=yes';
        }

        // Agree to send usage statistics
        if (dlStats && dlStats.checked) {
          downloadUrl += '#usagestats=yes';
        }

        // Install google updater
        if (!dlUpdater || (dlUpdater && dlUpdater.checked)) {
          downloadUrl += '#updater=yes';
        }

        // Install single user version
        if (dlAdminUser && !dlAdminUser.checked) {
          downloadUrl += '#single=yes';
        }

        // Add branding parameter
        var urlVars = earth.parseURLVar();
        if (urlVars['brand']) {
          downloadUrl += '#brand=' + urlVars['brand'];
        }
      }
      earth.download.redirect(downloadUrl);
    }


    function downloadEarthPro() {
      // Download previous version of Google Earth Pro
      if (getVersion() != 'current') {
        downloadUrl += '#release=previous';
      }

      // Download Google Earth Pro
      if (isMac) {
        /*
         * Mac, Google Earth Pro
         */
        earth.download.track('non_cider_pro_mac_thanks');
        downloadUrl += '#os=mac#version=pro';

        // Intel-based Mac
        if (earth.download.os.match('intel')) {
          downloadUrl += '#intel=yes';
        }

        // Install google updater
        if (!dlUpdater || (dlUpdater && dlUpdater.checked)) {
          downloadUrl += '#updater=yes';
        }
      } else if (isLinux) {
        /*
         * Mac, Google Earth (Pro not available)
         */
        earth.download.track('non_cider_protry_linux_thanks');
        downloadUrl += '#os=linux';
      } else {
        /*
         * Windows, Google Earth Pro
         */
        earth.download.track('non_cider_pro_windows_thanks');
        downloadUrl += '#os=win#version=pro';

        // Install google updater
        if (!dlUpdater || (dlUpdater && dlUpdater.checked)) {
          downloadUrl += '#updater=yes';
        }
      };
      earth.download.redirect(downloadUrl);
    }

    // Construct download link based on OS and Earth version
    dlAgree.onclick = function() {
      if (dlForm.name == 'dlFree') {
        downloadEarthFree();
      } else if (dlForm.name == 'dlPro') {
        downloadEarthPro();
      }
    };

    // Cancel button pressed - go back to homepage.
    dlCancel.onclick = function() {
      earth.download.redirect('index.html');
    };

    // Agree to install chrome checkbox
    if (dlAgreeChrome) {
      dlAgreeChrome.onclick = function() {
        var chromeAgreement = document.getElementById('dlChromeAgreement');
        if (chromeAgreement && dlAgreeChrome && dlAgreeChrome.checked) {
          chromeAgreement.className = '';
        } else if (chromeAgreement) {
          chromeAgreement.className = 'hidden';
        }
      };
    }
  }


  /**
   * Initialize events which change whether advanced checkboxes are enabled
   * based on the selected version.
   */
  function initVersionButtons() {
    var btnCurr = document.getElementById('dlVersionCurr');
    var btnPrev = document.getElementById('dlVersionPrev');

    if (btnCurr && btnPrev) {
      btnCurr.onclick = toggleAdvanced;
      btnPrev.onclick = toggleAdvanced;
    }

    function toggleAdvanced() {
      if (btnCurr.checked) {
        dlUpdater.checked = true;
        dlUpdater.disabled = false;
        dlAdminUser.checked = true;
        dlAdminUser.disabled = false;
      } else if (btnPrev.checked) {
        dlUpdater.checked = false;
        dlUpdater.disabled = true;
        dlAdminUser.checked = false;
        dlAdminUser.disabled = true;
      }
    }
  }

  function showEarthProLink() {
    var dlEarthProLink = document.getElementById('dlEarthProLink');

    if (dlEarthProLink && 'linux' != _GU_getPlatform()) {
      dlEarthProLink.className = '';
    }
  }

  /**
   * Shows download updater checkbox.
   * Windows and Mac versions only.
   */
  function showUpdaterCheck() {
    var dlUpdaterLabel = document.getElementById('dlUpdaterLabel');
    if ('win' == _GU_getPlatform() || 'mac' == _GU_getPlatform()) {
      // Show updater checkbox
      if (dlUpdaterLabel) {
        dlUpdaterLabel.className = '';
      }
    }
  }

  /**
   * Shows install link for users without admin rights.
   * Windows free version only.
   */
  function showAdminUserCheck() {
    // Initialize single user download link
    var dlAdminUserLabel = document.getElementById('dlAdminUserLabel');
    if (dlForm.name == 'dlFree' && 'win' == _GU_getPlatform()) {
      // Show admin user checkbox
      if (dlAdminUserLabel) {
        dlAdminUserLabel.className = '';
      }
    }
  }

  /**
   * Shows usage stats checkbox.
   */
  function showUserStatsCheck() {
    var dlStatsLabel = document.getElementById('dlStatsLabel');

    if (dlForm.name == 'dlFree' && dlStatsLabel &&
        earth.download.os.indexOf('win') >= 0) {
      dlStatsLabel.className = '';
    }
  }

  /**
   * Shows Chrome bundle/promo text.
   */
  function showChromePromo() {
    var isChrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

    if ('win' == _GU_getPlatform()) {
      _GU_SetupOneClick();
    }

    if (_GU_isOneClickAvailable()) {
      var hasChrome = window.google.update.oneclick.getInstalledVersion(
          '{8A69D345-D564-463C-AFF1-A69D9E530F96}', false);
    }

    if (!hasChrome && 'win' == _GU_getPlatform() && !isChrome) {
      // User hasn't installed Chrome
      var dlChromePromo = document.getElementById('dlChromePromo');
      var chromeAgreement = document.getElementById('dlChromeAgreement');

      if (dlChromePromo) dlChromePromo.className = '';
      if (chromeAgreement) chromeAgreement.className = '';
    } else if (dlAgreeChrome) {
      dlAgreeChrome.checked = false;
      var chromeAgreement = document.getElementById('dlChromeAgreement');
    }
  }
}

/**
 * Changes url of the current browser window/tab.
 * @param {String} downloadUrl Url to which we're redirecting.
 */
earth.Download.prototype.redirect = function(downloadUrl) {
  location.href = downloadUrl;
};

/**
 * Adds tracking of the download button clicks.
 * @param {String} dlType Type of the download (cider, non_cider).
 */
earth.Download.prototype.track = function(dlType) {
  urchinTracker('/earth/' + this.locale['lang'] + '_download_earth_' + dlType);
};

/**
 * Create download URL for the download on the thank you page.
 */
earth.Download.prototype.thanksDownloadEarth = function() {
  var urlVars = earth.parseURLVar();
  var stubUrl = createStubUrl(urlVars);
  var dlFrame = document.getElementById('branded');
  var dlLink = document.getElementById('retry');
  var downloadbox = document.getElementById('downloadbox');

  // Either version or platform specified in the url - start the download.
  if (urlVars['version'] || urlVars['os']) {
    dlFrame.src = stubUrl;
    dlLink.href = stubUrl;
    downloadbox.className = "";
  }

  /**
   * Creates a stub download url for Windows or return download
   * url for non-windows operating systems.
   * @param {Array.<string>} urlVars Passed url variables.
   */
  function createStubUrl(urlVars) {
    var lang = earth.globals.locale['lang'];
    var admin = 'True';
    var params = '';
    var DL_HOST = 'http://dl.google.com';
    var appInfo = [];

    // Check if user requested chrome install
    if (urlVars['chrome'] == 'yes') {
      var name = 'Google Earth with Google Chrome';
      var guid = '{8A69D345-D564-463C-AFF1-A69D9E530F96}';
      var admin = 'True';

      var params = '&brand=CHNU&installdataindex=' +
                   'skipfirstrunui-importsearch-notdefaultbrowser';

      appInfo.push(_GU_createAppInfo(guid, name, admin, params));
    }

    if (urlVars['os'] == 'win') {
      if (urlVars['version'] == 'pro') {

        // Previous Pro version, Windows
        if (urlVars['release'] && urlVars['release'] == 'previous') {
          return earth.Download.PREV_VER_WIN_PRO;
        }

        // Current version, no updater
        if (!urlVars['updater']) {
          return earth.Download.NO_UPDATER_WIN_PRO;
        }

        // Windows, Google Earth Pro
        var stubName = '/earth/client/GoogleEarthProSetup.exe';
        var name = 'Google Earth Pro';
        var guid = '{65E60E95-0DE9-43FF-9F3F-4F7D2DFF04B5}';
        var params = '';
      } else {
        /*
         * Windows, Google Earth
         */
        // Previous version of the Windows client
        if (urlVars['release'] && urlVars['release'] == 'previous') {
          return earth.Download.PREV_VER_WIN;
        }

        // Current version, single user install, no updater
        if (urlVars['single'] == 'yes' && !urlVars['updater']) {
          return earth.Download.NON_ADMIN_WIN;
        }

        // Current version, no updater
        if (!urlVars['updater']) {
          return earth.Download.NO_UPDATER_ADMIN_WIN;
        }

        // Current version of the Windows client, updater
        var stubName = '/earth/client/GoogleEarthSetup.exe';
        var name = 'Google Earth';
        var guid = '{74AF07D8-FB8F-4d51-8AC7-927721D56EBB}';
        var params = '';

        // Current version, single version, updater
        if (urlVars['single'] == 'yes' && urlVars['updater'] == 'yes') {
          admin = 'False';
          stubName = '/earth/client/GoogleEarthPerUserSetup.exe';
          name = 'Google Earth';
          guid = '{74AF07D8-FB8F-4d51-8AC7-927721D56EBB}';
        }
      }
    } else if (urlVars['os'] == 'mac') {
      if (urlVars['version'] == 'pro') {
        /*
         * Mac, Google Earth Pro
         */
        // Previous Pro version, Mac
        if (urlVars['release'] && urlVars['release'] == 'previous') {
          return earth.Download.PREV_VER_MAC_PRO;
        }

        // Current version, no updater
        if (!urlVars['updater']) {
          if (urlVars['intel'] == 'yes') {
            return earth.Download.NO_UPDATER_MAC_PRO_INTEL;
          } else {
            return earth.Download.NO_UPDATER_MAC_PRO_UNIV;
          }
        }

        if (urlVars['intel'] == 'yes') {
          return earth.Download.CURR_VER_MAC_PRO_INTEL;
        } else {
          return earth.Download.CURR_VER_MAC_PRO_UNIV;
        }

      } else {
        /*
         * Mac, Google Earth
         */
        // Previous version of the windows client
        if (urlVars['release'] && urlVars['release'] == 'previous') {
          return earth.Download.PREV_VER_MAC;
        }

        // Current version, no updater
        if (!urlVars['updater']) {
          if (urlVars['intel'] == 'yes') {
            return earth.Download.NO_UPDATER_MAC_INTEL;
          } else {
            return earth.Download.NO_UPDATER_MAC_UNIV;
          }
        }

        if (urlVars['intel'] == 'yes') {
          return earth.Download.CURR_VER_MAC_INTEL;
        } else {
          return earth.Download.CURR_VER_MAC_UNIV;
        }

      }
    } else if (urlVars['os'] == 'linux') {
      /*
       * Linux
       */
      // Previous version of the Linux client
      if (urlVars['release'] && urlVars['release'] == 'previous') {
        return earth.Download.PREV_VER_LINUX;
      }

      return DL_HOST + '/earth/client/current/GoogleEarthLinux.bin';
    }

    params = setEarthParameters(urlVars, params);

    if (urlVars['chrome'] == 'yes') {
      var stubName = '/update2/installers/current/googleupdatesetup.exe'
    }

    appInfo.push(_GU_createAppInfo(guid, name, admin, params));
    return _GU_buildDlPath(appInfo, lang, false, DL_HOST, stubName);

    /**
     * Sets earth download parameters.
     * @param {Array.<string>} urlVars Passed url variables.
     * @param {string} params Current parameters.
     */
    function setEarthParameters(urlVars, params) {
      // Set "send usage statistics" parameter
      if (urlVars['usagestats'] == 'yes') {
        params += '&usagestats=1';
      }

      // Set branding parameter
      if (urlVars['brand']) {
        params += '&brand=' + urlVars['brand'];
      } else {
        var params = '&brand=GGGE';
      }

      return params;
    }
  }
};
