﻿

    var PlayerService_Priority = { "low" : 60, "normal" : 20, "high" : 5 };
    var PlayerService_Timer = 0;
    var PlayerService_QueuedEvents = new Array();
    var PlayerService_Retry_Interval = 1;
    var PlayerService_CallId = 0;
    var PlayerService_Active = false;
    var SynchronizingPlayerService_QueuedEvents = new Array();
    
    
    function PlayerService_QueueServerEvent(type, data, priority, callback){
        
        //DoDebug("timer: "+PlayerService_Timer);
        PlayerService_QueuedEvents.push([type, data, callback]);
        
        //send events to server immediately, if high prio, or normal prio and webcast is indexed
        if (priority == PlayerService_Priority.high || (priority == PlayerService_Priority.normal && theLiveStatusId >= LS_INDEXED)) {
            ProcessQueuedEvents('high prio');
        } else {
            if (PlayerService_Timer == 0) PlayerService_Timer = setTimeout("ProcessQueuedEvents('" + priority + "')", 30000);
        }
    }

    function ProcessQueuedEvents(src) {
        //DoDebug("playerservice timer: "+PlayerService_Timer);
        clearTimeout(PlayerService_Timer);
        PlayerService_Timer = 0;
        if (PlayerService_Active) {
            DoDebug("Already Synchronizing, retry in 1 second.","#ff0000");
            if (PlayerService_Timer == 0) PlayerService_Timer = setTimeout("ProcessQueuedEvents('" + src + "')", 1000);
        }
        else 
        {
            PlayerService_Active = true;
            var myEvents = "";
            for (var i = 0; i < PlayerService_QueuedEvents.length; i++) {
                var tmp = PlayerService_QueuedEvents[i][0];
                myEvents += tmp;
                if (tmp == "log") myEvents += ">" + PlayerService_QueuedEvents[i][1].currentSegment + "; "; else myEvents += "; "
            }
            var myColor = (src == "high prio" ? "#ffaa00" : "#ffdd88");
            var firstEvent = eventsArr.length > 0 ? eventsArr[eventsArr.length - 1][0] : ""; ;

            SynchronizingPlayerService_QueuedEvents = PlayerService_QueuedEvents;
            PlayerService_QueuedEvents = new Array();
            
            PlayerService_CallId++;
            if (SynchronizingPlayerService_QueuedEvents.length == 0) {
                DoDebugAsync("Sync: " + myEvents, myColor, PlayerService_CallId);
                Cwc.WebPlayer.PlayerService.Synchronize(
                    theWebcastId, theLanguageId, theBitrateId, firstEvent, PlayerService_CallId,
                    PlayerService_OnSuccess, PlayerService_OnError
                );
            } else {
                DoDebugAsync("SyncWithUpdate: " + myEvents, myColor, PlayerService_CallId);
                Cwc.WebPlayer.PlayerService.SynchronizeWithUpdate(
                    theWebcastId, theLanguageId, theBitrateId, firstEvent,
                    SynchronizingPlayerService_QueuedEvents, PlayerService_CallId,
                    PlayerService_OnSuccess, PlayerService_OnError
                );
            }
            
        }
    }

    function PlayerService_OnSuccess(result) {
        if (result != null) {
            var callId = result.Values["callId"];
            var dur = "";
            if (result.Values["requestduration"] != undefined) {
                dur = parseInt(result.Values["requestduration"]) / 1000;
            }
            var debugMessage = "";
            for (var i = 0; i < SynchronizingPlayerService_QueuedEvents.length; i++) {
                debugMessage += SynchronizingPlayerService_QueuedEvents[i][0] + "; ";
                var callback = SynchronizingPlayerService_QueuedEvents[i][2];
                if (callback != null) eval(callback(result));
            }
            
            
            if (theLiveStatusId != result.LiveStatus)
                OnLiveStatusChanged(result.LiveStatus);
            
            Addon_Debug_LiveService("Synchronized @ " + new Date());
            if (theLiveStatusId < LS_INDEXED) {
                Addon_Debug_UpdateEvents();
                if (result.Values["updatedEvents"] != null && result.Values["updatedEvents"].length > 13) {
                    OnUpdateEventsComplete(result.Values["updatedEvents"]);
                }
            }
            PlayerService_Retry_Interval = 1;   //reset retry interval since this call was succesfull
            if (theLiveStatusId < LS_INDEXED) {
                PlayerService_Timer = setTimeout("ProcessQueuedEvents()", 15000);
            }
            debugMessage = "Sync succes" + (dur != "" ? " in " + dur + " seconds. " : ". ") + debugMessage;
            DoDebugCallback(debugMessage, "#00ff00", callId);
        } else {
            PlayerService_QueuedEvents.concat( SynchronizingPlayerService_QueuedEvents);
            PlayerService_Timer = setTimeout("ProcessQueuedEvents()", PlayerService_Retry_Interval * 1000);
            DoDebugCallback("Sync failed", "#ff0000", callId);
            if (PlayerService_Retry_Interval < 60) PlayerService_Retry_Interval++;
        }
        PlayerService_Active = false;
    }
    
    function PlayerService_OnError(result){
        //restore event queue
        PlayerService_QueuedEvents.concat(  SynchronizingPlayerService_QueuedEvents );
        
        //to many errors, reload page
        if(PlayerService_QueuedEvents.length>10)document.location=document.location;

        DoDebug("PlayerService Error:" + result.get_message(), "#ff0000");
        Addon_Debug_LiveService("Error synchronizing @ " + new Date());
        if (theLiveStatusId < LS_INDEXED) PlayerService_Timer = setTimeout("ProcessQueuedEvents('error')", 15000);
        PlayerService_Active = false;
    }
