// Fastorq Boltcalc Website Javascript Functions
// version 1.0  10/15/2007
// Glenn Manuel  gemdancer@fastem.com


// Global variables to remember values between 
// displaying the input box and saving the values.

var g_changed_element_id = "";
var g_changed_element = "";
var g_is_integer = 0;
var g_refresh_page = 0;

function kfactor_set(base_name, data_source) {
  // Sets the K Factor value via manual input 
  // or from the selection list.

  if ( ! document.getElementById ) {
    return;
  }

  if ( data_source == 'manual') {
    var text_element = document.getElementById(base_name + "_value_text");
    input_length(base_name, 1, 0, 0);
    
  } else { // use selected list value
    
    var value_element = document.getElementById(base_name + "_value");
    var text_element = document.getElementById(base_name + "_text");
    var list_element = document.getElementById(base_name + "_list");
    var sel_value = list_element.options[list_element.selectedIndex].value;
    var ii = sel_value.indexOf("_");
    if ( ii > 0 ) {
      value_element.value = sel_value.substring(ii+ 1);
      text_element.innerHTML = value_element.value;
    }
  }
} // kfactor_set


function radio_selected(radio_group)
{
   for (ii = 0; ii< radio_group.length; ii++) {
      if (radio_group[ii].checked) {
         return ii;
      }
   }
   // If none selected, return -1
   return -1;
} // radio_selected


function set_known_value(value_name){
  var radio_group;
  var ii;
  radio_group = document.form1.known_param;
  for (ii = 0; ii < radio_group.length; ii++){
    if ( radio_group[ii].value == value_name ) {
      radio_group[ii].checked = "checked";
    }
  }
} // set_known_value


function clear_inout_parms(){
  // Clears the value and text value of all
  // inout parameters except the checked one.
  if ( ! document.getElementById ) {
    return;
  }
  var radio_group;
  var ii;
  var value_name;
  var temp_name;
  var doc_element;
  radio_group = document.form1.known_param;
  for (ii = 0; ii < radio_group.length; ii++){
    if ( ! radio_group[ii].checked) {
      value_name = radio_group[ii].value;
      temp_name = value_name + "_text";
      doc_element = document.getElementById(temp_name);
      if (doc_element) {
        doc_element.innerHTML = "";
      }
      temp_name = value_name + "_value";
      doc_element = document.getElementById(temp_name);
      if (doc_element) {
        doc_element.value = "";
      }
    }
  } // for
}

function dec_frac(num){
	// Converts a number in 16ths of an inch 
	// to a string consisting of whole numbers and a fraction
	var whole, wholenumber, remain, fraction;
	
	if (unit_type == "Metric") {
		return num;
	}
	num = parseInt(num);
	if (num >= 16) {
		whole = parseInt(num / 16);
		remain = parseInt(num - (whole * 16));
	} else {
		whole = 0;
		remain = num;
	}

	fraction = "";
	if (remain > 0) {
		switch (remain) {
	   	case 1: fraction = "1/16"; break;
	   	case 2: fraction = "1/8"; break;
	   	case 3: fraction = "3/16"; break;
	   	case 4: fraction = "1/4"; break;
	   	case 5: fraction = "5/16"; break;
	   	case 6: fraction = "3/8"; break;
	   	case 7: fraction = "7/16"; break;
	   	case 8: fraction = "1/2"; break;
	   	case 9: fraction = "9/16"; break;
	   	case 10: fraction = "5/8"; break;
	   	case 11: fraction = "11/16"; break;
	   	case 12: fraction = "3/4"; break;
	   	case 13: fraction = "13/16"; break;
	   	case 14: fraction = "7/8"; break;
	   	case 15: fraction = "15/16"; break;
	   }
	}
	if ( whole == 0 ){
	  return fraction;
	} else if ( fraction == "" ) {
	   return new String(whole);
	} else {
    return whole + " " + fraction
  }
} // dec_frac


function input_length(in_box_id, min_max, len_unit, is_integer){
  
  if ( ! document.getElementById ) {
    return;
  }

  var old_value = "";
  var whole = "";
  var frac = "";
  var frac_radio = "";
  var min = 0;
  var max = 0;
  var div_input = "";
  var div_input_label = "";
  var isize = 0;
  var ii = 0;
  var temp = -1;
  var label = "";
  
  // Set global variables from supplied parameters.
  g_changed_element_id = in_box_id;
  g_changed_element = document.getElementById(in_box_id + "_value");
  g_is_integer = is_integer;
  g_refresh_page = 1;
  if ( document.getElementById(in_box_id + "_refresh") ) {
    g_refresh_page = document.getElementById(in_box_id + "_refresh").value;
  }
  if ( document.getElementById(in_box_id + "_label") ) {
    label = document.getElementById(in_box_id + "_label").value;
  }
  old_value = g_changed_element.value;
  if ( is_integer ){
    old_value = Math.round(g_changed_element.value);
  }
  document.form1.inches_input_err.style.visibility = "hidden";
  document.form1.input_num_err.style.visibility = "hidden";

  // English length units
  if ( (len_unit == 1) && unit_type == "English" ) {
    // Get whole inches and fraction of inch. Value is in 16ths of an inch.
    if (old_value < 16) { 
      whole = 0; 
      frac = old_value;
    } else {
      whole = Math.floor(old_value / 16);
      frac = old_value - ( whole * 16);
    }
    document.form1.input_inches.value = whole;
    if (frac > 0) {
      frac_radio = document.form1.fraction;
      frac_radio[0].checked = false;
      frac_radio[frac].checked = true;
    }
    // Get Min and Max values, if specified
    if ( min_max == 1 
         && document.getElementById(in_box_id + "_min") 
         && document.getElementById(in_box_id + "_max")) {
      temp = document.getElementById(in_box_id + "_min").value;
      document.form1.inches_min.value = temp;
      if ( temp >= 0) {
        document.form1.inches_min_text.value = dec_frac(temp);
      }
      temp = document.getElementById(in_box_id + "_max").value;
      document.form1.inches_max.value = temp;
      if ( temp >= 0) {
        document.form1.inches_max_text.value = dec_frac(temp);
      }
      document.getElementById("inches_minmax").style.visibility = "visible";
    } else {
      document.getElementById("inches_minmax").style.visibility = "hidden"   ;   
    }
  
    // Positon the input box near the center of the screen
    div_input = document.getElementById("div_input_inches");
    div_input_label = document.getElementById("input_inches_label");
    if ( div_input_label ) {
      div_input_label.innerHTML = label + ":";
    }
    isize = div_input.style.width
    ii = isize.indexOf("px");
    if ( ii > 0 ) {
      isize = (parseInt(isize.substring(0, ii)) / 2)
    } else {
      isize = 250
    }
	  div_input.style.left = ((screen.availWidth / 2) - isize) + "px";

    isize = div_input.style.height
    ii = isize.indexOf("px");
    if ( ii > 0 ) {
      isize = (parseInt(isize.substring(0, ii)) / 2)
    } else {
      isize = 100
    }
	  div_input.style.top = ((screen.availHeight / 2) - isize) + "px";
    div_input.style.visibility = "visible";
    document.form1.input_inches.focus();

  } else {  // Other Units
    // Get Min and Max values, if specified
    if ( min_max == 1 
         && document.getElementById(in_box_id + "_min")
         && document.getElementById(in_box_id + "_max")) {
      temp = document.getElementById(in_box_id + "_min").value;
      document.form1.input_num_min.value = temp;
      if ( temp >= 0) {
        document.form1.input_num_min_text.value = temp;
      }
      temp = document.getElementById(in_box_id + "_max").value;
      document.form1.input_num_max.value = temp;
      if ( temp >= 0) {
        document.form1.input_num_max_text.value = temp;
      }
      document.getElementById("input_num_minmax").style.visibility = "visible";
    } else {
      document.getElementById("input_num_minmax").style.visibility = "hidden";    
    }
    old_value = document.getElementById(g_changed_element_id + "_text").innerHTML;
    document.form1.input_num.value = old_value;
    div_input = document.getElementById("div_input_number");
    div_input_label = document.getElementById("input_num_label");
    if ( div_input_label ) {
      div_input_label.innerHTML = label + ":";
    }
    
    // Position the input box near the center of the screen
    isize = div_input.style.width
    ii = isize.indexOf("px");
    if ( ii > 0 ) {
      isize = (parseInt(isize.substring(0, ii)) / 2)
    } else {
      isize = 250
    }
	  div_input.style.left = ((screen.availWidth / 2) - isize) + "px";

    isize = div_input.style.height
    ii = isize.indexOf("px");
    if ( ii > 0 ) {
      isize = (parseInt(isize.substring(0, ii)) / 2)
    } else {
      isize = 100
    }
	  div_input.style.top = ((screen.availHeight / 2) - isize) + "px";
    div_input.style.visibility = "visible";
    document.form1.input_num.focus();
  }
	hide_show_selection_lists("hidden");
} // input_length


function save_number(){
  
  if ( ! document.getElementById ) {
    return;
  }

  var div_input = "";
  var err_obj = "";
  var input_txt = "";
  var fraction = "";
  var fraction_index = -1;
  var new_value = "";
  var regex_int = /^\d+$/
  var regex_dec = /^\d*\.?\d*$/

  // Clear the error message
  err_obj = document.form1.input_num_err;
  err_obj.value = "";
  err_obj.style.visibility = "hidden";
  
  input_txt = document.getElementById("input_num").value;
  //alert("Element=|" + g_changed_element_id + "|, MM=|" + input_txt + "|, MinMax=|" + document.getElementById("input_num_minmax").style.visibility + ", Min=|" + document.form1.input_num_min.value + "|, Max=|" + document.form1.input_num_max.value + "|"); //%%%

  if ( input_txt == "") { 
    //%%% input_txt = 0;
  }

  // Check for valid number
  if ( g_is_integer == 1 ) {
    if ( ! regex_int.test(input_txt) ) {
      err_obj.value = "Invalid integer";
      err_obj.style.visibility = "visible";
      return;
    }
  } else {
    if ( ! regex_dec.test(input_txt) || input_txt == "." ) {
      err_obj.value = "Invalid decimal number";
      err_obj.style.visibility = "visible";
      return;
    }
  }
  input_txt = input_txt * 1.0;  // convert to number

  // Check for min/max values
  if (document.getElementById("input_num_minmax").style.visibility = "visible" ){
    if ( (document.form1.input_num_min.value >= 0 && 
          input_txt < document.form1.input_num_min.value) || 
         (document.form1.input_num_max.value >= 0 && 
          input_txt > document.form1.input_num_max.value) ) {
        err_obj.value = "Value is out of range";
        err_obj.style.visibility = "visible";
        return;
    }
  }
  g_changed_element.value = input_txt;
  document.getElementById(g_changed_element_id + "_text").innerHTML = input_txt;
  document.getElementById("input_num_minmax").style.visibility = "hidden";
  err_obj.style.visibility = "hidden";
  div_input = document.getElementById("div_input_number");
  div_input.style.visibility = "hidden";

  hide_show_selection_lists("visible");
  set_known_value(g_changed_element_id);
  clear_inout_parms();
  if ( g_refresh_page == 1 ) {
    post_form(g_changed_element_id + "_change");
  }
} // save_number


function save_length(){
  
  if ( ! document.getElementById ) {
    return;
  }

  var div_input = "";
  var err_obj = "";
  var input_txt = "";
  var fraction = "";
  var fraction_index = -1;
  var new_value = "";
  var regex_int = /^\d+$/

  err_obj = document.form1.inches_input_err;
  
  // If English units, get fractions of an inch
  if ( unit_type == "English" ) {
    // Clear the error message
    err_obj.value = "";
    err_obj.style.visibility = "hidden";
    
    input_txt = document.getElementById("input_inches").value;
    fraction = document.form1.fraction;
    fraction_index = radio_selected(fraction);
    
    if ( input_txt == "") { 
      input_txt = "0";
    }
    
    if ( ! regex_int.test(input_txt) ) {
      err_obj.value = "Invalid integer";
      err_obj.style.visibility = "visible";
      return;
    }
    
    new_value = (input_txt * 16) + fraction_index;
    
    // Check for valid integer
    // Check for min/max values
    if (document.getElementById("inches_minmax").style.visibility = "visible" ){
      if ( (document.form1.inches_min.value >= 0 && 
            new_value < document.form1.inches_min.value) || 
           (document.form1.inches_max.value >= 0 && 
            new_value > document.form1.inches_max.value) ) {
          err_obj.value = "Value is out of range";
          err_obj.style.visibility = "visible";
          return;
      }
    }
  
    g_changed_element.value = new_value
    document.getElementById(g_changed_element_id + "_text").innerHTML = dec_frac(new_value);
    document.getElementById("inches_minmax").style.visibility = "hidden";
    err_obj.style.visibility = "hidden";
    div_input = document.getElementById("div_input_inches");
    div_input.style.visibility = "hidden";

    set_known_value(g_changed_element_id);
    hide_show_selection_lists("visible");
    clear_inout_parms();
    if ( g_refresh_page == 1 ) {
      post_form(g_changed_element_id + "_change");
    }
  }
  // Metric units
  else {
    save_number();
  }
} // save_length


function cancel_input(){
  
  if ( ! document.getElementById ) {
    return;
  }

  g_changed_element_id = "";
  g_changed_element = "";
  document.getElementById("inches_minmax").style.visibility = "hidden"
  document.getElementById("input_num_minmax").style.visibility = "hidden"
  document.form1.inches_input_err.style.visibility = "hidden";
  document.form1.input_num_err.style.visibility = "hidden";
  document.getElementById("div_input_inches").style.visibility = "hidden";
  document.getElementById("div_input_number").style.visibility = "hidden";
	hide_show_selection_lists("visible");
} // cancel_input


function hide_show_selection_lists(visibility) {
  
  if ( ! document.getElementById ) {
    return;
  }

  var sels, ii, iimax;
  // Hide all selection lists so they won't "show through" error or input divs,
  // or make them visible after closing div.
	sels = document.getElementsByTagName("select");
	iimax = sels.length;
	for (ii=0; ii < iimax; ii++){
    sels[ii].style.visibility= visibility;
  }
} // hide_show_selection_lists


function display_errors(num_errors){
  
  if ( ! document.getElementById ) {
    return;
  }

   var diverr = document.getElementById("div_error_msgs");
   var ii = 0;
   var isize = 0;
   
	if (num_errors == "0") {
		diverr.style.visibility = "hidden";
	} else {
      isize = diverr.style.width;
      ii = isize.indexOf("px");
      if ( ii > 0 ) {
         isize = parseInt(isize.substring(0, ii)) / 2;
      } else {
         isize = 250;
      }
		diverr.style.left = ((screen.availWidth / 2) - isize ) + "px";
		diverr.style.top = ((screen.availHeight / 2) - 200) + "px";
		diverr.style.visibility = "visible";
		hide_show_selection_lists("hidden");
	}
} // display_errors


function cancel_error(){
  
  if ( ! document.getElementById ) {
    return;
  }

  document.getElementById("div_error_msgs").style.visibility = "hidden";
	hide_show_selection_lists("visible");
} // cancel_error


function drag_input_inch(evt){
  drag_obj(evt, "div_input_inches")
}

function drag_input_num(evt){
  drag_obj(evt, "div_input_number")
}

function drag_err_window(evt){
  drag_obj(evt, "div_error_msgs")
}

function drag_obj(evt, obj_name){
  // Drags an object along with the mouse.
  var obj = "";

  if ( ! document.getElementById ) {
    return;
  }

  //evt = (evt) ? evt : ((window.event) ? window.event : "");
  if ( ! evt ){ evt = window.event; }
  if ( ! evt ){
     //alert("Cannot get event");
     return;
  }

  if ( evt.target ){
     obj = evt.target;
  } else if ( evt.srcElement ) {
     obj = evt.srcElement;
  } else {
     //alert("Cannot get object");
     return;
  }

  obj = document.getElementById(obj_name);
  if ( obj ) {
    if ( evt ) {
       if ( evt.clientX) {
          obj.style.left = evt.clientX - 15 + "px";
          obj.style.top = evt.clientY - 15 + "px";
       } else {
          obj.style.left = evt.pageX - 15 + "px";
          obj.style.top = evt.pageY - 15 + "px";
       }
    }
  }
}

function scroll_save(objdiv){
  if ( ! document.getElementById ) {
    return;
  }

   // Save div scroll value in hidden control xxx_pos.
   if ( document.getElementById ) {
      var objpos = document.getElementById(objdiv.id + "_pos");
      if ( objpos != null && objpos != undefined ) {
         objpos.value = objdiv.scrollTop;
      }
   }
} // scroll_save


function scroll_restore(){
  if ( ! document.getElementById ) {
    return;
  }

   // Scroll div_scroll to positon saved in div_scroll_pos hidden control.

   // Quit if browser does not have sufficient DOM support
   if ( ! document.getElementById ) {
      return;
   }
   
   var divobj = document.getElementById("div_scroll");
   var posobj = document.getElementById("div_scroll_pos");
   if ( divobj != null && divobj != undefined && posobj != null && posobj != undefined) {
      if (posobj.value >= 0) {
        divobj.scrollTop = posobj.value;
      }
   }  // if objpos
} // scroll_restore


function addEvent(elm, evType, fn, useCapture) {
  // Adds an event to an element.
  if (elm.addEventListener) 
	{
	 /// alert("addEventListener");
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
	 /// alert("attachEvent");
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType] = fn;
	}
}	


function deleteEvent(elm, evType, fn, useCapture) {
  // Deletes an event from an element.
  if (elm.removeEventListener) 
	{
	 //alert("removeEventListener");
		elm.removeEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.detachEvent) {
	 //alert("detachEvent");
		var r = elm.detachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType] = undefined;
	}
}	


function handleReturnKeyEvent(e) {
  // Handles RETURN keypress events
  // for the popup data entry windows and the document.
  // Reference: http://www.quirksmode.org/js/introevents.html
  if(e == null) { e = window.event; }

  if( e.keyCode == 13 )
  {
	  if( e.preventDefault ){ e.preventDefault(); }
  
	  if( e.stopPropagation ){ e.stopPropagation(); }
		
	  e.cancelBubble = true;
	  e.returnValue = false;
			
    try{
      if ( document.getElementById ) {
  		  if ( document.getElementById("div_input_inches").style.visibility == "visible" ) {
  		     save_length();          
        } else if ( document.getElementById("div_input_number").style.visibility == "visible" ) {
            save_number();
        } else { 
          ///%%% force button press %%% post_form("calculate"); 
        }
      }
	  } 
		catch(e){}
			
	  return false;
  } // if ( e.keycode == 13 )
}
