// 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
        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();
        }
			
    },
    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+= '&email='+ document.getElementById("email").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_address").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_address").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+= '&phone_number='+ document.getElementById("phone").value;
            args+= '&email='+ document.getElementById("email_address").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;
            }
        }
	for(var i=0; i<services.length; i++){
            if(services[i].selected)
                post_services.push(services[i].id);
        }
        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
};
