// This source code is property of portfoliocontrol.com
// This page holds the java script code for GUI elements (image handling, layers, etc.).

// image management *******************************************************************************

// this method should be called from the onLoad event handler of the main window
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_nbGroup(event, grpName) { //v6.0
  var i,img,nbArr,args=MM_nbGroup.arguments;
  if (event == "init" && args.length > 2) {
    if ((img = MM_findObj(args[2])) != null && !img.MM_init) {
      img.MM_init = true; img.MM_up = args[3]; img.MM_dn = img.src;
      if ((nbArr = document[grpName]) == null) nbArr = document[grpName] = new Array();
      nbArr[nbArr.length] = img;
      for (i=4; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
        if (!img.MM_up) img.MM_up = img.src;
        img.src = img.MM_dn = args[i+1];
        nbArr[nbArr.length] = img;
    } }
  } else if (event == "over") {
    document.MM_nbOver = nbArr = new Array();
    for (i=1; i < args.length-1; i+=3) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = (img.MM_dn && args[i+2]) ? args[i+2] : ((args[i+1])? args[i+1] : img.MM_up);
      nbArr[nbArr.length] = img;
    }
  } else if (event == "out" ) {
    for (i=0; i < document.MM_nbOver.length; i++) {
      img = document.MM_nbOver[i]; img.src = (img.MM_dn) ? img.MM_dn : img.MM_up; }
  } else if (event == "down") {
    nbArr = document[grpName];
    if (nbArr)
      for (i=0; i < nbArr.length; i++) { img=nbArr[i]; img.src = img.MM_up; img.MM_dn = 0; }
    document[grpName] = nbArr = new Array();
    for (i=2; i < args.length-1; i+=2) if ((img = MM_findObj(args[i])) != null) {
      if (!img.MM_up) img.MM_up = img.src;
      img.src = img.MM_dn = (args[i+1])? args[i+1] : img.MM_up;
      nbArr[nbArr.length] = img;
  } }
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

// layer management ************************************************************************
browser = navigator.appName;
browserNum = parseInt (navigator.appVersion);

if ((browser == "Netscape") && (browserNum < 5))
{
	// Netscape 4.x
	layerRef = "document.layers['";
	endLayerRef ="']";
	styleRef = "";
}

else if ((browser == "Netscape") && (browserNum >= 5))
{
	//Netscape 6 +
	layerRef = "document.getElementById('";
	styleRef = ".style";
	endLayerRef = "')";
}

else
{
	//Internet Explorer
	layerRef = "document.all['";
	endLayerRef = "']";
	styleRef = ".style";
}
function showLayer(layerName)
{
	eval(layerRef + layerName + endLayerRef + styleRef + ".visibility = 'visible'");
}

function hideLayer(layerName)
{
	eval(layerRef + layerName + endLayerRef + styleRef + ".visibility = 'hidden'");
}

// dynamic (i.e. floating and moving) layers **********************************************

var dynamicLayers = new Array();
// browser detection
var NS6 = false;
var IE4 =(document.all);
if (!IE4) {NS6=(document.getElementById);}
var NS4=(document.layers);

// to hold the dynamic layer configuration. Available halign are "left", "center", "right", or "unchanged". Available
// valing are "top", "center", "bottom" or "unchanged"
function DynamicLayer(id,floatX,floatY,layerWidth,layerHeight,halign,valign,delayspeed)
{
	this.id = id;
	this.floatX = floatX;
	this.floatY = floatY;
	this.layerWidth = layerWidth;
	this.layerHeight = layerHeight;
	this.halign = halign;
	this.valign = valign;
	this.delayspeed = delayspeed;
    	this.ifloatX=floatX;
    	this.ifloatY=floatY;
	this.lastX=null;
	this.lastY=null;
    // add itself to the array of layers
    dynamicLayers[dynamicLayers.length] = this;
}

function adjust() {
	for (var dynamicLayerIndex=0; dynamicLayerIndex < dynamicLayers.length; dynamicLayerIndex++)
	{
		var dynamicLayer = dynamicLayers[dynamicLayerIndex];
		// first, prepare browser-dependant variables
		var windowX;
		var windowY;
		var windowWidth;
		var windowHeight;
		if ((NS4) || (NS6)) {
			windowX = window.pageXOffset;
			windowY = window.pageYOffset;
			windowWidth = window.innerWidth;
			windowHeight = window.innerHeight;
		}
		else if (IE4){
			windowX = document.body.scrollLeft;
			windowY = document.body.scrollTop;
			windowWidth = top.document.body.offsetWidth;
			windowHeight = top.document.body.offsetHeight;
		}
		// second, make reposition calculations
		var dx=Math.abs(windowX+dynamicLayer.floatX-dynamicLayer.lastX);
		var dy=Math.abs(windowY+dynamicLayer.floatY-dynamicLayer.lastY);
		var d=Math.sqrt(dx*dx+dy*dy);
		// vertical reposition
		if (dynamicLayer.layerHeight > windowHeight) {
			// the layer is higher than the window => keep layer top anchored with window top and layer botom anchored with window bottom
			if (dynamicLayer.lastY > windowY) {
				// top anchor
				dynamicLayer.floatY = 0;
			}
			else if (dynamicLayer.lastY + dynamicLayer.layerHeight < windowY + windowHeight) {
				// bottom anchor
				dynamicLayer.floatY = windowHeight - dynamicLayer.layerHeight;
			}
			else {
				// no anchor => no reposition
				dynamicLayer.floatY = null;
			}
		}
		if (dynamicLayer.floatY != null) {
			if (dynamicLayer.valign=="unchanged") {
				dynamicLayer.lastY = dynamicLayer.floatY;
			}
			else {
				if (dynamicLayer.lastY==null || dynamicLayer.delayspeed==0)
				{
					dynamicLayer.lastY=windowY + dynamicLayer.floatY;
				}
				else
				{
					if (windowY+dynamicLayer.floatY>dynamicLayer.lastY) {dynamicLayer.lastY=dynamicLayer.lastY+Math.max(d/dynamicLayer.delayspeed,2);}
					if (windowY+dynamicLayer.floatY<dynamicLayer.lastY) {dynamicLayer.lastY=dynamicLayer.lastY-Math.max(d/dynamicLayer.delayspeed,2);}
				}			
			}
		}
		// horizontal reposition
		if (dynamicLayer.layerWidth > windowWidth) {
			// the layer is wider than the window => keep layer left anchored with window left and layer right anchored with window right
			if (dynamicLayer.lastX > windowX) {
				// left anchor
				dynamicLayer.floatX = 0;
			}
			else if (dynamicLayer.lastX + dynamicLayer.layerWidth < windowX + windowWidth) {
				// bottom anchor
				dynamicLayer.floatX = windowWidth - dynamicLayer.layerWidth;
			}
			else {
				// no anchor => no reposition
				dynamicLayer.floatX = null;
			}
		}
		if (dynamicLayer.floatX != null) {
			if (dynamicLayer.halign=="unchanged") {
				dynamicLayer.lastX = dynamicLayer.floatX;
			}
			else {
				if (dynamicLayer.lastX==null || dynamicLayer.delayspeed==0)
				{
					dynamicLayer.lastX=windowX + dynamicLayer.floatX;
				}
				else
				{	
					if (windowX+dynamicLayer.floatX>dynamicLayer.lastX) {dynamicLayer.lastX=dynamicLayer.lastX+Math.max(d/dynamicLayer.delayspeed,2);}
					if (windowX+dynamicLayer.floatX<dynamicLayer.lastX) {dynamicLayer.lastX=dynamicLayer.lastX-Math.max(d/dynamicLayer.delayspeed,2);}
				}
			}
		}
		// third, apply the reposition		
		if (NS4){
			document.layers[dynamicLayer.id].pageX = dynamicLayer.lastX;
			document.layers[dynamicLayer.id].pageY = dynamicLayer.lastY;
		}
		else if (NS6){
			document.getElementById(dynamicLayer.id).style.left=dynamicLayer.lastX;
			document.getElementById(dynamicLayer.id).style.top=dynamicLayer.lastY;
		}
		else if (IE4){		
			document.all[dynamicLayer.id].style.posLeft = dynamicLayer.lastX;
			document.all[dynamicLayer.id].style.posTop = dynamicLayer.lastY;		
		}
	}
	setTimeout('adjust()',50);
}

function define()
{
	for (var dynamicLayerIndex=0; dynamicLayerIndex < dynamicLayers.length; dynamicLayerIndex++)
	{
		var dynamicLayer = dynamicLayers[dynamicLayerIndex];
		if ((NS4) || (NS6))
		{
			if (dynamicLayer.halign=="left") {dynamicLayer.floatX=dynamicLayer.ifloatX};
			if (dynamicLayer.halign=="right") {dynamicLayer.floatX=window.innerWidth-dynamicLayer.ifloatX-dynamicLayer.layerWidth-20};
			if (dynamicLayer.halign=="center") {dynamicLayer.floatX=Math.round((window.innerWidth-20)/2)-Math.round(dynamicLayer.layerWidth/2)};
			if (dynamicLayer.valign=="top") {dynamicLayer.floatY=dynamicLayer.ifloatY};
			if (dynamicLayer.valign=="bottom") {dynamicLayer.floatY=window.innerHeight-dynamicLayer.ifloatY-dynamicLayer.layerHeight};
			if (dynamicLayer.valign=="center") {dynamicLayer.floatY=Math.round((window.innerHeight-20)/2)-Math.round(dynamicLayer.layerHeight/2)};
		}
		if (IE4)
		{
			if (dynamicLayer.halign=="left") {dynamicLayer.floatX=dynamicLayer.ifloatX};
			if (dynamicLayer.halign=="right") {dynamicLayer.floatX=document.body.offsetWidth-dynamicLayer.ifloatX-dynamicLayer.layerWidth-20}
			if (dynamicLayer.halign=="center") {dynamicLayer.floatX=Math.round((document.body.offsetWidth-20)/2)-Math.round(dynamicLayer.layerWidth/2)}
			if (dynamicLayer.valign=="top") {dynamicLayer.floatY=dynamicLayer.ifloatY};
			if (dynamicLayer.valign=="bottom") {dynamicLayer.floatY=document.body.offsetHeight-dynamicLayer.ifloatY-dynamicLayer.layerHeight}
			if (dynamicLayer.valign=="center") {dynamicLayer.floatY=Math.round((document.body.offsetHeight-20)/2)-Math.round(dynamicLayer.layerHeight/2)}
		}
    }
}

// to call right before the code that will be located in the dynamic layer
function beginDynamicLayer(dynamicLayer)
{
	if (NS4) {document.write('<LAYER NAME="' + dynamicLayer.id + '" LEFT="'+dynamicLayer.floatX+'" TOP="'+dynamicLayer.floatY+'">');}
	if ((IE4) || (NS6)) {document.write('<div id="' + dynamicLayer.id + '" style="position:absolute; left:'+dynamicLayer.floatX+'; top:'+dynamicLayer.floatY+'; height:'+dynamicLayer.layerHeight+'; width:'+dynamicLayer.layerWidth+'; z-index:100;">');}
}

// to call right after the code that will be located in the dynamic layer
function endDynamicLayer(dynamicLayer)
{
	if (NS4) 
	{
		document.write('</LAYER>');
	}
	if ((IE4) || (NS6)) 
	{
		document.write('</div>');
	}
}

// to call after all dynamic layer' begin and end functions, will start the animations
function runDynamicLayerAnimations()
{
	window.onresize=define;
	define();
	// start the timer
	adjust();
}

