/*
<div id="unique_id" class="parameter-set">
  <div class="static-parameters">
    <q class="parameter name">parameter value</q>     
    ...     
  </div>
  <div class="dynamic-parameters">
    <q class="parameter name">NAME of element(s) to grab value(s) from</q>
    ... 
    <div class="rewriteable-parameters">(OPTIONAL)
      <q class="parameter name">NAME of element(s) to grab value(s) from</q>
      ... 
    </div>        
  </div>          
</div>
*/


function ParameterSet(elementId, submitCallback, buttonText) {
  this.elementId = elementId;
  this.submitCallback = submitCallback;  
  this.buttonText = buttonText;
  
  this.createSubmit();
}


ParameterSet.prototype.createSubmit = function() {
  
  var _this = this;

  var params = document.getElementById(this.elementId);
  var submit = document.createElement('input');
  submit.type = 'button';
  submit.value = this.buttonText || 'Submit'; //parameterize?
  submit.onclick = function() { _this.submitParameters(); };
  //submit.parameterset = this;
  
  params.appendChild(submit);
  
}



ParameterSet.prototype.processParameters = function() {
  var params = document.getElementById(this.elementId);
  var staticParamsDiv = getElementsByClassName(params,'static-parameters');
  var dynamicParamsDiv = getElementsByClassName(params,'dynamic-parameters');
  
  var parameterMap = new Array();
  
  
  var staticParams;
  if (staticParamsDiv && staticParamsDiv[0]) {
    staticParams = staticParamsDiv[0].getElementsByTagName('q');
    
    for (var i = 0; i < staticParams.length; i++) {
      parameterMap.push({name:staticParams[i].className, value:staticParams[i].innerHTML});
    }
  }
 
  var dynamicParams;
  if (dynamicParamsDiv && dynamicParamsDiv[0]) {
    dynamicParams = dynamicParamsDiv[0].getElementsByTagName('q');
    
    for (var i = 0; i < dynamicParams.length; i++) {
        var pname = dynamicParams[i].className;
        parameterMap = parameterMap.concat(this.getValuesFromInputs(pname, document.getElementsByName(dynamicParams[i].innerHTML)));
    }
  }
  
  return parameterMap;
}


ParameterSet.prototype.getValuesFromInputs = function(pname, elem) {
  
  var tmpParamMap = new Array();
  var paramName = pname;
    
  if (elem && elem[0]) {
    for (var i = 0; i < elem.length; i++) {
      var type = '';
      if (elem[i].type) type = elem[i].type.toUpperCase();
      
      if (type == 'TEXT' || type == 'HIDDEN' || type == 'SELECT-ONE' || type == 'TEXTAREA') {
        //alphanumeric  
        tmpParamMap.push({name:paramName, value:elem[i].value});
      } else if (type == 'RADIO') {
        if (elem[i].checked) 
          tmpParamMap.push({name:paramName, value:elem[i].value});

      } else if (type == 'CHECKBOX') {
        //selection dependent
        if (elem[i].checked)
          tmpParamMap.push({name:paramName, value:'on'});    
          
      } else if (type == 'SELECT-MULTIPLE') {
        if (elem[i].options) {
          for (var j = 0; j < elem[i].options.length; j++) {
            if (elem[i].options[j].selected) {
              tmpParamMap.push({name:paramName, value:elem[i].options[j].value});          
            }              
          }
        }
      } else {
        if (elem[i].value) {
          //this might work for <textarea>
          tmpParamMap.push({name:paramName, value:elem[i].value});        
        } else {
          tmpParamMap.push({name:paramName, value:elem[i].innerHTML});
        }
      }
    }      
  } else {
    //failed
  }
    
  return tmpParamMap;  
}


ParameterSet.prototype.getParameterQueryString = function() {
  var parameters = this.processParameters();
  var args = '';
  if (parameters) {
    for (var i = 0; i < parameters.length; i++) {
      args += parameters[i].name + '=' + parameters[i].value;
      if (i < (parameters.length - 1)) args += '&';
    }
    parameters = null;
  }
  return args;
}

ParameterSet.prototype.getParameterQueryStringClean = function() {
  var parameters = this.processParameters();
  var args = '';
  if (parameters) {
    for (var i = 0; i < parameters.length; i++) {
      if (parameters[i].value) {
        args += parameters[i].name + '=' + parameters[i].value + '&';
      }
    }
    parameters = null;
  }
  return args.substring(0,args.length-1);
}



ParameterSet.prototype.getParameterValues = function(parameterName) {
  var parameters = this.processParameters();
  
  var args = '';
  if (parameters) {
    for (var i = 0; i < parameters.length; i++) {
      if (parameterName == parameters[i].name) {
        args += parameters[i].value + ',';
      }
    }
    parameters = null;
  }
  return args.substr(0, args.length - 1);  
}





ParameterSet.prototype.submitParameters = function() {
  if (this.submitCallback) 
    this.submitCallback(this);
    
}