var errorMessage = new Array();
var e = 0;
var dialog = '';
var validated = false;
function validateAll(formName,response) {
  debug('function validateAll', 99);    
  dialog = '';
  e = 0;
  errorMessage = new Array();
  var req = 1;
  for (var fields in validate[formName]) {
    var fieldName = validate[formName][fields]["name"];
    var fieldPost = validate[formName][fields]["post"];
    var fieldMin = validate[formName][fields]["min"];
    var fieldMax = validate[formName][fields]["max"];
    var fieldGrep = validate[formName][fields]["grep"];
    var fieldGrepError = validate[formName][fields]["grepError"];
    var fieldType = validate[formName][fields]["fieldType"];
    var fieldOptions = validate[formName][fields]["fieldOptions"];
    var fieldReq = validate[formName][fields]["req"];
    var fieldValue = '';
    
    if (document.forms[formName].elements[fieldPost]) { // to protect from not used elements
	  var formElement = document.forms[formName].elements[fieldPost];
    
      if (fieldType == "select") {
        var fieldValue = formElement.options[formElement.selectedIndex].value;
      } else if (fieldType == "radio") {
        for (i=0;i<formElement.length;i++){
          if (formElement[i].checked) {
            var fieldValue = formElement[i].value;
          }
        }
      } else if (fieldType == "checkbox") {
        // REMINDER!
        // only one value is set, this would not work with
        // multiple checkboxes but we don't need that here

        if (formElement.checked) {
          var fieldValue = formElement.value;
        }
        

      
       } else if (fieldType == "us-phone") {

        var joinList = fieldOptions.split(',');
        var fieldValue = '';
        for (i=0;i<joinList.length;i++) {
          if (document.forms[formName].elements[joinList[i]]) {
            fieldValue += document.forms[formName].elements[joinList[i]].value;
          } else {
            fieldValue += joinList[i];
          }
        }
        formElement.value = fieldValue;
        debug(fieldName + ': ' + fieldValue, 22);
        values[fieldPost] = 'fieldValue';
      } else {
        var fieldValue = formElement.value;
      }

/*



*/


      if (fieldReq >= req || fieldValue.length > 0) {
        if (fieldValue.length >= fieldMin) {
          if (fieldValue.length <= fieldMax) {
            if (fieldGrep.test(fieldValue) == false) {
              if (fieldGrepError.length > 0) {
                addError(fieldPost, fieldGrepError);
              } else {
                addError(fieldPost, 'Sorry - there seems to be a mistake in your answer. Please check it carefully and try again.');
              }
            }
          } else {
            // error max lenght
            addError(fieldPost, 'Sorry - your answer is too long. Please try again.');
          }     
        } else {
          // error min lenght
          if (fieldValue.length > 0) {
            addError(fieldPost, 'Sorry - your answer seems too short. Please complete your answer.');
          } else {
            addError(fieldPost, 'Please answer this question. This field is required.');
          }
        }
      }
    }
  }
  

  validated = true;  
  if (countErrors() > 0) {

    clearErrors(formName);

    showErrors();
    
    dialog = "There seems to be a problem with " + countErrors() + " of your answers. Please correct the ones that are marked and then submit the form again. Thank you.";
    if (response == 'alert') {
      alert(dialog);
    }
    return false;
  } else {

   clearErrors(formName);
   return true;
  }
}

function addError(fieldName, errMsg) {
  debug('function addError', 99);    
  dialog += errMsg + "\n";
//  errorMessage[e] = new Array();
//  errorMessage[e]['fieldName'] = fieldName;
//  errorMessage[e]['error'] = errMsg;
//  e++;
  errorMessage[fieldName] = errMsg;
  debug(fieldName + ": " + errMsg, 91);    
}

function showErrors() {
  debug('function showErrors', 99);    
//  for (var errN in errorMessage) {
//    var fieldName = errorMessage[errN]['fieldName'];
//    var errMsg = errorMessage[errN]['error'];
//    replaceObjContent(fieldName + 'ErrMsg',errMsg);
//    replaceClass(fieldName + 'Question','questionError');
//  }
  for (var fieldName in errorMessage) {
    var errMsg = errorMessage[fieldName];
    replaceObjContent(fieldName + 'ErrMsg',errMsg);
    replaceClass(fieldName + 'QuestionBlock','questionError');
  }
}

function countErrors() {
  debug('function countErrors', 99);    
  var errorCount = 0;
  for (var fieldName in errorMessage) {
    errorCount++;
  }
  return errorCount;
}

function clearErrors(formName) {
  debug('function clearErrors', 99);    
  for (var fields in validate[formName]) {
    var fieldName = validate[formName][fields]["post"];
    clearObjContent(fieldName + 'ErrMsg');
    replaceClass(fieldName + 'QuestionBlock','questionBlock');
    debug('Cleared: ' + fieldName + '.', 18);
  }
}


var values = new Array();
function readValues(formName) {
  debug('function readValues', 99);    
  for (var fields in validate[formName]) {
    var fieldPost = validate[formName][fields]["post"];
    var fieldType = validate[formName][fields]["fieldType"];
    var fieldValue = '';
    debug('fieldPost: ' + fieldPost, 40);
    if (document.forms[formName].elements[fieldPost]) { // to protect from not used elements
	  var formElement = document.forms[formName].elements[fieldPost];
    
      if (fieldType == "select") {
        var fieldValue = formElement.options[formElement.selectedIndex].value;
      } else if (fieldType == "radio") {
        for (i=0;i<formElement.length;i++){
          if (formElement[i].checked) {
            var fieldValue = formElement[i].value;
          }
        }
      } else if (fieldType == "checkbox") {
        // REMINDER!
        // only one value is set, this would not work with
        // multiple checkboxes but we don't need that here

        if (formElement.checked) {
          var fieldValue = formElement.value;
        }
        
      } else {
        var fieldValue = formElement.value;
      }
    }
    values[fieldPost] = fieldValue;
    debug('value: ' + values[fieldPost], 40);
  }
}

function start(formName) {
  debug('function start', 99);    
  debug('start of start function', 60);
  debug('formName: ' + formName, 40);
  
  readValues(formName);
  
  debug('start function step 2', 60);
  
  mortgage1BalanceSet(formName,'initial');
  mortgage2BalanceSet(formName,'initial');
  propertyTypeSet(formName,'initial');
  propertyValueSet(formName,'initial');
  acceptReduceCashSet(formName,'initial');


  debug('start function step 3', 60);
  
  show('refinanceRateFieldBlock');
  hide('propertyZipFieldBlock');

  show('mortgage1BalanceH1');
  hide('mortgage1BalanceH2');

  hide('mortgage1PaymentFieldBlock');
  hide('mortgage2PaymentFieldBlock');

  debug('refinanceWhichLoan: ' + values["refinanceWhichLoan"], 40);
  debug('end of start function', 60);
  show('mortgage1BalanceFieldBlock');
  show('mortgage2BalanceFieldBlock');

}



function formModification(formName) {
  readValues(formName);
  if (validated == true) {
    validateAll(formName,'silent');
  }
}



function rebuildSelect(formName,selectName,selectList,setValue) {
  debug('function rebuildSelect', 99);    
  var formElement = document.forms[formName].elements[selectName];
  zeroSelect(formName,selectName);
  var i = 0;
  for (var fields in list[selectList]) {
    formElement.options[i] = new Option(list[selectList][fields][0],list[selectList][fields][1]);
    i++;   
  }
  if (setValue) {
    var selIndex  = whichOption(formName,selectName,values[selectName]);
    formElement.selectedIndex = selIndex;
  }
}

function setSelect(formName,selectName,setValue) {
  debug('function setSelect', 99);    
  debug('function setSelect start', 15);
  var formElement = document.forms[formName].elements[selectName];
  var selIndex  = whichOption(formName,selectName,setValue);
  formElement.selectedIndex = selIndex;
  values[selectName] = setValue;
  debug('function setSelect end', 15);
}

function whichOption(formName,selectName,selectedValue) {
  debug('function whichOption', 99);    
  var formElement = document.forms[formName].elements[selectName];
  for (i=0;i<formElement.length;i++) {
    if (formElement.options[i].value == selectedValue) {
      return i;
    }
  }
  return '';
}

function removeFromSelect(formName,selectName,removeValue) {
  debug('function removeFromSelect', 99);    
  var formElement = document.forms[formName].elements[selectName];
  for (i=0;i<formElement.length;i++) {
    if (formElement.options[i].value == removeValue) {
      formElement.options[i] = null;
    }
  }
}

function addToSelect(formName,selectName,addValue,addDisplay) {
  debug('function addToSelect', 99);    
  var formElement = document.forms[formName].elements[selectName];
  var newOpt = formElement.options.length;
  formElement.options[newOpt] = new Option(addDisplay,addValue);
}

function zeroSelect(formName,selectName) {
  debug('function zeroSelect', 99);    
  var formElement = document.forms[formName].elements[selectName];
  formElement.options.length = 0;
}

function maxSelectValue(formName,selectName,maxValue) {
  debug('function maxSelectValue', 99);    
  var formElement = document.forms[formName].elements[selectName];
  for (i=0;i<formElement.length;i++) {
    if (formElement.options[i].value != "" && formElement.options[i].value > maxValue) {
      formElement.options[i] = null;
      i--;
    }
  }
}

function minSelectValue(formName,selectName,minValue) {
  debug('function minSelectValue', 99);    
  var formElement = document.forms[formName].elements[selectName];
  for (i=0;i<formElement.length;i++) {
    if (formElement.options[i].value != "" && formElement.options[i].value < minValue) {
      formElement.options[i] = null;
      i--;
    }
  }
}


// to hide or show part of the page

function getObj(theObjID) {
  debug('function getObj', 99);    
  if (document.getElementById) {
    this.obj = document.getElementById(theObjID);
    this.style = document.getElementById(theObjID).style;
  } else if (document.all) {
    this.obj = document.all[theObjID];
    this.style = document.all[theObjID].style;
  } else if (document.layers) {
    this.obj = document.layers[theObjID];
    this.style = document.layers[theObjID];
  }
}

function hide(theObjID) {
  debug('function hide', 99);    
  var o = new getObj(theObjID);
  o.style.display = 'none';
}

function show(theObjID) {
  debug('function show', 99);    
  var o = new getObj(theObjID);
  o.style.display = 'block';
}

function replaceObjContent(theObjID,newContent) {
  debug('function replaceObjContent', 99);    
  var o = new getObj(theObjID);
  clearObjContent(theObjID);
  var c = document.createTextNode(newContent);
  o.obj.appendChild(c);
}

function clearObjContent(theObjID) {
  debug('function clearObjContent', 99);    
  var o = new getObj(theObjID);
  // alert(theObjID + ': ' + o.obj.childNodes);
  while (o.obj.childNodes.length > 0) {
    o.obj.removeChild(o.obj.firstChild);
  }
}

function replaceClass(theObjID,newClass) {
  debug('function replaceClass', 99);    
  var o = new getObj(theObjID);
  o.obj.className = newClass;
}

function debug(message, value) {
  // values and meanings:
  // 1-59: low (showing value as they are being set, etc...)
  // 60-69: steps (to check if/when something goes wrong)
  // 70-100: special (to indentify something specific)
  var mindebug = 0;
  var maxdebug = 0;
  if (value >= mindebug && value <= maxdebug) {
    alert(message);
  }
}

