var ansi = "?", ajax_base_href = "";

var newXMLHttpRequest;
if (window.XMLHttpRequest)
 newXMLHttpRequest = function() { return new XMLHttpRequest(); }
else if (window.ActiveXObject)
 if (navigator.userAgent.indexOf("MSIE 5") >= 0)
  newXMLHttpRequest = function() { return new ActiveXObject("Microsoft.XMLHTTP"); }
 else
  newXMLHttpRequest = function() { return new ActiveXObject("MSXML2.XMLHTTP"); }
else newXMLHttpRequest = function() { return null; }

function fix_ajax_url(url)
{
 if (ajax_base_href && url.indexOf(document.location.protocol) != 0)
 {
  if (url.charAt(0) == "/") url = url.substr(1);
  url = ajax_base_href + url;
 }
 return url;
}

function ajax_request(data)
{
 var request, timer = null;
 if (data.url && (request = newXMLHttpRequest()))
 {
  data.url = fix_ajax_url(data.url);
  if (!data.post) data.post = null;
  if (!data.charset) data.charset = "windows-1251";
  if (!data.headers) data.headers = {};
  if (!data.timeout) data.timeout = 0;
  request.onreadystatechange = function()
  {
   if (request.readyState == 4)
   {
    if (timer) clearTimeout(timer);
    if (data.onsuccess && (request.status == 200 || request.status == 0))
     data.onsuccess(request);
    else if (data.onerror)
     data.onerror(request);
   }
  }
  var method = data.post ? "POST" : "GET";
  request.open(method, data.url, true);
  if (request.overrideMimeType)
   request.overrideMimeType("text/plain");
  if (method == "POST")
   data.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=" + data.charset;
  for (var i in data.headers)
   request.setRequestHeader(i, data.headers[i]);
  request.send(data.post);
  if (data.timeout) timer = setTimeout(function() { request.abort(); }, data.timeout);
  return true;
 } else return false;
}

function int2hex(x)
{
 var h = "0123456789ABCDEF", result = "";
 while (x)
 {
  result = h.charAt(x & 15) + result;
  x >>>= 4;
 }
 return result || "0";
}

function ansi2utf(s)
{
 var code, result = "";
 for (var i = 0; i < s.length; i++)
 {
  code = s.charCodeAt(i);
  if (code < 128 || code > 255) result += s.charAt(i);
  else result += ansi.charAt(code - 128);
 }
 return result;
}

function utf2ansi(s)
{
 var char, n, result = "";
 for (var i = 0; i < s.length; i++)
 {
  char = s.charAt(i);
  if (s.charCodeAt(i) > 255)
  {
   n = ansi.indexOf(char);
   if (n >= 0) char = String.fromCharCode(n + 128);
  }
  result += char;
 }
 return result;
}

function url_encode(s)
{
 var skip = "!'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", char, code, n, result = "";
 if (typeof s != "string") s = s.toString();
 for (var i = 0; i < s.length; i++)
 {
  char = s.charAt(i);
  code = s.charCodeAt(i);
  if (code > 255)
  {
   n = ansi.indexOf(char);
   if (n >= 0)
   {
    code = n + 128;
    char = String.fromCharCode(code);
   }
  }
  if (code <= 255)
   if (code >= 128 || skip.indexOf(char) == -1)
    result += "%" + (code < 16 ? "0" : "") + int2hex(code);
   else result += char;
  else result += escape(char);
 }
 return result;
}

function url_encode_array(a)
{
 var result = [];
 for (var i in a)
  result.push(url_encode(i) + "=" + url_encode(a[i]));
 return result ? result.join("&") : "";
}

function serialize_form(form)
{
 var element, values = {};
 for (var i = 0; i < form.elements.length; i++)
 {
  element = form.elements[i];
  if (element.name)
   switch (element.type)
   {
    case "checkbox": values[element.name] = element.checked ? element.value : ""; break;
    case "radio": if (!values[element.name]) values[element.name] = element.checked ? element.value : ""; break;
    default: values[element.name] = element.value;
   }
 }
 return url_encode_array(values);
}

function add_slashes(s)
{
 if (s) s = s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n").replace(/\r/g, "\\r");
 return s;
}

function serialize_object(obj)
{
 var result = "", first = true;
 if (obj == null || obj == undefined) return result + obj;
 switch (typeof obj)
 {
  case "boolean": result += obj; break;
  case "number": result += obj; break;
  case "string": result += "\"" + add_slashes(obj) + "\""; break;
  case "object":
   switch (obj.constructor)
   {
    case Array:
     result += "[";
     for (var i = 0; i < obj.length; i++)
     {
      if (!first) result += ", ";
      result += serialize_object(obj[i]);
      first = false;
     }
     result += "]";
    break;
    case Object:
     result += "{";
     for (var i in obj)
     {
      if (!first) result += ", ";
      result += "\"" + i + "\": " + serialize_object(obj[i]);
      first = false;
     }
     result += "}";
   }
 }
 return result;
}

(function()
{
 var base = document.getElementsByTagName("BASE");
 if (base && base[0] && base[0].href)
 {
  var base_href = base[0].href;
  var base_host = base_href.match("^" + document.location.protocol + "\/\/([^\/]+)");
  if (base_host && base_host[1])
  {
   base_host = base_host[1];
   if (document.location.host != base_host)
    base_href = base_href.replace(base_host, document.location.host);
  }
  ajax_base_href = base_href.charAt(base_href.length - 1) == "/" ? base_href : base_href + "/";
 }
})();