 	var strRoomType = "numofrooms";
	var strAdultType = "numofadults";
	var strChildType = "numofchildren";
	var srtSubTotal = "subtotal";
	//var grantTotal =0;
	var subTotalArray = new Array();
	var subTotalArrayBeforeDiscount = new Array();
	var subTotalDiscount = new Array();
	
	var stayObject = new Array();
	
	//todo: clear room, set cookie time to 20mins
	function setBooking(theCell, roomID,clickDate){
		var cookiename=  "room_"+roomID+ "_" +clickDate;
		var chkboxName = "chk_"+roomID+"_"+clickDate;
		var cookievalue=  roomID+ "_" +clickDate;
		
		theCell.className = $.trim(theCell.className);
		
		if(!isCookieEnable()){
			alert("To use this booking system, please enable your browser cookies.");
			return true;
		} 
		
		if(theCell.className == "rm-unavailable") {
			return true;
		}else if(theCell.className == "seldays") {//selected days
			document.getElementById(chkboxName).checked = false;
			theCell.className = "days";
			eraseRoomCookie(cookiename)
		}else if(theCell.className == "selwkd") {//selected weekend
			document.getElementById(chkboxName).checked = false;
			theCell.className = "wkd";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "seldaysmin"){//selected days minimum stay
			document.getElementById(chkboxName).checked = false;
			theCell.className = "daysmin";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "selwkdmin"){//selected weekend minimum stay
			document.getElementById(chkboxName).checked = false;
			theCell.className = "wkdmin";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "seldaysdeal"){//selected days deal
			document.getElementById(chkboxName).checked = false;
			theCell.className = "daysdeal";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "selwkddeal"){//selected weekend deal
			document.getElementById(chkboxName).checked = false;
			theCell.className = "wkddeal";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "seldaysmindeal"){//selected days minimum stay deal
			document.getElementById(chkboxName).checked = false;
			theCell.className = "daysmindeal";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "selwkdmindeal"){//selected weekend minimum stay deal
			document.getElementById(chkboxName).checked = false;
			theCell.className = "wkdmindeal";
			eraseRoomCookie(cookiename);
		}else if(theCell.className == "days"){//days turns into seldays when clicked
			document.getElementById(chkboxName).checked = true;
			theCell.className = "seldays";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className == "wkd"){//weekend turns into seldwkd when clicked
			document.getElementById(chkboxName).checked = true;
			theCell.className = "selwkd";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className=="daysmin"){//days minimum stay turns into selected days minimum stay
			document.getElementById(chkboxName).checked = true;
			theCell.className = "seldaysmin";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className == "wkdmin"){//days minimum stay turns into selected days minimum stay
			document.getElementById(chkboxName).checked = true;
			theCell.className = "selwkdmin";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className == "daysdeal"){//days deal turns into selected days deal
			document.getElementById(chkboxName).checked = true;
			theCell.className = "seldaysdeal";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className == "wkddeal"){//weekend deal turns into 
			document.getElementById(chkboxName).checked = true;
			theCell.className = "selwkddeal";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className == "daysmindeal"){//days min deal turns into seldaysmindeal
			document.getElementById(chkboxName).checked = true;
			theCell.className = "seldaysmindeal";
			createRoomCookie(cookiename,cookievalue,1);
		}else if(theCell.className == "wkdmindeal"){//wkd min deal turns into selwkdmindeal
			document.getElementById(chkboxName).checked = true;
			theCell.className = "selwkdmindeal";
			createRoomCookie(cookiename,cookievalue,1);
		}else{
			document.getElementById(chkboxName).checked = true;
			theCell.className = "seldays";
			createRoomCookie(cookiename,cookievalue,1);
		}
		DoCallback("/Classes/ajaxManager.php", "listingId="+currentListingId+"&toDo=minStay");
		return true;
	}//end  function setBooking(theCell){
	
	
	
	function dobooking(){
		if(!isCookieEnable()){
			alert("To use this booking system, please enable your browser cookies.");
			return false;
		} 
        thisCookie = document.cookie.split("; ");
        var numofbooking = 0;
        for (i=0; i<thisCookie.length; i++){
           cookieName = thisCookie[i].split("=")[0];
           if(cookieName.substr(0,4) =="room"){
                   numofbooking++;
           }
        }
		
		if (numofbooking ==0){
			alert("Please select the date of the room you want to book.");
			return false;
        }else{
			//Can not use DoCallback here is because ajax is slower than script excute
			// use sleep(5000) still doesn't work
			//DoCallback("/Classes/ajaxManager.php", "listingId=17076");
			if(!meetMinStayReq && errMsg!=''){
				alert(errMsg);	
			}
			return meetMinStayReq;
        }
		
		
	}//end function dobooking
	
	function eraseRoomCookie(name){
        createRoomCookie(name,"",-1);
	}
	
	function cleanallbooking(){
        thisCookie = document.cookie.split("; ");
        //expireDate = new Date ;
        //expireDate.setDate(expireDate.getDate()-1)
			
        for (i=0; i<thisCookie.length; i++){
           cookieName = thisCookie[i].split("=")[0];
           if(cookieName.substr(0,4) =="room"){
                   eraseRoomCookie(cookieName);
                   theCell =  document.getElementById(cookieName);
                   if(isObject(theCell)){
                	       //alert(theCell.className);
                           if(theCell.className == "seldays") {
                               theCell.className = "days";
                           }else if(theCell.className == "selwkd") {
                               theCell.className = "wkd";
                           }else if(theCell.className == "seldaysmin"){
                        	   theCell.className = "daysmin";
                           }else if(theCell.className == "seldaysdeal"){
                        	   theCell.className = "daysdeal";
                           }else if(theCell.className == "seldaysmindeal"){
                        	   theCell.className = "daysmindeal";
                           }else if(theCell.className == "selwkdmin"){
                        	   theCell.className = "wkdmin";
                           }else if(theCell.className == "selwkddeal"){
                        	   theCell.className = "wkddeal";	
                           }else if(theCell.className == "selwkdmindeal"){
                        	   theCell.className = "wkdmindeal";
                           }
                   }
                   
                   var chkBox = document.getElementById(cookieName.replace(/room/, "chk"));
                   chkBox.checked = false;
           }

           //document.cookie = cookieName + "=;expire=" + expireDate.toGMTString();
        }
        return true;
	}//end function cleanallbooking
	
	function selctionSubString(selectionName,whichPart){
		var firstIndex = selectionName.indexOf("_");
	    var lastIndex = selectionName.lastIndexOf("_");
	    if(whichPart=="Type")
	    	return selectionName.substring(0,firstIndex);
	   	else if(whichPart=="RoomID")
			return selectionName.substring(firstIndex+1, lastIndex);
	    else if(whichPart=="Date")
			return selectionName.substring(lastIndex+1);
	}//end selctionSubString
	
	/*
	selectionBox - which dropdown list was clicked 
	*/
	function changeSelection(selectionBox,onePersonRate,twoPersonRate,extraAdultRate,extraChildRate, maxPeople, rateValidFor, packageObj){
	    var selBoxName = selectionBox.id.toString();
	   	var selType = selctionSubString(selBoxName,"Type");
	   	var selRoomID = selctionSubString(selBoxName,"RoomID");
	   	var selDate = selctionSubString(selBoxName,"Date");
	   	//alert(selBoxName+ " "+selType+" "+ selRoomID+" "+selDate);	   	
		var strAdultTarget = strAdultType+"_"+selRoomID+"_"+selDate;
	   	var strChildTarget = strChildType+"_"+selRoomID+"_"+selDate;
	    if(selType==strRoomType){
        	resetPeopleSection(selType, selBoxName, strAdultTarget,maxPeople);
			resetPeopleSection(selType, selBoxName, strChildTarget,maxPeople);
	   
	   	}else if(selType==strAdultType){
	   		resetPeopleSection(selType,selBoxName,strChildTarget,maxPeople);
		}else if(selType==strChildType){
        	resetPeopleSection(selType,selBoxName, strAdultTarget,maxPeople);	   
	   	}
		
		resetSubtotal(selectionBox,onePersonRate,twoPersonRate,extraAdultRate,extraChildRate, maxPeople ,rateValidFor,packageObj);
		resetGrandTotal(isValidCardNumber,1);
		//TODO
		/*
		//resetGrandTotal
		click reset button -all selection.lenght =original
		reload page - set selectedIndex=0
		//pageload - set subtotal
		*/
	}//end changeSelection
	
	
	function changeFollowing(selectionBox){
		
		var selBoxName = selectionBox.id.toString();
		var selType = selctionSubString(selBoxName,"Type");
		var selRoomID = selctionSubString(selBoxName,"RoomID");
		var selDate = selctionSubString(selBoxName,"Date");
		var selIndex = getValueIndex(selectionBox, selectionBox.value);
		//alert(selBoxName+ " "+selType+" "+ selRoomID+" "+selDate);
		for (var i=0;i<document.booking_step2.elements.length;i++) {
			var e = document.booking_step2.elements[i];
			var objName = e.name.toString();
			var firstpos = objName.indexOf('_');//charAt()
			var objType= objName.substring(0,firstpos);
			
			
			if((selType==objType) && (selIndex < e.length)){
				//alert(selBoxName+ " --"+selType+"-- =="+ objType+"== ");	
				var newIndex = getValueIndex(selectionBox, selectionBox.value);
				var oldIndex = e.selectedIndex;
				swapOptionIndexSelected (e,newIndex,oldIndex)
				resetSubtotal(e,50,75,20,15, 2,2 );
			}
			
		}//end for (var i=0;i<document.booking_step2.elements.length;i++)
		
	}
	
	/*
	selType - type of dropdown list (rooms, adults, children)
	selClicked -  which dropdown list was clicked 
	resetTarget - which dropdown need to be reset
	maxPeople -	
	*/
	
	function resetPeopleSection(selType, selClicked, resetTarget,maxPeople){
		
		var resetTargetType = selctionSubString(resetTarget,"Type");
		var clickedObject = document.getElementById(selClicked);
		var targetObject =  document.getElementById(resetTarget);
		
		var selRoomID = selctionSubString(resetTarget,"RoomID");
	   	var selDate = selctionSubString(resetTarget,"Date");	   	
		var strRoomSelection  = strRoomType+"_"+selRoomID+"_"+selDate;
		var selectedRoomObject =  document.getElementById(strRoomSelection);
		
		var selClickedSelectedValue = getSelectedValue(clickedObject);
		var selResetTargetValue = getSelectedValue(targetObject);
		var selRoomValue = getSelectedValue(selectedRoomObject);
		var numberOfpeopleSelected = selClickedSelectedValue+selResetTargetValue;
		var peopleoptionlength = selRoomValue*maxPeople;
		if(selType==strRoomType){
			//reset adult and child's option when number of room change.
		    //var peopleoptionlength = selClickedSelectedValue*maxPeople;
			//alert(selType+ "  "+ resetTargetType+ " "+maxPeople+" * "+selClickedSelectedValue+ " = "+peopleoptionlength);
			removeAllOptions(targetObject) ;
			var k;
			if(resetTargetType==strAdultType){
			   //at least one adult must be selected.
				for(k=1; k<peopleoptionlength+1;k++){
					addOption(targetObject,k,k,"") ;
				}
			}
			else if(resetTargetType==strChildType){
				//number of chlidren always one less than max people
				for(k=0; k<peopleoptionlength;k++){
					addOption(targetObject,k,k,"") ;
				}
			}
			
	   	}
	    else {
			//selection is adult, 
			if(selType==strAdultType){
				//select amount of adults and children more than max people				
				if(numberOfpeopleSelected >peopleoptionlength){
					var newTargetIndex = peopleoptionlength-selClickedSelectedValue;
					//alert(" "+selType+ "  "+ resetTargetType+ " numberOfpeopleSelected "+numberOfpeopleSelected+ " peopleLength "+peopleoptionlength+"\r\n clickvalue "+selClickedSelectedValue+ "  targetvalue "+selResetTargetValue+" newtargervalue "+newTargetIndex);
					alert("Your total number of adults and children is "+numberOfpeopleSelected+".\r\n This exceed the maximum number of people "+ peopleoptionlength+".\r\n Please review number of people of your selection.");
					targetObject.focus();
					swapOptionIndexSelected (targetObject,newTargetIndex,targetObject.selectedIndex);
				}
			}
			//selection is child
			else if(selType==strChildType){
			    //select amount of adults and children more than max people				
				if(numberOfpeopleSelected >peopleoptionlength){
				    //adult's value start from 1,  
					var newTargetIndex = peopleoptionlength-selClickedSelectedValue-1;
					alert("Your total number of adults and children is "+numberOfpeopleSelected+".\r\n This exceed the maximum number of people "+ peopleoptionlength+".\r\n Please review number of people of your selection.");
					targetObject.focus();
					swapOptionIndexSelected (targetObject,newTargetIndex,targetObject.selectedIndex);
				}
			}
	   	}
	
	}//end resetPeopleSection()
	
	/*
	obj - which dropdown list was clicked 
	return - selected value
	modified 29/5: add base 10 into   parseInt(,10) function
	*/
	function getSelectedValue(obj){
	   /*
	    for (var i=0; i<obj.options.length; i++) {
        	if (obj.options[i].selected == true){
				return obj.options[i].value;
				break;
			}
        }
        return null;	
		*/
		//value from selection box
		if (obj!=null && obj.options!=null) { 
			return parseInt(obj.options[obj.selectedIndex].value,10);
		}
		//value from hidden field
		else{
			return parseInt(obj.value,10);
		}
	}
	
	/*
	obj - which dropdown list was clicked 
	return - given value's index
	*/
	function getValueIndex(obj, value){
	    value= parseInt(value,10);
	    for (var i=0; i<obj.options.length; i++) {
        	if (obj.options[i].value == value){
				return parseInt(i,10);
				break;
			}
        }
        return null;		
	}
	
	function removeAllOptions(from) {
        for (var i=(from.options.length-1); i>=0; i--) {
                from.options[i] = null;
                }
        from.selectedIndex = -1;
    }
	function addOption(obj,text,value,selected) {      
	
        obj.options[obj.options.length] = new Option(text, value, false, selected);               
    }
	
	// -------------------------------------------------------------------
	// swapOptions(select_object,option1,option2)
	//  Swap positions of two options in a select list
	// -------------------------------------------------------------------
	function swapOptions(obj,i,j) {
		var o = obj.options;
		var i_selected = o[i].selected;
		var j_selected = o[j].selected;
		var temp = new Option(o[i].text, o[i].value, o[i].defaultSelected, o[i].selected);
		var temp2= new Option(o[j].text, o[j].value, o[j].defaultSelected, o[j].selected);
		o[i] = temp2;
		o[j] = temp;
		o[i].selected = j_selected;
		o[j].selected = i_selected;
	}
	
	
					//swapOptions(targetObject,newTargetIndex,selResetTargetValue);
	function swapOptionIndexSelected (obj,newIndex,oldIndex){
		//alert(obj.name+ ' new index '+newIndex+' old index '+oldIndex);
		obj.options[oldIndex].selected = false;
		obj.options[newIndex].selected = true;	
	}
	
	// -------------------------------------------------------------------
	// moveOptionUp(select_object)
	//  Move selected option in a select list up one
	// -------------------------------------------------------------------
	function moveOptionUp(obj) {
		if (!hasOptions(obj)) { return; }
		for (i=0; i<obj.options.length; i++) {
			if (obj.options[i].selected) {
				if (i != 0 && !obj.options[i-1].selected) {
					swapOptions(obj,i,i-1);
					obj.options[i-1].selected = true;
				}
			}
		}
	}

	// -------------------------------------------------------------------
	// moveOptionDown(select_object)
	//  Move selected option in a select list down one
	// -------------------------------------------------------------------
	function moveOptionDown(obj) {
	if (!hasOptions(obj)) { return; }
	for (i=obj.options.length-1; i>=0; i--) {
		if (obj.options[i].selected) {
			if (i != (obj.options.length-1) && ! obj.options[i+1].selected) {
				swapOptions(obj,i,i+1);
				obj.options[i+1].selected = true;
				}
			}
		}
	}

	// -------------------------------------------------------------------
	// removeSelectedOptions(select_object)
	//  Remove all selected options from a list
	//  (Thanks to Gene Ninestein)
	// -------------------------------------------------------------------
	function removeSelectedOptions(from) { 
		if (!hasOptions(from)) { return; }
		if (from.type=="select-one") {
			from.options[from.selectedIndex] = null;
		}
		else {
			for (var i=(from.options.length-1); i>=0; i--) { 
				var o=from.options[i]; 
				if (o.selected) { 
					from.options[i] = null; 
				} 
			}
		}
		from.selectedIndex = -1; 
	}

        function addDays(myDate,days) {
           return new Date(myDate.getTime() + days*24*60*60*1000);
        }

        function convertToTwoDigit( inputStr ){
           inputStr = inputStr.toString();
           return (inputStr.length <2) ? "0"+inputStr:inputStr; 
        }
 
	
	function resetSubtotal(selectionBox,onePersonRate,twoPersonRate,extraAdultRate,extraChildRate, maxPeople, rateValidFor , packageObj ){
		var selBoxName = selectionBox.id.toString();
	   	//var selType = selctionSubString(selBoxName,"Type");
	   	var selRoomID = selctionSubString(selBoxName,"RoomID");
	   	var selDate = selctionSubString(selBoxName,"Date");
	   	//alert(selBoxName+ " "+selType+" "+ selRoomID+" "+selDate);	
		var srtRoomTagret  = strRoomType+"_"+selRoomID+"_"+selDate; 	
		var strAdultTarget = strAdultType+"_"+selRoomID+"_"+selDate;
	   	var strChildTarget = strChildType+"_"+selRoomID+"_"+selDate;
		var srtSubTotalTarget = srtSubTotal+"_"+selRoomID+"_"+selDate;
		
		var roomObjValue  = getSelectedValue(document.getElementById(srtRoomTagret)); 	
		var adultObjValue = getSelectedValue(document.getElementById(strAdultTarget)) ;
	   	var childObjValue = getSelectedValue(document.getElementById(strChildTarget)) ;
		
		var subTotalObj = document.getElementById(srtSubTotalTarget) ;
		
		var maxPeopleAllow = maxPeople * roomObjValue;
		//var extraStartFrom = 2 * roomObjValue;
		if( rateValidFor<2) rateValidFor=2;
	
		var extraStartFrom = rateValidFor * roomObjValue;
		/**
		console.log(srtRoomTagret+"====="+rateValidFor+"======="+roomObjValue);
		var strRoomType = "numofrooms";
		var strAdultType = "numofadults";
		var strChildType = "numofchildren";
		var srtSubTotal = "subtotal";
		*/
		
		var numberOfPeopleSelected = adultObjValue + childObjValue;
		var subTotalAmount =0;
		var extraAdult=0;
		var extraChild=0;
		var roomRate = 0;
		if( (roomObjValue==1) && (adultObjValue==1) && (childObjValue==0)){
			subTotalAmount =onePersonRate;
			
		}else{
			subTotalAmount = twoPersonRate * roomObjValue;
			if(numberOfPeopleSelected > extraStartFrom){
				//adult not exceed 
				if(adultObjValue < extraStartFrom){
				    extraChild = childObjValue - (extraStartFrom- adultObjValue);
					subTotalAmount = subTotalAmount+ extraChild * extraChildRate;
				}else{
					extraAdult =  adultObjValue -extraStartFrom;
					extraChild = childObjValue;
					subTotalAmount = subTotalAmount+ extraAdult*extraAdultRate + extraChild * extraChildRate;				
				}
			}//end if(numberOfPeopleSelected>maxPeopleAllow)
		}//end else
		
		if (typeof packageObj !== 'undefined' && packageObj) {
			var $offerDiscount = document.getElementById('discount_offer_'+packageObj.discount_ref);
			var $numOfferDiscount = document.getElementById('num_discount_offer_'+packageObj.discount_ref);
			var $numFreeRooms = document.getElementById('numfree_rooms_'+packageObj.discount_ref);
			
			//as per richard still display the discount amount instead display zero(0)
			if(packageObj.discount_type=='amount'){
				subTotalDiscount[selRoomID+"_"+selDate] =  (roomObjValue * parseInt(packageObj.discount_base,10));
				if( ($offerDiscount) && ($numOfferDiscount)){//make sure the element already exists otherwise ignore	
					$offerDiscount.innerHTML =(parseInt(subTotalDiscount[selRoomID+"_"+selDate],10)<=subTotalAmount) ? 
													"$"+subTotalDiscount[selRoomID+"_"+selDate].toFixed(2): "$0.00";
				}						   
				if(parseInt(subTotalDiscount[selRoomID+"_"+selDate],10)>= subTotalAmount){
					//subTotalDiscount[selRoomID+"_"+selDate] = 0;
				}
				
			}else if(packageObj.discount_type=='percentage'){
				subTotalDiscount[selRoomID+"_"+selDate] =  (subTotalAmount * (parseInt(packageObj.discount_base,10)/100));
				if( ($offerDiscount) && ($numOfferDiscount)){//make sure the element already exists otherwise ignore	
					$offerDiscount.innerHTML =(parseInt(subTotalDiscount[selRoomID+"_"+selDate],10)<subTotalAmount) ? 			
												"$"+subTotalDiscount[selRoomID+"_"+selDate].toFixed(2): "$0.00";
				}
						
				if(parseInt(subTotalDiscount[selRoomID+"_"+selDate],10)>= subTotalAmount){
					//subTotalDiscount[selRoomID+"_"+selDate] = 0;
				}
			}else if(packageObj.discount_type=='stay'){//remember Richard business rule the free only applies to rooms only
				//also on the rule is the least number of room booked on one date will be the applicable number of discount price
				//e.g 2 nights get 2 free nights. booked is 20100520(2 rooms),20100521(5 rooms),20100522,20100523
				//dates 20100522 and 20100523 will be free. But the number of rooms thats free is max 2 rooms only.
				//so if the num of rooms in 20100522 is 5 rooms they need to pay 3 rooms and 2 rooms are free
				var num_free = new Array();
                var startStayMonth = parseInt(packageObj.start_of_stay.substr(4,2),10)-1;
                var startStayDay = parseInt(packageObj.start_of_stay.substr(6,2),10);
                var startStayYear = parseInt(packageObj.start_of_stay.substr(0,4),10);
                var startStayDate = new Date(startStayYear,startStayMonth,startStayDay,0,0,0);
                //console.log(packageObj.start_of_stay+"====="+packageObj.num_stay+"=====>"+startStayDate);
                //output above 20100530=====3=====>Sun May 30 2010 00:00:00 GMT+1200 (NZST)
                //console.log(addDays(startStayDate,parseInt(packageObj.num_stay,10))); 
				var compare_date = addDays(startStayDate,parseInt(packageObj.num_stay,10));
                var iterator = 0;
                while( startStayDate < compare_date ){
                    //console.log(packageObj.start_of_stay+"====="+packageObj.num_stay+"=====>"+startStayDate+"====>"+compare_date);
                    var selectionMonth = parseInt(startStayDate.getMonth(),10)+1;
                    var selectionDate = startStayDate.getFullYear().toString();
                    selectionDate += convertToTwoDigit(selectionMonth);
                    selectionDate += convertToTwoDigit(parseInt(startStayDate.getDate(),10));
                    //console.log(convertToTwoDigit(selectionDate));//the dateobject will be converted from 30 May into 20100530
                    var getRoomValue = strRoomType+"_"+selRoomID+"_"+selectionDate;
                    num_free[iterator] = getSelectedValue(document.getElementById(getRoomValue));
				    stayObject[selRoomID+"_"+selectionDate] = packageObj.num_stay+"_"+roomObjValue+"_"+ parseInt(packageObj.discount_value,10)+"_"+packageObj.start_of_stay+"_"+packageObj.end_of_stay;
					/***
					sample value of stayObject
					stay  selected input   start           end
					3_     1_              20100525_       20100528
					**/
					//console.log(stayObject[selRoomID+"_"+selectionDate]+"====="+selRoomID+"_"+selectionDate);
                    startStayDate = addDays(startStayDate,1);//iterate days plus 1
                    iterator++;
                }
				num_free.sort();//sort to ascending order 
				var freeRooms = num_free.shift();//get the lowest number of rooms from the first element on array
				//if roomObjValue is less or equal to free rooms then alright but if roomObjvalue is greater then we need to use the free Rooms instead
				roomObjValue = (roomObjValue <= freeRooms) ? roomObjValue : freeRooms;
				subTotalDiscount[selRoomID+"_"+selDate] = ( roomObjValue * parseInt(packageObj.discount_value,10));
				if( ($offerDiscount) && ($numOfferDiscount)){//make sure the element already exists otherwise ignore	
					$offerDiscount.innerHTML = "$"+subTotalDiscount[selRoomID+"_"+selDate].toFixed(2);
				}
				
			}
				
			if( ($offerDiscount) && ($numOfferDiscount)){//make sure the element already exists otherwise ignore
				$numOfferDiscount.innerHTML = roomObjValue;
				if( typeof($numFreeRooms)=='object' && $numFreeRooms !=null){
					$numFreeRooms.value = roomObjValue;
				}
			}
		}else{
			/***
			roomid     selectionDate       key			numstay     roomObjValue start date end date 
			5651======>20100526===========>5651_20100526=====>1     3_11_20100525_20100528
			**/
			if(typeof(stayObject)=='object'){
			   var stayObjectIndex;
			   for (stayObjectIndex in stayObject){
				var splitStayIndexObject = stayObjectIndex.split("_");
				var splitStayObject = stayObject[stayObjectIndex].split("_");//3_1_225_20100530_20100603
				if(selDate==splitStayIndexObject[1]){	
				   var num_free_select = new Array();
				   var start = splitStayObject[3];                                   
				   var iterator = 0;

                   var startStayMonth = parseInt(start.substr(4,2),10)-1;
                   var startStayDay = parseInt(start.substr(6,2),10);
                   var startStayYear = parseInt(start.substr(0,4),10);
                   var startStayDate = new Date(startStayYear,startStayMonth,startStayDay,0,0,0);
				   var compare_date = addDays(startStayDate,parseInt(splitStayObject[0],10));
				   
				   //startDate is 20100530 and add 3 days from splitStayObject[0] is the amount of stay required			 
				   // what this function do is it will iterate through 			
				   //the numofrooms fields to get the lowest amount of value so that will be the number of free allowable
				   // then we will sort the value and shift the first item on array
				    while( startStayDate < compare_date ){
						var selectionMonth = parseInt(startStayDate.getMonth(),10)+1;
						var selectionDate = startStayDate.getFullYear().toString();
						selectionDate += convertToTwoDigit(selectionMonth);
						selectionDate += convertToTwoDigit(parseInt(startStayDate.getDate(),10));
						var getRoomValueSelect = strRoomType+"_"+selRoomID+"_"+selectionDate; 
						num_free_select[iterator] = getSelectedValue(document.getElementById(getRoomValueSelect));
						startStayDate = addDays(startStayDate,1);//iterate days plus 1
						iterator++;
					}
					
					num_free_select.sort();//sort to ascending order 
					var freeRoomsValue = num_free_select.shift();
					//console.log(freeRoomsValue+"======"+compare_date+"====="+parseInt(splitStayObject[4],10));
					//var compare_date2 = parseInt(splitStayObject[4],10)
					var end = splitStayObject[4];
					var endStayMonth = parseInt(end.substr(4,2),10)-1;//2010
					var endStayDay = parseInt(end.substr(6,2),10);//05= may
					var endStayYear = parseInt(end.substr(0,4),10);//31
					var endStayDate = new Date(endStayYear,endStayMonth,endStayDay,0,0,0);
					
					while( compare_date <= endStayDate ){
						var compareMonth = parseInt(compare_date.getMonth(),10)+1;
						var compareDate = compare_date.getFullYear().toString();
						compareDate += convertToTwoDigit(compareMonth);
						compareDate += convertToTwoDigit(parseInt(compare_date.getDate(),10));
						var getFreeValue = strRoomType+"_"+selRoomID+"_"+compareDate; 
						var getFreeRoomValue = getSelectedValue(document.getElementById(getFreeValue));
						//console.log(freeRoomsValue+"===="+getFreeRoomValue+"=====>"+getFreeValue);
						if( freeRoomsValue <= parseInt(getFreeRoomValue,10)){
							//console.log(freeRoomsValue+"========>"+getFreeValue+"======>"+getFreeRoomValue+"\n");
							subTotalDiscount[selRoomID+"_"+compareDate] = (freeRoomsValue * parseInt(splitStayObject[2],10));
							var $offerDiscount = document.getElementById('discount_offer_'+splitStayIndexObject[0]+"_"+compareDate);
							var $numOfferDiscount = document.getElementById('num_discount_offer_'+splitStayIndexObject[0]+"_"+compareDate);
							var $numFreeRooms = document.getElementById('numfree_rooms_'+splitStayIndexObject[0]+"_"+compareDate);
							$offerDiscount.innerHTML = "$"+subTotalDiscount[selRoomID+"_"+compareDate].toFixed(2);
							$numOfferDiscount.innerHTML = freeRoomsValue;
							if( typeof($numFreeRooms)=='object' && $numFreeRooms !=null){
								$numFreeRooms.value = freeRoomsValue;
							}
						}
						compare_date = addDays(compare_date,1);//iterate days plus 1
					}
				  }
			   }
			}
		}
		
		//subTotalObj.innerHTML = subTotalAmount+" "+maxPeople+" "+roomObjValue+" "+adultObjValue+" "+childObjValue+" "+maxPeopleAllow+" "+numberOfPeopleSelected+" "+extraAdult+" "+extraChild;
		subTotalObj.innerHTML = "$"+subTotalAmount.toFixed(2);
		subTotalArray[selRoomID+"_"+selDate]=subTotalAmount;
        return subTotalAmount;
	}//end function resetSubtotal
	
	function resetGrandTotal(cardNumberOK, hotdeal_discount){
		/*
		if(cardNumberOK) alert("success");
		else alert("faild");
		*/
		var grandTotalObj = document.getElementById("grandTotalAmount") ;
		var subTotalIndex;
		var grantTotal=0;
		var aaDiscountAmount ="";		
		for (subTotalIndex in subTotalArray)
		{
			grantTotal =grantTotal + subTotalArray[subTotalIndex];	
		}
		
		if(hotdeal_discount){
			var hotdealObj = document.getElementById('hotdeal_offer');
			if( hotdealObj ){
				var subTotalAmountBeforeDiscount = document.getElementById('subTotalAmount');
				subTotalAmountBeforeDiscount.innerHTML = "$"+grantTotal.toFixed(2);
				var subTotalDiscountIndex;
			
				var grandDiscountTotal =0;
				for(subTotalDiscountIndex in subTotalDiscount){
					//alert(subTotalDiscount[subTotalDiscountIndex]);
					grandDiscountTotal = grandDiscountTotal + subTotalDiscount[subTotalDiscountIndex];
				}
				grandDiscountTotal = grandDiscountTotal;
				
				
				grantTotal = (grantTotal - grandDiscountTotal);
				if(grantTotal < 1){
					grantTotal = 0;
				}
				hotdealObj.innerHTML = "-$"+grandDiscountTotal.toFixed(2);
				if(parseInt(grandDiscountTotal,10) <= 0 ){
					//var hotdeal_labelObj = document.getElementById('offer_label');
					//hotdeal_labelObj.innerHTML = 'Offer Discount Cannot Apply';
				}
			}
		}
		//alert(typeof(document.getElementById("is_aamember")));
		
		//if (document.getElementById("is_aamember")!=null) {
		if(cardNumberOK){
			var smartfuelText = '';
			aaDiscountAmount = 0;

			if (grantTotal > smartfuelMinAmount) {
				smartfuelText = smartfuelTextQualifiedOk;
			} else {
				smartfuelText = smartfuelTextQualifiedNot;
			}

			document.getElementById("aaMemberText").innerHTML = smartfuelText;
			/* Use member discount before
			aaDiscountAmount = grantTotal * 0.05
			document.getElementById("aaDiscount").innerHTML="<strong class=\"red\">-$"+aaDiscountAmount.toFixed(2)+"</strong>";
			grantTotal= grantTotal - aaDiscountAmount.toFixed(2);
			*/
			//4 points for every complete $10
			//aaDiscountAmount = Math.floor(grantTotal/10) * 1;
			//document.getElementById("aaDiscount").innerHTML='<strong class="red">'+aaDiscountAmount.toFixed(0)+"</strong>";

		} else {
			
			if (document.getElementById("aaMemberNumber")!=null) {
				document.getElementById("aaMemberText").innerHTML="";
				//document.getElementById("aaDiscount").innerHTML=aaDiscountAmount;
			}
		}
		//}
		
		if(parseInt(booking_fee,10) >0 && parseInt(grantTotal,10)>0){
		   grantTotal = grantTotal + booking_fee;
		}
		
		grandTotalObj.innerHTML = "$"+grantTotal.toFixed(2);
		if(document.getElementById("total_amount_taken")!=null){
			var total_amount_takenObj = document.getElementById('total_amount_taken');
			if( typeof(total_amount_takenObj) =='object'){ 
				document.getElementById('total_amount_taken').value =grantTotal.toFixed(2) ;
			}
		}
	}//end resetGrandTotal()
	
	function resetBooking() {
		var answer = '';
		for (var i = 0; i<document.booking_step2.elements.length; i++) {
			if ((document.booking_step2.elements[i].type == 'select-one')) {
				if (document.booking_step2.elements[i].selectedIndex != 0) {
					//answer += document.booking_step2.elements[i].options[document.booking_step2.elements[i].selectedIndex].value + ' ';
					document.booking_step2.elements[i].options[document.booking_step2.elements[i].selectedIndex].selected=false;
					document.booking_step2.elements[i].options[0].selected=true;
				}
			}
		}
		document.booking_step2.action = "";
		document.booking_step2.submit();
	}

	function html_entity_decode (string2, quote_style) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: john (http://www.jd-tech.net)
	    // +      input by: ger
	    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   bugfixed by: Onno Marsman
	    // +   improved by: marc andreu
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +      input by: Ratheous
	    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
	    // +      input by: Nick Kolosov (http://sammy.ru)
	    // +   bugfixed by: Fox
	    // -    depends on: get_html_translation_table
	    // *     example 1: html_entity_decode('Kevin &amp; van Zonneveld');
	    // *     returns 1: 'Kevin & van Zonneveld'
	    // *     example 2: html_entity_decode('&amp;lt;');
	    // *     returns 2: '&lt;'
	    var hash_map = {};
	    var symbol = '';
	    var tmp_str = '';
	    var entity = '';
	    tmp_str = string2.toString();

	    if (false === (hash_map = this.get_html_translation_table('HTML_ENTITIES', quote_style))) {
	        return false;
	    }

	    // fix &amp; problem
	    // http://phpjs.org/functions/get_html_translation_table:416#comment_97660
	    delete(hash_map['&']);
	    hash_map['&'] = '&amp;';

	    for (symbol in hash_map) {
	        entity = hash_map[symbol];
	        tmp_str = tmp_str.split(entity).join(symbol);
	    }
	    tmp_str = tmp_str.split('&#039;').join("'");

	    return tmp_str;
	}
	
	function get_html_translation_table (table, quote_style) {
	    // http://kevin.vanzonneveld.net
	    // +   original by: Philip Peterson
	    // +    revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
	    // +   bugfixed by: noname
	    // +   bugfixed by: Alex
	    // +   bugfixed by: Marco
	    // +   bugfixed by: madipta
	    // +   improved by: KELAN
	    // +   improved by: Brett Zamir (http://brett-zamir.me)
	    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
	    // +      input by: Frank Forte
	    // +   bugfixed by: T.Wild
	    // +      input by: Ratheous
	    // %          note: It has been decided that we're not going to add global
	    // %          note: dependencies to php.js, meaning the constants are not
	    // %          note: real constants, but strings instead. Integers are also supported if someone
	    // %          note: chooses to create the constants themselves.
	    // *     example 1: get_html_translation_table('HTML_SPECIALCHARS');
	    // *     returns 1: {'"': '&quot;', '&': '&amp;', '<': '&lt;', '>': '&gt;'}
	    var entities = {},
	        hash_map = {},
	        decimal = 0,
	        symbol = '';
	    var constMappingTable = {},
	        constMappingQuoteStyle = {};
	    var useTable = {},
	        useQuoteStyle = {};

	    // Translate arguments
	    constMappingTable[0] = 'HTML_SPECIALCHARS';
	    constMappingTable[1] = 'HTML_ENTITIES';
	    constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
	    constMappingQuoteStyle[2] = 'ENT_COMPAT';
	    constMappingQuoteStyle[3] = 'ENT_QUOTES';

	    useTable = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
	    useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT';

	    if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES') {
	        throw new Error("Table: " + useTable + ' not supported');
	        // return false;
	    }

	    entities['38'] = '&amp;';
	    if (useTable === 'HTML_ENTITIES') {
	        entities['160'] = '&nbsp;';
	        entities['161'] = '&iexcl;';
	        entities['162'] = '&cent;';
	        entities['163'] = '&pound;';
	        entities['164'] = '&curren;';
	        entities['165'] = '&yen;';
	        entities['166'] = '&brvbar;';
	        entities['167'] = '&sect;';
	        entities['168'] = '&uml;';
	        entities['169'] = '&copy;';
	        entities['170'] = '&ordf;';
	        entities['171'] = '&laquo;';
	        entities['172'] = '&not;';
	        entities['173'] = '&shy;';
	        entities['174'] = '&reg;';
	        entities['175'] = '&macr;';
	        entities['176'] = '&deg;';
	        entities['177'] = '&plusmn;';
	        entities['178'] = '&sup2;';
	        entities['179'] = '&sup3;';
	        entities['180'] = '&acute;';
	        entities['181'] = '&micro;';
	        entities['182'] = '&para;';
	        entities['183'] = '&middot;';
	        entities['184'] = '&cedil;';
	        entities['185'] = '&sup1;';
	        entities['186'] = '&ordm;';
	        entities['187'] = '&raquo;';
	        entities['188'] = '&frac14;';
	        entities['189'] = '&frac12;';
	        entities['190'] = '&frac34;';
	        entities['191'] = '&iquest;';
	        entities['192'] = '&Agrave;';
	        entities['193'] = '&Aacute;';
	        entities['194'] = '&Acirc;';
	        entities['195'] = '&Atilde;';
	        entities['196'] = '&Auml;';
	        entities['197'] = '&Aring;';
	        entities['198'] = '&AElig;';
	        entities['199'] = '&Ccedil;';
	        entities['200'] = '&Egrave;';
	        entities['201'] = '&Eacute;';
	        entities['202'] = '&Ecirc;';
	        entities['203'] = '&Euml;';
	        entities['204'] = '&Igrave;';
	        entities['205'] = '&Iacute;';
	        entities['206'] = '&Icirc;';
	        entities['207'] = '&Iuml;';
	        entities['208'] = '&ETH;';
	        entities['209'] = '&Ntilde;';
	        entities['210'] = '&Ograve;';
	        entities['211'] = '&Oacute;';
	        entities['212'] = '&Ocirc;';
	        entities['213'] = '&Otilde;';
	        entities['214'] = '&Ouml;';
	        entities['215'] = '&times;';
	        entities['216'] = '&Oslash;';
	        entities['217'] = '&Ugrave;';
	        entities['218'] = '&Uacute;';
	        entities['219'] = '&Ucirc;';
	        entities['220'] = '&Uuml;';
	        entities['221'] = '&Yacute;';
	        entities['222'] = '&THORN;';
	        entities['223'] = '&szlig;';
	        entities['224'] = '&agrave;';
	        entities['225'] = '&aacute;';
	        entities['226'] = '&acirc;';
	        entities['227'] = '&atilde;';
	        entities['228'] = '&auml;';
	        entities['229'] = '&aring;';
	        entities['230'] = '&aelig;';
	        entities['231'] = '&ccedil;';
	        entities['232'] = '&egrave;';
	        entities['233'] = '&eacute;';
	        entities['234'] = '&ecirc;';
	        entities['235'] = '&euml;';
	        entities['236'] = '&igrave;';
	        entities['237'] = '&iacute;';
	        entities['238'] = '&icirc;';
	        entities['239'] = '&iuml;';
	        entities['240'] = '&eth;';
	        entities['241'] = '&ntilde;';
	        entities['242'] = '&ograve;';
	        entities['243'] = '&oacute;';
	        entities['244'] = '&ocirc;';
	        entities['245'] = '&otilde;';
	        entities['246'] = '&ouml;';
	        entities['247'] = '&divide;';
	        entities['248'] = '&oslash;';
	        entities['249'] = '&ugrave;';
	        entities['250'] = '&uacute;';
	        entities['251'] = '&ucirc;';
	        entities['252'] = '&uuml;';
	        entities['253'] = '&yacute;';
	        entities['254'] = '&thorn;';
	        entities['255'] = '&yuml;';
	    }

	    if (useQuoteStyle !== 'ENT_NOQUOTES') {
	        entities['34'] = '&quot;';
	    }
	    if (useQuoteStyle === 'ENT_QUOTES') {
	        entities['39'] = '&#39;';
	    }
	    entities['60'] = '&lt;';
	    entities['62'] = '&gt;';


	    // ascii decimals to real symbols
	    for (decimal in entities) {
	        symbol = String.fromCharCode(decimal);
	        hash_map[symbol] = entities[decimal];
	    }

	    return hash_map;
	}	
