jQuery.fn.ddLightbox = function() {
    var id_prefix       = 'dd_lightbox_';
    var args            = arguments[0] || {};
    var caller          = this;
    var close           = false;
    var reloadParent    = false;
    var removeOnClose   = false;
    var hideOverlay     = false;
    var width           = 600;
    var height          = 400;
    var opacity         = 0.6;

    if (typeof(args.close) != 'undefined') {
        if (args.close == true) {
            close = true;
        }
    }

    if (typeof(args.reloadParent) != 'undefined') {
        if (args.reloadParent == true) {
            reloadParent = true;
        }
    }

    if (typeof(args.removeOnClose) != 'undefined') {
        if (args.removeOnClose == true) {
            removeOnClose = true;
        }
    }

    if (typeof(args.hideOverlay) != 'undefined') {
        if (args.hideOverlay == true) {
            hideOverlay = true;
        }
    }

    if (typeof(args.width) != 'undefined') {
        if (parseInt(args.width) > 0) {
            width = parseInt(args.width);
        }
    }

    if (typeof(args.height) != 'undefined') {
        if (parseInt(args.height) > 0) {
            height = parseInt(args.height);
        }
    }

    if (typeof(args.opacity) != 'undefined') {
        if (args.opacity > 100) {
            opacity = 1;
        } else if (args.opacity < 0) {
            opacity = 0;
        } else {
            opacity = parseInt(args.opacity) / 100;
        }
    }

    if (typeof(window.top.dd) == 'undefined') {
        window.top.dd           = [];
        window.top.dd['tree']   = [];
        window.top.dd['active'] = [];
    }

    var tree    = window.top.dd['tree'];
    var active  = window.top.dd['active'];

    if (close == true) {
        if (active.length >= 1) {
            var currentNum  = active[active.length-1];
            var currentId   = id_prefix + currentNum;

            if (reloadParent == true) {
                var parentNum   = tree[currentNum];
                var parentId    = id_prefix + parentNum;

                if (parentNum > 0) {
                    window.top.frames[parentId + '_iframe'].location.reload();
                } else {
                    window.top.location.reload();
                }

                removeLightbox(currentId);
            } else {
                hideLightbox(currentId);
            }
        } else {
            hideLightbox(currentId);
        }

        return false;
    }

    caller.each(function() {
        var url = $(this).attr('href');
        $(this).bind('click.createLightbox', function () { createLightbox($(this), url) });
        $(this).attr('href', '#')
    });


    function createLightbox(caller, url)
    {
        var num             = $(window.top.document.body).find('div.lightbox').length+1
        var id              = id_prefix + num;
        var lightbox        = '<div class="lightbox"></div>';
        var overlay         = '<div class="overlay"></div>';
        var container       = '<div class="container"></div>';
        var content         = '<div class="content"></div>';
        var close           = '<div class="close"></div>';
        var iframe          = '<iframe frameborder="0"></iframe>';

        var cornerTL        = '<div class="corner corner_top_left"></div>';
        var cornerTR        = '<div class="corner corner_top_right"></div>';
        var cornerBL        = '<div class="corner corner_bottom_left"></div>';
        var cornerBR        = '<div class="corner corner_bottom_right"></div>';
        var cornerFTL       = '<div class="corner_fill_top_left"></div>';
        var cornerFTR       = '<div class="corner_fill_top_right"></div>';
        var cornerFBL       = '<div class="corner_fill_bottom_left"></div>';
        var cornerFBR       = '<div class="corner_fill_bottom_right"></div>';

        caller          = caller.unbind('click.createLightbox');
        caller          = caller.bind('click.showLightbox', function () { showLightbox(id) });
        iframe          = $(iframe).attr('src', url);
        iframe          = $(iframe).attr('width', width);
        iframe          = $(iframe).attr('height', height);
        iframe          = $(iframe).attr('id', id + '_iframe');
        iframe          = $(iframe).attr('name', id + '_iframe');

        content         = $(content).width(width);
        content         = $(content).height(height);
        container       = $(container).width(width);
        container       = $(container).css('margin-top', '-' + Math.ceil((height / 2)) + 'px');
        container       = $(container).css('margin-left', '-' + Math.ceil((width / 2)) + 'px');
        lightbox        = $(lightbox).height($(document).height());

        content         = $(content).append(iframe);
        container       = $(container).append(content);
        container       = $(container).append(cornerTL);
        container       = $(container).append(cornerTR);
        container       = $(container).append(cornerBL);
        container       = $(container).append(cornerBR);
        container       = $(container).append(cornerFTL);
        container       = $(container).append(cornerFTR);
        container       = $(container).append(cornerFBL);
        container       = $(container).append(cornerFBR);
        container       = $(container).append(close);
        overlay         = $(overlay).css('opacity', opacity);

        if (hideOverlay == true) {
            $(overlay).hide();
        }

        $(lightbox).append(overlay);
        $(lightbox).append(container);
        $(lightbox).css('height', '100%');

        $(window.top.document.body).
            append($('<div>').append(lightbox.attr('id', id)).html()).
            find('div#' + id).
            find('div.close').
            click(function() {
                if (reloadParent == true) {
                    removeLightbox(id);
                    location.reload();
                } else if (removeOnClose == true) {
                    removeLightbox(id);
                    $(caller).bind('click.createLightbox', function () {
                        createLightbox($(caller), url)
                    });
                } else {
                    hideLightbox(id);
                }
            });

        if (active.length == 0) {
            addToTree(num, 0);
        } else {
            addToTree(num, (active[active.length-1]));
        }

        setCurrent(num);
        return false;
    }


    function removeLightbox(id)
    {
        removeCurrent();
        removeFromTree(getNumFromId(id));
        removeChildren(getNumFromId(id));

        $(window.top.document.body).find('div#' + id).remove();
        return false;
    }


    function removeChildren(num)
    {
        for(var i in tree) {
            if (tree[i] == num) {
                removeLightbox(id_prefix + num);
            }
        }
    }


    function showLightbox(id)
    {
        $(window.top.document.body).find('div#' + id).show();
        setCurrent(getNumFromId(id));
        return false;
    }


    function hideLightbox(id)
    {
        $(window.top.document.body).find('div#' + id).hide();
        removeCurrent();
        return false;
    }


    function addToTree(num, parent)
    {
        tree[num]               = parent;
        window.top.dd['tree']   = tree;
    }


    function removeFromTree(num)
    {
        tree.splice(num, 1);
        window.top.dd['tree'] = tree;
    }


    function setCurrent(num)
    {
        active.push(num);
        window.top.dd['active'] = active;
    }


    function removeCurrent()
    {
        active                  = active.slice(0,-1);
        window.top.dd['active'] = active;
    }


    function getNumFromId(id)
    {
       return id.split('_').pop();
    }

    return false;
}