/*!
 * jquery.overlay 1.0.1. Overlay HTML with eyecandy.
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/overlay.html
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 *
 * Launch  : March 2008
 * Version : 1.0.1 - Wed Feb 18 2009 05:18:24 GMT-0000 (GMT+00:00)
 */
(function($){
    var instances=[];
    function fireEvent(opts,name,self,arg){
        var fn=opts[name];
        if($.isFunction(fn)){
            try{
                return fn.call(self,arg);
            }catch(error){
                if(opts.alert){
                    alert("Error calling overlay."+name+": "+error);
                }else{
                    throw error;
                }
                return false;
            }
        }
        return true;
}
function Overlay(el,opts){
    var self=this;
    var trigger=null;
    var w=$(window);
    var jq=opts.target||el.attr("rel");
    var o=jq?$(jq):null;
    if(!o){
        o=el;
    }else{
        trigger=el;
    }
    var bg=o.attr("overlay");
    if(!bg){
        bg=o.css("backgroundImage");
        bg=bg.substring(bg.indexOf("(")+1,bg.indexOf(")"));
        o.css("backgroundImage","none");
        o.attr("overlay",bg);
    }
    if(!bg){
        throw"background-image CSS property not set for overlay element: "+jq;
    }
    bg=bg.replace(/\"/g,"");
    if(opts.preload){
        $(window).load(function(){
            setTimeout(function(){
                var img=new Image();
                img.src=bg;
            },2000);
        });
    }
    var oWidth=o.outerWidth({
        margin:true
    });
    var oHeight=o.outerHeight({
        margin:true
    });
    var img=$('<img src="'+bg+'"/>');
    img.css({
        border:0,
        position:'absolute'
    }).width(oWidth).hide();
    $('body').append(img);
    if(trigger){
        trigger.bind("click.overlay",function(e){
            self.load(e.pageY-w.scrollTop(),e.pageX-w.scrollLeft());
            return e.preventDefault();
        });
    }
    if(!opts.close||!o.find(opts.close).length){
        o.prepend('<div class="close"></div>');
        opts.close="div.close";
    }
    var closeButton=o.find(opts.close);
    $.extend(self,{
        load:function(top,left){
            if(self.isOpened()){
                return self;
            }
            if(opts.oneInstance){
                $.each(instances,function(){
                    this.close();
                });
            }
            if(fireEvent(opts,"onBeforeLoad",self)===false){
                return self;
            }
            top=top||opts.start.top;
            left=left||opts.start.left;
            var toTop=opts.finish.top;
            var toLeft=opts.finish.left;
            if(toTop=='center'){
                toTop=Math.max((w.height()-oHeight)/2-30,0);
            }
            if(toLeft=='center'){
                toLeft=Math.max((w.width()-oWidth)/2,0);
            }
            if(!opts.start.absolute){
                top+=w.scrollTop();
                left+=w.scrollLeft();
            }
            if(!opts.finish.absolute){
                toTop+=w.scrollTop();
                toLeft+=w.scrollLeft();
            }
            img.css({
                top:top,
                left:left,
                width:opts.start.width,
                zIndex:opts.zIndex
                }).show();
            img.animate({
                top:toTop,
                left:toLeft,
                width:oWidth
            },opts.speed,function(){
                o.css({
                    position:'absolute',
                    top:toTop,
                    left:toLeft
                });
                var z=img.css("zIndex");
                closeButton.add(o).css("zIndex",++z);
                o.fadeIn(opts.fadeInSpeed,function(){
                    fireEvent(opts,"onLoad",self);
                });
            });
            return self;
        },
        getBackgroundImage:function(){
            return img;
        },
        getContent:function(){
            return o;
        },
        getTrigger:function(){
            return trigger;
        },
        isOpened:function(){
            return o.is(":visible");
        },
        getConf:function(){
            return opts;
        },
        close:function(){
            if(!self.isOpened()){
                return self;
            }
            if(fireEvent(opts,"onClose",self)===false){
                return self;
            }
            if(img.is(":visible")){
                img.hide();
                o.hide();
            }
            return self;
        },
        getVersion:function(){
            return[1,0,0];
        },
        expose:function(){
            img.expose();
        }
    });
closeButton.bind("click.overlay",function(){
    self.close();
});
w.bind("keypress.overlay",function(evt){
    if(evt.keyCode==27){
        self.close();
    }
});
if(opts.closeOnClick){
    w.bind("click.overlay",function(evt){
        if(!o.is(":visible, :animated")){
            return;
        }
        var target=$(evt.target);
        if(target.attr("overlay")){
            return;
        }
        if(target.parents("[overlay]").length){
            return;
        }
        self.close();
    });
}
}
jQuery.prototype.overlay=function(conf){
    var api=this.eq(typeof conf=='number'?conf:0).data("overlay");
    if(api){
        return api;
    }
    var w=$(window);
    var opts={
        start:{
            top:Math.round(w.height()/2),
            left:Math.round(w.width()/2),
            width:0,
            absolute:false
        },
        finish:{
            top:'center',
            left:'center',
            absolute:false
        },
        speed:'normal',
        fadeInSpeed:'fast',
        close:null,
        oneInstance:true,
        closeOnClick:true,
        preload:true,
        zIndex:9999,
        target:null,
        alert:true
    };

    if($.isFunction(conf)){
        conf={
            onBeforeLoad:conf
        };

}
$.extend(true,opts,conf);
this.each(function(){
    var instance=new Overlay($(this),opts);
    instances.push(instance);
    $(this).data("overlay",instance);
});
return this;
};

})(jQuery);