//
// JavaSript Extensions library v0.1
// ---------------------------------
// developed by Embl at www.embl.ru <office@embl.ru>
// 
/*var tler = 'Вы выделили слишком большой текст!';
var et1 = 'Вы выделили текст:\n\n>>>';
var et2 = '<<<\n\nХотите послать сообщение об ошибке?';
var coment = 'Прокомментируйте ошибку (обязательно):';*/
var tler = 'Selected text is too long!';
var et1 = 'Selected text:\n\n>>>';
var et2 = '<<<\n\nDo you want send a message about error?';
var coment = 'Comment selected text (required):';
Function.prototype.bind = function(object) {
  var method = this;
  return function() {
    method.apply(object, arguments);
  }
};
if (!Function.apply){
  // may be missed in old version of browsers
  Function.prototype.apply = function(oObject, aParams) {
    var aParamString = new Array();
    if (!oObject) oObject = window;
    if (!aParams) aParams = new Array();
    
    for (var i = 0; i < aParams.length; i++)
      aParamString.push('aParams[' + i + ']');
    
    oObject.__apply__ = this;
    var result = eval('oObject.__apply__(' + aParamString.join(', ') + ')');
    oObject.__apply__ = null;
    
    return result;
  }
};
if (!Array.push){
  Array.prototype.push = function(){
    for (var i = 0, j = this.length; i < arguments.length; i++, j++)
      this[j] = arguments[i];

    return this.length;
  }
};
function hex(iValue){
  return parseInt(iValue).toString(16).toUpperCase();
};
var __escape   = window.escape;
var __escapeTable = new Object();
__escapeTable[0x401]  = 0xA8;       // Ё
__escapeTable[0x451]  = 0xB8;       // ё
for (var i = 0x410; i <= 0x44F; i++) __escapeTable[i] = i - 0x350; // А-Яа-я
window.escape = function(sString){
  var ret = [];
  // Составляем массив кодов символов, попутно переводим кириллицу
  for (var i = 0; i < sString.length; i++)
  {
    var n = sString.charCodeAt(i);
    if (typeof __escapeTable[n] != 'undefined') n = __escapeTable[n];
    if (n <= 0xFF) ret.push(n);
  }
  return __escape(String.fromCharCode.apply(null, ret));
};

Transport = function(sUrl){
  this.transport = this.getTransport();

  this.url      = sUrl;
  this.params   = {};
  this.handlers = {};

  return this;
};

Transport.prototype = {
  __events: ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'],

  // params methods
  setParam: function(index, value){
    this.params[index] = value;
  },

  // state methods
  responseIsSuccess: function() {
    try {
      return    (this.transport.status == undefined)
             || (this.transport.status == 0)
             || (this.transport.status >= 200 && this.transport.status < 300);
    } 
    catch(e) 
    { 
      alert('Get transport status error:\n\n    ' + (e.message || e)); 
      return;
    }
  },

  responseIsFailure: function() {
    return !this.responseIsSuccess();
  },

  request: function(sUrl) {
    var parameters;
    var params = new Array();

    for (var sParamName in this.params)
      params.push(sParamName + '=' + escape(this.params[sParamName]));
    parameters = params.join('&');

    try {
      if (parameters)
        sUrl += (sUrl.indexOf('?') == -1 ? '?' : '&') + parameters;

      // open transport
      this.transport.open('GET', sUrl, true);
      this.transport.onreadystatechange = this.respondToReadyState.bind(this);
      this.transport.send(null);

    } catch (e) {
      alert('Transport request error:\n\n    ' + (e.message || e.description || e));
    }
  },

  get: function(sUrl){
    this.request(sUrl || this.url);
  },

  respondToReadyState: function(){
var handler;

if (this.transport.readyState == 4)
if (handler = this.handlers.onComplete)
handler(this.transport);
}

};

Transport.prototype.getTransport = function(){
  var __transport = new Array(
                              function(){ return XMLHttpRequest ? new XMLHttpRequest() : null },
                              function(){ return ActiveXObject  ? new ActiveXObject('Msxml2.XMLHTTP') : null },
                              function(){ return ActiveXObject  ? new ActiveXObject('Microsoft.XMLHTTP') : null }
                             );   

  for (var i = 0; i < __transport.length; i++)
    try {
      if (__transport[i]())
        return __transport[i];
    } catch(e) {}

  return function(){ return null };
}();

document.onkeypress = function(e){
  var event = e || window.event;
  if (event.ctrlKey && (event.keyCode == 10 || event.keyCode == 13))
  {
    var text, parentElement;
    try {
      if (document.selection)
      {
        var oRange = document.selection.createRange();
        text = (oRange && oRange.text) || '';
        if (oRange)
          parentElement = oRange.parentElement();
      }
      else
      {
        text = (window.getSelection || this.window.document.getSelection || function(){return''})();
        if (text.getRangeAt)
          parentElement = text.getRangeAt(0).startContainer;
      }
    } catch(e) {alert(e.message); return}

    if (text)
    {
      text = String(text).replace(/^\s+|\s+$/g, '').replace(/\s+/g, ' ');
      if (!text) return;
      if (text.length > 255)
      {
        alert(tler);
        return;
      }
      if (confirm(et1 + text + et2))
      {
        while (parentElement && !parentElement.id)
          parentElement = parentElement.parentNode;
          
        var comment;
        if (comment = prompt(coment, ''))
        {
          var request = new Transport(location.protocol + '//' + location.host + ERU);
          request.handlers.onComplete = function(req){
            var parts = req.responseText.split("\n");
            if (parts[parts.length - 1].toLowerCase() == 'ok')
            {
              parts.length = parts.length - 1;
              alert(parts.join('\n'));
            }
          };
          request.setParam('url', location.href);
          request.setParam('text', text);
          request.setParam('comment', comment);
          request.setParam('nodeId', parentElement ? parentElement.id : '');
          request.get();
        }
      }
    }
  }
}

