// エラー時の背景色
var errorColor = "#FDE7F2";
var errorFontColor = "#FF0000";

// 同一チェックエラー時の背景色
var sameErrorColor = "#C49CA6"


/** バリデーション用関数セットの配列 ここから */
validateObj = new Array;

// 必須チェック
validateObj.Required = 
{
  validate:function(v, m) {
   return v.length>0;
  },
  message:function(m) {
   return '必須入力項目です。';
  }
}
// 長さチェック
validateObj.Length = 
{
  validate:function(v, m) {
   return m.value >= v.length;
  },
  message:function(m) {
   return m.value+'文字以内で入力してください。';
  }
}
// Emailチェック
validateObj.Email = 
{
  validate:function(v, m) {
  return (null != v.match(/^[-A-Za-z0-9_\\.]+@[-A-Za-z0-9\\.]+$/));
  },
  message:function(m) {
   return '有効なメールアドレスを入力してください。';
  }
}
// カナチェック
validateObj.Kana = 
{
  validate:function(v, m) {
  return (null != v.match(/^[ァ-ヶ・ーヽヾ]*$/));
  },
  message:function(m) {
   return '全角カナを入力してください。';
  }
}
// 半角英数チェック
validateObj.AlphaNum2 = 
{
  validate:function(v, m) {
    var result = (null != (v.match(/^[-A-Za-z0-9_\\.\\+]*$/)));
    if(m.applicableStrict=='true') {
     result += (null == (v.match(/^[-_\\.\\+].*$/)));
     result += (null == (v.match(/^.*[-_\\.\\+]$/)));
     result += (null == (v.match(/[-_\\.\\+]{2,}/)));
    }
    return result==4;
  },
  message:function(m) {
    if(m.applicableStrict=='true') {
     return '半角英数字または記号([-][_][.][+])を入力してください。(記号を先頭・末尾に置くこと、連続して使用することはできません)';
    } else {
     return '半角英数を入力してください。';
    }
  }
}
// 数値チェック
validateObj.Digit = 
{
  validate:function(v, m) {
    var result =  v.match(/^[0-9]*$/);
    var nresult = null;
    if(m.allowNegative=='true') {
      nresult = (v.match(/^-[0-9]*$/));
    }
    return (null != result || null != nresult);
  },
  message:function(m) {
   return '半角数字を入力してください。';
  }
}

//範囲チェック
validateObj.Range = 
{
  validate:function(v, m) {
    var target = ("0000000000000000000" + v).slice(-19);
    var max = ("0000000000000000000" + m.max).slice(-19);
    var min = ("0000000000000000000" + m.min).slice(-19);
    return (min <= target) && (max >= target)
  },
  message:function(m) {
    // 10.2.3 10423 修正 ここから
    // return m.min +'~'+ m.max +'の範囲で入力してください。';
    if (m.max == 9223372036854775807) {
      return m.min + "以上の値を入力してください。";
    } else if (m.min == -9223372036854775808) {
      return m.max + "以下の値を入力してください。";
    } else {
      return m.min +"..."+ m.max +"の範囲で入力してください。";
    }
    // 10.2.3 10423 修正 ここまで
  }
}

//郵便番号チェック
validateObj.PostalCode = 
{
  validate:function(v, m) {
    var result =  v.match(/^[0-9]{7}$/);
    // 10.2.3 10426 修正 ここから
    // return (null != result) && (0 != result);
    return result != null;
    // 10.2.3 10426 修正 ここまで
  },
  message:function(m) {
    return '有効な郵便番号を入力してください。';
  }
}
/** バリデーション用関数セットの配列 ここまで */

// メッセージ表示
function createErrorMessage(obj, msg, name) {
 
 // 対象項目用のメッセージエリアが既に存在すれば除去
 //var msgArea = document.getElementById('msg_' + obj.id);
 var msgArea = document.getElementById('msgArea');
 if (msgArea) {
  clearMsg(obj);
 }
 
 var targetEle = obj; //位置を取得したい要素Object
 var pos = new function(){ this.x = 0; this.y = 0; }
 while ( targetEle ) {
  pos.x += targetEle.offsetLeft; 
  pos.y += targetEle.offsetTop; 
  targetEle = targetEle.offsetParent;
 }
 var ele = document.createElement("div"); // 新規に要素（タグ）を生成
 var str = document.createTextNode(name+'は'+msg); // 生成する要素の値（文字列）
 ele.appendChild(str); // 生成する要素の作成（要素に値を追加）
 
 ele.style.position='absolute';
 ele.style.top=(pos.y-50)+'px';
 ele.style.left=pos.x+'px';
// ele.style.width=(name.length+msg.length)+'em';
 ele.className = 'errorMessageArea';
 ele.style.nowrap='true';
 
 ele.id='msgArea';
 document.body.appendChild(ele);
 return;
}

// メッセージ表示エリア削除
function clearMsg(obj) {
 var id_name = 'msgArea';
 if(!document.getElementById(id_name)) {
  return;
 }
 var dom_obj=document.getElementById(id_name);
 var dom_obj_parent=dom_obj.parentNode;

 dom_obj_parent.removeChild(dom_obj);
 return;
}

// 背景色変更(対象, 色)
function changeBgColor(obj, color) {
 //obj.style.backgroundColor = color;
}


// バリデーション実行(対象, 関数の属性名)
function validate(obj, attrs) {

 var agent = navigator.userAgent;
 // IE6だったらチェックは行わない
 if(agent.indexOf("MSIE 6") >= 0) {
   return;
 }
 
 // 必須チェックは行わない ここから
 if (obj.value.length == 0) {
   clearMsg(obj);
   return;
 }
 // 必須チェックは行わない ここまで
 
 var name = attrs.Metadata;
 var method = attrs.method;
 
 for (var i=0; i<method.length; i++) {
 
  // 指定の関数がjs内に定義されていない場合
  if(!validateObj[method[i].title]) {
   continue;
  }
  var func = validateObj[method[i].title];
  
  if(func.validate(obj.value, method[i]) == false) {
   changeBgColor(obj, errorColor);
   
   //メッセージ表示
   createErrorMessage(obj, func.message(method[i]), name);
   return;
  } else {
   changeBgColor(obj, '');
   //メッセージ削除
   clearMsg(obj);
  }
 }
 return;
}

// 同一チェック
function checkSame(inputObj, targetID) {
 var inputVal = inputObj.value;
 var targetObj =  document.getElementById(targetID);
 var targetVal = targetObj.value; 

 if(0 == targetVal.length || 0 == inputVal.length) {
  return;
 }
 
 if(inputVal == targetVal) {
  changeBgColor(inputObj, '');
  changeBgColor(targetObj, '');
  
  //メッセージ削除
  clearMsg(inputObj);
  clearMsg(targetObj);
 } else {
  changeBgColor(inputObj, sameErrorColor);
  changeBgColor(targetObj, sameErrorColor);
 }
 return;
}
