var MCA = {};

(function() {
    var Anim = YAHOO.util.Anim;
    var Dom = YAHOO.util.Dom;
    var Event = YAHOO.util.Event;

    MCA.Mask = function() {
        var isMaskActive;
        
        var centerOverlay = function (el) {
            if (typeof el === 'string') {
                el = Dom.get(el);
            }

            var viewportSize = [Dom.getViewportWidth(), Dom.getViewportHeight()];
            Dom.setStyle(el, 'left', (document.documentElement.scrollLeft + (viewportSize[0] / 2) - (el.offsetWidth / 2)) + 'px');
            Dom.setStyle(el, 'top', (document.documentElement.scrollTop + (viewportSize[1] / 2) - (el.offsetHeight / 2)) + 'px');
        };

        var sizeMask = function (mask) {
            if (typeof mask === 'string') {
                mask = Dom.get(mask);
            }

            var viewportSize = [Dom.getViewportWidth(), Dom.getViewportHeight()];
            Dom.setStyle(mask, 'width', viewportSize[0] + 'px');
            Dom.setStyle(mask, 'height', viewportSize[1] + 'px');

            var documentSize = [Dom.getDocumentWidth(), Dom.getDocumentHeight()];

            if (documentSize[0] > viewportSize[0]) {
                Dom.setStyle(mask, 'width', documentSize[0] + 'px');
            }
            if (documentSize[1] > viewportSize[1]) {
                Dom.setStyle(mask, 'height', documentSize[1] + 'px');
            }

            var overlay = Dom.get('mask-overlay');

            if (overlay) {
                centerOverlay(overlay);
            }
        };

        var drawMaskContent = function (url, args) {
            var handleSuccess = function (o) {
                var body = document.getElementsByTagName('body')[0];

                var overlay = document.createElement('div');
                overlay.id = 'mask-overlay';
                Dom.setStyle(overlay, 'opacity', 0);

                var top = document.createElement('div');
                top.className = 'top';
                overlay.appendChild(top);

                var content = document.createElement('div');
                content.id = 'mask-content';
                content.className = 'content';
                overlay.appendChild(content);

                var bottom = document.createElement('div');
                bottom.className = 'bottom';
                overlay.appendChild(bottom);

                body.appendChild(overlay);
                centerOverlay(overlay);

                var myAnim = new Anim(overlay, { opacity: { to: 1}}, .25, YAHOO.util.Easing.easeIn);
                myAnim.onComplete.subscribe(function () {
                    content.innerHTML = o.responseText;
                    MCA.Ajax.evalScripts(content);
                }, this, true);
                myAnim.animate();
            };

            if(args) {
                url = url + '?' + args;
            }
            YAHOO.util.Connect.asyncRequest('GET', url, {success: handleSuccess});
        };

        var removeMask = function () {
            var mask = Dom.get('mask');
            Dom.setStyle(mask, 'display', 'none');
            isMaskActive = false;
        };

        var fadeMask = function() {
            var mask = Dom.get('mask');
            var myAnim = new Anim(mask, {opacity: {to: 0}}, .25, YAHOO.util.Easing.backBoth);
            myAnim.onComplete.subscribe(removeMask, this, true);
            myAnim.animate();
        };

        var removeMaskOverlay = function() {
            var maskOverlay = Dom.get('mask-overlay');
            document.body.removeChild(maskOverlay);
            fadeMask();
        };

        return {
            showMask: function(url, args) {
                if (isMaskActive) return;

                isMaskActive = true;
                var mask = Dom.get('mask');
                Dom.setStyle(mask, 'opacity', 0);
                Dom.setStyle(mask, 'display', 'block');

                sizeMask(mask);

                var myAnim = new Anim(mask, {opacity: {to: .5}}, .25, YAHOO.util.Easing.backBoth);
                myAnim.onComplete.subscribe(function () {
                    drawMaskContent(url, args)
                }, this, true);
                myAnim.animate();

                Event.addListener(window, 'resize', function () {
                    sizeMask(mask)
                }, null, null);
            },

            hideMask: removeMaskOverlay,

            isMaskActive: function() {
                return isMaskActive;
            },

            center: function(ele) {
                if(typeof ele === 'string') {
                    ele = Dom.get(ele);
                }
                centerOverlay(ele);
            }
        };
    };

    MCA.Ajax = {};
    MCA.Ajax.evalScripts = function (el) {
        if (typeof el === 'string') {
            el = Dom.get(el);
        }

        var scripts = el.getElementsByTagName("script");
        for (var i = 0; i < scripts.length; i++) {
            eval(scripts[i].innerHTML);
        }
    };

    MCA.util = {};
    MCA.util.JSEscape = function (string) {
        return string.replace('/\'/g', '\\\'');
    }

})();
