/**************************************************/

/* Form element manipulation functions */

  function moreSelectFields(read, write) {
    var newFields = document.getElementById(read).cloneNode(true);
                 
    var newField = newFields.childNodes;
    for (var i=0;i<newField.length;i++) {
      if (newField[i].id == 'select') {
         newField[i][0].selected = '1';
      }
      if (newField[i].id == 'remove')
        newField[i].style.display = 'inline';
      if (newField[i].id == 'left')
        newField[i].style.display = 'inline';
      if (newField[i].id == 'moreFields')
        newField[i].style.display = 'none';        
    }
    var insertHere = document.getElementById(write);
    newFields.id = '';
    newFields.style.display = 'inline';
    insertHere.parentNode.insertBefore(newFields,insertHere);
  }

  function moreInputFields(read, write) {
    var newFields = document.getElementById(read).cloneNode(true);
                 
    var newField = newFields.childNodes;
    for (var i=0;i<newField.length;i++) {
      if (newField[i].id == 'input') {
         newField[i].value = '';
      }
      if (newField[i].id == 'remove')
        newField[i].style.display = 'inline';
      if (newField[i].id == 'left')
        newField[i].style.display = 'inline';
      if (newField[i].id == 'moreFields')
        newField[i].style.display = 'none';        
    }
    var insertHere = document.getElementById(write);
    newFields.id = '';
    newFields.style.display = 'inline';
    insertHere.parentNode.insertBefore(newFields,insertHere);
  }

  function remove(element) {
    element.parentNode.parentNode.removeChild(element.parentNode);
  }

/*****************************************************/

function build_add_remove_input ( input_name,
                            label_text,
                            add_text,
                            remove_text,
                            type, value ) {
  var parent = document.getElementById( input_name+"_holder" );
  if ( !type ) type = 'input';

  var label;
  if ( ! ( label = parent.getElementsByTagName ( 'label' ) [0] ) ) {
    label = document.createElement('label');
    label.id = "label_" + input_name;
    label.appendChild ( document.createTextNode ( label_text )  );
    parent.appendChild ( label );
    parent.label = label;
  }

  parent.build_new = function ( id ) {
    if ( typeof ( id ) != 'number' ) return false;
    var row   = document.createElement('span');
    row.id    = input_name + '_row_' + id;
    var inp   = document.createElement( type );
    var links = document.createElement('span');
    inp.className = "keys";
    inp.name  = input_name;
    inp.id    = input_name + '_input_' + id;
    if ( type == 'input' ) {
      inp.type  = "text";
      if ( value )
        inp.value = value;
      inp.setAttribute('autocomplete', 'off');
      inp.reset = function() { 
        this.value = ''; 
      }
    } else if ( type == 'select' ) {
      var selected = [];
      for ( var i=0; i<value.length; i++ ) {
        var opt = value[i];
        var option = document.createElement( 'option' );
        if ( opt.text ) {
          option.text = opt.text;
          if ( opt.value )
            option.value = opt.value;
          if ( opt.indent )
            option.style.textIndent = opt.indent + "px";
          if ( opt.default )
            selected.push( i );
        } else {
          option.text = opt;
          option.value = '';
        }
        inp.appendChild( option );
      }
      inp.reset = function() { 
        return false;
      }
    }
    inp.row_id = id;
    inp.row = row;
    inp.onkeypress = function ( event ) {
      if ( ! event ) { event = window.event };
      switch ( event.keyCode ) {
        case 27: this.reset(); return false; // esc
        case  9: this.reset(); return true;  // tab
        case 13:
          parent.build_new( id+1 );
          inp.row.add_anchor.style.display = 'none';
          inp.row.rem_anchor.style.display = 'inline';
          parent.focus_id( id+1 );
          return false; // enter
      }
    }
    var rem_anchor = document.createElement('a');
    rem_anchor.href = "javascript: return false;";
    rem_anchor.className = "remove";
    rem_anchor.row = row;
    rem_anchor.onclick = function ( e ) {
      var target = e ? e.target : window.event.srcElement;
      parent.removeChild( target.row );
      var last_row = parent.lastChild;
      last_row.add_anchor.style.display = 'inline';
      var first_row = parent.label.nextSibling;
      if ( ! first_row.className.match ( /first/ ) )
        first_row.className += ' first';
      if ( first_row == last_row ) {
        first_row.rem_anchor.style.display = 'none';
      }
      return false;
    }
    rem_anchor.appendChild ( document.createTextNode ( remove_text ) );
    row.rem_anchor = rem_anchor;
    links.appendChild ( rem_anchor );
    var add_anchor = document.createElement('a');
    add_anchor.href = "javascript: return false;";
    add_anchor.className = "add";
    add_anchor.row = row;
    add_anchor.onclick = function ( e ) {
      //inp.reset;
      var target = e ? e.target : window.event.srcElement;
      target.style.display = 'none';
      target.row.rem_anchor.style.display = 'inline';
      parent.build_new( id+1 );
      return false;
    }
    add_anchor.appendChild ( document.createTextNode ( add_text ) );
    row.add_anchor = add_anchor;
    links.appendChild ( add_anchor );
    var br = document.createElement ( 'br' );
    br.className = "clear";
    row.appendChild ( inp );
    row.appendChild ( links );
    row.appendChild ( br );
    parent.appendChild ( row );
    parent.rowCount = id + 1;
    label.htmlFor = input_name + "_input_" + id;
    if ( id == 0 ) {
      row.className += " first";
      rem_anchor.style.display = 'none';
    } 
// if start > 0, make previous add disappear, and show remove
    if ( parent.rowCount > 1 && row.previousSibling ) {
      var prev = row.previousSibling;
      prev.rem_anchor.style.display = 'inline';
      prev.add_anchor.style.display = 'none'; 
    }
    if ( type == 'select' && selected.length > 0 ) {
      var j = selected.shift();
      inp.selectedIndex = j;
      value[j].default = 0;
      if ( selected.length > 0 )
        parent.build_new( id+1 );
    }
  }

  parent.focus_id = function ( id ) {
    var f_input  = document.getElementById( input_name + '_input_' + id );
    f_input.focus();
  }

  var start;
  if ( parent.rowCount ) {
    start = parent.rowCount;
  } else {
    start = 0;
  } 
  parent.build_new( start );
 
  return false;
}


/*****************NEW GROUP PLURAL THINGY************************************/

function build_add_remove_group (label_text,
                                 add_text,
                                 remove_text,
                                 set_name,
                                 set,
                                 total) {
  
  // Grab the field within which to place of items.
  var parent = document.getElementById( set_name+"_holder" );
  
  // Setting up out label and assigning to parent node.
  var label;
  if ( ! ( label = parent.getElementsByTagName ( 'label' ) [0] ) ) {
    label = document.createElement('label');
    label.id = "label_" + set_name;
    label.appendChild ( document.createTextNode ( label_text )  );
    parent.appendChild ( label );
    //var brk = document.createElement ( 'br' );
    //brk.className = "clear";
    //parent.appendChild ( brk );
    parent.label = label;
  }

  // Our work-horse function 
  parent.build_new = function ( id ) {
    if ( typeof ( id ) != 'number' ) return false;
    var row   = document.createElement('span');
    row.id    = set_name + '_row_' + id;

    var br = document.createElement ( 'br' );
    br.className = "clear";
    
    // ***Maybe here: For each of the passed in {name, type, value} sets?
    for (i=0; i < set.length; i++) {  //** START
      var type  = set[i].type;
      var value = set[i].value;
      var vname = set[i].vname;
      var item  = set[i].prompt;
      
      // Default form field type is "input"
      if ( !type ) type = 'input';      

      var brk = document.createElement ( 'br' );
      brk.className = "clear";
      row.appendChild ( brk );

      var inp   = document.createElement( type );
      inp.className = "keys";
      inp.name  = vname;
      inp.id    = vname + '_input_' + id;      

      if ( type == 'input' ) {
        inp.type  = "text";
        if ( value && id < total  )
          inp.value = value;
        inp.setAttribute('autocomplete', 'off');
        inp.reset = function() { 
          this.value = ''; 
        }
      } else if ( type == 'select' ) {
        var selected = [];
        for ( var i=0; i<value.length; i++ ) {
          var opt = value[i];
          var option = document.createElement( 'option' );
          if ( opt.text ) {
            option.text = opt.text;
            if ( opt.value )
              option.value = opt.value;
            if ( opt.indent )
              option.style.textIndent = opt.indent + "px";
            if ( opt.default )
              selected.push( i );
          } else {
            option.text = opt;
            option.value = '';
          }
          inp.appendChild( option );
        }
        inp.reset = function() { 
          return false;
        }
      }
      inp.row_id = id;
      inp.row = row;

      var lb;
      lb = document.createElement('label');
      lb.id = "label_" + vname;
      lb.appendChild ( document.createTextNode ( item )  );
      
      if ( type == 'textarea' ) { lb.className = "wide" };
      
      row.appendChild ( lb );
      row.label = lb;

      inp.onkeypress = function ( event ) {
        if ( ! event ) { event = window.event };
        switch ( event.keyCode ) {
          case 27: this.reset(); return false; // esc
          case  9: this.reset(); return true;  // tab
          case 13:
            parent.build_new( id+1 );
            inp.row.add_anchor.style.display = 'none';
            inp.row.rem_anchor.style.display = 'inline';
            parent.focus_id( id+1 );
            return false; // enter          
        }
      }

      row.appendChild ( inp );
      
      if ( type == 'select' && selected.length > 0 ) {
        var j = selected.shift();
        inp.selectedIndex = j;
        value[j].default = 0;
        if ( selected.length > 0 )
          parent.build_new( id+1 );
      }
    }
    // -- END OF LOOP
        
    var links = document.createElement('span');
      
    // Remove Link
    var rem_anchor = document.createElement('a');
    rem_anchor.href = "javascript: return false;";
    rem_anchor.className = "remove";
    rem_anchor.row = row;
    rem_anchor.onclick = function ( e ) {
      var target = e ? e.target : window.event.srcElement;
      parent.removeChild( target.row );
      var last_row = parent.lastChild;
      last_row.add_anchor.style.display = 'inline';
      var first_row = parent.label.nextSibling;
      if ( ! first_row.className.match ( /first/ ) )
        first_row.className += ' first';
      if ( first_row == last_row ) {
        first_row.rem_anchor.style.display = 'none';
      }
      return false;
    }
    rem_anchor.appendChild ( document.createTextNode ( remove_text ) );
    row.rem_anchor = rem_anchor;
    links.appendChild ( rem_anchor );
    
    // Add Link
    var add_anchor = document.createElement('a');
    add_anchor.href = "javascript: return false;";
    add_anchor.className = "add";
    add_anchor.row = row;
    add_anchor.onclick = function ( e ) {
      //inp.reset;
      var target = e ? e.target : window.event.srcElement;
      target.style.display = 'none';
      target.row.rem_anchor.style.display = 'inline';
      parent.build_new( id+1 );
      return false;
    }
    add_anchor.appendChild ( document.createTextNode ( add_text ) );
    row.add_anchor = add_anchor;
    links.appendChild ( add_anchor );
       
    row.appendChild ( links );
    row.appendChild ( br );
    //parent.appendChild( br );
    parent.appendChild ( row );
    parent.rowCount = id + 1;
    label.htmlFor = set_name + "_input_" + id;
    if ( id == 0 ) {
      row.className += " first";
      rem_anchor.style.display = 'none';
    }
     
    // if start > 0, make previous add disappear, and show remove
    if ( parent.rowCount > 1 && row.previousSibling ) {
      var prev = row.previousSibling;
      prev.rem_anchor.style.display = 'inline';
      prev.add_anchor.style.display = 'none'; 
    }
  }
  // -- End of build_new
  

  // Focus on the right field here 
  parent.focus_id = function ( id ) {
    var f_input  = document.getElementById( set_name + '_input_' + id );
    f_input.focus();
  }

  var start;
  if ( parent.rowCount ) {
    start = parent.rowCount;
  } else {
    start = 0;
  } 
  parent.build_new( start );
 
  return false;
}
