/*
 * SimpleModal 1.2.3 - jQuery Plugin
 * http://www.ericmmartin.com/projects/simplemodal/
 * Copyright (c) 2009 Eric Martin
 * Dual licensed under the MIT and GPL licenses
 * Revision: $Id: jquery.simplemodal.js 185 2009-02-09 21:51:12Z emartin24 $
 */
(function($)
{
	var ie6=$.browser.msie&&parseInt($.browser.version)==6&&typeof window['XMLHttpRequest']!="object",ieQuirks=null,w=[];
	$.modal=function(data,options)
	{
		return $.modal.impl.init(data,options);
	};
	$.modal.close=function()
	{
		$.modal.impl.close();
	};
	$.fn.modal=function(options)
	{
		return $.modal.impl.init(this,options);
	};
	$.modal.defaults={opacity:50,overlayId:'simplemodal-overlay',overlayCss:{},containerId:'simplemodal-container',containerCss:{},
		dataCss:{},zIndex:1000,close:true,closeHTML:'<a class="modalCloseImg" title="Close"></a>',closeClass:'simplemodal-close',
		position:null,persist:false,onOpen:null,onShow:null,onClose:null};
	$.modal.impl={
		opts:null,dialog:{},
		init:function(data,options)
		{
			if(this.dialog.data)
			{
				return false;
			}
			ieQuirks=$.browser.msie&&!$.boxModel;
			this.opts=$.extend({},$.modal.defaults,options);
			this.zIndex=this.opts.zIndex;
			this.occb=false;
			if(typeof data=='object')
			{
				data=data instanceof jQuery?data:$(data);
				if(data.parent().parent().size()>0)
				{
					this.dialog.parentNode=data.parent();
					if(!this.opts.persist)
					{
						this.dialog.orig=data.clone(true);
					}
				}
			}
			else if(typeof data=='string'||typeof data=='number')
			{
				data=$('<div/>').html(data);
			}
			else
			{
				alert('SimpleModal Error: Unsupported data type: '+typeof data);
				return false;
			}
			this.dialog.data=data.addClass('simplemodal-data').css(this.opts.dataCss);
			data=null;
			this.create();
			this.open();
			if($.isFunction(this.opts.onShow))
			{
				this.opts.onShow.apply(this,[this.dialog]);
			}
			return this;
		},
		create:function()
		{
			w=this.getDimensions();
			if(ie6)
			{
				this.dialog.iframe=$('<iframe src="javascript:false;"/>').css($.extend(this.opts.iframeCss,{display:'none',opacity:0,position:'fixed',height:w[0],width:w[1],zIndex:this.opts.zIndex,top:0,left:0})).appendTo('body');
			}
			this.dialog.overlay=$('<div/>').attr('id',this.opts.overlayId).addClass('simplemodal-overlay').css($.extend(this.opts.overlayCss,{display:'none',opacity:this.opts.opacity/100,height:w[0],width:w[1],position:'fixed',left:0,top:0,zIndex:this.opts.zIndex+1})).appendTo('body');
			this.dialog.container=$('<div/>').attr('id',this.opts.containerId).addClass('simplemodal-container').css($.extend(this.opts.containerCss,{display:'none',position:'fixed',zIndex:this.opts.zIndex+2})).append(this.opts.close?$(this.opts.closeHTML).addClass(this.opts.closeClass):'').appendTo('body');
			this.setPosition();
			if(ie6||ieQuirks)
			{
				this.fixIE();
			}
			this.dialog.container.append(this.dialog.data.hide());
		},
		bindEvents:function()
		{
			var self=this;
			$('.'+this.opts.closeClass).bind('click.simplemodal',function(e)
			{
				e.preventDefault();self.close();
			});
			$(window).bind('resize.simplemodal',function()
			{
				w=self.getDimensions();
				self.setPosition();
				if(ie6||ieQuirks)
				{
					self.fixIE();
				}
				else
				{
					self.dialog.iframe&&self.dialog.iframe.css({height:w[0],width:w[1]});
					self.dialog.overlay.css({height:w[0],width:w[1]});
				}
			});
		},
		unbindEvents:function()
		{
			$('.'+this.opts.closeClass).unbind('click.simplemodal');
			$(window).unbind('resize.simplemodal');
		},
		fixIE:function()
		{
			var p=this.opts.position;
			$.each([this.dialog.iframe||null,this.dialog.overlay,this.dialog.container],function(i,el)
			{
				if(el)
				{
					var bch='document.body.clientHeight',bcw='document.body.clientWidth',bsh='document.body.scrollHeight',
					bsl='document.body.scrollLeft',bst='document.body.scrollTop',bsw='document.body.scrollWidth',
					ch='document.documentElement.clientHeight',cw='document.documentElement.clientWidth',
					sl='document.documentElement.scrollLeft',st='document.documentElement.scrollTop',s=el[0].style;
					s.position='absolute';
					if(i<2)
					{
						s.removeExpression('height');
						s.removeExpression('width');
						s.setExpression('height',''+bsh+' > '+bch+' ? '+bsh+' : '+bch+' + "px"');
						s.setExpression('width',''+bsw+' > '+bcw+' ? '+bsw+' : '+bcw+' + "px"');
					}
					else
					{
						var te,le;
						if(p&&p.constructor==Array)
						{
							var top=p[0]?typeof p[0]=='number'?p[0].toString():p[0].replace(/px/,''):el.css('top').replace(/px/,'');
							te=top.indexOf('%')==-1?top+' + (t = '+st+' ? '+st+' : '+bst+') + "px"':parseInt(top.replace(/%/,''))+' * (('+ch+' || '+bch+') / 100) + (t = '+st+' ? '+st+' : '+bst+') + "px"';
							if(p[1])
							{
								var left=typeof p[1]=='number'?p[1].toString():p[1].replace(/px/,'');
								le=left.indexOf('%')==-1?left+' + (t = '+sl+' ? '+sl+' : '+bsl+') + "px"':parseInt(left.replace(/%/,''))+' * (('+cw+' || '+bcw+') / 100) + (t = '+sl+' ? '+sl+' : '+bsl+') + "px"';
							}
						}
						else
						{
							te='('+ch+' || '+bch+') / 2 - (this.offsetHeight / 2) + (t = '+st+' ? '+st+' : '+bst+') + "px"';
							le='('+cw+' || '+bcw+') / 2 - (this.offsetWidth / 2) + (t = '+sl+' ? '+sl+' : '+bsl+') + "px"';
						}
						s.removeExpression('top');
						s.removeExpression('left');
						s.setExpression('top',te);
						s.setExpression('left',le);
					}
				}
			});
		},
		getDimensions:function()
		{
			var el=$(window);
			var h=$.browser.opera&&$.browser.version>'9.5'&&$.fn.jquery<='1.2.6'?document.documentElement['clientHeight']:el.height();
			return[h,el.width()];
		},
		setPosition:function()
		{
			var top,left,hCenter=(w[0]/2)-((this.dialog.container.height()||this.dialog.data.height())/2),vCenter=(w[1]/2)-((this.dialog.container.width()||this.dialog.data.width())/2);
			if(this.opts.position&&this.opts.position.constructor==Array)
			{
				top=this.opts.position[0]||hCenter;
				left=this.opts.position[1]||vCenter;
			}
			else
			{
				top=hCenter;
				left=vCenter;
			}
			this.dialog.container.css({left:left,top:top});
		},
		open:function()
		{
			this.dialog.iframe&&this.dialog.iframe.show();
			if($.isFunction(this.opts.onOpen))
			{
				this.opts.onOpen.apply(this,[this.dialog]);
			}
			else
			{
				this.dialog.overlay.show();
				this.dialog.container.show();
				this.dialog.data.show();
			}
			this.bindEvents();
		},
		close:function()
		{
			if(!this.dialog.data){return false;}
			if($.isFunction(this.opts.onClose)&&!this.occb)
			{
				this.occb=true;
				this.opts.onClose.apply(this,[this.dialog]);
			}
			else
			{
				if(this.dialog.parentNode)
				{
					if(this.opts.persist)
					{
						this.dialog.data.hide().appendTo(this.dialog.parentNode);
					}
					else
					{
						this.dialog.data.remove();
						this.dialog.orig.appendTo(this.dialog.parentNode);
					}
				}
				else
				{
					this.dialog.data.remove();
				}
				this.dialog.container.remove();
				this.dialog.overlay.remove();
				this.dialog.iframe&&this.dialog.iframe.remove();
				this.dialog={};
			}
			this.unbindEvents();
		}
	};
})(jQuery);
