// JavaScript Document
// author: Crimsonshift LLC
// property of Crimsonshift LLC all rights reserved
// sliding Element Class;
// version 1.1 9/27/2008 11:00pm
// Copyright 2008

var SlidingElement={
		

	
	initialize: function(el, openerID, depth, rel, opener){
		this.openerID = openerID;
		this.depth= depth;
		this.opener=opener;
		this.rel=rel;
		
		//if(rel=="open"){
			this.elementFX = new Fx.Slide(el, {
										  	link: 'chain',
											wait: false,
											mode: 'vertical'}).hide();
	
	}
	
}


var menu = {
	
	sliders: new Array,
	openMenus: new Array,
	activeLink: false,
	
	
	openRelSlidersDepth: function(depth){
		
		var set=false;
		
		for(var i=0; i<menu.sliders.length; i++){
			var elDepth=eval(menu.sliders[i].depth)
			if(elDepth==depth && menu.sliders[i].rel=="open"){
				
				set=true;
				var menuSlider=menu.sliders[i];
				
				menuSlider.opener.className="parentSelected"
				//this.sliders[i].elementFX.slideIn();
				menuSlider.elementFX.slideIn().chain(function(){
					menu.expandParents(menuSlider)
				})
				//setTimeout("function(){return true}", 600);
				//this.expandParents(this.sliders[i]);
				
				if(!menu.openMenus[elDepth-1])
					menu.openMenus[elDepth-1]=new Array;
					
				menu.openMenus[elDepth-1].push(menu.sliders[i].openerID);
			}
		}
		
			
		return set;
	
	},
	
	getMaxDepth: function(){
	
		var depth=0;
		
		for(var i=0; i<this.sliders.length; i++){
			if(this.sliders[i].depth>depth){
				depth=this.sliders[i].depth;
			}
		}
		
		return eval(depth);
		
	},
		
	
	renderMenu: function(){
		
		
		
		var depth=this.getMaxDepth();
		while(depth>0){
			this.openRelSlidersDepth(depth);
					
			depth--;
		}
		
		//this.openMain();	
		
		
	},
	
	getElementAttribute: function(node, atName){
		if(node==undefined)
			return false;
		else{
			for(var i=0; i<node.attributes.length; i++){
				//alert(node.attributes[i].name+": "+node.attributes[i].value+" Search Value:  "+atName);
				//alert();
				if(node.attributes[i].name==atName)
					return node.attributes[i].value;
			}
			return false;
		}
	},
	
	
	getOpener: function(id){
	
		
		var openers=$$('a.slideOpener');
		
		for(var i=0; i<openers.length; i++){
			//var opener=openers[i];
			//alert(id+" , "+openers[i]+" , "+this.getElementAttribute(openers[i], "catid"))
			if(this.getElementAttribute(openers[i], "catid")==id){
				return openers[i];
			}
		}
		
		return false;
	},
	
	getSlider: function(lnk){
		
		for(var i=0; i<menu.sliders.length; i++){
			//alert("SLIDER: "+this.sliders[i].opener.element.innerHTML);
			//alert("LINK: "+lnk.innerHTML);
			var el=menu.sliders[i].opener;
			//alert("getSlider: "+el+"\n"+lnk+"\n"+eval(el==lnk))
			if(el==lnk)
				return menu.sliders[i];
		}
		
		return false;
		
	},
	
	getSliderByOpenerID: function(id){
		for(var i=0; i<this.sliders.length; i++){
			
			if(id==this.sliders[i].openerID)
				return this.sliders[i];
		}
		
		return false;
	},
	
	expandParents: function(slider){
		
		var parentID=eval(this.getElementAttribute(slider.opener, 'parentid'));
			
		
		
		if(parentID==0)
			slider.elementFX.slideIn();
		else{
		
			var pSlider=this.getSliderByOpenerID(parentID);
			
			pSlider.elementFX.slideIn().chain(function(){
				menu.expandParents(pSlider)
			})
			
		}
	},
			
			
	shrinkParents: function(slider, amt){
		
			
		var parentID=eval(this.getElementAttribute(slider.opener, 'parentid'));
		
		
		
		if(parentID==0){
			var sliderDiv=slider.elementFX.element.parentNode;
			var heightFX=new Fx.Tween(sliderDiv, {property: 'height', 'link': 'chain', 'duration':300});
		
			var hSize=sliderDiv.getSize();
			var Height=hSize.y;
			heightFX.start(Height, eval(Height-amt+4))
			return false;
		}
		else{
			
			//get the parent Slider
			var pSlider=this.getSliderByOpenerID(parentID);
			
			var sliderDiv=pSlider.elementFX.element.parentNode;
			var heightFX=new Fx.Tween(sliderDiv, {property: 'height', 'link': 'chain', 'duration':300});
		
			
			var pSize=sliderDiv.getSize();
			var pHeight=pSize.size.y;
			
			heightFX.start(pHeight, (pHeight-amt)).chain(function(){
				return menu.shrinkParents(pSlider, amt);
			})
		}
		
	},
	
	getMenuDepth: function(){
		for(var i=0; i<this.openMenus.length; i++){
			if(!this.openMenus[i])
				return i;
		}
		
		return i;
	},
	
		
	closeCurrent: function(curSlide){
	
		
		if(curSlide.rel!='open' && curSlide.elementFX.open){
			
			var sd=eval(curSlide.depth)-1;
			var sOID=curSlide.openerID;
			
			var tSize=curSlide.elementFX.element.parentNode.getSize();
			var height=tSize.y;
			
			
			try{
			
				var index=menu.openMenus[sd].indexOf(sOID);
				menu.openMenus[sd].splice(index,1)
				
				if(menu.openMenus[sd].length==0)
					menu.openMenus.splice(sd, 1);
			}
			catch(e){}
			
			
			var fx=new Fx.Tween(curSlide.opener, {property:'color', 'link': 'chain', 'duration':500});
			fx.start('#e9862b','#ffffff').chain(function(){
				
				if(menu.jscss('check',curSlide.opener,'parentSelected'));
					menu.jscss('remove',curSlide.opener,'parentSelected');
					
				if(menu.jscss('check',curSlide.opener.parentNode,'parentSelected'));
					menu.jscss('remove',curSlide.opener.parentNode,'parentSelected');
					
																		   
			});
		
			//curSlide.opener.parentNode.setStyle('color',false);
				
				
			curSlide.elementFX.slideOut().chain(function(){
			
				try{
					menu.shrinkParents(curSlide, height)
				}catch(e){}
				
			})
			
						
		}
		
						
		
	},
	
	openCurrent: function(curSlide){
	
		var sd=eval(curSlide.depth)-1;
		var sOID=curSlide.openerID;
		
		if(!menu.openMenus[sd])
			menu.openMenus[sd]=new Array;
		
		var present=false;
		for(var i=0; i<menu.openMenus[sd].length; i++){
		
			if(menu.openMenus[sd][i]==sOID)
				present=true;
				
		}
		
		if(!present){
			menu.openMenus[sd].push(sOID);
			//curSlide.opener.className="parentSelected"
			//menu.jscss('add',curSlide.opener,'parentSelected');
			
			
			var fx=new Fx.Tween(curSlide.opener, {property: 'color', 'link': 'chain', 'duration':500});
			
			fx.start('#ffffff','#e9862b').chain(function(){
				
				if(!menu.jscss('check',curSlide.opener,'parentSelected'));
					menu.jscss('add',curSlide.opener,'parentSelected');
														   
			})
		
			
			
												   
			if(!menu.jscss('check',curSlide.opener.parentNode,'parentSelected'))
					menu.jscss('add',curSlide.opener.parentNode,'parentSelected');	   
				
			
			
									
			
			curSlide.elementFX.slideIn().chain(function(){
				menu.expandParents(curSlide);
			});
		}
		
		
	},
	
	checkSliderParent: function(slider, id){
		
		if(slider.openerID=id)
			return true;
		else{
			if(slider.openerID==0)
				return false;
			else{
			
				var pID=getElementAttribute(slider.opener, "parentid") 
				var pSlide=getSliderByOpenerID(pID)
				return menu.checkSliderParent(pID, id)
			}
		}
		
		
	},
	
		
	
		
	closeChildren: function(slider){
		
		
		var oID=slider.openerID
		var oD=eval(slider.depth);
		
		
		//see if we have any open menus that are of depth +1
		if(menu.openMenus[oD] && menu.openMenus[oD].length>0){
			
			//this array stores the open sliders that have a depth +1 of the current depth
			var analyzeChildren=menu.openMenus[oD]
			
			//check if any of these children are a descendant of the current slider and if they are open
			for(var i=0; i<analyzeChildren.length; i++){
				
				//the child Slider we are currently analyzing
				var curChild=menu.getSliderByOpenerID(analyzeChildren[i]);
				
				//see if the child is a descendant
				var pID=menu.getElementAttribute(curChild.opener, "parentid")
				//if it is go deeper in the menu;
				if(pID==oID){
					menu.closeChildren(curChild)
				}
			}
			
		}
		
		
		menu.closeCurrent(slider);
		
		
		
	},
	
	makeOpeners: function(){
	
		$$('#menu a.slideOpener').each(function(opener){
			
			opener.addEvent('click', function(e){
				
										
					var curSlide=menu.getSlider(opener)
					
																									
					if(curSlide.elementFX.open){
						
						menu.closeChildren(curSlide);
						
						if (window.ie) 
							curSlide.opener.setStyle('height', '0');
											
					}
					else{
						menu.openCurrent(curSlide);
					}
									
					
					
			});
			
		
		});
		
	},
	
	jscss: function(action,el,c1,c2){
	  
	  switch (action){
		case 'swap':
		  el.className=!jscss('check',el,c1)?el.className.replace(c2,c1):
		  el.className.replace(c1,c2);
		break;
		case 'add':
		  if(!menu.jscss('check',el,c1)){el.className+=el.className?' '+c1:c1;}
		break;
		case 'remove':
		  var rep=el.className.match(' '+c1)?' '+c1:c1;
		  el.className=el.className.replace(rep,'');
		break;
		case 'check':
		  return new RegExp('\\b'+c1+'\\b').test(el.className)
		break;
	  }
	},
	
	
	makeSliders: function(){
		
		//create an array of slider objects.  These are the objects that are going to move
		//in the menu.(The UL elements of depth >0 )
		$$('ul#menu ul').each(function(slider){
			
			//alert(slider)
			//var temp=slider;
			var openerID=this.getElementAttribute(slider, "openerid");
			var depth=this.getElementAttribute(slider, "depth");
			var rel=this.getElementAttribute(slider, "rel");
			
			var opener=this.getOpener(openerID);
						
			var el=new SlidingElement.initialize(slider, openerID, depth, rel, opener);
			this.sliders.push(el);
		
		}, this);
		
		
	},

	init: function(){
			//$$('#menu li ul').each(function(lnk, index){transitionClose(lnk)});
			
			$$('#menu div').each(function(div){
				div.setStyle('padding', "0px");
				div.setStyle('margin', "0px");
			})
			
			this.makeOpeners();
			this.makeSliders();

			setTimeout("blank()", 3000 );
			//alert("hello")
			this.renderMenu();
			
			
	}
}

function blank(){
	return true;
}

window.addEvent('domready', function() {
	menu.init();
});