/* ===============================================
 * フォーム入力 検証 ver2.0
 * ===============================================
 * javascript 1.3
 * -----------------------------------------------
 * Copyright(C) 2003 KK mediaplan murakami jimusyo
 * ----------------------------------------------- */

/* 

 総合チェック
 Validation(entry)

 入力・選択チェック
 isBlank(target)     TEXT,PASSWORD,TEXTAREA
 isSelected(target)  SELECT
 isChecked(target)   RADIO,CHECKBOX

 形式チェック
 isZipcode(target, label)   郵便番号
 isTelnumber(target, label) 電話番号 (Q2禁止)
 isEmail(target, label)     メールアドレス
 isURL(target, label)       URL
 isYear(target, label)      年 (現在から前後150年)
 isMonth(target, label)     月
 isDay(target, label)       日

 isNumber(target, label)        数値
 isAlpha(target, label)         アルファベット
 isAlphaOrNumber(target, label) 数値orアルファベット
 isSafeString(target, label)    AorN と "_","-"

 isInRange(target, label, min, max)    min-maxの範囲の文字列
 isIntInRange(target, label, min, max) min-maxの範囲の数値

 */


// 総合チェック
function Validation(entry)
{
  for (var i = 0; i < entry.length; i++) {

    if (entry[i].length > 2) {

      if (entry[i][entry[i].length - 1] != 'loose') {

        if (!checkInput(entry[i])) return false;
      }

      if (!checkFormat(entry[i])) return false;

    } else {

      if (!checkInput(entry[i])) return false;

    }

  }

  return true;
}

// 入力・選択チェック
function checkInput(array)
{
  var form  = array[0];
  var label = array[1];

  if (form.type) {
    switch (form.type) {
    case 'text':
    case 'password':
    case 'textarea':

      if (isBlank(form)) {

       alert(label + 'をご記入ください。');
       form.focus();

       return false;
      }
      break;

    case 'select-one':
    case 'select-multiple':

      if (!isSelected(form)) {

       alert(label + 'を選択してください。');
       form.focus();

       return false;
      }
      break;

    default:

      alert(form.name + ' は無効なタイプです。');

      return false;
    }

  } else {

    if (form[0].type == ('radio' || 'checkbox')) {

      if (!isChecked(form)) {

      alert(label + 'を選択してください。');

      return false;
     }

    } else {

      alert(form[0].name + ' は無効です。');

      return false;
    }
  }

  return true;
}

// 形式チェック
function checkFormat(array)
{
  var form  = array[0];
  var label = array[1];
  var type  = array[2];

  switch (type) {

  case 'Zipcode':
    if (!isZipcode(form, label)) return false;
    break;

  case 'Telnumber':
    if (!isTelnumber(form, label)) return false;
    break;

  case 'Email':
    if (!isEmail(form, label)) return false;
    break;

  case 'URL':
    if (!isURL(form, label)) return false;
    break;

  case 'Year':
    if (!isYear(form, label)) return false;
    break;

  case 'Month':
    if (!isMonth(form, label)) return false;
    break;

  case 'Day':
    if (!isDay(form, label)) return false;
    break;

  case 'Number':
    if (!isNumber(form, label)) return false;
    break;

  case 'Alpha':
    if (!isAlpha(form, label)) return false;
    break;

  case 'AlphaOrNumber':
    if (!isAlphaOrNumber(form, label)) return false;
    break;

  case 'SafeString':
    if (!isSafeString(form, label)) return false;
    break;

  case 'InRange':
    var min = array[3];
    var max = array[4];

    if (!isInRange(form, label, min, max)) return false;
    break;

  case 'IntInRange':
    var min = array[3];
    var max = array[4];

    if (!isIntInRange(form, label, min, max)) return false;
    break;

  default:
      alert(form.name + ' の指定は無効です。');
  }

  return true;
}


/* ----------------------------------------------
 * 入力・選択チェック
 * ---------------------------------------------- */

// 入力
function isBlank(target)
{
  if (target.value.replace(/\s/g, '') == '') return true;

  return false;
}

// 選択 SELECT
function isSelected(target)
{
  if (target.selectedIndex < 0 ||
      target.value == '') return false;

  return true;
}

// 必須項目 選択 RADIO
function isChecked(target)
{
  var checked = false;

  for (var i = 0; i < target.length; i++) {
    if (target[i].checked) {
      checked = true;
      break;
    }
  }

  if (!checked) return false;

  return true;
}

/* ----------------------------------------------
 * 形式チェック
 * ---------------------------------------------- */

// 郵便番号
function isZipcode(target, label)
{
  if (target.value == '') return true;

  if (target.value.match(/^\d{7}$/) || 
      target.value.match(/^\d{3}-\d{4}$/)) {

    return true;
  }

  alert(label + 'は7桁の半角数字でご記入ください。');
  target.focus();

  return false;
}

// 電話番号
function isTelnumber(target, label)
{
  if (target.value == '') return true;

  var number = target.value.replace(/-/g, '');

  // Q2ダイヤル禁止
  if (number.match(/^0990/)) {
    alert("Q2ダイヤルは送信できません。");
    target.focus();

    return false;
  }

  if (number.match(/^\d{8,11}$/) &&
      target.value.match(/^\d{8,11}|(\d{2,6}-){1,2}\d{4,7}$/)) {

    return true;
  }

  alert(label + "の形式が間違っています。\nケタは正しいか、半角数字,'-'以外が記入されていないかご確認ください。");
  target.focus();

  return false;
}

// メールアドレス
function isEmail(target, label)
{
  if (target.value == '') return true;

  var input = target.value.split('@');

  if (input.length == 2) {
    if (input[0].match(/^[0-9a-zA-Z_\.\-\+\/\?]{3,}$/) &&
        input[1].match(/^([0-9a-zA-Z_\-]+\.){1,3}[a-z]{2,6}$/)) {

      return true;
    }
  }

  alert(label + "の形式が間違っています。");
  target.focus();

  return false;
}

// URL
function isURL(target, label)
{
  if (target.value == '') return true;

  if (target.value.match(/^(http(s)?:\/\/[\!-;\=\?-\~]+)$/i)) {

    return true;
  }

  alert(label + "の形式が間違っています。");
  target.focus();

  return false;
}

// 誕生年
function isYear(target, label)
{
  if (target.value == '') return true;

  var date = new Date();
  var year = date.getYear();

  if (!isIntInRange(target, label, year - 150, year + 150)) return false;

  return true;
}

// 月
function isMonth(target, label)
{
  if (target.value == '') return true;

  if (!isIntInRange(target, label, 1, 12)) return false;

  return true;
}

// 日
function isDay(target, label)
{
  if (target.value == '') return true;

  if (!isIntInRange(target, label, 1, 31)) return false;

  return true;
}

// 数値
function isNumber(target, label)
{
  if (target.value == '') return true;

  if (isNaN(target.value)) {

    alert(label + 'に半角数字以外が含まれています。');
    target.focus();

    return false;
  }

  return true;
}

// アルファベット
function isAlpha(target, label)
{
  if (target.value == '') return true;

  if (target.value.match(/[^a-zA-Z]/)) {

    alert(label + 'に半角英字以外が含まれています。');
    target.focus();

    return false;
  }

  return true;
}

// 数値 or アルファベット
function isAlphaOrNumber(target, label)
{
  if (target.value == '') return true;

  if (target.value.match(/[^0-9a-zA-Z]/)) {

    alert(label + 'に半角英数字以外が含まれています。');
    target.focus();

    return false;
  }

  return true;
}

// アカウントパスワード等に使用可能な文字列
function isSafeString(target, label)
{
  if (target.value == '') return true;

  if (target.value.match(/[^0-9a-zA-Z_ \-@.]/)) {

    alert(label + 'に半角英数字,"_","-","@","."以外が含まれています。');
    target.focus();

    return false;
  }

  return true;
}

// 指定された桁の範囲の文字列
function isInRange(target, label, min, max)
{
  if (target.value == '') return true;

  if (target.value.length >= min && target.value.length <= max) {

    return true;
  }

  if (min == max) {
    alert(label + 'は、' + min + '桁でご記入ください。');
  } else {
    alert(label + 'は、' + min + '〜' + max + 'の範囲でご記入ください。');
  }

  target.focus();

  return false;
}

// 指定された範囲にある数値
function isIntInRange(target, label, min, max)
{
  if (target.value == '') return true;

  if (!isNumber(target, label)) {

    return false;
  }

  if (eval(target.value) >= eval(min) && eval(target.value) <= eval(max)) {

    return true;
  }

  alert(label + 'は、' + min + '〜' + max + 'の範囲でご記入ください。');
  target.focus();

  return false;
}

// 拡張子を取得
function getExt(str)
{
  if (str.match(/[^0-9a-zA-Z_: \-\.\\]/)) {

   alert("アップロードするファイル名に、使用できない文字が含まれています。\n(日本語 # $ @ % / ... など)");

   return false;
  }

  var unit = str.split(".");
  var last = unit.length -1;

  return unit[last];
}
