// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults
function parse_terms_ja(event) {
  var src_element = Event.element(event);
  switch (src_element.tagName.toLowerCase()) {
    case "textarea":
      return;
    default:
      ;
  }
  var parse_str = prepare_parse_string(src_element.innerHTML);
  new Ajax.Updater(src_element, "/terms_parsing_ja/parse_terms", {asynchronous:true, evalScripts:true, parameters:"parse_str="+parse_str});
}

function parse_terms_en(event) {
  var src_element = Event.element(event);
  
  switch (src_element.tagName.toLowerCase()) {
    case "textarea":
      return;
    default:
      ;
  }
  var parse_str = prepare_parse_string(src_element.innerHTML);
  new Ajax.Updater(src_element, "/terms_parsing_en/parse_terms", {asynchronous:true, evalScripts:true, parameters:"parse_str="+parse_str});
}

function prepare_parse_string(str) {
  var parse_str = str.replace(/\=/g, "%3D");
  parse_str = parse_str.replace(/#/g, "%23");
  parse_str = parse_str.replace(/\?/g, "%3F");
  parse_str = parse_str.replace(/&nbsp;/g, "%20");
  parse_str = parse_str.replace(/&amp;/g, "%26");
  return parse_str;
}

function prepare_overlap_div() {
  var overlap_div = document.createElement("div");
  overlap_div.id = "overlap_div";
  overlap_div.style.overflow = "auto";
  overlap_div.style.position = "absolute";
  overlap_div.style.top = "0px";
  overlap_div.style.left = "0px";
  document.body.appendChild(overlap_div);
}

function display_line_all(element) {
  if (!element.tagName.toLowerCase() == "div") {
    return;
  }
  var overlap_div = $("overlap_div");
  if (!overlap_div) {
    return;
  }
  if (overlap_div.style.top.toLowerCase() != "0px" || overlap_div.style.left.toLowerCase() != "0px") {
    display_line_only_visible();
  }
  em_position = Position.cumulativeOffset(element);
  overlap_div.className = element.className;
  overlap_div.innerHTML = element.innerHTML;
  overlap_div.original_element = element;
  overlap_div.onmouseout = function() {
    display_line_only_visible(overlap_div);
  }
  element.innerHTML = "";
  if (!document.all) {
    // FireFox対策
    overlap_div.style.top = em_position[1] + "px";
    overlap_div.style.left = em_position[0] + "px";
  } else {
    // IE対策
    overlap_div.style.top = em_position[1] + 2 + "px";
    overlap_div.style.left = em_position[0] + 2 + "px";
  }
  //element.style.overflow = "visible";
}

function display_line_only_visible() {
  var overlap_div = $("overlap_div");
  if (!overlap_div || !overlap_div.original_element) {
    return;
  }
  overlap_div.original_element.innerHTML = overlap_div.innerHTML;
  overlap_div.style.top = "0px";
  overlap_div.style.left = "0px";
  //element.style.overflow = "hidden";
}

function prepare_dragging_object() {
  var dragging_object = document.createElement("div");
  dragging_object.id = "dragging_object";
  dragging_object.className = "dragging_object";
  document.body.appendChild(dragging_object);
}

function show_api(event) {
  if (!$("dragging_object")) {
    return;
  }
  var src_element = Event.element(event);
  if (src_element.className != "search_result" ) {
    return;
  }

  
//  var item_info = src_element.innerHTML.split(" ");
  var api_id = parseInt(src_element.id.split("api_")[1]);
  var item_title = src_element.innerHTML;
//  for (var i = 0; i < item_info.length; i++) {
//    if (api_id > 0) {
//      item_title += item_info[i];
//      if (i != item_info.length - 1) {
//        item_title += " ";
//      }
//    } else {
//      api_id = parseInt(item_info[i], 10);
//    }
//  }
  
  if (event.type == "dblclick") {
    if (event.button != 2) {  var position = "left"; }
    else { var position = "right"; return false; }
//    new Ajax.Updater(position + "_api", "/search/api_info", {asynchronous:true, evalScripts:true, parameters:"position=" + position + "&id=" + api_id})
    display_api_info(position, api_id);
  } else if (event.type == "mousedown") {
    drag_api(event, api_id, item_title);
  } 
}

function show_api_from_arrow(src_element) {

  // var src_element = Event.element(event);
  var api_id = parseInt(src_element.id.split("api_")[1]);
  if (src_element.className == "arrow_left"){
      var position = "left";
  } else {
      var position = "right";
  }
  display_api_info(position, api_id);

}

function show_api_from_arrow_en(src_element) {

  // var src_element = Event.element(event);
  var api_id = parseInt(src_element.id.split("api_")[1]);
  if (src_element.className == "arrow_left"){
      var position = "left";
  } else {
      var position = "right";
  }
  display_api_info_en(position, api_id);

}

function drag_api(event, api_id, item_title) {
  var item_title_display = "<<画面下部のAPI情報欄のどちらかにDrop>>　" + item_title;
  Event.observe(document, "mousemove", move_api, false);
  Event.observe(document, "mouseup", drop_api_and_display, false);
  var mouse_position = get_mouse_position(event);
  $("dragging_object").style.display = "none";
  $("dragging_object").style.color = "darkgreen";
  $("dragging_object").api_id = api_id;
  $("dragging_object").appendChild(document.createTextNode(item_title_display));
}

function show_api_en(event) {
  if (!$("dragging_object")) {
    return;
  }
  var src_element = Event.element(event);
  if (src_element.className != "search_result") {
    return;
  }
  
//  var item_info = src_element.innerHTML.split(" ");
  var api_id = parseInt(src_element.id.split("api_")[1]);
  var item_title = src_element.innerHTML;
//  for (var i = 0; i < item_info.length; i++) {
//    if (api_id > 0) {
//      item_title += item_info[i];
//      if (i != item_info.length - 1) {
//        item_title += " ";
//      }
//    } else {
//      api_id = parseInt(item_info[i], 10);
//    }
//  }
  
  if (event.type == "dblclick") {
    var position = "left";
//    new Ajax.Updater(position + "_api", "/search/api_info", {asynchronous:true, evalScripts:true, parameters:"position=" + position + "&id=" + api_id})
    display_api_info_en(position, api_id);
  } else if (event.type == "mousedown") {
    drag_api_en(event, api_id, item_title)
  }
}

function drag_api_en(event, api_id, item_title) {
  var item_title_display = "<<Drop into either box below>>　" + item_title;
  Event.observe(document, "mousemove", move_api, false);
  Event.observe(document, "mouseup", drop_api_and_display_en, false);
  var mouse_position = get_mouse_position(event);
  $("dragging_object").style.display = "none";
  $("dragging_object").style.color = "darkgreen";
  $("dragging_object").api_id = api_id;
  $("dragging_object").appendChild(document.createTextNode(item_title_display));
}

function move_api(event) {
  var mouse_position = get_mouse_position(event);
  $("dragging_object").style.top = mouse_position.y + "px";
  $("dragging_object").style.left = mouse_position.x + "px";
  $("dragging_object").style.display = "";
}

function drop_api_and_display(event) {
  Event.stopObserving(document, "mousemove", move_api, false);
  Event.stopObserving(document, "mouseup", drop_api_and_display, false);
  $("dragging_object").removeChild($("dragging_object").childNodes[0]);
  var mouse_position = get_mouse_position(event);
  var position = null;
  var api = null;
  for (var i = 0; i < 2; i++) {
    if (i == 0) {
      position = "left";
    } else {
      position = "right";
    }
    api = $(position + "_api");
    if (Position.within(api, mouse_position.x, mouse_position.y)) {
      display_api_info(position, $("dragging_object").api_id);
    }
  }
}

function drop_api_and_display_en(event) {
  Event.stopObserving(document, "mousemove", move_api, false);
  Event.stopObserving(document, "mouseup", drop_api_and_display, false);
  $("dragging_object").removeChild($("dragging_object").childNodes[0]);
  var mouse_position = get_mouse_position(event);
  var position = null;
  var api = null;
  for (var i = 0; i < 2; i++) {
    if (i == 0) {
      position = "left";
    } else {
      position = "right";
    }
    api = $(position + "_api");
    if (Position.within(api, mouse_position.x, mouse_position.y)) {
      display_api_info_en(position, $("dragging_object").api_id);
    }
  }
}

function display_api_info(position, api_id) {
  var api_info_element = $(position + "_api");
  var new_memo_tip = null;
  var should_display = true;
  if (api_info_element.balloon_tips && api_info_element.balloon_tips[0]) {
    new_memo_tip = api_info_element.balloon_tips[0];
  }
  if (new_memo_tip && new_memo_tip.display) {
    should_display = confirm("編集中のメモがあります。破棄しますか？");
  }
  if (should_display) {
    if (api_info_element.balloon_tips) {
      for (var i = 0; i < api_info_element.balloon_tips.length; i++) {
        hide_balloon_tip(api_info_element.balloon_tips[i]);
      }
    }
    new Ajax.Updater(api_info_element, "/search/api_info", {asynchronous:true, evalScripts:true, parameters:"position=" + position + "&id=" + api_id});
  }
}

function display_api_info_en(position, api_id) {
  var api_info_element = $(position + "_api");
  var new_memo_tip = null;
  var should_display = true;
  if (api_info_element.balloon_tips && api_info_element.balloon_tips[0]) {
    new_memo_tip = api_info_element.balloon_tips[0];
  }
  if (new_memo_tip && new_memo_tip.display) {
    should_display = confirm("編集中のメモがあります。破棄しますか？");
  }
  if (should_display) {
    if (api_info_element.balloon_tips) {
      for (var i = 0; i < api_info_element.balloon_tips.length; i++) {
        hide_balloon_tip(api_info_element.balloon_tips[i]);
      }
    }
    new Ajax.Updater(api_info_element, "/search/api_info_en", {asynchronous:true, evalScripts:true, parameters:"position=" + position + "&id=" + api_id});
  }
}

function get_mouse_position(mouse_event) {
  return {
    x: Event.pointerX(mouse_event), 
    y: Event.pointerY(mouse_event)
  };
}

function iframe_auto_fit() {
  try {
    iframes = document.getElementsByTagName("iframe");
    for (var i = 0; i < iframes.length; i++) {
      if (iframes[i].contentDocument) {
        // FireFoxの場合
        iframes[i].height = iframes[i].contentDocument.body.offsetHeight + 20;  // +20は水平スクロールバーの高さ
      } else if (iframes[i].document) {
        // IEの場合
        iframes[i].height = iframes[i].document.body.scrollHeight;
        if (i == 0) {
          if (iframes[i].document.body.scrollHeight < 800) {
            iframes[i].height = 800;
          }
        } else {
          if (iframes[i].document.body.scrollHeight <= iframes[0].document.body.scrollHeight + 4) {
            iframes[i].height = iframes[0].height;
          } else {
            for (var j = i - 1; j >= 0; j--) {
              iframes[j].height = iframes[i].height;
            }
          }
        }
      }
    }
  } catch (e) {
  }
}

function break_words(element) {
  if (!element.tagName) {
    // テキスト
    var text_elements = [];
    var text = "";
    var i = 0;
    for (var j = 0; j < element.textContent.length; j++) {
      var char = element.textContent.charAt(j);
      text += char;
      if (char.charCodeAt(0) < 256 && j != element.textContent.length - 1) {
        // 半角文字
        text_elements[i++] = document.createTextNode(text);
        text_elements[i++] = document.createElement("wbr");
        text = "";
      }
    }
    if (text != "") {
      text_elements[i] = document.createTextNode(text);
    }
    if (text_elements.length > 1) {
      return text_elements;
    }
  } else {
    for (var i = 0; i < element.childNodes.length; i++) {
      var current_child = element.childNodes[i];
      if (current_child.className == "api_display_1_line") {
        continue;
      }
      var replace_childs = break_words(current_child);
      if (replace_childs) {
        for (var j = 0; j < replace_childs.length; j++) {
          element.insertBefore(replace_childs[j], current_child);
          i++;
        }
        element.removeChild(current_child);
      }
    }
  }
}

function not_to_break_words(element) {
  if (!element.tagName) {
    // テキスト
    return;
  } else {
    for (var i = 0; i < element.childNodes.length; i++) {
      var current_child = element.childNodes[i];
      if (current_child.tagName && current_child.tagName.toLowerCase() == "wbr") {
        element.removeChild(current_child);
      } else {
        not_to_break_words(current_child);
      }
    }
  }
}

function display_or_hide(element, button) {
  if (element.style.display == "none") {
    element.style.display = "";
    button.innerHTML = "［－］";
  } else {
    element.style.display = "none";
    button.innerHTML = "［＋］";
  }
}

function set_api_sequence(curr_api_check) {
  var seq_str = $("seq").value;
  var seq_a = seq_str.split(/,/g);
  var curr_id = curr_api_check.value;
  
  if (curr_api_check.checked) {
    $("history_" + curr_id + "_seq").innerHTML = seq_str == "" ? 1 : seq_a.length + 1;
    if (seq_str != "") {
      seq_str += ",";
    }
    seq_str += curr_id;
  } else {
    var after_curr_seq = false;
    seq_str = "";
    for (var i = 0; i < seq_a.length; i++) {
      if (seq_a[i] == curr_id) {
        after_curr_seq = true;
        $("history_" + seq_a[i] + "_seq").innerHTML = "&nbsp;";
        continue;
      } else if (after_curr_seq) {
        $("history_" + seq_a[i] + "_seq").innerHTML = i;
      }
      if (seq_str != "") {
        seq_str += ",";
      }
      seq_str += seq_a[i];
    }
  }
  
  $("seq").value = seq_str;
}

function characters_count_check(input_element, message_element, max_count) {
  var count = 0;
  var remained_count = max_count - count;
  var i = 0;
  var string = escape(input_element.value);
  for (i = 0; i < string.length; i++) {
    var tmp_i = i;
    if (string.charAt(tmp_i) == "%") {
      if (string.charAt(++tmp_i) == "u") {
        tmp_i += 3;
        count++;
      }
      tmp_i++;
    }
    count++;
    remained_count = max_count - ((count % 2 == 0) ? count / 2 : (count + 1) / 2);
    if (remained_count < 0) {
      remained_count = 0;
      break;
    } else {
      i = tmp_i;
    }
  }
  message_element.innerHTML = '（あと&nbsp;' + remained_count + '&nbsp;文字が入力できます）';
  if (i < string.length) {
    input_element.value = unescape(string.substring(0, i));
  }
}

function check_all_sub_categories(category_id) {
  for (var i = 1; ; i++) {
    var id = category_id;
    if (i < 10) {
      id += "0" + i;
    } else {
      id += i;
    }
    if (category_id.length == 4) {
      check_all_sub_categories(id);
    } else if (category_id.length == 6) {
      var category_checkbox = $("category_" + id);
      if (category_checkbox) {
//        if (category_checkbox.checked) {
//          category_checkbox.checked = false;
//        } else {
          category_checkbox.checked = true;
//        }
      } else {
        break;
      }
    } else {
      break;
    }
  }
}

function translate(element_id, api_id) {
  var element = $(element_id);
  if (!element) {
    return;
  }
  new Ajax.Updater(element, "/search/translate", {asynchronous:true, evalScripts:true, parameters:"id=" + api_id});
}

function sort_column(sort_column_em) {
  var sort_column = "";
  var sort_direction = "";
  var i = -1;
  if ((i = sort_column_em.innerHTML.indexOf("▲")) > 0) {
    sort_column = sort_column_em.innerHTML.substring(0, i);
    sort_direction = "desc";
  } else if ((i = sort_column_em.innerHTML.indexOf("▼")) > 0) {
    sort_column = sort_column_em.innerHTML.substring(0, i);
    sort_direction = "asc";
  } else {
    sort_column = sort_column_em.innerHTML;
    if ( sort_column=="CL" || sort_column=="Fees" || sort_column=="NCL" || sort_column=="Limit" || sort_column=="TOS" ){
      sort_direction = "desc";
    }else {
      sort_direction = "asc";
    }
  }
  return "sort_column=" + sort_column + "&sort_direction=" + sort_direction;
}

function sort_column_from_button(column,direction) {
  return "sort_column=" + column + "&sort_direction=" + direction;
}

function sort_search_results(sort_column_em) {
  var parameters = sort_column(sort_column_em);
  new Ajax.Updater('search_results_marked_up_container', '/search/sort_search_results', {asynchronous:true, evalScripts:true, parameters:parameters});
}

function sort_histories(sort_column_em) {
  var parameters = sort_column(sort_column_em);
  new Ajax.Updater('browse_histories', '/history/sort_histories', {asynchronous:true, evalScripts:true, parameters:parameters});
}