var currentAttachmentUploader;
var AttachmentUploaderKeyHandle = function(event)
{
    currentAttachmentUploader.HandleKeyPress(event);
}

function ShowAttachmentUploader(id, width, height)
{
    currentAttachmentUploader = new AttachmentUploader(id);
    currentAttachmentUploader.Init();
    currentAttachmentUploader.Show(width, height);
}


function HideAttachmentUploader(id)
{
    currentAttachmentUploader = new AttachmentUploader(id);
    currentAttachmentUploader.Init();
    currentAttachmentUploader.Hide();
}


function AttachmentUploader(id)
{
    //*** Private Members
    var divBack, divBox, divBoxLoading, divBoxBody, divBoxClose, divBoxTitle, divHidden;
    var backTimeOut = 0.35;
    var timeOutX = 0.50;
    var timeoutY = 0.50;
    var timeoutTitle = 0.35;
    var backgroundOpacity = 0.55;
    this.KeyListening = false;
    this.OnVisibleJavascript = "";


    //*** Public Methods
    this.Init = function Init()
    {
        divBack = DOM.get('AttachmentUploader_back_' + id);
        divBox = DOM.get('AttachmentUploader_box_' + id);
        divBoxLoading = DOM.get('AttachmentUploader_box_loading_' + id);
        divBoxBody = DOM.get('AttachmentUploader_box_body_' + id);
        divBoxClose = DOM.get('AttachmentUploader_box_close_' + id);
        divBoxTitle = DOM.get('AttachmentUploader_box_title_' + id);
        divHidden = DOM.get('AttachmentUploader_hidden_' + id);
    }

    this.ResizeOverlay = function ResizeOverlay()
    {
        DOM.setStyle(divBack, 'top', '0px');
        DOM.setStyle(divBack, 'left', '0px');
        DOM.setStyle(divBack, 'height', '100%');
        DOM.setStyle(divBack, 'width', '100%');

        DOM.setStyle(divBack, 'height', DOM.getDocumentHeight() + 'px');
        if (!isSafari3)
        {
            // Safari3 includes vertical scrollbar in SL.getDocumentWidth()!
            // Leave overlay width at 100% for now...
            DOM.setStyle(divBack, 'width', DOM.getDocumentWidth() + 'px');
        }
    }

    //*** Main Show call
    this.Show = function Show(width, height)
    {
        this.ResizeOverlay();
        DOM.setStyle(divBack, 'opacity', 0);
        DOM.setStyle(divBack, 'visibility', 'visible');

        var attributes = { opacity: { to: backgroundOpacity} };

        var anim = new YAHOO.util.Anim(divBack, attributes, backTimeOut, YAHOO.util.Easing.easeOut);

        var f = function()
        {
            anim.onComplete.unsubscribe(f);
            currentAttachmentUploader.Expand_Box_X(width, height);
        };
        anim.onComplete.subscribe(f, anim, true);

        anim.animate();
    }

    this.Expand_Box_X = function Expand_Box_X(t_width, t_height)
    {
        var vscroll = DOM.getDocumentScrollTop();
        var hscroll = DOM.getDocumentScrollLeft();
        var f_width = 320;
        var f_height = 120;
        var f_top = vscroll + Math.round((DOM.getViewportHeight() - f_height) / 2);
        var f_left = hscroll + Math.round((DOM.getViewportWidth() - f_width) / 2);
        var t_left = hscroll + Math.round((DOM.getViewportWidth() - t_width) / 2);

        DOM.setStyle(divBox, 'top', f_top + 'px');
        DOM.setStyle(divBox, 'left', f_left + 'px');
        DOM.setStyle(divBox, 'height', f_height + 'px');
        DOM.setStyle(divBox, 'width', f_width + 'px');
        DOM.setStyle(divBox, 'overflow-y', 'hidden');
        DOM.setStyle(divBoxBody, 'visibility', 'hidden');
        DOM.setStyle(divBoxLoading, 'visibility', 'visible');
        DOM.setStyle(divBox, 'visibility', 'visible');

        var attributes = { width: { to: t_width }, left: { to: t_left} };

        var anim = new YAHOO.util.Anim(divBox, attributes, timeOutX, YAHOO.util.Easing.easeOut);

        var f = function()
        {
            anim.onComplete.unsubscribe(f);
            currentAttachmentUploader.Expand_Box_Y(t_width, t_height);
        };
        anim.onComplete.subscribe(f, anim, true);

        anim.animate();
    }

    this.Expand_Box_Y = function Expand_Box_Y(t_width, t_height)
    {
        var vscroll = DOM.getDocumentScrollTop();
        var t_top = vscroll + Math.round((DOM.getViewportHeight() - t_height) / 2);

        var attributes = { height: { to: t_height }, top: { to: t_top} };

        var anim = new YAHOO.util.Anim(divBox, attributes, timeoutY, YAHOO.util.Easing.easeOut);

        var f = function()
        {
            anim.onComplete.unsubscribe(f);
            currentAttachmentUploader.Show_Content();
        };
        anim.onComplete.subscribe(f, anim, true);

        anim.animate();
    }

    this.Show_Content = function Show_Content()
    {
        //*** Close button
        DOM.setStyle(divBoxClose, 'top', (parseInt(DOM.getStyle(divBox, 'top'), 10) - 12) + 'px');
        DOM.setStyle(divBoxClose, 'left', (parseInt(DOM.getStyle(divBox, 'left'), 10) + parseInt(DOM.getStyle(divBox, 'width'), 10) - 14) + 'px');
        DOM.setStyle(divBoxClose, 'visibility', 'visible');

        //*** Start Listerning to Keys
        this.ListenKeys(true);

        //*** Loading text
        DOM.setStyle(divBoxLoading, 'visibility', 'hidden');

        //*** HTML Content
        divBoxBody.innerHTML = divHidden.innerHTML + " ";

        DOM.setStyle(divBoxBody, 'visibility', 'visible');
        DOM.setStyle(divBoxBody, 'overflow-y', 'auto');
        DOM.setStyle(divBoxBody, 'overflow-x', 'hidden');
        DOM.setStyle(divBoxBody, 'top', '10px');
        DOM.setStyle(divBoxBody, 'left', '10px');
        DOM.setStyle(divBoxBody, 'height', (parseInt(DOM.getStyle(divBox, 'height'), 10) - 20) + 'px');
        DOM.setStyle(divBoxBody, 'width', (parseInt(DOM.getStyle(divBox, 'width'), 10) - 20) + 'px');


        //*** Title
        var f_height = 20;
        var f_top = parseInt(DOM.getStyle(divBox, 'top'), 10);
        var t_top = f_top - f_height;

        DOM.setStyle(divBoxTitle, 'top', f_top + 'px');
        DOM.setStyle(divBoxTitle, 'left', DOM.getStyle(divBox, 'left'));
        DOM.setStyle(divBoxTitle, 'width', DOM.getStyle(divBox, 'width'));
        DOM.setStyle(divBoxTitle, 'height', f_height + 'px');
        DOM.setStyle(divBoxTitle, 'visibility', 'visible');

        var attributes = { top: { to: t_top} };

        var anim = new YAHOO.util.Anim(divBoxTitle, attributes, timeoutTitle, YAHOO.util.Easing.easeOut);

        var f = function()
        {
            anim.onComplete.unsubscribe(f);
        };
        anim.onComplete.subscribe(f, anim, true);

        anim.animate();
    }

    //*** Main Hide call
    this.Hide = function Hide()
    {
        this.ListenKeys(false);

        DOM.setStyle(divBoxClose, 'visibility', 'hidden');
        DOM.setStyle(divBoxTitle, 'visibility', 'hidden');
        DOM.setStyle(divBoxBody, 'visibility', 'hidden');
        DOM.setStyle(divBox, 'visibility', 'hidden');

        var attributes = { opacity: { to: 0} };

        var anim = new YAHOO.util.Anim(divBack, attributes, backTimeOut, YAHOO.util.Easing.easeOut);

        var f = function()
        {
            anim.onComplete.unsubscribe(f);
            DOM.setStyle(divBack, 'visibility', 'hidden');
        };
        anim.onComplete.subscribe(f, anim, true);

        anim.animate();
    }

    // start (true/false) = start or stop listerning
    this.ListenKeys = function ListenKeys(enable)
    {
        if (enable)
        {
            if (!this.KeyListening)
            {
                if (document.addEventListener)
                {
                    document.addEventListener('keydown', AttachmentUploaderKeyHandle, false);

                }
                else if (document.attachEvent)
                {
                    document.attachEvent('onkeydown', AttachmentUploaderKeyHandle);
                }

                this.KeyListening = true;
            }
        }
        else
        {
            if (this.KeyListening)
            {
                if (document.removeEventListener)
                {
                    document.removeEventListener('keydown', AttachmentUploaderKeyHandle, false);
                }
                else if (document.detachEvent)
                {
                    document.detachEvent('onkeydown', AttachmentUploaderKeyHandle);
                }
            }

            this.KeyListening = false;
        }
    }

    this.HandleKeyPress = function HandleKeyPress(e)
    {
        //Get the Key code
        var key = e.which ? e.which : e.keyCode;

        if (key == 27)
        {
            //ESC > close
            this.PreventEvent(e);
            this.Hide();
        }
    }

    this.PreventEvent = function PreventEvent(e)
    {
        //Prevents the event's default behavior.
        if (e.preventDefault)
        {
            e.preventDefault();
        }
        else
        {
            e.returnValue = false;
        }
    }
}
