String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}
function refreshImage(id,jsonObj){
	var object = jQuery.parseJSON(jsonObj);	
	if(object.success == 0){
		return false;
	}
	document.getElementById(id).src = object.html;	
	if( object.js != '' ){
		eval(object.js);
	}	
}

/**/
//('<{$AJAX_PATH}>action.php','action=check','formDiv','formDiv','GET')


//--
function serverRequestCheck(url,parameters,method, formId){
		var id = formId;
		
		var securityCodeObj=document.getElementById('security_code');
		var emailObj=document.getElementById('email');
		parameters += '&code='+securityCodeObj.value;	
		parameters += '&email='+emailObj.value;	
		
		$.ajax({
		   type: method,
		   url: url,
		   data: parameters,
		   success: function(msg){
					//submit form
					var object = jQuery.parseJSON(msg);
					if(object.success==1){		//1 = success		
						//cancel error msg
						displayErrorMsg(emailObj, 'span', true);
						displayErrorMsg(securityCodeObj, 'span', true);
						showPreview(id);
						/* unbind click event handler to make sure there is no double action on click*/
						$('#submit').unbind('click');
						$('#back').unbind('click');						
						$('#submit').click( function(){submitFrom(formId,url,formId,'submit'); } );
						$('#back').click( function(){ endPreview(id); } );	
					}else{
						switch(object.success){//-1 = email repeat error , -2=secrity_code error						
							case -1:
									displayErrorMsg(emailObj, 'span', false,FIELD_ERR_MSG_EMAIL_REPEAT);
									break;
							case -2:
									displayErrorMsg(securityCodeObj, 'span', false,FIELD_ERR_MSG_SECURITY_IMG);
									ajaxRequest( url,'action=refresh',refreshImage,'security_image','GET');//refresh image
									break;	
							default:
									displayErrorMsg(emailObj, 'span', false,FIELD_ERR_MSG_EMAIL_REPEAT);
									displayErrorMsg(securityCodeObj, 'span', false,FIELD_ERR_MSG_SECURITY_IMG);
									ajaxRequest( url,'action=refresh',refreshImage,'security_image','GET');//refresh image
									break;
						}
					}
			},
		   timeout: 40000,
		   error:function(){
			 alert('Request time out');
		   }
	 });	
}
//--
function checkFrom(id, submitURL ,respondId){
	var canSubmit = true;
	
    //check input( radio, text, hidden)
	if(!checkEmptyTag(id,'input')) {  canSubmit = false; }	
	
	//check select
	if(!checkEmptyTag(id,'select')) { canSubmit = false; }	
	
	//check textarea
	if(!checkEmptyTag(id,'textarea')){ canSubmit = false; }

	if(canSubmit){		
		serverRequestCheck(submitURL,'action=serverCheck','POST', id);	 
	}	
}



function submitFrom(id,submitURL,respondId,btn_wrapper){
	var parameters = '';
	var formId = document.getElementById(id);	
	var inputs = formId.getElementsByTagName('input'); // get input 
	
	var multipleNames = Array(); // multiple field use only
	var multipleValueLists = Array(); // multiple field use only
	var multipleCounter = 0;
	
	for(var i = 0 ; i < inputs.length; i++){
		var input = inputs[i];
		switch(input.type){
			case 'checkbox':
					if(input.alt=="multiple" || input.className=="multiple"){						
						if( elementExistinArray( multipleNames , input.name ) ){//alert('2.1:'+input.name);
							var indexNum = getElementIndexInAry(multipleNames , input.name);
							if(input.checked){
								multipleValueLists[indexNum].push(encodeURIComponent(input.value));
							}
						}else{
							if(input.checked){
								multipleNames.push(input.name);	
								multipleValueLists[multipleCounter] = Array();
								multipleValueLists[multipleCounter].push(encodeURIComponent(input.value));
								multipleCounter++;
							}								
						}		
					}
					
					break;
			case 'radio':
					var radioName  = input.name; 
					var radioTags = document.getElementsByName(radioName);
					for(var k=0;k<radioTags.length;k++){
						var radioTag = radioTags[k];
						if(radioTag.checked){
							parameters += '&p'+radioName+'='+encodeURIComponent(radioTag.value);
							break;
						}
					}
				break;
			default:
				parameters += '&p'+input.id+'='+encodeURIComponent(input.value);
				break;
		}
	}

	var selects = formId.getElementsByTagName('select'); // get sigle select
	for(var i = 0 ; i < selects.length; i++){
		var _select = selects[i];
		parameters += '&p'+_select.id+'='+encodeURIComponent(_select.value);
	}
	
	var textareas = formId.getElementsByTagName('textarea'); // get textarea
	for(var i = 0 ; i < textareas.length; i++){
		var textarea = textareas[i];
		parameters += '&p'+textarea.id+'='+encodeURIComponent(textarea.value);
	}
	//-- MULTIPLE CHECKBOX PARA [START]
	var multiparams= '';
	for(var a=0; a<multipleNames.length; a++ ){
			multiparams+='&p'+multipleNames[a]+'=';
			for(var b=0; b<multipleValueLists[a].length; b++){
				multiparams+=multipleValueLists[a][b];
				if( (b+1)<multipleValueLists[a].length ){
						multiparams+= '|';
				}
			}
	}
	parameters+=multiparams;
	//-- MULTIPLE CHECKBOX PARA [END]
	ajaxRequest( submitURL,'action=submit'+parameters ,parseJSON,respondId,'POST',btn_wrapper); // parseJSON is a function come from ajax.js
	
}

//encodeURIComponent()
function hasErrorMsg(formID,className){
		if( className==undefined){ className='errorMsg'; }
		var err_elems = $('.'+className);
		for(i=0; i<err_elems.length;i++){
			var ele = err_elems.eq(i);
			if(ele.html()!='' || ele.html()!=null){	
				 return true;	
			}
		}
		return false;
}

function checkEmptyTag(wrapper,tag){
	var submitable = true;
	var re = /^[A-Za-z0-9_\-]+([.][A-Za-z0-9_\-]+)*[@][A-Za-z0-9_\-]+([.][A-Za-z0-9_\-]+)+$/; // for email
	var re1 = /^[\w-.]+$/;
	var re2 = /[\d]/g; //num only
	var re3 = /^[0-9a-zA-Z]+$/; //for password
	//var re4 = /(([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/i;
	//var re4 = /https?:\/\/([-\A-Za-z0-9_\.]+)+(:\d+)?(\/([\A-Za-z0-9_/_\.]*(\?\S+)?)?)?/;
    var re4 = /^[A-Za-z0-9_\-\:\/]+([.][A-Za-z0-9_\-]+)*[.][A-Za-z0-9_\-\&\,\=\?\/]+$/; //for website	
	//alert(submitable);
	var re5 = /^[a-z A-Z]+$/; //for en name
	
	var submitForm = document.getElementById(wrapper);
	var inputs = submitForm.getElementsByTagName(tag);	
	for(var i = 0; i < inputs.length; i++){
		var input = inputs[i];
		var val = input.value;
		
		switch(input.type){
			case "checkbox": //TBC
				if( input.title == 'mandatory' && input.alt=='multiple' ){
					var checkboxName  = input.name; 
					var checkboxTags = document.getElementsByName(checkboxName);
					var isChecked = false;
					for(var k=0;k<checkboxTags.length;k++){
							checkboxTag = checkboxTags[k];
							if(checkboxTag.checked){ 
								isChecked = true;
								break;
							}
					}	
					if( !isChecked ){
						submitable = false;
						var errMsg=undefined;					
						switch(input.name){
							case 'disclaimer':
								errMsg=FIELD_ERR_MSG_DISCLAIMER;
								break;
						}					
						displayErrorMsg(input, 'span', false,errMsg);	
					}else{
						displayErrorMsg(input, 'span', true);		
					}					
					break;
				}
			case "radio":
				if( input.title == 'mandatory' ){
					var radioName  = input.name; 
					var radioTags = document.getElementsByName(radioName);
					var isChecked = false;
					for(var k=0;k<radioTags.length;k++){
							radioTag = radioTags[k];
							if(radioTag.checked){ 
								isChecked = true;
								break;
							}
					}
					if( !isChecked ){
						submitable = false;
						var errMsg=undefined;
						/*input.name*/	
						
						switch(input.name){
							case 'sex':
								errMsg=FIELD_ERR_MSG_SEX;
								break;
							case 'answer':
								errMsg=FIELD_ERR_MSG_ANSWER;
								break;
								
						}					
						displayErrorMsg(input, 'span', false,errMsg);	
					}else{
						displayErrorMsg(input, 'span', true);		
					}
				}
				break;
			default:
				if( input.title == 'mandatory' && val.trim() == ''){ // error 
					submitable = false;
					displayErrorMsg(input, 'span', false);			
				}
				if( input.title == 'mandatory' && val.trim() != ''){
					displayErrorMsg(input, 'span', true);
				}
				break;
		}
		
		//check birth day for select tag
		if( input.id=='birth_year' ){
			if(!checkDateSelected('birth_year','birth_month','birth_day')){
				submitable = false;	
				displayErrorMsg(input, 'span', false,FIELD_ERR_MSG_BIRTH);
			}
			if(checkDateSelected('birth_year','birth_month','birth_day')){
				displayErrorMsg(input, 'span', true);
			}
		}
		
		//check email patten
		if(  input.id == 'en_name' ){
			if(!re5.test(val) && val.trim()!='' ){ // error
				submitable = false;
				displayErrorMsg(input, 'span', false,FIELD_ERR_EN_NAME);
			}
			if( re.test(val) && val.trim()!='' ){
				displayErrorMsg(input, 'span', true);
			}			
		}	
		
		//check email patten
		if(  input.id == 'msn' || input.id == 'gtalk' || input.id == 'facebook' || input.id == 'email' ){
			if(!re.test(val) && val.trim()!='' ){ // error
				submitable = false;
				displayErrorMsg(input, 'span', false,FIELD_ERR_MSG_EMAIL);
			}
			if( re.test(val) && val.trim()!='' ){
				displayErrorMsg(input, 'span', true);
			}			
		}		
		//check website patten
		if(  input.id == 'website'){
			if(!re4.test(val) && val.trim()!='' ){ // error
				submitable = false;
				displayErrorMsg(input, 'span', false);
			}
			if( re4.test(val) && val.trim()!='' ){
				displayErrorMsg(input, 'span', true);
			}			
		}
		//check tel patten isNaN(value) && value.trim()!=''
		if(  input.id == 'hktel'){
			if( checkHKTelephone(val)==false && val.trim()!=''  ){//error
				submitable = false;
				displayErrorMsg(input, 'span', false,FIELD_ERR_MSG_HKTEL);
			}
			if( checkHKTelephone(val)!=false && val.trim()!='' ){
				displayErrorMsg(input, 'span', true);
			}	
		}
		
		//check tel patten isNaN(value) && value.trim()!=''
		if(  input.id == 'internationalTel'){
			if( checkInternationalPhone(val)==false && val.trim()!=''  ){//error
				submitable = false;
				displayErrorMsg(input, 'span', false);
			}
			if( checkInternationalPhone(val)!=false && val.trim()!='' ){
				displayErrorMsg(input, 'span', true);
			}	
		}
		//check HKID
		if(  input.id == 'HKID4Digits'){
			if( isValidHKID4Digits(val)==false && val.trim()!=''  ){//error
				submitable = false;
				displayErrorMsg(input, 'span', false,FIELD_ERR_MSG_HKID);
			}
			if( isValidHKID4Digits(val)!=false && val.trim()!='' ){
				displayErrorMsg(input, 'span', true);
			}	
		}

		
	}//end for
	//alert(submitable)
	return submitable;
}

function displayErrorMsg(input, errTag, displayEmpty,errMsg){		
			var err_tags = input.parentNode.getElementsByTagName(errTag);
			for(var k=0;k<err_tags.length;k++ ){
				var err_tag = err_tags[k];
				var prefix = '';
				switch(input.type){
					case 'checkbox':
					case 'radio':
						prefix = input.name;
						break;
					default:
						prefix = input.id;
						break;
				}
				if( err_tag.id == prefix+'_error' ){
						var err_msg = '';
						if(!displayEmpty && errMsg == undefined){
							
							var displayName = input.name;
							displayName = displayName.replace(/_/g, " ");
					    	//err_msg = '<img src="'+CURRENT_FRONT_THEME_PATH+IMG_BASE_PATH+'contact_from_error.gif" />'+displayName+' is invalid</span>';
							err_msg = '請輸入'+displayName+' ';
						}else if(!displayEmpty && errMsg != undefined){
								err_msg = errMsg;
						}
						
						
						err_tag.innerHTML = err_msg;
						k = err_tags.length;
				}
			}	
}

//********************************** additional script ********************************** 
// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 8;

function isInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}
function trim(s)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not a whitespace, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (c != " ") returnString += c;
    }
    return returnString;
}
function stripCharsInBag(s, bag)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function checkHKTelephone(strPhone){
	strPhone=trim(strPhone);
	if( strPhone.length < 8 || strPhone.length > 8 ){return false;}
	if( !isInteger(strPhone) ){	return false;	}
	var c =strPhone.charAt(0);
	if( c == "0" || c == "1" ){ return false; }
	return true;
}

function checkInternationalPhone(strPhone){
var bracket=3
strPhone=trim(strPhone)
if(strPhone.indexOf("+")>1) return false
if(strPhone.indexOf("-")!=-1)bracket=bracket+1
if(strPhone.indexOf("(")!=-1 && strPhone.indexOf("(")>bracket)return false
var brchr=strPhone.indexOf("(")
if(strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")")return false
if(strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1)return false
s=stripCharsInBag(strPhone,validWorldPhoneChars);
return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}
//********************************** additional script end **********************************


//Date editor
function elementExistinArray( ary , element ){
	for(var i = 0; i < ary.length; i++){
		if(ary[i].constructor == Array){
			if(	elementExistinArray( ary[i] , element ) ){ return true; }
		}else{
			if(ary[i] == element){
				 return true;	
			}
		}
	}
	return false;
}
function change_month_day(prefix,firstLabel,firstValue){//prefix = 'birth_'

	var yearTag = $('#'+prefix+'year');
	var monthTag = $('#'+prefix+'month');
	var dayTag = $('#'+prefix+'day');
	
	var selected_yr = yearTag.attr('value');
	var selected_month= monthTag.attr('value');
	var selected_day = dayTag.attr('value');
	
	var months = Array(1,3,5,7,8,10,12);
	var is_months = elementExistinArray(months,selected_month);
	var is_years = ( ((selected_yr%4 == 0) && (selected_yr%100 != 0) ) || (selected_yr%400 == 0) ) ? true : false;
	var is_feb = (selected_month==2) ? true : false;
	
		if(is_feb){// day change to 28 or 29
			var feb_day = (is_years) ? 29 : 28;
			changeDay(dayTag, selected_day, feb_day ,firstLabel,firstValue);
		}else{
			if(is_months){// day change to 31
				changeDay(dayTag, selected_day, 31,firstLabel,firstValue);
			}else{
				changeDay(dayTag, selected_day, 30,firstLabel,firstValue);
			}
		}
}

function changeDay(dayTag, selected, change_to,firstLabel,firstValue){ //selected="selected"

	var inner = '<option value="'+firstValue+'">'+firstLabel+'</option>';
	//dayTag.innerHTML = '';
	for(var i=1 ; i<=change_to; i++){
		var selected_attr = (i == selected) ? 'selected="selected"' : '';
		inner+='<option value="'+i+'" '+selected_attr+'>'+i+'</option>';
	}
	//dayTag.innerHTML=inner;
	dayTag.html(inner);
}
//Date editor end

/******************* checking method****************************/
function isAlphaNumber(str)
{
	var patt = /^[a-zA-Z0-9]+$/;
	if (patt.test(str))	return true;
	else 				return false;
}
function isNumberOnly(str)
{
	var patt = /^[0-9]+$/;
	if (patt.test(str))	return true;
	else 				return false;
}
function isValidHKIDFormat(str)
{
	var re = /[A-Z][a-z]?\d{6}\([A-Z0-9]\)$/;

	if(!re.test(str))	 return false;
	else				 return true;
}
function isValidHKID4Digits(str)
{
	var re = /[a-zA-Z]+[a-zA-Z0-9]+[0-9]+[0-9]/;

	if(!re.test(str))	 return false;
	else				 return true;
}

function checkDateSelected(y_id,m_id,d_id){
	var y = $('#'+y_id).val();
	var m = $('#'+m_id).val();
	var d = $('#'+d_id).val();	
	if( y == -1 ){ return false; } 
	if( m == -1 ){ return false; } 
	if( d == -1 ){ return false; } 
	return true;
}

/******************* checking method end ****************************/

/********Preview method**********/

function showPreview(formId){
	swapButton('preview');
	var form = document.getElementById(formId);
	var tags = Array();	
	tags[0]='input';
	tags[1]='textarea';
	tags[2]='select';
	for(k=0; k < tags.length;k++){	
		var inputs = form.getElementsByTagName(tags[k]); // get input 
		for(var i=0; i < inputs.length; i++){
				var id = inputs[i].id;
				$('#'+id).attr('disabled', 'disabled');
		}
	}
}
function endPreview(formId){
	swapButton('input');
	var form = document.getElementById(formId);
	var tags = Array();	
	tags[0]='input';
	tags[1]='textarea';
	tags[2]='select';
	for(k=0; k < tags.length;k++){
		var inputs = form.getElementsByTagName(tags[k]); // get input 
		for(var i=0; i < inputs.length; i++){
				var id = inputs[i].id;
				$('#'+id).removeAttr('disabled');
		}
	}
}

function swapButton(state){
	switch(state){
		case 'preview':
				
				$('#submit').css('display','block');
				$('#back').css('display','block');
				$('#preview').css('display','none');
				$('#refreshDiv').css('display','none');
				
				break;
		case 'input':
		
				$('#submit').css('display','none');
				$('#back').css('display','none');
				$('#preview').css('display','block');
				$('#refreshDiv').css('display','block');
				break;
	}
}

/*
$('#hktel').attr('disabled', 'disabled');

$('#birth_month').removeAttr('disabled');
*/
/********Preview method end**********/


