/*
  COPYWRITE

  This javascript library file is the sole property of Art Main and GoldCoastDesign and may
  not be reproduced, sold, or used in whole or in part for any purpose other than intended.
  All rights to this code is not transfered to the client it was provided for.  This code
  may be used for the single domain and purpose as provided by Art Main and GoldCoastDesign
  to the client it is intended for.

  Questions or concerns may be directed to info@goldcoastdesign.org

*/

/*
  Function list:

  * isEmpty(myVal) -> true/false
  * isEmptySelect(myVal,defaultVal) -> true/false
  * isEmail(string myVal) -> true/false
  * isDate(string myVal) -> true/false
  * isUSPhone(string myVal) -> true/false
  * isCurrency(string myVal) -> true/false
  * isNum(digit myVal) -> true/false
  * isValidDate(string myVal,string date_format) -> true/false
  * addYear(string myVal) -> myVal/myVal+/current 2 digit year
  * isWithinLength(obj myField,int minLength,int maxLength) -> true/false
  * showErrorMsg(obj el,string msg)
  * clearAllErrorMsg()
  * clearErrorMsg([obj e/null],[string el_id/null])
  * submitForm(string form_name)
  * disableElmt(string el_id,string myForm)
  * enableElmt(string el_id,string myForm)
  * setCheckElmt(string el_id,string myForm)
  * unCheckElmt(string el_id,string myForm)
  * getFormValues([array string fieldnames/null],[string form_name/null]) -> array [fieldname]->value
  * getFormValuesByDivID(string div_id) -> array [fieldname]->value
  * serialize(array obj myArray) -> string serialized
  * serializeForm(obj formObj) -> string serialized
  * checkField(obj el,obj myField) -> true/false->shows error
  * focusFirstFormElement(obj myForm)

*/

function isEmpty(myVal) {
  return (myVal.length == 0);
}

function isEmptySelect(myVal,defaultVal) {
  if (!defaultVal) {
    defaultVal = 0;
  }
  return (myVal == defaultVal);
}

function isEmail(myVal) {
  regex = /^\w[-._\w]*\w@\w[-._\w]*\w\.\w{2,8}$/;
  return regex.test(myVal);
}

function isDate(myVal) {
  regex = /^(0?[1-9]|1[0-2])\/(0?[1-9]|[1-2][0-9]|3[01])(\/\d{2})?$/;
  return regex.test(myVal);
}

function isUSPhone(myVal) {
  regex = /^(\()?\d{3}(\))?(\D)?\d{3}(\D)?\d{4}$/;
  return regex.test(myVal);
}

function isCurrency(myVal) {
  regex = /^\$?\d+(\.\d{2})?$/;
  return regex.test(myVal);
}

function isNum(myVal) {
  regex = /\d+/;
  return regex.test(myVal);
}

function isValidDate(myVal,date_format) {
  switch (date_format) {
    case "mm/dd":
      regex = /^\d{2}\/\d{2}$/;
      break;
  }
  if (!regex) {
    return false;
  }
  return regex.test(myVal);
}

function addYear(myVal) {
  regex = /^(0?[1-9]|1[0-2])\/(0?[1-9]|[1-2][0-9]|3[01])\/\d{2}?$/;
  if (regex.test(myVal)) {
    return myVal;
  } else {
    todayDate = new Date();
    var myYear = todayDate.getFullYear().toString();
    //var myYear = "2006";
    smYear = myYear.substr(2);
    return myVal+"/"+smYear;
  }
}

function isWithinLength(myField, minLength, maxLength) {
  minLength = (minLength) ? minLength : 0;
  if (maxLength) {
    if (myField.value.length > maxLength) {
      return false;
    }
  }
  return (myField.value.length >= minLength);
}

function showErrorMsg(el,msg) {
  var msg_id = el.id+"_msg";

  var mySpan;

  if (document.getElementById(msg_id)) {
    mySpan = document.getElementById(msg_id);
    mySpan.innerHTML = msg;
  } else {
    var myMsg = document.createTextNode(msg);
    mySpan = document.createElement('div');
    mySpan.id=el.id+"_msg";
    mySpan.className="showErrorMsg";
    //alert(mySpan.className);
    mySpan.appendChild(myMsg);
    el.parentNode.appendChild(mySpan);
  }
}

function clearAllErrorMsg() {
  var myMsgs = document.getElementsByTagName('div');
  myCount = myMsgs.length;

  for (i=0;i<myCount;i++) {
    if (myMsgs[i] && myMsgs[i].className.indexOf("showErrorMsg") != -1) {
      clearErrorMsg(null,myMsgs[i].id+"_msg");
    }
  }
}

function clearErrorMsg(e,el_id) {
  var el = null;
  var msg_id = null;


  if (el_id) {
    el = document.getElementById(el_id);
    msg_id = el_id;
  } else {
    el = getTarget(e);
    msg_id = el.id+"_msg";
  }

  if (!el) {
    return;
  }

  var myMsg = document.getElementById(msg_id);
  if (myMsg) {
    myMsg.parentNode.removeChild(myMsg);
  }
}

function submitForm(form_name) {
  document.forms[form_name].submit();
}

function disableElmt(el_id,myForm) {
  var el = null;
  if (myForm) {
    el = document.forms[myForm].elements[el_id];
  } else {
    el = document.getElementById(el_id);
  }
  if (el) el.disabled=true;
}

function enableElmt(el_id,myForm) {
  var el = null;
  if (myForm) {
    el = document.forms[myForm].elements[el_id];
  } else {
    el = document.getElementById(el_id);
  }
  if (el) el.disabled=false;
}

function setCheckElmt(el_id,myForm) {
  var el = null;
  if (myForm) {
    el = document.forms[myForm].elements[el_id];
  } else {
    el = document.getElementById(el_id);
  }
  if (el) el.checked=true;
}

function unCheckElmt(el_id,myForm) {
  var el = null;
  if (myForm) {
    el = document.forms[myForm].elements[el_id];
  } else {
    el = document.getElementById(el_id);
  }
  if (el) el.checked=false;
}

function getFormValues(fieldnames,form_name) {
  var myForm = (form_name) ? document.forms[form_name] : document.forms[0];
  var myElmts = myForm.elements;
  var myArray = new Array();
  var count = 0;

  if (fieldnames) {
    var myFields = fieldnames.split(',');
    count = myFields.length;
  } else {
    count = myElmts.length;
  }

  var myEl = null;
  var myName = null;
  for (i=0;i<count;i++) {
    if (fieldnames) {
      myEl = myForm.elements[myFields[i]];
      myName = myFields[i];
    } else {
      myEl = myForm.elements[i];
      myName = myEl.name;
    }

    if (myEl) {
      if (myEl.type == "checkbox") {
        myArray[myName] = myEl.checked;
      } else if (myEl.type.indexOf("select") != -1) {
        myArray[myName] = new Array();
        myArray[myName][0] = myEl.value;
      } else {
        myArray[myName] = myEl.value;
      }
    }
  }
  return myArray;
}

function getFormValuesByDivID(div_id) {
  var excludeElmts = {
    "submit" : 1,
    "cancel" : 1,
    "reset" : 1
  };
  var myDiv = document.getElementById(div_id);

  if (!myDiv) return;
  var myInputs = myDiv.getElementsByTagName("input");
  var mySelects = myDiv.getElementsByTagName("select");

  var myFields = new Array();
  for (i=0;i<myInputs.length;i++) {
    if (!excludeElmts[myInputs[i].name]) {
      myFields.push(myInputs[i].name);
    }
  }
  for (i=0;i<mySelects.length;i++) {
    myFields.push(mySelects[i].name);
  }
  var fieldnames = myFields.join(",");
  //alert(fieldnames);
  return getFormValues(fieldnames);
}

/**
* serialize()
* this function serialize a javascript array to pass it to php and php can unserialize it
* Updated 01/13/07 to be recursive for multi-dimensional arrays
*
* @param     array
* @return     string
*/
function serialize(myArray)
{
    var counter = 0;
    var vardef = "";
    for (key in myArray)
    {

        counter++;
        var length = myArray[key].length;
        if (!length) {
          length = 0;
        }

        if (typeof(myArray[key])=="object") {
          vardef += serialize(myArray[key])+";";
        } else {
          vardef += "s:" + key.length + ":\"" + key + "\";" + "s:" + length + ":\"" + myArray[key] + "\";";
        }


    }
    var serialized = "a:" + counter + ":{" + vardef + "}";
    return serialized;
}

var excludeElmts = {
  "submit" : 1,
  "reset" : 1
};
function serializeForm(formObj) {
  myLength = formObj.length;
  myArray = new Array();

  for(i = 0; i < myLength; i++) {
    if (!excludeElmts[formObj.elements[i].name] && !myArray[formObj.elements[i].name]) {
      if (formObj.elements[i].type == "radio") {
        myArray[formObj.elements[i].name] = getCheckedValue(formObj[formObj.elements[i].name]);
      } else {
        myArray[formObj.elements[i].name] = formObj.elements[i].value;
      }
    }
  }
  return serialize(myArray);
}

function checkField(el,myField) {
  var isValid = true;

  switch (myField.e_type) {
    case "text":
      if (isEmpty(el.value)) {
        isValid = false;
      }
      break;
    case "currency":
      if (myField.is_required && isEmpty(el.value)) {
        isValid = false;
      } else if (!isEmpty(el.value) && !isCurrency(el.value)) {
        isValid = false;
      }
      break;
    case "numeric":
      if (myField.is_required && isEmpty(el.value)) {
        isValid = false;
      } else if (!isEmpty(el.value) && !isNum(el.value)) {
        isValid = false;
      }
      break;
    case "select":
      if (isEmptySelect(el.value)) {
        isValid = false;
      }
      break;
  }

  if (!isValid) {
    showErrorMsg(el,myField.msg);
  }

  return isValid;
}

function focusFirstFormElement(myForm) {
  // Function to set focus to first real form element ("fieldset" is a form element,
  // but we want to skip those);

  if (!myForm || !myForm.elements) {
    return;
  }
  var i=0;
  var found = null;

  while (!found && i<myForm.elements.length) {
    if (myForm.elements[i].tagName.toLowerCase() != "fieldset" && myForm.elements[i].type != "hidden") {
      found = i;
    }
    i++;
  }

  if (found) {
    myForm.elements[found].focus();
  }
}
