//author: 			Bjoern Sellnau @ PIXELTEX
//project:			SlideBoxed - Lightboxed SlideShow
//description:	    this is the main js file
//added:			23-01-2009
//modified:			30-06-2009
//=====================================================
//*** NAMESPACES ***
	if(!gadmin) var gadmin={};
	if(!gadmin.slideBoxed) gadmin.slideBoxed={};
	if(!gadmin.utils) gadmin.utils={};
	if(!gadmin.dom) gadmin.dom={};
	if(!gadmin.browser) gadmin.browser={};

//=====================================================
//*** VARIABLES ***
	gadmin.slideBoxed.IE6SHIM_ELEMENT = undefined;
	
//=====================================================
//*** METHODS ***
	gadmin.slideBoxed.show = function(e,options)
	{	gadmin.browser.detect();
		var evt = (e) ? e : ((window.event) ? window.event : "");
		var target = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : "");
		var currentTarget = (evt.currentTarget) ? evt.currentTarget : ((this) ? this : "");
		
		if(target.getAttribute('rel').indexOf('slideboxed:') != -1)
		{

			document.body.old_overflow = document.body.style.overflow;
			document.body.style.overflow = "hidden";

			var html = document.getElementsByTagName('html');
			html = html[0];
			
			html.old_overflow = html.style.overflow;
			html.style.overflow = "hidden";

			var slideboxedName = target.getAttribute('rel');
					slideboxedName = slideboxedName.slice(11);

			var sourceElement = document.getElementById("slideboxed_"+slideboxedName);							//slideboxed_testGadmin4 (div)
			var sourceInnerElement = gadmin.slideBoxed.getNextSlideShowContainer(sourceElement);		 //slideshowContainer (div)
			var SourceInnerDiv = gadmin.slideBoxed.getNextSlideShowContainer(sourceInnerElement);     //fd_block1 (div)
			var sourceEmbedObject = gadmin.slideBoxed.getNextEmbedObject(SourceInnerDiv);							 //embed or alternative content
			var sourceNoFlashObject = gadmin.slideBoxed.getNextNoFlashObject(SourceInnerDiv);					 //<a> with noFlash image
//E1	var sourceInnerElement = document.getElementById("slideshowContainer");


		//flash detected
			if(sourceEmbedObject && sourceEmbedObject.tagName == "EMBED")
			{
				var oldHeight = sourceEmbedObject.getAttribute('height');
				var oldWidth = sourceEmbedObject.getAttribute('width');
			} 
			else if(sourceEmbedObject && sourceEmbedObject.tagName == "OBJECT")
			{
		//flash detected
				var oldHeight = sourceEmbedObject.getAttribute('height');
				var oldWidth = sourceEmbedObject.getAttribute('width');			
			}
			else if(sourceNoFlashObject && sourceNoFlashObject.tagName == "A")
			{
		//noFlash Content
				var oldHeight = options.noFlashHeight || 420;
				var oldWidth = options.noFlashWidth || 400;		
			}
			else 
			{
		//alternative content
				var oldHeight = options.alternativeHeight || 420;
				var oldWidth = options.alternativeWidth || 400;		
			}
			var newHeight = Number(oldHeight)+32
			var newWidth = Number(oldWidth)+10;
            var offset = document.getElementsByTagName('html')[0].scrollTop;
            if(offset == 0)
            {
                offset = document.getElementsByTagName('body')[0].scrollTop;
            }

			var cover = document.createElement("div");
			cover.id = "slideboxed_darkLayer"
			cover.style.height = gadmin.slideBoxed.getStageHeight()+"px";
			cover.style.width = gadmin.slideBoxed.getStageWidth()+"px";
			cover.style.position = "absolute";
			//Firefox2 has Problems with CSS Opacity on Mac.
			if(gadmin.slideBoxed.detectMacXFF2())
			{
			cover.style.backgroundImage= "url(/img/slideboxed/macff2bghack.png)";
    	cover.style.backgroundRepeat="repeat";
			} else {
			cover.style.backgroundColor = "#000000"	
			cover.style.MozOpacity=0.75; 		//mozilla
			cover.style.KhtmlOpacity=0.75;
			cover.style.opacity=0.75;
			cover.style.filter="Alpha(opacity=75)";
			}
			cover.style.zIndex = 5000;	//replace later by a function.
			cover.style.top = offset+0+"px";
			cover.style.left = "0px";
					
			//test
//E1	document.body.insertBefore(cover,document.body.firstChild);
			gadmin.addListener("click",gadmin.slideBoxed.hide,cover,true);
		
			//this fixes IE6/IE7 errors !
			document.body.appendChild(cover);
		
			//ok we have detected the IE6 Browser.
			if(gadmin.browser.isIE7 == false && gadmin.browser.isIE == true)
			{	var iframeShim = document.createElement( 'iframe' );
				iframeShim.id = "gadmin_slideboxed_ie6shim";		
				iframeShim.setAttribute( 'frameBorder', '0' );
				iframeShim.style.position = "absolute";
				iframeShim.zIndex = 5001;	//behind the pane element.
				iframeShim.filter="Alpha(opacity=0)";
	
				iframeShim.style.height = newHeight+"px";
				iframeShim.style.width = newWidth+"px";
				iframeShim.style.top = offset+((gadmin.slideBoxed.getStageHeight()-newHeight)/2)+"px";
				iframeShim.style.left = ((gadmin.slideBoxed.getStageWidth()-newWidth)/2)+"px";
	
				gadmin.slideBoxed.IE6SHIM_ELEMENT = iframeShim;
				document.body.appendChild(iframeShim);
			}
	
			var box = document.createElement("div");
			box.id = "slideboxed_box";
			
			box.style.height = newHeight+"px";
			box.style.width = newWidth+"px";

			box.style.backgroundColor = "#ffffff"	
			box.style.marginLeft = "0px";
			box.style.marginTop = "0px";
			box.style.position = "absolute";
			
//		alert("StageWidth: "+gadmin.slideBoxed.getStageWidth())
//		alert("StageHeight: "+gadmin.slideBoxed.getStageHeight())
			
//		alert("Height "+newHeight)
//		alert("Width "+newWidth)
			

			box.style.top = offset+((gadmin.slideBoxed.getStageHeight()-newHeight)/2)+"px";
			box.style.left = ((gadmin.slideBoxed.getStageWidth()-newWidth)/2)+"px";
			box.innerHTML = SourceInnerDiv.innerHTML;

			box.style.zIndex = 5002;

			box.style.border = "2px solid #525252";
			box.style.textAlign = "center";
			//cover.style.MozOpacity=0.75; 		//mozilla
			//cover.style.KhtmlOpacity=0.75;
			//cover.style.opacity=0.75;
			//cover.style.filter="Alpha(opacity=75)";
			//cover.style.zIndex = 5000;	//replace later by a function.
			//cover.style.top = "0px";
			//cover.style.left = "0px";

			var tbox = document.createElement("div");
			tbox.id = "slideboxed_toolbar";

			tbox.style.width = Number(oldWidth)-5+"px";

			tbox.style.height = "18px";
			tbox.style.marginTop = "5px";
			tbox.style.marginLeft = "5px";
			tbox.style.marginRight = "5px";
			tbox.style.backgroundColor = "#ddeae6";	
			tbox.style.textAlign = "right";
			tbox.style.paddingTop = "2px";
			tbox.style.paddingRight = "5px";
			tbox.style.borderTop = "1px solid #dfdfdf";
			tbox.style.borderBottom = "1px solid #cccccc";
			tbox.style.display = "block";
			tbox.innerHTML = "<a style='cursor:pointer;' href='#' onclick='gadmin.slideBoxed.hide({target:this});return false;'>close</a>";
			
			box.insertBefore(tbox,box.firstChild);
					
//E1	document.body.insertBefore(box,document.body.childNodes[1]);


			//this fixes IE6/IE7 errors !
			document.body.appendChild(box);			 
		}
		
	}
	gadmin.slideBoxed.hide = function(e)
	{
		var evt = (e) ? e : ((window.event) ? window.event : "");
		var target = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : "");
		var currentTarget = (evt.currentTarget) ? evt.currentTarget : ((this) ? this : "");

		var boxLayer = document.getElementById('slideboxed_box');
		boxLayer.parentNode.removeChild(boxLayer);

		var darkLayer = document.getElementById('slideboxed_darkLayer');
		darkLayer.parentNode.removeChild(darkLayer);

		if(gadmin.slideBoxed.IE6SHIM_ELEMENT != undefined)
		{
			gadmin.slideBoxed.IE6SHIM_ELEMENT.parentNode.removeChild(gadmin.slideBoxed.IE6SHIM_ELEMENT);
			gadmin.slideBoxed.IE6SHIM_ELEMENT = undefined;
		}

		if(document.body.old_overflow != undefined)
		{
				document.body.style.overflow = document.body.old_overflow;
				document.body.old_overflow = undefined;
		}


		var html = document.getElementsByTagName('html');
		html = html[0];

		if(html.old_overflow != undefined)
		{
			html.style.overflow = html.old_overflow;
			html.old_overflow = undefined;		
		}
	}
	
	gadmin.slideBoxed.getStageWidth = function()
	{
		var sizeObj = gadmin.slideBoxed.getWindowSize();
		return sizeObj.width;
	}
	gadmin.slideBoxed.getStageHeight = function()
	{
		var sizeObj = gadmin.slideBoxed.getWindowSize();
		return sizeObj.height;
	}

//thanks to http://jakeo.org	
	gadmin.slideBoxed.detectMacXFF2 = function()
	{
	  var userAgent = navigator.userAgent.toLowerCase();
	  if (/firefox[\/\s](\d+\.\d+)/.test(userAgent)) {
	    var ffversion = new Number(RegExp.$1);
	    if (ffversion < 3 && userAgent.indexOf('mac') != -1) {
	      return true;
	    }
	  }
}	
	
	//find the next available slideshow container.
	gadmin.slideBoxed.getNextSlideShowContainer = function(startElement)
	{
		var element = startElement;
		var currChildIndex = 0;		
		var currElement = element.childNodes[currChildIndex];
		var currChildIndex= 0;			
					
		for(currChildIndex=0;currChildIndex<=element.childNodes.length-1;currChildIndex++)
		{
			var currChild = element.childNodes[currChildIndex];
			if(currChild.tagName == "DIV" && currChild.nodeType == 1 && currChild.id != undefined)
			{
				return currChild;
			}
		}			
	}
	
	//find the next available embedobject container.
	gadmin.slideBoxed.getNextEmbedObject = function(startElement)
	{
		var element = startElement;
		var currChildIndex = 0;		
		var currElement = element.childNodes[currChildIndex];
		var currChildIndex= 0;			
					
		for(currChildIndex=0;currChildIndex<=element.childNodes.length-1;currChildIndex++)
		{
			var currChild = element.childNodes[currChildIndex];
			if((currChild.tagName == "EMBED" || currChild.tagName == "OBJECT") && currChild.nodeType == 1)
			{
				return currChild;
			}
		}			
	}	

	//find the next available embedobject container.
	gadmin.slideBoxed.getNextNoFlashObject = function(startElement)
	{
		var element = startElement;
		var currChildIndex = 0;		
		var currElement = element.childNodes[currChildIndex];
		var currChildIndex= 0;			
					
		for(currChildIndex=0;currChildIndex<=element.childNodes.length-1;currChildIndex++)
		{
			var currChild = element.childNodes[currChildIndex];
			if(currChild.tagName == "A" && currChild.nodeType == 1 && currChild.style.backgroundImage.indexOf('http://www.myswitzerland.com/flashtag/getflash') != -1)
			{
				return currChild;
			}
		}			
	}	
	
gadmin.slideBoxed.getWindowSize = function(win) 
{ 
    if(!win) win = window; 
    var s = new Object(); 
    if(typeof win.innerWidth != 'undefined') 
    { 
        s.width = win.innerWidth; 
        s.height = win.innerHeight; 
    } 
    else 
    { 
         var obj = gadmin.slideBoxed.getBodyType(win); 
         s.width = parseInt(obj.clientWidth); 
         s.height = parseInt(obj.clientHeight); 
    } 
    return s; 
} 
//////////////////////////////////////////////////////////// 
// Der IE hat 2 verschiedene Objekte für den strict und quirks Mode. 
gadmin.slideBoxed.getBodyType=function(w) 
{ 
    return (w.document.compatMode && w.document.compatMode == "CSS1Compat") ? w.document.documentElement : w.document.body || null; 
}  
		
//=============================================================
//*** Event-System
//=============================================================
	
	if(!gadmin.addListener)
	{
		gadmin.addListener = function(eventType, handler, ele, capture)
		{
//	$INFO("\n*** gadmin.addListener::ADDING EVENT-LISTENER ***");
//	$INFO("-> ELEMENT: ");
//	$INFO(ele);
//	$INFO("-> EVENT: ");
//	$INFO(eventType);
//	$INFO("-> HANDLER: ");
//	$INFO(handler.toString());
//	$INFO("***\n");
	//$INFO("adding eventHandler to element '"+ele+"' event: '"+eventType+"' handler: '"+toString(handler)+"'");
	
			try
			{
				if (ele.addEventListener)
					ele.addEventListener(eventType, handler, capture);
				else if (ele.attachEvent)
					ele.attachEvent("on" + eventType, handler);
				}
			catch (e) {}		
		}	
	
		gadmin.removeListener = function(eventType, handler, ele, capture)
		{
			if(gadmin.debug)
			alert("removing eventHandler from element '"+ele+"' event: '"+eventType+"' handler: '"+toString(handler)+"'");
	
			try
			{
				if (ele.removeEventListener)
					ele.removeEventListener(eventType, handler, capture);
				else if (ele.attachEvent)
					ele.detachEvent("on" + eventType, handler);
				}
			catch (e) {}		
		}
	}	
//=============================================================
//*** Document Object Model
//=============================================================

/* this method from douglas crockford walks through the whole DOM tree and call a function on each node */
gadmin.dom.walkTheDOM = function(node,func)
{
	func(node);
	node = node.firstChild;
	while(node)
	{
		gadmin.dom.walkTheDOM(node, func);
		node = node.nextSibling;
	}
}

gadmin.dom.purgeEventHandlers = function(node)
{
	gadmin.dom.walkTheDOM(node, function(e)
	{
		for(var n in e)
		{
			if(typeof(e[n]) === 'function')
			{
				e[n] = null;
			}
		}
	});
}	

//-------------------------------------------------------------------------------------
// *** GADMIN.BROWSER - DETECTION *** 
//-------------------------------------------------------------------------------------	
gadmin.browser.isIE = false;
gadmin.browser.isIE7 = false;
gadmin.browser.isSupported = false;
gadmin.browser.detect = function()
{
var xmlHttp;
try
  {
  // Firefox, Opera 8.0+, Safari
  xmlHttp=new XMLHttpRequest();
  var ie7 = (document.all && !window.opera && window.XMLHttpRequest) ? true : false;
  if(ie7)
  {
  	gadmin.browser.isIE = true;
  	gadmin.browser.isIE7 = true;
  }
  gadmin.browser.isSupported = true;
  }
catch (e)
  {
  // Internet Explorer
  try
    {
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
	gadmin.browser.isIE = true;
	gadmin.browser.isSupported = true;
    }
  catch (e)
    {
    try
      {
      xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
	  gadmin.browser.isIE = true;
      gadmin.browser.isSupported = true;
      }
    catch (e)
      {
      //alert("Your browser does not support AJAX!");
      return false;
      }
    }
  }
}	
//running gadmin browser detection v0.01a 