var validation = new Object();

var emailCharsBag = "_.";
var emailMaxLength = 50;

validation.isEmpty = function (s) {
	var str = s.strip();
	return (str == null || str == "");
}

validation.isContainSpace = function (str) {
	if(str.indexOf(" ") != -1) return true;
	else return false;
}

validation.checkMinLen = function (str, minLen){
	if(str.length < minLen) return false;
	return true;
}

validation.isInteger = function (s) {
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    return true;
}

validation.isTextOrInteger = function (str) {
    var strFilter  = /^([a-zA-Z0-9]{5,30})$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

/*full name*/
validation.isValidName = function (str) {
	var strFilter  = /^(\w)[\w\d\s-_]*[\w\d]$/i;
	if (!(strFilter.test(str))) return false;
	else return true;
}

validation.isValidExtraName = function (str) {
	var strFilter  = /^(\w)[\w\d\s-_.]*[\w\d]$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

validation.isValidExtraName_ = function (str) {
	var strFilter  = /^(\w)[\w\d\s-_.\']*[\w\d]$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

//account name
validation.isValidiRaveAccountName = function (str) {
	//var strFilter  = /^(\w)[\w\d-]*[\w\d]$/;
	var strFilter  = /^[0-9a-z]*$/i;
	return strFilter.test(str);
}


validation.isValidZipCode = function (n) {
	return this.isInteger(n) && n.length == 5;
}

validation.checkContacName = function (str) {
	return this.isValidEmail(str) || this.isValidName(str);
}

validation.checkContacExtraName = function (str) {
	return this.isValidEmail(str) || this.isValidExtraName_(str) ;//|| this.checkStringInQuote(str)
}

validation.checkEmailName = function (name) {
	var strFilter = /^[a-zA-Z0-9]+(\-[_a-zA-Z0-9-]+)*$/;
	if (!(strFilter.test(name))) return false;
	else return true;
}

validation.checkAliasName = function (name) {
	//var strFilter = /^[a-zA-Z0-9]+$/; // a charletter
	var strFilter = /^[a-zA-Z0-9\_]+$/;
	if (!(strFilter.test(name))) return false;
	else return true;
}

validation.checkAlbumName = function(str){
   //var strFilter = /^[a-zA-Z0-9\!\@\$\%\^\&\*\(\)\_\'\s]+$/;
   var strFilter = /^[a-zA-Z0-9\!\@\$\%\^\*\(\)\_\'\s\-\;\:\<\>\,\.\?\+\=\/\&\#\~\|\\\`\[\]\{\}\"]+$/; 
   if(!(strFilter.test(str))) return false;
   return true;
}

validation.isValidEmail = function (strng) {
	var emailFilter  = /^(\w)+[\w\d\-\.\_]*[\w\d]+@([\w\d\-]*\.)+[\w\d]{2,3}$/;
	if (!(emailFilter.test(strng))) return false;
	else return true;
}

validation.splitNameAndEmail = function(contact) {
	var email = null;
	var name = null;
	if(contact.indexOf('<') > -1 && contact.indexOf('>') > -1){
		var start = contact.indexOf('<') + 1;
    	var length1 = contact.indexOf('>') - start;
    	email = contact.substr(start, length1).strip();
    	name = contact.substr(0, start - 1).strip();
  	} else {
  		email = contact.strip();
  	}
  	return {'name': name, 'email': email};
}

validation.isValidPassword = function (str) {
	var strFilter  = /^([a-zA-Z0-9]{8,30})$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

validation.stripTags = function(str) {
	var result = "";
	result = str.replace("<", "&lt;");
	result = result.replace(">", "&gt;");
	return result;
}

validation.isValidAboutMe = function(str) {
//	var string = str.strip();
//	if(string == "") return true;
//	string = string.replace("\n", "");
//	var strFilter  = /^(\w)[\w\d\.\,\s-_]*[\w\d]+$/;
	//var strFilter  = /^(\w)[\w\d\+\*\$\%\!\@\#\^\&\(\)\.\:\,\'\?\"\=\s-_]*/;
//	if (!(strFilter.test(string))) return false;
//	else return true;
	return true;
}

/*validate birthday at signup & setting*/
validation.populate = function (objForm, selectIndex)  {
	//timeA = new Date(objForm.selectYear.options[objForm.selectYear.selectedIndex].text, objForm.selectMonth.options[objForm.selectMonth.selectedIndex].value,1);
	timeA = new Date(objForm.selectYear.value, objForm.selectMonth.options[objForm.selectMonth.selectedIndex].value,1);
	timeDifference = timeA - 86400000;
	timeB = new Date(timeDifference);
	var daysInMonth = timeB.getDate();
	var selectDay = objForm.selectDay;
	var dayNum = selectDay.length;
	var selectedDayIndex = selectDay.selectedIndex;

	if(daysInMonth != dayNum) {
		for (var i = 0; i < dayNum; i++) {
			selectDay.options[i] = null;
		}
		for (var i = 0; i < daysInMonth; i++) {
			selectDay.options[i] = new Option(i+1);
			selectDay.options[i].value = i + 1;
		}
		if(selectedDayIndex < daysInMonth)
			selectDay.options[selectedDayIndex].selected = true;
	}
}

//check input year by Yen
validation.isValidYear = function(eId, objForm, selectIndex){
    var string = $(eId).value.strip();
    //check 4 numbers
    var strFillter = /^[0-9]{4}$/;
    if(!strFillter.test(string)){
      return false;
    }else{
      //check year
      validation.populate(objForm, selectIndex);
      //check birthday with current day
      var today = new Date();
      var curDay = today.getDate();
      var curMonth = today.getMonth() + 1;
      var curYear = today.getFullYear();
      var curTime = new Date(curYear,curMonth,curDay);
      var time = new Date(objForm.selectYear.value, objForm.selectMonth.value, objForm.selectDay.value);
      if(time > curTime){
        return false;
      }else
         return true;
    }
}

//only input number by Yen
validation.inputNum = function(eId){
    var el = $(eId);
    el.onkeydown = function(evt){
        var crossEvent = (evt)? evt : event;
		var inputKey = crossEvent.keyCode;
		if((inputKey >= 48 && inputKey <= 57) || (inputKey >= 96 && inputKey <= 105) || (inputKey == 8) || (inputKey == 9) || (inputKey == 35) || (inputKey == 36) || (inputKey == 37) || (inputKey == 39) || (inputKey == 46)){
          return true;
		}else return false;
    }
}

//check list of emails at compose -> popup the invalid first email
validation.checkEmails = function (allTbValue, type) {
	var popUpHeight = 128;
	var invalidStr = false;
	if(this.isEmpty(allTbValue.strip())) {
		if(type.indexOf("cc") != -1) {
		  return true;
		}
		if(type.indexOf("to") != -1) {
			parent.popup.popItUp(null, jsVals.jalert.recipientRequired, 350, 115,'mainContent.to');
			return false;
		}
	}
	var tmpCheckStr = allTbValue.strip();
	while(tmpCheckStr.length > 0 ) {
		//Checking string in quote
		
		if(tmpCheckStr.charAt(0) == '"' ) {
			oTmpContact = this.splitNameAndEmail(tmpCheckStr.strip());
			if(!this.isValidEmail(oTmpContact.email) || !this.checkStringInQuote(oTmpContact.name.strip())  ) {
				invalidStr = true;
				break ;
			}
			//Remove email has checked
			newStop = tmpCheckStr.length;
			newStart = oTmpContact.name.length + oTmpContact.email.length;
			tmpCheckStr = tmpCheckStr.substring( newStart, newStop);			
		}
		else {
			strContact = tmpCheckStr.split(',')[0];
			oTmpContact = this.splitNameAndEmail(strContact);
			if(oTmpContact.name) {
				if(!this.checkContacExtraName(oTmpContact.name.strip()) || !this.isValidEmail(oTmpContact.email)) {
					invalidStr = true;
					break ;
				}
			}
			else {
				if(!this.isValidEmail(oTmpContact.email) ) {
					invalidStr = true;
					break ;
				}
			}
			
		}
		newStart = tmpCheckStr.indexOf(",");
		if(newStart == -1)
			break;
			
		newStop = tmpCheckStr.length;
		tmpCheckStr = tmpCheckStr.substring( newStart + 1, newStop).strip();
	}
	/*
	var semicolonArr = allTbValue.split(';');
	semicolonLoop:
	for(var i = 0; i< semicolonArr.length; i++) {
		var eleOfSemiArr = semicolonArr[i].strip();
		var commaArr = eleOfSemiArr.split(',');
		commaLoop:
		for(var j = 0; j< commaArr.length; j++) {
			var eleOfCommaArr = commaArr[j].strip();
			if(eleOfCommaArr != "") {
				if(!this.isValidEmail(eleOfCommaArr)) {
					var emailStart = eleOfCommaArr.indexOf("<");
					var emailStop = eleOfCommaArr.indexOf(">");
					if(emailStart != -1 && emailStop == eleOfCommaArr.length-1) {
						var email = eleOfCommaArr.substring(emailStart + 1, emailStop);

						var emailName = eleOfCommaArr.substring(0, emailStart);
						//th nhap co < va > ma email sai hoac ten email(co ky tu dac biet)
						if(!this.checkContacExtraName(emailName.strip()) || !this.isValidEmail(email)) {
							invalidStr = true;
							break semicolonLoop;
						}
					}
					//th nhap email sai
					else {
						invalidStr = true;
						break semicolonLoop;
					}
				}
			}
		}
	}
	*/
	if(invalidStr) {		
		var focus = 'mainContent.to';
		if(type.indexOf("cc") != -1) {
			focus = 'mainContent.cc';
		}
		parent.popup.popItUp(null, jsVals.jalert.invalidRecipient, 370, popUpHeight, focus);
		return false;
	}
	else return true;
}
/*validation.checkEmails = function (allTbValue, type) {
	var popUpHeight = 128;
	var invalidStr = "";
	if(this.isEmpty(allTbValue.strip())) {
		if(type.indexOf("cc") != -1) {
		  return true;
		}
		if(type.indexOf("to") != -1) {
			parent.popup.popItUp(null, jsVals.jalert.recipientRequired, 350, 115,'mainContent.to');
			return false;
		}
	}

	var semicolonArr = allTbValue.split(';');
	semicolonLoop:
	for(var i = 0; i< semicolonArr.length; i++) {
		var eleOfSemiArr = semicolonArr[i].strip();
		var commaArr = eleOfSemiArr.split(',');
		commaLoop:
		for(var j = 0; j< commaArr.length; j++) {
			var eleOfCommaArr = commaArr[j].strip();
			if(eleOfCommaArr != "") {
				if(!this.isValidEmail(eleOfCommaArr)) {
					var emailStart = eleOfCommaArr.indexOf("<");
					var emailStop = eleOfCommaArr.indexOf(">");
					if(emailStart != -1 && emailStop == eleOfCommaArr.length-1) {
						var email = eleOfCommaArr.substring(emailStart + 1, emailStop);

						var emailName = eleOfCommaArr.substring(0, emailStart);
						//th nhap co < va > ma email sai hoac ten email(co ky tu dac biet)
						if(!this.checkContacExtraName(emailName.strip()) || !this.isValidEmail(email)) {
							invalidStr = emailName + "&lt;" + email + "&gt;";
							break semicolonLoop;
						}
					}
					//th nhap email sai
					else {
						eleOfCommaArr = eleOfCommaArr.replace("<", "&lt;");
						eleOfCommaArr = eleOfCommaArr.replace(">", "&gt;");
						invalidStr = eleOfCommaArr;
						break semicolonLoop;
					}
				}
			}
		}
	}
	if(invalidStr.strip() != "") {
		if(type.indexOf("headerEmails") != -1) {
			popup.popItUp(null, "Email: " + invalidStr + " is invalid.", 350, popUpHeight, 'mainContent.to');
			return false;
		}
		var str = "Recipient : ";
		var focus = 'mainContent.to';
		if(type.indexOf("cc") != -1) {
			str = "At cc: ";
			focus = 'mainContent.cc';
		}
		parent.popup.popItUp(null, str + invalidStr + " is an invalid email.", 370, popUpHeight, focus);
		return false;
	}
	else return true;
}*/

//check list of emails to invite at header -> popup the invalid first email
validation.checkInvitedEmails = function (allTbValue) {
	var popUpHeight = 128;

	var invalidStr = "";
	var validInvitedEmails = "";
	var semicolonArr = allTbValue.split(';');
	semicolonLoop:
	for(var i = 0; i< semicolonArr.length; i++) {
		var eleOfSemiArr = semicolonArr[i].strip();
		var commaArr = eleOfSemiArr.split(',');
		commaLoop:
		for(var j = 0; j< commaArr.length; j++) {
			var eleOfCommaArr = commaArr[j].strip();
			if(eleOfCommaArr != "") {
				if(!this.isValidEmail(eleOfCommaArr)) {
					var emailStart = eleOfCommaArr.indexOf("<");
					var emailStop = eleOfCommaArr.indexOf(">");
					if(emailStart != -1 && emailStop == eleOfCommaArr.length-1) {
						var email = eleOfCommaArr.substring(emailStart + 1, emailStop);

						var emailName = eleOfCommaArr.substring(0, emailStart);
						//th nhap co < va > ma email sai hoac ten email(co ky tu dac biet)
						var fullEmail = emailName + "&lt;" + email + "&gt;";
						if(!this.checkContacName(emailName.strip()) || !this.isValidEmail(email)) {
							invalidStr = fullEmail;
							break semicolonLoop;
						}
						else if(!validation.isIraveEmail(email))
							validInvitedEmails = validInvitedEmails==""? fullEmail : validInvitedEmails + ", " + fullEmail;
					}
					//th nhap email sai hoac email co dau' < or > sai(ko dung dang contact)
					else {
						eleOfCommaArr = eleOfCommaArr.replace("<", "&lt;");
						eleOfCommaArr = eleOfCommaArr.replace(">", "&gt;");
						invalidStr = eleOfCommaArr;
						break semicolonLoop;
					}
				}
				else if(!validation.isIraveEmail(eleOfCommaArr))
					validInvitedEmails = validInvitedEmails==""? eleOfCommaArr : validInvitedEmails + ", " + eleOfCommaArr;
			}
		}
	}
	if(invalidStr.strip() != "") {
		popup.popItUp(null, "Email: " + invalidStr + " is invalid.", 350, popUpHeight, 'headerEmails');
		return false;
	}
	else if(validInvitedEmails.strip() == "") {
		popup.popItUp(null, jsVals.jalert.contactIrave, 350, popUpHeight, 'headerEmails');//email is contact irave
		return false;
	}
	else {
		return validInvitedEmails;
	}
}


//check list of emails -> boolean
validation.isValidEmailList = function (emails) {
	if(this.isEmpty(emails.strip())) {
		return false;
	}
	var semicolonArr = emails.split(';');
	for(var i = 0; i< semicolonArr.length; i++) {
		var eleOfSemiArr = semicolonArr[i].strip();
		var commaArr = eleOfSemiArr.split(',');
		for(var j = 0; j< commaArr.length; j++) {
			var eleOfCommaArr = commaArr[j].strip();
			if(eleOfCommaArr != "") {
				if(!this.isValidEmail(eleOfCommaArr)) {
					var emailStart = eleOfCommaArr.indexOf("<");
					var emailStop = eleOfCommaArr.indexOf(">");
					if(emailStart == -1 || emailStop != eleOfCommaArr.length-1)
						return false;
					else {//th nhap co < va > ma email sai hoac ten email(co ky tu dac biet)
						var email = eleOfCommaArr.substring(emailStart + 1, emailStop);
						var emailName = eleOfCommaArr.substring(0, emailStart);
						if(!this.checkContacName(emailName.strip()) || !this.isValidEmail(email))
							return false;
					}
				}
			}
		}
	}
	return true;
}

validation.isIraveEmail = function(str) {
	return str.indexOf(IRAVE_IMAP_EMAIL) != -1;
}

//check list of emails at compose -> popup all invalid emails
/*validation.checkEmails = function (allTbValue, type) {
	var popUpHeight = 128;
	if(this.isEmpty(allTbValue.strip())) {
		if(type.indexOf("cc") != -1) return true;
		if(type.indexOf("to") != -1) {
			parent.popup.popItUp(null, jsVals.jalert.recipientRequired, null, 115);
			return false;
		}
	}
	var invalidStr = "";
	var semicolonArr = allTbValue.split(';');
	for(var i = 0; i< semicolonArr.length; i++) {
		var eleOfSemiArr = semicolonArr[i].strip();
		var commaArr = eleOfSemiArr.split(',');
		for(var j = 0; j< commaArr.length; j++) {
			var eleOfCommaArr = commaArr[j].strip();
			if(eleOfCommaArr != "") {
				if(!this.isValidEmail(eleOfCommaArr)) {
					var emailStart = eleOfCommaArr.indexOf("<");
					var emailStop = eleOfCommaArr.indexOf(">");
					if(emailStart != -1 && emailStop == eleOfCommaArr.length-1) {
						var email = eleOfCommaArr.substring(emailStart + 1, emailStop);

						var emailName = eleOfCommaArr.substring(0, emailStart);
						//th nhap co < va > ma email sai hoac ten email(co ky tu dac biet)
						if(!this.checkContacName(emailName.strip()) || !this.isValidEmail(email))
							invalidStr += emailName + "&lt;" + email + "&gt;" + ", ";
					}
					else {//th nhap email sai, hoac co the co < hoac > sai
						eleOfCommaArr = eleOfCommaArr.replace("<", "&lt;");
						eleOfCommaArr = eleOfCommaArr.replace(">", "&gt;");
						invalidStr += eleOfCommaArr + ", ";
					}
				}
			}
		}
	}
	if(invalidStr.strip() != "") {
		//if(invalidStr.length > 64)
			//popUpHeight = 142;
		//if(invalidStr.length > 100)
			//popUpHeight = 154;

		if(type.indexOf("headerEmails") != -1) {
			popup.popItUp(null, "Email(s): " + invalidStr.substring(0, invalidStr.length-2) + " is invalid.", null, popUpHeight);
			return false;
		}
		var str = "Recipient(s) : ";
		if(type.indexOf("cc") != -1)
			str = "At cc: ";
		parent.popup.popItUp(null, str + invalidStr.substring(0, invalidStr.length-2) + " is invalid.", null, popUpHeight);
		return false;
	}
	else return true;
}*/

/*not use*/
validation.isCheckText = function (str){
	var strFilter  = /^([a-zA-Z\s]{2,70})$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

validation.isCheckChars = function (str){
	var strFilter  = /^([a-zA-Z]{2,70})$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

validation.stripCharsInBag = function (s, bag) {
    var returnString = "";
    for (var i = 0; i < s.length; i++) {
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

validation.isTextOrIntegerAcceptSpace = function (str) {
	var strFilter  = /^([a-zA-Z0-9\s]{5,30})$/;
	if (!(strFilter.test(str))) return false;
	else return true;
}

validation.checkUnicodeChar = function(string)
{
	var specialChars = "!@#$%^&*()+=[]\;,/{}|\":<>?";
	specialChars = specialChars.split('');
	for (var i = 0; i < specialChars.length; i++)
	{
		if(string.indexOf(specialChars[i])>=0)
		{
			return false;
		}
	}
	return true;
}

validation.checkStringInQuote = function(str) {
	var validInQuote = '\'\"';
	
	if(str.strip()=='' || str.charAt(0)== '\\' || validInQuote.indexOf(str.charAt(0)) == -1 )
		return false;
	
	var firstChar = str.charAt(0) ;
	var tmpStr = str.replace('\\\\','').replace('\\' + firstChar,'');
	if(tmpStr.charAt(tmpStr.length - 1) != firstChar)
		return false;
	
	var tmpStr = tmpStr.substring(1, tmpStr.length - 1 );
	if(tmpStr.indexOf(firstChar) != -1 )
		return false;
	
	return true;
}