function qf_errorHandler(element, _qfMsg) {
  div = element.parentNode;
  var elementName = element.name.replace(/\[/, "_____");
  var elementName = elementName.replace(/\]/, "_____");
  if (_qfMsg != '') {
    span = document.createElement("span");
    span.className = "error";
    _qfMsg = _qfMsg.substring(4);
    span.appendChild(document.createTextNode(_qfMsg));
    br = document.createElement("br");

    var errorDiv = document.getElementById(elementName + '_errorDiv');
    if (!errorDiv) {
      errorDiv = document.createElement("div");
      errorDiv.id = elementName + '_errorDiv';
    } else {
      if (   div.firstChild.textContent == ''
          || _qfMsg == div.firstChild.textContent
         ) {
        return false;
      }
    }
    while (errorDiv.firstChild) {
      errorDiv.removeChild(errorDiv.firstChild);
    }

    errorDiv.insertBefore(br, errorDiv.firstChild);
    errorDiv.insertBefore(span, errorDiv.firstChild);

    errorDivInserted = false;
    for (var i = element.parentNode.childNodes.length - 1; i >= 0; i--) {
      j = i - 1;
      if (j >= 0 && element.parentNode.childNodes[j].nodeName == "DIV") {
        element.parentNode.insertBefore(errorDiv, element.parentNode.childNodes[i]);
        errorDivInserted = true;
        break;
      }
    }
    if (!errorDivInserted) {
      element.parentNode.insertBefore(errorDiv, element.parentNode.firstChild);
    }

    if (div.className.substr(div.className.length - 6, 6) != " error"
        && div.className != "error") {
      div.className += " error";
    }

    return false;
  } else {
    var errorDiv = document.getElementById(elementName + '_errorDiv');
    if (errorDiv) {
      errorDiv.parentNode.removeChild(errorDiv);
    }
    
    // do not remove the error style from the div tag if there is still an error
    // message
    if (div.firstChild.innerHTML != "") {
      return true;
    }

    if (div.className.substr(div.className.length - 6, 6) == " error") {
      div.className = div.className.substr(0, div.className.length - 6);
    } else if (div.className == "error") {
      div.className = "";
    }

    return true;
  }
}
function validate_first_f_name(element) {
  var value = '';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = '';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
  value = frm.elements['f_name'].value;
  if (value == '' && !errFlag['f_name']) {
    errFlag['f_name'] = true;
    _qfMsg = _qfMsg + '\n - 名前は必須入力です。';
  }

  return qf_errorHandler(element, _qfMsg);
}

function validate_first_f_comment(element) {
  var value = '';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = '';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
  value = frm.elements['f_comment'].value;
  if (value == '' && !errFlag['f_comment']) {
    errFlag['f_comment'] = true;
    _qfMsg = _qfMsg + '\n - コメントは必須入力です。';
  }

  return qf_errorHandler(element, _qfMsg);
}

function validate_first_f_pass(element) {
  var value = '';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = '';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
  value = frm.elements['f_pass'].value;
  var regex = /^[a-zA-Z0-9]+$/;
  if (value != '' && !regex.test(value) && !errFlag['f_pass']) {
    errFlag['f_pass'] = true;
    _qfMsg = _qfMsg + '\n - パスワードは 半角小文字英数字 で入力して下さい。';
  }

  value = frm.elements['f_pass'].value;
  if (value != '' && (value.length < 6 || value.length > 16) && !errFlag['f_pass']) {
    errFlag['f_pass'] = true;
    _qfMsg = _qfMsg + '\n - パスワードは 半角小文字英数字 6〜16 文字 で入力して下さい。';
  }

  return qf_errorHandler(element, _qfMsg);
}

function validate_first_f_mail(element) {
  var value = '';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = '';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
  value = frm.elements['f_mail'].value;
  var regex = /^[a-zA-Z0-9_\.\-]+@(([a-zA-Z0-9_\-]+\.)+[a-zA-Z0-9]+)$/;
  if (value != '' && !regex.test(value) && !errFlag['f_mail']) {
    errFlag['f_mail'] = true;
    _qfMsg = _qfMsg + '\n - メールの記述に誤りがあります。';
  }

  return qf_errorHandler(element, _qfMsg);
}



function validate_first_f_url(element) {
  var value = '';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = '';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
  value = frm.elements['f_url'].value;
  var regex = /^(https?|ftp)(:\/\/([a-zA-Z0-9\+$\;\?\.%,!#~*\/:@&=_-]*))$/;
  if (value != '' && !regex.test(value) && !errFlag['f_url']) {
    errFlag['f_url'] = true;
    _qfMsg = _qfMsg + '\n - URLの記述に誤りがあります。';
  }

  return qf_errorHandler(element, _qfMsg);
}

function validate_first(frm) {
  var ret = true;

  ret = validate_first_f_name(frm.elements['f_name']) && ret;
  ret = validate_first_f_comment(frm.elements['f_comment']) && ret;
  ret = validate_first_f_pass(frm.elements['f_pass']) && ret;
  ret = validate_first_f_mail(frm.elements['f_mail']) && ret;
  ret = validate_first_f_url(frm.elements['f_url']) && ret;;
  return ret;
}
