/**
 * @copyright 2007 "Rambler Internet Holding"
 * @author Alexey Golubchik
 */

typeof GA == 'undefined' && (GA = {})
/**
 * Консруктор_объекта, позволяющего_асинхроно_получать_JSON_данные_по_get_запросу,
 * в_том_числе_с_другово_домена.
 */
GA.JsHttpRequest = function() {}
/**
 * Переменная, которой_присваевается_значение_JSON_данных,
 * в_JS коде_ответной_страницы_сервера.
 */
GA.JsHttpRequest.aSessions = [{}];

/**
 * метод_запрашивающий_JSON_данные_у_сервера,
 * и_вызывающий, при_получении_данных_от_сервера, указнаный_метод,
 * передавая_ему, в_параметрах, пришедшие_JSON_данные_и_каждый_параметр,
 * сохраненный_для_этой_сессии.
 * Нет_необходимости_создавать_отдельный_экземпляр_объекта_JsHttpRequest,
 * достаточно_подключить_этот_прототип_к_обекту,
 * в_котором_нужно_запрашивать_сервер_и_в_котором_есть_метод_обработки_ответа,
 * Или_вызывать_этот_метод_через_GA.JsHttpRequest.prototype.send.call(this, ...,
 * если_нехочетца_заводить_в_обекте_метод_send.
 * @param {String} url - строка_get_запроса.
 * @param {String} callbackMethodName - название_метода, вызываемого_при_получениии_ответа.
 * @param {Array} aSessionParams - массив_параметров, хранимых_для_передачи_методу_обработки_полученного_ответа.
 */
GA.JsHttpRequest.prototype.send = function(url, callbackMethodName, aSessionParams) {
  var sessID, fn;
  if (this.requestScriptNode) {
//передумал переменные сессии в массиве хранить, пусть через замыкание хранятся.
//    sessID = this.requestScriptNode.sessID;
    this.requestScriptNode.parentNode.removeChild(this.requestScriptNode);
//    delete GA.JsHttpRequest.aSessions[sessID]
  }
  sessID=0;
//  while (typeof GA.JsHttpRequest.aSessions[sessID] != 'undefined') {
//    sessID++
//  }
//  GA.JsHttpRequest.aSessions[sessID] = {'params': aSessionParams};
  fn = GA.JsHttpRequest.makeOnLoadProcessor(this, callbackMethodName, aSessionParams.slice(0));
  this.requestScriptNode = (function(sessID){
    var n, t = document.createElement('DIV');
    t.style.display = 'none';
    document.body.appendChild(t);
    t.innerHTML = 't<s'+'cript type="text/javascript" language="JavaScript" charset="utf-8"></' + 'script>';
    n = t.removeChild(t.lastChild);
    document.body.replaceChild(n, t);
    n.onreadystatechange = n.onload = fn;
//    n.sessID = sessID;
    return n
  })(sessID);
  url += (url.indexOf('?') != -1)? '&': '?';
  url += 'sessid='+sessID;
  if (this.requestScriptNode.setAttribute) {
    this.requestScriptNode.setAttribute('src', url)
  } else {
    this.requestScriptNode.src = url
  }
}
/**
 * Создает_обработчик, запускаемый_при_получении_ответа_сервера.
 * @param {Object} obj
 * @param {String} callbackMethodName
 * @param {Array} oParams
 */
GA.JsHttpRequest.makeOnLoadProcessor = function (obj, callbackMethodName, oParams) {
  var isDone = 0;
  return function(e) {
    var a = GA.JsHttpRequest.aSessions, v = [null];
    e = window.event || e;
    if (
      isDone ||
      (e.type == 'readystatechange' && !/loaded|complete/.test(this.readyState))
    ) return;
    isDone = 1;
    if ( callbackMethodName && (typeof obj[callbackMethodName] != 'undefined') ) {
//      typeof a[this.sessID].value != 'undefined' && (v[0] = a[this.sessID].value);
      typeof a[0].value != 'undefined' && (v[0] = a[0].value);
//      obj[callbackMethodName].apply( obj, v.concat(a[this.sessID].params.slice(0)) );
      obj[callbackMethodName].apply( obj, v.concat(oParams) );
    }
    delete a[0].value
  }
}
