/*
Filename: general.js
Author: Holger Berg
Date: January, 2003
Last edit: June 13, 2003 (Holger Berg)
Description:
Contains all javascript functions needed for the custom cms "automatic" mouseevents + some general functions
*/


if (!vcc.cms)
	vcc.cms = new Object();




// ----------------------------- General functions -----------------------------------------------------------------

// Searches the previous siblings and returns the closest span-element
vcc.cms.getPreviousPlaceholder = function (elmPanel) {
	var arAllSiblings = elmPanel.parentNode.childNodes;
	var blnIsBeforePanel = false;
	for (var i=arAllSiblings.length-1; i>=0; i--) {
		if (blnIsBeforePanel && (
			(arAllSiblings[i].nodeName == "SPAN" && arAllSiblings[i].id) || 
			(arAllSiblings[i].nodeName == "DIV" && arAllSiblings[i].id && arAllSiblings[i].id.indexOf("flashMovie_") > -1))) {
				return arAllSiblings[i];
		}
		else {
			if (arAllSiblings[i] == elmPanel)
				blnIsBeforePanel = true;
		}
	}
	return null;
}

// Returns the first parentelement with the specified nodeName
vcc.cms.getParentNode = function(strLayer, strParentNodeName, iDepth) {
	var elmLayer = vcc.getObj(strLayer);
	iDepth = iDepth || 15;
	elmTmpParent = elmLayer.parentNode;
	for (var i=0; i<iDepth; i++) {
		if (elmTmpParent.nodeName == strParentNodeName.toUpperCase())
			return elmTmpParent;
		else
			elmTmpParent = elmTmpParent.parentNode;
	}
	return false;
}




// ----------------------------- Mouseevent functions -----------------------------------------------------------------

// Adds an element to the array of elements (vcc.arMouseEventElements) that have events connected to them automatically
vcc.cms.addMouseEventElement = function(strMouseEventElm) {
	if (!vcc.arMouseEventElements) vcc.arMouseEventElements = [];
	vcc.arMouseEventElements[vcc.arMouseEventElements.length] = [strMouseEventElm];
	return (vcc.arMouseEventElements.length - 1);
}

vcc.cms.imageGroups = []

// Initializes the events connected to elements in the function vcc.cms.addMouseEventElement
vcc.cms.initMouseEvents = function() {
	
	// Stop if if we're not in the right mode ('live'-mode) or if there are no elements in vcc.arMouseEventElements
	if ((vcc.strAuthorMode && (vcc.strAuthorMode == "AuthoringReedit" || vcc.strAuthorMode == "AuthoringNew")) || !vcc.arMouseEventElements)
		return false;
		
	// Loop through all the authorPanels on the page
	var arAuthorPanels = vcc.getElementsByClassName("authorPanel", "div");
	for (i=0; i<arAuthorPanels.length; i++) {
		var strTitle = arAuthorPanels[i].getAttribute("title");
		if (strTitle) { // Layers that don't 'belong' to anything
			vcc.hide(arAuthorPanels[i]);
			arAuthorPanels[i].className = "";
			var arEvents = arAuthorPanels[i].id.substring(arAuthorPanels[i].id.indexOf("_") + 1).split("_and_");
			for (x in arEvents) {
				var elmTrigger = vcc.getObj(vcc.cms.getMouseEventElmId(arEvents[x]));
				var strEvent = arEvents[x].substring(arEvents[x].lastIndexOf("_") + 1);
				var blnCreateMouseout = (strEvent.toLowerCase() == "mouseover");
				if (strEvent.toLowerCase() == "nomouseout")
					strEvent = "mouseover";
				var strFunction = arEvents[x].substring(0, arEvents[x].indexOf("On_"));
				vcc.cms.createEventFunction(arAuthorPanels[i], elmTrigger, null, strEvent, strFunction);
				if (blnCreateMouseout)
					vcc.cms.createEventFunction(arAuthorPanels[i], elmTrigger, null, "mouseout", strFunction);
			}
		}
		else {
			var elmTrigger = vcc.cms.getPreviousPlaceholder(arAuthorPanels[i]);
			
			// Text layers
			var arSpans = arAuthorPanels[i].getElementsByTagName("span");
			for (t=0; t<arSpans.length; t++) {
				if ((arSpans[t].id + "").length > 0) {
					var elmSpan = arAuthorPanels[i].removeChild(arSpans[t]);
					elmSpan.style.position = "absolute";
					elmSpan.style.visibility = "hidden";
					document.body.appendChild(elmSpan);
					var elmTarget = elmSpan;
					var strEvent = elmSpan.id.substring(elmSpan.id.lastIndexOf("_") + 1);
					var blnCreateMouseout = (strEvent.toLowerCase() == "mouseover");
					if (strEvent.toLowerCase() == "nomouseout")
						strEvent = "mouseover";
					vcc.cms.createEventFunction(elmTarget, elmTrigger, null, strEvent);
					if (blnCreateMouseout)
						vcc.cms.createEventFunction(elmTarget, elmTrigger, null, "mouseout");
				}
			}
			
			innerLoop:
			for (t in vcc.arMouseEventElements) {
				if (elmTrigger.id.indexOf(vcc.arMouseEventElements[t][0]) > -1) {
					break innerLoop;
				}
			}
			
			// images
			for (j=1; j<vcc.arMouseEventElements[t].length; j++) {
				if (vcc.arMouseEventElements[t][j].indexOf("swapToOn") < 0)
					var elmTarget = elmTrigger;
				else
					var elmTarget = vcc.getObj(vcc.cms.getCorruptedId(vcc.cms.getMouseEventElmId(vcc.arMouseEventElements[t][j], true)));
				var strEvent = vcc.cms.getMouseEvent(vcc.arMouseEventElements[t][j]);
				var blnCreateMouseout = (strEvent.toLowerCase() == "mouseover");
				if (strEvent.toLowerCase() == "nomouseout")
					strEvent = "mouseover";
				var strNewImgObj = "vcc.preloadImg_" + t + "_" + j ;
				var strImgSrc = vcc.cms.getMouseEventImgSrc(vcc.arMouseEventElements[t][j]);
				vcc.preload(strNewImgObj, strImgSrc);
				vcc.cms.createEventFunction(elmTarget, elmTrigger, strNewImgObj, strEvent);
				if (blnCreateMouseout)
					vcc.cms.createEventFunction(elmTarget, elmTrigger, strNewImgObj, "mouseout");
				
				var blnStayOnClick = elmTarget.getAttribute("stayonclick");
				if (blnStayOnClick) {
					var elmImage = elmTrigger.getElementsByTagName("img")[0];
					if (elmImage) {
						var iImgGroup = parseInt(elmTrigger.getAttribute("imggroup")) || null;
						if (!vcc.cms.imageGroups[iImgGroup])
							vcc.cms.imageGroups[iImgGroup] = [];
						vcc.cms.imageGroups[iImgGroup][elmTrigger.id] = elmTrigger;
						if (!elmTrigger.getAttribute("origSrc"))
							elmTrigger.setAttribute("origSrc", elmImage.src);
						elmTrigger.setAttribute("newSrc", strImgSrc);
						if (elmTrigger.getAttribute("defaultgroupimg")) {
							elmImage.src = strImgSrc;
							elmTrigger.setAttribute("nomouseout", 1);
						}
					}
				}
			}
		}
	}
}

// Returns the id of a placeholder after CMS has messed with it
vcc.cms.getCorruptedId = function(strId) {
	var re = new RegExp("presentation[^_]*_" + strId, "i");
	var arSpans = document.getElementsByTagName("span");
	for (var i=0; i<arSpans.length; i++) {
		if (arSpans[i].id == strId || re.test(arSpans[i].id)) {
			return arSpans[i].id;
		}
	}
	return false
}

vcc.cms.iFunctionCount = 0;

// Creates an event-function and attaches it to the specified element
vcc.cms.createEventFunction = function(elmTarget, elmTrigger, strNewImgObj, strEvent, strFunction) {

	if (strNewImgObj) { // the target element is an image
		var elmImage = elmTarget.getElementsByTagName("img")[0];
		if (!elmImage) return false;
		if (strEvent == "mouseout")
			var strFunctionBody = "vcc.cms.swapRelatedImages('" + elmTarget.id + "', '" + elmTrigger.id + "', null, '" + elmImage.src + "', '" + strEvent + "')";
		else
			var strFunctionBody = "vcc.cms.swapRelatedImages('" + elmTarget.id + "', '" + elmTrigger.id + "', '" + strNewImgObj + "', null, '" + strEvent + "')";
	}

	else { // the target element is a layer
		if (strFunction == "hide")
			var strFunctionBody = "vcc.hide('" + elmTarget.id + "')";
		else {
			if (strEvent == "mouseout")
				var strFunctionBody = "vcc.cms.showMouseEventElement('" + elmTarget.id + "', true)";
			else
				var strFunctionBody = "vcc.cms.showMouseEventElement('" + elmTarget.id + "')";
		}
	}

	var strFunctionName = "vcc.cms.eventFunction_" + vcc.cms.iFunctionCount++;
	eval(strFunctionName + ' = new Function("' + strFunctionBody + '")');
	if (elmTrigger)
		vcc.addEvent(elmTrigger, strEvent, strFunctionName);
	if (elmTrigger && strEvent == "click")
		elmTrigger.style.cursor = "hand";
}

// Swaps images related to an image (onmouseover etc.)
vcc.cms.swapRelatedImages = function(strTarget, strTrigger, strNewImgObj, strNewImgSrc, strEvent) {
	var elmTarget = vcc.getObj(strTarget);
	var elmTrigger = vcc.getObj(strTrigger);
	if (strEvent == "mouseout" && elmTrigger.getAttribute("nomouseout"))
		return
	var iImgGroup = parseInt(elmTrigger.getAttribute("imggroup")) || null;
	if (iImgGroup && strEvent == "click") {
		for (i in vcc.cms.imageGroups[iImgGroup]) {
			if (vcc.cms.imageGroups[iImgGroup][i] != elmTrigger) {
				var elmImg = vcc.cms.imageGroups[iImgGroup][i].getElementsByTagName("img")[0];
				elmImg.src = vcc.cms.imageGroups[iImgGroup][i].getAttribute("origSrc");
				vcc.cms.imageGroups[iImgGroup][i].removeAttribute("nomouseout", 1)
			}
		}
		elmTrigger.setAttribute("nomouseout", 1)
	}
	var elmImg = elmTarget.getElementsByTagName("img")[0];
	vcc.swapImage(elmImg, strNewImgObj, strNewImgSrc);
}

vcc.cms.arCurrentVisibleLayers = [];
vcc.cms.arPreviousVisibleLayers = [];

// Shows a layer related to a mouse event
vcc.cms.showMouseEventElement = function(strLayer, blnRestorePrevious) {
	var strLayerBaseName = strLayer.substring(0, strLayer.indexOf("_"));
	var strLayerToHide = (blnRestorePrevious) ? strLayer : ((vcc.cms.arCurrentVisibleLayers[strLayerBaseName]) || strLayerBaseName);
	var strLayerToShow = (blnRestorePrevious) ? vcc.cms.arPreviousVisibleLayers[strLayerBaseName] : strLayer;
	vcc.cms.arPreviousVisibleLayers[strLayerBaseName] = strLayerToHide;
	vcc.hide(strLayerToHide);
	var elmBaseLayer = vcc.getObj(strLayerBaseName);
	if (elmBaseLayer)
		vcc.moveTo(strLayer, vcc.getX(elmBaseLayer, true), vcc.getY(elmBaseLayer, true));
	vcc.show(strLayerToShow);
	vcc.cms.arCurrentVisibleLayers[strLayerBaseName] = strLayerToShow;
}

// Returns the src of an image in an img-tag
vcc.cms.getMouseEventImgSrc = function(strHTML) {
	var re = new RegExp(".*src=\"([^\"]+)", "i" );
	re.exec(strHTML);
	return RegExp.$1;
}

// Returns a placeholder-id, cleaned from the words ('presentationmode_' etc.) that CMS adds.
vcc.cms.getMouseEventElmId = function(strHTML, blnTargetId) {
	// This function needs a rewrite
	if (strHTML.toLowerCase().indexOf("span id=") < 0) {
		var re = new RegExp(".*On_([^_]*)", "i");
		re.exec(strHTML);
		return RegExp.$1;
	}
	if (blnTargetId)
		var re = new RegExp("(.*span id=\")(presentation[^_]*_)([^\"_]+)", "i");
	else
		var re = new RegExp("(.*span id=\")([^\"]+)", "i");
	re.exec(strHTML);
	return (blnTargetId) ? RegExp.$3 : RegExp.$2 ;
}

// Returns an event (e g 'mouseover' or 'click') as a string
vcc.cms.getMouseEvent = function(strHTML) {
	var re = new RegExp(".*span id=\"([^\"]+)", "i" );
	re.exec(strHTML);
	var strEvent = RegExp.$1.substring(RegExp.$1.lastIndexOf("_") + 1);
	return strEvent;
}


// Init
if (!vcc.cms.blnMouseEventsInitiated) {
	vcc.addEvent(window, "load", "vcc.cms.initMouseEvents");
	vcc.cms.blnMouseEventsInitiated = true;
}

