
QuickHit.Game.Football.Unity = function() {
    var CLASS_ID = "clsid:444785F1-DE89-4295-863A-D46C3A781394";
    var EMBED_TYPE = "application/vnd.unity";
    var PLUGINS_PAGE = "http://www.unity3d.com/unity-web-player-2.x";
    var INTERNAL_NAME = "Loader";
    var unityInitialized = false;
    var swfInitialized = false;
    var objects = [];
    var multiPartBuffer = [];
    var maximumWidth = $(document).width();
    var maximumHeight = $(document).height();
    var unityDivId = "div_unity";

    var isInstalled = function(callback) {
        unityObject.detectUnity( function(detectUnity) {
            callback(detectUnity == "installed");
        });
    }

    var partReceived = function(id) {
        unityObject.getObjectById(id).SendMessage(INTERNAL_NAME, "PartReceived", null);
    };

    var isEmpty = function(value){
        return value == null || value == undefined || value == "";
    };

    var createParam = function(element, name, value){
        var param = document.createElement("param");
        param.setAttribute("name", name);
        param.setAttribute("value", value);
        element.appendChild(param);
    };

    var getObject = function(id) {
        if (id && objects[id]) {
            return objects[id].object;
        } else if(id && unityObject.getObjectById(id)) {
            return unityObject.getObjectById(id);
        }
        else {
            return null;
        }
    };

    var send = function(id, type, data) {
        var obj = getObject(id);
        if (obj && typeof(obj.receive) == "function") {
            obj.receive(type, data);
        }
    };

    var sendMultiPart = function(sender, length, target, type, data) {
        if (!multiPartBuffer[sender]) {
            multiPartBuffer[sender] = "";
        }
        multiPartBuffer[sender] += data;
        if (multiPartBuffer[sender].length >= length) {
            send(target, type, multiPartBuffer[sender]);
            multiPartBuffer[sender] = null;
        }
        partReceived(sender);
    };

    var receive = function (id, type, data) {
        var dataArray = [type, data];
        var dataArrayLength = dataArray.length;

        dataArray.unshift(dataArrayLength + 1);

        var obj = getObject(id);

        if (obj) {
            obj.SendMessage(INTERNAL_NAME, "Receive", dataArray);
        }
    };


    var registerObject = function(object, id, width, height, options){
        if (objects[id]) {
            return;
        }
        objects[id] = {};
        objects[id].object = object;
        objects[id].options = options;
        objects[id].settings = { width: width, height: height };
    };

    var sendInitArgs = function(id) {
        if(unityInitialized) {
            var obj = unityObject.getObjectById(id);
            if (obj) {
                obj.SendMessage(INTERNAL_NAME, "SetInitArgs", [unescape(QuickHit.Game.Football.flashvars.matchResult)]);
            }
        }
    };

    var use3DClient = function() {
        var use3D = false;
            if (QuickHit.CoachCard && QuickHit.CoachCard.isDefaultClient3D) {
                use3D = true;
            } else if ($("body.not-logged-in").length) {
                use3D = true;
            }
        return use3D;
    }();

    // Public API
    return {
        getObject: getObject,
        registerObject: registerObject,
        sendInitArgs: sendInitArgs,
        isInstalled: isInstalled,
        getInitArgs: function(id, maxWidth, maxHeight) {
            var unity = unityObject.getObjectById(id);
            maximumWidth = maxWidth;
            maximumHeight = maxHeight;
            
            if(maximumWidth < $(window).width() || maximumHeight < $(window).height()) {
                alert("Your video card does not have enough available memory. Your game will be resized appropriately.");
                if (maximumWidth < $(window).width()) {
                    $("#content-inner").css("margin", "0 auto 0 auto").css({ width: maximumWidth });
                }
                if (maximumHeight < $(window).height()) {
                    $("#content-inner").css("margin", "0 auto 0 auto").css({ height: maximumHeight });
                }
            }
            registerObject(unity, id, 1, 1, null);
            unityInitialized = true;
            sendInitArgs(id);
        },

        show: function(id) {
            var obj = getObject(id);
            if (obj) {
                var doc = $(document);
                var width = Math.max(Math.min(doc.width(), maximumWidth), 740);
                var height = Math.max(1, Math.min(Math.max(($("body.facebook").length && FB ? QuickHit.Game.Football.FBHeight : doc.height()), 575), maximumHeight) - 1);
                height = Math.max(1, (QuickHit.CoachCard && QuickHit.CoachCard.activeSubscriber) ? height : height - 90);

                if (id.match(/unity/)) {
                    $("#" + id).css({ width: width, height: height });
                    $("#" + id + " embed").attr("width", width).attr("height", height);
                    unityObject.getObjectById(id).SendMessage("UIController", "TriggerWindowResize", [width, height]);
                }
                else {
                    $("#" + obj.id).attr("width", width).attr("height", height).css({ width: width, height: height });
                }
            }
        },
        hide: function(id) {
            var obj = getObject(id);
            if (obj) {
                var width = 1;
                var height = 1;

                if (id.match(/unity/)) {
                    $("#" + id).css({ width: width, height: height });
                    $("#" + id + " embed").attr("width", width).attr("height", height);
                    unityObject.getObjectById(id).SendMessage("UIController", "TriggerWindowResize", [width, height]);
                }
                else {
                    $("#" + obj.id).attr("width", width).attr("height", height).css({ width: width, height: height });
                }
            }
        },
        send: send,
        sendMultiPart: sendMultiPart,
        receive: receive,
        use3DClient: use3DClient,
        swfInitialized: function(initialized) {
            swfInitialized = initialized;
        },
        getEmbedType: function(){
            return EMBED_TYPE;
        },
        getPluginsPage: function(){
            return PLUGINS_PAGE;
        },
        getUnityDivId: function() {
            return unityDivId;
        }
    };
}();

