// Util.js
// Copyright (C) 2001-2003  Richard K. Schaffer
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

function setFocus(form, element) {
  for (i = 0; i < document.forms[form].elements.length; i++) {
    if (document.forms[form].elements[i].name == element) {
      document.forms[form].elements[i].focus();
      if (document.forms[form].elements[i].type == "text") document.forms[form].elements[i].select();
      break;
    }
  }
}
  
function isEmpty(v) {
  return (v == null) || (v.length == 0) || isWhitespace(v);
}

function isWhitespace(v) {
  var i, c;
  for (i = 0; i < v.length; i++) {
    c = v.charAt(i);
    if (!((c == ' ') || (c == '\t') || (c == '\n') || (c == '\r'))) return false;
  }
  return true;
}

function completeDate(v, rollyear) {
  var delim, s, y;
  if (isEmpty(v)) return '';
  if (v.indexOf('/') != -1) {
    s = v.split('/');
    delim = '/';
  }
  else if (v.indexOf('-') != -1) {
    s = v.split('-');
    delim = '-';
  }
  else if (v.length == 3) {
    s = new Array();
    s[0] = v.substr(0, 1);
    s[1] = v.substr(2, 2);
    s[2] = null;
    delim = '/';
  }
  else if (v.length == 4) {
    s = new Array();
    s[0] = v.substr(0, 2);
    s[1] = v.substr(2, 2);
    s[2] = null;
    delim = '/';
  }
  else if (v.length == 5) {
    s = new Array();
    s[0] = v.substr(0, 1);
    s[1] = v.substr(1, 2);
    s[2] = v.substr(3, 2);
    delim = '/';
  }
  else if (v.length == 6) {
    s = new Array();
    s[0] = v.substr(0, 2);
    s[1] = v.substr(2, 2);
    s[2] = v.substr(4, 2);
    delim = '/';
  }
  else if (v.length == 7) {
    s = new Array();
    s[0] = v.substr(0, 1);
    s[1] = v.substr(1, 2);
    s[2] = v.substr(3, 4);
    delim = '/';
  }
  else if (v.length == 8) {
    s = new Array();
    s[0] = v.substr(0, 2);
    s[1] = v.substr(2, 2);
    s[2] = v.substr(4, 4);
    delim = '/';
  }
  if (isEmpty(s[2])) {d = new Date(); s[2] = d.getFullYear()}
  else if (s[2].length == 2) {if (s[2] < ((rollyear == null) ? '50' : rollyear)) {s[2] = '20'+s[2]} else {s[2] = '19'+s[2]}};
  return s[0]+delim+s[1]+delim+s[2];
}

function formatDate(v) {
  var d;
  if (isEmpty(v)) return '';
  d = new Date(v);
  return (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getFullYear();
}
  
function validateDate(form, element) {
  var n, v;
  v = document.forms[form].elements[element].value;
  if (!isEmpty(v)) {
    n = Date.parse(v);
    if (isNaN(n)) {alert('You must enter a valid date (mon/day/year).'); setFocus(form, element); return false;}
  }
  return true;
}
  
function formatNumber(v, decimals) {
  var d, f, i, n, s;
  if (isEmpty(v)) return '';
  s = new String(new Number(v.replace(/,/g, '')));
  s = s.split('.');
  n = 0; d = '';
  for (i = s[0].length - 1; i >= (s[0].charAt(0) != '-' ? 0 : 1); i--) {
    if (n == 3) {
      d = ',' + d;
      n = 0;
    }
    d = s[0].charAt(i) + d;
    n++;
  }
  s[0] = (s[0].charAt(0) == '-' ? '-' : '') + d;
  if (decimals > 0) {
    if (s.length == 2 && s[1] > 0) {
      s[1] = Math.round(('0.' + s[1]) * Math.pow(10, decimals));
      s[1] = new String(s[1]);
      for (i = s[1].length + 1; i <= decimals; i++) s[1] = '0' + s[1];      
    }
    else {
      s[1] = ''; for (i = 1; i <= decimals; i++) s[1] = s[1] + '0';
    }
    f = s[0] + '.' + s[1];
  }
  else {
    f = s[0];
  }
  return f;
}

function validateNumber(form, element) {
  var n, v;
  v = document.forms[form].elements[element].value;
  if (!isEmpty(v)) {
    n = new Number(v.replace(/,/g, ''));
    if (isNaN(n)) {alert('You must enter a valid number.'); setFocus(form, element); return false;}
  }
  return true;
}

function multiSelectSetSelected(form, element) {;
  var selectedOptions, i;
  selected = document.forms[form].elements['Selected ' + element];
  if (!selected) selected = document.forms[form].elements['Selected.20' + element];
  selectedOptions = '';
  for (i = 0; i < selected.options.length; i++) {
    if (selectedOptions != '') selectedOptions += ';';
    selectedOptions += selected.options[i].value;
  }
  document.forms[form].elements[element].value = selectedOptions;
}

function multiSelectAdd(form, element) {
  var available, selected, i;
  available = document.forms[form].elements['Available ' + element];
  if (!available) available = document.forms[form].elements['Available.20' + element];
  selected = document.forms[form].elements['Selected ' + element];
  if (!selected) selected = document.forms[form].elements['Selected.20' + element];
  if (isEmpty(available.options[available.selectedIndex].value))
    return;
  else {
    for (i = 0; i < selected.options.length; i++) {
      if (selected.options[i].value == available.options[available.selectedIndex].value) return;
    }
  }
  selected.options[selected.options.length] = new Option(available.options[available.selectedIndex].text, available.options[available.selectedIndex].value, false, false);
  selected.selectedIndex = selected.options.length - 1;
  multiSelectSetSelected(form, element)
  selected.focus();
}

function multiSelectRemove(form, element) {
  var selected, selectedIndex;
  selected = document.forms[form].elements['Selected ' + element];
  if (!selected) selected = document.forms[form].elements['Selected.20' + element];
  selectedIndex = selected.selectedIndex;
  if (selectedIndex == -1) return;
  selected.options[selectedIndex] = null;
  if (selected.options.length > selectedIndex)
    selected.selectedIndex = selectedIndex;
  else
    selected.selectedIndex = selected.options.length - 1;
  multiSelectSetSelected(form, element)
  selected.focus();
}

function newWin(sub, frm, w, h, m) {
  if(m != 1) m=0;
  var newWindow = window.open(sub, frm,
    '_parent,toolbar=0,location=0,directories=0,status=0,menubar='+m+',scrollbars=1,resizable=1,width='+w+',height='+h);
  newWindow.moveTo(0,0);
  newWindow.focus();
}

function SmartSelect(oInput, oSelect)
{
	var sInput = String(oInput.value).toUpperCase();
	var iLength = sInput.length;

	if (iLength <= 0)
		return -1;

	var oOptions = oSelect.options;
	var i, diff, bFound, sTemp;

	var iHigh = oOptions.length - 1;
	var iLow = 0;
	var iCurrent = Math.floor((iHigh + 1) / 2);

	bFound = false;
	do {
		// Get the current option
		sTemp = oOptions(iCurrent).text.toUpperCase();
		var sSubstr = sTemp.substr(0, iLength);

		if (sSubstr < sInput) {
			// Search the upper half of the branch
			iLow = iCurrent + 1;
		}
		else if (sSubstr > sInput) {
			// Search the lower half of the branch
			iHigh = iCurrent - 1;
		}
		else {
			bFound = true;
			break;
		}

		// Pick the middle of the branch again	
		iCurrent = Math.floor(iLow + ((iHigh + 1) - iLow) / 2);

	} while (iHigh >= iLow)

	// Is there a better prefix match?
	if (iLength < sTemp.length) {
		// Store the current old value
		var iOld = iCurrent--;

		// Now go back until we find one that doesn't match the prefix
		while (iCurrent >= 0) {
			// Gone too far -- the prefix no longer matches.
			if (oOptions(iCurrent).text.toUpperCase().substr(0, iLength) != sInput)
				break;

			iOld = iCurrent--;
		}

		iCurrent = iOld;
	}

	if (bFound)
		return iCurrent;
	else
		return -1;
}

function FilterSelect(form, elementa,elementb) {
	var i = SmartSelect(document.forms[form].elements[elementa], document.forms[form].elements[elementb]);
	document.forms[form].elements[elementb].selectedIndex = i;
}