(function($) {
		  
$.fn.window = function(options) {
		var defaults = {						
								titlebar: false,								
								popup:false,
								draggable:false,																
								shadow:false,
								softshadow: false,								
								title:'',
								autoload:true,
								footerbar:true,
								buttons: [	{close: null} ],
								zindex:9999,
								width:'100%',
								height:null,
								loader:true,
								scroll:true,
								align:null,
								valign:null,
								overlay:true,
								onSuccess: null
				};
				
		options = $.extend({},defaults, options);
		
		return $.extend(this.each(function() {								
								$.extend($.fn.window.control,new $.ui.window(this,options));
							}),$.fn.window.control);
		
	}
	
$.fn.window.control = {
		setTitle: function(title){
				$("#box-title",this.element).html(title);
		},
		show : function(){	
							this.showWindow();
						},
		hide : function(){  
						this.hideWindow();
				},
		load: function(url,params, onsuccess, onerror){
				this.container.empty();	
				var $window = this;				
				if(this.loader){
					this.container.loader();					
				}
				this.show();
				this.container.ajaxStop(function(){
										 $window.position();
								});				
				this.container.load(url,params,onsuccess,onerror);
		},
		setContent: function(content)
		{
			this.container.empty();
			this.container.html(content);
		},
		setZindex: function(index)
		{
			this.overlayElement.css('z-index',index-1);
			$(this.element).css('z-index',index);
			this.options.zindex = index;
		}
}

$.ui.window = function(el,objOptions){
				if(!objOptions) var objOptions = {};
				this.element = el;
				this.container = null;
				this.options = {};
				$.extend(this.options, objOptions);	
				el = this.init();
				this.title(el);
				this.body(el);				
				this.footer(el);
				
				if(this.options.popup && this.options.overlay){			
					this.overlay();
					
					if(!this.options.autoload){
						this.overlayElement.hide();
					}
				}		
				
				
				this.options.initHeight = $(this.element).height(); // set initHeight for sizing
				
				this.position();
				if(this.options.draggable){		
					$(this.element).draggable({
								handle: '#box-top-title',
								scroll:true
							});
					$('#box-top-title',this.element).addClass('cursor-move');
				}
				if(this.options.scroll)
				{
					this.container.css('overflow','auto');
				}else
				{
					this.container.css('overflow','hidden');
				}
				
				
				var $window = this;
				$(window).resize( function() { 								
						 $window.position(); 
								
				});
				$(window).scroll(function(test) 
				{						
						$window.position();
				});
				if(typeof this.options.onSuccess == 'function')
				{
					this.options.onSuccess($window);
				}
}

$.extend($.ui.window.prototype, {
	init: function(){
		var el =$(this.element);
		if(this.options.popup){
			el.addClass('popup-window');						
		}
		if(!this.options.autoload){
			el.hide();
		}	
		
		if(el.html() !=""){			
			if(this.options.content == null || this.options.content==undefined)
			{
				this.options.content = new Array();
			}
			
			var test = document.getElementById(el.attr('id'));		
			this.options.content.push(el.html());
			el.empty();			
		}		
		
		if(this.options.shadow){						
			el.append(this.shadow());
			return $('#shadow-container',el);
		}
		return el;
	},
	overlay: function(){		
		$(this.element).before('<div id="'+$(this.element).attr('id')+'-overlay" name="'+$(this.element).attr('id')+'-overlay" class="overlay"></div>');
		
		this.overlayElement  = $('#'+$(this.element).attr('id')+'-overlay');
		this.overlayElement.css('z-index', this.options.zindex-1);
		
		var $window = this;
		this.overlayElement.bind('click', function(event){
			$window.hideWindow();			
		});
	},
	shadow: function(){		
			$(this.element).html('<div class="shadow shadow-top-left"><div class="shadow-top-right"><div class="shadow-top-center"></div></div></div><div class="shadow-content shadow-left"><div class="shadow-content shadow-right"><div id = "shadow-container" class="shadow-content shadow shadow-bg"></div></div></div><div class="shadow shadow-bottom-left"><div class="shadow-bottom-right"><div class="shadow-bottom-center"></div></div></div>');			
	},
	title: function(el){
			var titlebar = new String();
			if(this.options.titlebar){
				titlebar = '<div id="box-top-title" class="box-title-top-left"><div class="box-title-top-right"><div class="box-title-top-center"><div id="box-title"></div><div id="box-buttons"></div></div></div></div>';
			}else{
				titlebar = '<div id="box-top" class="box-top-left"><div class="box-top-right"><div class="box-top-center"></div></div></div>';
			}
			
			el.append(titlebar);
			
			//set close if none is set
			if(this.options.buttons!= null && this.options.buttons[0].close == null && this.options.popup)
			{
				var $window = this;
				this.options.buttons[0].close = function()
				{
					$window.hideWindow();
				}
			}
			
			if(this.options.titlebar){					
				$("#box-title",el).html(this.options.title);			
				for(var i = 0 ; i < this.options.buttons.length; i++)
				{
					var singleButton = this.options.buttons[i];						
					for(button in singleButton)
					{		
						if(singleButton[button]!=null || singleButton[button]!=undefined){							
							$("#box-buttons",$(this.element)).prepend('<a id="'+button+'" href="javascript:;"></a>');
							if(typeof(singleButton[button]) == 'function'){
								$("#box-buttons #"+button,$(this.element)).bind('click',singleButton[button]);
							}
						}
					}
				}
			}		
	},
	body: function(el){	
			el.append('<div id="box-center" class="box-center"><div class="box-center-left"><div class="box-center-right "><div id="box-content" class="box-center-content"></div></div></div></div>');
			this.container = $("#box-content",el);
			
			if(this.options.content != null || this.options.content!=undefined){					
				
				for(var i = 0 ; i < this.options.content.length; i++)
				{
					var singleContent = this.options.content[i];
					this.container.append(singleContent);
				}
								
			}			
			
	},
	footer: function(el){
			var footerbar = new String();
			if(this.options.footerbar){
				if(this.options.softshadow){
					footerbar = '<div id="box-bottom-shadow" class="box-bottom-left-shadow"><div class="box-bottom-right-shadow"><div class="box-bottom-center-shadow"></div></div></div>';
				}else{
					footerbar = '<div id="box-bottom" class="box-bottom-left"><div class="box-bottom-right"><div class="box-bottom-center"></div></div></div>';
				}
				
				
			}
			
			el.append(footerbar);
	},
	position: function(){
			var el = $(this.element);
			
			var topCss = 'margin-top';
			var leftCss = 'margin-left';
			if(this.options.alignTo == null || this.options.alignTo==undefined)
			{
				if(this.options.popup)
				{
					this.options.alignTo = $(window);
				}else{
					this.options.alignTo = el.parent();
				}						
			}			
			if(this.options.popup){
				
				var windowLeft = $(document).scrollLeft();
				var windowTop = $(document).scrollTop();
					
				if(this.options.overlay){				
					var width =	$(window).width();
					var height = $(window).height();	
					
					
						this.overlayElement.css('width',width)
										.css('height',height)
										.css('left',windowLeft)
										.css('top',windowTop);
					
				}
				topCss = 'top';
				leftCss = 'left';
				if(this.options.align==null ||this.options.align==undefined)
				{
					this.options.align = 'center';
				}
				if(this.options.valign==null ||this.options.valign==undefined)
				{				
					this.options.valign = 'center';
				}
			}
			
			if(this.options.zindex!=undefined || this.options.zindex!=null){
					el.css('z-index',this.options.zindex);
			}			
			
			if(this.options.height!=undefined || this.options.height!=null)
			{
				var height = this.options.height;
				if( height == '100%') height = $(this.options.alignTo).height() - this.options.initHeight;
				this.container.css('height',height);
			}
		
			if(this.options.width!=undefined || this.options.width!=null){
					this.options.width = (typeof(this.options.width) == 'number')? this.options.width+'px':this.options.width;				
					el.css('width',this.options.width);
			}			
				
			
			//first set alignment the custom position
			if(this.options.align!=null ||this.options.align!=undefined){
				var alignObjWidth = $(this.options.alignTo).width();
				var thisObjWidth = el.width();
				var left;				
				
				switch(this.options.align.toLowerCase()){							
					case 'center': left = Math.ceil((alignObjWidth/2) - (thisObjWidth/2));
						break;
					case 'right': left = alignObjWidth - thisObjWidth;
						break;
					case 'left': 
						default:left = 0;
				}					
				
				
					el.css(leftCss,(left+windowLeft));
				
			}
			
			if(this.options.valign!=null ||this.options.valign!=undefined){
				var alignObjHeight = $(this.options.alignTo).height();
				var thisObjHeight = el.height();
				var top;
				
				
				switch(this.options.valign.toLowerCase()){							
					case 'center': top = Math.ceil((alignObjHeight/2) - (thisObjHeight/2));
						break;
					case 'top': top = 0;
						break;
					case 'bottom':
						default:top = alignObjHeight - thisObjHeight;
				}
				
				
					el.css(topCss,(top+windowTop));
				
				
							
			}
			
			//set custom position
			if(this.options.left!=undefined || this.options.left!=null)
			{
					el.css(leftCss,this.options.left);
			}
			if(this.options.top!=undefined || this.options.top!=null)
			{
					el.css(topCss,this.options.top);
			}			
				
	},
	loader : $.fn.loader,
	hideWindow: function(){
		
			//reset title if overridden by setTitle
			$("#box-title",this.element).html(this.options.title);			
			this.container.empty();	
			$(this.element).hide();
			if(this.overlayElement) 
			{								
				this.overlayElement.hide();
			}			
			if(typeof this.container.cancel == 'function')
			{
				this.container.cancel();
			}
	},
	showWindow: function(){
		if($(this.element).css("display") !="block"){
			this.position();
		}
		$(this.element).show();
		if(this.overlayElement) {
			this.overlayElement.show();
		}	
	}
});
})(jQuery);
