﻿
/*
* Copyright (C) 2009-2012 Solmead Productions
*
* == BEGIN LICENSE ==
*
* Licensed under the terms of any of the following licenses at your
* choice:
*
*  - GNU General Public License Version 2 or later (the "GPL")
*    http://www.gnu.org/licenses/gpl.html
*
*  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
*    http://www.gnu.org/licenses/lgpl.html
*
*  - Mozilla Public License Version 1.1 or later (the "MPL")
*    http://www.mozilla.org/MPL/MPL-1.1.html
*
* == END LICENSE ==
*/
System.SevenHills.LiveMessage = function (VideoDiv, CountDownDiv, CountDownClock, EndTime) {
    var StartTimeShift = 0;
    var Obj = {
        ISPlaying: false,
        CurrentVideoArea: 1,
        CurrentVideo: -1,
        CurrentPanel: -1,
        PrevVideoArea: 2,
        VideoTracker: null,
        CountDownClock: null,
        LastCheck: Date.parse("1/1/2001"),
        CurrentLive: null,
        OpenTime: Date.parse("1/1/2001"),
        StartTime: Date.parse("1/1/2001"),
        VideoEndTime: Date.parse("1/1/2001"),
        CloseTime: Date.parse("1/1/2001"),
        Div: null,
        ParentDiv: null,
        oFCKeditor: null,
        State: "Unknown",
        Init: function (VideoDiv, CountDownDiv, CountDownClock, EndTime) {
            Obj.ParentDiv = VideoDiv;
            Obj.Div = $(VideoDiv).find(".LiveVideoSpot");
            Obj.CountDownClock = CountDownClock;
            if (Obj.CountDownClock == null) {
                Obj.CountDownClock = new System.SevenHills.CountDownClock(CountDownDiv, "Live Message", EndTime);
            }
            Obj.VideoTracker = new System.SevenHills.VideoTracker(301);
            System.DebugWrite("Calling VideoTracker Stop");
            Obj.VideoTracker.Stop();
            Obj.CreateHTML();
            System.RefreshServerTime();
            Obj.RefreshTimes();
            if (!(typeof FCKeditor === "undefined")) {
                Obj.oFCKeditor = new FCKeditor('Notes', "345px", "472px");
                Obj.oFCKeditor.ReplaceTextarea();
            } else {
                //alert(typeof FCKeditor);
            }
            //Obj.oFCKeditor.Create();
            System.Later(1, Obj.CallBack);
        },
        CreateHTML: function () {
            var tstr = '';
            //            tstr = tstr + '<div class="VideoName" style="">\n\r';
            //            tstr = tstr + '<h1></h1>\n\r';
            //            tstr = tstr + '</div>\n\r';
            //            tstr = tstr + "<div class='VideoDisplayArea' style=''>\n\r";
            tstr = tstr + "<div id='video-player1' class='VideoArea' style=''>\n\r";
            tstr = tstr + '</div>\n\r';
            tstr = tstr + "<div id='video-player2' class='VideoArea' style=''>\n\r";
            tstr = tstr + ' </div>\n\r';
            //            tstr = tstr + "<div id='videoimageArea' class='VideoArea' style=''>\n\r";
            //            tstr = tstr + '<img src="" alt="" width="600px" height="338px"/>\n\r';
            //            tstr = tstr + ' </div>\n\r';
            //            tstr = tstr + ' </div>\n\r';
            $(Obj.Div).find(".VideoDisplayArea").append(tstr);
            tstr = '';
            tstr = tstr + '<div class="CountDownClock MessageIsLive" style="display:none;">';
            tstr = tstr + '<div class="" style="">';
            tstr = tstr + 'Watch Live Message Now';
            tstr = tstr + '</div>';
            tstr = tstr + '</div>';
            $(Obj.CountDownClock.Div).append(tstr);
        },
        SetState: function (NewState) {
            if (Obj.State != NewState) {
                Obj.State = NewState;
                System.DebugWrite("State = " + Obj.State);
            }
        },
        RefreshTimes: function () {
            System.DebugWrite("RefreshTimes");
            var LiveMessageURL = '/LiveMessage/Current?Format=JSON';
            Obj.LastCheck = new Date();
            Obj.LastCheck.setTime(Obj.LastCheck.getTime() + System.Offset);
            //alert("Refreshing");
            var Now = new Date();
            var Cnt = parseInt(Now.getTime());
            $.getJSON(LiveMessageURL + "&Cnt=" + Cnt, function (data) {
                //alert('In Callback');
                if (data.length == 0) {
                    //error
                } else {
                    data=data.Item;
                    Obj.CurrentLive = data;
                    if (StartTimeShift != Obj.CurrentLive.StartTimeShift) {
                        StartTimeShift = Obj.CurrentLive.StartTimeShift;
                        System.DebugWrite("StartTimeShift=" + StartTimeShift);
                    }
                    Obj.OpenTime = Date.parse(data.OpenDate);
                    Obj.StartTime = Date.parse(data.LiveDate);
                    Obj.VideoEndTime = Date.parse(data.VideoEndDate);
                    Obj.CloseTime = Date.parse(data.CloseDate);
                    Obj.CountDownClock.SetEndTime(Obj.CurrentLive.LiveDate);
                    System.DebugWrite("data.OpenDate=" + data.OpenDate);
                    System.DebugWrite("data.LiveDate=" + data.LiveDate);
                    System.DebugWrite("data.VideoEndDate=" + data.VideoEndDate);
                    System.DebugWrite("data.CloseDate=" + data.CloseDate);
                    Obj.RefreshVideoData();

                }
            });
        },
        RefreshVideoData: function () {
            if (Obj.CurrentLive != null) {
                if ($(Obj.Div).find("#videoimageArea img").attr("src") != Obj.CurrentLive.ImageURL) {
                    $(Obj.Div).find("#videoimageArea img").attr("src", Obj.CurrentLive.ImageURL);
                }
                $(Obj.Div).find("#videoimageArea img").attr("alt", Obj.CurrentLive.Title);
                $(Obj.Div).find(".VideoName").html("<h1>" + Obj.CurrentLive.Title + "</h1><span>" + Obj.CurrentLive.Speaker + "</span>");
                var TimeTabs = $(".TimeTab");
                var tstr = '';
                var CurDay = "";
                var Fst = true;
                for (a = 0; a < Obj.CurrentLive.Days.length; a++) {
                    var D = Obj.CurrentLive.Days[a];
                    if (D.WeekDay != CurDay) {
                        if (!Fst) {
                            tstr = tstr + '</ul></li>';
                        }
                        tstr = tstr + '<li><span class="Sched_DayOfWeek">' + D.WeekDay + '</span>';
                        tstr = tstr + '<ul>';
                        Fst = false
                        CurDay = D.WeekDay
                    }
                    tstr = tstr + '<li><span class="Sched_TimeOfDay">' + D.TimeOfDay + ' est</span>';
                    tstr = tstr + '<a href="" class="button InviteBtn" tag="' + D.WeekDay + " " + D.TimeOfDay + '">INVITE</a>';
                    tstr = tstr + '</li>';
                }
                tstr = tstr + '</ul></li>';
                $(TimeTabs).html(tstr);
                //System.DebugWrite("Obj.CurrentLive.Notes=" + Obj.CurrentLive.Notes);

                $("#Notes").html(Obj.CurrentLive.Notes);
                if (!Obj.ISPlaying) {
                    if (!(typeof FCKeditorAPI === "undefined")) {
                        FCKeditorAPI.GetInstance('Notes').SetHTML(Obj.CurrentLive.Notes);
                    } else {
                        //alert(typeof FCKeditorAPI);
                    }
                }
                //Obj.oFCKeditor.SetHTML(Obj.CurrentLive.Notes);

                $(".InviteBtn").click(function () {
                    InviteClicked(this);
                    return false;
                });
                $(TimeTabs).find(".button, .button_destructive").button();
            }
        },
        GetCurrentPanel: function (ReferenceDate) {
            //System.DebugWrite("GetCurrentPanel");
            //var Now = new Date();
            //Now.setTime(Now.getTime() + System.Offset);
            var PrevOpenTime = ReferenceDate.getTime();
            if (Obj.CurrentLive.Panels.length != 0) {
                PrevOpenTime = Date.parse(Obj.CurrentLive.Panels[0].StartDateTime);
            }

            for (a = 1; a < Obj.CurrentLive.Panels.length; a++) {
                var Panel = Obj.CurrentLive.Panels[a];
                var OpenTime = Date.parse(Panel.StartDateTime);
                var SSeconds = parseInt((OpenTime - ReferenceDate.getTime()) / 1000);
                if (!(SSeconds < 0)) {
                    var CurPanel = Obj.CurrentLive.Panels[a - 1];
                    if (Obj.CurrentPanel != a - 1) {
                        System.DebugWrite("Panel Name=" + CurPanel.Name);
                        System.DebugWrite("Panel StartTime=" + CurPanel.StartDateTime);
                    }
                    var obj = new Object;
                    obj.Num = a - 1;
                    obj.StartInSeconds = parseInt((PrevOpenTime - ReferenceDate.getTime()) / 1000);
                    obj.Panel = CurPanel;
                    return obj;
                }
                PrevOpenTime = OpenTime;
            }

            var obj = new Object;
            obj.Num = a - 1;
            obj.StartInSeconds = parseInt((PrevOpenTime - ReferenceDate.getTime()) / 1000);
            obj.Panel = null;
            if ((a - 1) < Obj.CurrentLive.Panels.length) {
                obj.Panel = Obj.CurrentLive.Panels[a - 1];
            }
            return obj;
        },
        GetCurrentVideo: function (ReferenceDate) {
            //var Now = new Date();
            //Now.setTime(Now.getTime() + System.Offset);
            var PrevOpenTime = ReferenceDate.getTime();
            PrevOpenTime = Date.parse(Obj.CurrentLive.Videos[0].StartTime);
            for (a = 1; a < Obj.CurrentLive.Videos.length; a++) {
                var Video = Obj.CurrentLive.Videos[a];
                var OpenTime = Date.parse(Video.StartTime);
                var SSeconds = parseInt((OpenTime - ReferenceDate.getTime()) / 1000);
                //System.DebugWrite("Name=" + CurVideo.Name);
                //System.DebugWrite("SSeconds=" + SSeconds);
                if (!(SSeconds < 0)) {
                    var CurVideo = Obj.CurrentLive.Videos[a - 1];
                    if (Obj.CurrentVideo != a - 1) {
                        System.DebugWrite("Name=" + CurVideo.Name);
                        System.DebugWrite("StartTime=" + CurVideo.StartTime);
                    }
                    var obj = new Object;
                    obj.Num = a - 1;
                    obj.StartInSeconds = parseInt((PrevOpenTime - ReferenceDate.getTime()) / 1000);
                    obj.Video_ID = CurVideo.ID;
                    obj.Name = CurVideo.Name;
                    return obj;
                }
                PrevOpenTime = OpenTime;
            }

            var obj = new Object;
            obj.Num = a - 1;
            obj.StartInSeconds = parseInt((PrevOpenTime - ReferenceDate.getTime()) / 1000);
            obj.Video_ID = 0;
            obj.Name = "";
            if ((a - 1) < Obj.CurrentLive.Videos.length) {
                obj.Video_ID = Obj.CurrentLive.Videos[a - 1].ID;
                obj.Name = Obj.CurrentLive.Videos[a - 1].Name;
            }
            return obj;
        },
        RevealVideo: function () {
            $(Obj.Div).find("#video-player" + Obj.CurrentVideoArea).css('z-index', 1000);
            $(Obj.Div).find("#video-player" + Obj.PrevVideoArea).css('z-index', 0);
            $(Obj.Div).find("#video-player" + Obj.PrevVideoArea).fadeOut("slow", function () {
                $(Obj.Div).find("#video-player" + Obj.PrevVideoArea).html("");
            });
        },
        ShowLiveVideo: function (VidObj) {
            System.DebugWrite("VidObj.Num=" + VidObj.Num);
            System.DebugWrite("CurrentVideo=" + Obj.CurrentVideo);
            System.DebugWrite("VidObj.StartInSeconds=" + VidObj.StartInSeconds);
            if (VidObj.Video_ID != 0) {
                Obj.CurrentVideo = VidObj.Num;
                Obj.PrevVideoArea = Obj.CurrentVideoArea;
                Obj.CurrentVideoArea = ((Obj.CurrentVideoArea == 1) ? 2 : 1);
                $(Obj.Div).find("#video-player" + Obj.CurrentVideoArea).css('z-index', 0);
                System.SevenHills.LiveVideo.Create_Lightcast('video-player' + Obj.CurrentVideoArea, VidObj.Video_ID, Math.abs(VidObj.StartInSeconds),
                                        function () {
                                            Obj.RevealVideo();
                                            $(Obj.Div).find("#video-player" + Obj.CurrentVideoArea).fadeIn("slow", function () {
                                                setTimeout(Obj.RevealVideo, 2500);
                                                $(Obj.Div).find(".CurrentVideoName").html("<h2>" + VidObj.Name + "</h2>");
                                            });
                                        });
                if (!Obj.VideoTracker.Running) {
                    System.DebugWrite("Calling VideoTracker Start");
                    Obj.VideoTracker.Start();
                }
            }
        },
        ShowPanel: function (PanelObj) {
            System.DebugWrite("PanelObj.Num=" + PanelObj.Num);
            System.DebugWrite("CurrentPanel=" + Obj.CurrentPanel);
            System.DebugWrite("PanelObj.StartInSeconds=" + PanelObj.StartInSeconds);
            if (PanelObj.Panel != null) {
                System.DebugWrite("PanelObj.Panel.Content=" + PanelObj.Panel.Content);
            }
            Obj.CurrentPanel = PanelObj.Num;
            var LP = $(Obj.ParentDiv).find(".LivePanel");
            $(LP).find(".PanelArea").fadeOut("slow");
            $(LP).html("");
            if (PanelObj.Panel != null) {
                $(LP).append("<div class='PanelArea' style='display:none;'>" + PanelObj.Panel.Content + "</div>");
                $(LP).find(".PanelArea").fadeIn("slow");
            } else {
                System.DebugWrite("No Panel");
            }
        },
        HidePlayer: function () {
            $(Obj.Div).find("#video-player1, #video-player2").fadeOut("slow", function () {
                $(Obj.Div).find("#videoimageArea").fadeIn("slow");
                $(Obj.Div).find("#video-player1, #video-player2").html("");
            });
        },
        HideNotes: function () {
            $("#TabsArea").fadeOut("slow", function () {
                $("#ContentArea").fadeIn("slow");
            });
        },
        ShowPlayer: function () {
            $(Obj.Div).find("#videoimageArea").fadeOut("slow");
        },
        ShowNotes: function () {
            $("#ContentArea").fadeOut("slow", function () {
                $("#TabsArea").fadeIn("slow");
            });
        },
        CallBack: function () {
            var Now = new Date();
            Now.setTime(Now.getTime() + System.Offset); // + (StartTimeShift * 1000));
            var ReferenceDate = new Date();
            ReferenceDate.setTime(Now.getTime() + (StartTimeShift * 1000));

            var OpenInSeconds = parseInt(((Obj.OpenTime - ReferenceDate.getTime())) / 1000);
            var StartInSeconds = parseInt(((Obj.StartTime - ReferenceDate.getTime())) / 1000);
            var EndInSeconds = parseInt(((Obj.VideoEndTime - ReferenceDate.getTime())) / 1000);
            var CloseInSeconds = parseInt(((Obj.CloseTime - ReferenceDate.getTime())) / 1000);
            var lastCheckInSeconds = parseInt((Obj.LastCheck - Now.getTime()) / 1000);

            if (lastCheckInSeconds < -60 * 2 || (CloseInSeconds < 0 && lastCheckInSeconds < -60 * 1)) {
                Obj.RefreshTimes();
            }

            if (CloseInSeconds <= 0) {
                Obj.SetState("Close");
                Obj.HidePlayer();
                Obj.HideNotes();

                if (Obj.ISPlaying) {
                    System.DebugWrite("End Playing");
                    Obj.VideoTracker.Stop();
                    Obj.ISPlaying = false;
                    Obj.CurrentVideo = -1; 
                    Obj.RefreshVideoData();
                }
                //Obj.RefreshVideoData();
                $(Obj.CountDownClock.Div).fadeOut();
            } else {
                if (EndInSeconds <= 0) {
                    Obj.SetState("End");
                    Obj.HidePlayer();
                    Obj.ShowNotes();
                    //                    if (Obj.ISPlaying) {
                    //                        System.DebugWrite("End Playing");
                    //                        Obj.VideoTracker.Stop();
                    //                        Obj.ISPlaying = false;
                    //                        Obj.CurrentVideo = -1;
                    //                        Obj.RefreshVideoData();
                    //                    }
                    $(Obj.CountDownClock.Div).fadeOut();
                } else {
                    if (StartInSeconds <= 0) {
                        Obj.SetState("Start");
                        if (Obj.CurrentLive == null) {
                            System.DebugWrite("CurrentLive is null");
                        }
                        if (!Obj.ISPlaying && (Obj.CurrentLive != null)) {
                            System.DebugWrite("Start Playing");
                            Obj.ShowPlayer();
                            Obj.ShowNotes();
                            var VidObj = Obj.GetCurrentVideo(ReferenceDate);
                            Obj.ShowLiveVideo(VidObj);

                            Obj.ISPlaying = true;
                            Obj.RefreshVideoData();
                        }
                        var VidObj = Obj.GetCurrentVideo(ReferenceDate);
                        if (VidObj.Num != Obj.CurrentVideo) {
                            Obj.ShowLiveVideo(VidObj);

                            Obj.ISPlaying = true;
                            Obj.RefreshVideoData();
                        }
                        $(Obj.CountDownClock.Div).fadeIn();

                    } else {
                        if (OpenInSeconds <= 0) {
                            Obj.SetState("Open");
                            Obj.HidePlayer();
                            Obj.ShowNotes();
                            if (Obj.ISPlaying) {
                                System.DebugWrite("End Playing");
                                Obj.VideoTracker.Stop();
                                Obj.ISPlaying = false;
                                Obj.CurrentVideo = -1;
                                Obj.RefreshVideoData();
                            }
                            $(Obj.CountDownClock.Div).fadeIn();
                        } else {
                            Obj.SetState("Future");
                            Obj.HidePlayer();
                            Obj.HideNotes();
                            if (Obj.ISPlaying) {
                                System.DebugWrite("End Playing");
                                Obj.CurrentVideo = -1;
                                Obj.VideoTracker.Stop();
                                Obj.ISPlaying = false;
                                Obj.RefreshVideoData();
                            }
                            $(Obj.CountDownClock.Div).fadeIn();
                        }
                    }
                }
            }
            if (Obj.ISPlaying) {
                $(".MessageIsLive").fadeIn();
            } else {
                $(".MessageIsLive").fadeOut();
            }
            if (Obj.ISPlaying) {
                var PanelObj = Obj.GetCurrentPanel(ReferenceDate);
                if ((PanelObj.Num != Obj.CurrentPanel)) {
                    Obj.ShowPanel(PanelObj);
                }

            }
            System.Later(100, Obj.CallBack);
        }
    };

    $(function () {
        Obj.Init(VideoDiv, CountDownDiv, CountDownClock, EndTime);
    });
    return Obj;
} 





