/**
 *  Context box 
 *  @author michal.senk@siteone.cz
 *  @require yui/yahoo-dom-event.js
 *  @require css/contextbox.css
 *	@param type tooltip|form|info Zda se jedna pouze o tooltip automaticky se vytvori mensi padding, zarovna se nahoru a prida listener na zmizeni boxu pri mouseOutu
 *	@param boxClassName string Unikatni boxClassName pro box
 *	@param string boxClassNames jinych Context boxu oddelene strednikem, ktere se otevrenim tohoto zavrou, pise nebo nepise se tam i vlastni boxClassName
 */
 
 function ContextBox(type, boxClassName, rewritingBoxClassNames ){
	
	
	/* ==== public vars ===================================================== */
	
	try {
		var Dom = YAHOO.util.Dom;
		var Ev = YAHOO.util.Event;
	} catch (e){
		alert('Missing yahoo-dom-event.js');
	}
	
	var that = this;
			
	this.type = type;
	this.boxClassName = boxClassName;
	this.rewritingBoxClassNames = rewritingBoxClassNames;
	this.contextBoxBaseClassName = 'ctxBox';
	this.contextBox = null;
	this.isOpen = false;
	this.color = "blue";
	this.holderElement = Dom.get("contentHolder");
	
	/* optional params */
	this.openFunction = null;
	this.beforeCloseFunction = null;
	this.confirmFunction = null;
	
	
	
	/* ==== private vars ===================================================== */
	
	var isIE = navigator.userAgent.indexOf("MSIE")>(-1);
	var isIE6 = (navigator.userAgent.indexOf("MSIE 6")>(-1) && navigator.userAgent.indexOf("MSIE 7")<(0) && navigator.userAgent.indexOf("MSIE 8")<(0));
	var isOpera = navigator.userAgent.indexOf("Opera")>(-1);

	/* kill all popups */
	var openedContentBoxes = Dom.getElementsByClassName("ctxBox");
	for (var x=0;x<openedContentBoxes.length; x++){
		openedContentBoxes[x].parentNode.removeChild(openedContentBoxes[x]);
	}


	/* ====================================== Private methods ================ */

	/**
	 * Close boxes
	 * zmaze vsechny popupy z pole rewritingBoxClassNames
	 */
	 
	var closeRequredPopups = function(){
		var rewritingBoxClassNames = that.rewritingBoxClassNames.split(";");
		if (rewritingBoxClassNames.length>0){
			for (var x=0;x<rewritingBoxClassNames.length;x++){
				var boxes = Dom.getElementsBy(function(elem){return (Dom.hasClass(elem,rewritingBoxClassNames[x]))},'div',document.body);
				if (boxes.length>0){
					for (var f=0;f<boxes.length;f++){
						Ev.purgeElement(boxes[f],true);
						boxes[f].parentNode.removeChild(boxes[f]);
					}
				}
			}
		}
	}
	
	
	/**
	 *	Metoda smazani elementu
	 *
	 **/
	var closeBox = function(contextBox){
		contextBox.parentNode.removeChild(contextBox);
	}
	
	/**
	 * Vytvoreni boxu
	 * 	@param int contextBoxHeight
	 *	@param int contextBoxWidth
	 *  @param string html
	 *	@return {box,content}
	 */
	var CreateContainer = function(contextBoxHeight,contextBoxWidth,html){
		
		closeRequredPopups();
		
		// vytvorim kontextBox
		var contextBox = document.createElement('div');
		contextBox.className = that.contextBoxBaseClassName+" "+that.boxClassName;
		Dom.setStyle(contextBox,'visibility','hidden');
		Dom.setStyle(contextBox,'position','absolute');
		document.body.appendChild(contextBox);
		
		// rozdelime padding na tooltip a contextbox a form
		var contextData = document.createElement("div");
		contextData.id = "contextData";
	
		switch(that.type){
			case "tooltip":
				Dom.addClass(contextData,'ctxPaddingTooltip');	
			break;
			case "info":
				Dom.addClass(contextData,'ctxPaddingMenu');	
				
				contextBoxHeight = contextBoxHeight+50;
				
				// closer button
				var closer = document.createElement('a');
				closer.className = 'closerButton';
				contextBox.appendChild(closer);
				Ev.addListener(closer,'click', function(e){
															Ev.stopEvent(e);
															contextBox.parentNode.removeChild(contextBox);
														}
													);
				
			break;
			case "form":
				Dom.addClass(contextData,'ctxPaddingMenu');	
				
				// closer button
				var closer = document.createElement('a');
				closer.className = 'closerButton';
				contextBox.appendChild(closer);
				Ev.addListener(closer,'click', function(e){
															Ev.stopEvent(e);
															contextBox.parentNode.removeChild(contextBox);
														}
													);
				
			break;
		}
		
		contextBox.appendChild(contextData);
		
		//set size aby se box nemenil velikosti okna
		Dom.setStyle(contextBox, 'height',contextBoxHeight+'px');
		Dom.setStyle(contextBox, 'width',contextBoxWidth+'px');
		
		// vlozeni stinovacich elementu
		var imgsElems = Array();
		imgsElems[0] = document.createElement('b');
		imgsElems[0].className="cntxlt";
		imgsElems[1] = document.createElement('b');
		imgsElems[1].className="cntxt";
		Dom.setStyle(imgsElems[1],'width',contextBoxWidth+'px');
		imgsElems[2] = document.createElement('b');
		imgsElems[2].className="cntxrt";
		imgsElems[3] = document.createElement('b');
		imgsElems[3].className="cntxr";
		Dom.setStyle(imgsElems[3],'height',contextBoxHeight+'px');
		imgsElems[4] = document.createElement('b');
		imgsElems[4].className="cntxbr";
		imgsElems[5] = document.createElement('b');
		imgsElems[5].className="cntxb";		
		Dom.setStyle(imgsElems[5],'width',contextBoxWidth+'px');
		imgsElems[6] = document.createElement('b');
		imgsElems[6].className="cntxbl";	
		imgsElems[7] = document.createElement('b');
		imgsElems[7].className="cntxl";
		Dom.setStyle(imgsElems[7],'height',contextBoxHeight+'px');
		
		for (var d=0;d<imgsElems.length;d++){
			imgsElems[d].alt="";
			contextBox.appendChild(imgsElems[d]);
		}
		
		//fill HTML
		contextData.innerHTML = html
		that.contextBox = contextBox;
		this.box = contextBox;
		this.content = contextData;
		this.closer = closer;
		
	}
	
	/**
	 * Data pro kontextBox
	 * @param string  HTML
	 * @return {contextBoxWidth,contextBoxHeight}
	 */
 
	var DataSizerFiller = function (html){
		
		var placer = document.createElement('div');
		document.body.appendChild(placer);
		Dom.setStyle(placer,'position','absolute');
		Dom.setStyle(placer,'top','-10000px');
		Dom.setStyle(placer,'left','-10000px');
		Dom.setStyle(placer,'width','1000px');
		Dom.setStyle(placer,'height','1000px');
		
		var sizerContainer = document.createElement('div');
		Dom.addClass(sizerContainer, that.boxClassName);
		Dom.addClass(sizerContainer, 'ctxBox');
		placer.appendChild(sizerContainer);
		Dom.setStyle(sizerContainer,'float','left');
		
		sizerContainer.innerHTML = html;
		
		this.html = html;
		this.contextBoxWidth = sizerContainer.offsetWidth+10;
		this.contextBoxHeight = sizerContainer.offsetHeight;
		
		placer.parentNode.removeChild(placer);
	}
	
	/**
	 *	Nastaveni pozice a sipky k boxu
	 *	@param side top|left|bottom|right|null
	 *
	 */
	var setPosition = function(position, node, contextBox){
	
		var nodeData = Dom.getRegion(node);
		
		if (isOpera){
			var iebody=(document.compatMode && document.compatMode != "BackCompat")? document.documentElement : document.body
			var dsoctop=document.all? iebody.scrollTop : pageYOffset
			nodeData.top = nodeData.top+dsoctop;
		}
		
		// Automaticke zarovnani podle that.holderElement =====================
		
		var nodeRegion = Dom.getRegion(node);
		var holderRegion = Dom.getRegion(that.holderElement);
		var contextBoxWidth = contextBox.offsetWidth;
		// je v prave casti
		if (nodeRegion.left>(holderRegion.left+(holderRegion.width-300))){
			autoPosition = "left";
		// je v leve casti
		} else {
			autoPosition = "right";
		}
		// ====================================================================

		// jednoduchy tooltip 
		if (that.type=="tooltip"){
			
			if (position=="bottom"){
				position = "tooltipbottom";	
			} else {
				position = "tooltip";
			}
			
		// automaticky zarovnava doleva a doprava podle nadrazeneho elementu	
		} else if (position=="auto"){
			position = autoPosition;
			
		} else if (position==null && that.type != "tooltip"){
			position = "right";
		}
		
		switch(position){
			case "top":
				var cur = document.createElement('div');
				cur.className = "cur-bottom";
				contextBox.appendChild(cur);
				Dom.setStyle(contextBox, 'top',nodeData.top-(contextBox.offsetHeight+20)+'px');
				Dom.setStyle(contextBox, 'left',(nodeData.right-(nodeData.width/2)-(contextBox.offsetWidth/2)-10)+'px');				
			break;
			case "left":
				var cur = document.createElement('div');
				cur.className = "cur-right";
				contextBox.appendChild(cur);
				Dom.setStyle(contextBox, 'top',nodeData.top-(((contextBox.offsetHeight/100)*15)-10)+'px');
				Dom.setStyle(contextBox, 'left',nodeData.left-(contextBox.offsetWidth+25)+'px');								
			break;
			case "middle":
				var cur = document.createElement('div');
				
				switch(autoPosition){
					case "right":
						cur.className = "cur-left";
						Dom.setStyle(cur,'top','50%');
						contextBox.appendChild(cur);
						Dom.setStyle(contextBox, 'top',nodeData.top+(nodeData.height/2)-((contextBox.offsetHeight/100)*50)+'px');
						Dom.setStyle(contextBox, 'left',nodeData.left+(((nodeData.width/100)*50)+30)+'px');								
					break;
					case "left":
						cur.className = "cur-right";
						Dom.setStyle(cur,'top','50%');
						contextBox.appendChild(cur);
						Dom.setStyle(contextBox, 'top',nodeData.top+(nodeData.height/2)-((contextBox.offsetHeight/100)*50)+'px');
						Dom.setStyle(contextBox, 'left',nodeData.left-(((nodeData.width/100)*50)+100)+'px');								
					break;
				}

			break;
			case "bottom":
				var cur = document.createElement('div');
				cur.className = "cur-top";
				contextBox.appendChild(cur);
				Dom.setStyle(contextBox, 'top',nodeData.bottom+30+'px');
				Dom.setStyle(contextBox, 'left',(nodeData.right-(nodeData.width/2)-(contextBox.offsetWidth/2)-10)+'px');				
			break;
			case "right":
				var cur = document.createElement('div');
				cur.className = "cur-left";
				contextBox.appendChild(cur);
				Dom.setStyle(contextBox, 'top',nodeData.top-(((contextBox.offsetHeight/100)*15)-10)+'px');
				Dom.setStyle(contextBox, 'left',nodeData.left+nodeData.width+25+'px');
			break;
			case "tooltip":
				var cur = document.createElement('div');
				cur.className = "cur-tool";
				contextBox.appendChild(cur);
				Dom.setStyle(contextBox, 'top',nodeData.top-(contextBox.offsetHeight+20)+'px');
				Dom.setStyle(contextBox, 'left',(nodeData.right-(nodeData.width/2)-(contextBox.offsetWidth/2)-10)+'px');				
			break;
			case "tooltipbottom":
				var cur = document.createElement('div');
				cur.className = "cur-tool";
				contextBox.appendChild(cur);
				Dom.setStyle(contextBox, 'top',(nodeData.bottom+15)+'px');
				Dom.setStyle(contextBox, 'left',(nodeData.right-(nodeData.width/2)-(contextBox.offsetWidth/2)-10)+'px');				
			break;
		}
		
	}
	
	/* ====================================== Public methods ================ */
	
	/**
	 *	Vytvori ContextBox
	 *	@param domElement u ktereho se vytvori
	 *	@param html se zdroji
	 *	@param position top|left|bottom|right|middle|null
	 *  @param openFunction - Optional funkce ktera se vykona po otevreni okna
	 *  @param okFunction - Optional funkce ktera se vykona po odoukejovani okna
	 *	
	 */
	this.createContextBox = function(fromElem,html,position){
		
		var ContentData = new DataSizerFiller(html);
		var BoxData = new CreateContainer(ContentData.contextBoxHeight, ContentData.contextBoxWidth, ContentData.html);
		
		this.ContextBox = BoxData.box;
		setPosition(position, fromElem, BoxData.box);
		
		Dom.setStyle(BoxData.box,'visibility','visible');
		
		if (typeof(this.openFunction)=="function"){
			this.openFunction();
		}
		
		// confirm that shit ========================================
		
			// confirm funcrion =========================================
			
			var confirmF = function(e){
				Ev.stopEvent(e);
				if (typeof(that.confirmFunction)=="function"){
					that.confirmFunction(fromElem);
				}
			}
		
		
		var okButton = Dom.getElementsByClassName("confirmButton","a",BoxData.box);
		if (okButton){
			Ev.addListener(okButton, 'click', confirmF);
		}
		
		//===========================================================	
		
		// closing function =========================================
		
		var closingFunction = function(e){
			Ev.stopEvent(e);
			try {
				BoxData.box.parentNode.removeChild(BoxData.box);
			} catch (ex){
			}
		}
		
		//===========================================================	
		
		if (that.type == "tooltip"){
			Ev.addListener(fromElem,'mouseout', closingFunction);
		} else {
			Ev.addListener(BoxData.closer,'click', closingFunction);
		}
		
	}
	
	/**
	 *	Killnu boxik 
	 *
	 */
	this.kill = function(e){
		e?Ev.stopEvent(e):true;
		
		var cBox = Dom.getElementBy(function(elem){return (Dom.hasClass(elem,'ctxBox') && Dom.hasClass(elem,that.boxClassName))}, 'div');
		if (cBox.parentNode){
			cBox.parentNode.removeChild(cBox);			
		}

		
	}
	 
	 
 }