﻿window.SOLSwfProxy = {

    SOLSwfId: "AppSwfContainer",
    SOLSwf: null,

    getJsonObject: function (jsonString) {
        return eval("(" + jsonString + ")");
    },

    SOLSwfOnLoad: function () {
        this.SOLSwf = $("#" + this.SOLSwfId)[0];
        $("#" + this.SOLSwfId).css({ "opacity": 0.0 });
        this.setupIOCallbacks();
    },

    SOLSwfOnError: function (error) {
        error = eval(error);
        console.log(error);
    },

    selectedFiles: [],
    completedUploads: [],
    uploadInProgress: false,
    mediaProgressBar: null,
    currentMediaLengthMs: -1,
    currentMediaUid: null,


    /* SWF Interface */
    setupIOCallbacks: function () {
        this.SOLSwf.setupJsIOCallbacks("SOLSwfProxy.jsDialogSelectCallback", "SOLSwfProxy.jsDialogCancelCallback", "SOLSwfProxy.jsProgressCallback", "SOLSwfProxy.jsCompleteCallback", "SOLSwfProxy.jsIOErrorCallback", "SOLSwfProxy.jsSecurityErrorCallback", "SOLSwfProxy.jsRemoveFileCallback");
    },

    uploadSelectedFiles: function () {
        SOLSwfProxy.uploadInProgress = true;
        try {
            if (SOLSwfProxy.selectedFiles.length > 0) {
                var args = "[{\"key\":\"Cookie\",\"value\":\"BBAUTHCK=" + RiaUtil.getCookie("BBAUTHCK") + "\"}]";
                SOLSwfProxy.SOLSwf.uploadSelectedFiles(args);
            }
        }
        catch (ex) {
            SOLSwfProxy.uploadInProgress = false;
        }
    },

    removeSelectedFile: function (filename, filesize) {
        this.SOLSwf.removeSelectedFile(filename, filesize);
    },

    getFileObjectIndex: function (filename, filesize) {
        for (var i = 0; i < this.selectedFiles.length; i++) {
            if (this.selectedFiles[i].filename == filename && this.selectedFiles[i].filesize == filesize)
                return i;
        }
        return -1;
    },

    streamMp3: function (url) {
        SOLSwfProxy.currentMediaLengthMs = -1;
        SOLSwfProxy.SOLSwf.mp3CreateStream(url, 10240);
    },

    pauseMedia: function () {
        SOLSwfProxy.SOLSwf.mp3Pause();
    },

    seekMedia: function (args) {
        var pct = args.x / SOLSwfProxy.mediaProgressBar.uiArgs.width;
        if (pct < SOLSwfProxy.mediaProgressBar.currentBottomPosition) {
            SOLSwfProxy.mediaProgressBar.setProgress(pct);
            SOLSwfProxy.SOLSwf.mp3Seek(Math.round(pct * SOLSwfProxy.currentMediaLengthMs));
        }
    },

    closePlayer: function () {
        if (SOLSwfProxy.SOLSwf && SOLSwfProxy.mediaProgressBar && SOLSwfProxy.currentMediaUid) {
            SOLSwfProxy.SOLSwf.mp3Dispose();
            SOLSwfProxy.mediaProgressBar = null;
            SOLSwfProxy.currentMediaUid = null;
        }
    },


    /* Javascript Callbacks */
    /* IO Callbacks */
    jsRemoveFileCallback: function (data) {
        data = this.getJsonObject(data);
        if (data.success) {
            var index = SOLSwfProxy.getFileObjectIndex(data.filename, data.filesize);
            if (index > -1) {
                SOLSwfProxy.selectedFiles.splice(index, 1);
                BBViewActions.setSelectedFilesResults(1);
            }
        }
    },

    jsDialogSelectCallback: function (data) {
        console.log("jsDialogSelectCallback\n" + data);
        this.selectedFiles = this.selectedFiles.concat(this.getJsonObject(data));
        BBViewActions.setSelectedFilesResults(1);
    },
    jsDialogCancelCallback: function (data) {
        console.log("jsDialogCancelCallback\n" + data);
    },
    jsProgressCallback: function (data) {
        data = this.getJsonObject(data);
        var selectedFilesIndexKey = data.filename.replace(/[\. ]/g, "") + data.filesize;
        console.log("jsProgressCallback\n" + data.filename + "," + data.bytesLoaded + ", " + data.bytesTotal);
        console.log(this.selectedFilesIndex[selectedFilesIndexKey]);
        if (this.selectedFilesIndex[selectedFilesIndexKey])
            this.selectedFilesIndex[selectedFilesIndexKey].setProgress(data.bytesLoaded / data.bytesTotal);
    },
    jsCompleteCallback: function (data) {
        data = this.getJsonObject(data);
        this.completedUploads[(data.filename.replace(/[\. ]/g, "") + data.filesize)] = true;
        console.log("jsCompleteCallback\n" + data.filename);
    },
    jsIOErrorCallback: function (data) {
        console.log("jsIOErrorCallback\n" + data);
    },
    jsSecurityErrorCallback: function (data) {
        data = this.getJsonObject(data);
        console.log("jsSecurityErrorCallback\n" + data);
    },
    jsRemoveSelectedFileCallback: function (data) {
        console.log("jsRemoveSelectedFileCallback\n" + data);
    },


    /* Media Streaming Callbacks */
    jsMediaStreamOnCompleteCallback: function (data) {
        console.log("jsMediaStreamOnCompleteCallback\n" + data);
    },
    jsMediaStreamOnProgressCallback: function (data) {
        data = this.getJsonObject(data);
        this.mediaProgressBar.setBottomProgress(Math.round(data.bytesLoaded) / Math.round(data.bytesTotal));
        //console.log("jsMediaStreamOnProgressCallback\n" + data);
    },
    jsMediaStreamOnId3LoadedCallback: function (data) {
        console.log("jsMediaStreamOnId3LoadedCallback\n" + data);
    },
    jsMediaStreamOnIOErrorCallback: function (data) {
        console.log("jsMediaStreamOnIOErrorCallback\n" + data);
    },
    jsMediaStreamOnPlayCallback: function (data) {
        console.log("jsMediaStreamOnPlayCallback\n" + data);
    },
    jsMediaStreamOnPauseCallback: function (data) {
        console.log("jsMediaStreamOnPauseCallback\n" + data);
    },
    jsMediaStreamOnPlayingComplete: function (data) {
        console.log("jsMediaStreamOnPlayingComplete\n" + data);
    },
    jsMediaStreamOnCurrentPositionData: function (data) {
        data = this.getJsonObject(data);
        this.currentMediaLengthMs = data.l;
        this.mediaProgressBar.setProgress(Math.round(data.p) / Math.round(data.l));
        //console.log("curr time: " + data.p / 1000 + ", length: " + data.l);
    }
}
