/**
 * Скрипт обновления телефона на сайте.
 *
 * Если пользователь перешел на сайт из поисковых систем, либо по ссылке с метками,
 * скрипт определяет это и меняет телефон на соответствующий.
 *
 * Версия 1.2
 * Copyright 2010 Serenity LLC (Alexey Simonenko)
 */
(function () {
  var SERENITY_CONTAINER = 'serenity_phone';

  // Инициируем XMLHttpRequest объект
  try {
    var request;

    if (window.XMLHttpRequest) {
      request = new XMLHttpRequest();
    } else {
      if (window.ActiveXObject) {
        request = new ActiveXObject("Microsoft.XMLHTTP");
      } else {
        return false;
      }
    }
  } catch (e) {
    return false;
  }

  // Добавляем функции forEach для массивов и объектов
  // За пример взят код: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/ForEach
  var forEach = function(element, fun/*, thisp*/) {
    var len = element.length >>> 0;
    if (typeof fun != "function") {
      throw new TypeError();
    }

    var thisp = arguments[1];
    for (var i = 0; i < len; i++) {
      if (i in element) {
        fun.call(thisp, element[i], i, element);
      }
    }
  };

  // xCookie r2, Copyright 2009 Michael Foster (Cross-Browser.com)
  // Описание: http://cross-browser.com/x/lib/view.php?s=xCookie
  var _Cookie = {
    get: function(name) {
      var cookies = document.cookie.match(new RegExp('(^|;)\\s*' + name + '=([^;\\s]*)'));
      return ((cookies && cookies.length >= 3) ? unescape(cookies[2]) : null);
    },

    set: function(name, value, days, path, domain, secure) {
      if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 8.64e7)); // now + days in milliseconds
      }

      document.cookie = name + '=' + escape(value)
                      + (days ? ('; expires=' + date.toGMTString()) : '')
                      + '; path=' + (path || '/')
                      + (domain ? ('; domain=' + domain) : '')
                      + (secure ? '; secure' : '');
    },

    del: function(name, path, domain) {
      this.set(name, '', -1, path, domain); // sets expiry to now - 1 day
    }
  };

  // Кросс-браузерный вариант getElementsByClassName функции
  var _getElementsByClassName = function(className) {
    var root = document.body;

    // Если есть getElementsByClassName, используем его
    if (document.getElementsByClassName) {
      return root.getElementsByClassName(className);
    }

    // Если есть querySelectorAll (HTML5) стандарт, используем его
    if (root.querySelectorAll) {
      return root.querySelectorAll('.' + className);
    }

    // Для всех остальных
    var tags     = root.getElementsByTagName('*'),
        nodeList = [];

    for (var i=0, tag; tag=tags[i++]; ) {
      var name = tag.className;
      if (typeof name != 'undefined' && name.length > 0) {
        if (name == className || new RegExp("(^|\\s)" + className + "(\\s|$)").test(name)) {
          nodeList[nodeList.length] = tag;
        }
      }
    }

    return nodeList;
  };

  // Функция получения значения параметра name заданного в QueryString
  var _getQueryStringParam = function(name) {
    var url         = window.location.href || '',
        value       = '',
        queryString = url.split('?');

    if (queryString.length == 1) {
      return value;
    }

    queryString[0] = '';

    var params = queryString.join('?').substring(1).split('&');

    forEach(params, function(element) {
      var param = element.split('=');

      if (param[0] == name) {
        value = param[1];
      }
    });

    return value;
  };

  // Функция обновления номеров на странице
  var _updatePhone = function(phone) {
    if (typeof $serenityCallback != 'undefined' && typeof $serenityCallback == 'function') {
      var options = $serenityCallback.call(this, phone, SERENITY_CONTAINER);
    } else {
      var options = {
        containers: [SERENITY_CONTAINER],
        phones:     [phone]
      };
    }

    for (var i = 0, length = options.phones.length; i < length; i++) {
      forEach(_getElementsByClassName(options.containers[i]), function(element) {
        element.innerHTML = options.phones[i];
      });
    }
  };

  // Собираем запрос к PHP скрипту для получения телефонного номера
  var SCRIPT_PATH = SERENITY_CONTAINER,
      referrer    = document.referrer || '',
      source      = _getQueryStringParam('utm_source') || '',
      query       = [
                      'r=' + encodeURIComponent(referrer),
                      'u=' + encodeURIComponent(source),
                      't=' + (new Date()).getTime()
                    ],
      url         = '/' + SCRIPT_PATH + '.php?' + query.join('&'),
      cookie      = _Cookie.get(SERENITY_CONTAINER);

  if (cookie && cookie != '' && cookie != ' ') {
    // Обновляем телефон из куков если не давно он был туда добавлен
    _updatePhone(cookie);
  } else {
    // Делаем запрос на получение телефона, обновляем телефон на сайте и запоминаем его в куках
    request.open('GET', url, true);
    request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    request.onreadystatechange = function() {
      if (request.readyState == 4 && request.responseText != '') {
        _updatePhone(request.responseText);

        var location = window.location,
            host     = (location && location.host) ? '.' + location.host.replace('www.', '') : null;

        _Cookie.set(SERENITY_CONTAINER, request.responseText, 1, '/', host);
      }
    };
    request.send(null);
  }
})();
