YAHOO.namespace("page");

YAHOO.page.user_calendar = function() {
	// initialise vars
	var displayed_property = "CBL";

	// shorthands for YUI utilities
	var yue = YAHOO.util.Event;
	var yud = YAHOO.util.Dom;
	var yuEl = YAHOO.util.element;

	var dtCh= "/";
	var minYear=2008;
	var maxYear=2017;

	// functions
	return {
																					
		// initialise function
		init: function(){
			// assign event handlers to page elements
			yue.addListener("booking_submit","click",this.submit_form);
			yue.addListener("clear_form","click",this.clear_form);
//			yue.addListener("pending","change",this.pending_date_selected);
			
			this.render_calendar();
			this.clear_form();
		},
		
		cfg_calendar: function(){
			YAHOO.page.user_calendar.cal1.cfg.setProperty("start_weekday",'5',false);
			YAHOO.page.user_calendar.cal1.cfg.setProperty("mindate",'1/1/2008',false);
			YAHOO.page.user_calendar.cal1.cfg.setProperty("maxdate",'1/1/2017',false);
		},

		isInteger: function(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;
		},

		stripCharsInBag: function(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++){   
				var c = s.charAt(i);
				if (bag.indexOf(c) == -1) returnString += c;
			}
			return returnString;
		},

		daysInFebruary: function(year){
			// February has 29 days in any year evenly divisible by four,
			// EXCEPT for centurial years which are not also divisible by 400.
			return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
		},
		
		DaysArray: function(n) {
			for (var i = 1; i <= n; i++) {
				this[i] = 31
				if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
				if (i==2) {this[i] = 29}
		   } 
		   return this
		},
		
		isNumeric: function(sText)
		{
			var ValidChars = "0123456789.";
			var IsNumber=true;
			var Char;


			for (i = 0; i < sText.length && IsNumber == true; i++) 
			{ 
				Char = sText.charAt(i); 
				if (ValidChars.indexOf(Char) == -1) 
				{
					IsNumber = false;
				}
			}
			return IsNumber;
		},

		isDate: function(dtStr){
			var daysInMonth = YAHOO.page.user_calendar.DaysArray(12)
			var pos1=dtStr.indexOf(dtCh)
			var pos2=dtStr.indexOf(dtCh,pos1+1)
			var strDay=dtStr.substring(0,pos1)
			var strMonth=dtStr.substring(pos1+1,pos2)
			var strYear=dtStr.substring(pos2+1)
			strYr=strYear
			if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
			if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
			for (var i = 1; i <= 3; i++) {
				if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
			}
			month=parseInt(strMonth)
			day=parseInt(strDay)
			year=parseInt(strYr)
			if (pos1==-1 || pos2==-1){
				alert("The date format should be : dd/mm/yyyy")
				return false
			}
			if (strMonth.length<1 || month<1 || month>12){
				alert("Please enter a valid month")
				return false
			}
			if (strDay.length<1 || day<1 || day>31 || (month==2 && day>YAHOO.page.user_calendar.daysInFebruary(year)) || day > daysInMonth[month]){
				alert("Please enter a valid day")
				return false
			}
			if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
				alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
				return false
			}
			if (dtStr.indexOf(dtCh,pos2+1)!=-1 || YAHOO.page.user_calendar.isInteger(YAHOO.page.user_calendar.stripCharsInBag(dtStr, dtCh))==false){
				alert("Please enter a valid date")
				return false
			}

			return true
		},

		validate_form: function(){
			var dt=document.booking.start_date

			if (dt.value==''){
				dt.focus()
				alert('You must enter a start date');
				return false
			}

			if (YAHOO.page.user_calendar.isDate(dt.value)==false){
				dt.focus()
				return false
			}

			var nt=document.booking.nights
			if (nt.value==''){
				nt.focus()
				alert('You must enter a number of nights')
				return false
			}
			
			if (YAHOO.page.user_calendar.isNumeric(document.booking.nights.value)==false){
				alert ('Number of nights must be a number')
				nt.focus()
				return false
			}

			var nm=document.booking.name
			if (nm.value==''){
				nm.focus()
				alert ('You must enter a name')
				return false
			}

			var ph=document.booking.tel
			if (ph.value==''){
				ph.focus()
				alert ('You must enter a telephone number')
				return false
			}

			var em=document.booking.email
			if (em.value==''){
				em.focus()
				alert ('You must enter an email')
				return false
			}

			var tm=document.booking.terms
			if (tm.checked==false){
				tm.focus()
				alert ('You must agree to the terms and conditions')
				return false
			}

			return true
		},


		highlight_bookings: function(){
			var pagedate = YAHOO.page.user_calendar.cal1.cfg.getProperty("pagedate");
			var displayed_year = pagedate.getFullYear();
			var displayed_month = pagedate.getMonth()+1;
												
			// define a success object
			var responseSuccess = function(o){

				// assign the parsed response text to a var
				var bookingsData = o.responseText.parseJSON();

				// loop through returned data and create an image object on each page					
				for(i=0;i<bookingsData.ResultSet.totalResultsReturned;i++){

					var booking_id = bookingsData.ResultSet.Result[i].booking_id;
					var name = bookingsData.ResultSet.Result[i].name;
					var highlight = "highlight2";
										
					var yyyy = bookingsData.ResultSet.Result[i].start_date.substr(0,4);
					var mm = bookingsData.ResultSet.Result[i].start_date.substr(5,2);
					var dd = bookingsData.ResultSet.Result[i].start_date.substr(8,2);

					var start_date = new Date();
					start_date.setFullYear(yyyy,mm-1,dd);
					var nights = bookingsData.ResultSet.Result[i].nights;

					for(j=0;j<nights;j++){
						yyyy = start_date.getFullYear();
						mm = 1 + start_date.getMonth();
						dd = start_date.getDate();
						
						if (mm==displayed_month) {
							// APPLY HIGHLIGHTS
							day_class = 'd' + dd;
				
							// get the cell for this date					 
							var calendar_cell = yud.getElementsByClassName(day_class, 'td')

							for(k=0;k<calendar_cell.length;k++){																								
								if(yud.hasClass(calendar_cell[k],'selectable')){												
									// add the highlight class to this cell
									yud.addClass(calendar_cell[k], highlight);
								}			
							}
						}

						start_date = new Date(start_date.getTime() + 86400000);
					}
				}
			};

			// define a failure object if the callback object response is failure
			var responseFailure = function(o){												

			};

			// define a callback object to handle server response from the asyncRequest call
			var callback = { 
				success:responseSuccess, 
				failure:responseFailure, 
				argument:[] 
			};

			// remove annoying today formatting
			var calendar_cell = yud.getElementsByClassName('today', 'td')
			yud.removeClass(calendar_cell, 'today');
			
			var post_parms = "property=" + displayed_property + "&year=" + displayed_year + "&month=" + displayed_month;

			// use Connection Manager to get image data from database
			//alert ('calling');
			YAHOO.page.user_calendar.transaction = YAHOO.util.Connect.asyncRequest('POST', "get_events.php", callback, post_parms);

		},


		display_prices: function(){
			var pagedate = YAHOO.page.user_calendar.cal1.cfg.getProperty("pagedate");
			var displayed_year = pagedate.getFullYear();
			var displayed_month = pagedate.getMonth()+1;
												
			// define a success object
			var responseSuccess = function(o){

				// assign the parsed response text to a var
				var pricesData = o.responseText.parseJSON();

				// loop through returned data and create an image object on each page					
				for(i=0;i<pricesData.ResultSet.totalResultsReturned;i++){
					var week = pricesData.ResultSet.Result[i].week;
					var price = pricesData.ResultSet.Result[i].price;
					
					var price_id = "price_" + week;
					var calendar_cell = document.getElementById(price_id);
					calendar_cell.innerHTML = price;
				}					
			};

			// define a failure object if the callback object response is failure
			var responseFailure = function(o){												

			};

			// define a callback object to handle server response from the asyncRequest call
			var callback = { 
				success:responseSuccess, 
				failure:responseFailure, 
				argument:[] 
			};
			
			var post_parms = "property=" + displayed_property + "&year=" + displayed_year + "&month=" + displayed_month;

			//alert ('calling');
			YAHOO.page.user_calendar.transaction = YAHOO.util.Connect.asyncRequest('POST', "get_prices.php", callback, post_parms);
		},

		submit_form: function(){
			var valid = YAHOO.page.user_calendar.validate_form();
			if(valid) {
				var post_parms = "start_date=" + YAHOO.page.user_calendar.date_unformat(document.booking.start_date.value);
				post_parms = post_parms + "&property=" + displayed_property;
				post_parms = post_parms + "&nights=" + document.booking.nights.value;
				post_parms = post_parms + "&name=" + document.booking.name.value;
				post_parms = post_parms + "&tel=" + document.booking.tel.value;
				post_parms = post_parms + "&email=" + document.booking.email.value;
				post_parms = post_parms + "&address1=" + document.booking.address1.value;
				post_parms = post_parms + "&address2=" + document.booking.address2.value;
				post_parms = post_parms + "&city=" + document.booking.city.value;
				post_parms = post_parms + "&postcode=" + document.booking.postcode.value;
				post_parms = post_parms + "&country=" + document.booking.country.value;
				post_parms = post_parms + "&gst2=" + document.booking.gst2.value;
				post_parms = post_parms + "&gst2age=" + document.booking.gst2age.value;
				post_parms = post_parms + "&gst3=" + document.booking.gst3.value;
				post_parms = post_parms + "&gst3age=" + document.booking.gst3age.value;
				post_parms = post_parms + "&gst4=" + document.booking.gst4.value;
				post_parms = post_parms + "&gst4age=" + document.booking.gst4age.value;
				if (document.booking.booking_id.value !== '') {
					post_parms = post_parms + "&booking_id=" + document.booking.booking_id.value;
				}
			}
												
			// define a success object
			var responseSuccess = function(o){
				// if there's no mention of a duplicate, go ahead, otherwise alert user
				var response = o.responseText.parseJSON();
				if (response.ResultSet.Result[0].success==0) {
					alert ('This booking overlaps with another booking. Please check and submit again.');
				} else {
					alert ('We have received your booking request and will be in touch shortly.');
					alert ('Be aware your booking will not appear on the calendar until we have received your deposit. Please do not re-submit your booking.');
					YAHOO.page.user_calendar.render_calendar();
					YAHOO.page.user_calendar.clear_form();
				}
			};
			// define a failure object if the callback object response is failure
			var responseFailure = function(o){												
			};

			// define a callback object to handle server response from the asyncRequest call
			var callback = { 
				success:responseSuccess, 
				failure:responseFailure, 
				argument:[] 
			};

			// use Connection Manager to submit form data to database
			if(valid) {
				YAHOO.page.user_calendar.transaction = YAHOO.util.Connect.asyncRequest('POST', "db_update.php", callback, post_parms);
			}

		},


		calendar_date_selected: function(type,args,obj){

			var arrDates = YAHOO.page.user_calendar.cal1.getSelectedDates();
			var selected_date = arrDates[0];
			var start_date = selected_date.getDate() + "/" + (selected_date.getMonth()+1) + "/" + selected_date.getFullYear();
			document.booking.start_date.value = start_date;
		},


		clear_form: function(){
			document.booking.booking_id.value = '';
			document.booking.start_date.value = '';
			document.booking.nights.value = '';
			document.booking.name.value = '';
			document.booking.tel.value = '';
			document.booking.email.value = '';
			document.booking.address1.value = '';
			document.booking.address2.value = '';
			document.booking.city.value = '';
			document.booking.postcode.value = '';
			document.booking.country.value = '';
			document.booking.gst2.value = '';
			document.booking.gst2age.value = '';
			document.booking.gst3.value = '';
			document.booking.gst3age.value = '';
			document.booking.gst4.value = '';
			document.booking.gst4age.value = '';
			document.booking.terms.checked = false;
			document.booking.submit.value = 'Add Booking';
		},

		date_format: function(date_in){
			var yyyy = date_in.substr(0,4);
			var mm = date_in.substr(5,2);
			var dd = date_in.substr(8,2);
			var date_out = dd + '/' + mm + '/' + yyyy;
			return date_out;
		},
		
		date_unformat: function(date_in){
			var p1 = date_in.indexOf('/');
			var dd = date_in.substr(0,p1);
			var p2 = date_in.indexOf('/',p1+1);
			var mm = date_in.substr(p1+1,(p2-p1)-1);
			var yyyy = date_in.substr(p2+1);
			var date_out = yyyy + '-' + mm + '-' + dd;
			return date_out;
		},

		str_to_mdy: function(date_in){
			var dd = date_in.substr(0,2);
			var mm = date_in.substr(3,2);
			var yyyy = date_in.substr(6,4);
			var date_out = mm + '/' + dd + '/' + yyyy;
			return date_out;
		},

		date_to_mdy: function(date_in){
			var dd = date_in.getDate();
			var mm = date_in.getMonth()+1;
			var yyyy = date_in.getFullYear();
			var date_out = mm + '/' + dd + '/' + yyyy;
			return date_out;
		},
		
		dmy_to_date: function(date_in){
			
		},


		render_calendar: function(){
			YAHOO.page.user_calendar.cal1 = new YAHOO.widget.Calendar("cal1","calendar_container");
			this.cfg_calendar();

			YAHOO.page.user_calendar.cal1.selectEvent.subscribe(this.calendar_date_selected, YAHOO.page.user_calendar.cal1, true);
			YAHOO.page.user_calendar.cal1.changePageEvent.subscribe(this.highlight_bookings, YAHOO.page.user_calendar.cal1, true);
			YAHOO.page.user_calendar.cal1.changePageEvent.subscribe(this.display_prices, YAHOO.page.user_calendar.cal1, true);

			YAHOO.page.user_calendar.cal1.render();
			this.highlight_bookings();
			this.display_prices();
		}
	};
	
}();

// intialise page object once the page has loaded
YAHOO.util.Event.on(window, 'load', YAHOO.page.user_calendar.init, YAHOO.page.user_calendar, true );

 

