/////////////////////////////////////////////////////////////
//                Setup Class Names
/////////////////////////////////////////////////////////////
//default classes for infobox
var infoboxOkClass		= "OkMsg";
var infoboxWarningClass	= "WarningMsg";
var infoboxErrorClass	= "ErrorMsg";
var infoboxHintClass	= "HintMsg";
//default classes for input field
var inputWarningClass	= "Warning";
var inputErrorClass		= "Error";
var inputOkClass		= "Ok";
var inputNormalClass	= "Normal";


var dom = new Array(10);
var valids = new Array(10);
valids[1] = true;
valids[2] = true;
valids[3] = true;
valids[4] = true;
/////////////////////////////////////////////////////////////
//                Initialize Form
/////////////////////////////////////////////////////////////
function initForm(){	
	//initialize form UI and add triggers
	var infobox;
	var x = document.getElementById("Content");
	if(!x) return;
	var y = x.getElementsByTagName("input");
	for (var i=0;i<y.length;i++){
		if(y[i].type == 'text' || y[i].type == 'password'){
			initStatus(y[i],true);
			setFiledWidth(y[i]);
			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;
		}			
	}
}
function initStatus(obj,isInput){
	if(isInput){
		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);
		}
	}	
}
/////////////////////////////////////////////////////////////
//                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, "");
}

function CheckUserNameRegister(){
	if(event == null && dom[1] == null)return;
	if(dom[1].readyState == 4 )
	{
		var obj = document.getElementById("username");
		
		if (dom[1].responseText == "2")
		{
		    valids[1] = false;
    	    showInfo(obj,dom[1].responseText);
		}
		else
		{
		    valids[1] = true;
		    //debugger;
		    if(validateValue(obj)>0 && dom[1].responseText != "-2"){
			    showStatus(obj,"Error");
			    showInfo(obj,validateValue(obj),true);
		    }
		    else
		    {
			    var infobox = getInfobox(obj);
			    infobox.className = infoboxHintClass;
			    infobox.innerHTML = getErrorMsg(obj,0);
		    }
		}
	}
	document.forms["formRegStep1Main"].Submit.disabled = false;
}

function CheckShopNameRegister(){
	if(event == null && dom[2] == null)return;
	if(dom[2].readyState == 4 )
	{
		var obj = document.getElementById("shopname");
		
		if (dom[2].responseText == "2")
		{
		    valids[2] = false;
    	    showInfo(obj,dom[2].responseText);
		}
		else
		{
		    valids[2] = true;
		    if(validateValue(obj)>0 && dom[2].responseText != "-2"){
			    showStatus(obj,"Error");
			    showInfo(obj,validateValue(obj),true);
		    }
		    else
		    {
		        
			    var infobox = getInfobox(obj);
			    infobox.className = infoboxHintClass;
			    infobox.innerHTML	= getErrorMsg(obj,0);
		    }
		}

	}
	document.forms["formRegStep1Main"].Submit.disabled = false;

}

function CheckEmailRegister(){
	if(event == null && dom[3] == null)return;
	if(dom[3].readyState == 4 )
	{
		var obj = document.getElementById("email");
		
		//debugger;
		if (dom[3].responseText == "5")
		{
		    valids[3] = false;
    	    showInfo(obj,dom[3].responseText);
		}
		else
		{
		    valids[3] = true;
		    if(validateValue(obj)>0 && dom[3].responseText != "-2"){
			    showStatus(obj,"Error");
			    showInfo(obj,validateValue(obj),true);
		    }
		    else
		    {
			    var infobox = getInfobox(obj);
			    infobox.className = infoboxHintClass;
			    infobox.innerHTML	= getErrorMsg(obj,0);
		    }
		}

	}
	document.forms["formRegStep1Main"].Submit.disabled = false;

}

function CheckShopPrefixRegister(){
	if(event == null && dom[4] == null)return;
	if(dom[4].readyState == 4 )
	{
		var obj = document.getElementById("shopprefix");
		
		if (dom[4].responseText == "3")
		{
		    valids[4] = false;
    	    showInfo(obj,dom[4].responseText);
		}
		else
		{
		    valids[4] = true;
		    if(validateValue(obj)>0 && dom[4].responseText != "-2"){
			    showStatus(obj,"Error");
			    showInfo(obj,validateValue(obj),true);
		    }
		    else
		    {
			    var infobox = getInfobox(obj);
			    infobox.className = infoboxHintClass;
			    infobox.innerHTML	= getErrorMsg(obj,0);
		    }
		}

	}
	document.forms["formRegStep1Main"].Submit.disabled = false;

}
/////////////////////////////////////////////////////////////
//                UI Functions
/////////////////////////////////////////////////////////////
function getFocus(evnt)
{
	var obj;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
	showInfo(obj,0);
}
function lostFocus(evnt)
{
	var obj;
	if (isIE()) {
		obj = event.srcElement;
	}else {
		obj = evnt.target;
	}
	//debugger;
	ajaxCheck(obj,true);
}

function ajaxCheck(obj, isLostFocus)
{
    //debugger;
    ret = false;

    var url = "";
    if (isLostFocus)
    {
        url = "lostFocus=1&";
    }
	switch(obj.id){
		case "username":
            url += "type=1&value=" + obj.value;
		    document.forms["formRegStep1Main"].Submit.disabled = true;
            SendPost("/checkregister.aspx",url,CheckUserNameRegister,1,obj);
			break;
		case "shopname":
            url += "type=2&value=" + obj.value;
		    document.forms["formRegStep1Main"].Submit.disabled = true;
            SendPost("/checkregister.aspx",url,CheckShopNameRegister,2,obj);
			break;
		case "email":
            url += "type=3&value=" + obj.value;
		    document.forms["formRegStep1Main"].Submit.disabled = true;
            SendPost("/checkregister.aspx",url,CheckEmailRegister,3,obj);
			break;
	    case "shopprefix":
            url += "type=4&value=" + obj.value;
		    document.forms["formRegStep1Main"].Submit.disabled = true;
            SendPost("/checkregister.aspx",url,CheckShopPrefixRegister,4,obj);
            break;
        default:
    	    showInfo(obj,-1);
    	    break;
	    }
}

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.className	= infoboxWarningClass;
				infobox.innerHTML	= getErrorMsg(obj,errorCode);
			}
			if(errorCode > 0){
				infobox.className	= infoboxErrorClass;
				infobox.innerHTML	= getErrorMsg(obj,errorCode);
			}
			if(errorCode < 0){
				infobox.className	= infoboxHintClass;
				//infobox.innerHTML	= getErrorMsg(obj,0);
			}
		}
	}	
}
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 "username":
			errorCode = validateUsername(obj);
			break;
		case "shopname":
			errorCode = validateShopname(obj);
			break;
		case "password":
			errorCode = validatePassword(obj);
			break;
		case "safepassword":
			errorCode = validateSafePassword(obj);
			break;
		case "email":
			errorCode = validateEmail(obj);
			break;
		case "mirror":
			errorCode = validateMirror(obj);
			break;
		case "fax":
			errorCode = validateFax(obj);
			break;
		case "mobile":
			errorCode = validateMobile(obj);
			break;
		case "checkcode":
			errorCode = validateCheckCode(obj);
			break;
	    case "realname":
	        errorCode = validateRealname(obj);
	        break;
	    case "shopprefix":
	        errorCode = validatePrefix(obj);
	        break;
	    case "zipcode":
	        errorCode = validateZipcode(obj);
	        break;
	    case "id_type":
	        errorCode = validateIdType(obj);
	        break;
	    case "id_number":
	        errorCode = validateIdNumber(obj);
	        break;
	    case "phone":
	        errorCode = validatePhone(obj);
	        break;
	    case "address":
	        errorCode = validateAddress(obj);
	        break;
		default:
			errorCode = -1;
			break;
	}
	return errorCode;
}

function validateAll(formObj){
    //debugger;
	var obj,infobox,pass;
	pass = true;
	var x = formObj;
	if(!x) return;
	var s = x.getElementsByTagName("select");
	for (var i=0;i<s.length;i++)
	{
	    obj = s[i];
	    obj.value = obj.value.trim();
	    infobox = getInfobox(s[i]);
	    
	    if (obj.value == "0" || obj.value == "")
	    {
	        pass = false;
		    showStatus(obj,"Error");
		    infobox.className = infoboxErrorClass;
		    infobox.innerHTML = requireErrorInfo + getErrorMsg(obj,0);
		    continue;
	    }
	}

	var y = x.getElementsByTagName("input");
	for (var i=0;i<y.length;i++){
		obj = y[i];		
		if (obj.type != "submit")
		{
		    obj.value = obj.value.trim();
		    infobox = getInfobox(y[i]);
		    if(obj.type == 'text' || obj.type == 'password'){

		    	ajaxCheck(obj,false);

			    if(!isRequired(obj) && obj.value == ""){
				    continue;
			    }
			    if(isRequired(obj) && obj.value == ""){
				    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){
				    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	= infoboxHintClass;
				    infobox.innerHTML	= validatedInfo;
				    continue;
			    }
		    }
		}
	}
	return pass;
}


//functions for each particular datatype validation
function validatePrefix(obj)
{
    var str = obj.value;
	if(!checkByteLength(str,1,20)) return 1;
	
    var patn = /^\w+$/; 
	if(!patn.test(str)) return 2;

    return 0;
    
}
function validateRealname(obj)
{
    var str = obj.value;
	if(checkByteLength(str,3,50)) return 0;
    return 1;
}
function validateIdType(obj)
{
    var str = obj.value;
    if (str != "0")
        return 0;
    return 1;
}
function validateIdNumber(obj)
{
    var str = obj.value;
    var patn = /^[0-9]{8,20}$/; 
	if(patn.test(str)) return 0;
    return 1;
}
function validateZipcode(obj)
{
    var str = obj.value;
    var patn = /^[0-9]{6,8}$/; 
	if(patn.test(str)) return 0;
    return 1;
}
function validatePhone(obj)
{
    var str = obj.value;
    var patn = /^[0-9\-]{8,20}$/;
    if (patn.test(str)) return 0;
    return 1;
}
function validateFax(obj)
{
    var str = obj.value;
    var patn = /^[0-9\-]{8,20}$/;
    if (patn.test(str)) return 0;
    return 1;
}
function validateAddress(obj)
{
    var str = obj.value;
    if(checkByteLength(str,10,200)) return 0;
    return 1;
}
function validateUsername(obj){
	var str = obj.value;
	//str = quanjiao2Banjiao(str);
	//var patn =   /^[\u0391-\uFFE5a-zA-Z0-9][\u0391-\uFFE5\w]{2,20}$/;
	 
	var patn = /^[^\s]*$/;
	if(patn.test(str)){
		if(checkByteLength(str,4,20)) return 0;
	}
	return 1; 
}
function validateShopname(obj){
	var str = obj.value;
	//str = quanjiao2Banjiao(str);
	//var patn =   /^[\u0391-\uFFE5a-zA-Z0-9][\u0391-\uFFE5\w]{2,20}$/; 
	var patn = /^[^\s]*$/;
	if(patn.test(str)){
		if(checkByteLength(str,5,40)) return 0;
	}
	return 1; 
}
function validatePassword(obj){
	var str = obj.value;
	var patn = /.{6,16}/; 
	if(patn.test(str)) 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;
	str = quanjiao2Banjiao(str);
	var patn = /^[_a-zA-Z0-9\-]+(\.[_a-zA-Z0-9\-]*)*@[a-zA-Z0-9\-]+([\.][a-zA-Z0-9\-]+)+$/;
	//var patn = /^[^\d\-_][\w\-]*[^\-_]@[^\-][a-zA-Z\d\-]*[^\-](\.[^\-][a-zA-Z\d\-]*[^\-])*\.[a-zA-Z]{3}(\.[a-zA-Z]{2})?$/;
	if(patn.test(str)){
		var blocklist = eval(obj.id).p;
		if (blocklist.length > 0){
			for(var i=0;i<blocklist.length;i++){
				if(getMailServer(obj.value) == blocklist[i])
					return 2;//mailserver in block list
			}
			//return 0;
		}
		//针对Yahoo邮箱做限制
		var mailServer = getMailServer(obj.value);
		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 = /^1\d{10}$/;
	if(patn.test(str)) return 0;
	return 1; 	
}
function validateCheckCode(obj){
	var str = obj.value;
	str = quanjiao2Banjiao(str);
	var patn = /^[0-9a-zA-Z]{4}$/;
	if(patn.test(str)) return 0;
	return 1;
}	
function validateMirror(obj){
	if(validateSameAs(obj)){
		var sameobj = document.getElementById(getAttrValueByName(obj,"sameas"));
		var sameobj_dt;
		if(eval(sameobj.id).d) sameobj_dt=eval(sameobj.id).d;
		else return -1;
		if(sameobj_dt != "mirror"){ //avoid a mirror type filed being another mirror type filed's mirror
			if(validateValue(sameobj) == 0)	 return 0;
			else return 2;
		}
	}
	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 quanjiao2Banjiao(str) {
	var i;
	var result = '';
	for (i = 0; i < str.length; i++) {
		code = str.charCodeAt(i);
		if (code >= 65281 && code < 65373) {
			result += String.fromCharCode(str.charCodeAt(i) - 65248);
		}
		else {
			result += str.charAt(i);
		}
	}
	return result;
}
///
/// Return a XMLHTTPRequest in a browser independent fashion.
///
function GetXMLHttp()
{
    var xmlhttp=false;
    
    try 
    {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } 
    catch (e) 
    {
        try 
        {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (E)
        {
            xmlhttp = false;
        }
    }

    // Mozilla then?
    if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
       xmlhttp = new XMLHttpRequest();
    }
    
    return xmlhttp;
}
function getUniqueID()
{
    var today = new Date();
    today = today.getFullYear() + " - " + today.getMonth() + " - " + today.getDay() + " - " + today.getHours() + " - " + today.getSeconds() + " - " + today.getMilliseconds();
    today += '-' + Math.floor(Math.random() * (10000 + 1)) ;
    return today;
}

function Pause(obj,iMinSecond)
{
    if (window.eventList==null) 
        window.eventList=new Array();
    var ind=-1;
    for (var i=0;i<window.eventList.length;i++)
    {
        if (window.eventList[i]==null) 
        {
            window.eventList[i]=obj;
            ind=i;
            break;
        }
     }
 
    if (ind==-1)
    {
        ind=window.eventList.length;
        window.eventList[ind]=obj;
    }
    setTimeout("GoOn(" + ind + ")",1000);
}

function GoOn(ind){
 var obj=window.eventList[ind];
 window.eventList[ind]=null;
 if (obj.NextStep) obj.NextStep();
 else obj();
}

function SendPost(url,form,checkCallBack,i,p){
	
	if (window.XMLHttpRequest) {
		dom[i] = new XMLHttpRequest();
		dom[i].onreadystatechange = checkCallBack;
		dom[i].open("post", url, true);
		dom[i].setRequestHeader("Content-Type","application/x-www-form-urlencoded")
		//dom[i].send(form);
	} // IE
	else if (window.ActiveXObject) {
		try{
			form = URLEncoding(form)
			dom[i] = new ActiveXObject("Microsoft.XMLHTTP");
		}
		catch(e){
			alert("您的浏览器不支持，请更新您的浏览器到最新版本！")
			return;
		}
		
		dom[i].open("post",url,true)
		dom[i].setRequestHeader("Content-Type","application/x-www-form-urlencoded")
		dom[i].setRequestHeader("Content-Type","text/xml");
		dom[i].setRequestHeader("Content-Type","gb2312");
		//dom.send(form);
		//dom.send("a=我们");
	}
	//if(event.srcElement.tagName == "BUTTON")return;
	if(window.event != null)
	{
		if(event != null && event.srcElement != null && event.srcElement.Validators != null)
		{
			
			if(event.srcElement.Validators[0].isvalid == true){
				return;
			}
		}
	}
	if(p != null)
	{
		p.Status = 11;	//正在验证;
	}
	//alert(dom.responseText)
	
	dom[i].onreadystatechange = checkCallBack;
	dom[i].send(form);
	//return dom
}
