//
// IASP 5.0 Presentation Layer
// March 2007
//
// Copyright (C) IASP 2007.
// Unauthorised reproduction or use
// on external websites will 
// be subject to rigorous prosecution
//

// IE7 detection for bait-and-switch fade code
var _isIE7 = false;
if (typeof document.documentElement.style.maxHeight != "undefined" && document.all) {
	_isIE7 = true;
}

// Create namespace
CMS.Presentation = function() { }
CMS.Presentation._isIE7 = _isIE7;

// Set 40 frames per second on all animation
var _cms_fps = 40;
// Disable all smooth animation and just do simple show/hide
var _cms_basicprofile = false;
// Handle IE with kid gloves (no height: 0 allowed!)
var _cms_ieQuirksMode = false;

// Fade one element in or out, and roll another up or down.
function cms_fadeRoll(fadeId, startOpacity, endOpacity, totalTimespan, rollId, startHeight, endHeight, endTimeoutCallback, initialDelay) {
	if (initialDelay == null) initialDelay = 0;
	
	if (_cms_ieQuirksMode) {
		if (startHeight == 0) startHeight = 1;
		if (endHeight == 0) endHeight = 1;
	}

	if (_cms_basicprofile) {
		// Basic profile only; pop out everything now, set the timeoutCallback to run after the timespan.
		if (initialDelay > 0) {
			setTimeout("cms_setOpacity(" + endOpacity + ",'" + fadeId + "')", initialDelay);
			setTimeout("cms_setHeight(" + endHeight + ",'" + rollId + "')", initialDelay);
		} else {
			cms_setOpacity(endOpacity,fadeId);
			cms_setHeight(endHeight,rollId);
		}
		if (endTimeoutCallback != null) {
			setTimeout(endTimeoutCallback, totalTimespan + initialDelay);
		}
	} else {
		if (_isIE7 == true && startOpacity == 0 && endOpacity == 100) {
			// Preserve cleartype (create new working copy of object)
			var originalObj = document.getElementById(fadeId);
			var newObj = document.createElement(originalObj.tagName);
			newObj.innerHTML = originalObj.innerHTML;
			newObj.id = '__fade_baitSwitch_' + originalObj.id;
			newObj.style.display='none';
			var oParent = originalObj.parentNode || originalObj.parent;
			oParent.insertBefore(newObj,originalObj);
		}

		//alert(_cms_fps);

		var timeInterval = (1000 / _cms_fps);
		var frames = Math.floor(totalTimespan / timeInterval) - 1;

		var opacInc = (endOpacity - startOpacity) / frames;
		var heightInc = (endHeight - startHeight) / frames;

		var curTime = initialDelay;
		var curOpac = startOpacity;
		var curHeight = startHeight;

		// schedule frames
		for (i = 0; i < frames; i++) {
			setTimeout("cms_setOpacity(" + curOpac + ",'" + fadeId + "')", curTime);
			setTimeout("cms_setHeight(" + curHeight + ",'" + rollId + "')", curTime);

			curTime += timeInterval;
			curOpac += opacInc;
			curHeight += heightInc;
		}

		// schedule final status
		setTimeout("cms_setOpacity(" + endOpacity + ",'" + fadeId + "')", totalTimespan + initialDelay);
		setTimeout("cms_setHeight(" + endHeight + ",'" + rollId + "')", totalTimespan + initialDelay);
		// set supplied completion callback as required
		if (endTimeoutCallback != null) {
			setTimeout(endTimeoutCallback, (totalTimespan * 1.1) + initialDelay);
		}

		if (_isIE7 == true && startOpacity == 0 && endOpacity == 100) {
			setTimeout("cms_fade_IE_baitSwitch('" + fadeId + "');",(totalTimespan * 1.1) + initialDelay - 5);
		}
	}

	return false;
}

// Run a 2D resize
function cms_resizeAnim(totalTimespan, rollId, startHeight, endHeight, startWidth, endWidth, endTimeoutCallback, initialDelay) {
	if (initialDelay == null) initialDelay = 0;
	
	if (_cms_ieQuirksMode) {
		if (startHeight == 0) startHeight = 1;
		if (endHeight == 0) endHeight = 1;
		if (startWidth == 0) startWidth = 1;
		if (endWidth == 0) endWidth = 1;
	}

	if (_cms_basicprofile) {
		// Basic profile only; pop out everything now, set the timeoutCallback to run after the timespan.
		if (initialDelay > 0) {
			setTimeout("cms_setHeight(" + endHeight + ",'" + rollId + "')", initialDelay);
			setTimeout("cms_setWidth(" + endWidth + ",'" + rollId + "')", initialDelay);
		} else {
			cms_setHeight(endHeight,rollId);
			cms_setWidth(endWidth,rollId);
		}
		if (endTimeoutCallback != null) {
			setTimeout(endTimeoutCallback, totalTimespan + initialDelay);
		}
	} else {
		var timeInterval = (1000 / _cms_fps);
		var frames = Math.floor(totalTimespan / timeInterval) - 1;

		var heightInc = (endHeight - startHeight) / frames;
		var widthInc = (endWidth - startWidth) / frames;

		var curTime = initialDelay;
		var curHeight = startHeight;
		var curWidth = startWidth;

		// schedule frames
		for (i = 0; i < frames; i++) {
			setTimeout("cms_setHeight(" + curHeight + ",'" + rollId + "')", curTime);
			setTimeout("cms_setWidth(" + curWidth + ",'" + rollId + "')", curTime);

			curTime += timeInterval;
			curHeight += heightInc;
			curWidth += widthInc;
		}

		// schedule final status
		setTimeout("cms_setHeight(" + endHeight + ",'" + rollId + "')", totalTimespan + initialDelay);
		setTimeout("cms_setWidth(" + endWidth + ",'" + rollId + "')", totalTimespan + initialDelay);
		// set supplied completion callback as required
		if (endTimeoutCallback != null) {
			//setTimeout(endTimeoutCallback, totalTimespan + 1);
			setTimeout(endTimeoutCallback, (totalTimespan * 1.1) + initialDelay);
		}
	}
	return false;
}

// Move an object (must be absolutely positioned beforehand
function cms_moveAnim(totalTimespan, rollId, startTop, endTop, startLeft, endLeft, endTimeoutCallback, initialDelay) {
	if (initialDelay == null) initialDelay = 0;

	if (_cms_basicprofile) {
		// Basic profile only; pop out everything now, set the timeoutCallback to run after the timespan.
		if (initialDelay > 0) {
			setTimeout("cms_setTop(" + endTop + ",'" + rollId + "')", initialDelay);
			setTimeout("cms_setLeft(" + endLeft + ",'" + rollId + "')", initialDelay);
		} else {
			cms_setTop(endTop,rollId);
			cms_setLeft(endLeft,rollId);
		}
		if (endTimeoutCallback != null) {
			setTimeout(endTimeoutCallback, totalTimespan + initialDelay);
		}
	} else {
		var timeInterval = (1000 / _cms_fps);
		var frames = Math.floor(totalTimespan / timeInterval) - 1;

		var TopInc = (endTop - startTop) / frames;
		var LeftInc = (endLeft - startLeft) / frames;

		var curTime = initialDelay;
		var curTop = startTop;
		var curLeft = startLeft;

		// schedule frames
		for (i = 0; i < frames; i++) {
			setTimeout("cms_setTop(" + curTop + ",'" + rollId + "')", curTime);
			setTimeout("cms_setLeft(" + curLeft + ",'" + rollId + "')", curTime);

			curTime += timeInterval;
			curTop += TopInc;
			curLeft += LeftInc;
		}

		// schedule final status
		setTimeout("cms_setTop(" + endTop + ",'" + rollId + "')", totalTimespan + initialDelay);
		setTimeout("cms_setLeft(" + endLeft + ",'" + rollId + "')", totalTimespan + initialDelay);
		// set supplied completion callback as required
		if (endTimeoutCallback != null) {
			//setTimeout(endTimeoutCallback, totalTimespan + 1);
			setTimeout(endTimeoutCallback, (totalTimespan * 1.1) + initialDelay);
		}
	}
	return false;
}

// Run a resize only
function cms_roll(totalTimespan, rollId, startHeight, endHeight, endTimeoutCallback, initialDelay) {
	if (initialDelay == null) initialDelay = 0;
	
	if (_cms_ieQuirksMode) {
		if (startHeight == 0) startHeight = 1;
		if (endHeight == 0) endHeight = 1;
	}

	if (_cms_basicprofile) {
		// Basic profile only; pop out everything now, set the timeoutCallback to run after the timespan.
		if (initialDelay > 0) {
			setTimeout("cms_setHeight(" + endHeight + ",'" + rollId + "')", initialDelay);
		} else {
			cms_setHeight(endHeight,rollId);
		}
		if (endTimeoutCallback != null) {
			setTimeout(endTimeoutCallback, totalTimespan + initialDelay);
		}
	} else {
		var timeInterval = (1000 / _cms_fps);
		var frames = Math.floor(totalTimespan / timeInterval) - 1;

		var heightInc = (endHeight - startHeight) / frames;

		var curTime = initialDelay;
		var curHeight = startHeight;

		// schedule frames
		for (i = 0; i < frames; i++) {
			setTimeout("cms_setHeight(" + curHeight + ",'" + rollId + "')", curTime);

			curTime += timeInterval;
			curHeight += heightInc;
		}

		// schedule final status
		setTimeout("cms_setHeight(" + endHeight + ",'" + rollId + "')", totalTimespan + initialDelay);
		// set supplied completion callback as required
		if (endTimeoutCallback != null) {
			//setTimeout(endTimeoutCallback, totalTimespan + 1);
			setTimeout(endTimeoutCallback, (totalTimespan * 1.1) + initialDelay);
		}
	}
	return false;
}

// Set function
CMS.Presentation.RollByID = cms_roll;

// Fade one element in or out
function cms_fade(fadeId, startOpacity, endOpacity, totalTimespan, endTimeoutCallback, initialDelay, disableIE7fix) {
	if (initialDelay == null) initialDelay = 0;

	if (_cms_basicprofile) {
		// Basic profile only; pop out everything now, set the timeoutCallback to run after the timespan.
		if (initialDelay > 0) {
			setTimeout("cms_setOpacity(" + endOpacity + ",'" + fadeId + "')", initialDelay);
		} else {
			cms_setOpacity(endOpacity,fadeId);
		}
		if (endTimeoutCallback != null) {
			setTimeout(endTimeoutCallback, totalTimespan + initialDelay);
		}
	} else {
		if (_isIE7 == true && startOpacity == 0 && endOpacity == 100 && disableIE7fix != true) {
			// Preserve cleartype (create new working copy of object)
			var originalObj = document.getElementById(fadeId);
			var newObj = document.createElement(originalObj.tagName);
			newObj.innerHTML = originalObj.innerHTML;
			newObj.id = '__fade_baitSwitch_' + originalObj.id;
			newObj.style.display='none';
			var oParent = originalObj.parentNode || originalObj.parent;
			oParent.insertBefore(newObj,originalObj);
		}

		var timeInterval = (1000 / _cms_fps);
		var frames = Math.floor(totalTimespan / timeInterval);

		var opacInc = (endOpacity - startOpacity) / frames;

		var curTime = initialDelay;
		var curOpac = startOpacity;

		// schedule frames
		for (i = 0; i < frames; i++) {
			setTimeout("cms_setOpacity(" + curOpac + ",'" + fadeId + "')", curTime);

			curTime += timeInterval;
			curOpac += opacInc;
		}

		// schedule final status
		setTimeout("cms_setOpacity(" + endOpacity + ",'" + fadeId + "')", totalTimespan + initialDelay);
		// set supplied completion callback as required
		if (endTimeoutCallback != null)
			setTimeout(endTimeoutCallback, (totalTimespan * 1.1) + initialDelay);

		if (_isIE7 == true && startOpacity == 0 && endOpacity == 100 && disableIE7fix != true) {
			setTimeout("cms_fade_IE_baitSwitch('" + fadeId + "');",(totalTimespan * 1.1) + initialDelay - 5);
		}
	}
	return false;
}

// Set function
CMS.Presentation.FadeByID = cms_fade;

// Swap the adjacent bait/switch nodes around
function cms_fade_IE_baitSwitch(fadeId)
{
	var originalObj = document.getElementById(fadeId);
	var newObj = document.getElementById('__fade_baitSwitch_' + fadeId);
	
	newObj.className = originalObj.className;
	originalObj.id = '__fade_old' + fadeId;
	newObj.id = fadeId;
	newObj.innerHTML = originalObj.innerHTML;
	originalObj.style.display = 'none';
	if (originalObj.style.position) newObj.style.position = originalObj.style.position;	
	if (originalObj.style.top) newObj.style.top = originalObj.style.top;
	if (originalObj.style.left) newObj.style.left = originalObj.style.left;	
	newObj.style.display = 'block';	
	
	// delete old object
	var oParent = originalObj.parentNode || originalObj.parent;
	oParent.removeChild(originalObj);
}

// Open popup div, load image and roll out to size
function cms_img_loadRolloutPopup(dataId,imgId,fieldId,url) {
	var idStrBase = 'ic' + dataId + '_' + imgId + '_' + fieldId;
	var baseImgObj = document.getElementById(idStrBase);

	var baseParent = baseImgObj.parentNode || baseImgObj.parent;
	if (baseParent._open != 1) {
		// Open rollout div

		var outerDivObj = document.getElementById('sw_pi_' + idStrBase);
		var innerDivObj = document.getElementById('pi_' + idStrBase);
		innerDivObj.title = 'Click to close popup image.';

		baseParent._open = 1;

		// catch wrapping shadow div if available
		var pos_obj = outerDivObj;
		if (pos_obj == null) pos_obj = innerDivObj;

		// Position div over image
		pos_obj.style.top=findPosY(baseImgObj) + "px";
		pos_obj.style.left=findPosX(baseImgObj) + "px";
		innerDivObj.style.height = baseImgObj.offsetHeight + "px";
		innerDivObj.style.width = baseImgObj.offsetWidth + "px";
		innerDivObj.style.display='block';
		pos_obj.style.display='block';
		cms_setOpacity(100,pos_obj.id);
		var absOldTop = findAbsPosY(baseImgObj);
		var absOldLeft = findAbsPosX(baseImgObj);

		// Fix size of wrapper and hide overflow
		innerDivObj.style.height = innerDivObj.offsetHeight + "px";
		innerDivObj.style.width = innerDivObj.offsetWidth + "px";
		innerDivObj.style.overflow = 'hidden';

		// Create img element
		var newImgObj = document.createElement('IMG');
		newImgObj.onload = function() {
			// Give the image an ID
			newImgObj.id = 'dynimg_' + idStrBase;
			innerDivObj.appendChild(newImgObj);
			cms_setOpacity(0,newImgObj.id);

			// Get sizes
			var oldHeight = parseInt(innerDivObj.offsetHeight);
			var newHeight = parseInt(newImgObj.offsetHeight);
			var oldWidth = parseInt(innerDivObj.offsetWidth);
			var newWidth = parseInt(newImgObj.offsetWidth);

			var pos_obj = (outerDivObj == null)?innerDivObj:outerDivObj;

			// Get start position
			var oldTop = parseInt(pos_obj.style.top.replace(/[^0-9]/g,''));
			var oldLeft = parseInt(pos_obj.style.left.replace(/[^0-9]/g,''));

			// Get screen size
			var s_width = parseInt(parent.document.documentElement.clientWidth);
			if (s_width == 0) s_width = parseInt(parent.document.body.clientWidth);
			var s_height = parseInt(parent.document.documentElement.clientHeight);
			if (s_height == 0) s_height = parseInt(parent.document.body.clientHeight);
			var scrolltop = parseInt(parent.document.documentElement.scrollTop);
			if (scrolltop == 0) scrolltop = parseInt(parent.document.body.scrollTop);

			// Calculate new position
			var newTop = oldTop;
			var newLeft = oldLeft;
			//alert('realLeft=' + absOldLeft + '\nrealTop=' + absOldTop + '\noldLeft=' + oldLeft + '\nnewwidth=' + newWidth + '\ncurwidth=' + oldWidth + '\ns_width=' + s_width + '\n\oldTop=' + oldTop + '\nnewheight=' + newHeight + '\ncurheight=' + oldHeight + '\ns_height=' + s_height + '\nscrolltop=' + scrolltop);
	
			if (s_width > 0 && s_height > 0) { // we can calculate window size
				// Get left position
				if ((absOldLeft + newWidth) > s_width) {
					if (absOldLeft + oldWidth - newWidth > 0)
						newLeft = (oldLeft + oldWidth - newWidth);
					else if (s_width - newWidth - 1 > 0)
						newLeft = (s_width - newWidth - 12);
					else {
						newLeft = 0;
						if (newWidth + 16 > s_width) {
							var scaleFactor = ((s_width - 16) / newWidth);
							newWidth = s_width - 16;
							newHeight = newHeight * scaleFactor;
							this.style.width=newWidth + 'px';
							this.style.height=newHeight + 'px';
						}
					}
				}
				// Get top position
				if ((absOldTop + newHeight) > (s_height + scrolltop)) {
					if (absOldTop + oldHeight - newHeight > scrolltop)
						newTop = (oldTop + oldHeight - newHeight);
					else if (s_height - newHeight - 1 > scrolltop)
						newTop = (s_height - newHeight - 12);
					else {
						newTop = scrolltop;
						if (newHeight + 16 > s_height) {
							var scaleFactor = ((s_height - 16) / newHeight);
							newHeight = s_height - 16;
							newWidth = newWidth * scaleFactor;
							this.style.width=newWidth + 'px';
							this.style.height=newHeight + 'px';
						}
					}
				}
			}

			// Turn off loader anim
			innerDivObj.className = 'cms_ui_popup_image_loaded';
			// Start move anim
			if (oldTop != newTop || oldLeft != newLeft)
				cms_moveAnim(200, pos_obj.id, oldTop, newTop, oldLeft, newLeft);
			// Schedule fade (after move anim)
			cms_fade(newImgObj.id, 0, 100, 300, null, 100, true);
			// Schedule rollout (after move anim)
			cms_resizeAnim(250, innerDivObj.id, oldHeight, newHeight, oldWidth, newWidth, null, 100);
		}
		newImgObj.src = CMS.appRoot + 'img.ashx?f=v&' + url;
	} else {
		cms_img_cleanupClosedRollout(idStrBase);
	}
	
	return false;
}

function cms_img_cleanupClosedRollout(idStrBase) {
	var outerDivObj = document.getElementById('sw_pi_' + idStrBase);
	var innerDivObj = document.getElementById('pi_' + idStrBase);
	var baseImgObj = document.getElementById(idStrBase);

	while (innerDivObj.firstChild)
	{
		innerDivObj.removeChild(innerDivObj.firstChild);
	};
	
	var baseParent = baseImgObj.parentNode || baseImgObj.parent;
	baseParent._open = 0;

	if (outerDivObj) outerDivObj.style.display='none';
	innerDivObj.style.display = 'none';
	innerDivObj.className = 'cms_ui_popup_image';

}

function cms_img_closeRolloutPopup(dataId,imgId,fieldId,url) {
	var idStrBase = 'ic' + dataId + '_' + imgId + '_' + fieldId;
	var outerDivObj = document.getElementById('sw_pi_' + idStrBase);
	var innerDivObj = document.getElementById('pi_' + idStrBase);
	var baseImgObj = document.getElementById(idStrBase);

	var wrapObj = (outerDivObj == null)?innerDivObj:outerDivObj;

	cms_fade(wrapObj.id, 100, 0, 200, null, 0, true);
	
	setTimeout("cms_img_cleanupClosedRollout('" + idStrBase + "');",160);
}
