function show_object(obj_id) {
	var obj =  document.getElementById(obj_id);
	if (!obj) return;
	if ( obj.style.display == 'block' )
		obj.style.display = 'none';
	else
		obj.style.display = 'block';
}

function toggleClassName(id, className, b) {
	var n = document.getElementById(id),
	reg = new RegExp('(?:\\s|^)'+className+'(\\s|$)');
	if (!n) return;
	if (b) {
		n.className = n.className.replace(reg,'$1')
	} else if (!reg.test(n.className)) {
		 n.className += ' '+className
	}
}

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

//создаем объект - название фреймворка, если его еще нет.
if (typeof GA == 'undefined') {
  GA = {}
}

/**
 * Конструктор_объекта, следящего_за_событием_в_узле_документа_оперделенного_класа_стиля.
 * @param {String} eventType
 * @param {String} nodeClassName класс_стиля_у_наблюдаемого_узла.
 * @param {String} onInMethodName optional название_метода, вызываемого_когда_событие_произошло_внутри_наблюдаемого_узла.
 * @param {String} onOutMethodName optional название_метода, вызываемого_когда_событие_произошло_вне_наблюдаемого_узла.
 */
GA.eventWatcherClass = function(eventType, nodeClassName, onInMethodName, onOutMethodName) {
  //если нет параметров выходим.
  if (!eventType || !nodeClassName) return;
  var s = '(?:\\s|^)'+nodeClassName+'(?:\\s|$)',
  temp = this.eventWatcherParams = {
    'type': eventType,
    'classReg': new RegExp(s)
  };
  if (typeof temp.classReg.compile != 'undefined') {
    temp.classReg.compile(s)
  }
  onInMethodName && (temp.onIn = onInMethodName);
  onOutMethodName && (temp.onOut = onOutMethodName);
  this.methodIntoEventProcessing('eventProcessing', eventType, document)
}

/**
 * Запускает_метод_обработки_события, произошедшего_внутри_узла_заданного_класа,
 * или_метод_обработки_события_снаружи.
 * @param {Object} oNode текщий_узел_среагировавший_на_событие.
 * @return {Boolean} false предотвращает_стандартную_обработку_события.
 */
GA.eventWatcherClass.prototype.eventProcessing = function(oNode, documentPosition) {
  var initialNode = oNode;
  do {
    if (this.eventWatcherParams.classReg.test(oNode.className)) {
      // событие произошло на узле с заданным классом.
      return this.eventWatcherParams.onIn ? 
        this[this.eventWatcherParams.onIn](oNode, documentPosition):
        null
    }
  } while (oNode = oNode.parentNode);
  // событие произошло вне узла с заданным классом.
  return this.eventWatcherParams.onOut?
    this[this.eventWatcherParams.onOut](initialNode, documentPosition):
    null
}
/**
 * При_событии_sEvent, на_объетке(Node), выполняет_метод_класса(methodName).
 * Передавая_в_параметрах_объект, на_котором_произошло_событие.
 * Если_метод_возвратит_false предотвращает_стандартную_обработку_событияю.
 * @param {String} methodName
 * @param {String} sEvent
 * @param {Object} oNode
 */
GA.eventWatcherClass.prototype.methodIntoEventProcessing = document.addEventListener ?
function(methodName, sEvent, oNode) {
  oNode.addEventListener(
    sEvent,
    (
      function(obj, methodName) {
        return function(e) {
          obj[methodName](e.target, {'x': e.pageX, 'y': e.pageY}) === false && e.preventDefault()
        }
      }
    )(this, methodName),
    false
  )
}:
function(methodName, sEvent, oNode) {
  oNode.attachEvent(
    'on'+sEvent,
    (
      function(obj, methodName) {
        return function() {
          var e = window.event;
          obj[methodName](
            e.srcElement,
            {
              'x': e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft ,
              'y': e.clientY + document.body.scrollTop + document.documentElement.scrollTop
            }
          ) === false && (e.returnValue = false)
        }
      }
    )(this, methodName)
  )
};


//заменяем стандартный показ атрибутов title, в элементах с классом стиля 'customTooltip', на кастомный.

( function() {
    var customTooltip = {
    	'oTooltip': document.createElement('DIV'),
    	'OwnerNode': {}
    };
    customTooltip.eventWatcher = new GA.eventWatcherClass('mouseover', 'customTooltip', 'onOver', 'onOut');
    customTooltip.oTooltip.style.position = 'absolute';
    customTooltip.oTooltip.className = 'customTooltipBock';
    customTooltip.eventWatcher.onOver = function(oNode, pos) {
      if (typeof oNode.customTooltip == 'undefined') {
        oNode.customTooltip = oNode.title;
        if (oNode.title == oNode.alt) oNode.alt='';
        oNode.title = '';
      }
      if (customTooltip.OwnerNode != oNode) {
        customTooltip.OwnerNode = oNode;
        customTooltip.oTooltip.innerHTML = oNode.customTooltip;
        document.body.appendChild(customTooltip.oTooltip)
      }
      customTooltip.oTooltip.style.left = (pos.x)+'px';
      customTooltip.oTooltip.style.top = (pos.y)+'px';
    }
    customTooltip.eventWatcher.onOut = function(oNode) {
      if (
        !customTooltip.oTooltip.parentNode ||
        customTooltip.oTooltip.parentNode.nodeType != 1 ||
        oNode == customTooltip.oTooltip
      ) return;
      customTooltip.oTooltip = document.body.removeChild(customTooltip.oTooltip);
      customTooltip.OwnerNode = {};
    }
})();


/**
 * Класс, для_проверки_значений_в_полях_формы.
 * @classDescription 
 * @param {String} formID - id формы, в_которой_будут_проверяться_поля.
 * @param {Object} oElemetsRegExp - хеш_ключ_которого-имя_елемента, значение-проверочное_регулярное_выражение.
 * @param {String} errorClass - класс_стиля, добавлемый_полю_ввода, когда_он_имеет_недопустимое_значение.
 */
GA.validateClass = function(formID, oElemetsRegExp, errorClass){
  var s = '(?:\\s|^)'+errorClass+'(\\s|$)';
  this.oElemetsRegExp = oElemetsRegExp;
  this.errorClass = errorClass;
  this.regExpErrClass = new RegExp(s);
  if (typeof this.regExpErrClass.compile != 'undefined') {
    this.regExpErrClass.compile(s)
  }
  //вызывает метод как только в дереве документа появиться елемент с указанным id
  (
    function(id, obj, methodName) {
      var n = 60,
      closureFunc = function() {
        var o = document.getElementById(id);
        if (o) {
          obj[methodName](o)
        } else if (n--) {
          window.setTimeout(closureFunc, 250)
        }
      };
      closureFunc()
    }
  )(formID, this, 'onPresentID')
}
/*
 * шатает, переданный_в_аргументе_HTMLElement.
 */
GA.validateClass.prototype.shake = function(node) {
  var n = 6;
  //node.style.position = 'relative';
  (
    function closureFunc() {
      if (--n) {
        if (n % 2) {
          node.style.left = '-1px'
        } else {
          node.style.left = '1px'
        }
        window.setTimeout(closureFunc, 100 / (n+1))
      } else {
        node.style.left = '';
      }
    }
  )()
}
/**
 * При_событии_sEvent, на_объетке_Node, выполняет_метод_methodName.
 * Передавая_в_параметрах_объект, на_котором_произошло_событие.
 * Если_метод_возвратит_false приостанавливается_выполнение_обработки_события_по_умолчанию.
 * @param {String} sEvent
 * @param {String} methodName
 * @param {Object} Node
 */
GA.validateClass.prototype.attachEventToMethod = GA.eventWatcherClass.prototype.methodIntoEventProcessing;

/**
 * Если_событие_произошло_на_одном_из_проверяемых_полях,
 * меняет_наличие_класса_ошибочного_заполнения.
 * @param {Object} node
 */
GA.validateClass.prototype.toggleErrorClass = function(node) {
  var o = this.oElemetsRegExp[node.getAttribute('name')] || false;
  if (
    typeof node.value == 'undefined' ||
    !o
  ) return true;
  if (node.value === '' || o[0].test(node.value)) {
    node.className = node.className.replace(this.regExpErrClass, '$1')
  } else if (!this.regExpErrClass.test(node.className)) {
    node.className += ' '+this.errorClass;
    this.shake(node)
  }
  return true
}

/**
 * Проверяет_поля, при_отправке_формы.
 * Выволит_алерт, на_первом_ошибочном_поле_и_передает_ему_фокус.
 * @param {Object} node
 */
GA.validateClass.prototype.onSubmit = function(node) {
  var i, o = this.oElemetsRegExp;
  if (node.nodeName != 'FORM') return true;
  for (i in o) {
    if (!o[i][0].test(node[i].value)){
      this.regExpErrClass.test(node[i].className) || (
        node[i].className += ' '+this.errorClass
      );
      node[i].focus();
      node[i].select();
      this.shake(node[i]);
      alert(o[i][1]);
      return false
    }
  }
  return true
}

/**
 * метод, подключающий_к_событиям_обработчики, проверяющие_значения_в_полях_ввода.
 * @param {Object} f - объект_формы.
 */
GA.validateClass.prototype.onPresentID = function(f) {
  var i, o = {
    'change': 'toggleErrorClass',
    'click': 'toggleErrorClass',
    'keyup': 'toggleErrorClass',
    'submit': 'onSubmit'
  }
  if (this.attachEventToMethod)
  for (i in o) {
    this.attachEventToMethod(o[i], i, f)
  }
};
