﻿var progressBarReference = new ProgressBarReference("", "", "");
var _parameters;
function ProgressBarReference(progressImageID, progressLabelID, progressBarContainerID) {
    this.ProgressImageID = progressImageID;
    this.ProgressLabelID = progressLabelID;
    this.ProgressBarContainerID = progressBarContainerID;
}

var processInstanceID = "";
var getProgressIntervalID = "";
var getProgressCount = 0;
var MAX_PRGRESS_CHECKS = 600;   //10 minutes
function InitializingServersideProcessEventArgs(processName, parameters) {
    this.Cancel = false;
    this.ProcessName = processName;
    this.Parameters = parameters;
}
function InitServerSideProcess(processName, parameters) {
    _parameters = parameters;
    var initializationErrorOccured = false;
    try {
        ///Define event args
        var e = new InitializingServersideProcessEventArgs(processName, parameters);
        try {
            ///Raise the InitializingServersideProcess event
            OnInitializingServersideProcess(this, e);
        }
        catch (exInner) { }
        ///If we are to cancel the initialization process for whatever reason...
        if (e.Cancel) { return; }
    }
    catch (ex) {initializationErrorOccured = true; }
    ///Set the progress bar reference for this server side process
    progressBarReference = new ProgressBarReference(parameters.ProgressBarReference.progressImageID, parameters.ProgressBarReference.progressLabelID, parameters.ProgressBarReference.progressBarContainerID);

    ///Attempt to Initialize the context data (if any) for this server side process
    try 
    {
        OnInitializeContextData(this, parameters);
    }
    catch (ex) {initializationErrorOccured = true; }
    

    if (typeof progressBarReference != "undefined") 
    {
        $get(progressBarReference.ProgressLabelID).innerHTML = "Please wait...";
        display(progressBarReference.ProgressImageID + '', 0, 1);
        $get(progressBarReference.ProgressBarContainerID).style.display = "";
    }
    ///Run the server side process...
    processInstanceID = "";
    PageMethods.RunServerSideProcess(processName, parameters.ProcessInitializationData, StartProcessSuccessCallBackSuccess, OnError);

    if (initializationErrorOccured) {
        try {
            $get(progressBarReference.ProgressLabelID).innerHTML = "Your RealSync request has been sent, but there may have been a problem processing it. Please refresh your browser and try again.<br/><br/>If the problem persists, please contact eMedical Lending Technical Support.<br/>";
            fillProgress(progressBarReference.ProgressImageID + '', 100);
        }
        catch (ex) { }

    }
}

function getProcessProgress() {
    PageMethods.GetProcessProgress(processInstanceID, GetProgressSuccessCallBack, OnError);
}
function OnError(error) {
    alert("Error: " + error.get_message());
}
function ReportProgress(progress) {
    if (progress) {
        $get(progressBarReference.ProgressLabelID).innerHTML = "Progress: " + progress.PercentComplete + "% / " + progress.ProgressMessage + "<br/>";
        fillProgress(progressBarReference.ProgressImageID + '', progress.PercentComplete);
        try {
            ///Raise the progress event
            OnProgress(_parameters, progress);
        }
        catch (ex) { }
    }
}
var currentNonResultProgressCheckCount = 0;
function GetProgressSuccessCallBack(result, eventArgs, methodName) {
    if (result) {
        ReportProgress(result);

        if (result.PercentComplete < 100 && getProgressCount++ < MAX_PRGRESS_CHECKS) {
            getProgressIntervalID = window.setTimeout("getProcessProgress()", 1000);
        }
        else {
            try {
                if (result.PercentComplete < 100 && getProgressCount>= MAX_PRGRESS_CHECKS) {
                    OnServerSideProcessTimeOut(this, eventArgs);
                }
            }
            catch (ex) { }
        }
        if (result.PercentComplete >= 100) {
            fillProgress(progressBarReference.ProgressImageID, 100);
            try {
                OnServerSideProcessCompleting(this, eventArgs);
            }
            catch (ex) { }
            window.clearInterval(getProgressIntervalID);


            ///Signal to calling application that server side process is complete.
            window.setTimeout("OnServerSideProcessComplete(this, {'ProgressBarReference':progressBarReference, 'ContextData':_parameters.ContextData});", 4000);
        }
    }
    else {
        currentNonResultProgressCheckCount++;
        if (currentNonResultProgressCheckCount <= 5) {
            ///Try a maximum of 5 more times to get the progress..
            getProgressIntervalID = window.setTimeout("getProcessProgress()", currentNonResultProgressCheckCount * 1000);
        }
    }
}
function StartProcessSuccessCallBackSuccess(result, eventArgs, methodName) {
    if (result) {
        display(progressBarReference.ProgressImageID + '', 0, 3);
        processInstanceID = result;
        getProgressIntervalID = window.setTimeout("getProcessProgress()", 1000);
    }
}

