/////////////////////////////////////////////////////////////
//                Setup Class Names
/////////////////////////////////////////////////////////////
//default classes for infobox
var infoboxOkClass		= "okmsg";
var infoboxWarningClass	= "typingmsg";
var infoboxErrorClass	= "errmsg";
var infoboxHintClass	= "nonemsg";
//default classes for input field
var inputWarningClass	= "inputbox";
var inputErrorClass		= "inputbox";
var inputOkClass		= "inputbox";
var inputNormalClass	= "inputbox";

var isie=0; 
if(window.navigator.appName=="Microsoft Internet Explorer"&&window.navigator.appVersion.substring(window.navigator.appVersion.indexOf("MSIE")+5,window.navigator.appVersion.indexOf("MSIE")+8)>=5.5) { 
isie=1; 
} 
else { 
isie=0; 
} 
/////////////////////////////////////////////////////////////
//                Initialize Form
/////////////////////////////////////////////////////////////
function initForm(){	
	//initialize form UI and add triggers
	var infobox;
	var x = document;
	//var x = document.getElementById("simple");
	if(!x) return;
	var y = x.getElementsByTagName("input");
	for (var i=0;i<y.length;i++){
		if((y[i].id)&& (y[i].type == 'text' ||y[i].type == 'hidden')){//y[i].type == 'text' || y[i].type == 'password'||y[i].type == 'hidden'
			initStatus(y[i],true);
			//setFiledWidth(y[i]);
			y[i].onfocus	= getFocus;
			y[i].onblur		= lostFocus;
			//y[i].onkeyup	= showMyStatus;
			//y[i].onkeyup	= showMyStatus;
		}

		if(y[i].type == "password" ){
			initStatus(y[i],true);
			y[i].onfocus	= getFocus;
			y[i].onblur		= lostFocus;
			//y[i].onkeyup	= showMyStatus;
		}
		//if(y[i].type == "checkbox" ){
		//	initStatus(y[i],false);
		//	y[i].onfocus	= getFocus;
		//	y[i].onblur		= lostFocus;
		//	y[i].onkeyup	= showMyStatus;
		//}			
	}
	
	var s = x.getElementsByTagName("select");
	for (var i=0;i<s.length;i++){
		initStatus(s[i],true);
		s[i].onfocus	= getFocus;
		s[i].onblur		= lostFocus;
		//s[i].onkeyup	= showMyStatus;
	}
	
	var tt = x.getElementsByTagName("textarea");
	for (var i=0;i<tt.length;i++){
		initStatus(tt[i],true);
		tt[i].onfocus	= getFocus;
		tt[i].onblur	= lostFocus;
		//tt[i].onkeyup	= showMyStatus;
	}
	
	//document.getElementById("password_info").className='nonemsg';
    //document.getElementById("password_info").innerHTML='Please enter a Password.';
}
function initStatus(obj,isInput){
	if(isInput){
		if(isRequired(obj)) showStatus(obj,"Warning");//if(isRequired(obj)) showStatus(obj,"Warning");
		else showStatus(obj,"Normal");
	}
	
	var infobox = getInfobox(obj);
	var errorCode = getInitStatus(obj);
		
	if(infobox && infobox.innerHTML == ""){
			
		if(!errorCode || errorCode == 0){
		        infobox.className	= infoboxHintClass;
			infobox.innerHTML	= getErrorMsg(obj,0);
		}
		if(errorCode >0){
			infobox.className	= infoboxErrorClass;
			infobox.innerHTML	= getErrorMsg(obj,errorCode);
		}
	}	
}

function submitForm(obj) {
	var ret = validateAll(obj);
	if (ret == true) {
		if (obj.Submit) {
			obj.Submit.disabled = true;
		}
	}
	return false;
}
/////////////////////////////////////////////////////////////
//                Base Functions
/////////////////////////////////////////////////////////////
function isIE() {
	if(document.all) return true;
	return false;
}
function setFiledWidth(obj){
	obj.style.width=(19/3)*obj.size+11;
}
function formEle(required,datatype,parameter,infobox,errormsg,combine,status){
	this.r	= required;	
	this.d	= datatype;
	this.p	= parameter;
	this.i	= infobox;
	this.e	= errormsg;
	this.c = combine;
	this.s = status;
}
function isRequired(obj){
	if(obj.id){
		if(eval(obj.id).r) return eval(obj.id).r;
	}
	return false;
}
function isCombine(obj){
	if(obj.id){
		if(eval(obj.id).c) return eval(obj.id).c;
	}
	return false;
}
function getDatatype(obj){
	if(obj.id){
		if(eval(obj.id).d) return eval(obj.id).d;
	}
	return false;
}
function getInfobox(obj){
	
    if(obj.id){
    	    if(eval(obj.id).i && document.getElementById(eval(obj.id).i)) return document.getElementById(eval(obj.id).i);
	}
	return;
}
function getErrorMsg(obj,errorCode){
	if(obj.id){
		if(eval(obj.id).e[errorCode]) return eval(obj.id).e[errorCode];
	}
	return;
}
function getHintMsg(obj){
	if(obj.id){
		if(eval(obj.id).e[0]) return eval(obj.id).e[0];
	}
	return;
}
function getInitStatus(obj){
	if(obj.id){
		if(eval(obj.id).s || eval(obj.id).s==0 ) return eval(obj.id).s;
	}
	return;
}
function getAttrName(str){
	var s=str.split("=");
	return s[0];
}
function getAttrValue(str){
	var s=str.split("=");
	return s[1];
}
function getAttrValueByName(obj,str){
	var para;
	if(obj.id){
		if(eval(obj.id).p) para=eval(obj.id).p;
		else return;
	}else{
		return;
	}
	var s = para.split(",");
	for(var i=0;i<s.length;i++){
		if(getAttrName(s[i]) == str){
			if(getAttrValue(s[i]))
				return getAttrValue(s[i]);
			else
				return;
		}
	}
	return;
}
function getMailServer(str){
	//be sure str is a correct email address
	str = str.trim();
	return str.substr(str.indexOf("@")+1);
}
function getMailAccount(str) {
	str = str.trim();
	return str.substr(0, str.indexOf("@"));
}
function isNumber(str) {
	var patn = new RegExp("^\\d{1,15}$"); 
	if (patn.test(str)) {
		return true;
	} else {
		return false; 	
	}
}

String.prototype.trim = function()
{
    return this.replace(/(^\s*)|(\s*$)/g, "");
}

/////////////////////////////////////////////////////////////
//                UI Functions
/////////////////////////////////////////////////////////////
function getFocus(evnt)
{
	var obj;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}

	showInfo(obj,0,true);
}
function lostFocus(evnt)
{	
	
	var obj;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
    errorCode = validateValue(obj);

    if(errorCode==0){
        if(obj.id == 'email'){
	       checkEmail();
	       return;
	    }
	    
	    if(obj.id == 'loginId'){
	       checkLoginId();
	       return;
	    }
	    
	    var infobox = getInfobox(obj);
		infobox.className	= infoboxOkClass;
		infobox.innerHTML	= validatedInfo;
	} else {

	    showInfo(obj,errorCode,true);
    }
}
function showInfo(obj,errorCode,forcible)
//Show Information in Infobox
//errorCode==0 for hint message
//if forcible==true, no matter what the status of infobox now, change it,
//otherwise,if the status of infobox is "Error", do not change it forever.
{
	var infobox = getInfobox(obj);
	if(infobox){
		if(infobox.className != infoboxErrorClass || forcible){
			if(errorCode == 0){				
				infobox.innerHTML	= getErrorMsg(obj,errorCode);
				infobox.className	= infoboxWarningClass;
				if(infobox.innerHTML.trim()==''){
				infobox.className	= '';
				}	
			}
			if(errorCode >0){
				infobox.className	= infoboxErrorClass;
				infobox.innerHTML	= getErrorMsg(obj,errorCode);
			}
			if(errorCode <0){
				infobox.className	= infoboxHintClass;
			}
		}
	}	
}
function showMyStatus(evnt){
	var obj,errorCode;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
	errorCode = validateValue(obj);
	if(errorCode == 0){
		showStatus(obj,"Ok");
	}
	if(errorCode >= 1){
		showStatus(obj,"Error");
	}
	if(errorCode < 0){
		showStatus(obj,"Normal");
	}
}
function showStatus(obj,stat)
//Show the status of user currently inputting field
//3 Statuses: Warning|Error|Ok
{
	switch(stat){
		case "Warning":
			obj.className = inputWarningClass;
			break;
		case "Error":
			obj.className = inputErrorClass;
			break;
		case "Ok":
			obj.className = inputOkClass;
			break;
		default:
			obj.className = inputNormalClass;
			break;
	}
}
/////////////////////////////////////////////////////////////
//                Validator Functions
/////////////////////////////////////////////////////////////
function validateValue(obj){
	//trim
	var patn = /(^\s)|(\s$)/;
	if(patn.test(obj.value))	obj.value = obj.value.trim();
	//switcher
	var errorCode = -1;
	switch(getDatatype(obj)){
		case "loginId":
		    errorCode = validateLoginId(obj);
			break;
		case "password":
			errorCode = validatePassword(obj);
			break;
		case "email":
			errorCode = validateEmail(obj);
			break;
		case "confirmPassword":
			errorCode = validateConfirmPassword(obj);
			break;
		case "categoryId":
			errorCode = validateNotEmpty(obj);
			break;
		//case "mobile":
		//	errorCode = validateMobile(obj);
		//	break;
		//case "checkcode":
		//	errorCode = validateCheckCode(obj);
		//	break;
		default:
			errorCode = -1;
			break;
	}
	return errorCode;
}

function validateAll(formObj){
	var obj,infobox,pass;
	pass = true;
	var x = formObj;
	if(!x) return false;
	var y = x.getElementsByTagName("input");
	for (var i=0;i<y.length;i++){
		obj = y[i];		
		obj.value = obj.value.trim();
	
		if(obj.type == 'text' || obj.type == 'password'){
		    infobox = getInfobox(y[i]);
			if(!isRequired(obj) && obj.value == ""){
				continue;
			}
			if(isRequired(obj) && obj.value == ""){
				//	alert(obj.name);
				pass = false;
				obj.focus();
				showStatus(obj,"Error");
				infobox.className	= infoboxErrorClass;
				infobox.innerHTML	= requireErrorInfo + getErrorMsg(obj,0);
				if(isCombine(obj)) break;
				continue;
			}
			if(validateValue(obj)>0){
					//alert(obj.name);
				pass = false;
				obj.focus();
				showStatus(obj,"Error");
				showInfo(obj,validateValue(obj),true);
				if(isCombine(obj)) break;
				continue;
			}
			if(validateValue(obj)==0){
				showStatus(obj,"Ok");
				infobox.className	= infoboxOkClass;
				infobox.innerHTML	= validatedInfo;
				continue;
			}
		}
	}
	
	var passSelect=validateOneType(x,"select");
	var passTextArea=validateOneType(x,"textarea");
	var finalpass=pass&&passSelect&&passTextArea;
	return finalpass;
	
	
}


function validateOneType(formObj,tag){
	var checkResult=true;
	var s = formObj.getElementsByTagName(tag);
	for (var i=0;i<s.length;i++){
		obj = s[i];		
		obj.value = obj.value.trim();		
		    infobox = getInfobox(s[i]);
			if(!isRequired(obj) && obj.value == ""){
				continue;
			}
			if(validateValue(obj)>0){
			//	alert("validateValue="+obj.name);
				checkResult = false;
				obj.focus();
				showStatus(obj,"Error");
				showInfo(obj,validateValue(obj),true);
				if(isCombine(obj)) break;
				continue;
			}
			if(isRequired(obj) && obj.value == ""){
				//alert("isRequired="+obj.name);
				checkResult = false;
				obj.focus();
				showStatus(obj,"Error");
				infobox.className	= infoboxErrorClass;
				infobox.innerHTML	= requireErrorInfo + getErrorMsg(obj,0);
				if(isCombine(obj)) break;
				continue;
			}
			if(validateValue(obj)==0){
				showStatus(obj,"Ok");
				infobox.className	= infoboxOkClass;
				infobox.innerHTML	= validatedInfo;
				continue;
			}		
	}
	return checkResult;
}

//functions for each particular datatype validation
function validateLoginId(obj){
	var str = obj.value;
	var patn = /^[a-zA-Z0-9]+$/; 
	if(patn.test(str)){
	    if(checkByteLength(str,4,20)) return 0;
	}    
	return 1; 
}
function validatePassword(obj){
	var str = obj.value;
	var patn = /^[a-zA-Z0-9]+$/; 
	if(patn.test(str)){
		if(str == document.getElementById("loginId").value) return 2;
	    if(checkByteLength(str,4,20)) return 0;
	}    
	return 1; 
}
function validateSafePassword(obj){
	var str = obj.value;
	//check length and alphabet
	var rank = 0;
	try {
		rank = PwdIntensity(str);
		printIntensity(rank);
	} catch (er) {
	}
	if(validatePassword(obj)>0) return 1;
	//check if same as username
	if(str == document.getElementById("username").value) return 2;
	//check if all the characters are the same
	for(var i=0;i<str.length;i++){
		if(str.charAt(0)!=str.charAt(i)) break;
	}
	if(i == str.length) return 3;
	//check if is number sequence
	var seqStr="01234567890";
	if(seqStr.indexOf(str) != -1) return 4;
	//check if is lower alphabet sequence
	var seqStr="abcdefghijklmnopqrstuvwxyz";
	if(seqStr.indexOf(str) != -1) return 5;
	//check if is upper alphabet sequence
	var seqStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	if(seqStr.indexOf(str) != -1) return 6;
	if (rank == 1) {
		return 7;
	}
	//if validated
	return 0;
}

function validateEmail(obj){
	var str = obj.value;
	var patn = /^[_a-zA-Z0-9\-]+(\.[_a-zA-Z0-9\-]*)*@[a-zA-Z0-9\-]+([\.][a-zA-Z0-9\-]+)+$/;
	if(patn.test(str)){
    	return 0;
	}else{
	    return 1; //incorrect format
	}
}
function validateNum(obj){
	var str = obj.value;
	var patn = new RegExp("\\d{"+getAttrValueByName(obj,"minlen")+","+getAttrValueByName(obj,"maxlen")+"}"); 
	if(patn.test(str)) return 0;
	return 1; 	
}
function validateMobile(obj){
	var str = obj.value;
	var patn = /^13\d{9}$/;
	if(patn.test(str)) return 0;
	return 1; 	
}
function validateCheckCode(obj){
	var str = obj.value;
	var patn = /^[0-9a-zA-Z]{4}$/;
	if(patn.test(str)) return 0;
	return 1;
}	
function validateConfirmPassword(obj){
	if(validatePassword(obj)==0 && validateSameAs(obj)){
		return 0;
	}
	return 1;
}
function validateNotEmpty(obj) {
    var str = obj.value;
	if(str!=null && str.length>0){
		return 0;
	}
	return 1;
}

function validateSameAs(obj){
	var v1,v2;
	if(!getAttrValueByName(obj,"sameas")) return true;
	v1=obj.value;
	v2=document.getElementById(getAttrValueByName(obj,"sameas")).value;
	if(v1 == v2) return true;
	return false;
}
function checkByteLength(str,minlen,maxlen) {
	if (str == null) return false;
	var l = str.length;
	var blen = 0;
	for(i=0; i<l; i++) {
		if ((str.charCodeAt(i) & 0xff00) != 0) {
			blen ++;
		}
		blen ++;
	}
	if (blen > maxlen || blen < minlen) {
		return false;
	}
	return true;
}

function validateYear(obj){
	var str = obj.value;

	if(isNumber(str)) {
	   if(parseInt(str)>0 && parseInt(str)<9999)
	     return true;
	} 	
	return false;
}

function validateAddress(obj){
	var str = obj.value;
	//alert(str.length);
	
	if(!str.trim().length > 0 ) return 1;
	//is character in English?
	if(!checkchi(str)) return 2;
	return 0; 
}

function validateCompanyName(obj){
	var str = obj.value;
	   if(!checkByteLength(str,4,100)) return 1;	 
	   if(!checkchi(str)) return 2;
	  
   
	return 0; 
}

function validateSelectValue(obj){
	var str = obj.value;		
	if(str.trim().length >0) return 0;
		return 1; 	
}

function isNumberAndNotEmpty(number){
if(number.trim().length <= 0) return false;
return isPhoneNumber(number);
}


function isPhoneNumber(str){
	var patn = /^\d{1,34}$/; 
	if(patn.test(str)) 
	return true;
	if(str.indexOf("@")<0 && str.indexOf("$")<0 && str.indexOf("%")<0 && str.indexOf("?")<0 && str.indexOf("^")<0 && str.indexOf("<")<0 && str.indexOf(">")<0)
	{
	   return true;
	}
	return false; 	
}

function validateBusinessPhone(obj){
	var phoneNumber=obj.phoneNumber.value;
	var country=obj.country;
	var phoneAreaOk=false;
	var phoneCountryOk=false;
	var phoneNumberOk=false;
	if(!isNumberAndNotEmpty(phoneNumber)) {phoneNumberOk=false;} else {phoneNumberOk=true;}
	if(!validateArea(obj.phoneArea.value)) {phoneAreaOk=false;} else {phoneAreaOk=true;}
	if(!isNumberAndNotEmpty(obj.phoneCountry.value)) {phoneCountryOk=false;}
	 else {phoneCountryOk=true;}		
	var phoneInfoBox=document.getElementById("phone_info");
	var allOk=phoneAreaOk && phoneCountryOk && phoneNumberOk;
	if(!allOk)
	{
		phoneInfoBox.className	= infoboxErrorClass;
		phoneInfoBox.innerHTML	= "<span class='error s'> Please input a valid business phone number.</span>";
	return false;
	}else{
	phoneInfoBox.className	= infoboxOkClass;
	phoneInfoBox.innerHTML	= "Ok";
	return true;
	}
	}
	
function validateFax(obj){
	var country=obj.country;
	var faxAreaOk=false;
	var faxCountryOk=false;
	var faxNumberOk=false;
	if(!validateArea(obj.faxArea.value)) {faxAreaOk=false;} else {faxAreaOk=true;}
	if(!isNumberAndNotEmpty(obj.faxNumber.value)) {faxNumberOk=false;} else {faxNumberOk=true;}
	if(!isNumberAndNotEmpty(obj.faxCountry.value)) {faxCountryOk=false;} else {faxCountryOk=true;}
	var faxInfo=document.getElementById("fax_info");
	var allOk=faxAreaOk && faxCountryOk && faxNumberOk;

	if(!allOk)
	{
		faxInfo.className	= infoboxErrorClass;
		faxInfo.innerHTML	= "<span class='error s'> Please input a valid business fax number.</span>";
	return false;
	}else{
		faxInfo.className	= infoboxOkClass;
		faxInfo.innerHTML	= "Ok";
		return true;
}
}	

function validateArea(area){
	if(area.trim().length <= 0) return true;
	var patn = /^\d{1,34}$/; 
	return patn.test(area);
}

function isEmptyField(aTextField) {
   if ((aTextField.value==null)||(aTextField.value.replace(/(^\s*)|(\s*$)/g, "").length==0)) {
      return true;
   } else { 
      return false; 
   }
}

function isOkChar(ch){
	var checkOk = new Array();
	checkOk[0] = "12288";
	checkOk[1] = "8364";
	for (j = 0;  j < checkOk.length;  j++)
   	if (ch == checkOk[j]){
       return true;
    }
    return false;
}

function checkchi(myint) {
  		var checkStr = myint;
  		var allValid = true;
  		for (i = 0;  i < checkStr.length;  i++)
  		{
    		ch = checkStr.charCodeAt(i);			
     		if (ch > 127 && !isOkChar(ch))
    		{      
      			allValid = false;
     		    break;
    		}
  		}
	    if (!allValid)
	    {
	    	return (false);
	    }
	
	  		return (true);

}

//return id of fisrt errorfield 
function locateFirstErrorField() {
	var y = document.getElementsByTagName("div");
	for (var i=0;i<y.length;i++){
		if(infoboxErrorClass == y[i].className ){
		    var patn = /^([0-9a-zA-Z]+)\_info$/;
	        if(patn.test(y[i].id)){
	            return RegExp.$1;
	        }
		}
	}
	return ;
}

//locate error
function locateError() {
    var fieldId = locateFirstErrorField();
    if(fieldId){
    	var ele;
    	if(isie){ 
	    	ele = document.getElementById(fieldId+"_info");
		}else{
	    	ele = document.getElementById(fieldId);
		} 
	    if(ele){
	        ele.focus();
    	}
    }
}

function validateName(formObj){
    var firstNameEmpty	=	isEmptyField(formObj.firstName);
    var lastNameEmpty	=	isEmptyField(formObj.lastName);
    var firstNameChi    =   !checkchi(formObj.firstName.value);
    var lastNameChi     =   !checkchi(formObj.lastName.value);
    var nameInfo		=	document.getElementById("name_info");
    var pass=true;
    //1
    if(firstNameEmpty && lastNameEmpty){
    	nameInfo.innerHTML = "<span class='error s'>Please specify your first name and last name.</span>";
		nameInfo.className = infoboxErrorClass;
		return false;
	}
	//2
    if(firstNameEmpty && lastNameChi){
        nameInfo.innerHTML = "<span class='error s'>Please specify your first name.<br/>The last name you filled is not in English, please input in English instead.</span>";
		nameInfo.className = infoboxErrorClass;
		pass=false;
		return false;
	}
	//3
	if(firstNameEmpty){
		nameInfo.innerHTML = "<span class='error s'>Please specify your first name</span>";
		nameInfo.className = infoboxErrorClass;
		pass=false;
		return false;
	}
	//4
	if(firstNameChi && lastNameEmpty){
    	nameInfo.innerHTML = "<span class='error s'>The first name you filled is not in English, please input in English instead. <br/>Please specify your last name.</span>";
		nameInfo.className = infoboxErrorClass;
		return false;
	}
	//5
    if(firstNameChi && lastNameChi){
        nameInfo.innerHTML = "<span class='error s'>The first name you filled is not in English, please input in English instead.<br/>The last name you filled is not in English, please input in English instead</span>";
		nameInfo.className = infoboxErrorClass;
		pass=false;
		return false;
	}
	//6
	if(firstNameChi){
		nameInfo.innerHTML = "<span class='error s'>The last name you filled is not in English, please input in English instead</span>";
		nameInfo.className = infoboxErrorClass;
		pass=false;
		return false;
	}
	//7
    if(lastNameEmpty){
    	nameInfo.innerHTML = "<span class='error s'>Please specify your last name.</span>";
		nameInfo.className = infoboxErrorClass;
		return false;
	}
	//8
	if(lastNameChi){
		nameInfo.innerHTML = "<span class='error s'>The last name you filled is not in English, please input in English instead</span>";
		nameInfo.className = infoboxErrorClass;
		return false;
	}
	nameInfo.innerHTML = "<span class='s'>OK</span>"
	nameInfo.className = infoboxOkClass;
    return true;
}

function nameOnBlur(formObj) {
    var firstNameEmpty	=	isEmptyField(formObj.firstName);
    var lastNameEmpty	=	isEmptyField(formObj.lastName);
    var firstNameChi    =   !checkchi(formObj.firstName.value);
    var lastNameChi     =   !checkchi(formObj.lastName.value);
    var nameInfo		=	document.getElementById("name_info");
    
    if(firstNameEmpty || lastNameEmpty || firstNameChi || lastNameChi){
    	return false;
	}

	nameInfo.innerHTML = "<span class='s'>OK</span>"
	nameInfo.className = infoboxOkClass;
    return true;
}


function isEmptyField(aTextField) {
   if ((aTextField.value==null)||(aTextField.value.replace(/(^\s*)|(\s*$)/g, "").length==0)) {
      return true;
   } else { 
      return false; 
   }
}

var JS_MESSAGE_MEMBER = new Array(	'<span class=\"remark\">4 to 20 characters (A-Z, a-z, 0-9)</span>',
								'<span class=\"error s\">Please enter a valid password.</span>',
								'<span class=\"error s\">Please specify a Password different from your Member ID.</span>');
