// JavaScript Document
/*
 * AjaxObject is a hypothetical object that encapsulates the transaction
 *     request and callback logic.
 *
 * handleSuccess( ) provides success case logic
 * handleFailure( ) provides failure case logic
 * processResult( ) displays the results of the response from both the
 * success and failure handlers
 * call( ) calling this member starts the transaction request.
 */

var AjaxObject = {

        //Flags to trap multiple clicks on register and submit buttons
        //  Flags are set true in login() and signUp(), unset in processLogin()
        //  and processBooking as processSignup doesn't have a failure condition
        //Traps multiple clicks on "Submit Request" button
        login_in_progress : false,
        //Traps multiple clicks on "Register" button
        signup_in_progress : false,

        
	handleSuccess:function(o){
		switch (action){
			case "login":
				this.processLogin(o);
				break;
			case "sign_up":
				this.processSignup(o);
				break;
			case "services":
				this.processServices(o);
				break;
			case"calendar":
				this.processCalendar(o);
				break;
			case "time":
				this.processTimes(o);
				break;
			case "summary":
				this.processSumary(o);
				break;
			case "process_booking":
				this.processBooking(o);
				break;
			case "retrieve_password":
				this.processRetrievePassword(o);
				break;
			default:
				this.processLoadPage(o);
		}
		updateSummary();
			
	},

	handleFailure:function(o){
		// Failure handler
                AjaxObject.login_in_progress = false;
                AjaxObject.signup_in_progress = false;
		alert("failure");
	},
	
	processLoadPage:function(o) {
		if (o.responseText != "") {			
			eval(o.responseText);
			showServiceList();	
		}
	},
	processLogin:function(o){
		// This member is called by handleSuccess
		var trimed_responseText = o.responseText.replace(/^\s+|\s+$/g,"");
		// returns text only if login data confirmed
		if (trimed_responseText != '' && trimed_responseText.length > 0) {
			eval(trimed_responseText);
			user = new User;
			this.processOrder();			
		}
		else {
                    //Allow them to try again
                    AjaxObject.login_in_progress = false;
			alert("Please make sure the username and password entered are correct and try again.");
		}		
	},
	processSignup:function(o){
		// This member is called by handleSuccess
		//alert(o.responseText);
		var response_str = o.responseText;
		if (response_str.indexOf('function User()',0) == -1) {
			var result = confirm(o.responseText);
			
			if (result == true) {
				this.retrievePasswordFromCreation();
				login();
			}
		}
		else{
			//user = new User;
			eval(o.responseText);
			user = new User;
			this.processOrder();
		}
			//this.processOrder();
		//else {
		//	alert("Login Failed");
		//}
		
	},
	processServices:function(o) {
			//alert(o.responseText);
		if (o.responseText != "") {
			staff_members = new Array();
			eval(o.responseText);
			hide('service_list');
			showStaffList();
			step(2);
		}
		else{
			alert("There is not a staff member available that performs all of these services.  Please book them seperately.");
			return false;
		}
	},
	processCalendar:function(o) {
			if (o.responseText != "") {
				hide('staff_list');
				var response = o.responseText.split("^");
				duration = response[0];
				showCalendar(response[1]);
				step(3);
			}
	},
	processTimes:function(o) {
			if (o.responseText != "") {
				//hide('calendar');
			showTimes(o.responseText);
			}
	},
	processSummary:function(o) {
			if (o.responseText != "") {
			//alert(o.responseText);
			}
	},
	processBooking: function(o) {

		if (o.responseText.replace(/^\s+|\s+$/g,"") != "success") {
                    AjaxObject.login_in_progress = false;
                    AjaxObject.signup_in_progress = false;
			alert(o.responseText);
		}
		else bookingComplete(o.responseText);
	},
	processRetrievePassword: function(o) {
		// trim response because ajax adds whitespace in front of strings
		if (o.responseText.replace(/^\s+|\s+$/g,"") != "success") {
			alert("There was a problem retrieving your password.");
		}
		else{
			document.getElementById("retrieve_password").innerHTML="<p class=\"content_1\" style=\"padding-bottom:10px;width:260px;\">An email has been sent to "+document.getElementById("retrieve_email").value+" with your account information.</p>";	
		}
	},
	
	startRequest:function() {
	   YAHOO.util.Connect.asyncRequest('POST', 'booking.php', callback, args);
	},
	
	loadPage: function() {
		args= 'vid='+ document.getElementById("vid").value;
		this.startRequest();
	},
	
	login: function (){
            if(!AjaxObject.login_in_progress)
                {

                AjaxObject.login_in_progress = true;
		action="login";
		args='action=login';
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&user='+ document.getElementById("username").value;
		args+= '&pass='+ document.getElementById("password").value;
		this.startRequest();
                }

	},
	
	signUp: function() {		
		
		if (document.getElementById("name").value == "" || document.getElementById("surname").value == "" || document.getElementById("phone").value == "" || document.getElementById("email").value == "" || document.getElementById("password1").value == "" || document.getElementById("password2").value == ""  ) {
			alert("Please fill out required fields");
			return false;
		}
		else if(document.getElementById("password1").value != "" && document.getElementById("password1").value != document.getElementById("password2").value) {
			alert("Passwords do not match.");
			return false;
		}
		else if (!validateEmail(document.getElementById("email").value)){
			alert("Invalid email address.");
			return false;
		}		
		if(!AjaxObject.signup_in_progress)
                    {

                    AjaxObject.signup_in_progress = true;
		action="sign_up";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&surname='+ document.getElementById("surname").value;
		args+= '&name='+ document.getElementById("name").value;
		args+= '&address='+ document.getElementById("address").value;
		args+= '&city='+ document.getElementById("city").value;
		args+= '&province='+ document.getElementById("province").value;
		args+= '&postal_code='+ document.getElementById("postal_code").value;
		args+= '&country='+ document.getElementById("country").value;
		args+= '&phone='+ document.getElementById("phone").value;
		args+= '&mobile='+ document.getElementById("mobile").value;
		//args+= '&fax='+ document.getElementById("fax").value;
		args+= '&s_username='+ document.getElementById("email").value;
		args+= '&password1='+ document.getElementById("password1").value;
		args+= '&password2='+ document.getElementById("password1").value;
		this.startRequest();
                    }
	},
	
	processOrder: function() {
		for(var i=0; i<staff_members.length;i++){
			if (staff_members[i].selected == 1) {
				var staff = staff_members[i];
				break;
			}
		}
		var service = Array();
		for(var i=0; i<services.length;i++){
			if (services[i].selected == 1) {
				service.push(services[i].id);
				
			}
		}
		action='process_booking';
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&staff_id='+ staff.id;
		args+= '&selected_service='+service.join("-");
		args+= '&date='+selected_date;
		args+= '&time='+selected_time;
		args+= '&user_id='+user.id;
		args+= '&notes='+document.getElementById("appointment_notes").value;
		
		this.startRequest();
	},
	
	selectService: function() {
		var checked_services = document.getElementsByName('services');
		var post_services = Array();
		for (i=0; i<checked_services.length; i++){
				if(checked_services[i].checked){
					post_services.push(services[i].id);
					services[i].selected=1;
				}
				else
					services[i].selected=0;
		}
		if(post_services.length == 0){
			alert("Please select a service.");
			return;
		}
		//var service = services[index];
		//service.selected=1;
		action="services";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&service_ids='+ post_services.join("-");
		this.startRequest();	
	},
	
	selectStaff: function(index) {
		
		for(var i=0; i<staff_members.length; i++){
			staff_members[i].selected=0;		
		}
		var staff = staff_members[index];
		staff.selected=1;
		
		
		var post_services = Array();
		for(var i=0; i<services.length; i++){
			if(services[i].selected)
				post_services.push(services[i].id);
		}
		
		action="calendar";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&staff_id='+ staff.id;
		args+= '&service_ids='+ post_services.join("-");
		this.startRequest();	
	},
	
	changeMonth: function(date) {
		
		for(var i=0; i<staff_members.length;i++){
			if (staff_members[i].selected == 1) {
				var staff = staff_members[i];
				break;
			}
		}
		var post_services = Array();
		for(var i=0; i<services.length; i++){
			if(services[i].selected)
				post_services.push(services[i].id);
		}
		action="calendar";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&staff_id='+ staff.id;
		args+= '&service_ids='+ post_services.join("-");
		args+= '&date='+date;
		this.startRequest();
			
	},
	selectDate:function(date, parent) {
		
		var days = document.getElementsByTagName('div');
		for (var i=0; i<days.length;i++){
			if (days[i].className == "dayHover" && days[i] != parent){
				days[i].onmouseout = function(event){this.className="calCurMonth";};
				days[i].className="calCurMonth";
			}
		}
		parent.onmouseout = parent.onmouseover;
		var post_duration = 0;
		var post_services = Array();
		selected_date = date;	
		for(var i=0; i<staff_members.length;i++){
			if (staff_members[i].selected == 1) {
				var staff = staff_members[i];
				break;
			}
		}
		
		action="time";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;
		args+= '&staff_id='+ staff.id;
		args+= '&date='+date;
		args+= '&duration='+duration;
		args+= '&selected_services='+post_services.join("-");
		this.startRequest();
		
	},
	selectTime:function(time){
		selected_time = time;
		displayRegistration();
		
		show("login");
		step(4);
		updateSummary();
	},
	retrievePassword:function(){
		action="retrieve_password";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;		
		args+= '&email='+ document.getElementById("retrieve_email").value;
		this.startRequest();
	},
	retrievePasswordFromCreation:function(){
		action="retrieve_password";
		args='action='+action;
		args+= '&vid='+ document.getElementById("vid").value;		
		args+= '&email='+ document.getElementById("email").value;
		this.startRequest();
	}
};
/*
 * Define the callback object for success and failure
 * handlers as well as object scope.
 */
var callback =
{
	success:AjaxObject.handleSuccess,
	failure:AjaxObject.handleFailure,
	scope: AjaxObject
};