/* карта метро */

/**
 * Показывает карту метро.
 * data - данные карты.
 * data_sel - данные айди селектов.
 */
function mapMetro(data, data_sel) {
  if (js_load) {
    checkMapMetro(data_sel.id_select_right, data_sel.id_select_left);
    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';
    var f_param = {
      name: '_mapMetroStep2',
      id_container: data.id_container,
      id_map: data.id_map,
      func_name: data.func_name
    };
    var dOp = 10;
    var beginOp = 1;
    var finishOp = 50;
    var interTime = 1;
    var t = 'mapMetroWindow';
    opacityVisible(fg, dOp, beginOp, finishOp, interTime, t, f_param);
  }
}

function _mapMetroStep2(data) {
  var map = gebi(data.id_map);
  map.style.display = 'block';
  centeringElementWindow(map);
  var map_pos = getPos(map);
  var margin_top =  map_pos.top < 10 ? 60 : 0;
  setTop(map, margin_top + map_pos.top);
  gebi('fg').onclick = function(){closeMetroMap(data);};
}

/**
 * Закрывает карту.
 */
function closeMetroMap(data) {
  var map = gebi(data.id_map);
  var f_param = {
    name: '_closeMetroMapStep2',
    id_container: data.id_container,
    id_map: data.id_map
  };
  var dOp = -10;
  var beginOp = 50;
  var finishOp = 1;
  var interTime = 1;
  var t = 'mapMetroWindow';
  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 _closeMetroMapStep2(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"));
  }
}

/**
 * Подчёркивает текст названия станции на схеме.
 * in_id - айди названия метро на схеме.
 * in_bool - true - подчёркиваем название, false - убираем подчёркивание.
 */
function onMouseMetro(in_id, in_bool) {
  gebi(in_id).style.borderBottom = (in_bool == true) ? '1px solid black' : 'none';
}

/**
 * Запрос на новую карту метро.
 */
function getMapMetro(url_data) {
  var url = url_data.url;
  var data = url_data.data;
  request['request_map_metro'] = createRequest();
  request['request_map_metro'].onreadystatechange = function() {updateMapMetro(request['request_map_metro'], url_data);};
  sendRequest(request['request_map_metro'], url, data);
}

/**
 * Обновляет карту метро.
 */
function updateMapMetro(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);
  }
}

/**
 * Добавляет в селект метро из другого селекта для расширенного поиска.
 * @param in_id1 (string): айди селекта, из которого необходимо перенести метро.
 * @param in_id2 (string): айди селекта, в который необходимо перенести метро. 
 */
function changeMetroSelect(in_id1, in_id2) {
  if (!gebi(in_id1)) return;
  if (gebi(in_id1).selectedIndex == -1 || gebi(in_id1).options.length == 0) return;
  // Выделенная опция.
  var opt = gebi(in_id1).options[gebi(in_id1).selectedIndex];
  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) {
        // Делаем вставку.
        _mergeSortMetro(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 resetSelectMetro(data) {
  for (var i = 0; i < gebi(data.id_select_right).options.length; i++) gebi(data.id_select_right).options[i].selected = true; 
  changeMetroSelect(data.id_select_right, data.id_select_left);
}

/**
 * Добавляет или убирает из списка метро, которые принадлежат выбранной станции на карте.
 * @param in_id (string): код выбранного метро на карте.
 */
function switchMetroMap(in_id, data) {
  // Убираем выделение с метро в левом селекте.
  if (gebi(data.id_select_left).selectedIndex != -1) {
    gebi(data.id_select_left).options[gebi(data.id_select_left).selectedIndex].selected = false;
  }
  // Показываем или гасим выбранное метро на карте.
  var src = gebi('metro' + in_id).src;
  var src2 = src;
  src = src.substr(src.length - 9);
  var reg = new RegExp(gebi('src_pixel').value, 'g');
  if (reg.test(src2)) {
    gebi('metro' + in_id).src = gebi('src_blinkcircle').value;
    var id_sel_from = data.id_select_left;
    var id_sel_in = data.id_select_right;
  } else {
    gebi('metro' + in_id).src = gebi('src_pixel').value;
    var id_sel_from = data.id_select_right;
    var id_sel_in = data.id_select_left;
  }
  for (var i = 0; i < gebi(id_sel_from).options.length; i++) {
    if (gebi(id_sel_from).options[i].value == in_id) {
      gebi(id_sel_from).options[i].selected = true;
    }
  }
  changeMetroSelect(id_sel_from, id_sel_in);
}

/**
 * Отмечает метро на карте, которые есть в переданном селекте.
 * @param in_id_sel (string): айди селекта, который проверяется на наличие в нём метро.
 */
function checkMapMetro(in_id_sel, in_id_sel1) {
  for (var i = 0; i < gebi(in_id_sel).options.length; i++) {
    var opt = gebi(in_id_sel).options[i];
    var src = gebi('metro' + opt.value).src;
    var src2 = src;
    src = src.substr(src.length - 9);
    // Выделяем метро на карте.
    var reg = new RegExp(gebi('src_pixel').value, 'g');
    if (reg.test(src2)) gebi('metro' + opt.value).src = gebi('src_blinkcircle').value;
  }
  for (var i = 0; i < gebi(in_id_sel1).options.length; i++) {
    var opt = gebi(in_id_sel1).options[i];
    if (gebi('metro' + opt.value)) {
      var src = gebi('metro' + opt.value).src;
      var src2 = src;
      src = src.substr(src.length - 9);
      // Гасим метро на карте.
      var reg = new RegExp(gebi('src_blinkcircle').value, 'g');
      if (reg.test(src2)) gebi('metro' + opt.value).src = gebi('src_pixel').value;
    }
  }
}

/**
 * Сортировка метро вставкой.
 * @param in_array(array): массив опций, в который необходимо вставить переданную опцию с метро.
 * @param in_opt(object): опция с метро, которую необходимо вставить в список.
 */
function _mergeSortMetro(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;
    //alert([l,r,m,ox_text]);
    do {
      while (ox_text > o.text && r != l) {
        //alert('1: сравниваемый - '+ox_text+', вставляемый - '+o.text+', л - '+l+', п - '+r+', с - '+m);
        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) {
        //alert('2: сравниваемый - '+ox_text+', вставляемый - '+o.text+', л - '+l+', п - '+r+', с - '+m);
        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);
  //alert(x);
  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;
      //alert(i + 1 + ' - ' + arr[i + 1].text);
    }
    arr[x].text = o.text;
    arr[x].value = o.value;
    arr[x].id = o.id;
    //alert(arr[x].text + ' done!');
  }
}

function _changeTopTextSearch() {
  changeTopTextSearch();
}
