/* BUILD_JS_PACKAGES: library code
   fn: myPush
 */

/* Early IE does not support push() */

function myPush(item){

  this[this.length] = item;

}

if (Array && !Array.prototype.push)
  Array.prototype.push = myPush;

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: getMenuText
 */

function getMenuText (m)
{
  var s;

  if (m.selectedIndex == -1) { return ""; }

  s = m[m.selectedIndex].text;
  return s;
}

/* /BUILD_JS_PACKAGES */

/*
 * isDefaultValue:
 *   Like getValue, except returns true or false corresponding
 *   to whether or not the value (or checked property) of the element
 *   is the same as its initial value (or checked property).
 */
 
/* BUILD_JS_PACKAGES: library code
   fn: isDefaultValue
 */

function isDefaultValue(f, eName)
{
  var e = f.elements[eName];
  if (e == null)
    return null; // element does not exist in form

  var type;
  if (e.type == null && e.length > 0)
    type = e[0].type.toLowerCase();
  else
    type = e.type.toLowerCase();


  if ( type == "button" || type == "submit" || type == "text" || 
       type == "textarea" || type == "password" || type == "hidden"
     )
    return (e.defaultValue == e.value);
  else if (type == "checkbox" || type == "radio")
  {
    // if only one item, then it's not an array..
    if (e.length == null ||
       (getBrowser() == "NS" && getBrowserVersion() < "5" && e[0] == null) ) // NS4 checkbox.length bug
    {
      return (e.defaultChecked == e.checked);
    }
    else {
      var vals = new Array();
      var j = 0;
      for (i = 0; i < e.length; i++)
        vals[j++] = (e[i].defaultChecked == e[i].checked);
      return vals;
    }
  }
  else if (type == "select-one") {
    var sel_index = e.selectedIndex;
    if (sel_index < 0 || e.options.length == 0)
      return false;
    for (var j = 0; j < e.options.length ; j++) {
      if (e.options[j].defaultSelected == true && j == sel_index)
        return true;
    }
    return false;
  }
  else if (type == "select-multiple")
  {
    var vals = new Array();
    var j = 0;
    for (i = 0; i < e.options.length; i++) {
      if (e.options[i].defaultSelected)
        vals[j++] = true;
    }
    return vals;
  }
  else
    alert("unknown/unhandled type: "+type);
} 

/* /BUILD_JS_PACKAGES */

/*
 * getValue:
 * function description:
 *   a way to get the value of any html form element without needing
 *   to concern oneself the type of element targeted (radio, checkbox,
 *   selcet, text, ..
 * notes:
 *  - for form elements that can have multiple values (namely checkboxes
 *    and select-multiple's), this function will return an array containing
 *    the list of values that the element is set to
 * arguments:
 *  - form: a reference to the form that you're targeting
 *  - elemName: the name of the form element whose value you'd like to obtain
 * returns: the value of the target element
 */


/* BUILD_JS_PACKAGES: library code
   fn: getValue
   deps: getBrowser getBrowserVersion
 */

function getValue(_form, _elemName, _defaultVal)
{
  var _element = _form.elements[_elemName];
  if (_element == null) {
    _element = document.getElementById ('_elemName');
    if (_element == null) {
      return null; // element does not exist in form
    }
  }

  var _type;
  if (_element.type == null && _element.length > 0)
    _type = _element[0].type.toLowerCase();
  else
    _type = _element.type.toLowerCase();

  if (_type == "button")
    return (_defaultVal) ? _element.defaultValue : _element.value;
  else if (_type == "checkbox")
  {
    // if only one item, then it's not an array..
    if (_element.length == null ||
       (getBrowser()=="NS" && getBrowserVersion() < "5" && _element[0]==null) ) // NS4 checkbox.length bug
    {
      if (_defaultVal)
        return (_element.defaultChecked) ? _element.defaultValue : null;
      else
        return (_element.checked) ? _element.value : null;
    }
    else
    {
      var _values = new Array();
      var j=0;
      for (i=0; i<_element.length; i++)
        if (_defaultVal)
          if (_element[i].checked)
            _values[j++] = _element[i].value;
        else
          if (_element[i].defaultChecked)
            _values[j++] = _element[i].defaultValue;
      return _values;
    }
  }
  else if (_type == "radio")
  {
    // if only one item, then it's not an array..
    if (_element.length == null)
      if (_defaultVal)
        return (_element.defaultChecked) ? _element.defaultValue : null;
      else
        return (_element.checked) ? _element.value : null;
    else {
      var _values = new Array();
      var j=0;
      for (i=0; i<_element.length; i++) {
        if (!_defaultVal) {
          if (_element[i].checked)
            return _element[i].value;
        }
        else
          if (_element[i].defaultChecked) {
            return _element[i].value;
        }
      }
    }
    return null;
  }
  else if (_type == "reset")
  {
    return "";
  }
  else if (_type == "submit")
  {
    return "";  // can actually pass values via submits.. need to handle this
  }
  else if (_type == "text")
  {
    return (_defaultVal) ? _element.defaultValue : _element.value;  // note it's the programmer's duty to make sure he does not use duplicate
  }
  else if (_type == "textarea")
  {
    return (_defaultVal) ? _element.defaultValue : _element.value;
  }
  else if (_type == "password")
  {
    return (_defaultVal) ? _element.defaultValue : _element.value;
  }
  else if (_type == "file")
  {
    return _element.value;  // are you sure?   // demos: prob accessible in MSIE only (Netscape 4.x security needs UniversalFileRead)
  }
  else if (_type == "select-one")
  {
    if (_defaultVal) 
      for (var j=0; j<_element.options.length ; j++) {
        if (_element.options[j].defaultSelected == true) {
          return _element.options[j].value;
        }
      }
    if (_element.selectedIndex < 0 || _element.options.length == 0) return "";
    return _element.options[_element.selectedIndex].value;
  }
  else if (_type == "select-multiple")
  {
    var _values = new Array();
    var j=0;
    for (i=0; i<_element.options.length; i++) {
      if (_defaultVal) {
        if (_element.options[i].defaultSelected) {
          _values[j++] = _element.options[i].value;
        }
      }
      else {
        if (_element.options[i].selected) {
          _values[j++] = _element.options[i].value;
        }
      }
    }
    if (j==1)
      return _values[0];
    else
      return _values;
  }
  else if (_type == "hidden")
  {
    return (_defaultVal) ? _element.defaultValue : _element.value;
  }
  else
  {
    alert("unknown/unhandled type: "+_type);
  }
}

/* /BUILD_JS_PACKAGES */

/* focusElement:
 * function description:
 * sets the focus to any form element
 * you need to pass the following:
 * arguments:
 *  - document: a reference to the page that youre targeting
 *  - form: a reference to the form that youre targeting
 *  - elemName: the name of the form element you want in focus
*/


/* BUILD_JS_PACKAGES: library code
   fn: focusElement
 */

function focusElement(_element)
{
    _element.focus();
     _element.select();
}

/* /BUILD_JS_PACKAGES */

/*
 * setValue:
 * function description:
 *   a way to set the value of any html form element without needing
 *   to concern oneself the type of element targeted (radio, checkbox,
 *   selcet, text, ..
 * notes:
 *  - form element fileupload cannot be set programmatically.  its
 *   'value' property is read-only
 *  - for form elements that can have multiple values (namely checkboxes
 *    and select-multiple's), pass in an array if you want to set more than
 *    one value
 * arguments:
 *  - form: a reference to the form that you're targeting
 *  - elemName: the name of the form element whose value you'd like to change
 *  - value: the value(s) you'd like to set the target element to
 *  - isdefault: boolean of whether or not to set value as the default value
 *    of the control, which is useful when determining if the control has been 
 *    modified by the user from its "original" value (e.g. modified_control.htc).
 *    This argument only makes sense with user modifiable controls
 * returns: true if succeeded in setting the value, false otherwise
 */
 

/* BUILD_JS_PACKAGES: library code
   fn: setValue
   deps: getBrowser getBrowserVersion
 */

function setValue(_form, _elemName, _value, _isdefault)
{
  var _element = _form.elements[_elemName];
  if (_element == null) {
    _element = document.getElementById ('_elemName');
    if (_element == null) {
      return false; // element does not exist in form
    }
  }

  var _type;
  if (_element.type == null && _element.length > 0)
  {
    _type = _element[0].type.toLowerCase();
  } else
  {
    _type = _element.type.toLowerCase();
  }
  //alert("elemName: "+_elemName+"; elemType: "+_type);

  if (_type == "button")
  {
    _element.value = _value;
    return true;
  }
  else if (_type == "checkbox")
  {
    var _retval = false;
    // if only one item, then it's not an array..
    if (_element.length == null ||
       (getBrowser()=="NS" && getBrowserVersion() < "5" && _element[0]==null) ) // NS4 checkbox.length bug
    {
      if (_element.value == _value)
      { 
        if (_isdefault)
          _element.defaultChecked = true;
        _element.checked = true;
        _retval = true
      }
      else
      {
        if (_isdefault)
          _element.defaultChecked = false;
        _element.checked = false;
      }
    }
    else
    {
      for (i=0; i<_element.length; i++)
      {
        if (isValueIn(_element[i].value, _value))
        {
          if (_isdefault)
            _element[i].defaultChecked = true;
          _element[i].checked = true;
          _retval = true;
        }
        else
        {
          if (_isdefault)
            _element[i].defaultChecked = false;
          _element[i].checked = false;
        }
      }
    }
    return _retval;
  }
  else if (_type == "radio")
  {
    var _retval = false;
    // if only one item, then it's not an array..
    if (_element.length == null)
    {
      if (_element.value == _value)
      {
        if (_isdefault)
          _element.defaultChecked = true;
        _element.checked = true;
        _retval = true;
      }
      else
      {
        if (_isdefault)
          _element.defaultChecked = false;
        _element.checked = false;
      }
      return;
    }
    else
    {
      var prev_checked;
      if (_isdefault)
        for (i=0; i<_element.length; i++)
        {
          if (_element[i].checked == true)
          {
            prev_checked = i;
            break;
          }
        }
      for (i=0; i<_element.length; i++)
      {
        //if (_isdefault && prev_checked && prev_checked == i)
          //_element[i].defaultChecked = false;
        if (_element[i].value == _value)
        {
          if (_isdefault)
          {
            if (prev_checked && _element[prev_checked].value != _value)
              _element[prev_checked].defaultChecked = false;
            _element[i].defaultChecked = true;
          }
          _element[i].checked = true;
          _retval = true;
        }
        else
          _element[i].checked = false;
      }
    }
    return _retval;
  }
  else if (_type == "reset")
  {
    _element.value = _value;
    return true;
  }
  else if (_type == "submit")
  {
    _element.value = _value;
    return true;
  }
  else if (_type == "text")
  {
    if (_isdefault)
      _element.defaultValue = _value;
    _element.value = _value;
    return true;
  }
  else if (_type == "textarea")
  {
    if (_isdefault)
      _element.defaultValue = _value;
    _element.value = _value;
    return true;
  }
  else if (_type == "password")
  {
    if (_isdefault)
      _element.defaultValue = _value;
    _element.value = _value;
    return true;
  }
  else if (_type == "file")
  {
    return false;  // values for fileupload objects are read-only!
  }
  else if (_type == "select-one")
  {
    for (i=0; i<_element.options.length; i++)
    {
      if (_element.options[i].value == _value)
      {
        if (_isdefault) {
          for (var j=0; j<_element.options.length; j++)
            if (_element.options[j].defaultSelected == true) {
              _element.options[j].defaultSelected = false;
              break;
            }
          _element.options[i].defaultSelected = true;
        }
        _element.selectedIndex = i;
        return true;
      }
    }
    return false;
  }
  else if (_type == "select-multiple")
  {
    var _retval = false;
    for (i=0; i<_element.options.length; i++)
    {
      if (isValueIn(_element.options[i].value, _value))
      {
        //_element.selectedIndex = i;
        if (_isdefault)
          _element.options[i].defaultSelected = true;
        _element.options[i].selected = true;
        _retval = true;
      }
      else
      {
        if (_isdefault)
          _element.options[i].defaultSelected = false;
        _element.options[i].selected = false;
      }
    }
    return _retval;
  }
  else if (_type == "hidden")
  {
    _element.value = _value;
    if (_isdefault)
      _element.defaultValue = _value;
    return true;
  }
  else
  {
    alert("unknown/unhandled type: "+_type);
    return false;
  }
}

/* /BUILD_JS_PACKAGES */

/*
 * isValueIn:
 * function description:
 *   a way to check if some value is equal to another or if the
 *   list has a member that is equal to it.
 * arguments:
 *  - value: a variable containing a scalar value (string or numeric)
 *  - list: either a scalar or an array
 * returns: true if value is in the list (or equal to list if list
 *    is a scalar
 */


/* BUILD_JS_PACKAGES: library code
   fn: isValueIn
 */

function isValueIn(_value, _list)
{
  if (_list.length == null)  // not an array
  {
    return (_value == _list);
  }
  for (var i=0; i<_list.length; i++)
  {
    if (_value == _list[i])
    {
      return true;
    }
  }
  return false;
}

/* /BUILD_JS_PACKAGES */

/**
 * build the contents of a <select> menu
 * @param menu a reference to the <select> object to be built
 * @param hash_or_array:
 *   - if it's a hash, hash's keys are the option values and hash's values are
 *     the option's text (captions)
 *   - if it's an array, array is assumed to be of form [ value1, text1, value2, text2, ... ]
 *     and options are created from these value/text pairs 
 * Selected_value = value that will be selected if passed in
 */


/* BUILD_JS_PACKAGES: library code
   fn: makeMenu
   deps: addOption
 */

function makeMenu(menu, hash_or_array, selected_value)
{
  // a safety precaution
  if (menu.type.indexOf("select") != 0)
    return;
  menu.length = 0;

  var select_option;
  var selected_index = -1;
  if (hash_or_array && hash_or_array.length) {
    for (var i = 0; i < hash_or_array.length; i += 2) {
      addOption(menu, hash_or_array[i+1], hash_or_array[i]);
      if (selected_value == hash_or_array[i])
        selected_index = i/2;
    }
  } 
  else {
    var i = 0;
    for (var key in hash_or_array) {
      addOption(menu, hash_or_array[key], key);
      menu.options[i].innerHTML = menu.options[i].text;
      if (selected_value == key)
        selected_index = i;
      i++;
    }
  }

  if (selected_value && selected_index != -1) {
    menu.selectedIndex = selected_index;
    menu.options[selected_index].defaultSelected = true;
  }
}

/* /BUILD_JS_PACKAGES */

// /*  
//  * addElementToForm(_form, _type, _name, _value)
//  * This function dynamically creates form elements.
//  */


/* BUILD_JS_PACKAGES: library code
   fn: addElementToForm
   deps: setValue
 */

function addElementToForm (elem_document, form, type, name, value)
{
    addControlToForm (elem_document, form, form, 'input', { name : name, value : value, type : type });
}

function addControlToForm (elem_document, form, container, tag, attributes) 
{
    // allows adding of form elements to a window different from the one
    // running this script
    if (! elem_document) {
        elem_document = document;
    }

    // allows appending of new elements in an arbitrary container
    if (! container) {
        container = form;    
    }
    
    tag = tag.toLowerCase();
    
    // Workaround for IE 6/7 bug - if a form control has the same name as a 
    // a form attribute, it can't be referred to as f.elements['controlName'],
    // because in IE the form's attribute will inexplicably be referenced
    // instead.  So we have to go through all the form elements by index.
    var elem_exists = false;
    if (attributes["name"] && form.getAttribute(attributes["name"])) {
        for (var i = 0; i < form.elements.length; i++) {
            if (form.elements[i].getAttribute('name') == attributes['name']) {
                elem_exists = true;
                break;
            }
        }
    }
    else {
        elem_exists = form.elements[attributes["name"]];
    }
    
    // create element
    if (! elem_exists) {
        var elem;
        try {
            var attr_strings = [ ];
            for (var attr in attributes) {
                attr_strings.push (attr + '="' + attributes[attr] + '"');
            }
            if (tag == "select") {
                elem = elem_document.createElement ( '<' + tag + ' ' + attr_strings.join(" ") + '></' + tag + '>');
            }
            else {
                elem = elem_document.createElement ( '<' + tag + ' ' + attr_strings.join(" ") + ' />');
            }
        }
        catch (e) {
            elem = elem_document.createElement ( '<' + tag + '>' );
            for (var attr in attributes) {
                elem.setAttribute(attr, attributes[attr]);
            }
        };
        
        container.appendChild(elem);
    }
    // or set value
    else {
        setValue(form, attributes["name"], attributes["value"]);
    }
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: onfocusblur
 */

function onfocusblur(_form, _name, _blurHandler) {

  eval ("_form['"+_name+"'].onfocus = _form['"+_name+"'].blur");
  if (_blurHandler)
    eval ("_form['"+_name+"'].onblur = "+_blurHandler);
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: createSelect
 */

function createSelect(sel,opts_texts,opts_vals,selected_index)
{
  sel.options.length = 0;
  for (var i = 0; i < opts_texts.length; i++)
    sel.options[i] = new Option( opts_texts[i], opts_vals[i], false, false );
  sel.selectedIndex = ( isNaN(selected_index) || selected_index < 0 || 
                        selected_index > sel.options.length 
                      ) ? -1 : selected_index;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: emptySelect
 */

function emptySelect(sel,none_opt)
{
  sel.options.length = 0;
  if (none_opt)
    sel.options[0] = new Option( none_opt, "", false, false );
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: populateCurrencies
   deps: getValue emptySelect copyObject createSelect
 */

function populateCurrencies(country_select,currency_select_name, symbols_only)
{ 
  var form = country_select.form;
  var currency_select = form[currency_select_name];
  if (currency_select == null || ! currency_select.options)
    return;
  var country_code = getValue(country_select.form, country_select.name);
  if (! country_code)
  {
    emptySelect(currency_select, "--" + xlate('none') + "--");
    return;
  }
  var names = [ ];
  var symbols = [ ];
  if (currencies[country_code] != null)
  {
    names = copyObject(currencies[country_code]["names"]);
    symbols = copyObject(currencies[country_code]["symbols"]);
    for (var i = 0; i < names.length; i++) {
      if (symbols_only)
        names[i] = symbols[i];
      else
        names[i] = symbols[i] + " - " + names[i];
    }
    createSelect(currency_select,names,symbols,0)
  }
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: populateSelect
   deps: createEmptyOpt
 */

function populateSelect(sel,opts,empty_opt_val,empty_opt_begin)
{ 
  if (! sel.options)
    sel.options = [ ];
  sel.options.length = 0;
  empty_opt_begin = empty_opt_begin || 0;
  if (empty_opt_val && empty_opt_begin)
    sel.options[0] = createEmptyOpt(empty_opt_val);
  for (var i = 0; i < opts.length; i++)
    sel.options[i+empty_opt_begin] = opts[i];
  if (empty_opt_val && ! empty_opt_begin)
    sel.options[i] = createEmptyOpt(empty_opt_val);
  sel.selectedIndex = -1;
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: addOption
 */

function addOption(sel,text,value)
{
  sel.options[sel.options.length] = new Option ( text, value );
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: createEmptyOpt
 */

function createEmptyOpt(text)
{
  return new Option(text, "", false, false);
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: editItem
   deps: xlate getValue
 */

function editItem(action,select,edit_page_name,query_string_addition)
{
  var form = select.form;
  var list_name = select.name;
  if (! edit_page_name)
    edit_page_name = list_name;

  if (select.selectedIndex == -1 && action != 'create') {
    alert(xlate("Please make a selection from the list"));
    return false;
  }

  var selected_indices = [ ];
  for (var i = 0; i < select.options.length; i++)
    if (select.options[i].selected == true)
      selected_indices.push(i);

  if (query_string_addition == null) {
    query_string_addition = '';
  }

  if (action == "create")
    location.href = "admin_" + edit_page_name + ".epl?do_action=create" + query_string_addition;
  else if (action == "edit" && selected_indices.length == 1)
  {
    var selected_item = getValue(form, select.name);
    location.href = "admin_" + edit_page_name + ".epl?do_action=edit&" + list_name + "=" + selected_item + query_string_addition;
  }
  else if (action == "delete")
  {
    var num_deleted = 0;
    for (var i = 0; i < selected_indices.length; i++)
    {
      if ( confirm(xlate("Are you sure you want to delete the <l></l> '<l></l>'?", [list_name, 
           select.options[selected_indices[i] - num_deleted].text ]))
         )
      { 
        select.options[selected_indices[i] - num_deleted] = null;
        num_deleted++;
      }
    }
  }
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: disableAllButtons
 */

function disableAllButtons(_form) {

  for (var g = 0; g < _form.elements.length; g++) {
    if (_form.elements[g].type == "button") {
      _form.elements[g].disabled = "true";
    }
  }
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: addEventHandlerToElement
 */

function addEventHandlerToElement(element,event_name,handler_name) { 
  if (element.addEventListener) { 
    element.addEventListener(event_name, function(e){ element[handler_name](e); }, false);
  }
  else if (element.attachEvent) { 
    element.attachEvent("on" + event_name, function(e){ element[handler_name](e); });
  }
  else { 
    var orig_handler = element["on" + event_name]; 
    if (orig_handler) { 
      element["on" + eventName] = function(e){ orig_handler(e); element[handler_name](e); }; 
    } 
    else { 
      element["on" + eventName] = element[handler_name]; 
    } 
  } 
}

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: getFormValues
   deps: getValue
 */

function getFormValues(form, args, get_all_element_type_values)
{
  if (! args)
    args = { };
    
  var ok_types = { checkbox: true, radio: true, text: true, textarea: true, 
                   file: true, 'select-one': true, 'select-multiple': true, 
                   hidden: true
                 };
  for (var i = 0; i < form.elements.length; i++) {
    var type_ok = (get_all_element_type_values || ok_types[form.elements[i].type]);
    if (form.elements[i].name && type_ok)
      args[form.elements[i].name] = getValue(form, form.elements[i].name) || "";
  }

  return args;
} 

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: setFormValues
   deps: setValue
 */

function setFormValues(form, args)
{
  for (var key in args) {
    if (form[key])
      setValue(form, key, args[key] == null ? '' : args[key]);
  }
} 

/* /BUILD_JS_PACKAGES */


/* BUILD_JS_PACKAGES: library code
   fn: mutualExcCheckboxes
 */

function mutualExcCheckboxes(ele)
{
  if (! ele.checked) {
    return false;
  }

  var cbs = document.getElementsByName(ele.name);
  for ( var i=0; i < cbs.length; i++ ) {
    cbs[i].checked = false;
  }
  ele.checked = true;

} 

/* /BUILD_JS_PACKAGES */

// 
// 
// function getMenuValue (m)
// {
//   var s;
// 
//   if (m.selectedIndex == -1) { return ""; }
// 
//   s = m.options[m.selectedIndex].value;
// 
//   return s;
// }
// 
// function getRadioValue (m)
// {
//   var i;
// 
//   for (i=0; i<m.length; i++)
//     if (m[i].checked)
//       return m[i].value;
//   return null;
// }
// 
// /**
//  * a general purpose function to add additional options to a menu.
//  *
//  * @param menu which menu to add things to
//  * @param optionText text of the added option
//  * @param optionValue value of the added option
//  * @param nodupchk pass in a true value to skip duplicate checking and just add the option to the menu
//  *
//  * @return added option
//  *
//  */
// 
// function addOption(_menu, _optionText, _optionValue, _nodupchk)
// {
//   if (!_nodupchk)
//   {
//     for (i=0; i<_menu.length; i++)
//     {
//       if (_menu.options[i].text == _optionText)
//         return _menu.options[i];
//     }
//   }
//   var _anOption = new Option(_optionText, _optionValue);
//   _menu.options[_menu.length] = _anOption; // add option to menu
//   return _anOption;
// }
// 
// function removeOption(_menu, _optionText)
// {
//   var idx = _menu.selectedIndex;
//   for (i=0; i<_menu.options.length; i++)
//     {
//       if(_menu.options[i].text == _optionText)
//    {
//      _menu.options[i] = null;
//      if (i == idx)
//        _menu.selectedIndex = 0;
//      return;
//    }
//     }
// }
// 
// function selectOption(_menu, _optionText)
// {
//   for (i=0; i<_menu.options.length; i++)
//     {
//       if (_menu.options[i].text == _optionText)
//         {
//           _menu.options[i].selected = true;
//           _menu.selectedIndex = i;
//           return;
//         }
//     }
// }

// function getMenuValueForText (m, _text)
// {
//   var s;
// 
//   for (var i=0; i<m.options.length; i++)
//   {
//     if (m.options[i].text == _text)
//     {
//       return m.options[i].value;
//     }
//   }
// 
//   return "";
// }
// 
// function getMenuIndexForValue (m, _value)
// {
//   var s;
// 
//   for (var i=0; i<m.options.length; i++)
//   {
//     if (m.options[i].value == _value)
//     {
//       return i;
//     }
//   }
// 
//   return "0";
// }

// function focusFirstElement(_form)
// {
//   alert('using focus');
//   for (i=0; i<_form.length; i++)
//   {
//     element = _form.elements[i];
//     if (element.type.toLowerCase() != "hidden")
//     {
//       element.focus();
//       return;
//     }
//   }
// }

// /**
//  * why reset_form when browsers provide a built-in form.reset() method??
//  *  because when a behavior is attached to a form element, form.reset() fails!
//  *  this is a bug.  use reset_form as a workaround.
//  */
//  function reset_form(_form)
//   {
//     if (_form==null) return;
//     var _elem = null;
//     var _type = null;
//     for (var i=0; i<_form.elements.length; i++)
//     {
//       _elem = _form.elements[i];
//       if (!_elem.type) continue;
//       _type = _elem.type.toLowerCase();
//       if (_type=="text" || _type=="hidden" || _type=="password" || _type=="textarea")
//       {
//         _elem.value = _elem.defaultValue;
//       }
//       else if (_type=="radio" || _type=="checkbox")
//       {
//         _elem.checked = _elem.defaultChecked;
//       }
//       else if (_type.indexOf("select")==0)
//       {
//         for (var j=0; j<_elem.options.length; j++)
//         {
//           _elem.options[j].selected = _elem.options[j].defaultSelected;
//         }
//       }
//       // note: input type="file" elements cannot be reset as their values are read-only
//       else if (_type=="file")
//       {
//         ;
//       }
//       else if (_type=="button" || _type=="reset" || _type=="submit")
//       {
//          // although values of buttons cannot be changed by the end user, in the 
//          // unlikely event that the values are changed programmatically, they will be reset too
// 
//          // on second thoughts, this is a bad idea.  next line commented out on purpose
//          // _elem.value = _elem.defaultValue;
//       }
//     }
//   }
//  

// /**
//  * Make the query string given a form - and add a name data "DEVICE=PRINT" is "OUTPUT=PRINT" and make OUTPUT=PDF
//  *
//  * @param noQMark if pass false then query string will be returned without the starting question
//  *   mark character that usually divides a url and the querystring.  default is true
//  */
// function makeQueryString(_form, _noQMark)
// {
//     var _items = new Object();
//     for (var i=0; i<_form.elements.length; i++){
//       if (_items[_form.elements[i].name] == null){
//         _items[_form.elements[i].name] =  escape(getValue(_form, _form.elements[i].name));
//       }
//     }
//     
//     var _itemsra = new Array();
//     var i = 0;
//     for (var name in _items) {
//       if (name=="OUTPUT" && _items[name]=="PRINT") {
//         _itemsra[i++] = name + "=PDF";
//         _itemsra[i++] = "DEVICE=PRINT";
//         continue;
//       }
//       _itemsra[i++] = name + "=" + _items[name];
//     }
//     var _querystring = (_noQMark) ? "" : "?";
//     return _querystring + _itemsra.join("&") ;
// }
// 
// var first_time = true;
// 
// function succeed_only_once ()
// {
//   var _retval = first_time;
//   first_time = false;
//   return _retval;
// }
// 
// 

// 
// function enableFormControl(_form,_name,_enable)
// {
//   // do we need guards in here to check that _name has
//   // the appropriate tag? (e.g. only <BUTTON>, <TEXTAREA>, etc.)
//   if (getBrowser() == "IE")
//     if (_form(_name) != null)
//       _form(_name).disabled = ! _enable;
// }
// 


