/**
 * @param {Object} x The variable to debug
 * @param {Number} max The maximum number of recursions allowed (keep low, around 5 for HTML elements to prevent errors) [default: 10]
 * @param {String} sep The separator to use between [default: a single space ' ']
 * @param {Number} l The current level deep (amount of recursion). Do not use this parameter: it's for the function's own use
 */
function var_dump(x, max, sep, l) {
	l = l || 0;
	max = max || 10;
	sep = sep || ' ';
	if (l > max) {
		return "[WARNING: Too much recursion]\n";
	}
	var i, r = '', t = typeof x, tab = '';
	if (x === null) {
		r += "(null)\n";
	} else if (t == 'object') {
		l++;
		for (i = 0; i < l; i++) {
			tab += sep;
		}
		if (x && x.length) {
			t = 'array';
		}
		r += '(' + t + ") :\n";
		for (i in x) {
			try {
				r += tab + '[' + i + '] : ' + var_dump(x[i], max, sep, (l + 1));
			} catch(e) {
				return "[ERROR: " + e + "]\n";
			}
		}
	} else {
		if (t == 'string') {
			if (x == '') {
				x = '(empty)';
			}
		}
		r += '(' + t + ') ' + x + "\n";
	}
	return r;
};

var timingArray = {};
var lastClickedTarget=false;
var ctrlIsDown=false;

function goLink(url) {
  setTimeout(function() {
    window.location = url;
  }, 0);
}

function getId(tar){
  return document.getElementById(tar);
}

//===========================================================================
/**
* Загрузить контент на страницу
*
* @param   href            страница
* @param   param          параметры
* @param   id             идентифиактор объекта в который загружается контент
* @param   message        сообщение о загрзке
* @param   afterResponse  действие после загрузки
*/
function downloadPage( href, param, id, message, afterResponse)
{
      alert (param);
  if (param.indexOf('?') == 0) {
    param = param.substring(1, param.length);
  }
  param = param.replace(/&amp;/g, '&');
  var errMsg = '';
  if(message==undefined)
  {
    var DHTMLtar = getId(id);
    if (DHTMLtar && DHTMLtar.tagName=='TR'){
      if (DHTMLtar.previousSibling){
        var exRow = DHTMLtar.previousSibling;
      }else if(DHTMLtar.nextSibling){
        var exRow = DHTMLtar.nextSibling;
      }else{
        var exRow = false;
      }
      if (exRow){
        var colspan=0;
        for (var i =0; i<exRow.childNodes.length;i++){
          var el = exRow.childNodes[i];
          colspan += $(el).attr('colSpan');
        }
        colspan = ' colspan = "'+colspan+'" ';

      }else{
        var colspan = '';
      }
      message = '<td '+colspan+'>'+themeLoadingMessage(id)+'</td>';
    }else{
      message = themeLoadingMessage(id);
    }
  }

  $h = $('#'+id);
  $h.html (message);

  /*if($('span#loadTimer'+id).length!=0)
  $('span#loadTimer'+id).everyTime(1000,'timer_of_'+id,function (){try{t=$('span#loadTimer'+id).text().split(':'); m=t[0];s=t[1]; s++; if(s==60) {m++;s=0} if(m<10) m='0'+(m*1); if(s<10) s='0'+(s*1); $('span#loadTimer'+id).text(m+':'+s);} catch(er){}  });
  */
  id = id === false ? 'false' : id;

  if ($h[0] || id==='false'){
    //send
    //Сохраняем ID в который загружается контент
    param += '&html_id=' + id;
    //Добавляем идищник Ajax запроса
    var ajaxId = random(9999999999)
    param += '&ajaxId=' + ajaxId;
    param += '&loadedExtraFiles='+FE.loadedExtraFiles;
    //создаем запись о том что послали
    var hajax = getId('handledAjax');
    if (hajax){
      var se = document.createElement("DIV");
      var started = new Date();
      timingArray[ajaxId] = started;
      se.innerHTML = '<div class="ajaxResultHeader" id="header'+ajaxId+'" onclick="toggleAjaxResult(this)">sent at '+started.getHours()+':'+started.getMinutes()+':'+started.getSeconds()+' ['+ajaxId+']</div>';
      se.id = 'd'+ajaxId;
      hajax.appendChild(se);
    }

    $.ajax({
      url:href,
      data:param,
      type:'POST',
      success:function(data, textStatus){
        DHTMLtar = getId(id);
        if(DHTMLtar || id == 'false' )
        {
          var tmpDir = getId('ajaxtmpdiv');
          if (!tmpDir){
            tmpDir   = $('body').append('<div id="ajaxtmpdiv" class="hidden"></div>');
            tmpDir   = getId('ajaxtmpdiv');
          }

          if (id == 'false'){
            DHTMLtar = tmpDir;
          }

          tmpDir.innerHTML   = data;
          $d                 = $(tmpDir).find('div.ajaxLength').attr('title');
          tmpDir.innerHTML   = data.substr(0,$d);
          s                  = '<div class="ajaxLength" title="'+$d+'"></div>';
          var tmp            = data.substr($d).replace(s,'');
          /*  alert($(DHTMLtar).html());
          alert(tmp);*/
          if (id != 'false'){
            $(DHTMLtar).html(tmp);
          }
          //Подгоняем параментры области отображения
          var coll = findClass('ajaxResult','div');

          //if (coll.length)
          //for (var i in coll){
          coll.each(function(){
            //if (coll[i])
            var ajaxId = this.id;
            var tar = getId('d'+ajaxId);
            var unh = getId('unhandledAjax');
            if(!tar){
              if(unh){
                tar = unh;
              }
            }
            //если есть куда отнести результат - сохраняеми вписываем.
            if (tar && this.nodeType){
              var re = document.createElement("DIV");
              if (tar == unh){
                re.innerHTML = '<div class="ajaxResultHeader" id="header'+ajaxId+'" onclick="toggleAjaxResult(this)">Unhandled AjaxId! ['+ajaxId+'] returned </div>';
              }else{
                if (getId('header'+ajaxId)){
                  getId('header'+ajaxId).innerHTML += ' returned in '+((new Date()-timingArray[ajaxId])/1000)+' sec';
                }
              }
              re.innerHTML += '<div id="body'+ajaxId+'" class="ajaxResultBody hidden">'+this.innerHTML+'</div>';
              tar.appendChild(re);
              if (this.parentNode){
                $(this).remove();
              }
            }

          });
          //примочечка для фикса загрузщки в экзотические тэги
          var $call = $(tmpDir).find('.frontendajaxactions');
          if ($call.length){
            FE.clearEvent('ajaxonload');
            //свободное событие
            FE.handleEvent('ajaxbeforeload');
            eval($call.html());
            FE.handleEvent('ajaxonload');
            if (FE.inCompleteFiles==0){
              FE.handleEvent('ajaxloadcompleted');
              FE.clearEvent('ajaxloadcompleted');
            }
            $call.remove();
            //свободное событие
            FE.handleEvent('ajaxafterload');
          }

          if (tmpDir){
            $(tmpDir).remove();
          }
        }
        loadEnd();
      },
      complete: function(XMLHttpRequest, textStatus)
      { //Действие после загрузки
        if(afterResponse!=undefined)
        eval(afterResponse);

      }
    }
    );
  }else{
    themeErrorID();
    loadEnd();
  }
}

//= Блокировать экран для загрузки ==========================================
function loadStart()
{
  if (getId('load')){
    getId('load').style.display = 'block';
  }
}

//= Разблокировать экран для загрузки =======================================
function loadEnd()
{
  if (getId('load')){
    getId('load').style.display = 'none';
  }
}

function getForm(el)
{
  var s = '';
  el = typeof(el)=='string' ? document.getElementById(el) : el;
  var cnt = el.length;
  for(i=0; i<cnt; i++)
  {
    if(el[i].tagName=='INPUT' && ((el[i].id!='') || (el[i].name!='')) && el[i].value!='' && el[i].disabled!=true)
    {
      if(el[i].type=='checkbox')
      {
        if(el[i].checked) s = s + '&' + el[i].name +'=' + escapeRus(el[i].value);

      }else if(el[i].type=='radio')
      {
        if(el[i].checked) s = s + '&' + el[i].name +'=' + escapeRus(el[i].value);
      }else
      {
        if (el[i].name!='')
        {
          s = s + '&' + el[i].name +'=' + escapeRus(el[i].value);
        }
        else if (el[i].id!='')
        {
          s = s + '&' + el[i].id +'=' + escapeRus(el[i].value);
        }
      }
    }
    if(el[i].tagName=='SELECT' && el[i].name!='' && el[i].disabled!=true)
    {
      for (j=0; j <el[i].options.length; j++)
      {
        if (el[i].options[j].selected)
        {
          s = s + '&' + el[i].name +'=' + escapeRus(el[i].options[j].value);
        }
      }
    }

    if(el[i].tagName=='TEXTAREA' && el[i].name!='' && el[i].disabled!=true)
    {
      s = s + '&' + el[i].name +'=' + escapeRus(el[i].value);
    }
  }
  //alert (s);
  return s;
}

function escapeRus(str)
{ // Инициализируем таблицу перевод
  var trans = [];
  str += '';
  for(var i=0x410; i<=0x44F; i++)
  {
    trans[i] = i - 0x350; // А-Яа-я
  }
  trans[0x401] = 0xA8;    // Ё
  trans[0x451] = 0xB8;    // ё

  var ret = [];
  // Составляем массив кодов символов, попутно переводим кириллицу
  for (i=0; i<str.length; i++)
  {
    var n = str.charCodeAt(i);//2B
    if ((typeof trans[n] != 'undefined'))
    {
      n = trans[n];
    }
    if (n <= 0xFF)
    {
      ret[i] = escape(String.fromCharCode(n));
    }
    if (n==8470)
    {
      ret[i] = '%B9';
    }
    if (n==43)
    {
      ret[i] = '%2B';
    }
  }
  return ret.join('');
}

var today=new Date();
var seed=today.getTime();

function rnd() {
  seed = (seed*9301+49297) % 233280;
  return seed/(233280.0);
}

function random(number) {
  return Math.ceil(rnd()*number);
}

function toggleAjaxResult(tar){
  var id  = tar.id;
  tar = id.substr(6);
  tar = getId('body'+tar);
  if (tar){
    tar.className = tar.className.indexOf('hidden')!=-1?'ajaxResultBody':'ajaxResultBody hidden';
  }
}

function findClass(str, tagNames, target){
  var p = target==undefined?'':('#'+target.id+' ');
  return $(p+tagNames+'.'+str);
}

function function_exists( function_name ) {    // Return TRUE if the given function has been defined
  //
  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +   improved by: Steve Clay
  // +   improved by: Legaev Andrey


  if (typeof function_name == 'string'){
    return (typeof window[function_name] == 'function');
  } else{
    return (function_name instanceof Function);
  }
}

function showAllErrors(){
  var errorsDiv = getId('debugErrors');
  //prepare error
  if (errorsDiv){
    for (var errId in FE.errList){
      if (FE.errList[errId].state==0){
        FE.errList[errId].state = 1;
        var div = document.createElement("DIV");
        div.innerHTML = FE.errList[errId].message;
        div.className = 'js';
        errorsDiv.appendChild(div);
        getId('ErrorsToggler').innerHTML = 'Errors '+errorsDiv.childNodes.length;
      }
    }
  }
}

function whichElement(e)
{
  var targ;
  if (!e)
  {
    e = window.event;
  }
  if (e.target)
  {
    targ = e.target;
  }
  else if (e.srcElement)
  {
    targ = e.srcElement;
  }
  if (targ.nodeType == 3) // defeat Safari bug
  {
    targ = targ.parentNode;
  }
  ctrlIsDown = e.ctrlKey;
  var tname;
  tname  = targ.tagName;
  return targ;
}
function getTopPos(inputObj)
{
  if(inputObj)
  {
    var s = '';
    var inputObjOld = inputObj;
    var returnValue = 0;
    var returnValueScroll = 0;

    while(inputObj)
    {
      if(inputObj.tagName!='HTML')

      {
        if(inputObj.tagName!='TR')
        {
          returnValueScroll -= inputObj.scrollTop;

          s+= (inputObj.tagName + '-' +
          ' offsetTop:' + inputObj.offsetTop +
          ' offsetHeight:' + inputObj.offsetHeight +
          ' scrollTop:' + inputObj.scrollTop +
          ' scrollHeight:' + inputObj.scrollHeight +
          (inputObj.style.overflow!='' ? ' style.overflow:' + inputObj.style.overflow : '')+
          ' returnValueScroll:' + returnValueScroll+
          '\n'
          );
        }

      }else break;
      inputObj = inputObj.parentNode;
    }

    s+= '\n';

    inputObj = inputObjOld;
    while(inputObj)
    {
      if(inputObj.tagName!='HTML')

      {
        if(inputObj.tagName=='BODY' || inputObj.tagName=='TABLE' || inputObj.tagName=='TD' || inputObj.tagName=='LI' || inputObj.tagName=='INPUT'
        || (navigator.userAgent.indexOf('MSIE')>=0 && (inputObj.tagName=='UL'))
        || (navigator.userAgent.indexOf('MSIE')>=0 && (inputObj.tagName=='DIV' && inputObj.parentNode.tagName!='DIV'))
        )
        {
          //= Ослик думает что если DIV со скролом то начинать прыгать надо от него
          //= и кроме того его совершенно не интересует скролы
          if( (navigator.userAgent.indexOf('MSIE')>=0)
          && (inputObj.style.overflow == 'auto')
          //&& (inputObj.tagName == 'DIV')
          //&& (inputObj.offsetHeight > inputObj.scrollHeight)
          )
          {
            returnValueScroll = 0;
            break;
          }

          returnValue += inputObj.offsetTop;

          s+= (inputObj.tagName + '-' +
          ' offsetTop:' + inputObj.offsetTop +
          ' offsetHeight:' + inputObj.offsetHeight +
          ' scrollTop:' + inputObj.scrollTop +
          ' scrollHeight:' + inputObj.scrollHeight +
          ' returnValue:' + returnValue+
          '\n'
          );
        }

      }else break;
      inputObj = inputObj.parentNode;
    }

    //alert(s);

    //= Позиционирование у Оперы отличается как от IE так и от FF
    //= Отличие в том что абсолютное позиционирование для нее включает скролл-зону
    if(navigator.userAgent.indexOf('Opera')>=0) returnValueScroll = 0;

    return returnValue + returnValueScroll;

  }else
  {
    return false;
  }
}

//===========================================================================
function getLeftPos(inputObj)
{
  if(inputObj)
  {
    var s = '';
    var inputObjOld = inputObj;
    var returnValue = 0;
    var returnValueScroll = 0;

    while(inputObj)
    {
      if(inputObj.tagName!='HTML')

      {
        if(inputObj.tagName!='TR')
        {
          returnValue -= inputObj.scrollLeft;
        }

      }else break;
      inputObj = inputObj.parentNode;
    }

    inputObj = inputObjOld;
    while(inputObj)
    {
      if(inputObj.tagName!='HTML')

      {
        if(inputObj.tagName=='BODY' || inputObj.tagName=='TABLE' || inputObj.tagName=='TD' || inputObj.tagName=='LI' || inputObj.tagName=='INPUT'
        || (navigator.userAgent.indexOf('MSIE')>=0 && (inputObj.tagName=='UL'))
        || (navigator.userAgent.indexOf('MSIE')>=0 && (inputObj.tagName=='DIV' && inputObj.parentNode.tagName!='DIV'))
        )
        { //= Ослик думает что если DIV со скролом то начинать прыгать надо от него
          //= и кроме того его совершенно не интересует скролы
          if( (navigator.userAgent.indexOf('MSIE')>=0)
          && (inputObj.style.overflow == 'auto')
          //&& (inputObj.tagName == 'DIV')
          //&& (inputObj.offsetHeight > inputObj.scrollHeight)
          )
          {
            returnValueScroll = 0;
            break;
          }

          returnValue += inputObj.offsetLeft;
        }

      }else break;
      inputObj = inputObj.parentNode;
    }

    return returnValue + returnValueScroll;

  }else
  {
    return false;
  }
}

function go(whereTo){
  window.location.href = whereTo;
}

function toggleDebug(part){
  tar = getId('debug'+part+'Cont');
  if (tar){
    tar.className = tar.className=='b-debug-messages' ? 'b-debug-messages hidden' : 'b-debug-messages';
  }
}

/*
функция используется в Service.php для переключения состояний объектов между enabled и disabled
переменная me представляет собой css-селектор
*/
function statesChange(me)
{
  if(me.attr('disabled'))
  {
    me.attr('disabled','');
  }
  else
  {
    me.attr('disabled','disabled');
  }
}

/**
Ищет елемент в массиве
*/
function in_array(needle, haystack, argStrict) {
  // http://kevin.vanzonneveld.net
  // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
  // *     returns 1: true

  var found = false, key, strict = !!argStrict;

  for (key in haystack) {
    if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
      found = true;
      break;
    }
  }

  return found;
}

function php_serialize(obj)
{
  var string = '';
  var key;
  if (typeof(obj) == 'object') {
    if (obj instanceof Array) {
      string = 'a:';
      tmpstring = '';
      count = 0;
      for (key in obj) {
        tmpstring += php_serialize(key);
        tmpstring += php_serialize(obj[key]);
        count++;
      }
      string += count + ':{';
      string += tmpstring;
      string += '}';
    } else if (obj instanceof Object) {
      classname = obj.toString();

      if (classname == '[object Object]') {
        classname = 'StdClass';
      }

      string = 'O:' + classname.length + ':"' + classname + '":';
      tmpstring = '';
      count = 0;
      for (key in obj) {
        tmpstring += php_serialize(key);
        if (obj[key]) {
          tmpstring += php_serialize(obj[key]);
        } else {
          tmpstring += php_serialize('');
        }
        count++;
      }
      string += count + ':{' + tmpstring + '}';
    }
  } else {
    switch (typeof(obj)) {
      case 'number':
      if (obj - Math.floor(obj) != 0) {
        string += 'd:' + obj + ';';
      } else {
        string += 'i:' + obj + ';';
      }
      break;
      case 'string':
      string += 's:' + obj.length + ':"' + obj + '";';
      break;
      case 'boolean':
      if (obj) {
        string += 'b:1;';
      } else {
        string += 'b:0;';
      }
      break;
    }
  }

  return string;
}

function clearAjaxResults(){
  $('#handledAjax').attr('innerHTML','');
  $('#unhandledAjax').attr('innerHTML','');
}

function unserialize (data) {
  // http://kevin.vanzonneveld.net
  // +     original by: Arpad Ray (mailto:arpad@php.net)
  // +     improved by: Pedro Tainha (http://www.pedrotainha.com)
  // +     bugfixed by: dptr1988
  // +      revised by: d3x
  // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +        input by: Brett Zamir (http://brett-zamir.me)
  // +     improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +     improved by: Chris
  // +     improved by: James
  // %            note: We feel the main purpose of this function should be to ease the transport of data between php & js
  // %            note: Aiming for PHP-compatibility, we have to translate objects to arrays
  // *       example 1: unserialize('a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}');
  // *       returns 1: ['Kevin', 'van', 'Zonneveld']
  // *       example 2: unserialize('a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}');
  // *       returns 2: {firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'}

  var error = function (type, msg, filename, line){
    customHandler('['+type+']'+msg, filename, line,0);
  };
  var read_until = function (data, offset, stopchr){
    var buf = [];
    var chr = data.slice(offset, offset + 1);
    var i = 2;

    while (chr != stopchr) {
      if ((i+offset) > data.length) {
        error('Error', 'Invalid');
      }
      buf.push(chr);
      chr = data.slice(offset + (i - 1),offset + i);
      i += 1;
    }
    return [buf.length, buf.join('')];
  };
  var read_chrs = function (data, offset, length){
    var buf;

    buf = [];
    for (var i = 0;i < length;i++){
      var chr = data.slice(offset + (i - 1),offset + i);
      buf.push(chr);
    }
    ;
    return [buf.length, buf.join('')];
  };
  var _unserialize = function (data, offset){
    var readdata;
    var readData;
    var chrs = 0;
    var ccount;
    var stringlength;
    var keyandchrs;
    var keys;

    if (!offset) {offset = 0;}
    var dtype = (data.slice(offset, offset + 1)).toLowerCase();

    var dataoffset = offset + 2;
    var typeconvert = new Function('x', 'return x');

    switch (dtype){
      case 'i':
      typeconvert = function (x) {return parseInt(x, 10);};
      readData = read_until(data, dataoffset, ';');
      chrs = readData[0];
      readdata = readData[1];
      dataoffset += chrs + 1;
      break;
      case 'b':
      typeconvert = function (x) {return parseInt(x, 10) !== 0;};
      readData = read_until(data, dataoffset, ';');
      chrs = readData[0];
      readdata = readData[1];
      dataoffset += chrs + 1;
      break;
      case 'd':
      typeconvert = function (x) {return parseFloat(x);};
      readData = read_until(data, dataoffset, ';');
      chrs = readData[0];
      readdata = readData[1];
      dataoffset += chrs + 1;
      break;
      case 'n':
      readdata = null;
      break;
      case 's':
      ccount = read_until(data, dataoffset, ':');
      chrs = ccount[0];
      stringlength = ccount[1];
      dataoffset += chrs + 2;

      readData = read_chrs(data, dataoffset+1, parseInt(stringlength, 10));
      chrs = readData[0];
      readdata = readData[1];
      dataoffset += chrs + 2;
      if (chrs != parseInt(stringlength, 10) && chrs != readdata.length){
        error('SyntaxError', 'String length mismatch');
      }
      break;
      case 'a':
      readdata = {};

      keyandchrs = read_until(data, dataoffset, ':');
      chrs = keyandchrs[0];
      keys = keyandchrs[1];
      dataoffset += chrs + 2;

      for (var i = 0; i < parseInt(keys, 10); i++){
        var kprops = _unserialize(data, dataoffset);
        var kchrs = kprops[1];
        var key = kprops[2];
        dataoffset += kchrs;

        var vprops = _unserialize(data, dataoffset);
        var vchrs = vprops[1];
        var value = vprops[2];
        dataoffset += vchrs;

        readdata[key] = value;
      }

      dataoffset += 1;
      break;
      default:
      error('SyntaxError', 'Unknown / Unhandled data type(s): ' + dtype);
      break;
    }
    return [dtype, dataoffset - offset, typeconvert(readdata)];
  };

  return _unserialize((data+''), 0)[2];
}

function sleep (seconds) {
  // http://kevin.vanzonneveld.net
  // +   original by: Christian Doebler
  // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
  // %          note: For study purposes. Current implementation could lock up the user's browser.
  // %          note: Consider using setTimeout() instead.
  // *     example 1: sleep(1);
  // *     returns 1: 0

  var start = new Date().getTime();
  while (new Date() < start + seconds*1000) {}
  return 0;
}


function simpleTreeCheck(id, me)
{
  //selected = window.Trees['_'+id].getFirstSelected();
  selected = me;
  $('#'+id).val(me);
}
function trace(tar, prefix, lvl){
  if (prefix==undefined){
    prefix = '';
  }
  if (lvl==undefined){
    lvl = 0;
  }
  if (lvl<3){
    var s = '';
    if (typeof(tar)=='object'){
      s += 'Object\n';
      for (var i in tar){
        s += prefix+i+'='+trace(tar[i],prefix+'  ',lvl+1)+'\n';
      }
      return s;
    }else if (typeof(tar)=='boolean'){
      return prefix+typeof(tar)+' '+(tar?'true':'false')+'\n';
    }else if (typeof(tar)!='function'){
      return prefix+typeof(tar)+' '+tar+'\n';
    }else{
      return '';
    }
  }else{
    return 'break by recurion\n';
  }
}


function onlyNumber(evt)
{
  evt = (evt) ? evt : ((window.event) ? event : null);
  var obj = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
  var key = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);

  var str = new String;
  not_zero = 0;
  //Разрешаем использование стрелок клавиатуры
  if ((key==null) || (key==37) || (key==38) || (key==39) || (key==40)
  || key==8				//Разрешаем использование клавиши "Backspace"
  || key==35 || key==36 || ((key==44) && (obj.value.indexOf('.')==-1) && (obj.value.indexOf(',')==-1)) || ((key==46) && (obj.value.indexOf('.')==-1) && (obj.value.indexOf(',')==-1))) 	//Разрешаем использование клавиш "Home", "End"
  {
    return true;
  }
  if (!(key>47 && key<58))
  {
    return false;
  }
  for (i=0;i<obj.value.length;i++) //Перебираем все символы в строке ввода:
  {
    var c = obj.value.charAt(i); 			//Текущий символ
    if(('0123456789,.-').indexOf(c) > -1) 	//Если текущий символ входит в указанной множество, то его добавляем во временную строку
    {
      if (c!='0') not_zero = 1; 		//Если текущий символ не ноль, помечаем, что в инпуте не ноль. Это важно, т.к. числа не могут начинаться с нуля (если это не десятичная дробь)
      if (
      (c!='0') || 					//Если текущий символ не ноль
      ((c=='0') && (not_zero==1)) 	//или ноль, но не единственный в инпуте, а в составе числа
      )
      str += c; 						//Добавляем символ во временную строку
    }
  }
  obj.value = str; //Помещаем в инпут полученную строку
  return true;
}

function lockScreen(){
  $t = $('div#locker');
  if ($t.length==0){
    $('body').append('<div id="locker"><div class="lock-bg"></div><div class="lock-counter">00:00</div><div class="lock-exit" onclick="unlockScreen();"></div></div>');
    $t = $('div#locker');
  }
  FE.level++;
  $t.css({'z-index':FE.level});
  $t.show();

  window.lockInt = setTimeout('updTimer()',1000);
  FE.handleEvent('lockScreen');
}
function unlockScreen(){
  $('div#locker').hide();
  clearInterval(window.lockInt);
  $('div#locker div.lock-counter').html('00:00');
  FE.handleEvent('unlockScreen');
}
function updTimer(){
  FE.handleEvent('lockScreenTimer');
  window.lockInt = setTimeout('updTimer()',1000);
  cur = $('div#locker div.lock-counter').html().split(':');
  sec = cur[1];
  min = cur[0];
  sec++;
  min = min-0;
  if (sec>59){
    min++;
    sec ='00';
  }
  if (sec<10){
    sec = '0'+sec;
  }
  if (min<10){
    min = '0'+min;
  }
  $('div#locker div.lock-counter').html(min+':'+sec);

}

function getDivContent(el){
  var s = '';

  if (el[0]!=undefined)
  {
    if (el[0].length==undefined)
    {
      var $el = el.find('input:enabled, input:hidden');
    }
    else
    {
      var $el = $('#'+ el + ' input:enabled, #'+ el + ' input:hidden');
    }
  }
  else
  {
    if (el!=undefined) var $el = $('#'+ el + ' input:enabled, #'+ el + ' input:hidden');
  }

  if ($el.length)
  {
    $el.each(function(){
      //$(this).attr('type')
      if ($(this).attr('id')!='' || $(this).attr('name')!='' || $(this).val()!=''){
        if ($(this).attr('type')=='checkbox'){
          if ($(this).attr('checked'))
          s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
        }
        else if ($(this).attr('type')=='radio'){
          if ($(this).attr('checked'))
          s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
        }
        else
        s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
      }
    }
    );

    $('#'+ el + ' textarea').each(function(){
      s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
    }
    );
    $('#'+ el + ' select').each(function(){
      s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
    }
    );
  }

  /*
  if (el[0]!=undefined)
  {
  var $el = el.find('input:hidden');
  }
  else
  {
  if (el!=undefined) var $el = $('#'+ el + ' input:hidden');
  }

  if ($el.length)
  {

  $el.each(function(){
  //$(this).attr('type')
  if ($(this).attr('id')!='' || $(this).attr('name')!='' || $(this).val()!=''){
  if ($(this).attr('type')=='checkbox'){
  if ($(this).attr('checked'))
  s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
  }
  else if ($(this).attr('type')=='radio'){
  if ($(this).attr('checked'))
  s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
  }
  else
  s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
  }
  }
  );

  $('#'+ el + ' textarea').each(function(){
  s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
  }
  );
  $('#'+ el + ' select').each(function(){
  s = s + '&' + $(this).attr('name') +'=' + escapeRus($(this).val());
  }
  );
  }*/
  return s;
}

function number_format( number, decimals, dec_point, thousands_sep ) {
  // http://kevin.vanzonneveld.net
  // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
  // +     bugfix by: Michael White (http://crestidg.com)
  // +     bugfix by: Benjamin Lupton
  // +     bugfix by: Allan Jensen (http://www.winternet.no)
  // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
  // *     example 1: number_format(1234.5678, 2, '.', '');
  // *     returns 1: 1234.57
  var decimals = decimals==undefined || isNaN(decimals)?'false':decimals;
  var d = dec_point == undefined ? "." : dec_point;
  var n = number, c = isNaN(decimals = Math.abs(decimals)) ? ((number+'').indexOf(d)==-1?0:((number+'').substr((number+'').indexOf(d)+1)-0+'').length) : decimals;
  var dec = (number+'').substr((number+'').indexOf(d)+1);
  var nn  = number;
  var t = thousands_sep == undefined ? " " : thousands_sep, s = n < 0 ? "-" : "";
  var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;

  return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}

htmlspecialchars = function(str) {
    var elem = document.createElement("div");
    elem.innerText = elem.textContent = str;
    var res = elem.innerHTML;
    elem = null;
    return res;
};
htmlspecialchars_decode = function(str){
    var elem = document.createElement("div");
    elem.innerText = elem.innerHTML = str;
    var res = elem.textContent;
    elem = null;
    return res;
};

var timing = new Array();

function startTiming(label){
  var a = new Date();
  timing[label] = a.getTime();
}

function stopTiming(label){
  var a = new Date();
  timing[label] = (a.getTime()-timing[label])/1000;
}

function showTiming(label){
  if (label!=undefined){
    $('#debugTiming table').append('<tr class="js"><td>'+label+'</td><td>'+timing[label]+'</td></tr>');
  }else{
    $('#debugTiming table tr.js').remove();
    for (var label in timing){
      $('#debugTiming table').append('<tr class="js"><td>JS:'+label+'</td><td>'+timing[label]+'</td></tr>');
    }
  }
}