(function() {
if (typeof SEETOO == "undefined" || typeof SEETOO.APP != "undefined") {
    return;
}

SEETOO.APP = {
    isAllowedFileType: function(name) {
        var fileType = SEETOO.getFileExtension(name);
        return jQuery.inArray(fileType, unsupportedFileTypes) == -1;
    },

    isSessionClosed: function() {
        return SEETOO.APP.Tv.get().isSessionClosed();
    },

    copyToClipboard: function(text) {
        SEETOO.APP.Tv.get().copyToClipboard(text);
    },

    getHomeUrl: function() {
        var homeUrl = SEETOO.APP.getBaseUrl();

        var arr = ['caller', 'iframe'];

        for (var i = 0; i < arr.length; i++) {
            var name = arr[i];

            if (SEETOO.getQueryString(name)) {
                homeUrl += (homeUrl.indexOf('?') > 0 ? '&' : '?');
                homeUrl += (name + '=' + SEETOO.getQueryString(name));
            }
        }

        return homeUrl;
    },

    getBaseUrl: function(asDirectory) {
        var pathLength = (asDirectory ? document.location.pathname.lastIndexOf('/') + 1 : document.location.pathname.lastIndexOf('?'));
        if (pathLength < 0) pathLength = document.location.pathname.length;
        var path = document.location.pathname.substr(0, pathLength);
        return document.location.protocol + "//" + document.location.hostname + path;
    },

    getSupportUrl: function() {
        var homeUrl = this.getHomeUrl();
        return homeUrl + (homeUrl.indexOf('?') > 0 ? '&' : '?') + 'support';
    },

    isDesktopInstalled: function() {
        return SEETOO.APP.Tv.get().isDesktopInstalled();
    },

    isInitiator: function() {
        return !SEETOO.APP.isViewer() && SEETOO.APP.Tv.get() && SEETOO.APP.Tv.get().isInitiator();
    },

    isViewer: function() {
        return SEETOO.hasQueryString('fms') || SEETOO.hasQueryString('i');
    },

    isGuest: function() {
        return !this.isInitiator() && !this.isViewer();
    },

    isAimModule: function() {
        try { return window.external && window.external.window; } catch(ex) { return false; }
    },

    dispatchEvent: function(type, data) {
        if (typeof data != "array") {
            data = [data];
        }

        try {
            type = eval("(" + type + ")");
        } catch (ex) {}

        getEventDispatcher().triggerHandler(type, data);
    },

    addEventListener: function(type, data, fn) {
        getEventDispatcher().bind(type, data, fn);
    },

    removeEventListener: function(type, fn) {
        getEventDispatcher().unbind(type, fn);
    },

    checkConnection: function(callback) {
        eventWrapper(SEETOO.APP.Events.BANDWIDTH_CHECK_COMPLETED, callback);

        /*SEETOO.APP.Tv.get().call(
            'checkConnection',
            SEETOO.JSON.stringify({
                server: fmsUrl,
                checkUpload: SEETOO.APP.isInitiator(),
                checkDownload: true
            }),
            null
        );*/

        setTimeout(function() {
            SEETOO.APP.dispatchEvent(SEETOO.APP.Events.BANDWIDTH_CHECK_COMPLETED, [{up: -1, down: 755, http: false}]);
        }, 2500);
    }
};

var eventDispatcher;
var getEventDispatcher = function() {
    if (!eventDispatcher) {
        var el = document.createElement('div');
        document.body.appendChild(el);
        eventDispatcher = jQuery(el);
    }

    return eventDispatcher;
};

var eventWrapper = function(eventName, callback) {
    var callbackWrapper = function(event, json) {
        try {
            callback.call(callback, json);
        } catch (ex) {}

        event.data.call();
    };

    var gc = function(event) {
        SEETOO.APP.removeEventListener(eventName, callbackWrapper);
    };

    SEETOO.APP.addEventListener(eventName, gc, callbackWrapper);
};

SEETOO.APP.Events = {
    BANDWIDTH_CHECK_COMPLETED: 'bandwidthCheckCompleted.SEETOO',
    MANAGER_READY: 'managerReady.SEETOO',
    UNLOAD_COMPLETED: 'unloadCompleted.SEETOO',
    OPEN_FILE_COMPLETED: 'openFileCompleted.SEETOO',
    TITLE_CHANGED: 'titleChanged.SEETOO',
    SELECT_VIDEO: 'selectVideo.SEETOO',
    INVITE_BUDDY: 'inviteBuddy.SEETOO',
    CLEAR_MESSAGES: 'hideMessages.SEETOO',
    START_STREAMER: 'startStreamer.SEETOO',
    SESSION_NOT_AVAILABLE: 'sessionNotAvailable.SEETOO',
    CHAT_MESSAGE_RECEIVED: 'onChatMessageReceived.SEETOO',
    CHAT_PARTICIPANT_JOINED: 'chatParticipantJoined.SEETOO',
    CHAT_PARTICIPANT_LEFT: 'chatParticipantLeft.SEETOO',
    ON_CHAT_JOIN: 'onChatJoin.SEETOO',
    NAME_CHANGE_HANDLER: 'nameChangeHandler.SEETOO',
    SERVICE_CONNECTED_HANDLER: 'serviceConnectedHandler.SEETOO',
    SERVICE_DISCONNECTED_HANDLER: 'serviceDisconnectedHandler.SEETOO',
    MEDIA_READY_HANDLER: 'mediaReadyHandler.SEETOO',
    VIEWER_CONNECTED: 'viewerConnected.SEETOO',
    OOVOO_ENABLED: 'oovooEnabled.SEETOO',
    PLAYER_PLAY: 'playerPlay.SEETOO',
    PLAYER_PAUSE: 'playerPause.SEETOO',
    PLAYER_SEEK: 'playerSeek.SEETOO',
    PLAYER_FULL_SCREEN: 'playerFullScreen.SEETOO',
    ON_MULTIPLE_INITIATORS: 'onMultipleInitiators.SEETOO',
    GET_FILES: 'getFiles.SEETOO',
    GET_FILES_RESPONSE: 'getFilesResponse.SEETOO'
};

var allowedVideoFileTypes = ['avi', 'flv', 'mov', 'wmv', 'divx', 'xvid', 'mpg', 'mpeg', 'mp4', 'vob', '3gp', '3g2', 'rm', 'rmv', 'rmvb'];
var allowedAudioFileTypes = ['mp3', 'ogg', 'wav', 'wma', 'rma', 'ac3', 'flac'];
var allowedImageFileTypes = ['bmp', 'jpg', 'jpeg', 'png', 'gif'];
var allowedFileTypes = [].concat(allowedVideoFileTypes, allowedAudioFileTypes, allowedImageFileTypes);
var unsupportedFileTypes = ['exe', 'dll', 'zip', 'rar', 'txt', 'pdf', 'doc', 'docx', 'pps', 'ppsx', 'xls', 'xlsx', 'swf', 'ifo', 'srt', 'sub'];

SEETOO.APP.Globals = {
    isInitiator: function() {
        return SEETOO.getQueryString('initiator') === true;
    },
    isStreaming: function() {
        return SEETOO.getQueryString('s') != undefined;
    },
    isInstall: function() {
        return SEETOO.getQueryString('installed') != undefined;
    },
    isUninstall: function() {
        return SEETOO.getQueryString('uninstalled') != undefined;
    },
    isDownload: function() {
        return SEETOO.getQueryString('download') != undefined;
    },
    isUpgrade: function() {
        return SEETOO.getQueryString('upgrade') != undefined;
    },
    isSupport: function() {
        return SEETOO.getQueryString('support') != undefined;
    }
};

SEETOO.APP.Tv = {

    create: function(swf, parentElement, flashvars) {
        SEETOO.UI.Flash.create(
            'SeeTooTv',
            jQuery(parentElement).css('width'),
            jQuery(parentElement).css('height'),
            swf,
            flashvars,
            parentElement);
    },

    get: function() {
        return SEETOO.UI.Flash.select("SeeTooTv");
    }

};

var addonElementID = 'seetooAddon';

SEETOO.APP.Addon = {

    supportedOS : navigator.platform.toLowerCase().indexOf('win') == 0,

    supportedBrowser: false ||
        (jQuery.browser.msie &&
            (jQuery.browser.version == '6.0' || jQuery.browser.version == '7.0' || jQuery.browser.version == '8.0')) ||
        (jQuery.browser.mozilla &&
            navigator.userAgent.indexOf('Firefox') != -1 && navigator.userAgent.indexOf('Firefox/1.5') == -1 &&
            (jQuery.browser.version.substr(0, 3) == '1.8' || jQuery.browser.version.substr(0, 3) == '1.9')),

    create: function(parentElement, clientID, browser, browserVersion, baseUrl, o) {
        var options = {
            baseUrl: '',
            ref: SEETOO.getQueryString('ref') || SEETOO.getQueryString('caller') || 'seetoo'
        };
        o = o || {};
        jQuery.extend(options, o);

        o.baseUrl = baseUrl || ''; // TOOD: remove baseUrl from params
        
        var addonVersionQueryString = o.addonVersion ? '&addonVersion=' + o.addonVersion : '';

        var lines = [];

        lines[lines.length] = '<object classid="clsid:3188FB46-456D-4C07-8A11-F5F3BBBA8AF2"';
        lines[lines.length] = ' codebase="' + o.baseUrl + 'downloadAddon.php?platform=' + navigator.platform +
            '&browser=' + browser +
            '&ref=' + o.ref +
            '&c=' + clientID +
            '&browserVersion=' + browserVersion +
            addonVersionQueryString +
            '#version=1,2,0,0"';
        lines[lines.length] = ' id="' + addonElementID + '"';
        lines[lines.length] = ' width="0"';
        lines[lines.length] = ' height="0">';
        lines[lines.length] = ' <embed type="application/x-seetoo-addon"';
        //lines[lines.length] = '     pluginspage="http://www.macromedia.com/go/getflashplayer"';
        lines[lines.length] = '     name="' + addonElementID + '"';
        lines[lines.length] = '     width="0"';
        lines[lines.length] = '     height="0"';
        lines[lines.length] = '     hidden="true">';
        lines[lines.length] = ' </embed>';
        lines[lines.length] = '</object>';

        var linesText = lines.join("");

        if (typeof parentElement == "undefined") {
            document.write(linesText);
        } else {
            parentElement.innerHTML = linesText;
        }

        return linesText;
    },

    get: function() {
        var isIE = navigator.appName.indexOf("Microsoft") != -1;
        return isIE ? window[addonElementID] : document[addonElementID];
    },

    execute: function(command) {
        return this.get().execute(command);
    }

};

SEETOO.APP.Streamer = {

    restart: function() {
        SEETOO.APP.Tv.get().call('startStreamer', SEETOO.JSON.stringify({ restart: true }), null);
    }

};

})();