function imUpdateIcon(json, icon, active_icon_src, handler)
{
  if($(icon).src != active_icon_src && json.count_new_messages > 0)
  {
    $(icon).src = active_icon_src;
    handler.stop();
  }
}

//сравнение производится через match, т.к. $(icon).src включает информацию о протоколе, домене, порте, а need_src - нет...
function rcUpdateIcon(json, icon, icon_src_list, icon_right, icon_src_list_right)
{
  var need_src = '';
  var need_src_right = '';
  var ptr = json.count_new_recommends;
  var ptr_def = 'default';
  if(icon_src_list[ptr])
  {
    need_src = icon_src_list[ptr];
    need_src_right = icon_src_list_right[ptr];
  }
  else
  {
    need_src = icon_src_list[ptr_def];
    need_src_right = icon_src_list_right[ptr_def];
  }
  if($(icon).src.match(need_src) == null)
  {
    $(icon).src = need_src;
  }
  if($(icon_right))
  {
    if($(icon_right).src.match(need_src_right) == null)
    {
      $(icon_right).src = need_src_right;
    }
  }
  
}

function touchResponse(response_id)
{
  Element.hide('response_ref_' + response_id);
  Element.show('response_full_' + response_id);
}

function toggleGroupNode(raw_id)
{
  Element.toggle(raw_id);
  Element.toggle(raw_id + 'Pic_0');
  Element.toggle(raw_id + 'Pic_1');
}

function flashPic(raw_id)
{
  $(raw_id + 'Pic_0').src = image_act0;
  $(raw_id + 'Pic_1').src = image_act1;
}

isCountIS = 0;
function check_text_length(lengthBoard, object, length)
{
  M = object.value.length;
  var overRun = M - length;
  if (overRun <= 0)
  {
    lastValue = object.value;
  }
  else
  {
    object.value = lastValue;
    M = object.value.length;
  }
  lengthBoard.value = length-M;
  if (isCountIS == 0 && lengthBoard.value <= 0)
  {
    isCountIS = 1;
    alert("Максимальное количество символов - " + length);
  }
  else
  {
    isCountIS = 0;
  }
}

function sync_select() { };

sync_select.prototype.sync = function()
{
  for (var i = 0; i < arguments.length - 1; i++)
  {
    $(arguments[i]).onchange = (function (o,id1,id2) { return function(){ o._sync(id1, id2); }; })( this, arguments[i], arguments[i+1]);
  }
  $(arguments[0]).onchange();
};

sync_select.prototype._sync = function (master_id, slave_id)
{
  var master = document.getElementById(master_id);
  var slave = document.getElementById(slave_id);
  var data_list = this.dataList;
  var selected_value = slave.value;
  slave.length = 0;
  if (master.length > 0)
  {
    var master_value = master.options[ master.selectedIndex == -1 ? 0 : master.selectedIndex].value;
    var _options = data_list[master_value];
    for (var i in _options || null)
    {
      if(isNaN(_options[i].value))
      {
        continue;
      }
      var _option = new Option(_options[i].text, _options[i].value);
      slave.options[slave.options.length] = _option;
    }
  }
  slave.onchange && slave.onchange();
};

function fill_select(object_id, data)
{
  object = $(object_id);
  for (var i in data || null)
  {
    if(isNaN(data[i].value))
    {
      continue;
    }
    var _option = new Option(data[i].text,data[i].value);
    object.options[object.options.length] = _option;
  }
}

goodSum = 100;
/*
* Входные параметры функции:
*    quant     - количество товара
*    prise     - стоимость за единицу
*    updElemId - идентификатор элемента, в котором требуется обновить данные (по конкретному товару)
**/
function calculate(quant, prise, updElemId){
        // данное регулярное выражение проверяет, является ли введенное значение числом
    var anum = /(^\d+$)|(^\d+\.\d+$)/;
    if (!anum.test(quant)) {
        // если данные не валидны - выводим предупреждение и прерываем выполнение функции
        alert('Введенное значение не является числом!');
        return;
    }
    goodSum = quant * prise;
    document.getElementById(updElemId).innerHTML = goodSum;
}

function calculatePlateg(summ, month_quantity){
    if (!summ) {summ = 100;} 
    plateg = summ / month_quantity;
    document.getElementById('price_1st_month_inp').value = plateg;
    document.getElementById('price_2nd_month_inp').value = plateg;
    document.getElementById('price_3d_month_inp').value = summ-(2*plateg);
    document.getElementById('price_1st_month').innerHTML = plateg;
    document.getElementById('price_2nd_month').innerHTML = plateg;
    document.getElementById('price_3d_month').innerHTML = summ-(2*plateg);
}

/*
 * используется в паршиале catalog/indicator
 **/
function indicator_FixEvent(e) {
  e = e || window.event;
  if ( e.pageX == null && e.clientX != null )
  {
    var html = document.documentElement;
    var body = document.body;
    e.pageX = e.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
    e.pageY = e.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
  }
  return e;
}

/*
 * используется в паршиале catalog/indicator
 **/
function indicator_getPosition(obj) {
  var x = y = 0;
  while(obj)
  {
    x += obj.offsetLeft;
    y += obj.offsetTop;
    obj = obj.offsetParent;
  }
  return {x:x, y:y};
}

/*
 * инициализация лоадера catalog/indicator
 **/
function initIndicator() {
  var i = $("indicator");
  var i_pos = $("indicator_pos");
  if(!i || !i_pos) return;
  var elementPos = new Object();
  i.setStyle({visibility:"hidden"}).show();
  elementPos = indicator_getPosition(i_pos);
  i.hide().setStyle({visibility:"visible"});
  document.onmousemove = function(event)
  {
    event = indicator_FixEvent(event);
    i_pos.style.top = event.pageY - elementPos.y + "px";
    i_pos.style.left = event.pageX - elementPos.x + "px";
  }
}

/**
 * Запуск скриптов после инициализации дерева dom (загрузки страницы).
 */
document.observe('dom:loaded', function(){
  addPlusMinusControls();
  initIndicator();
})

/**
 * Добавление к инпутам, имеющим класс "plus_minus_input",
 * контролов плюс и минус, управляющих числом в инпуте.
 */
function addPlusMinusControls(){
  $$('.plus_minus_input').each(function(input, i){
    if(input.hasClassName('plus_minus_added')) return;
    input.addClassName('plus_minus_added');
    saveInputState(input);
    var control_minus = '<a href="javascript:void(0);" title="-" id="control-minus-' + input.identify() + '" class="input-control-minus">-</a>';
    var control_plus = '<a href="javascript:void(0);" title="+" id="control-plus-' + input.identify() + '" class="input-control-plus">+</a>';
    input.wrap('span', {'style': 'white-space:nowrap'});
    input.insert({before: control_minus}).insert({after: control_plus});
    $('control-minus-' + input.identify()).observe('click', function(){
      var input = $(this).next('input');
      if(input){
        value = parseInt(input.getValue());
        input.value = value && value > 0 ? value - 1 : 0;
        checkInputState(input);
      }
    });
    $('control-plus-' + input.identify()).observe('click', function(){
      var input = $(this).previous('input');
      if(input){
        value = parseInt(input.getValue());
        input.value = value >=0 ? value + 1 : 1;
        checkInputState(input);
      }
    });
    input.observe('change', function(){
      checkInputState($(this));
    });
  });
}

/**
 * Здесь будем хранить исходные состояния инпутов.
 */
var initial_states = new Array();

/**
 * Сохраняет состояние (value) инпута в спец. массиве.
 */
function saveInputState(input){
  initial_states[input.identify()] = input.getValue();
}

/**
 * Проверяет изменилось ли число в инпуте с момента загрузки страницы,
 * и раздает либо забирает класс 'input-changed'.
 */
function checkInputState(input){
  if(input.getValue() != initial_states[input.identify()]){
    input.addClassName('input-changed');
    return true;
  }else{
    input.removeClassName('input-changed');
    return false;
  }
}


