/* 
===============================================================
Create A Scape Javascript Library
===============================================================
AUTHOR			: Christian Wach <needle@haystack.co.uk>
LAST MODIFIED	: 03/05/2006
---------------------------------------------------------------
DEPENDENCIES

prototype.js
Scriptaculous Javascript Libraries
Behaviours Javascript Library

---------------------------------------------------------------
USAGE

Embed this script in the page using something like:

<script src="/common/js/prototype.js" type="text/javascript"></script>
<script src="/common/js/scriptaculous.js" type="text/javascript"></script>
<script src="/common/js/behaviours.js" type="text/javascript"></script>
<script src="/common/js/createascape.js" type="text/javascript"></script>

---------------------------------------------------------------
*/



/* 
---------------------------------------------------------------
Globals Init
---------------------------------------------------------------
*/

// track help active status
var helpActive = false;

// track help layer usage --> help_01 as default
var helpLayers = new Array('help_01','help_02');

// track help history
var helpHistory = new Array();

// store HTML used to display Flash movies
var oldHTML = '';

// store HTML used to display Flash movies
var overlayHTML = '';



/* 
---------------------------------------------------------------
Behaviours Init
---------------------------------------------------------------
*/
var myrules = {

	'ul.learn_more_list li a' : function(element){
	
		element.onclick = function() {
			
			// get the link to the help page
			var tUrl = this.href.toString();
			
			//alert( tUrl );
			
			// get top level directory
			var tDirArray = tUrl.split("/");
			
			// top level dir is 4th after http://www.blah.com/
			var tDir = tDirArray[3];
			
			// replace first instance with the overlay directory
			tUrl = tUrl.replace(tDir,tDir+'_overlays');
			
			// show help overlay
			showHelp(tUrl);

			// prevent link
			return false;
			
		}
		
	},
	

	'.help_copy ol li a' : function(element){
	
		element.onclick = function() {
			
			// get the link to the help page
			var tUrl = this.href.toString();
			
			// get top level directory
			var tDirArray = tUrl.split("/");
			
			// top level dir is 4th after http://www.blah.com/
			var tDir = tDirArray[3];
			
			// replace first instance with the overlay directory
			tUrl = tUrl.replace(tDir,tDir+'_overlays');
			
			// show help overlay
			showHelp(tUrl);

			// prevent link
			return false;
			
		}
		
	},
	
	'ul.item_movie_list li a' : function(element){
	
		element.onclick = function() {
			
			// get the link to the help page
			var flashUrl = this.href.toString();
			
			// show help overlay
			showFlash(flashUrl);

			// prevent link
			return false;
			
		}
		
	},
	
	'input#search_field' : function(element){
	
		element.onfocus = function() {
		
			// empty the input
			this.value = '';
			
		};
		
		element.onblur = function(){
		
			// default text for input
			// this.value = 'search';
			
		}
		
	}
	
};



// now register
Behaviour.register(myrules);



/* 
---------------------------------------------------------------
Show Help Overlays
---------------------------------------------------------------
*/
function showHelp( tUrl ) {

	// add requested URL to array
	helpHistory.push( tUrl );
	
	// toggle active layer if help is active
	if ( helpActive == true ) {
	
		// switch layer to use
		toggleHelpLayer();
		
	}
	
	// get content
	retrieveHelpContent( tUrl );

}



/* 
---------------------------------------------------------------
Get HTML for Help Overlays
---------------------------------------------------------------
*/
function retrieveHelpContent( tUrl ) {

	// no params --> add query to force server request
	var tPars = '?';
	
	// get and apply
	var tAjax = new Ajax.Updater(
	
		helpLayers[0] + '_content',
		
		tUrl, { method: 'get', parameters: tPars, onComplete: helpRetrieved }
		
	);
	
}



/* 
---------------------------------------------------------------
Animate Help Overlay HTML Received
---------------------------------------------------------------
*/
function helpRetrieved() {

	// toggle layers if help is active
	if ( helpActive == true ) {
	
		// switch layer z-index
		toggleHelpLayers();
		
		// hide the top layer in preparation for transition
		document.getElementById( helpLayers[0] ).style.display = 'none';

	}
	
	// reapply rules to new help elements
	Behaviour.apply();
	
	// get help element
	var element = document.getElementById( helpLayers[0] );
	
	// make the element have auto height
	element.style.height = 'auto';

	// if it's got an id of flash_area...
	if ( document.getElementById( 'flash_area' ) ) {
	
		// store the content
		oldHTML = document.getElementById('flash_area').innerHTML;
	
		// replace the underlying Flash movie with image
		document.getElementById('flash_area').innerHTML = '<img src="/images/interface/no_flash_wiam.jpg" alt="Static substitute image replacing Flash movie" style="width: 510px; height: 305px;">';

	}
	
	// if it's got an id of flash_area_wiam...
	if ( document.getElementById( 'flash_area_wiam' ) ) {
	
		// store the content
		overlayHTML = document.getElementById('flash_area_wiam').innerHTML;
	
		// replace the underlying Flash movie with image
		document.getElementById('flash_area_wiam').innerHTML = '<img src="/images/interface/no_flash_wiam.jpg" alt="Static substitute image replacing Flash movie" style="width: 510px; height: 305px;">';

	}
	
	// show Help Overlay
	new Effect.HelpBlindDown(element);
	
}



/* 
---------------------------------------------------------------
Help Overlay Transition Finished
---------------------------------------------------------------
*/
function helpRevealed(element) {

	// get header height
	var headerElement = document.getElementById( 'header' );
	//var headerDimensions = headerElement.getDimensions();
	//var headerHeight = headerDimensions.clientHeight;
	var headerHeight = headerElement.clientHeight;

	// get footer height
	var footerElement = document.getElementById( 'footer' );
	//var footerDimensions = footerElement.getDimensions();
	//var footerHeight = footerDimensions.height;
	var footerHeight = footerElement.clientHeight;

	// get the minimum height the element must be...
	var minHeight = document.body.clientHeight - (headerHeight + footerHeight);
	
	// get the height of the element
	var elementDimensions = element.getDimensions();
	var elementHeight = elementDimensions.height;
	
	//alert( 'elementHeight:' + elementHeight );
	//alert( 'headerHeight:' + headerHeight );
	//alert( 'footerHeight:' + footerHeight );
	//alert( 'minHeight:' + minHeight );
	
	// if it's got an id of flash_area_wiam...
	if ( document.getElementById( 'flash_area_wiam' ) ) {

		// no params --> add query to force server request
		var tPars = '?';
		
		// check for correct version
		var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
		
		// if we haven't detected an acceptable version...
		if(!hasRightVersion) {  
		
			// substitute for image and text
			flashUrl = '/flash/no_flash_wiam.html';
			
		} else {
		
			// substitute for Flash object code
			flashUrl = '/flash/whatis.html';
			
		}
	
		// get and apply
		var tAjax = new Ajax.Updater(
		
			'flash_area_wiam',
			
			flashUrl, { method: 'get', parameters: tPars, onComplete: flashRetrieved }
			
		);
	
	}
	
	// if it's less than the minimum, set to it
	if ( elementHeight < minHeight ) {
		element.setStyle({height: minHeight + 'px'});
	}
	
	// set global
	helpActive = true;
	
}



/* 
---------------------------------------------------------------
Hide Help Overlay
---------------------------------------------------------------
*/
function hideHelp() {

	// if it's got an id of flash_area_wiam...
	if ( document.getElementById( 'flash_area_wiam' ) ) {

		// remove Flash movie
		document.getElementById('flash_area_wiam').innerHTML = '';
		
	}

	// Close Top Help Overlay
	new Effect.HelpClose(document.getElementById( helpLayers[0] ), 'one');
	
}



/* 
---------------------------------------------------------------
Hide All Help Overlays
---------------------------------------------------------------
*/
function hideAllHelp() {

	// if it's got an id of flash_area_wiam...
	if ( document.getElementById( 'flash_area_wiam' ) ) {

		// remove Flash movie
		document.getElementById('flash_area_wiam').innerHTML = '';
		
	}

	// make underlying layer invisible
	document.getElementById( helpLayers[1] ).style.display = 'none';

	// Close Help Overlay
	new Effect.HelpClose(document.getElementById( helpLayers[0] ), 'all');
	
}



/* 
---------------------------------------------------------------
Help Overlay Hide Transition Finished
---------------------------------------------------------------
*/
function helpHidden(element, tMode) {

	// make the element have zero height
	element.setStyle({height: 0 + 'px'});

	// which mode?
	if ( tMode == 'all' ) {
	
		// remove all items from the history
		helpHistory.length = 0;

	} else {

		// remove the last item from the history
		helpHistory.pop();
		
		// switch layer to use
		toggleHelpLayer();
		
		// switch layer z-index
		toggleHelpLayers();
		
	}

	// are there any items left in the history?
	if ( helpHistory.length == 0 ) {

		// set global
		helpActive = false;
		
		// reset the layers
		resetHelpLayers();
		
	} else {
	
		// populate lower layer with underlying content
		
		// do we have any?
		if( helpHistory.length > 1 ) {
		
			// hide the top layer in preparation for transition
			document.getElementById( helpLayers[1] ).style.display = 'block';
	
			// get the URL
			var tUrl = helpHistory[(helpHistory.length - 2)];
			
			// no params --> add query to force server request
			var tPars = '?';
			
			// get and apply
			var tAjax = new Ajax.Updater(
			
				helpLayers[1] + '_content',
				
				tUrl, { method: 'get', parameters: tPars }
				
			);
			
		}
	
	}
	
	// reapply rules to new help elements
	Behaviour.apply();
	
}



/* 
---------------------------------------------------------------
Reset Help Layers
---------------------------------------------------------------
*/
function resetHelpLayers() {

	// set array order
	helpLayers[0] = 'help_01';
	helpLayers[1] = 'help_02';
	
	// set layer properties
	document.getElementById( helpLayers[0] ).style.zIndex = '100';
	document.getElementById( helpLayers[1] ).style.zIndex = '99';
	document.getElementById( helpLayers[0] ).style.display = 'none';
	document.getElementById( helpLayers[1] ).style.display = 'none';

}



/* 
---------------------------------------------------------------
Toggle Help Layers
---------------------------------------------------------------
*/
function toggleHelpLayer() {

	// switch array order
	if ( helpLayers[0] == 'help_01' ) {
		helpLayers[0] = 'help_02';
		helpLayers[1] = 'help_01';
	} else {
		helpLayers[0] = 'help_01';
		helpLayers[1] = 'help_02';
	}
	
}



/* 
---------------------------------------------------------------
Toggle Help Layers
---------------------------------------------------------------
*/
function toggleHelpLayers() {

	// switch layer z-order
	document.getElementById( helpLayers[0] ).style.zIndex = '100';
	document.getElementById( helpLayers[1] ).style.zIndex = '99';

}



//#############################################################



/* 
---------------------------------------------------------------
Show Flash Overlay
---------------------------------------------------------------
*/
function showFlash( tUrl ) {

	// get help element
	var element = document.getElementById('flash_movie');
	
	// if it's got an id of flash_area...
	if ( document.getElementById( 'flash_area' ) ) {
	
		// store the content
		oldHTML = document.getElementById('flash_area').innerHTML;
	
		// replace the underlying Flash movie with image
		document.getElementById('flash_area').innerHTML = '<img src="/images/interface/no_flash_wiam.jpg" alt="Static substitute image replacing Flash movie" style="width: 510px; height: 305px; padding: 0; margin: 0; text-align: left;">';

	}
	
	// if it's got an id of flash_area_wiam...
	if ( document.getElementById( 'flash_area_wiam' ) ) {
	
		// store the content
		overlayHTML = document.getElementById('flash_area_wiam').innerHTML;
	
		// replace the underlying Flash movie with image
		document.getElementById('flash_area_wiam').innerHTML = '<img src="/images/interface/no_flash_wiam.jpg" alt="Static substitute image replacing Flash movie" style="width: 510px; height: 305px; padding: 0; margin: 0; text-align: left;">';

	}
	
	// fade in Help Overlay
	new Effect.FlashBlindDown(element, tUrl);
	
}



/* 
---------------------------------------------------------------
Hide Flash Overlay
---------------------------------------------------------------
*/
function hideFlash() {

	// remove Flash movie
	document.getElementById('flash_space').innerHTML = '';

	// fade out Flash Overlay
	new Effect.FlashClose(document.getElementById('flash_movie'));
	
}



/* 
---------------------------------------------------------------
Flash Movie Overlay Transition Finished
---------------------------------------------------------------
*/
function flashRevealed(element, flashUrl) {

	// get header height
	var headerElement = document.getElementById( 'header' );
	//var headerDimensions = headerElement.getDimensions();
	//var headerHeight = headerDimensions.clientHeight;
	var headerHeight = headerElement.clientHeight;

	// get footer height
	var footerElement = document.getElementById( 'footer' );
	//var footerDimensions = footerElement.getDimensions();
	//var footerHeight = footerDimensions.height;
	var footerHeight = footerElement.clientHeight;

	// get the minimum height the element must be...
	var minHeight = document.body.clientHeight - (headerHeight + footerHeight);
	
	// get the height of the element
	var elementDimensions = element.getDimensions();
	var elementHeight = elementDimensions.height;
	
	//alert( 'elementHeight:' + elementHeight );
	//alert( 'minHeight:' + minHeight );
	
	// if it's less than the minimum, set to it
	if ( elementHeight < minHeight ) {
		element.setStyle({height: minHeight + 'px'});
	}
	
	// no params --> add query to force server request
	var tPars = '?';
	
	// check for correct version
	var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
	
	// if we haven't detected an acceptable version...
	if(!hasRightVersion) {  
	
		// substitute for image and text
		flashUrl = '/flash/no_flash.html';
		
	}

	// get and apply
	var tAjax = new Ajax.Updater(
	
		'flash_space',
		
		flashUrl, { method: 'get', parameters: tPars, onComplete: flashRetrieved }
		
	);

}



//#############################################################



/* 
---------------------------------------------------------------
Flash Movie Code Retrieved
---------------------------------------------------------------
*/
function flashRetrieved() {

	// activate object tag
	//theObjects = document.getElementsByTagName("object");
	
	//alert( theObjects.toString() );
	
	//for (var i = 0; i < theObjects.length; i++) { 
		//theObjects[i].parentNode.replaceChild(theObjects[i],theObjects[i]);
	//}
	
	// reapply rules to new help elements
	Behaviour.apply();

	// now register
	Behaviour.register(myrules);

}



//#############################################################



/* 
---------------------------------------------------------------
Flash Movie overlay closed
---------------------------------------------------------------
*/
function flashHidden() {

	// if it's got an id of flash_area...
	if ( document.getElementById( 'flash_area' ) ) {
	
		// store the content
		document.getElementById('flash_area').innerHTML = oldHTML;
	
	}
	
	// if it's got an id of flash_area...
	if ( document.getElementById( 'flash_area_wiam' ) ) {
	
		// store the content
		document.getElementById('flash_area_wiam').innerHTML = overlayHTML;
	
	}
	
}



//#############################################################



/* 
---------------------------------------------------------------
Define our own version of the BlindDown script
---------------------------------------------------------------
*/
Effect.HelpBlindDown = function(element) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, 
    Object.extend({ scaleContent: false, 
      scaleX: false,
      scaleFrom: 0,
      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
      restoreAfterFinish: true,
      afterSetup: function(effect) {
        effect.element.makeClipping();
        effect.element.setStyle({height: '0px'});
        effect.element.show(); 
      },  
      afterFinishInternal: function(effect) {
        effect.element.undoClipping();
        helpRevealed(element);
      }
    }, arguments[1] || {})
  );
}




/* 
---------------------------------------------------------------
Define our own version of the BlindUp script
---------------------------------------------------------------
*/
Effect.HelpClose = function(element, tMode) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0, 
    Object.extend({ scaleContent: false, 
      scaleX: false, 
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide();
        effect.element.undoClipping();
        helpHidden(element, tMode);
      } 
    }, arguments[1] || {})
  );
}



/* 
---------------------------------------------------------------
Define our own version of the BlindDown script
---------------------------------------------------------------
*/
Effect.FlashBlindDown = function(element, flashUrl) {
  element = $(element);
  var elementDimensions = element.getDimensions();
  return new Effect.Scale(element, 100, 
    Object.extend({ scaleContent: false, 
      scaleX: false,
      scaleFrom: 0,
      scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
      restoreAfterFinish: true,
      afterSetup: function(effect) {
        effect.element.makeClipping();
        effect.element.setStyle({height: '0px'});
        effect.element.show(); 
      },  
      afterFinishInternal: function(effect) {
        effect.element.undoClipping();
        flashRevealed(element, flashUrl);
      }
    }, arguments[1] || {})
  );
}




/* 
---------------------------------------------------------------
Define our own version of the BlindUp script
---------------------------------------------------------------
*/
Effect.FlashClose = function(element) {
  element = $(element);
  element.makeClipping();
  return new Effect.Scale(element, 0, 
    Object.extend({ scaleContent: false, 
      scaleX: false, 
      restoreAfterFinish: true,
      afterFinishInternal: function(effect) {
        effect.element.hide();
        effect.element.undoClipping();
        flashHidden();
      } 
    }, arguments[1] || {})
  );
}




