// This file contains form generation and validation functions.
// It uses variables defined in form.inc (SHOULD BE CHANGED).
//
// Author: Aji Oyekanmi
// Last Modified: 15th November 2002
// (c) NJB Consulting Ltd, 2002
//

function setform_focus(f, e) {  // to form index f, element index e [default (0,0)]
  if (document.forms.length==0)
    return;   // abort, no forms present on page!
  var cmd = 'document';
  if (f!=null && isNaN(f))
    cmd += '.'+f;
  else {
    if (f==null || f>=document.forms.length)
      f = 0;
    cmd += '.forms['+f+']';
  }
  var fm = eval(cmd); // the form object, hopefully
  if (fm.__focus!=null && fm[fm.__focus.value]!=null)   // special hidden field whose value is an element name?
    e = fm.__focus.value; // yes, make value the element name!
  if (e!=null && isNaN(e))
    cmd += '.'+e+((fm[e].length!=null && fm[e].options==null) ? '[0]' : '');
  else {
    if (e==null || e>=fm.elements.length)
      e = 0;
    while (fm.elements[e].type=="hidden")
      e++;
    cmd += '.elements['+e+']'+((fm.elements[e].length!=null && fm.elements[e].options==null) ? '[0]' : '');
  }
  cmd += '.focus()';
//window.alert(cmd);
  eval(cmd);

  apply_sel(fm);
}

function apply_sel(fm) {
  if (fm.__invsel!=null && fm[fm.__invsel.value]!=null)
//    view_detail(fm[fm.__invsel.value]);
    if (fm[fm.__invsel.value].onchange!=null)
      fm[fm.__invsel.value].onchange(); 
}

function img_sel(me, img, sel) {
  view_image(me, img);
  obj = new Object;
  obj[sel] = me.name;
  view_object(me, obj);
}


function do_onchange(me, img) {
  view_image(me, img, me.value);
}


function view_image(me, img, src) {
// Set the src attribute of an image element based on ...
//   me: form element object from which this method is called (ie. this)
//   img: image element name on the form
//   src: name of alternative source of image url (if not me) on the form
//
  if (me!=null && src==null)
    src = me.name;
  var fv = getformval(me, src);
  try {
    var xx = eval(unescape(fv));  // it might be serialised string!
    fv = (typeof(xx)=="object") ? xx[img] : xx;
  }
  catch(exception) {  // no it was not a serialised string
  }
  if (img!=null && me.form[img]!=null) {
    if (fv==null || fv.length==0)
      //window.alert('Image file name not specified');
      me.form[img].src = '/images/none.gif'; 
    else
      me.form[img].src = fv;
  }
  else
    window.open(fv, "njb_image"); 
  return false;
}


function getformval(me, src) {
  var val = "";
  if (me.selectedIndex!=null)
    val = me.options[me.selectedIndex].value;
  else {
    var fld = me.form[src];
    if (fld!=null)
      if (fld.selectedIndex!=null)
        val = fld.options[fld.selectedIndex].value;
      else 
        if (fld.value!=null)
          val = fld.value;
  }
  return val;
}


function view_detail(f, escbtn)
// This method should be called only by onChange() of a selection list in a form where the 
// value of each option is a serialised object with attributes and values of other 
// form elements and a dummy or default entry is the first option.
{
  var obj = eval(unescape(f.options[f.selectedIndex].value));  // convert option value string to object
  view_object(f, obj);

  // Disable buttons not in list when the dummy/default list item is selected
  // otherwise enable them all.
  if (escbtn!=null) {
    var btn = eval(unescape(escbtn));
    for (var i=0; i<btn.length; i++)
      if (f.form[btn[i].name]!=null)
        f.form[btn[i].name].disabled = (f.selectedIndex==btn[i].optindex);
  }
}


function view_object(f, valobj) {
  for (var x in valobj)        // and for each object attribute ...
    if (f.form[x]!=null)  // .. matching a form element
    {               // set the relevant element attribute(s)
      if (typeof(valobj[x])=="object") {
//window.alert('in view_object(), start processing valobj['+x+']');
        f.form[x].options.length = 0;
        for (var i=0; i<valobj[x].length; i++)
          if (i==0) {
            f.form[x].options[i] = new Option(valobj[x][i].__desc_, valobj[x][i].__serial_, true, true);
            view_object(f, eval(unescape(valobj[x][i].__serial_)));
          }
          else
            f.form[x].options[i] = new Option(valobj[x][i].__desc_, valobj[x][i].__serial_);
        //f.form[x].value = escape(valobj[x].toString());
//window.alert('in view_object(), end processing valobj['+x+']');
      }
      else {
//window.alert('in view_object(), start processing valobj['+x+'] = '+valobj[x]);
        f.form[x].value = valobj[x];
        if (f.form[x].checked!=null)
          f.form[x].checked = valobj[x];
        //if (f.form[x].type=="radio")
        if (f.form[x].length!=null) // radio ?
          for (var i=0; i<f.form[x].length; i++)
            //f.form[x][i].checked = (f.form[x][i].value==valobj[x]);
            //if (f.form[x][i].value==valobj[x] && !f.form[x][i].checked)
            if (f.form[x][i].type=="radio" && f.form[x][i].value==valobj[x])
              f.form[x][i].checked = true; //f.form[x][i].click();
        if (f.form[x].src!=null)
          f.form[x].src = valobj[x];
//window.alert('in view_object(), end processing valobj['+x+'] = '+valobj[x]);
      }
    }
    else  // no match with form element ...
      if (typeof(valobj[x])=="object")  { //.. but an object, so view its attributes
        view_object(f, valobj[x]);
    }
}


function disable_field(f, escfld) 
// Call this method to disable listed fields on a form.
{
  // Disable buttons not in list when the dummy/default list item is selected
  // otherwise enable them all.
  if (escbtn) {
    var btn = eval(unescape(escbtn));
    for (var i=0; i<btn.length; i++)
      if (f.form[btn[i].name]!=null)
        f.form[btn[i].name].disabled = (f.selectedIndex==btn[i].optindex);
  }
}
  

function prop_value(f, escflds)
// Call this method from onChange() of a selection list form element to copy the 
// value of the selected option to assoc. array of named form elements.
{
  var v = f.options[f.selectedIndex].value;  // get value of selected option
  var flds = eval(unescape(escflds));
  for (var x in flds)
    if (f.form[x]) { // .. matching a form element and set relevant attribute(s)
      f.form[x].value = v;
      if (f.form[x].checked!=null)
        f.form[x].checked = v;
      if (f.form[x].src)
        f.form[x].src = v;
    }
}


function remsel(me, sel) {
// Delete the selected list entry, select first entry and use it to set values of associated fields...
// ... assumes that 
//   me: form element object from which this method is called (ie. this)
//   sel: form element name of selection list
//
  fld = me.forms[sel];
  if (fld && (fld.selectedIndex>0)) {  // got the selection list...
    fld.options[fld.selectedIndex] = null;  // remove selected entry
    fld.options[0].selected;  // select the default entry 
    var obj = eval(unescape(fld.options[fld.selectedIndex].value));  // convert option value string to object
    view_object(fld, obj);
  }
}

