// Navigation 
function showBranch() {
		var string ="";
		var test= new Array ();
		if (showBranch.arguments.length==1)
		{
			if (showBranch.arguments[0]=='x')
			{
				clearCookie();
			}
		}
		for (var i=0; i<showBranch.arguments.length; i++)
		{
			test[i]=0;
		}
		
		
		for (var i=0; i<1; i++) {
			test[i]=0;
			d = document.getElementById(showBranch.arguments[i]);
			if (d) { 
				/* test to see if first element is already opened*/
				if (d.style.display=='block')
				{
					test[i]=1;
				}
			}
		}
		
		for (var i = 0; i<=200; i++) {
			d = document.getElementById('menu'+i);
			if (d) {
				d.style.display='none';
				}
		}
	
		
		for (var i=0; i<showBranch.arguments.length; i++) {
			d = document.getElementById(showBranch.arguments[i]);
			if (d) { 
				clearCookie();
				if (test[i]==0)
				{
					d.style.display='block';
					string += showBranch.arguments[i] + ".";
				}
			}
		}
		if (string!="")
		{
			setCookie('cssBranch',string);
		}
		/*if (showBranch.arguments.length==0 || (showBranch.arguments.length==1 && String (showBranch.arguments[0]).indexOf('menu')==-1))
		{
			var aOpen = this.getCookie('cssBranch').split('.');
			for (var n=0; n<aOpen.length; n++)
			{
				d = document.getElementById(aOpen[n]);
				if (d) {
					d.style.display='block';
					}
			}
		}*/

	}
	
	// [Cookie] Checks if a node id is in a cookie
function isOpen(id) {
	var aOpen = this.getCookie('co' + this.obj).split('.');
	for (var n=0; n<aOpen.length; n++)
		if (aOpen[n] == id) return true;
	return false;
};
	


	
/**********  Cookie functions **********/

// [Cookie] Clears a cookie
function clearCookie() {
	var now = new Date();
	var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24);
	this.setCookie('cssBranch', 'cookieValue', yesterday);

};

// [Cookie] Sets value in a cookie
function setCookie(cookieName, cookieValue, expires, path, domain, secure) {
	document.cookie =
		escape(cookieName) + '=' + escape(cookieValue)
		+ (expires ? '; expires=' + expires.toGMTString() : '')
		+ (path ? '; path=' + path : '')
		+ (domain ? '; domain=' + domain : '')
		+ (secure ? '; secure' : '');
};


// [Cookie] Gets a value from a cookie
function getCookie (cookieName) {
	var cookieValue = '';
	var posName = document.cookie.indexOf(escape(cookieName) + '=');
	if (posName != -1) {
		var posValue = posName + (escape(cookieName) + '=').length;
		var endPos = document.cookie.indexOf(';', posValue);
		if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos));
		else cookieValue = unescape(document.cookie.substring(posValue));
	}
	return (cookieValue);
};

// [Cookie] Returns ids of open nodes as a string
function updateCookie() {
	var str = '';
	for (var n=0; n<this.aNodes.length; n++) {
		if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {
			if (str) str += '.';
			str += this.aNodes[n].id;
		}
	}
	this.setCookie('co' + this.obj, str);
};



// Photo effects 
var Prototype = {
  Version: '1.2.1'
}

var Class = {
  create: function() {
    return function() { 
      this.initialize.apply(this, arguments);
    }
  }
}

var Abstract = new Object();

Object.prototype.extend = function(object) {
  for (property in object) {
    this[property] = object[property];
  }
  return this;
}

Function.prototype.bind = function(object) {
  var method = this;
  return function() {
    method.apply(object, arguments);
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var method = this;
  return function(event) {
    method.call(object, event || window.event);
  }
}

Number.prototype.toColorPart = function() {
  var digits = this.toString(16);
  if (this < 16) return '0' + digits;
  return digits;
}

var Try = {
  these: function() {
    var returnValue;
    
    for (var i = 0; i < arguments.length; i++) {
      var lambda = arguments[i];
      try {
        returnValue = lambda();
        break;
      } catch (e) {}
    }
    
    return returnValue;
  }
}


/*--------------------------------------------------------------------------*/

function $() {
  var elements = new Array();
  
  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1) 
      return element;
      
    elements.push(element);
  }
  
  return elements;
}

/*--------------------------------------------*/

Effect2 = {}
    
	/* ------------- transitions ------------- */

	Effect2.Transitions = {}
	Effect2.Transitions.linear = function(pos) {
		return pos;
	}
	Effect2.Transitions.sinoidal = function(pos) {
		return (-Math.cos(pos*Math.PI)/2) + 0.5;
	}
	Effect2.Transitions.reverse  = function(pos) {
		return 1-pos;
	}
	Effect2.Transitions.flicker = function(pos) {
		return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random(0.25);
	}
	Effect2.Transitions.wobble = function(pos) {
		return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
	}
	
	/* ------------- core effects ------------- */

	Effect2.Base = function() {};
	Effect2.Base.prototype = {
	  setOptions: function(options) {
	    this.options = {
	      transition: Effect2.Transitions.sinoidal,
	      duration:   1.0,   // seconds
	      fps:        25.0,  // max. 100fps
	      sync:       false, // true for combining
	      from:       0.0,
	      to:         1.0
	    }.extend(options || {});
	  },
	  start: function(options) {
	    this.setOptions(options || {});
	    this.currentFrame    = 0;
		  this.startOn  = new Date().getTime();
		  this.finishOn = this.startOn + (this.options.duration*1000);
		  if(this.options.beforeStart) this.options.beforeStart(this);
	    if(!this.options.sync) this.loop();	
	  },
	  loop: function() {
		 timePos = new Date().getTime();
		 if(timePos >= this.finishOn) {
			this.render(this.options.to);
			if(this.finish) this.finish(); 
			if(this.options.afterFinish) this.options.afterFinish(this);
			return;	
		 }
		 pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
		 frame = Math.round(pos * this.options.fps * this.options.duration);
		 if(frame > this.currentFrame) {
			this.render(pos);
			this.currentFrame = frame;
		 }
		 this.timeout = setTimeout(this.loop.bind(this), 10);
	  },
	  render: function(pos) {
		 if(this.options.transition) pos = this.options.transition(pos);
	  	 pos  = pos * (this.options.to-this.options.from);
	     pos += this.options.from; 
	  	 if(this.options.beforeUpdate) this.options.beforeUpdate(this);
	  	 if(this.update) this.update(pos);
	  	 if(this.options.afterUpdate) this.options.afterUpdate(this);	
	  },
	  cancel: function() {
		 if(this.timeout) clearTimeout(this.timeout);
	  }
	}
	
	Effect2.Parallel = Class.create();
		Effect2.Parallel.prototype = (new Effect2.Base()).extend({
		  initialize: function(effects) {
		    this.effects = effects || [];
		  	 this.start(arguments[1]);
		  },
		  update: function(position) {
		  	 for (var i = 0; i < this.effects.length; i++)
		  		this.effects[i].render(position);	
		  },
		  finish: function(position) {
		  	 for (var i = 0; i < this.effects.length; i++)
		  	  	if(this.effects[i].finish) this.effects[i].finish(position);
		  }
		});

  Effect2.Opacity = Class.create();
  Effect2.Opacity.prototype = (new Effect2.Base()).extend({
	  initialize: function() {
	    this.element = $(arguments[0] || document.rootElement);
	    options = {
	      from: 0.0,
	      to:   1.0
	  	}.extend(arguments[1] || {});
	  	this.start(options);
	  },
	  update: function(position) {
	  	this.setOpacity(position);
	  }, 
	  setOpacity: function(opacity) {
	  	opacity = (opacity == 1) ? 0.99999 : opacity;
	  	this.element.style.opacity = opacity;
	  	this.element.style.filter = "alpha(opacity:"+opacity*100+")";
	  }
	});

	Effect2.MoveBy = Class.create();
   Effect2.MoveBy.prototype = (new Effect2.Base()).extend({
     initialize: function(element, toTop, toLeft) {
     	 this.element      = $(element);
    	 this.originalTop  = 
         this.element.style.top ? parseFloat(this.element.style.top) : 0;
       this.originalLeft = 
         this.element.style.left ? parseFloat(this.element.style.left) : 0;
       this.toTop        = toTop;
     	 this.toLeft       = toLeft;
       if(this.element.style.position == "")
         this.element.style.position = "relative";
       this.start(arguments[3]);
     },
     update: function(position) {
	    topd  = this.toTop  * position + this.originalTop;
	    leftd = this.toLeft * position + this.originalLeft;
   	 this.setPosition(topd, leftd);
     },
     setPosition: function(topd, leftd) {
     	 this.element.style.top  = topd  + "px";
       this.element.style.left = leftd + "px";
     }
	});

	Effect2.Scale = Class.create();
	Effect2.Scale.prototype = (new Effect2.Base()).extend({
	  initialize: function(element, percent) {
	    this.element = $(element)
	    options = {
	      scaleX: true,
	      scaleY: true,
	      scaleContent: true,
	      scaleFromCenter: false,
	      scaleMode: 'box',        // 'box' or 'contents'
	      scaleFrom: 100.0
	    }.extend(arguments[2] || {});
	    this.originalTop    = this.element.offsetTop;
	    this.originalLeft   = this.element.offsetLeft;
	    if (this.element.style.fontSize=="") this.sizeEm = 1.0;
	    if (this.element.style.fontSize && this.element.style.fontSize.indexOf("em")>0)
	       this.sizeEm      = parseFloat(this.element.style.fontSize);
	    this.factor = (percent/100.0) - (options.scaleFrom/100.0);
	    if(options.scaleMode=='box') {
	      this.originalHeight = this.element.clientHeight;
	      this.originalWidth  = this.element.clientWidth; 
	    } else 
	    if(options.scaleMode=='contents') {
	      this.originalHeight = this.element.scrollHeight;
	      this.originalWidth  = this.element.scrollWidth;
	    }
	    this.start(options);
	  },

	  update: function(position) {
	    currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
	    if(this.options.scaleContent && this.sizeEm) 
	      this.element.style.fontSize = this.sizeEm*currentScale + "em";
	    this.setDimensions(
		   this.originalWidth * currentScale, 
		   this.originalHeight * currentScale);
	  },

	  setDimensions: function(width, height) {
	    if(this.options.scaleX) this.element.style.width = width + 'px';
	    if(this.options.scaleY) this.element.style.height = height + 'px';
	    if(this.options.scaleFromCenter) {
	      topd  = (height - this.originalHeight)/2;
	      leftd = (width  - this.originalWidth)/2;
	      if(this.element.style.position=='absolute') {
	        if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px";
	        if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px";
	      } else {
	        if(this.options.scaleY) this.element.style.top = -topd + "px";
	        if(this.options.scaleX) this.element.style.left = -leftd + "px";
	      }
	    }
	  }
	});
	
	/* ------------- prepackaged effects ------------- */

	Effect2.Puff = function(element) 
	{

	  new Effect2.Parallel
	  (
	   [ 
			new Effect2.Scale(element, 200, { sync: true, scaleFromCenter: true }), 
	     	new Effect2.Opacity(element, { sync: true, to: 0.0, from: 1.0 })
		], 
	     { duration: 1.0, 
		    afterUpdate: function(effect) 
		     { effect.effects[0].element.style.position = 'absolute'; },
		    afterFinish: function(effect)
		     {
				new Effect2.Scale(element, 50, { scaleFromCenter: true, duration: 0.0 });
			
				new Effect2.Opacity(element,
				{ duration: 0.0, 
				  transition: Effect2.Transitions.linear, 
				  from: 1.0, to: 1.0 });
			 }
	     }
       );

	 }
