var iPage,tReq,tLbl,wLbl;
var pD=JJ.ua.indexOf("ie")==0 ? "block" : "table";
var pageNo=-1;
var nextOpen=true;
var page=new Array(4);
var txtFld=new Array(18);
var chkFld=new Array(16);
var doJump=new Array(6);

function initBooking() {
	var i;
	init();
	with(document){
		tLbl=getElementById("turtleLbl").style;
		wLbl=getElementById("whaleLbl").style;
		for(i=0;i<18;i++){
			txtFld[i]=getElementById("tFld"+i);
		}
		for(i=0;i<16;i++){
			chkFld[i]=getElementById("cFld"+i);
		}
		for(i=0;i<4;i++){
			page[i]=getElementById("fieldTbl_"+i).style;
		}
		iPage=getElementById("introTbl").style;
		tReq=getElementById("tourReq");
		getElementById("startButton").onclick=nextPage;
		for(i=0;i<4;i++){
			getElementById("backButton_"+i).onclick=previousPage;
			getElementById("nextButton_"+i).onclick=nextPage;
			getElementById("resetButton_"+i).onclick=resetPage;
			getElementById("resetAllButton_"+i).onclick=resetAll;
		}
	}
	for(i=0;i<4;i++){
		txtFld[i].onkeyup=chkNextOpen;
	}
	txtFld[7].onkeyup=chkNextOpen;
	for(i=10;i<15;i++){
		txtFld[i].onkeyup=new Function("autoJump("+i+",true);chkNextOpen();");
	}
	txtFld[15].onkeyup=new Function("autoJump(15,false);chkNextOpen();");
	for(i=4;i<7;i++){
		txtFld[i].onkeypress=onlyPhone;
	}
	for(i=7;i<16;i++){
		txtFld[i].onkeypress=onlyDigits;
	}
	for(i=10;i<16;i++){
		txtFld[i].onfocus=new Function("clearDateTxt("+i+");");
		txtFld[i].onblur=new Function("setDateTxt("+i+");");
	}
	resetAll();
}

function chkNextOpen(){
	var d1,m1,y1,d2,m2,y2;
	switch(pageNo){
		case 0:
			nextOpen=txtFld[0].value.length>1 && txtFld[1].value.length>1 && txtFld[2].value.length>1 && validEmail(txtFld[3].value);
			break;
		case 1:
			d1=txtFld[10].value;
			m1=txtFld[11].value;
			y1=txtFld[12].value;
			d2=txtFld[13].value;
			m2=txtFld[14].value;
			y2=txtFld[15].value;
			nextOpen=parseInt(txtFld[7].value,10)>0 && validDate(d1,m1,y1) && validDate(d2,m2,y2);
			if(nextOpen) {
				arrDate=setDate(d1,m1,y1);
				depDate=setDate(d2,m2,y2);
				arrTime=arrDate.getTime();
				depTime=depDate.getTime();
				nextOpen=nextOpen && arrTime<depTime;
			}
			break;
		default:
			nextOpen=true;
	}
}

function nextPage(){
	var tDate,arrM,depM;
	if(nextOpen){
		switch(pageNo++){
			case -1:
				iPage.display="none";
				page[0].display=JJ.ua.indexOf("ie")==0 ? "block" : "table";
				break;
			case 1:
				if(!datesOK()) {
					pageNo--;
					return;
				}
				page[1].display="none";
				if(tReq.checked){
					tDate=setDate(txtFld[10].value,txtFld[11].value,txtFld[12].value);
					arrM=tDate.getMonth()+1;
					tDate=setDate(txtFld[13].value,txtFld[14].value,txtFld[15].value);
					depM=tDate.getMonth()+1;
					if(arrM>2 && arrM<11 && depM>2 && depM<11){
						chkFld[11].checked=false;
						chkFld[11].disabled=true;
						tLbl.color="#885500";
					}
					else{
						chkFld[11].disabled=false;
						tLbl.color="#ffee99";
					}
					if(((arrM<5 || arrM>11) && (depM<5 || depM>11))){
						chkFld[12].checked=false;
						chkFld[12].disabled=true;
						wLbl.color="#885500";
					}
					else{
						chkFld[12].disabled=false;
						wLbl.color="#ffee99";
					}
					page[2].display=JJ.ua.indexOf("ie")==0 ? "block" : "table";
				}
				else{
					page[3].display=JJ.ua.indexOf("ie")==0 ? "block" : "table";
					pageNo=3;
				}
				break;
			case 3:
				processForm();
				break;
			default:
				page[pageNo-1].display="none";
				page[pageNo].display=JJ.ua.indexOf("ie")==0 ? "block" : "table";
		}
		chkNextOpen();
		switch(pageNo){
			case 0:
				txtFld[0].focus();
				break;
			case 1:
				txtFld[7].focus();
				break;
			case 2:
				chkFld[0].focus();
				break;
			case 3:
				txtFld[17].focus();
		}
	}
	else{
		validatePage();
	}
}

function validatePage(){
	var tVal,d1,m1,y1,d2,m2,y2,arrDate,depDate,arrTime,depTime;
	var errMsg="";
	var errFld=-1;
	switch(pageNo){
		case 0:
			tVal=txtFld[0].value;
			if(tVal==""){
				errMsg='"First Name" has to be filled!';
				errFld=0;
			}
			else if(tVal.length<2){
				errMsg='"First Name" is not valid!';
				errFld=0;
			}
			tVal=txtFld[1].value;
			if(tVal==""){
				if(errFld!=-1) errMsg+="\n";
				else errFld=1;
				errMsg+='"Surname" has to be filled!';
			}
			else if(tVal.length<2){
				if(errFld!=-1) errMsg+="\n";
				else errFld=1;
				errMsg='"Surname" is not valid!';
			}
			tVal=txtFld[2].value;
			if(tVal==""){
				if(errFld!=-1) errMsg+="\n";
				else errFld=2;
				errMsg+='"Country" has to be filled!';
			}
			else if(tVal.length<2){
				if(errFld!=-1) errMsg+="\n";
				else errFld=2;
				errMsg='"Country" is not valid!';
			}
			tVal=txtFld[3].value;
			if(tVal==""){
				if(errFld!=-1) errMsg+="\n";
				else errFld=3;
				errMsg+='"E-mail Address" has to be filled!';
			}
			else if(!validEmail(tVal)){
				if(errFld!=-1) errMsg+="\n";
				else errFld=3;
				errMsg+='"E-mail Address" is not valid!';
			}
			if(errFld!=-1){
				alert(errMsg);
				txtFld[errFld].focus();
			}
			else{
				alert("Unknown Error!\n\nPlease try again or contact us by e-mail.");
			}
			break;
		case 1:
			tVal=txtFld[7].value;
			if(tVal=="" || parseInt(tVal,10)<1){
				errMsg='Number of "Adults" has to be filled!';
				errFld=7;
			}
			d1=txtFld[10].value;
			m1=txtFld[11].value;
			y1=txtFld[12].value;
			if(d1=="DD" || m1=="MM" || y1=="YYYY"){
				if(errFld!=-1) errMsg+="\n";
				else errFld=10;
				errMsg+='"Date of Arrival" has to be filled!';
			}
			else if(!validDate(d1,m1,y1)){
				if(errFld!=-1) errMsg+="\n";
				else errFld=10;
				errMsg+='"Date of Arrival" is not valid!';
			}
			d2=txtFld[13].value;
			m2=txtFld[14].value;
			y2=txtFld[15].value;
			if(d2=="DD" || m2=="MM" || y2=="YYYY"){
				if(errFld!=-1) errMsg+="\n";
				else errFld=13;
				errMsg+='"Date of Departure" has to be filled!';
			}
			else if(!validDate(d2,m2,y2)){
				if(errFld!=-1) errMsg+="\n";
				else errFld=13;
				errMsg+='"Date of Departure" is not valid!';
			}
			if(validDate(d1,m1,y1) && validDate(d2,m2,y2)){
				arrDate=setDate(d1,m1,y1);
				depDate=setDate(d2,m2,y2);
				arrTime=arrDate.getTime();
				depTime=depDate.getTime();
				if(arrTime>depTime){
					if(errFld!=-1) errMsg+="\n";
					else errFld=10;
					errMsg+='"Date of Arrival" is later than "Date of Departure"!';
				}
				else if(arrTime==depTime){
					if(errFld!=-1) errMsg+="\n";
					else errFld=10;
					errMsg+='"Date of Arrival" and "Date of Departure" are the same!';
				}
			}
			if(errFld!=-1){
				alert(errMsg);
				txtFld[errFld].focus();
			}
			else{
				alert("Unknown Error!\n\nPlease try again or contact us by e-mail.");
			}
			break;
	}
}

function setDate(d,m,y) {
	var gDate=new Date(parseInt(y,10),parseInt(m,10)-1,parseInt(d,10));
	return gDate
}

function datesOK(){
	var errMsg="";
	var curDate=new Date();
	var arrDate=setDate(txtFld[10].value,txtFld[11].value,txtFld[12].value);
	var curTime=curDate.getTime();
	var arrTime=arrDate.getTime();
	if(arrTime<curTime){
		errMsg+='"Date of Arrival" has to be later than today!\n\n';
		errMsg+='This validation is based on your computer\'s date settings.\n\n';
		errMsg+='Click "OK" if your computer\'s date settings are wrong and the\ntyped date is correct.\n\n';
		errMsg+='Click "Cancel" to correct "Date of Arrival".';
		if(confirm(errMsg)) return true;
		else return false;
	}
	return true;
}

function previousPage(){
	switch(pageNo--){
		case 0:
			page[0].display="none";
			iPage.display=pD;
			break;
		case 3:
			page[3].display="none";
			if(tReq.checked){
				page[2].display=pD;
			}
			else{
				page[1].display=pD;
				pageNo=1;
			}
			break;
		default:
			page[pageNo+1].display="none";
			page[pageNo].display=pD;
	}
	chkNextOpen();
	switch(pageNo){
		case 0:
			txtFld[0].focus();
			break;
		case 1:
			txtFld[7].focus();
			break;
		case 2:
			chkFld[0].focus();
	}
}

function resetPage(){
	var i;
	switch(pageNo){
		case 0:
			for(i=0;i<7;i++){
				txtFld[i].value="";
				nextOpen=false;
			}
			break;
		case 1:
			for(i=7;i<10;i++){
				txtFld[i].value="";
			}
			txtFld[10].value="DD";
			txtFld[11].value="MM";
			txtFld[12].value="YYYY";
			txtFld[13].value="DD";
			txtFld[14].value="MM";
			txtFld[15].value="YYYY";
			tReq.checked=false;
			nextOpen=false;
			for(i=0;i<6;i++){
				doJump[i]=true;
			}
			break;
		case 2:
			txtFld[16].value="";
			for(i=0;i<16;i++){
				chkFld[i].checked=false;
			}
			break;
		case 3:
			txtFld[17].value="";
	}
}

function resetAll(){
	var i;
	for(i=0;i<4;i++){
		pageNo=i;
		resetPage();
	}
	pageNo=-1;
	for(i=0;i<4;i++){
		page[i].display="none";
	}
	iPage.display=pD;
	nextOpen=true;
}

function processForm(){
	var i,tVal,tVal2,tStr,tArr;
	with(document){
		getElementById("Name").value=txtFld[0].value+" "+txtFld[1].value;
		getElementById("Country").value=txtFld[2].value;
		getElementById("Email").value=txtFld[3].value;
		getElementById("Telephone").value=txtFld[4].value;
		getElementById("Fax").value=txtFld[5].value;
		getElementById("Cell").value=txtFld[6].value;
		tVal=txtFld[7].value;
		tStr=tVal+" Adult"+(parseInt(tVal,10)>1 ? "s" : "");
		tVal=txtFld[8].value;
		tVal2=txtFld[9].value;
		tStr+=(tVal!="") ? (tVal2!="" ? ", " : " and ")+tVal+" Toddler"+(parseInt(tVal,10)>1 ? "s" : ""): "";
		tStr+=(tVal2!="") ? " and "+tVal2+" Child"+(parseInt(tVal2,10)>1 ? "ren" : "") : "";
		getElementById("Number_of_Persons").value=tStr;
		tStr=txtFld[10].value+" "+getMonth(txtFld[11].value)+" "+txtFld[12].value+" to ";
		tStr+=txtFld[13].value+" "+getMonth(txtFld[14].value)+" "+txtFld[15].value;
		getElementById("Period_of_Stay").value=tStr;
		if(tReq.checked){
			tStr="";
			tArr=new Array("Hippo & Crocodile Boat Cruise","St. Lucia Wetland Safari","Night Drive Safari","Hluhluwe/iMfolozi Safari","Horse Ride Safari","Bird Watching","Guided Hike Tour","Guided Bike Tour","Zulu Cultural Tour","Kayaking","Canoeing","Turtle Tour","Whale Watching","Snorkelling","Deep-Sea Fishing","Fishing","Off-road Self Drive");
			for(i=0;i<16;i++){
				if(chkFld[i].checked){
					if(tStr!="") tStr+=" - ";
					tStr+=tArr[i];
				}
			}
			getElementById("Tours").value=tStr;
			getElementById("Special_Tour_Requests").value=txtFld[16].value;
		}
		else{
			getElementById("Tours").value="";
			getElementById("Special_Tour_Requests").value="";
		}
		getElementById("Additional_Information").value=txtFld[17].value;
		getElementById("emailForm").submit();
	}
}

function getMonth(m){
	var rM="Unknown Error in month";
	switch(parseInt(m,10)){
		case 1:
			rM="January";
			break;
		case 2:
			rM="February";
			break;
		case 3:
			rM="March";
			break;
		case 4:
			rM="April";
			break;
		case 5:
			rM="May";
			break;
		case 6:
			rM="June";
			break;
		case 7:
			rM="Juli";
			break;
		case 8:
			rM="August";
			break;
		case 9:
			rM="September";
			break;
		case 10:
			rM="October";
			break;
		case 11:
			rM="November";
			break;
		case 12:
			rM="December";
	}
	return rM;
}

function clearDateTxt(fldNo){
	with(txtFld[fldNo]){
		if(fldNo==10 || fldNo==13) {
			if(value=="DD"){
				value="";
			}
		}
		else if(fldNo==11 || fldNo==14){
			if(value=="MM"){
				value="";
			}
		}
		else{
			if(value=="YYYY"){
				value="";
			}
		}
		select();
	}
}

function setDateTxt(fldNo){
	var dJ=fldNo-10;
	with(txtFld[fldNo]){
		var fldLen=value.length;
		if(fldNo==10 || fldNo==13){
			if(value=="" || parseInt(value,10)==0){
				value="DD";
			}
			else if(fldLen==1){
				value="0"+value;
				doJump[dJ]=false;
			}
		}
		else if(fldNo==11 || fldNo==14){
			if(value=="" || parseInt(value,10)==0){
				value="MM";
			}
			else if(fldLen==1){
				value="0"+value;
				doJump[dJ]=false;
			}
		}
		else{
			if(value=="" || parseInt(value,10)==0 || fldLen==1 || fldLen==3){
				value="YYYY";
			}
			else if(fldLen==2){
				value="20"+value;
				doJump[dJ]=false;
			}
		}
	}
}

function autoJump(fNo,selectNext){
	var dJ=fNo-10;
	var fLength=txtFld[fNo].value.length;
	var fMaxLength=txtFld[fNo].maxLength;
	if(fLength<fMaxLength){
		doJump[dJ]=true;
	}
	else if(fLength==fMaxLength && doJump[dJ]){
		doJump[dJ]=false;
		if(selectNext){
			txtFld[fNo+1].select();
			txtFld[fNo+1].focus();
		}
		else{
			tReq.focus();
		}
	}
}

function onlyPhone(e){
	var kc;
	kc=JJ.ua.indexOf("ie")==0 ? event.keyCode : e.which;
	return (kc==0 || kc==8 || (kc>=48 && kc<=57) || kc==32 || kc==35 || (kc>=40 && kc<=43));
}

function onlyDigits(e){
	var kc;
	kc=JJ.ua.indexOf("ie")==0 ? event.keyCode : e.which;
	return (kc==0 || kc==8 || (kc>=48 && kc<=57));
}

function validEmail(eAddr){
	var eLen=eAddr.length;
	var adIndex;
	var lastDotIndex;
	if (eLen<6 || eAddr.indexOf(" ")>-1){
		return false;
	}
	else{
		adIndex=eAddr.indexOf("@");
		lastDotIndex=eAddr.lastIndexOf(".");
		if (adIndex<1 || adIndex!=eAddr.lastIndexOf("@") || adIndex>(lastDotIndex-2) || lastDotIndex>(eLen-3) || lastDotIndex<(eLen-5)){
			return false;
		}
	}
	return true;
}

function validDate(d,m,y){
	d=parseInt(d,10);
	m=parseInt(m,10);
	y=parseInt(y,10);
	if(isNaN(d) || isNaN(m) || isNaN(y)){
		return false;
	}
	else if(y<2004 || y>2100) {
		return false;
	}
	else if(d<1 || d>31){
		return false;
	}
	else if(m<1 || m>12){
		return false;
	}
	else if((m==4 || m==6 || m==9 || m==11) && d>30){
		return false;
	}
	else if(m==2 && (y%4)!=0 && d>28){
		return false;
	}
	else if(m==2 && (y%100)==0 && (y%400)!= 0 && d>28){
		return false;
	}
	else if(m==2 && (y%4)==0 && d>29){
		return false;
	}
	return true;
}

JJ.removeEvent([window], "load", init);
JJ.addEvent([window], "load", initBooking);
