$.fn.boxy=function(a){a=$.extend({single:true},a||{});this.each(function(){var c=this.nodeName.toLowerCase(),b=this;if(c=="a"){$(this).click(function(){var e=this,d=this.getAttribute("href"),f=$.extend(a,{title:this.title});var h=function(i){if(Boxy.cache[d]){i(Boxy.cache[d].clone())}else{if(d.indexOf("#")===0){Boxy.cache[d]=$(d).remove();i(Boxy.cache[d].clone())}else{$.ajax({url:e.href,method:a.method||"GET",dataType:"html",success:function(j){j=$(j);if(a.cache){Boxy.cache[d]=j;j=j.clone()}i(j)}})}}};var g;if(a.single&&(g=$.data(this,"active.boxy"))){h(function(i){g.setContent(i).center().show()})}else{h(function(i){$.data(e,"active.boxy",new Boxy(i,f))})}return false})}else{if(c=="form"){$(this).bind("submit.boxy",function(){Boxy.ask(a.message||"Please confirm:",["OK","Cancel"],function(d){if(d=="OK"){$(b).unbind("submit.boxy").submit()}},{modal:true,closeable:false});return false})}}})};function Boxy(b,a){this.boxy=$(this.WRAPPER);$.data(this.boxy[0],"boxy",this);this.visible=false;this.options=$.extend({title:null,closeable:true,draggable:true,clone:false,center:true,show:true,modal:false},a||{});if(this.options.modal){this.options=$.extend(this.options,{center:true,draggable:false})}this.setContent(b||"<div></div>");this._setupTitleBar();this._setupBehaviours();this.boxy.css("display","none").appendTo(document.body);this.toTop();if(this.options.center&&typeof this.options.x=="undefined"&&typeof this.options.y=="undefined"){this.center()}else{this.moveTo(this.options.x||Boxy.DEFAULT_X,this.options.y||Boxy.DEFAULT_Y)}if(this.options.show){this.show()}}$.extend(Boxy,{DEFAULT_X:50,DEFAULT_Y:50,cache:{},zIndex:1337,dragConfigured:false,dragging:null,get:function(a){var b=$(a).parents(".boxy-wrapper");return b.length?$.data(b[0],"boxy"):null},ask:function(c,f,j,l){l=$.extend({modal:true,closeable:false},l,{show:true});var e=$("<div></div>").append($('<div class="question"></div>').html(c));var a={},h=[];if(f instanceof Array){for(var d=0;d<f.length;d++){a[f[d]]=f[d];h.push(f[d])}}else{for(var b in f){a[f[b]]=b;h.push(f[b])}}var g=$('<form class="answers"></form>');g.html($.map(h,function(i){return"<input type='button' value='"+i+"' />"}).join(" "));$("input[type=button]",g).click(function(){var i=this;Boxy.get(this).hide(function(){if(j){j(a[i.value])}})});e.append(g);new Boxy(e,l)},_handleDrag:function(a){var b;if(b=Boxy.dragging){b[0].boxy.css({left:a.pageX-b[1],top:a.pageY-b[2]})}},_nextZ:function(){return Boxy.zIndex++}});Boxy.prototype={WRAPPER:"<table cellspacing='0' cellpadding='0' border='0' class='boxy-wrapper'><tr><td class='top-left'></td><td class='top'></td><td class='top-right'></td></tr><tr><td class='left'></td><td class='boxy-inner'></td><td class='right'></td></tr><tr><td class='bottom-left'></td><td class='top'></td><td class='bottom-right'></td></tr></table>",estimateSize:function(){this.boxy.css("display","none").css({top:0,left:0,visibility:"hidden"}).css("display","block");var a=this.getSize();this.boxy.css("display","none").css("visibility","visible");return a},getSize:function(){return[this.boxy.width(),this.boxy.height()]},getContentSize:function(){var a=this.getContent();return[a.width(),a.height()]},getPosition:function(){var a=this.boxy[0];return[a.offsetLeft,a.offsetTop]},getCenter:function(){var b=this.getPosition();var a=this.getSize();return[Math.floor(b[0]+a[0]/2),Math.floor(b[1]+a[1]/2)]},getInner:function(){return $(".boxy-inner",this.boxy)},getContent:function(){return $(".boxy-content",this.boxy)},setContent:function(a){a=$(a).css({display:"block"}).addClass("boxy-content");if(this.options.clone){a=a.clone()}var b=this.getContent();if(b.length){b.replaceWith(a)}else{this.getInner().append(a)}return this},moveTo:function(a,b){this.boxy.css({left:a,top:b});return this},centerAt:function(a,c){if(this.visible){var b=this.getSize()}else{var b=this.estimateSize()}this.moveTo(a-b[0]/2,c-b[1]/2);return this},center:function(){var b=$.browser.msie?[document.body.scrollLeft,document.body.scrollTop]:[window.pageXOffset,window.pageYOffset];var a=[b[0],b[1],$(window).width(),$(window).height()];this.centerAt((a[0]+a[2]/2),(a[1]+a[3]/2));return this},resize:function(b,a,d){if(!this.visible){return}var c=this._getBoundsForResize(b,a);this.boxy.css({left:c[0],top:c[1]});this.getContent().css({width:c[2],height:c[3]});if(d){d(this)}return this},tween:function(c,a,e){if(!this.visible){return}var d=this._getBoundsForResize(c,a);var b=this;this.boxy.stop().animate({left:d[0],top:d[1]});this.getContent().stop().animate({width:d[2],height:d[3]},function(){if(e){e(b)}});return this},isVisible:function(){return this.visible},show:function(){if(this.visible){return}if(this.options.modal){$('<div class="boxy-modal-blackout"></div>').css({zIndex:Boxy._nextZ(),width:$(document).width(),height:$(document).height()}).appendTo(document.body);this.toTop()}this.boxy.stop().css({opacity:1,display:"block"});this.visible=true;return this},hide:function(b){if(!this.visible){return}var a=this;if(this.options.modal){$(".boxy-modal-blackout").animate({opacity:0},function(){$(this).remove()})}this.boxy.stop().animate({opacity:0},300,function(){a.boxy.css({display:"none"});a.visible=false;if(b){b(a)}});return this},toTop:function(){this.boxy.css({zIndex:Boxy._nextZ()});return this},_getBoundsForResize:function(c,a){var b=this.getContentSize();var e=[c-b[0],a-b[1]];var d=this.getPosition();return[Math.max(d[0]-e[0]/2,0),Math.max(d[1]-e[1]/2,0),c,a]},_setupTitleBar:function(){if(this.options.title){var b=this;var a=$("<div class='title-bar'></div>").html(this.options.title);if(this.options.closeable){a.append($("<a href='#' class='close'></a>").html("[x]"))}if(this.options.draggable){if(!Boxy.dragConfigured){$(document).mousemove(Boxy._handleDrag);Boxy.dragConfigured=true}a.mousedown(function(c){b.toTop();Boxy.dragging=[b,c.pageX-b.boxy[0].offsetLeft,c.pageY-b.boxy[0].offsetTop];$(this).addClass("dragging")});a.mouseup(function(){$(this).removeClass("dragging");Boxy.dragging=null})}this.getInner().prepend(a)}},_setupBehaviours:function(){var a=this;$(".close",this.boxy).click(function(){a.hide();return false}).mousedown(function(b){b.stopPropagation()})}};