
$(function() {

    if (typeof window.VH == "undefined" || !window.VH) {
        window.VH = {};
    }

    VH.TOOLS = function() {


        /* Page Elements */
        var el = {

            /* general */
            "toolsOverlay": $("#vht-ToolsOverlay"),
            "savedSearchesBtn": $("#vht-Tools .vht-recent-searches a"),
            "savedHotelsBtn": $("#vht-Tools .vht-saved-hotels a"),
            "signOutBtn": $("#vht-signOut"),
            "closeBtn": $("#vht-closeTools"),
            "allScreens": $("#vht-ToolsOverlay .screen"),
            "backToSignInBtn": $(".vht-backToSignIn"), // 2 of these
            "addToSavedHotelsBtn": $(".vrt-addToSavedHotels"),

            /* sign in screen */
            "savedHotelsIntro": $("#vht-savedHotelsIntro"),
            "savedSearchesIntro": $("#vht-savedSearchesIntro"),
            "signInBtn": $("#vht-signIn"),
            "signingIn": $("#vht-signingIn"),
            "signingInErrors": $("#vht-signInErrors"),
            "forgotPasswordBtn": $("#vht-forgotPassword"),
            "registerNowBtn": $("#vht-registerNow"),
            "noThanksBtn": $("#vht-noThanks"),

            /* register screen */
            "registerLoading": $("#vht-doRegister .vrt-loading"),
            "registerError": $("#vht-RegisterScreen .vht-error"),
            "registerBtn": $("#vht-doRegister"),
            "showTermsBtn": $("#vht-showTerms"),

            /* forgot screen */
            "genPasswordBtn": $("#vht-genPassword"),

            /* terms screen */
            "backToRegisterBtn": $(".vht-backToRegister"),

            /* saved hotels */
            "savedHotelsScreen": $("#vht-SavedHotelsScreen"),
            "savedHotelsContent": $("#vht-SavedHotelsContent"),
            "savedHotelsLoading": $("#vht-SavedHotelsScreen .vht-loading"),

            /* saved searches */
            "savedSearchesScreen": $("#vht-SavedSearchesScreen"),
            "savedSearchesContent": $("#vht-SavedSearchContent"),
            "savedSearchesLoading": $("#vht-SavedSearchesScreen .vht-loading")

        };

        /* Services */
        var ProfileManager = "/_assets/dynamic/Modules/ProfileTools/WS/ProfileManager.asmx";
        var MyItineraryManager = "/_assets/dynamic/Modules/ProfileTools/WS/MyItineraryManager.asmx";

        var Init = function() {

            var self = this;

            /* ----------- HEADER -------------- */

            // user clicked 'saved searches' in top nav
            el.savedSearchesBtn.click(function(e) {
                e.preventDefault();
                cmCreatePageviewTag("Recent Searches", "Research tools", null);
                if (!self.IsLoggedIn()) {
                    self.GetEl().savedSearchesIntro.show();
                    self.GetEl().savedHotelsIntro.hide();
                } else {
                    self.GetEl().allScreens.hide();
                    self.GetEl().savedSearchesScreen.show();
                    self.GetEl().savedSearchesLoading.show();
                    self.GetEl().savedSearchesContent.hide();
                    $.getJSON(
			            $.CreateDotNetRemoteMethodCall(
			                MyItineraryManager,
			                "GetSavedSearches"
			            ),
			            null,
			            GetSavedSearches
			        );
                }
                self.OpenOverlay("savedSearches");
            });

            // user clicked 'saved hotels' in top nav
            el.savedHotelsBtn.click(function(e) {
                e.preventDefault();
                cmCreatePageviewTag("Saved Hotels", "Research tools", null);
                if (!self.IsLoggedIn()) {
                    self.GetEl().savedHotelsIntro.show();
                    self.GetEl().savedSearchesIntro.hide();
                } else {
                    self.GetEl().allScreens.hide();
                    self.GetEl().savedHotelsScreen.show();
                    $.getJSON(
			            $.CreateDotNetRemoteMethodCall(
			                MyItineraryManager,
			                "GetSavedHotels"
			            ),
			            null,
			            GetSavedHotels
			        );
                }
                self.OpenOverlay("savedHotels");
            });

            // user clicked on 'sign out' button 
            el.signOutBtn.click(function(e) {

                e.preventDefault();
                cmCreatePageviewTag("Sign Out", "Research tools", null)
                $.getJSON(
			    $.CreateDotNetRemoteMethodCall(
			            ProfileManager,
			            "DoSignOut"
			        ),
			        null,
			        DoSignOut
			    );
            });

            // user clicked on 'close' button 
            el.closeBtn.click(function(e) {
                e.preventDefault();
                self.GetEl().toolsOverlay.hide();
            });

            // user clicked a 'go back to sign in' button
            el.backToSignInBtn.click(function(e) {
                e.preventDefault();
                self.ShowScreen("SignIn");
            });

            // user clicked a 'add to saved hotels' button
            el.addToSavedHotelsBtn.each(function(i) {
                $(this).click(function(e) {
                    e.preventDefault();
                    var id = $(this).parent().attr("id");
                    $(this).html('Please wait... <img style="display:inline; vertical-align:middle;" src="/_assets/images/icons/ajax_loader.gif" />');
                    $.getJSON(
                        $.CreateDotNetRemoteMethodCall(
                            MyItineraryManager,
                            "SavedHotelProcessor",
                            "A" + id
                         ),
                         null,
                         DoSavedHotelsAction
                    );
                })
            });

            InitSignInScreen();
            InitRegisterScreen();
            InitForgotPasswordScreen();
            InitTermsScreen();

        };


        /* ----------- SIGN IN SCREEN -------------- */

        // init
        var InitSignInScreen = function() {

            var self = VH.TOOLS;

            // 6/12/11 - Aidan Hutchinson
            // this fix overrides the main holiday search submit button, allowing sign in button to take presidence
            $('#aspnetForm').keypress(function(event) {
                if (event.which == 13) {
                    event.preventDefault();
                    $('#vht-signIn').click();
                }
            });

            // user clicked on 'sign in' button 
            el.signInBtn.click(function(e) {
                e.preventDefault();
                cmCreatePageviewTag("Sign In", "Research tools", null);
                self.GetEl().signingInErrors.hide();
                self.GetEl().signInBtn.hide();
                self.GetEl().signingIn.show();
                $.getJSON(
		            $.CreateDotNetRemoteMethodCall(
		                ProfileManager,
		                "DoSignIn",
		                $("#signin_emailaddress").val(),
		                $("#signin_password").val()
		            ),
		            null,
		            DoSignIn
		        );
            });

            // user clicked 'forgot password' button
            el.forgotPasswordBtn.click(function(e) {
                e.preventDefault();
                self.ShowScreen("ForgotPassword");
            });

            // user clicked 'register now' button
            el.registerNowBtn.click(function(e) {
                e.preventDefault();
                // self.ShowScreen("Register");
                ShowScreen("Register");
            });

            // user clicked 'not right now' button
            el.noThanksBtn.click(function(e) {
                e.preventDefault();
                self.GetEl().toolsOverlay.hide();
            });

        }

        // sign in callback
        var DoSignIn = function(response) {

            var self = VH.TOOLS;

            // fail
            if (!response.Success) {
                self.GetEl().signingInErrors.show();
                self.GetEl().signInBtn.show();
                self.GetEl().signingIn.hide();
                return;
            }

            // drop cookie
            if ($("#signin_remember")[0].checked) {
                $.cookie('credentials', response.Properties.Credentials, { expires: 90, path: "/" });
            }

            // Refresh the page
            cmCreateRegistrationTag($("#signin_emailaddress").val(), $("#signin_emailaddress").val())
            var location = document.location.href.replace(/#.*/, "");
            document.location.href = location;

        };

        // sign out callback
        var DoSignOut = function() {

            var location = document.location.href.replace(/#.*/, "");
            document.location.href = location;

        }

        /* ----------- REGISTER SCREEN -------------- */

        var InitRegisterScreen = function() {

            var self = VH.TOOLS;

            el.registerBtn.click(function(e) {
                e.preventDefault();
                self.Validate();
            });

            // user clicked 'read the terms and conditions' button
            el.showTermsBtn.click(function(e) {
                e.preventDefault();
                self.ShowScreen("Terms");
            });

            // user clicked 'go back to sign in' button
            el.backToSignInBtn.click(function(e) {
                e.preventDefault();
                self.ShowScreen("SignIn");
            });

        }

        var Validate = function() {

            el.registerLoading.show();
            el.registerBtn.hide();

            if ($.trim($("#register_displayname").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter a display name or we won't know what to call you." });
            }
            else if ($.trim($("#register_emailaddress").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter an email address to register with Virgin Holidays" });
            }
            else if ($.trim($("#register_password1").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter a password so that you can log in again." });
            }
            else if ($("#register_password1").val() != $("#register_password2").val()) {
                DoRegister({ Success: false, Response: "Your passwords don't match. Please enter them again." });
            }
            else if ($.trim($("#register_title").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter your title." });
            }
            if ($.trim($("#register_firstname").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter your firstname." });
            }
            else if ($.trim($("#register_surname").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter your surname." });
            }
            else if ($.trim($("#register_addressline1").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter the first line of your address." });
            }
            else if ($.trim($("#register_postcode").val()) == "") {
                DoRegister({ Success: false, Response: "You must enter your postcode." });
            } else if (!$("#userAgreement").attr("checked")) {
                DoRegister({ Success: false, Response: "You must agree to our terms and conditions to register." });
            } else {

                var register = !VH.TOOLS.IsLoggedIn();

                $.getJSON(
                    $.CreateDotNetRemoteMethodCall(
                        ProfileManager,
                        "DoUpdateOrRegister",
                        register,
                        $("#register_displayname").val(),
                        $("#register_emailaddress").val(),
                        $("#register_password1").val(),
                        $("#register_title").val(),
                        $("#register_firstname").val(),
                        $("#register_surname").val(),
                        $("#register_addressline1").val(),
                        $("#register_postcode").val(),
                        $("#emailOptIn").is(':checked'),
                        $("#postOptIn").is(':checked')
                    ),
                    null,
                    DoRegister
                );
            }


        }

        var DoRegister = function(response) {

            if (!response.Success) {

                el.registerLoading.hide();
                el.registerBtn.show();
                el.registerError.empty().text(response.Response).show();

            } else {

                // Refresh the page ... logged in
                cmCreateRegistrationTag($("#register_emailaddress").val(), $("#register_emailaddress").val());
                var location = document.location.href.replace(/#.*/, "");
                document.location.href = location;

            }

        }

        /* ----------- FORGOT SCREEN -------------- */

        var InitForgotPasswordScreen = function() {

            // user clicked 'generate new password' button
            el.genPasswordBtn.click(function(e) {
                e.preventDefault();
                $.getJSON(
			        $.CreateDotNetRemoteMethodCall(
			            ProfileManager,
			            "DoGenerateNewPassword",
		                $("#generatenewpassword_emailaddress").val()
			        ),
			        null,
			        DoGenPassword
			    );
            });

        }

        var DoGenPassword = function(response) {

            if (response.Success) {
                $.cookie('credentials', null, { expires: -1 });
            }

            $("#vht-ForgotPasswordScreen .msg").show();
            $("#vht-ForgotPasswordScreen .msg p").text(response.Response);

        }


        /* ----------- TERMS SCREEN -------------- */

        var InitTermsScreen = function() {

            // user clicked 'go back to sign in' button
            el.backToRegisterBtn.click(function(e) {
                e.preventDefault();
                //self.ShowScreen("Register");
                ShowScreen("Register");
            });

        }

        /* ----------- SAVED SEARCHES -------------- */

        var GetSavedSearches = function(response) {

            var html = "<p>Sorry, we can't show you your saved searches right now. Please try again later.</p>";

            if (response.Success) {
                html = response.Html;
            }

            // -- fade out loading
            el.savedSearchesLoading.fadeOut("fast", function() {

                // -- fade in content
                el.savedSearchesContent.empty().html(html).fadeIn("fast", function() {

                    // -- set up actions
                    var actions = $(this).find(".vrt-doSearch,.vrt-delSearch");
                    actions.each(function() {
                        var id = $(this).attr("id");

                        // -- actions click
                        $(this).click(function() {

                            // fade out content 
                            el.savedSearchesContent.fadeOut("fast", function() {

                                // fade in loading
                                el.savedSearchesLoading.fadeIn("fast", function() {

                                    // fetch json
                                    $.getJSON(
	                                $.CreateDotNetRemoteMethodCall(
                                        MyItineraryManager,
                                        "SavedSearchProcessor",
                                        id
                                        ),
                                        null,
                                        DoSavedSearchesAction
                                  );
                                });
                            });
                        });
                    });
                });
            });

        };

        var DoSavedSearchesAction = function(response) {
            if (response.Success) {
                if (response.Response == "Delete") {
                    el.savedSearchesBtn.find(".no").html("(" + response.Properties.Count + ")")
                    el.savedSearchesBtn.trigger("click");
                }
                if (response.Response == "Search") {
                    document.location.href = response.Properties.URL;
                }
            }
        }

        /* ----------- SAVED HOTELS -------------- */

        var GetSavedHotels = function(response) {

            //console.log ("GetSavedHotels...")

            var html = "<p>Sorry, we can't show you your saved hotels right now. Please try again later.</p>";

            if (response.Success) {
                html = response.Html;
                el.addToSavedHotelsBtn.parent().html("In your saved hotels");
            }

            // -- fade out loading
            el.savedHotelsLoading.fadeOut("fast", function() {
                // -- fade in content
                el.savedHotelsContent.empty().html(html).fadeIn("fast", function() {
                    var actions = $(this).find(".vrt-delHotel");
                    actions.each(function() {
                        var id = $(this).attr("id");
                        // -- actions click
                        $(this).click(function(e) {
                            e.preventDefault();
                            // fade out content 
                            el.savedHotelsContent.fadeOut("fast", function() {
                                // fade in loading
                                el.savedHotelsLoading.fadeIn("fast", function() {
                                    // fetch json
                                    $.getJSON(
	                                $.CreateDotNetRemoteMethodCall(
                                        MyItineraryManager,
                                        "SavedHotelProcessor",
                                        id
                                        ),
                                        null,
                                        DoSavedHotelsAction
                                  );
                                });
                            });
                        });
                    });
                });
            });

        };

        var DoSavedHotelsAction = function(response) {

            //console.log ( response );

            if (response.Success) {
                el.savedHotelsBtn.find(".no").html("(" + response.Properties.Count + ")")

                if (response.Response == "Added") {
                    el.addToSavedHotelsBtn.each(function(i) {
                        $(this).parent().html('In your Saved Hotels');
                    });
                    el.savedHotelsBtn.trigger("click");
                }

                if (response.Response == "Delete") {
                    el.savedHotelsBtn.trigger("click");
                }

                if (response.Response == "Search") {
                    document.location.href = response.Properties.URL;
                }


            }

        };

        /* ----------- UTILS -------------- */

        var GetEl = function() {
            return el;
        };

        var IsLoggedIn = function() {
            return ($("#IsLoggedIn").val() === "True");
        }

        var OpenOverlay = function(whichBtn) {

            var right = 0;
            switch (whichBtn) {
                case "savedHotels":
                    right = 10
                    break;
                case "savedSearches":
                    right = el.savedHotelsBtn.width() + 60  //  60 = padding / offsets / positions
                    break;
            }
            el.toolsOverlay.css({ "right": right + "px" }).show();

        };


        /*
        * show individual screens
        */
        var ShowScreen = function(whichScreen) {

            // hide all
            el.allScreens.hide();
            switch (whichScreen) {
                case "Register":
                    $("#vht-RegisterScreen").show();
                    break;
                case "SignIn":
                    $("#vht-SignInScreen").show();
                    break;
                case "LoggingIn":
                    $("#vht-LoggingInScreen").show();
                    break;
                case "ForgotPassword":
                    $("#vht-ForgotPasswordScreen").show();
                    break;
                case "Terms":
                    $("#vht-TermsScreen").show();
                    break;
            }

        };

        return {
            Init: Init,
            GetEl: GetEl,
            ShowScreen: ShowScreen,
            DoSignIn: DoSignIn,
            DoSignOut: DoSignOut,
            OpenOverlay: OpenOverlay,
            DoGenPassword: DoGenPassword,
            Validate: Validate,
            DoRegister: DoRegister,
            IsLoggedIn: IsLoggedIn,
            GetSavedSearches: GetSavedSearches,
            GetSavedHotels: GetSavedHotels,
            DoSavedSearchesAction: DoSavedSearchesAction,
            DoSavedHotelsAction: DoSavedHotelsAction
        };

    } ();

});
	
