var jBoxNumber=0;

$.bbBox = function (options) {
	var o = $.extend({}, $.bbBox.defaults, options);
	var jBox, overlay, jBoxContent, jBoxTitle, newContent, jBoxButtonline, jLoader;
	var initialPagesize;
	var oldScrollX=0,oldScrollY=0;
	var newWidth, newHeight, innerHtml, heightaddition = 0;
			var marginLeft,marginRight,marginTop,marginBottom;
var originalsizeX,originalsizeY;
	var thisJBoxNumber =jBoxNumber;
	jBoxNumber++;
	//alert($.bbBox.openBoxes.length);
	openBox();

	function openBox(){
		if ($("#overlay").length==0){
			$(document.body).append('<div id="overlay"></div>');
		}
		overlay=$("#overlay");
		if (o.modal){
			overlay.click(function(){blinkBack();});
			}	else {
			overlay.click(function(){closeBox();});
			}
		initialPagesize = getPageSize();
		overlay.css({width:initialPagesize[0], height:initialPagesize[1]});
		overlay.fadeTo(0,0.01);
		$("select").hide();
		overlay.fadeTo(o.fadeInSpeed, o.backgroundOpacity);
		var border = (o.jBoxBorder) ? (" border: " + o.jBoxBorder + ";") : "" ;
		var jBoxContentTag = (o.html) ? "iframe" : "div" ;
		var closeButton = (o.buttons.closeButton) ? '<a href="javascript:void(0)" class="jBoxCloseButton '+o.closeButtonClass+'"></a>' : '' ;
		$(document.body).append('<div class="jBox" style="margin:0;'+border+'" jBoxNumber="'+thisJBoxNumber+'">'+closeButton+'<div class="jBoxTitle" ></div><'+jBoxContentTag+' name="jBoxContentFrame" class="jBoxContent"><div class="jBoxLoadingImage"><img src="' + o.fileLoadingImage + '" alt=""/></div></'+jBoxContentTag+'><div class="jBoxButtonline"></div></div>');
		jBox=$(".jBox[jBoxNumber='"+thisJBoxNumber+"']");
		jBoxContent=jBox.find(".jBoxContent");
		if (typeof o.contentpadding =="number") {jBoxContent.css("padding",o.contentpadding+"px");}
		if (o.contentborder !=false ) {jBoxContent.css("border",o.contentborder);}
		jBoxTitle=jBox.find(".jBoxTitle");
		jBoxButtonline=jBox.find(".jBoxButtonline");
		jBoxContent.css("background",o.contentBG);
		if (o.boxBG) jBox.css("background",o.boxBG);
		preload();
	}
		
	function getCompleteMargin(jObj1,jObj2,direction){
		var margin = parseInt(jObj1.css("padding"+direction));
		margin += parseInt(jObj1.css("border"+direction+"Width"));
		margin += parseInt(jObj1.css("margin"+direction));
		margin += parseInt(jObj2.css("padding"+direction));
		margin += parseInt(jObj2.css("border"+direction+"Width"));
		margin += parseInt(jObj2.css("margin"+direction));
		return (margin);
	}
	
		
	function preload(){
		var scrolls = getPageScroll();
		oldScrollX = scrolls[0];
		oldScrollY = scrolls[1];
		
			$(document.body).append('<div id="jBoxLoaderContainer'+thisJBoxNumber+'" class="jBox" style="display:inline;position:absolute; left:-10000px;top:-10000px; width:auto; height:auto;"><div id="jBoxLoader" name="jBoxLoader" class="jBoxContent" ></div></div');
			
			var jLoaderContainer = $('#jBoxLoaderContainer'+thisJBoxNumber);
			//alert(jLoaderContainer
			jLoader=jLoaderContainer.find("#jBoxLoader");
			if (typeof o.contentpadding =="number") {jLoader.css("padding",o.contentpadding+"px");} 
			marginLeft = getCompleteMargin(jLoader,jLoaderContainer,"Left");
			marginRight = getCompleteMargin(jLoader,jLoaderContainer,"Right");
			marginTop = getCompleteMargin(jLoader,jLoaderContainer,"Top");
			marginBottom = getCompleteMargin(jLoader,jLoaderContainer,"Bottom");
			jLoader.remove();
			jLoaderContainer.remove();
		
		
		
		
		
		
		if ( (o.buttons.okButton) || (o.userButtons) || (o.buttons.cancelButton) ){heightaddition=45;}else{jBoxButtonline.hide();}
		if (o.title){heightaddition +=45}
		
		var pagesize = getPageSize();// 0-1 documentgröße; 2-3 windowgröße;
		if ((o.width==false || o.height==false)||(o.width=="auto" || o.height=="auto")){
			originalsizeX=1400; originalsizeY=1000;
			if(o.ajax){
				$(document.body).append('<div id="jBoxLoader'+thisJBoxNumber+'" name="jBoxLoader" class="jBoxContent" style="position:absolute; left:-10000px;top:-10000px; width:auto; height:auto; display:block;" ></div>');
				jLoader=$("#jBoxLoader"+thisJBoxNumber);
				if (typeof o.contentpadding =="number") {jLoader.css("padding",o.contentpadding+"px");} 				
				jLoader.load(o.ajax, function(data){
					originalsizeX= (o.width) ? o.width : jLoader.width();
					originalsizeY= (o.height) ? o.height : jLoader.height();
					
					newWidth=Math.min(parseInt(pagesize[2]-marginLeft-marginRight),originalsizeX);
					newHeight=Math.min(parseInt(pagesize[3]-marginTop-marginBottom-heightaddition),originalsizeY);
					jLoader.remove();
					loadContent();
				});
			}
			
			if(o.html){
					newWidth=parseInt(pagesize[2]-marginLeft-marginRight);
					newHeight=parseInt(pagesize[3]-marginTop-marginBottom-heightaddition);
					loadContent();
				}
			
			if(o.msg){
				$(document.body).append('<div id="jBoxLoader'+thisJBoxNumber+'" name="jBoxLoader" class="jBoxContent" style="position:inline; left:0;top:0; width:auto; height:auto;" >'+o.msg+'</div>');
				jLoader=$("#jBoxLoader"+thisJBoxNumber);
				if (typeof o.contentpadding =="number") {jLoader.css("padding",o.contentpadding+"px");} 
				originalsizeX= (o.width) ? o.width : jLoader.width()+10;
				originalsizeY= (o.height) ? o.height : jLoader.height()+20;
				//alert("");
				jLoader.remove();
				
				newWidth=Math.min(parseInt(pagesize[2]-marginLeft-marginRight),originalsizeX);
				newHeight=Math.min(parseInt(pagesize[3]-marginTop-marginBottom-heightaddition),originalsizeY);
				
				loadContent();
			}
		} else {
			
			newWidth=Math.min(parseInt(pagesize[2]-marginLeft-marginRight),o.width);
			newHeight=Math.min(parseInt(pagesize[3]-marginTop-marginBottom-heightaddition),o.height);
			originalsizeX=o.width;
			originalsizeY=o.height;
			
			
			loadContent();
		}
		
		
	}	
		
	
	function loadContent(){
		
		if(o.errorReporter){
				jBox.css({borderColor: "#C00"});
		}
		if(o.title){
			jBoxTitle.animate({height:"1px"},0);
			//jBoxTitle.css("color", jBoxContent.css("background-color"));
			jBoxTitle.animate({height: "1.2em" },o.fadeInSpeed, function(){
					 jBoxTitle.html(o.title);
					 //jBoxTitle.css({color: "#333333"});
			});
		}
		
		var showButtonLine=false;
		var buttonLineTable = '<table style="margin:0 auto; width:auto; height:20px; padding:0px;" cellspacing="0" celpadding="0"><tr>';
		if (o.buttons.okButton){
			showButtonLine=true;
			buttonLineTable +='<td><a class="okButton" href="javascript:void(0)">OK</a></td>';
		}
		if (o.userButtons){
			showButtonLine=true;
			$.each(o.userButtons, function(){
				buttonLineTable +='<td><a class="'+this.id+'" href="javascript:void(0)">' + this.value + '</a></td>';
			});
		}
		if (o.buttons.cancelButton){
			showButtonLine=true;
			var t = "Abbrechen";
			if (o.buttons.cancelText) t  =o.buttons.cancelText;
			buttonLineTable +='<td><a class="cancelButton" href="javascript:void(0)">'+t+'</a></td>';
		}
		buttonLineTable +='</tr></table>';
		standardfocus = (o.focusObj) ? o.focusObj : jBoxContent ;
		
		if(showButtonLine==true){
			jBoxButtonline.animate({height: "1px"},0);
			//jBoxButtonline.css("color", jBoxContent.css("background-color"));
			jBoxButtonline.animate({height: 25},o.fadeInSpeed, function(){
				jBoxButtonline.append(buttonLineTable);																			 				
				if (o.userButtons){
					$.each(o.userButtons, function(){
						var transfer = this.action;
						jBox.find("."+this.id).click(function(){ 
							var a=transfer();
							if (a) {closeBox();} else{blinkBack();}
							return false;
						});
						standardfocus =  $("."+this.id) ;
					});
				}
				
				if (o.buttons.cancelButton){
					jBox.find(".cancelButton").click(function(){
						var a = true;
						if(typeof o.buttons.cancelButton == "function"){a=o.buttons.cancelButton(); }
						if (a) {closeBox();} else {blinkBack();}
						return false;
					});
					standardfocus =  $(".cancelButton") ;
				}
				if (o.buttons.okButton){
					jBox.find(".okButton").click(function(){
						var a = true;
						if(typeof o.buttons.okButton == "function"){a=o.buttons.okButton(); }
						if (a) {closeBox();} else {blinkBack();}
						return false;
						
					});
					standardfocus =  $(".okButton") ;
				}
			});	
		}
		var containerheight = newHeight + heightaddition;
		var scrolls = getPageScroll();
		var ps = getPageSize();
		jbMarginCLeft = parseInt((ps[2]/2)+scrolls[0]);
		jbMarginCTop =parseInt((ps[3]/2)+scrolls[1]);
		jbMarginLeft = parseInt(jbMarginCLeft-newWidth/2);
		jbMarginTop =parseInt(jbMarginCTop-containerheight/2);
		
		jBox.animate({left: jbMarginCLeft+"px", top:jbMarginCTop+"px"},0);
		//jBoxContent.css("color", jBoxContent.css("backgroundColor"));
		jBox.css({width: "32px", height: "32px"});
		jBoxContent.animate( {height: newHeight+"px"},o.fadeInSpeed);
		jBox.animate( {left: jbMarginLeft+"px", top:jbMarginTop+"px", width: newWidth+"px", height: containerheight+"px"},o.fadeInSpeed, function(){		

			
	
	
			if (o.buttons.closeButton){
					jBox.find(".jBoxCloseButton").click(function(){
						var a = true;
						if(typeof o.buttons.closeButton == "function"){a=o.buttons.closeButton(); }
						if (a) {closeBox();} else {blinkBack();}
						return false;
					});
					standardfocus =  $(".cancelButton") ;
				}


			$(window).scroll(rescroll);	
			$(window).resize(reposition);
			if(o.msg){jBoxContent.html(o.msg); addClosingClasses();}
			if(o.html){
				jBoxContent.attr('src', o.html);
				jBoxContent.css({overflow:"scroll"});
				addClosingClasses();
				}
			if(o.ajax){
				jBoxContent.load(o.ajax, function(data){
					addClosingClasses();
				});
			}
			
			//jBoxContent.css({color: "#333333"});
			if (o.focusObj) {standardfocus =  $(o.focusObj);}
			standardfocus.focus();
			standardfocus.select();
			if (o.callback) o.callback();	
			if (o.resizable) {jBox.resizable({handles:"n,ne,e,se,s,sw,w,nw", alsoResize:jBoxContent, minWidth:150, minHeight:100, stop:function(){
																															  originalsizeX = jBox.width();originalsizeY=jBoxContent.height();
																															  }});}
			if (o.draggable) {jBox.draggable({cancel:".jBoxContent", containment:"document", stop:function(){
																															  originalsizeX = jBox.width();originalsizeY=jBoxContent.height();
																															  }});}

		});

		
	}
		this.getOptions = function(){return (o);}
		
		this.getBox = function(){
			return jBox;
			}
		
		function addClosingClasses(){
			if (o.classForClosingBox){
				//alert(o.classForClosingBox);
					jBox.find("."+o.classForClosingBox).css("cursor","pointer");
					jBox.find("."+o.classForClosingBox).click(function(){
																	   
						var a = true;
						if(typeof o.closeClassAction == "function"){a=o.closeClassAction(); }
						if (a) {closeBox();} else {blinkBack();}
						return false;
					});
					standardfocus =  jBox.find("."+o.classForClosingBox).eq(0) ;
				}
			
			}
		
		function rescroll(){
				
				overlay.css("display","none");
				jBox.css("display","none");
				var scrolls = getPageScroll();
				var ps = getPageSize();
				overlay.css("display","block");
								jBox.css("display","block");

						overlay.css({width:ps[0], height:ps[1]});

				jbMarginLeft=parseInt(jBox.css("left"));
				jbMarginTop =parseInt(jBox.css("top"));
				
				newWidth=Math.min(parseInt(ps[2]-marginLeft-marginRight),originalsizeX);
				newHeight=Math.min(parseInt(ps[3]-marginTop-marginBottom-heightaddition),originalsizeY);
				var containerheight = newHeight + heightaddition;
				
				if(o.rescroll){
				var newx = jbMarginLeft-oldScrollX+scrolls[0];
				var newy = jbMarginTop-oldScrollY+scrolls[1];
				jbMarginLeft=Math.max(0,newx);
				jbMarginTop=Math.max(0,newy);
				
				jbMarginLeft=Math.min(ps[2]+scrolls[0]-newWidth-10,newx);
				jbMarginTop=Math.min(ps[3]+scrolls[1]-containerheight-10,newy);
				}
				oldScrollX = scrolls[0];
				oldScrollY = scrolls[1];
				jBox.animate( {left: jbMarginLeft+"px", top:jbMarginTop+"px", width: newWidth+"px", height: containerheight+"px"},0);
				jBoxContent.animate( {height: newHeight+"px"},0);

			}
			function reposition(){
				rescroll();
				rescroll();
				rescroll();

			}
			
		this.blinkBack = function(){blinkBack();}
		function blinkBack(){
			var bg = overlay.css("backgroundColor");
			overlay.fadeTo(o.alertSpeed,o.alertOpacity, function(){
				overlay.css("backgroundColor", o.alertColor);
				overlay.fadeTo(o.alertSpeed,o.backgroundOpacity, function(){
									overlay.css("backgroundColor", bg);									  
																		  });
				
			});
			
		}
		
	function getPageSize() {
		var d = $(document), w = $(window);
		var jqueryPageSize = new Array(d.width(),d.height(), w.width(), w.height());
		//var jqueryPageSize = new Array(1920,1200, 1920, 1200);
		return jqueryPageSize;
	};
	
	function getPageScroll() {
		var xScroll=0, yScroll=0;
		if (self.pageYOffset) {
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){  // Explorer 6 Strict
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {// all other Explorers
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;
		}
		var arrayPageScroll = new Array(xScroll,yScroll);
		return arrayPageScroll;
	};
	
	function fadeIn(){
		}
	
	this.closeJBox = function(){closeBox()};
	
	function closeBox(){
		//alert();
		var scrolls = getPageScroll();
		var ps = getPageSize();
		jbMarginCLeft = parseInt((ps[2]/2)+scrolls[0]-28);
		jbMarginCTop =parseInt((ps[3]/2)+scrolls[1]-28);
		jBoxContent.add(jBoxButtonline).add(jBoxTitle).html("");
		if(o.title) jBoxTitle.slideUp(o.fadeInSpeed);
		//jBoxContent.slideUp(o.fadeInSpeed);
		var objects = jBoxContent;
		if(o.buttons) objects.add(jBoxButtonline);
		if(o.title) objects.add(jBoxTitle);
		if(o.buttons.closeButton) jBox.find(".jBoxCloseButton").hide();
		//alert(objects.length);
		objects.animate({width:"1px", 
					 height:"1px"
					 },o.fadeInSpeed);
		jBox.animate({width:"4px", 
					 height:"4px",
					 left: jbMarginCLeft+"px",
					 top: jbMarginCTop+"px"
					 },o.fadeInSpeed);
		overlay.fadeOut(o.fadeInSpeed, function(){
			overlay.remove(); 
			jBox.remove();
			$("select").show();
			if (o.closeBoxCallback) o.closeBoxCallback();
		});
		
	}
	
	
	
}

$.bbBox.openBoxes = [];

$.bbBox.defaults = {
	//css defaults
	//fileLoadingImage 		: "images/loading.gif",
	defaultWidth			: 280,
	defaultHeight			: 130,
	defaultIFrameW			: "70%",
	defaultIFrameH			: "70%",
	backgroundOpacity 		: 0.8,
	fadeInSpeed				: 200,
	alertOpacity 			: 0.3,
	alertSpeed 				: 10,
	alertColor				: "#FF0000",
	contentBG				: "#fff",
	//contentpadding			: 10,
	//contentborder			: false,
	rescroll				: false,
	//output options
	width					: false,
	height					: false,
	modal 					: false,
	errorReporter			: false,
	focusObj				: false,
	callback				: false,
	closeButtonClass		: false,
	closeClassAction		: false,
	closeBoxCallback		: false,
	//content
	title 					: false,		//String
	//msg 					: "",			//String
	ajax					: false, 		//html link
	html					: false,	//html link
	pics					: false,		// $-Object oder Json-Object im Format {{src:"", title:""},{...},...}
	//Buttons
	/*buttons					: { 
		okButton			: false,		//false - true - oder Format {value="", action=""} 
		cancelButton		: true,			//false - true - oder Format {value="", action=""} 
		closeButton			: false,			//false - true - oder Format {value="", action=""} 
		okText				: "OK",
		cancelText			: "Abbrechen"
	},*/
	buttons:false, 
	classForClosingBox: "jBoxLBClose",
	msg:false,
	contentpadding:10, 
	contentborder:"0px none",
	fileLoadingImage:"images/loading_white_48.gif",
	userButtons				: false, 		// Format {{id="", value="", action=""},{}} mit action = function() mit return-wert
	resizable				: false,
	draggable				: false
};
