/*
* Jquery 檢測密碼
* passwordRating 定義密碼強度 (正規法)
* password 密碼驗證方法
* account  帳號驗證方法
* telphone 電話驗證方法
*/
(function($) {
	
	var LOWER = /[a-z]/,
		UPPER = /[A-Z]/,
		DIGIT = /[0-9]/,
		DIGITS = /[0-9].*[0-9]/,
		SPECIAL = /[^a-zA-Z0-9]/,
		SAME = /^(.)\1+$/,
		LATTERS=/[a-zA-Z]/;
		
	function rating(rate, message) {
		return {
			rate: rate,
			messageKey: message
		};
	}
	
	function uncapitalize(str) {
		return str.substring(0, 1).toLowerCase() + str.substring(1);
	}

	
	$.validator.passwordRating = function(password, username) {
		if (!password || password.length < 4)
			return rating(0, "too-short");
		if (password.length > 15)
			return rating(0, "too-long");		
		if (username && password.toLowerCase().match(username.toLowerCase()))
			return rating(0, "similar-to-username");
		if (SAME.test(password))
			return rating(1, "very-weak");
		
		var lower = LOWER.test(password),
			upper = UPPER.test(uncapitalize(password)),
			digit = DIGIT.test(password),
			digits = DIGITS.test(password),
			special = SPECIAL.test(password);
			latters = LATTERS.test(password);
		
		if (lower && upper && digit && special)
			return rating(4, "strong");
		if (latters || digit )
			return rating(3, "good");
		
		return rating(2, "weak");
	}
	
	$.validator.passwordRating.messages = {
		"similar-to-username": "密碼與帳號太相似，請修改",
		"too-short": "密碼長度至少四個字元",
		"too-long":  "密碼長度最多十五個字元",
		"very-weak": "密碼強度很弱",
		"weak": "密碼強度弱(請用英數字混合)",
		"good": "密碼強度強",
		"strong": "密碼強度很強"
	}
	
	$.validator.addMethod("password", function(value, element, usernameField) {
		// use untrimmed value
		var password = element.value,
		// get username for comparison, if specified
			username = $(typeof usernameField != "boolean" ? usernameField : []);
			
		var rating = $.validator.passwordRating(password, username.val());
		// update message for this field
		
		var meter = $(".password-meter", element.form);
		
		meter.find(".password-meter-bar").removeClass().addClass("password-meter-bar").addClass("password-meter-" + rating.messageKey);
		meter.find(".password-meter-message")
		.removeClass()
		.addClass("password-meter-message")
		.addClass("password-meter-message-" + rating.messageKey)
		.text($.validator.passwordRating.messages[rating.messageKey]);
		// display process bar instead of error message
		MSG=$.validator.passwordRating.messages[rating.messageKey];
		return rating.rate > 2;
	}, "密碼格式不正確，請確認" );
	// manually add class rule, to make username param optional
	$.validator.classRuleSettings.password = { password: true };
	
	
	$.validator.addMethod("account", function(value, element) { 
	  return this.optional(element) || /^[a-zA-Z0-9]+$/.test(value); 
	}, "帳號組合只能為數字、英文字母(大小寫不同)");
	
	$.validator.addMethod("telphone", function(value, element) { 
	  return this.optional(element) || /^[0-9\-\(\)\ ]+$/.test(value); 
	}, "請輸入正確的電話格式");

	$.validator.addMethod("id_number", function(value, element) { 
	  return this.optional(element) || checkTwID(value); 
	}, "請輸入正確的身分證");
	
	$.validator.addMethod("company_sn", function(value, element) { 
	  return this.optional(element) || checkTB(value); 
	}, "請輸入正確的統一編號");

	//認證身分證
	function checkTwID(id){
		//建立字母分數陣列(A~Z)
		var city = new Array(
			 1,10,19,28,37,46,55,64,39,73,82, 2,11,
			20,48,29,38,47,56,65,74,83,21, 3,12,30
		)
		id = id.toUpperCase();
		// 使用「正規表達式」檢驗格式
		if (id.search(/^[A-Z](1|2)\d{8}$/i) == -1) {
			return false;
		} else {
			//將字串分割為陣列(IE必需這麼做才不會出錯)
			id = id.split('');
			//計算總分
			var total = city[id[0].charCodeAt(0)-65];
			for(var i=1; i<=8; i++){
				total += eval(id[i]) * (9 - i);
			}
			//補上檢查碼(最後一碼)
			total += eval(id[9]);
			//檢查比對碼(餘數應為0);
			return ((total%10 == 0 ));
		}
	}
	
	//認證統一編號
	function checkTB(sid){
		   var tbNum = new Array(1,2,1,2,1,2,4,1);
		   var temp = 0;
		   var total = 0;
		   //alert(sid.length);
		   if(sid=="") return false; //alert("請先輸入欲檢驗的營利事業統一編號!");
		   else if(!sid.match(/^\d{8}$/)) return false; //alert("營利事業統一編號長度不夠或格式有誤!請注意營利事業統一編號格式為八碼數字!");
		   else{
				 for(var i = 0; i < tbNum.length ;i ++){
					 temp = sid.charAt(i) * tbNum[i];
					 total += Math.floor(temp/10)+temp%10;
				 }
				 if(total%10==0 || (total%10==9 && sid.charAt(6)==7)) return true; //alert("營利事業統一編號正確!");
				 else return false;//alert("營利事業統一編號錯誤!");
		   }
	}	
	
})(jQuery);

