﻿Agility.RegisterNamespace("Cineplex.FacebookEvent");

(function(FacebookEvent) {


    var _currentFacebookUserID;
    var _currentFacebookUserEmail;
    var _currentFacebookUserName;
    var _currentAccessToken;
    var selectedUsers = [];
    var event_id = '0';
    var _eventName = '';
    var _selectGuestsDialog;
    var _loginDialog;
    var emailString;
    var personalMessageString;

    $("#FacebookCreateEvent").show();

    FacebookEvent.CreateEventInit = function() {

        InitDateInputs();

        InitDialogBoxes();

        InitClickHandlers();

        FacebookEvent.CheckLogin();

    }

    FacebookEvent.CloseDialog = function() {

        if (_selectGuestsDialog != null) {
            _selectGuestsDialog.dialog("close");
        }
        if (_loginDialog != null) {
            _loginDialog.dialog("close");
        }
    }

    FacebookEvent.CheckLogin = function() {

        $("#SelectGuests .FacebookLogin").hide();
        $("#GuestSelector").hide();
        $("#SelectGuests .FacebookError").show();

        FB.getLoginStatus(function(response) {

            if ((response.authResponse != null) && (response.authResponse.userID != null)) {


                _currentFacebookUserID = response.authResponse.userID;
                _currentAccessToken = response.authResponse.accessToken;


                FB.api('/me', function(response2) {
                    //_currentFacebookUserEmail = response2.email;
                    _currentFacebookUserName = response2.name

                });

                $(this).loadFriends();
            }

            //will override error display
            ShowHideLogin();
        });
    }


    FacebookEvent.SaveList = function() {

        selectedUsers = [];

        $(".liFriendSelected").each(function() {

            selectedUsers.push($(this).attr("userid"));
        });

        emailString = $("#EmailAddresses textarea").val();
        personalMessageString = $("#PersonalMessage textarea").val();

        $("#SelectGuests").dialog("close");
    }

    //Initital Setup Helper functions

    InitDateInputs = function() {

        $.each(GetTimeArray(), function(key, value) {
            $('#EventTime , #EventTime2').append("<li><a href=''>" + value["key"] + "</a></li>");
        });

        $('#EventTime').CineplexCombo({
            onchange: function(selected) {
                $('#txtEventTime').val($("#dateSelector .ddTitle a").html());
                return false;
            }
        });

        $('#EventTime2').CineplexCombo({
            onchange: function(selected) {
                $('#txtEventTime2').val($("#dateSelector2 .ddTitle a").html());
                return false;
            }
        });

        $('#txtEventTime').val($("#dateSelector .ddTitle a").html());
        $('#txtEventTime2').val($("#dateSelector2 .ddTitle a").html());

        $('#EventDate').datepicker({
            duration: "",
            buttonImage: Agility.ResolveUrl('~/Images/Buttons/btnCalendar.png'),
            buttonText: 'mm/dd/yy',
            buttonImageOnly: true,
            showOn: 'both',
            altFormat: 'mm/dd/yy',
            onSelect: function(dateText, input) {

            }
        });

        $('#EventDate').labelOver('over-apply');
        $('#EventDate2').labelOver('over-apply');


    }

    InitDialogBoxes = function() {

        _selectGuestsDialog = $("#SelectGuests");
        _loginDialog = $("#Login");
        _fbErrorDialog = $("#FBError");

        _selectGuestsDialog.dialog({
            autoOpen: false,
            modal: true,
            dialogClass: 'SelectGuests',
            resizable: false
        });

        _loginDialog.dialog({
            autoOpen: false,
            modal: true,
            dialogClass: 'LoginDialog',
            resizable: false
        });
    }

    InitClickHandlers = function() {

        $("#SelectGuestsButton img").click(function() {

            showSelectGuestsDialog();

        });

        $("#CreateEvent img").click(function() {
            if (_currentFacebookUserID == null) {
                $("#Login").dialog("open");
            }
            else {
                CreateEvent("InviteGuests");
            }
        });
    }

    showSelectGuestsDialog = function() {

        $("#EmailAddresses textarea").val(" ");
        $("#PersonalMessage textarea").val(" ");
        if (_selectGuestsDialog == null) {

            _selectGuestsDialog = $("#SelectGuests");

            _selectGuestsDialog.dialog({
                autoOpen: true,
                modal: true,
                dialogClass: 'SelectGuests',
                resizable: false
            });

        } else {

            $(".liFriendSelected").removeClass("liFriendSelected");
            $.each(selectedUsers, function() {

                $liID = $("#friends ul li[userid = " + this + "]");
                $liID.addClass("liFriendSelected");
            });
            $("#EmailAddresses textarea").val(emailString);
            $("#PersonalMessage textarea").val(personalMessageString);


            _selectGuestsDialog.dialog("open");

        }
    }


    ShowHideLogin = function() {

        if (_currentFacebookUserID == null) {

            $("#SelectGuests .FacebookLogin").show();
            $("#GuestSelector").hide();
            $("#SelectGuests .FacebookError").hide();
        }
        else {

            $("#SelectGuests .FacebookLogin").hide();
            $("#GuestSelector").show();
            $("#Login").dialog("close");
            $("#SelectGuests .FacebookError").hide();
        }
    }

    ReadShowTimeField = function() {

        return "Showtime: " + $("#txtEventTime2").val();
    }

    ReadDateTimeFields = function(callback) {

        var date = new Date($("#EventDate").val().replace(/-/g, "/") + " " + $("#txtEventTime").val());

        if (isNaN(date.getMonth())) {
            $("#InvalidDate").show();
            return "";
        }

        $("#InvalidDate").hide();

        var args = { "date": date }
        var url = Agility.ResolveUrl("~/Services/AjaxServices.asmx/GetFbTimeOffSet");

        $.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: url,
            data: JSON.encode(args),
            dataType: "json",
            error: function(result) {
                CreateEventCall(date.toString("MMM d, yyyy HH:mm"), callback);
            },
            success: function(result) {
                /*    date.setHours(date.getHours() + result.d);*/
                CreateEventCall(date.toString("MMM d, yyyy HH:mm"), callback);
            }
        });

    }

    parseXML = function(xml) {
        if (window.ActiveXObject && window.GetObject) {
            var dom = new ActiveXObject('Microsoft.XMLDOM');
            dom.loadXML(xml);
            return dom;
        }
        if (window.DOMParser)
            return new DOMParser().parseFromString(xml, 'text/xml');
        throw new Error('No XML parser available');
    }

    CreateEvent = function(callback) {
        if ($("#EventMovieName").val().replace(/ /g, '') == "") {

            $("#InvalidTitle").show();
        }
        else $("#InvalidTitle").hide();

        ReadDateTimeFields(callback);

    }

    CreateEventCall = function(datestring, callback) {

        var url = "https://api.facebook.com/method/events.create";

        if (datestring != "" && $("#EventMovieName").val().replace(/ /g, '') != "") {

            var privacy_type = "OPEN";
            if ($("#EventPrivacy:checked").length == 0) privacy_type = "SECRET";

            var city = $("#EventCity").val();
            if (city.indexOf(', Canada') < 0) {
                city += ', Canada';
            }

            var event_info =
            {
                "start_time": datestring,
                "name": $("#EventTheatre").val() + ' is showing: ' + $("#EventMovieName").val(),
                "location": $("#EventTheatre").val(),
                "street": $("#EventAddress").val(),
                "city": city,
                "description": ReadShowTimeField() + '\n' + $(".EventDescription").val(), //use class since this is server control
                "privacy_type": privacy_type
            }

            //encode parameters
            var args = { "accessToken": _currentAccessToken, "event_info": JSON.encode(event_info), "callback": callback }

            FB.api('/me/events', 'post', event_info, function(resp) {
                if (!resp.id) {
                    $('#ErrorEvent').show();
                } else {
                    window[callback](resp);
                }
            });

            SetupEmailData(event_info);
        }

    }

    SendEmail = function(response) {

        var emailArrayString = $.trim($("#EmailAddresses textarea").val());

        if (emailArrayString.length > 0) {
            SendEmails(emailArrayString, "DisplayCongrats");
        }
        else {

        }
        DisplayCongrats();
    }

    InviteGuests = function(response) {
        //get event id from response
        event_id = response.id;

        //error
        if (!event_id) {
            $("#ErrorEvent").show();
            //add code to log response
        }
        
        //make call
        if (event_id && selectedUsers.length > 0) {
            FB.api({
                method: 'events.invite',
                eid: event_id,
                uids: selectedUsers.join(',')
            },
            function(resp) {
                //
            });
        }
        if (event_id) {
            DisplayCongrats();
        }
    }

    SetupEmailData = function(event_info) {
        _eventName = event_info["name"];
    }

    SendEmails = function(emailAddressString, callback) {


        var eventName = _eventName;
        var emailSubject = "You are invited to " + $("#EventMovieName").val();
        var dateString = ReadDateTimeFields(callback);


        jQuery.ajax({
            url: Agility.ResolveUrl("~/Services/SendEmail.ashx"),
            cache: false,
            data: {
                "eventName": $("#EventMovieName").val(),
                "subject": emailSubject,
                "eventTime": $("#EventDate").val() + " " + $("#txtEventTime").val(),
                "eventTheatre": $("#EventTheatre").val(),
                "eventAddress": $("#EventAddress").val(),
                "eventCity": $("#EventCity").val(),
                "personalMessage": $("#PersonalMessage textarea").val(),
                "emailAddressString": emailAddressString,
                "fromName": _currentFacebookUserName,
                "fromEmail": _currentFacebookUserEmail,
                "moreInfo": ReadShowTimeField() + '\n' + $(".EventDescription").val()

            },
            dataType: "text",
            success: function(status) {
                callback()
            },
            error: function() {
                $("#ErrorEmail").show();
            }
        });

    }

    DisplayCongrats = function() {

        var eventURL = "http://www.facebook.com/event.php?eid=" + event_id;
        $("#URL").html(eventURL);
        $("#URL").attr("href", eventURL);

        $("#FacebookCreateEventCongrats").show();
        $("#FacebookCreateEvent").hide();
    }

    GetTimeArray = function() {

        var timeArray = [];
        var currentDate = new Date();
        var minutesToRound = currentDate.getMinutes();
        var x = minutesToRound / 30;
        var addHour = 0;
        var minutes = 0;

        if (x >= 1.5) {
            addHour = 1;
            minutes = 0;
        }
        else if (x >= 0.5) {
            minutes = 30;
        }

        var loopDate = new Date(currentDate);
        loopDate.setHours(currentDate.getHours() + addHour);

        loopDate.setMinutes(minutes);
        loopDate.setSeconds(0);
        loopDate.getMilliseconds(0);

        //looping 23 hours, every 30 mins
        for (i = 0; i < 48; i++) {

            var ampm = "AM";
            if (loopDate.getHours() >= 12) ampm = "PM";

            var key1 = loopDate.toString("h:mm") + " " + ampm;

            var value1 = loopDate.toString("HH:mm");
            var pushDate =
            {
                key: key1, value: value1
            }

            timeArray.push(pushDate);
            loopDate.setMinutes(loopDate.getMinutes() + 30);

        }
        return timeArray;
    }

    GetTimeArrayAll = function() {

        var timeArray = [];
        var currentDate = new Date();

        var minutes = 0;

        var loopDate = new Date(currentDate);
        loopDate.setHours(0);

        loopDate.setMinutes(minutes);



        while (loopDate.getDate() < currentDate.getDate() + 1) {

            var ampm = "AM";
            if (loopDate.getHours() >= 12) ampm = "PM";

            var key1 = loopDate.toString("h:mm") + " " + ampm;

            var value1 = loopDate.toString("HH:mm");
            var pushDate =
            {
                key: key1, value: value1
            }

            timeArray.push(pushDate);
            loopDate.setMinutes(loopDate.getMinutes() + 30);

        }
        return timeArray;
    }




})(Cineplex.FacebookEvent);
