
var submitInProgress = false;
var isNetscape = (navigator.appName == "Netscape");

function confirmSubmit(prompt) {
  if (submitInProgress) {
    return false;
  }
  else {
    return confirm(prompt);
  }
}

function getSpaces(numberOfSpaces)
{
  var returnString ="&nbsp;";
  for (var i=0; i < numberOfSpaces; i++)
  {
    returnString = returnString + "&nbsp;"
  }
  return returnString;
}

function setClassName(idName,requiredField)
{
  var elt = document.forms[0].getElementsByTagName("span");
  //alert(num.length + " num " );
  for (var i=0; i < elt.length; i++)
  {
    var idNameTemp = elt[i].getAttribute("id");
    if (idNameTemp != "" )
    {
       for (var j=0; j < elt.length; j++)
       {
           if (idName == idNameTemp)
           {
             if (requiredField == true)
             {
               elt[i].className = "requiredField";
             }
             else
             {
               elt[i].className="fieldlabel";
             }
           j = elt.length + 1;
           } // if idName == idNameTemp
       } //for j =0;
    } // if idNameTemp != ""
  } //end of for i=0 ;
} //end of function

// Returns true if the string contains only &nbsp; values
function isAllNBSP(s)
{
  for( i=0; i < s.length; i++ )
  {
    if( s.charCodeAt(i) != 160 )
      return false;
  }
  return true;
}

function isNumericKey(event) {
  var key = (navigator.appName == 'Netscape' ? event.which : event.keyCode);
  return ((key >= 48) && (key <= 57));
}

function convertToUpper(field) {
  if (field.value) {
    field.value = field.value.toUpperCase();
  }
}

function saveForm(formOrName) {
  submitAction("save", formOrName);
}

function checkChanges() {
  // check for any changes
  return true;
}

function checkKey(event) {
  // TODO
}

function reset(formOrName) {
  // prompt if changes have been made
  var form = _getForm(formOrName);
  if (form) {
    form.reset();
  }
}

function pad2(number) { 
  return (number < 10 ? '0' + number : number); 
}

function formatDecimal(x, nplaces) {
  if (nplaces == null) {
    nplaces = 2;
  }
  var str = "" + Math.round(x * Math.pow(10, nplaces));
  // pad small values
  while (str.length <= nplaces) {
    str = "0" + str;
  }
  var point = str.length - nplaces;
  return str.substring(0, point) + "." + str.substring(point, str.length);
}

function formatCurrency(c) {
  return "$" + formatDecimal(c, 2);
}

function formatDateTime(dt) {
  if ((dt == null) || (typeof dt.getYear != 'function')) {
    return '';
  }
  var yr = dt.getFullYear();

  if (yr == 1969) {
    return '';
  }
  var hr = dt.getHours();
  var min = dt.getMinutes();
  var ampm = (hr >= 12 ? "PM" : "AM");
  if (hr == 0) {
    hr = 12;
  }
  else if (hr > 12) {
    hr = hr - 12;
  }
  var month = dt.getMonth() + 1;
  return (month+'/'+dt.getDate()+'/'+yr+' '+pad2(hr)+':'+pad2(min)+ampm); 
}

function submitAction(action, formOrName) {
  var form = _getForm(formOrName);
if (form) {
    if (submitInProgress) {
      return;
    }
    submitInProgress = true;
    setFormField("imp_action", action, formOrName);
    form.submit();
  }
  else {
    alert("submitAction, no form: "+formOrName);
  }
}

// NOTE: this is an internal function, hence the underscore
function _getForm(formOrName) {
  var form;
  if (typeof formOrName == 'string') {
    form = document.forms[formOrName];
  } 
  else {
    form = formOrName;
  }
  if (!form) {
    // default to first form if name is not supplied
    form = document.forms[0];
  }
  return form;
}

function getFormElement(fieldName, formOrName) {
  var form = _getForm(formOrName);
  return (form == null ? null : form.elements[fieldName]);
}


function getFormFieldText(fieldName, formOrName) {
  var field = getFormElement(fieldName, formOrName);
  if (field != null) {
    if (field.type == "select-one") {
      var idx = field.selectedIndex;
      return (idx < 0 ? '' : field.options[idx].text);
    }
    // NOTE: need to handle other types here!
//      if (field.type == "text") 
//      {
//        return field.value;
//      }
    alert("getFormFieldText--Does not support attribute element named "+fieldName);
    return "";
 } // field !=  null
}


function getFormField(fieldName, formOrName) {
  var field = getFormElement(fieldName, formOrName);
  if (field != null) {
    if (field.type == "select-one") {
      var idx = field.selectedIndex;
      return (idx < 0 ? '' : field.options[idx].value);
    }
    // NOTE: need to handle other types here!
//      if (field.type == "text") 
//      {
//        return field.value;
//      }
    return field.value;
  }
  else {
    alert("getFormField: No element named "+fieldName);
  }
  return "";
}  


function setFormField(fieldName, value, formOrName) {
  var field = getFormElement(fieldName, formOrName);

// alert(fieldName + " = " + value + " field = " + field );

  if (field) {
    if (field.type == "select-one") {
      for (var i = 0; i < field.options.length; i++) {
        var op = field.options[i];
        op.selected = (op.value == value);
      }
    }
    else {
      field.value = value;
    }
  }
  else {
    alert("setFormField: No field named "+fieldName);
  }
}

function setZeroIfNull(fieldName, formOrName){
	var field = getFormElement(fieldName, formOrName);
	var fieldValue = field.value;
	if (field.value == "")
	{
		fieldValue = 0;
	}

	return fieldValue;
}

function setFocus(fieldName, formOrName) {
  var f = getFormElement(fieldName, formOrName);
  if (f && f.focus) {
    f.focus();
    //f.select();
  }
  else {
    //alert("setFocus: No field named "+fieldName);
  }
}

function writeLayer(layerID,txt){
            if(document.getElementById){
                  document.getElementById(layerID).innerHTML=txt;
            }else if(document.all){
                  document.all[layerID].innerHTML=txt;
            }else if(document.layers){
                  with(document.layers[layerID].document){
                        open();
                        write(txt);
                        close();
                  }
            }
}

function checkInteger(fieldName, promptName, formOrName) {
  var elt = getFormElement(fieldName, formOrName);

  if (elt == null) {
    return true;
  }
  var val = elt.value;
  if (val == "") {
    return true;
  }
  var n = parseInt(val);
  if (isNaN(n)) {
	elt.value="";
    alert(promptName + " must be a number");
  }
  else {
    return true;
  }
}

//Added by Jaani to remove "0" from textfields on click. Otherwise too annoying for user
function clearFieldIfZero(fieldName, formOrName){
	 var elt = getFormElement(fieldName, formOrName);
	  if (elt.value == 0)
		elt.value="";
}

function check_num(obj){
	if (!parseInt(obj.value, 10)){
		if ((obj.value==0) || (obj.value==""))
		{
			return false;
		} else{
		alert("This field only accepts numbers. Please try again.");
		obj.value="";
		}
	}
	else 
		obj.value = ''+ parseInt(obj.value, 10);
	
}

function check_floatNum(obj){
	if (!parseFloat(obj.value)){
		if ((obj.value==0) || (obj.value==""))
		{
			return false;
		} else{
		alert("This field only accepts numbers. Please try again.");
		obj.value="";
		}
	}
	else 
		obj.value = ''+ parseFloat(obj.value);
	
}


// Validates the input field with the given name against the standard MM/DD/YY format. 
// If a blank date is acceptable, '' should be passed in as nullDate.
function checkDate(fieldName, promptName, nullDate, formOrName, showAlert) {
  var elt = getFormElement(fieldName, formOrName);
  if (elt == null) {
    return true;
  }
  if (showAlert == null) {
    showAlert = true;
  }
  var val = elt.value;
  var reg = /\b(1[0-2]|0?[1-9])[\-\/](0?[1-9]|[12][0-9]|3[01])[\-\/](\d{2})\b/
  
  if (reg.test(val)) {
    return true;
  }
  else {
    // null date with matching value or blank value is ok
    if ((nullDate != null) && ((nullDate == val) || isBlank(val))) {
      return true;
    }
    if (showAlert) {
      alert("Incorrect format ("+val+") for " + promptName + " (must be MM/DD/YY)");
    }
    return false;
  }
}

function isBlank(s) {
  if ((s == null) || (s == "")) {
    return true;
  }
  if (typeof s != 'string') {
    return false;
  }
  for (i = 0; i < s.length; i++) {
    if (s.charAt(i) != ' ') {
      return false;
    }
  }
  return true;
}

function notBlank(s) {
  return !isBlank(s);
}

function isBlankField(fieldName, formOrName) {
  var elt = getFormElement(fieldName, formOrName);
  return ((elt != null) && isBlank(getFormField(fieldName, formOrName)));
}

// Returns true if either the given form field doesn't
// exist, or is not empty.
function notBlankField(fieldName, formOrName) {
  var elt = getFormElement(fieldName, formOrName);
  return ((elt == null) || notBlank(getFormField(fieldName, formOrName)));
}


// Checkbox onClick handler, to be used in conjunction with Jsp.checkbox
function toggleCheckbox(event, boxName, checked, editable) {
  var eltName = boxName + '_chk';
  var elt = getFormElement(eltName);
  if (editable) {
    // set the hidden field
    setFormField(boxName, (elt.checked ? 'Y' : 'N'));
    if (typeof changeField == 'function') {
      changeField(event, boxName);
    }
  }
  else {
    // reset to original value
    elt.checked = checked;
  }
}

function isChecked(fieldName, formOrName) {
  return (getFormField(fieldName, formOrName) == 'Y');
}

function endsWith(str1, str2) {
  var m = str1.length;
  var n = str2.length;
  return (str1.substr(m - n) == str2);
}

function setCheckboxImage(boxName, checked) {
  var imgName = boxName + '_chk';
  var img = document.images[imgName];
  var src = img.src;
  var idx = src.lastIndexOf('_');
  var base = src.substring(0, idx);
  // set the hidden field
  setFormField(boxName, (checked ? 'Y' : 'N'));
  // change the image
  img.src = base + (checked ? '_on.gif' : '_off.gif');
}


// CheckboxImage onClick handler, to be used in conjunction with Jsp.checkboxImage
function toggleCheckboxImage(event, boxName, checked, editable) {
  var imgName = boxName + '_chk';
  var img = document.images[imgName];
  if (editable) {
    var src = img.src;
    var checked = endsWith(src, '_on.gif');
    // set the hidden field
    setFormField(boxName, (checked ? 'N' : 'Y'));
    // change the image
    if (checked) {
      src = src.substring(0, src.length-7) + '_off.gif';
    }
    else {
      src = src.substring(0, src.length-8) + '_on.gif';
    }
    img.src = src;
//alert("changeField="+changeField);
    if (typeof changeField == 'function') {
      changeField(event, boxName);
    }
  }
}

function input(editable, name, value, size) {
  if (editable) {
    return "<input name='"+name+"' value='"+value+"' size="+size+" onChange='changeField(event,\""+name+"\")'>";
  }
  else {
    return nbspace(value);
  }  
}

function emptyOptionList(width, size) {
  var answer = '';
  var s = '';
  for (var i = 0; i < width; i++) {
    s += '&nbsp;';
  }
  var opt = option(s, ' ', null);
  for (var i = 0; i < size; i++) {
    answer += opt;
  }
  return answer;
}

function option(opt, val, sel) {
  return "<option value='"+val+"' "+(val == sel ? "selected" : "")+">"+opt+"</option>";
}

function optionList(options, vals, val, includeBlank) {
  var answer = '';
  if (options != null)
  {
  var n = options.length;
  if (includeBlank == true) {
    answer += option("&nbsp;", " ", null);
  }
  for (var i = 0; i < n; i++) {
    answer += option(options[i],vals[i],val);
  }
 }
 else
 {
    answer += option("&nbsp;", " ", null);
 }
  return answer;
} 

function nbspace(val) {
  return (isBlank(val) ? '&nbsp;' : val);
}

function extractOptionText(optionList, value) {
  var optStart = "<option value='"+value+"' selected>";
  var m = optionList.indexOf(optStart);
  if (m != -1) {
    var optEnd = "</option>";
    var n = optionList.indexOf(optEnd, m);
    if (n != -1) {
      return optionList.substring(m+optStart.length, n);
    }
  }
  return value;
}

function select(editable, name, value, optionList, attrs, onChange) {
  if (editable) {
    if (onChange == null) {
      onChange = 'changeField(event, "'+name+'")';
    }
    return "<select name='"+name+"' "+attrs+" onChange='"+onChange+"'> "+optionList+"</select>";
  }
  else {
    return nbspace(extractOptionText(optionList, value));
  }
}

function smallButton(visible, label, msg, onClick) {
  return "<span class='tinyheader'><input type='button' value='" + label + 
    "' onMouseOver='status=\"" + msg + "\"' onClick='"+onClick+"'></span>";
}

function tooltipLink(visible, val, method, msg) {
  if (!visible) {
    return "";
  }
  if ((val == null) || (val == '')) {
    return '&nbsp;';
  }
  var s = "<a href='javascript:void(null)' ";
  s += "onMouseOver='showTip(event, \""+msg+"\"); return true;' ";
  s += "onMouseOut='hideTip()' ";
  s += "onClick='" + method + "; return false'";
  s += ">" + val + "</a>";
  return s;
}

function link(visible, val, method, msg) {
  if (!visible) {
    return "";
  }
  if ((val == null) || (val == '')) {
    return '&nbsp;';
  }
  var s = "<a href='javascript:void(null)' ";
  s += "onMouseOver='status=\""+ msg + "\"; return true;' ";
  s += "onMouseOut='status=\"\"' ";
  s += "onClick='" + method + "; return false'";
  s += ">" + val + "</a>";
  return s;
}


function imageLink(src, msg, onClick) {
  var answer = "<a href='javascript:void(null)' ";
  answer += "onMouseOver='status=\"" + msg + "\"; return true;' ";
  answer += "onMouseOut='status=\"\"' ";
  answer += "onClick='" + onClick + "' ";
  answer += "><image src='"+src+"' border=0>";
  answer += "</a>";
  return answer;
}

function checkboxImage(editable, label, name, cssClass, srcBase,  checked, attrs, onClick) {
  var checkboxName = name + "_chk";
  var src = (checked ? srcBase + "_on.gif" : srcBase + "_off.gif");
  var value = (checked ? "Y" : "N");
  var answer = '';
  if (editable) {
    if (onClick == null) {
      onClick = 'toggleCheckboxImage(event, "'+name+'",'+checked+','+editable+'); return false;';
    }
    answer += "<a href='javascript:void(null)' ";
    answer += "onMouseOver='status=\"Toggle value\"; return true;' ";
    answer += "onMouseOut='status=\"\"' ";
    answer += "onClick='" + onClick + "' ";
    answer += attrs;
    answer += ">";
  }
  answer += "<image name='"+checkboxName+"' src='"+src+"' border=0>";
  if (editable) {
    answer += "</a>";
  }
  if (!isBlank(label)) {
      answer += "<span class='" + cssClass + "'>" + nbspace(label) +"</span>";    
  }
  if (editable) {
    answer += hidden(name, value);
  }
  return answer;
}

function checkbox(editable, label, name, cssClass, checked, attrs, onClick) {
  if (onClick == null) {
    onClick = 'toggleCheckbox(event, "'+name+'",'+checked+','+editable+'); return false;';
  }
  var answer = '';
  var checkboxName = name + "_chk";
  var value = (checked ? "Y" : "N");

  answer += "<input type='checkbox' name='"+checkboxName+"'";
  answer += checked ? " checked " : " ";
  answer += "onClick='" + onClick + "' ";
  answer += attrs;
  answer += ">";
  answer += "<span class='";
  answer += cssClass;
  answer += "'>";
  answer += nbspace(label);
  answer += "</span>";    
  if (editable) {
    answer += hidden(name, value);
  }
  return answer;
}

function selectYN(canEdit, name, value, nonEditValue) {
   if (canEdit) {
    return "<select name='"+name+"' onChange='changeField(event,\""+name+"\")'>" +
           option('Y', value) + option('N', value) + "</select>";
    return 
  }
  else {
    return nonEditValue;
  }  
}

function hidden(name, value) {
    return "<input type='hidden' name='"+name+"' value='"+value+"'> ";
}

function clearList(eltName) {
  var elt = getFormElement(eltName);
  if (elt) {
    elt.length = 0;
  }
}

function loadListNamed(eltName, textList, valueList, includeBlank, selectedValue) {
  var elt = getFormElement(eltName);
  if (!elt) {
    alert("No list named "+eltName);
    return;
  }
  loadList(elt, textList, valueList, includeBlank, selectedValue);
}

function loadList(elt, textList, valueList, includeBlank, selectedValue) {
  if (textList == null) {
    elt.length= 0;
  }
  else {
    if (valueList == null) {
      valueList = textList;
    }

    var blankOffset = (includeBlank ? 1 : 0);
    elt.length = textList.length + blankOffset;
    if (includeBlank) {
      elt.options[0].text = "";
      elt.options[0].value = "";
      elt.options[0].selected = true;
    }
    for (var i = 0; i < textList.length; i++) {
      elt.options[i+blankOffset].text = textList[i];
      elt.options[i+blankOffset].value = valueList[i];
      elt.options[i+blankOffset].selected = (valueList[i] == selectedValue);
    }  
  }
}



function validateIntegerOrBlank(val) {
  if (isBlank(val) || (val == 'N/A')) {
    return true;
  }
  else {
    return validateInteger(val);
  }
}

function validateInteger(val) {
  var n = parseInt(val);
  return !isNaN(n);
}

function validateDateOrBlank(val) {
  if (isBlank(val) || (val == 'N/A')) {
    return true;
  }
  else {
    return validateDate(val);
  }
}

function validateNotBlank(val) {
  return !isBlank(val);
}

function validateDate(val) {
  var reg = /\b(1[0-2]|0?[1-9])[\-\/](0?[1-9]|[12][0-9]|3[01])[\-\/](\d{2})\b/  
  return reg.test(val);
}

function checkRequiredFields()
{
  var form = _getForm();
  var currElementName = "";
  // var num = document.forms[0].elements.length;
  var num = document.forms[0].getElementsByTagName("span");
  //alert(num.length + " num " );
  var elementName = "";
  for (var i=0; i < num.length; i++)
  {
    var idName = num[i].getAttribute("id");
    //  alert( " - " + "idName -  " + idName + " - ClassName -" + num[i].className);
    // alert ("length- "+ idName.indexOf('undefined') + " " + num[i].className.indexOf('required')); 
    if (idName.indexOf('id_') > -1 && idName != ""  && (num[i].className).indexOf('required') > -1)
    {
      currElementName = idName.substring(3,idName.length);
      if (isBlank(getFormField(currElementName)))
      {
       //alert(idName+".err");
       var errMsg = num[i].getAttribute(idName+".err");
       alert(errMsg);
      setFocus(currElementName);
      //(getFormElement[currElementName]).focus();
       // alert("All required fields have to be entered ");
	return false;
      }
    }
  }
  return true;
}

//
// 'fields' is an array of field specifications. Each spec
// has 3 elements: fieldName, validationFunction, message.
// The validationFunction is called with the value of the 
// form element, and should return a boolean. If false, the
// corresponding message will be displayed.
// This function returns true if all fields pass validation,
// otherwise false.
//
function validateFormFields(fields, allowBlanks, showAlert, formOrName) {
  if (showAlert == null) {
    showAlert = true;
  }
  for (var i = 0; i < fields.length; i++) {
    var spec = fields[i];
    if (spec == null) {
      alert("validateFormFields: invalid spec at index "+i);
    }
    var fieldName = spec[0]; 
    var elt = getFormElement(fieldName, formOrName);
    if (elt != null) {
      var val = getFormField(fieldName, formOrName);
      //alert ("elementName = " + elt.name + "val = " + val);
      if (!allowBlanks || !isBlank(val)) {
        var func = eval(spec[1]);
        if (typeof func != 'function') {
          alert('validateFormFields: '+spec[1]+' is not a function');
        }
        var message = spec[2];
        if (!func(val)) {
          if (showAlert) {
            alert(message);
          }
          return false;
        }
      }
    }
  }
  return true;
}

// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/

var MONTH_NAMES=new Array('January','February','March','April','May','June','July','August','September','October','November','December','Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
var DAY_NAMES=new Array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sun','Mon','Tue','Wed','Thu','Fri','Sat');
function LZ(x) {return(x<0||x>9?"":"0")+x}

function formatDate(date,format) {
	format=format+"";
	var result="";
	var i_format=0;
	var c="";
	var token="";
	var y=date.getYear()+"";
	var M=date.getMonth()+1;
	var d=date.getDate();
	var E=date.getDay();
	var H=date.getHours();
	var m=date.getMinutes();
	var s=date.getSeconds();
	var yyyy,yy,MMM,MM,dd,hh,h,mm,ss,ampm,HH,H,KK,K,kk,k;
	// Convert real date parts into formatted versions
	var value=new Object();
	if (y.length < 4) {y=""+(y-0+1900);}
	value["y"]=""+y;
	value["yyyy"]=y;
	value["yy"]=y.substring(2,4);
	value["M"]=M;
	value["MM"]=LZ(M);
	value["MMM"]=MONTH_NAMES[M-1];
	value["NNN"]=MONTH_NAMES[M+11];
	value["d"]=d;
	value["dd"]=LZ(d);
	value["E"]=DAY_NAMES[E+7];
	value["EE"]=DAY_NAMES[E];
	value["H"]=H;
	value["HH"]=LZ(H);
	if (H==0){value["h"]=12;}
	else if (H>12){value["h"]=H-12;}
	else {value["h"]=H;}
	value["hh"]=LZ(value["h"]);
	if (H>11){value["K"]=H-12;} else {value["K"]=H;}
	value["k"]=H+1;
	value["KK"]=LZ(value["K"]);
	value["kk"]=LZ(value["k"]);
	if (H > 11) { value["a"]="PM"; }
	else { value["a"]="AM"; }
	value["m"]=m;
	value["mm"]=LZ(m);
	value["s"]=s;
	value["ss"]=LZ(s);
	while (i_format < format.length) {
		c=format.charAt(i_format);
		token="";
		while ((format.charAt(i_format)==c) && (i_format < format.length)) {
			token += format.charAt(i_format++);
			}
		if (value[token] != null) { result=result + value[token]; }
		else { result=result + token; }
		}
	return result;
	}
