/* карта шоссе */

var global_id_sel_left;
var global_id_sel_right;
var global_id_option;
var global_id_chbox_all;
var global_id_chbox;
var global_id_pw;

/**
 * Показывает карту шоссе.
 * data - данные карты.
 * data_sel - данные айди селектов.
 */
function mapHighway(data, data_sel) {
  if (js_load) {
    global_id_sel_left = data_sel.id_select_left;
    global_id_sel_right = data_sel.id_select_right;
    global_id_option = data_sel.id_option;
    global_id_pw = data_sel.id_pw;
    global_id_chbox = data_sel.id_chbox;
    global_id_chbox_all = data_sel.id_chbox_all;
    checkMapHighway(data_sel);
    if (isIE6) {
      hiddenSelects();
    }
    hiddenObjects();
    var map = gebi(data.id_map);
    var fg = foreground('black');
    fg.id = "fg";
    gebtn('body')[0].appendChild(map);
    fg.style.zIndex = '100';
    map.style.zIndex = '102';
    centeringElementWindow(map);
    if (screen.height > MIN_WIDTH_SCREEN) {
      timer['сenteringMapHighway'] = setInterval(function() {centeringElementWindow(map)}, 1);
    }
    var f_param = {
      name: '_mapHighwayStep2',
      id_container: data.id_container,
      id_map: data.id_map,
      data_sel: data_sel,
      func_name: data.func_name
    };
    var dOp = 10;
    var beginOp = 1;
    var finishOp = 50;
    var interTime = 1;
    var t = 'mapHighwayWindow';
    opacityVisible(fg, dOp, beginOp, finishOp, interTime, t, f_param);
  }
}

/**
 * Второй шаг схемы шоссе - показывает схему.
 */
function _mapHighwayStep2(data) {
  var map = gebi(data.id_map);
  map.style.display = 'block';
  var data_sel = data.data_sel;
  gebi('fg').onclick = function(){closeHighwayMap(data, data_sel);};
}

/**
 * Закрывает карту.
 */
function closeHighwayMap(data, data_sel) {
  //checkMapHighway(data_sel);
 
  clearInterval(timer['сenteringMapHighway']);
  var map = gebi(data.id_map);
  var f_param = {
    name: '_closeHighwayMapStep2',
    id_container: data.id_container,
    id_map: data.id_map
  };
  var dOp = -10;
  var beginOp = 50;
  var finishOp = 1;
  var interTime = 1;
  var t = 'mapHighwayWindow';
  opacityVisible(gebi('fg'), dOp, beginOp, 1, interTime, t, f_param);
  map.style.display = 'none';
  map.style.left = '0px';
  map.style.top = '0px';
  
  if(data.func_name) {
		func[data.func_name]();
	}
}

function _closeHighwayMapStep2(data) {
  var map = gebi(data.id_map);
  if (isIE6) {
    visibleSelects();
  }
  visibleObjects();
  gebi(data.id_container).appendChild(map);
  if (gebi("fg")) {
    gebi('fg').onclick = null;  
    rn(gebi("fg"));
  }
}

/**
 * Запрос на новую карту шоссе.
 */
function getMapHighway(url_data) {
  var url = url_data.url;
  var data = url_data.data;
  request['request_map_highway'] = createRequest();
  request['request_map_highway'].onreadystatechange = function() {updateMapHighway(request['request_map_highway'], url_data);};
  sendRequest(request['request_map_highway'], url, data);
}

/**
 * Обновляет карту шоссе.
 */
function updateMapHighway(req, url_data) {
  if (req.readyState == 4) {
    if (req.status == 200) {
      var content = req.responseText;
      if (content != "error") {
        gebi(url_data.id_container).innerHTML = content;
        //gebi(url_data.id_map_link).className = "inline";
        $('#'+url_data.id_map_link).fadeIn('slow');
      }
    } else alert(gebi('err_browser').value);
  }
}

function _changeTopTextSearch() {
  changeTopTextSearch();
}

/**
 * Добавляет в селект шоссе из другого селекта для расширенного поиска.
 * in_id1 (string): айди селекта, из которого необходимо перенести шоссе.
 * in_id2 (string): айди селекта, в который необходимо перенести шоссе. 
 */
function changeHighwaySelect(in_id1, in_id2) {
  if (gebi(in_id1).selectedIndex == -1 || gebi(in_id1).options.length == 0) return;
  var i = 0;
  var option_arr = new Array;
  while (i < gebi(in_id1).options.length) {
    if (gebi(in_id1).options[i].selected == true) {
      if (gebi(in_id2).options.length > 0) {
        // Делаем вставку.
        _mergeSortHighway(gebi(in_id2).options, gebi(in_id1).options[i]);
      } else {
        // Копируем выделенную опцию.
        gebi(in_id2).options.add(new Option(gebi(in_id1).options[i].text, gebi(in_id1).options[i].value));
        gebi(in_id2).options[gebi(in_id2).options.length - 1].id = gebi(in_id1).options[i].id;
      }
      // Удаляем опцию.
      gebi(in_id1).remove(i);
    } else i++;
  }
}

/**
 * Сбрасывает селект с отобранными шоссе в расширенном поиске.
 */
function resetSelectHighway(data) {
  // Выделяем все опции в списке.
  for (var i = 0; i < gebi(data.id_select_right).options.length; i++) {
    gebi(data.id_select_right).options[i].selected = true; 
  }
  // Переносим шоссе в левый список.
  changeCitySelect(data.id_select_right, data.id_select_left);
}

/**
 * Обрабатывает клик по эмулированному чекбоксу.
 * @param in_id (string): айди чекбокса.
 */
function onclickCheckbox(in_id) {
  var reg = new RegExp('^'+global_id_chbox_all);
  if (reg.test(in_id)) {
  //if (/^search-ext-maphighway-/.test(in_id)) {
    // Перенаправление на функцию, обрабатывающую клики по чекбоксам на карте с шоссе в расширенном поиске.
    _addOrRemoveHighwayInSelect(in_id);
  }
}

/**
 * Добавляет или удаляет из правого селекта шоссе отмеченные на карте в расширенном поиске.
 * @param in_id (string): айди чекбокса.
 */
function _addOrRemoveHighwayInSelect(in_id) {
  var reg = new RegExp('^'+global_id_pw);
  if (reg.test(in_id)) {
  //if (/^search-ext-maphighway-pw/.test(in_id)) {
    var check = gebi(in_id).checked;
    var inputs = gebtn('input');
    // Перебираем все чекбоксы для выбранного направления.
    for (var i = 0; i < inputs.length; i++) {
      var reg = new RegExp(global_id_chbox);
      if (reg.test(inputs[i].id) && inputs[i].value == gebi(in_id).value) {
      //if (/search-ext-maphighway-chbox/.test(inputs[i].id) && inputs[i].value == gebi(in_id).value) {
        // Отмечаем или убираем галочку в чекбоксе для заданого направления.
        inputs[i].checked = check;
        if (gebi('img_' + inputs[i].id)) {
          // Показываем или скрыаем галочку в чекбоксе направления.
          gebi('img_' + inputs[i].id).style.visibility = (gebi(inputs[i].id).checked) ? 'visible' : 'hidden';
        }
      }
    }
    // Выделяем выбранные шоссе в соответствующем селекте и переносим в противоположный.
    _relocateSelectHighway(in_id, true);
  } else {
    // Проверяем все чекбоксы по этому же направлению и отмечаем или снимаем чекбокс
    // направления при необходимости.
    var check = _checkMapHighwayDirectAllCheckboxes(in_id);
    var id_pw = global_id_pw + gebi(in_id).value;
    if (check == 1) {
      // Отмечаем чекбокс направления.
      gebi(id_pw).checked = true;
    } else if (gebi(id_pw).checked) {
      // Отчищаем чекбокс направления.
      gebi(id_pw).checked = false;
    }
    if (gebi('img_' + id_pw)) {
      // Показываем или скрыаем галочку в чекбоксе направления.
      gebi('img_' + id_pw).style.visibility = (gebi(id_pw).checked) ? 'visible' : 'hidden';
    }
    // Выделяем выбранное шоссе в соответствующем селекте и переносим в противоположный.
    _relocateSelectHighway(in_id);
  }
}

/**
 * Проверяет все ли чекбоксы отмечены по направлению, к которму принадлежит чекбокс с переданным айди.
 * @param in_id (string): айди чекбокса.
 * @return (int): 0 - все не отмечены, 1 - все отмечены, 2 - отмечены некоторые.
 */
function _checkMapHighwayDirectAllCheckboxes(in_id) {
  var count = 0;
  var count_check = 0;
  // Массив всех элементов input.
  var inputs = gebtn('input');
  for (var i = 0; i < inputs.length; i++) {
    var reg = new RegExp(global_id_chbox);
    if (reg.test(inputs[i].id) && inputs[i].value == gebi(in_id).value) {
    //if (/search-ext-maphighway-chbox/.test(inputs[i].id) && inputs[i].value == gebi(in_id).value) {
      count++;
      count_check += (inputs[i].checked == true) ? 1 : 0;
    }
  }
  var check = (count_check > 0 && count == count_check) ? 1 : ((count_check > 0) ? 2 : 0);
  return check;
}

/**
 * Добавляет или удаляет из правого селекта шоссе отмеченные на карте в расширенном поиске.
 * @param in_id (string): айди чекбокса.
 * @param in_all (bool): true - перенести все шоссе, которые принадлежат одному направлению.
 */
function _relocateSelectHighway(in_id, in_all) {
  var id_sel_from = (gebi(in_id).checked) ? global_id_sel_left : global_id_sel_right;
  var id_sel_in = (gebi(in_id).checked) ? global_id_sel_right : global_id_sel_left;
  // Параметры чекбокса.
  var id_ch = in_id.substr(global_id_chbox.length);
  var val_ch = gebi(in_id).value;
  for (var i = 0; i < gebi(id_sel_from).options.length; i++) {
    // Параметры опции.
    var id_sel = gebi(id_sel_from).options[i].id.substr(global_id_option.length);
    var val_sel = gebi(id_sel_from).options[i].value;
    if (id_sel == id_ch || (in_all && val_sel == val_ch)) {
      // Выделяем опцию шоссе, если оно принадлежит выбранному чекбоксу на карте. 
      gebi(id_sel_from).options[i].selected = true;
    } else {
      gebi(id_sel_from).options[i].selected = false;
    }
  }
  // Переносим выделенные города в противоположный список.
  changeHighwaySelect(id_sel_from, id_sel_in);
}

/**
 * Отмечает на карте только те чекбоксы, шоссе для которых занесены в правый селект.
 * data - данные селектов.
 */
function checkMapHighway(data) {
  // Правый селект.
  gebi(data.id_select_left).multiple = true;
  var sel = gebi(data.id_select_right);
  var inputs = gebtn('input');
  var reg = new RegExp(data.id_chbox);
  for (var i = 0; i < inputs.length; i++) {
    if (reg.test(inputs[i].id)) {
      var id_ch = inputs[i].id.substr(global_id_chbox.length);
      inputs[i].checked = false;
      // Проверяем чекбокс на вхождение в правый селект.
      for (var j = 0; j < sel.options.length; j++) {
        var id_sel = sel.options[j].id.substr(global_id_option.length);
        if (id_sel == id_ch) inputs[i].checked = true;
      }
      if (gebi('img_' + inputs[i].id)) {
        // Показываем или скрываем галочку в чекбоксе.
        gebi('img_' + inputs[i].id).style.visibility = (inputs[i].checked) ? 'visible' : 'hidden';
      }
      // Проверяем все чекбоксы по этому же направлению и отмечаем или снимаем чекбокс
      // направления при необходимости.
      var check = _checkMapHighwayDirectAllCheckboxes(inputs[i].id);
      var id_pw = data.id_pw + inputs[i].value;
      if (check == 1) {
        // Отмечаем чекбокс направления.
        gebi(id_pw).checked = true;
      } else if (gebi(id_pw).checked) {
        // Отчищаем чекбокс направления.
        gebi(id_pw).checked = false;
      }
      if (gebi('img_' + id_pw)) {
        // Показываем или скрыаем галочку в чекбоксе направления.
        gebi('img_' + id_pw).style.visibility = (gebi(id_pw).checked) ? 'visible' : 'hidden';
      }
    }
  }
}

/**
 * Сортировка шоссе вставкой.
 * @param in_array(array): массив опций, в который необходимо вставить переданную опцию с шоссе.
 * @param in_opt(object): опция с шоссе, которую необходимо вставить в список.
 */
function _mergeSortHighway(in_array, in_opt) {
  var arr = in_array;
  var o = in_opt;
  var len = arr.length;
  var left = 0;
  var right = len - 1;
  function _mSort(in_l, in_r) {
    var l = in_l;
    var r = in_r;
    var m = Math.ceil((l + r) / 2);
    ox_text = arr[m].text;
    ox_value = arr[m].value;
    ox_id = arr[m].id;
    do {
      while (ox_text > o.text && r != l) {
        r = m;
        m = Math.floor((l + r) / 2); 
        ox_text = arr[m].text;
        ox_value = arr[m].value;
        ox_id = arr[m].id;
      }
      while (ox_text < o.text && r != l) {
        l = m;
        m = Math.ceil((l + r) / 2);
        ox_text = arr[m].text;
        ox_value = arr[m].value;
        ox_id = arr[m].id;
      }
    } while (r - l > 1);
    if (arr[l].text > o.text) r = l;
    return r;
  }
  var x = _mSort(left, right);
  arr[len] = new Option('', '');
  arr[len].text = o.text;
  arr[len].value = o.value;
  arr[len].id = o.id;
  if (len == 1) {
    if (arr[0].text < o.text) {
      arr[len].text = o.text;
      arr[len].value = o.value;
      arr[len].id = o.id;
    } else {
      arr[len].text = arr[0].text;
      arr[len].value = arr[0].value;
      arr[len].id = arr[0].id;
      arr[0].text = o.text;
      arr[0].value = o.value;
      arr[0].id = o.id;
    }
  } else if (arr[x].text > o.text) {
    for (var i = len - 1; i >= x; i--) {
      arr[i + 1].text = arr[i].text;
      arr[i + 1].value = arr[i].value;
      arr[i + 1].id = arr[i].id;
    }
    arr[x].text = o.text;
    arr[x].value = o.value;
    arr[x].id = o.id;
  }
}

