 /* Adsotrans Popup Editing Code 
 * 
 * Copyright David Lancashire 2008
 *
 */


/* Server Manipulates These */
var firstdefinition = "";
var lastdefinition = "";
var thiselement = "";
var object_under_editing = "";
var object_under_updating = "";
var object_under_editing_permitted_to_update = 1;
var object_under_editing_id = -1;
var row_under_editing = 0;

var update_server_with_edits = 1;

var pre_field_lookup = "";
var match_field_lookup = "";
var post_field_lookup = "";
var pre_field_lookup_id = "";
var match_field_lookup_id = "";
var post_field_lookup_id = "";


/* Cross-Browser Variables */
var ie=document.all
var ff=document.getElementById && !document.all

var content_id = -1;

/* Popup Variables */
var pointer_x_offset=12;
var pointer_y_offset=10;
var tooltip_x_offset=10;
var tooltip_y_offset=14;
var current_x = 0;
var current_y = 0;
var parent_x_offset = 0;
var parent_y_offset = 0;
var tooltip_editing_width = "350px";
var tooltip_editing_height = "auto";
var tooltip_display_width = "auto";
var tooltip_display_height = "auto";
var is_tooltip_visible = 0;
var is_tooltip_locked = 0;
var is_editing_enabled = 1;
var is_copying_enabled = 0;
var is_annotated = 0;
var is_annotating_enabled = 0;

var tt1 = "";
var tt2 = "";
var tt3 = "";
var tt4 = "";
var tt5 = "";

try {
  var tooltip=document.getElementById("adso_tooltip");
  $("adso_tooltip").bind("mouseout",hide_tooltip);
  var pointer=document.getElementById("adso_pointer");
} catch (err) {
  alert("Error in document.getElementById(adso_tooltip)");
}







/* Showing, Hiding and Positioning the Tooltip */

function show_tooltip() {

  /* calculate relative position of element */
  parent_x_offset = 0;
  parent_y_offset = 0;
  var adso_temp_obj = thiselement.offsetParent;
  while (adso_temp_obj != null) {
    parent_x_offset += adso_temp_obj.offsetLeft;
    parent_y_offset += adso_temp_obj.offsetTop;
    adso_temp_obj = adso_temp_obj.offsetParent; 
 }

  if (is_tooltip_locked == 1) { return; }

  tooltip.style.height = tooltip_display_height;
  tooltip.style.width = tooltip_display_width;


  availW = 0;
  availH = 0;
  scrollX = 0;
  scrollY = 0;

  if (document.all) {
    availW = document.body.clientWidth;
    availH = document.body.clientHeight;
    scrollX = document.body.scrollLeft;
    scrollY = document.body.scrollTop;
  } else{
    availW = innerWidth;
    availH = innerHeight;
    scrollX = window.pageXOffset;
    scrollY = window.pageYOffset;
  }

  tooltip_height = tooltip.offsetHeight;

  stop_position = tooltip_height+current_y;

  // Scroll Offset
  if ( (current_y - scrollY + tooltip_height) > availH) {
    current_y = current_y - tooltip_height - 30;
  }

  if (is_tooltip_visible == 1 && is_tooltip_locked == 0){
    /* Move Tooltip */
    tooltip.style.left=current_x+10+"px";
    tooltip.style.top=current_y+10+"px";
  }

  tooltip.style.visibility = "visible";
  is_tooltip_visible = 1;

}
function save_tooltip() {

  var entries = new Array();
  var row_1 = "";
  var row_2 = "";
  var row_3 = "";
  var row_4 = "";
  var row_5 = "";
  var row_6 = "";
  var text = object_under_editing.innerHTML;

  var replacement_html = "";

  entries = tooltip.innerHTML.split(">");
  for (m = 3; m < entries.length; m+=2) {
    row1 = "";
    row2 = "";
    row3 = "";
    row4 = "";
    row5 = "";
    row6 = "";

    entries2 = entries[m].split("<");
    if (m == 3) { row_1 = entries2[0]; }
    if (m == 5) { row_2 = entries2[0]; }
    if (m == 7) { row_3 = entries2[0]; }
    if (m == 9) { row_4 = entries2[0]; }
    if (m == 11) { row_5 = entries2[0]; }
    if (m == 13) { row_6 = entries2[0]; }

  }

  var inset2 = row_1;
  inset2 = inset2.replace(/\'/g,"&apos;"');
  inset2 = inset2.replace(/\\&apos;/g,"&apos;");

    row_1 = row_1.replace(/\'/g,"`"');
    row_2 = row_2.replace(/\'/g,"`"');
    row_3 = row_3.replace(/\'/g,"`"');
    row_4 = row_4.replace(/\'/g,"`"');
    row_5 = row_5.replace(/\'/g,"`"');
    row_6 = row_6.replace(/\'/g,"`"');

  replacement_html = "<span id=\"adso_"+row_6+"\" onclick=\"onWordClick()\" onmousedown=\"adso_mousedown('"+row_6+"')\" onmouseup=\"adso_mouseup('"+row_6+"')\" onmouseover=\"tip(event,'"+row_4+"','"+row_3+"','"+row_1+"','"+row_2+"','"+row_5+"','"+row_6+"')\" onmouseout=\"htip()\">"+inset2+"</span>";
  var output = "";
  array_of_entries = text.split("</span>");
  for (var i = 0; i < array_of_entries.length; i++) {

    var field1 = extract_field1(array_of_entries[i]);
    var field2 = extract_field2(array_of_entries[i]);
    var field3 = extract_field3(array_of_entries[i]);
    var field4 = extract_field4(array_of_entries[i]);
    var field5 = extract_field5(array_of_entries[i]);
    var field6 = extract_field6(array_of_entries[i]);
    var pre = extract_pre(array_of_entries[i]);


    if (field6 != "") {
      if (field6 == row_6) {
        // Inform Ourselves of Edited Content
	if (update_server_with_edits == 1) {
          $.post("/updates/editAnnotator",{
            field1: row_4,
            field2: row_3,
            field3: row_1,
            field4: row_2,
            field5: row_5
          },function(txt) {
    	    //alert(txt);
          });
	}
         output += replacement_html;
      } else {
  	 output += "<span id=\"adso_"+field6+"\" onclick=\"onWordClick()\" onmousedown=\"adso_mousedown('"+field6+"')\" onmouseup=\"adso_mouseup('"+field6+"')\" onmouseover=\"tip(event,'"+field1+"','"+field2+"','"+field3+"','"+field4+"','"+field5+"','"+field6+"')\" onmouseout=\"htip()\">"+field3+"</span>";
      }
    }
  }

  object_under_editing.innerHTML = output;

  tooltip.innerHTML = "";
  is_tooltip_visible = 0;
  tooltip.style.visibility = "hidden";
  is_tooltip_locked = 0;
  row_under_editing = 0;
}
function hide_tooltip() {
  if (is_tooltip_locked == 1) { return; }
  tooltip.innerHTML = "";
  is_tooltip_visible = 0;
  tooltip.style.visibility = "hidden";
  row_under_editing = 0;
}
document.onmousemove=update_tooltip
function update_tooltip(e){

  if (is_tooltip_locked == 1) { return; }

  try {
    current_x=(ff)?e.pageX : event.clientX+ie_backward_compatibility().scrollLeft;
    current_y=(ff)?e.pageY : event.clientY+ie_backward_compatibility().scrollTop;
  } catch (err) { }


  availW = 0;
  availH = 0;
  scrollX = 0;
  scrollY = 0;

  if (document.all) {
    availW = document.body.clientWidth;
    availH = document.body.clientHeight;
    scrollX = document.body.scrollLeft;
    scrollY = document.body.scrollTop;
  } else{
    availW = innerWidth;
    availH = innerHeight;
    scrollX = window.pageXOffset;
    scrollY = window.pageYOffset;
  }

  tooltip_height = tooltip.offsetHeight;

  stop_position = tooltip_height+current_y;


  // Scroll Offset
  if ( (current_y - scrollY + tooltip_height) > availH) {
    current_y = current_y - tooltip_height - 30;
  }



  if (is_tooltip_visible == 1 && is_tooltip_locked == 0){
    tooltip.style.left=current_x+10+"px";
    tooltip.style.top=current_y+10+"px";
  }

}
function ie_backward_compatibility(){ return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body }













/* Tracking Mouse Events */

function tip(e, event1, event2, event3, event4, event5, divdef){

  if (is_tooltip_locked == 1) { return; }
  try {
    if (event1 == "") {event1 = "unknown"; } 
    if (event2 == "") {event2 = "unknown"; } // english
    if (event5 == "") {event5 = "unknown"; } // part of speech
    if (content_id == -1) { // non-editing pages
      if (event1 == "unknown") {event1 = ""; } 
      if (event2 == "unknown") {event2 = ""; } // english
      if (event5 == "unknown") {event5 = ""; } // part of speech
      event2 = convert_pinyin(event2);
    }
  } catch (err) {
  }

  if (event3 == "") {event3 = "unknown"; }
  if (event4 == "") {event4 = "unknown"; }

  /* NonChinese Entries (english text) have identical events and are easy to recognize, skip showing popup, it's obvious */
  if (event1 == event2 && event2 == event3 && event3 == event4) { return; }

  event1 = event1.replace(/`/g,'\'');
  event2 = event2.replace(/`/g,'\'');
  event3 = event3.replace(/`/g,'\'');
  event4 = event4.replace(/`/g,'\'');
  try {  event5 = event5.replace(/`/g,'\''); } catch (err) {} // backwards compatible with older markup script
  tt1 = event1;
  tt2 = event2;
  tt3 = event3;
  tt4 = event4;
  tt5 = event5;

  try {

    tooltip.innerHTML='<div style="overflow:auto"><div id="row_1" class="row_1" onclick="edit_row_num(1)" align="center">'+event3+'</div>'+'<div id="row_2" class="row_2" onclick="edit_row_num(2)" align="center">'+event4+'</div>'+'<div id="row_3" class="row_3" onclick="edit_row_num(3)" align="center">'+event2+'</div>'+'<div id="row_4" class="row_4" onclick="edit_row_num(4)" align="center">'+event1+'</div><div id="row_5" class="row_5" onclick="edit_row_num(5)" align="center">'+event5+'</div><div id="divdef" class="row_6">'+divdef+'</div></div>';
    show_tooltip();
  } catch (err) {
    alert("Error: " + err.message);
  }
}
function htip(){
  if (is_tooltip_locked == 0) { hide_tooltip(); } 
}
function adso_mousedown(divdef) {
  firstdefinition = divdef;
  return;
}
function adso_mouseup(divdef) {
  lastdefinition = divdef;
  if (parseInt(firstdefinition) > parseInt(lastdefinition)) {
    var a = firstdefinition;
    var b = lastdefinition;
    firstdefinition = b;
    lastdefinition = a;
  }
  return;
}




function onWordClick() {

   // Freeze the Tooltip 
   if (is_tooltip_locked == 1) { return; }
   is_tooltip_locked = 1;
   tooltip.innerHTML = '<img src="/img/icons/close.gif" onmouseup="save_tooltip();" style="float:right;margin-bottom:0px;margin: 0px 0px 0px"/>'+tooltip.innerHTML;

   
}




// Needed so that Mouseover Can Update Sentence Source
function update_sentence_source_id(new_id) {
  sentence_source_id = new_id;
  return;
}


function adso_clicked() {

   try {
     // Netscape/Mozilla are Better
     if (ff) { highlighted_selection = window.getSelection(); }
     if (ie) { highlighted_selection = document.selection.createRange().text; }
   } catch (err) { alert("Error Here: "+err.message); }


  if (highlighted_selection != "") {
    var html_insert =  '<center><div style="width=:15px;height:15px;float:right;">';
        html_insert += '<img src="/img/icons/close.gif" onmouseup="is_tooltip_locked = 0; hide_tooltip();" style="margin-bottom:0px;margin: 0px 0px 0px"/>';
        html_insert += '</div>';
        html_insert +=  '<form name="contribute" onsubmit="adso_resegment_submission(); hide_tooltip(); return false;">';
        html_insert += '<div class="adso_add_source">'+highlighted_selection+'</div>';
        html_insert += '<input type="hidden" name="source" value="'+highlighted_selection+'"/>';
        html_insert += '<input type="hidden" name="firstdef" value="'+firstdefinition+'"/>';
        html_insert += '<input type="hidden" name="lastdef" value="'+lastdefinition+'"/>';
        html_insert += '<input type="text" class="adso_add_translation" name="translation" />';
        html_insert += '<br /><input type="submit" value="edit" onsubmit="adso_resegment_submission(); is_tooltip_locked = 0; hide_tooltip(); return false;" /> ';
        html_insert += '</form></center>';
    is_resegmenting = 1;
    tooltip.innerHTML = html_insert;
    show_tooltip();
    document.contribute.translation.focus();
    is_tooltip_locked = 1;
  }

  return;
}

function adso_resegment_submission() {

  var source = document.contribute.source.value;
  var translation = document.contribute.translation.value;
  var divdef1 = document.contribute.firstdef.value;
  var divdef2 = document.contribute.lastdef.value;

  adso_resegment_ajax(source,translation,divdef1,divdef2);

  if (update_server_with_edits == 1) {
    $.post("/updates/editAnnotator",{
      field1: translation,
      field3: source
    },function(txt) {
      //alert(txt);
    });
  }
  return false;
}

function adso_resegment_ajax(source, translation,divdef1,divdef2) {

  object_under_updating = object_under_editing;

  // Internet Explorer Truly Sucks - Needed to Prevent it Truncating Stuff
  if (ie) { source += "_IESUCKS"; }


  // Either our opening (divdef1) or closing (divdef2) marker could be
  // off. It is possible for the mouse to stray to the next popup without
  // crossing enough of the first character to make the highlight cross
  // over as well. We know that our two divdefs will border the region
  // in question, but need to be sure we are only going to manipulate 
  // the minimal span tags needed.
  //
  var alltext = "";
  var stoploop = -1;




  // if we stopped early, take our stop point as the final div
  for (i = parseInt(divdef1); stoploop == -1 && i <= parseInt(divdef2); i++) {

    // if span tag exists, grab its content
    try {
      alltext += document.getElementById("adso_"+i).innerHTML;  
    } catch (err) {}

    if (alltext.search(source) != -1) { 
      stoploop = i; 
    }

  }
  if (stoploop <= parseInt(divdef2) && stoploop != -1) {
    divdef2 = stoploop;
  }




  // Now do the same thing to adjust the starting position 
  alltext = "";
  stoploop = -1;
  for (z = parseInt(divdef2); stoploop < 0 && z >= parseInt(divdef1); z--) {

    // if span tag exists, grab its content
    try {
      if (document.getElementById("adso_"+z).innerHTML != "undefined") { 
        alltext = document.getElementById("adso_"+z).innerHTML + alltext; 
      } 
    } catch (err) {}

    if (alltext.search(source) != -1) { stoploop = z; }

  }
  // if we stopped early, take our stop point as the first div
  if (stoploop != parseInt(divdef1) && stoploop != -1) {
    divdef1 = stoploop;
  }

  var temp = adso_resegment_engine(source,translation,object_under_editing.innerHTML,divdef1,divdef2);

  // Attempting to Resegment Non-Markup Text Returns Nothing
  if (temp == "") { is_tooltip_locked = 0; return false; }

  object_under_updating.innerHTML = temp;




  // Update Missing Fields Through Ajax
  if (pre_field_lookup_id != "") {
    // Update Missing Entries in Pre Field with Ajax
    $.post("/updates/annotator",{
      text: pre_field_lookup
    },function(txt){

      new_field1 = "";
      new_field2 = "";
      new_field3 = "";
      new_field4 = "";
      new_field5 = "";
 
      ofield1 = "";
      ofield2 = "";
      ofield3 = "";
      ofield4 = "";
      ofield5 = "";
      ofield6 = "";
      opre = "";

      array_of_entries = txt.split("</span>");

      for (var i = 0; i < array_of_entries.length; i++) {

        ofield1 = extract_field1(array_of_entries[i]);
        ofield2 = extract_field2(array_of_entries[i]);
        ofield3 = extract_field3(array_of_entries[i]);
        ofield4 = extract_field4(array_of_entries[i]);
        ofield5 = extract_field5(array_of_entries[i]);
        ofield6 = extract_field6(array_of_entries[i]);
        opre = extract_pre(array_of_entries[i]);

        new_field1 += opre + ofield1;
        new_field2 += opre + ofield2;
        new_field3 += opre + ofield3;
        new_field4 += opre + ofield4;
        new_field5 += ofield5;

      }

      // DOM manipulation is inconsistent across Firefox, so fall back on innerHTML manipulation
      original_string = '\'\',\'\',\''+new_field3+'\',\'\',\'\'';
      replace_string  = '\''+new_field1+'\',\''+new_field2+'\',\''+new_field3+'\',\''+new_field4+'\',\''+new_field5+'\'';
      re = new RegExp(original_string, "g"); 
      temp = temp.replace(re,replace_string);
      object_under_updating.innerHTML = temp;

    });

    pre_field_done = 1;
  }






  // Update Missing Fields Through Ajax
  if (match_field_lookup_id != "") {
    // Update Missing Entries in Pre Field with Ajax
    $.post("/updates/annotator",{
      text: match_field_lookup
    },function(txt2){

      mnew_field1 = "";
      mnew_field2 = "";
      mnew_field3 = "";
      mnew_field4 = "";
      mnew_field5 = "";
 
      mofield1 = "";
      mofield2 = "";
      mofield3 = "";
      mofield4 = "";
      mofield5 = "";
      mofield6 = "";
      mopre = "";

      marray_of_entries = txt2.split("</span>");

      for (var i = 0; i < marray_of_entries.length; i++) {

        mofield1 = extract_field1(marray_of_entries[i]);
        mofield2 = extract_field2(marray_of_entries[i]);
        mofield3 = extract_field3(marray_of_entries[i]);
        mofield4 = extract_field4(marray_of_entries[i]);
        mofield5 = extract_field5(marray_of_entries[i]);
        mofield6 = extract_field6(marray_of_entries[i]);
        mopre = extract_pre(marray_of_entries[i]);

        mnew_field1 += mopre + mofield1;
        mnew_field2 += mopre + mofield2;
        mnew_field3 += mopre + mofield3;
        mnew_field4 += mopre + mofield4;
        mnew_field5 += mofield5;

      }

      // Update Opened Popup if Necessary
      try { // popup may not be open/exist
      if (mnew_field6 == document.getElementById("row_6").innerHTML) {
        row_1 = mnew_field3; document.getElementById("row_1").innerHTML = mnew_field3;
        row_2 = mnew_field4; document.getElementById("row_2").innerHTML = mnew_field4;
        row_3 = mnew_field2; document.getElementById("row_3").innerHTML = mnew_field2;
      }
      } catch (err) {}


      // DOM manipulation is inconsistent across Firefox, so fall back on innerHTML manipulation
      original_string = '\'\',\''+mnew_field3+'\',\'\',\'\'';
      replace_string  = '\''+mnew_field2+'\',\''+mnew_field3+'\',\''+mnew_field4+'\',\''+mnew_field5+'\'';
      re = new RegExp(original_string, "g"); 
      temp = temp.replace(re,replace_string);
      object_under_updating.innerHTML = temp;

    });

  }


  // Update Missing Fields Through Ajax 
  if (post_field_lookup_id != "") {
    // Update Missing Entries in Pre Field with Ajax
    $.post("/updates/annotator",{
      text: post_field_lookup
    },function(btxt){

      bnew_field1 = "";
      bnew_field2 = "";
      bnew_field3 = "";
      bnew_field4 = "";
      bnew_field5 = "";
 
      bofield1 = "";
      bofield2 = "";
      bofield3 = "";
      bofield4 = "";
      bofield5 = "";
      bofield6 = "";
      bopre = "";

      barray_of_entries = btxt.split("</span>");

      for (var i = 0; i < barray_of_entries.length; i++) {

        bofield1 = extract_field1(barray_of_entries[i]);
        bofield2 = extract_field2(barray_of_entries[i]);
        bofield3 = extract_field3(barray_of_entries[i]);
        bofield4 = extract_field4(barray_of_entries[i]);
        bofield5 = extract_field5(barray_of_entries[i]);
        bofield6 = extract_field6(barray_of_entries[i]);
        bopre = extract_pre(barray_of_entries[i]);

        bnew_field1 += bopre + bofield1;
        bnew_field2 += bopre + bofield2;
        bnew_field3 += bopre + bofield3;
        bnew_field4 += bopre + bofield4;
        bnew_field5 += bofield5;

      }

      // DOM manipulation is inconsistent across Firefox, so fall back on innerHTML manipulation 
      original_string = '\'\',\'\',\''+bnew_field3+'\',\'\',\'\'';
      replace_string  = '\''+bnew_field1+'\',\''+bnew_field2+'\',\''+bnew_field3+'\',\''+bnew_field4+'\',\''+bnew_field5+'\'';
      re = new RegExp(original_string, "g"); 
      temp = temp.replace(re,replace_string);
      object_under_updating.innerHTML = temp;

    });

  }






  is_tooltip_locked = 0;

  return false;
}


function annotate_page(z) {
  if (z >= translation.length) { alert("Error: that page does not exist."); }
  else {
    paragraph=z;
    annotate(translation[paragraph]);
  }
}


// Javascript Manipulation Libraries for Adsotrans Markup
function extract_pre(text) {
  bodyarray = text.split("<span ");
  return bodyarray[0];
}
function extract_field(text, field) {
  text = text.replace(/event, /g,"event,");
  if (text.indexOf("event,'") != -1) {
    bodyarray = text.split("event,'");
    bodyarray2 = bodyarray[1].split("')");
    temp = bodyarray2[0].split("','");
    return temp[(field-1)];
  }
  return "";
}
function extract_field1(text) { return extract_field(text,1); }
function extract_field2(text) { return extract_field(text,2); }
function extract_field3(text) { return extract_field(text,3); }
function extract_field4(text) { return extract_field(text,4); }
function extract_field5(text) { return extract_field(text,5); }
function extract_field6(text) { return extract_field(text,6); }


function adso_redefine_word(source, pinyin, translation, text,divdef) {

  var alternate_segmentation = "";
  var alternate_segmentation2 = "";
  array_of_entries = text.split("</span>");

  for (var i = 0; i < array_of_entries.length; i++) {

    var field1 = extract_field1(array_of_entries[i]);
    var field2 = extract_field2(array_of_entries[i]);
    var field3 = extract_field3(array_of_entries[i]);
    var field4 = extract_field4(array_of_entries[i]);
    var field5 = extract_field5(array_of_entries[i]);
    var field6 = extract_field6(array_of_entries[i]);
    var pre = extract_pre(array_of_entries[i]);

    var this_inset = field3;
    this_inset = this_inset.replace(/\'/g,"&apos;");
    this_inset = this_inset.replace(/\\&apos;/g,"&apos;");


    alternate_segmentation = pre;
    if (field3 == source) {
      if (field6 == divdef) {
        alternate_segmentation += '<span id="adso_'+divdef+'" onmousedown="adso_mousedown(\''+divdef+'\');" onmouseup="adso_mouseup(\''+divdef+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+pinyin+'\',\''+translation+'\',\''+field3+'\',\''+field4+'\',\''+field5+'\',\''+divdef+'\')" onmouseout="htip()">'+this_inset+'</span>';
      } else {
        alternate_segmentation += '<span id="adso_'+field6+'" onmousedown="adso_mousedown(\''+divdef+'\');" onmouseup="adso_mouseup(\''+divdef+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+field1+'\',\''+field2+'\',\''+field3+'\',\''+field4+'\',\''+field5+'\',\''+field6+'\')" onmouseout="htip()">'+this_inset+'</span>';
      }
    } else {
        alternate_segmentation += '<span id="adso_'+field6+'" onmousedown="adso_mousedown(\''+divdef+'\');" onmouseup="adso_mouseup(\''+divdef+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+field1+'\',\''+field2+'\',\''+field3+'\',\''+field4+'\',\''+field5+'\',\''+field6+'\')" onmouseout="htip()">'+this_inset+'</span>';
    }
      alternate_segmentation2 += alternate_segmentation;
  }
  return alternate_segmentation2;
}
function adso_resegment_engine(source, translation, text,divdef_first, divdef_last) {

  try {

  var alternate_segmentation = "";
  var alternate_segmentation2 = "";

  array_of_entries = text.split("</span>");

  pre_field_lookup = "";
  match_field_lookup = "";
  post_field_lookup = "";
  pre_field_lookup_id = "";
  match_field_lookup_id = "";
  post_field_lookup_id = "";

  for (var i = 0; i < array_of_entries.length; i++) {

    var field1 = extract_field1(array_of_entries[i]);
    var field2 = extract_field2(array_of_entries[i]);
    var field3 = extract_field3(array_of_entries[i]);
    var field4 = extract_field4(array_of_entries[i]);
    var field5 = extract_field5(array_of_entries[i]);
    var field6 = extract_field6(array_of_entries[i]);
    var pre = extract_pre(array_of_entries[i]);
    var temp = "";
    var temp2 = "";

    var pre_field1 = "";
    var pre_field2 = "";
    var pre_field3 = "";
    var pre_field4 = "";
    var pre_field5 = "";
    var pre_field6 = "";

    var match_field1 = "";
    var match_field2 = "";
    var match_field3 = "";
    var match_field4 = "";
    var match_field5 = "";
    var match_field6 = "";

    var post_field1 = "";
    var post_field2 = "";
    var post_field3 = "";
    var post_field4 = "";
    var post_field5 = "";
    var post_field6 = "";

    var match = 0;
    var first_char = source[0];  


    if (field3.indexOf(first_char) >= 0) {

      var j = i;
      temp = field3;

      var potential_pre_field3 = "";
      var continue_next = 1;

      if (field3.indexOf(first_char) > 0) {

        temp2 = field3.substr(field3.indexOf(first_char));
        potential_pre_field3 = field3.substr(0, field3.indexOf(first_char));

        
        if (field3.length > (potential_pre_field3.length+source.length)) {
          continue_next = 0;
          match = 1;
          pre_field1 = "";
          pre_field2 = "";
          pre_field3 = potential_pre_field3;
          pre_field4 = "";
          match_field1 = translation;
          match_field2 = "";
          match_field3 = source;
          match_field4 = "";
          post_field1 = "";
          post_field2 = "";
          post_field3 = temp2.substr(source.length);
          post_field4 = "";

        } else {
          temp = temp2;
          continue_next == 1;
          pre_field1 = "";
          pre_field2 = "";
          pre_field3 = potential_pre_field3;
          pre_field4 = "";
        }

      }


      if (continue_next == 1) {
        while (source.length > temp.length && j < array_of_entries.length) {
          j++;
  	  temp += extract_pre(array_of_entries[j]) + extract_field3(array_of_entries[j]);
        }

        temp = temp.replace(/\\\'/g,"'");
        var matched = temp.substr(0,source.length);


        if (matched == source) {

          if (matched.length == temp.length) {
            match_field1 = translation;
            match_field2 = "";
            match_field3 = source;
            match_field4 = "";
            match_field5 = "";
          } else {
            match_field1 = translation;
            match_field2 = "";
            match_field3 = source;
            match_field4 = "";
            match_field5 = "";
            post_field1 = "";
            post_field2 = "";
            post_field3 = temp.substr(source.length);
            post_field4 = "";
            post_field5 = "";
          }

	  match = 1;
          i=j;
        }
      } // continue next
    } // char found



    length_of_pre = pre_field3.length;
    length_of_match = match_field3.length;
    length_of_post = post_field3.length;

    var myinset = "";
    myinset = field3;
    myinset = myinset.replace(/\'/g,"&apos;");
    myinset = myinset.replace(/\\&apos;/g,"&apos;");


    if (match == 1) {

      var post_position = divdef_last;
      var match_position = divdef_last-length_of_post;
      var pre_position = divdef_last-length_of_post-length_of_match;

      var pre_field3_inset = pre_field3;
      pre_field3_inset = pre_field3_inset.replace(/\'/g,"&apos;");
      pre_field3_inset = pre_field3_inset.replace(/\\&apos;/g,"&apos;");
      var match_field3_inset = match_field3;
      match_field3_inset = match_field3_inset.replace(/\'/g,"&apos;");
      match_field3_inset = match_field3_inset.replace(/\\&apos;/g,"&apos;");
      var post_field3_inset = post_field3;
      post_field3_inset = post_field3_inset.replace(/\'/,"&apos;");
      post_field3_inset = post_field3_inset.replace(/\\&apos;/,"&apos;");

      pre_field1 = pre_field1.replace(/\'/g,'\\\'');
      pre_field2 = pre_field2.replace(/\'/g,'\\\'');
      pre_field3 = pre_field3.replace(/\'/g,'\\\'');
      pre_field4 = pre_field4.replace(/\'/g,'\\\'');
      match_field1 = match_field1.replace(/\'/g,'\\\'');
      match_field2 = match_field2.replace(/\'/g,'\\\'');
      match_field3 = match_field3.replace(/\'/g,'\\\'');
      match_field4 = match_field4.replace(/\'/g,'\\\'');
      post_field1 = post_field1.replace(/\'/g,'\\\'');
      post_field2 = post_field2.replace(/\'/g,'\\\'');
      post_field3 = post_field3.replace(/\'/g,'\\\'');
      post_field4 = post_field4.replace(/\'/g,'\\\'');

      // Calculate Locate Positioning
      location_adjustment = 0;
      if (match_position != field6) {
        location_adjustment = field6 - match_position;
      }

      alternate_segmentation = pre;
      if (pre_field3 != "") {
        alternate_segmentation += '<span id="adso_'+(location_adjustment+pre_position)+'" onmousedown="adso_mousedown(\''+(pre_position+location_adjustment)+'\');" onmouseup="adso_mouseup(\''+(location_adjustment+pre_position)+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+pre_field1+'\',\''+pre_field2+'\',\''+pre_field3+'\',\''+pre_field4+'\',\''+pre_field5+'\',\''+(pre_position+location_adjustment)+'\')" onmouseout="htip()">'+pre_field3_inset+'</span>';
	pre_field_lookup = pre_field3;
	pre_field_lookup_id = pre_position+location_adjustment;
      }
      if (match_field3 != "") {
        alternate_segmentation += '<span id="adso_'+(location_adjustment+match_position)+'" onmousedown="adso_mousedown(\''+(location_adjustment+match_position)+'\');" onmouseup="adso_mouseup(\''+(location_adjustment+match_position)+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+match_field1+'\',\''+match_field2+'\',\''+match_field3+'\',\''+match_field4+'\',\''+match_field5+'\',\''+(location_adjustment+match_position)+'\')" onmouseout="htip()">'+match_field3_inset+'</span>';
	match_field_lookup = match_field3;
	match_field_lookup_id = match_position+location_adjustment;
      }
      if (post_field3 != "") {
        alternate_segmentation += '<span id="adso_'+(location_adjustment+post_position)+'" onmousedown="adso_mousedown(\''+(location_adjustment+post_position)+'\');" onmouseup="adso_mouseup(\''+(location_adjustment+post_position)+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+post_field1+'\',\''+post_field2+'\',\''+post_field3+'\',\''+post_field4+'\',\''+post_field5+'\',\''+(location_adjustment+post_position)+'\')" onmouseout="htip()">'+post_field3_inset+'</span>';
	post_field_lookup = post_field3;
	post_field_lookup_id = post_position+location_adjustment;
      }
      alternate_segmentation2 += alternate_segmentation; 
    }
    else {
      alternate_segmentation = pre;
      if (field3 != "") {
        alternate_segmentation += '<span id="adso_'+field6+'" onmousedown="adso_mousedown(\''+field6+'\');" onmouseup="adso_mouseup(\''+field6+'\');" onclick="onWordClick()" onmouseover="tip(event,\''+field1+'\',\''+field2+'\',\''+field3+'\',\''+field4+'\',\''+field5+'\',\''+field6+'\')" onmouseout="htip()">'+myinset+'</span>';
      } 
      alternate_segmentation2 += alternate_segmentation; 
    }

  }
 

    return alternate_segmentation2;

  } catch (err) { alert("Here: " + err.message); }

  return text;

}

function convert_pinyin(pinconv) {

                pinconv = pinconv.replace(/5/g, "");

		pinconv = pinconv.replace(/or1/g, "o1r");
		pinconv = pinconv.replace(/or2/g, "o2r");
		pinconv = pinconv.replace(/or3/g, "o3r");
		pinconv = pinconv.replace(/or4/g, "o4r");

		pinconv = pinconv.replace(/nr1/g, "n1r");
		pinconv = pinconv.replace(/nr2/g, "n2r");
		pinconv = pinconv.replace(/nr3/g, "n3r");
		pinconv = pinconv.replace(/nr4/g, "n4r");

		pinconv = pinconv.replace(/v1/g, "ǖ");
		pinconv = pinconv.replace(/v2/g, "ǘ");
		pinconv = pinconv.replace(/v3/g, "ǚ");
		pinconv = pinconv.replace(/v4/g, "ǜ");
		pinconv = pinconv.replace(/v5/g, "ü");
		pinconv = pinconv.replace(/ve1/g, "ǖe");
		pinconv = pinconv.replace(/ve2/g, "ǘe");
		pinconv = pinconv.replace(/ve3/g, "ǚe");
		pinconv = pinconv.replace(/ve4/g, "ǜe");
		pinconv = pinconv.replace(/ve5/g, "üe");
		pinconv = pinconv.replace(/vn1/g, "ǖn");
		pinconv = pinconv.replace(/vn2/g, "ǘn");
		pinconv = pinconv.replace(/vn3/g, "ǚn");
		pinconv = pinconv.replace(/vn4/g, "ǜn");
		pinconv = pinconv.replace(/vn5/g, "ün");

		pinconv = pinconv.replace(/a1/g, "ā");
		pinconv = pinconv.replace(/a2/g, "á");
		pinconv = pinconv.replace(/a3/g, "ǎ");
		pinconv = pinconv.replace(/a4/g, "à");
		pinconv = pinconv.replace(/a5/g, "a");
		pinconv = pinconv.replace(/ai1/g, "āi");
		pinconv = pinconv.replace(/ai2/g, "ái");
		pinconv = pinconv.replace(/ai3/g, "ǎi");
		pinconv = pinconv.replace(/ai4/g, "ài");
		pinconv = pinconv.replace(/ai5/g, "ai");
		pinconv = pinconv.replace(/an1/g, "ān");
		pinconv = pinconv.replace(/an2/g, "án");
		pinconv = pinconv.replace(/an3/g, "ǎn");
		pinconv = pinconv.replace(/an4/g, "àn");
		pinconv = pinconv.replace(/an5/g, "an");
		pinconv = pinconv.replace(/ao1/g, "āo");
		pinconv = pinconv.replace(/ao2/g, "áo");
		pinconv = pinconv.replace(/ao3/g, "ǎo");
		pinconv = pinconv.replace(/ao4/g, "ào");
		pinconv = pinconv.replace(/ao5/g, "ao");
		pinconv = pinconv.replace(/ang1/g, "āng");
		pinconv = pinconv.replace(/ang2/g, "áng");
		pinconv = pinconv.replace(/ang3/g, "ǎng");
		pinconv = pinconv.replace(/ang4/g, "àng");
		pinconv = pinconv.replace(/ang5/g, "ang");
		pinconv = pinconv.replace(/e1/g, "ē");
		pinconv = pinconv.replace(/e2/g, "é");
		pinconv = pinconv.replace(/e3/g, "ě");
		pinconv = pinconv.replace(/e4/g, "è");
		pinconv = pinconv.replace(/e5/g, "e");


		pinconv = pinconv.replace(/en1/g, "ēn");
		pinconv = pinconv.replace(/en2/g, "én");
		pinconv = pinconv.replace(/en3/g, "ěn");
		pinconv = pinconv.replace(/en4/g, "èn");
		pinconv = pinconv.replace(/en5/g, "en");
		pinconv = pinconv.replace(/er1/g, "ēr");
		pinconv = pinconv.replace(/er2/g, "ér");
		pinconv = pinconv.replace(/er3/g, "ěr");
		pinconv = pinconv.replace(/er4/g, "èr");
		pinconv = pinconv.replace(/er5/g, "er");
		pinconv = pinconv.replace(/eng1/g, "ēng");
		pinconv = pinconv.replace(/eng2/g, "éng");
		pinconv = pinconv.replace(/eng3/g, "ěng");
		pinconv = pinconv.replace(/eng4/g, "èng");
		pinconv = pinconv.replace(/eng5/g, "eng");
		pinconv = pinconv.replace(/ei1/g, "ēi");
		pinconv = pinconv.replace(/ei2/g, "éi");
		pinconv = pinconv.replace(/ei3/g, "ěi");
		pinconv = pinconv.replace(/ei4/g, "èi");
		pinconv = pinconv.replace(/ei5/g, "ei");

		pinconv = pinconv.replace(/i1/g, "ī");
		pinconv = pinconv.replace(/i2/g, "í");
		pinconv = pinconv.replace(/i3/g, "ǐ");
		pinconv = pinconv.replace(/i4/g, "ì");
		pinconv = pinconv.replace(/i5/g, "i");
		pinconv = pinconv.replace(/in1/g, "īn");
		pinconv = pinconv.replace(/in2/g, "ín");
		pinconv = pinconv.replace(/in3/g, "ǐn");
		pinconv = pinconv.replace(/in4/g, "ìn");
		pinconv = pinconv.replace(/in5/g, "in");
		pinconv = pinconv.replace(/ing1/g, "īng");
		pinconv = pinconv.replace(/ing2/g, "íng");
		pinconv = pinconv.replace(/ing3/g, "ǐng");
		pinconv = pinconv.replace(/ing4/g, "ìng");
		pinconv = pinconv.replace(/ing5/g, "ing");

		pinconv = pinconv.replace(/o1/g, "ō");
		pinconv = pinconv.replace(/o2/g, "ó");
		pinconv = pinconv.replace(/o3/g, "ǒ");
		pinconv = pinconv.replace(/o4/g, "ò");
		pinconv = pinconv.replace(/o5/g, "o");
		pinconv = pinconv.replace(/ou1/g, "ōu");
		pinconv = pinconv.replace(/ou2/g, "óu");
		pinconv = pinconv.replace(/ou3/g, "ǒu");
		pinconv = pinconv.replace(/ou4/g, "òu");
		pinconv = pinconv.replace(/ou5/g, "ou");
		pinconv = pinconv.replace(/ong1/g, "ōng");
		pinconv = pinconv.replace(/ong2/g, "óng");
		pinconv = pinconv.replace(/ong3/g, "ǒng");
		pinconv = pinconv.replace(/ong4/g, "òng");
		pinconv = pinconv.replace(/ong5/g, "ong");
		
		pinconv = pinconv.replace(/u1/g, "ū");
		pinconv = pinconv.replace(/u2/g, "ú");
		pinconv = pinconv.replace(/u3/g, "ǔ");
		pinconv = pinconv.replace(/u4/g, "ù");
		pinconv = pinconv.replace(/u5/g, "u");
		pinconv = pinconv.replace(/ue1/g, "ūe");
		pinconv = pinconv.replace(/ue2/g, "úe");
		pinconv = pinconv.replace(/ue3/g, "ǔe");
		pinconv = pinconv.replace(/ue4/g, "ùe");
		pinconv = pinconv.replace(/ue5/g, "ue");
		pinconv = pinconv.replace(/ui1/g, "ūi");
		pinconv = pinconv.replace(/ui2/g, "úi");
		pinconv = pinconv.replace(/ui3/g, "ǔi");
		pinconv = pinconv.replace(/ui4/g, "ùi");
		pinconv = pinconv.replace(/ui5/g, "uie");
		pinconv = pinconv.replace(/un1/g, "ūn");
		pinconv = pinconv.replace(/un2/g, "ún");
		pinconv = pinconv.replace(/un3/g, "ǔn");
		pinconv = pinconv.replace(/un4/g, "ùn");
		pinconv = pinconv.replace(/un5/g, "un");

  return pinconv;

}


function update_row_edit(myrow) {
  var newvalue = document.edit_form.row_edit.value;
  var thisrow = document.getElementById(myrow);
  thisrow.innerHTML = newvalue.replace(/\'/,"&apos;");
  row_under_editing = 0;
  return false;
}
function edit_row_num(num) {
  if (row_under_editing != 0) { update_row_edit("row_"+row_under_editing); }
  var numrow = "row_"+num;
  row_under_editing = num;
  var thisrow = document.getElementById(numrow);
  var newtextvalue = thisrow.innerHTML;
  var thisrowform = '<form name="edit_form" action="" method="POST" onsubmit="update_row_edit(\''+numrow+'\');return false;"><input type="text" name="row_edit" class="'+numrow+'" value="'+newtextvalue+'" /></form>';
  if (thisrow.innerHTML.indexOf("update_row_edit") > 0)  {} else {
    thisrow.innerHTML = thisrowform;
    document.edit_form.row_edit.select();
  }
  return true;
}
function remember_sentence(thisobj,sentence_id) {
  if (object_under_editing_permitted_to_update == 1) {
    object_under_editing = thisobj;  
    object_under_editing_id = sentence_id;  
  }
}





// Comment Editing and Deletion Can Be Stuffed in Here Too
var editing_comment = 0;
function edit_comment(comment_id) {
  if (editing_comment == 1) { return; }
  editing_comment = 1;
  existing_obj = $("#comment_text_"+comment_id);
  existing_value = document.getElementById("comment_text_"+comment_id).innerHTML;
  var ourReplacementHTML = '<div id="comment_text_'+comment_id+'" class="comment_text"><textarea id="adso_new_editing_textarea" rows="10" cols="60">'+convertforediting(existing_value)+'</textarea><div><input type="button" value="SAVE" class="saveButton" /><input type="hidden" value="CANCEL" class="cancelButton" /></div></div>';
  $("#comment_text_"+comment_id).after(ourReplacementHTML).remove();
  $('.saveButton').click(function(){

    var txx = $(this).parent().siblings(0).val();
    editing_comment = 0;
    document.getElementById("comment_text_"+comment_id).innerHTML = convertfromediting(txx);
    $.post("/updates/editComment",{
      comment_id: comment_id,
      value: txx
    },function(txt){
    });
  });
}
function delete_comment(comment_id) {
  var answer = confirm("Delete this Comment?")
  if (answer){
    $("#comment_"+comment_id).hide();
    $.post("/updates/deleteComment",{
      comment_id: comment_id
    },function(txt) {
    });
  }
}
function convertforediting(tx) {
  tx = tx.replace(/<p><\/p>/g, "\n");
  return tx;
}

function convertfromediting(tx) {
  tx = tx.replace(/\n\n/g, "<p></p>");
  return tx;
}



