/*
 * Savvy.js Extension
 * Name : Savvy.PItO (Pop-It-Out)
 * Version: 0.4
 * Required : Savvy.Core, Savvy.Animation/Savvy.Animator
 * Last Updated: 16.05.2007
 * Author: Cryno Bone http://www.chronosight.net/
 ***************************************************
*/
var PItO = function() {
	this.object 		= null;
	this.element 		= null;
	PItO.objects;
	PItO.zindex;
	this.create			= true;
	this.status 		= "";
	this.title 			= "";
	this.onclose 		= null;
	this.minimize 		= true;
	this.resize			= false;
	this.autoFocus		= false;
	this.draggable		= false;
	this.hasTab			= false;
	this.width			= 250;
	this.height			= 100;
	this.minWidth		= 100;
	this.minHeight		= 80;
	this.dock			= null;
	this.classes		= null;
	this.theme			= "";
	this.anywhereClose 	= false;
	
};
PItO.prototype = {
	Initialize : function(arg) {
		var element 	= Func.Grab(arg.obj, arg.element);
		var object 		= new Elements;
		if(Func.CheckId(element)) {
			object.Id(element);
		} else {
			object.Create("div");
			object.setProperty("id", element);
		}
		this.create		= true;
		this.object 	= object;
		this.element 	= element;
		
		var dock 		= new Elements;
		if(Func.CheckId(arg.dock)) {
			dock.Id(arg.dock);
			this.minimize 	= true;
			this.dock		= dock;
		}
		PItO.zindex 		= pick(PItO.zindex, 101);
		
		this.onclose 		= pick(arg.onclose, null);
		this.autoFocus 		= pick(arg.autoFocus, false);
		this.hasTab 		= pick(arg.hasTab, false);
		this.title 			= pick(arg.title, "");
		this.container		= pick(arg.container, null);
		this.width 			= (arg.width > 0 ? arg.width : 250);
		this.height 		= (arg.height > 0 ? arg.height : 100);
		this.minWidth 		= (arg.minWidth > 0 ? arg.minWidth : 250);
		this.minHeight 		= (arg.minHeight > 0 ? arg.minHeight : 80);
		this.zindex 		= pick(arg.zIndex, ++PItO.zindex);
		this.resize 		= pick(arg.resize, false);
		this.draggable 		= pick(arg.draggable, true);
		this.anywhereClose 	= pick(arg.anywhereClose, false);
		this.classes		= pick(arg.classes, null);
		this.block   		= pick(arg.block, null);
		
		PItO.objects		= pick(PItO.objects, []);
		PItO.objects.push(element);
		
		if(!is_null(arg.classes) && is_null(arg.theme)) {
			this.theme = null;
		} else {
			this.theme = "pito-" + pick(arg.theme, "default");
		}
		
		return this;
	},
	Show : function() {
		
		
		if(this.create == false) {
			return this;
		} else {
			var object 	= this.object;
			var d = document.body;
			var hW = d.offsetWidth.toNumber();
			var hH = d.offsetHeight.toNumber();
			var oW = this.width;
			var oH = this.height;
			var sXY = Windows.getScroll();
			var gcenter = Windows.getPositionCenter(oW, oH);
			var xS = gcenter[1];
			var yS = gcenter[0];
			
			xS = (xS < 0 ? 0 : xS);
			yS = (yS < 0 ? 0 : yS);
			
			CSS.Hide(this.object.getElement());
			
			var this_object = this;
			
			if(this.autoFocus == true) {
				
				this.object.On("click", function() {
					CSS.Opacity(this, 100);
					if(!CSS.Get(this, "zIndex") || CSS.Get(this, "zIndex") < PItO.zindex) {
						++PItO.zindex;
						CSS.Set(this, "zIndex", PItO.zindex);
					}
					for(var nit = 0; nit < PItO.objects; nit++) {
						if(PItO.objects[nit] != this_object.element) {
							var it = new Elements;
							it.Id(PItO.objects[nit]);
							CSS.Opacity(it.getElement(), 60);
						}
					}
				});
				for(var nit = 0; nit < PItO.objects; nit++) {
						if(PItO.objects[nit] != this_object.object) {
							var it = new Elements;
							it.Id(PItO.objects[nit]);
							CSS.Opacity(it.getElement(), 60);
						}
					}
			} else {
				this.object.setStyle("zIndex", this.zindex);
			}
			
			if(this.anywhereClose == true) {
				this.object.On("click", function() {
					this_object.Hide();
				});
			}
			
			if(this.title != "" && !is_null(this.theme)) {
				var oHleft = new Elements;
				oHleft.Create("div");
				oHleft.addClass(this.theme + "-header-left");
				
				var oHright = new Elements;
				oHright.Create("div");
				oHright.addClass(this.theme + "-header-right");
				
				if(Savvy.browser.ie) {
					oHleft.setStyle("top", "0");	
					oHright.setStyle("top","0");
				}
				
				var oHclose = new Elements;
				oHclose.Create("div").addClass(this.theme + "-header-close");
				oHclose.On("click", function() {
					this_object.Hide();
				}).On("mouseover", function() {
					CSS.Set(this, "backgroundPosition", "top right");
				}).On("mouseout", function() {
					CSS.Set(this, "backgroundPosition", "top left");
				});
					
				var oHmin = new Elements;
				oHmin.Create("div").addClass(this.theme + "-header-minimize");
				oHmin.On("mouseover", function() {
					CSS.Set(this, "backgroundPosition", "top right");
				}).On("mouseout", function() {
					CSS.Set(this, "backgroundPosition", "top left");
				});
					
				var oHtitleH2 = new Elements;
				oHtitleH2.Create("h2").addTextDOM(this.title);
				
				var oHtitle	= new Elements;
				oHtitle.Create("div").addClass(this.theme + "-header-title");
				oHtitle.addDOM(oHclose.getElement()).addDOM(oHmin.getElement()).addDOM(oHtitleH2.getElement());
				
				var oHeader = new Elements;
				oHeader.Create("div").addClass(this.theme + "-header");
				oHeader.addDOM(oHleft.getElement()).addDOM(oHright.getElement()).addDOM(oHtitle.getElement());
				
				var oWrapper = new Elements;
				oWrapper.Create("div").addClass(this.theme + "-wrapper");
				oWrapper.setProperty("id", this.element + "-wrapper");
					
				if(this.minimize === true) {
					oHmin.On("click", function() {
						this_object.AddToDock();
						CSS.Hide(this_object.object.getElement());
					});
				} else {
					oHmin.setStyle("cursor", "normal");
				}
				
				var oContentleft = new Elements;
				oContentleft.Create("div").addClass(this.theme + "-content-left");
				
				var oContentright = new Elements;
				oContentright.Create("div").addClass(this.theme + "-content-right");
				
				var oContentEntry = new Elements;
				oContentEntry.Create("div").addClass(this.theme + "-content-entry");
				oContentEntry.setStyle("height", (oH - 53) + "px");
				
				if(this.hasTab == false) {
					oContentEntry.setStyles([{
						"overflow":"auto",
						"padding":"0 3px",
						"background":"#fff",
						"border":"1px solid #B6B3A4"
					}]);
				} else {
					oContentEntry.setStyles([{
						"overflow":"hidden",
						"background":"transparent",
						"padding":"0 0px"
					}]);
				}
				
				var oContentBlock = new Elements;
				oContentBlock.Create("div").addClass(this.theme + "-content-block");
				oContentBlock.addDOM(oContentEntry.getElement());
				
				var oContent = new Elements;
				oContent.Create("div").addClass(this.theme + "-content");
				oContent.addDOM(oContentBlock.getElement());
				
				if(!is_null(this.block)) {
					oContentEntry.setProperty("id", this.block);
				}
				
				var oFooterleft = new Elements;
				oFooterleft.Create("div").addClass(this.theme + "-footer-left");
				
				var oFooterright = new Elements;
				oFooterright.Create("div").addClass(this.theme + "-footer-right");
				oFooterright.setProperty("id", this.element + "_Resizable");
				
				if(this.resize == true) {
					try {
						Resizable.init({
							obj:oFooterright.getElement(),
							objRoot:this_object.object.getElement(),
							minX:this_object.minWidth,
							minY:this_object.minHeight
						});
					} catch(e) { }
				} else {
					oFooterright.setStyles([{
						"cursor":"normal",
						"background":"transparent"
					}]);
				}
				
				oWrapper.addDOM(oContentleft.getElement());
				oWrapper.addDOM(oContentright.getElement());
				oWrapper.addDOM(oContent.getElement());
				oWrapper.addDOM(oFooterleft.getElement());
				oWrapper.addDOM(oFooterright.getElement());
				this.object.addDOM(oHeader.getElement());
				this.object.addDOM(oWrapper.getElement());
				
				if(is_null(this.theme)) {
					this.object.addClass(this.classes);
				} else {
					this.object.addClass(this.theme);
				}
					
				CSS.Show(this.object.getElement());
					
				if(this.draggable === true) {
					if(!is_null(oHeader.getElement())) { 
						try {
							Draggable.Initialize({
								obj:oHeader.getElement(),
								objRoot:this_object.object.getElement()
							});
						} catch(e) { }
					} else {
						try {
							Draggable.Initialize({
								obj:this_object.object.getElement()
							});
						} catch(e) { }
					}
				}
				
				this.object.setStyles([{
					"position":"absolute",
					"top":yS+"px",
					"left":xS+"px",
					"width":oW+"px",
					"height":oH+"px"
				}]);
			}
			this.status = "Loaded";
			
			if(this.autoFocus == true) {
				this.TopIt();
			}
			return this;
		}
	},
	Hide : function() {
		var f = this.onclose;
		var d = document.body;
		
		if(f != null && typeof(f) == "function") {
			Func.Callback(this, f());
		}
		
		DOM.Remove(this.object.getElement().parentNode, this.object.getElement());
		
		try {
			this.object = null;
			this.element = null;
			
			var arry = PItO.object;
			var deindex = arry.indexOf(this.element);
			arry.splice(deindex, 1);
			PItO.object = arry;
		} catch(e) {}
		
		this.status = "Closed";
	},
	AddToDock : function() {
		var this_object = this;
		var li = new Elements;
		li.Create("li");
		var a = new Elements;
		a.Create("a").setProperties({
			"href":"javascript:void(0);",
			"title":this.title
		}).addTextDOM(this.title);
		a.On("click", function() {
			DOM.Remove(li.getElement());
			this_object.RemoveFromDock();
		});
		
		li.addDOM(a.getElement());
		this.dock.addDOM(li.getElement());
	},
	RemoveFromDock : function() {
		CSS.Show(this.object.getElement());
	},
	TopIt : function() {
		this.object.setStyle("zIndex", PItO.zindex);
		++PItO.zindex;
	}
};