// ---------- Accordian navigation ----------

RHG.Classes.AccordianNav = new RHG.Class();
RHG.Classes.AccordianNav.selectors = {
	"headingSelector": ".accordian-header",
	"contentSelector": ".accordian-content",
	"currentItem": "strong"	
};
RHG.Classes.AccordianNav.classFunction = function(configObject) {
	var classFunctionPub = {};
	var thisClass = RHG.Classes.AccordianNav;
	var targetJq;
	var accordians = [];
	
	var open = function(accordian) {
		// Work out what to open and close
		var openList = [];
		
		var checkParent = function(acc) {
			if(acc.parentAccordian) {
				openList.push(acc.parentAccordian)
				checkParent(acc.parentAccordian);
			}					
		}
		checkParent(accordian);
		openList.push(accordian);
		
		// Close others
		jQuery.each(accordians, function(i){
			if (jQuery.inArray(this, openList) == -1) {
				this.close();
			} else {
				this.open();
			}						
		});
		
		return false;	
	}
	
	// CLASSES
	var Accordian = function(contentElem) {
		var AccordianPub = new Object();
		var selectors = thisClass.selectors;
		
		var children = [];
		var isOpen = true;
		
		var jqContent = jQuery(contentElem);
		var jqHeading = jqContent.siblings(selectors.headingSelector);

		AccordianPub.addChild = function(childAccordian) {
			childAccordian.parentAccordian = AccordianPub;
			children.push(childAccordian);
		}
		
		AccordianPub.open = function() {
			if (isOpen == false) {
				jqContent.removeClass("hidden");	
				
				jqContent.css({height: "auto"});
				var cacheHeight = jqContent.height();
				jqContent.css({height: 0});
				jqContent.animate({height: cacheHeight}, 400, function(){
					jqContent.css({height: "auto"});
				});
				
				opencloseToggleButton.setState(closeButton);
				isOpen = true;
			}
		}

		AccordianPub.close = function() {
			if (isOpen == true) {
				jqContent.animate({height: 0}, 400, function(){
					jqContent.addClass("hidden");					
				})				
				opencloseToggleButton.setState(openButton);	
				isOpen = false;				
			}			
		}
		
		var openButton = new RHG.Utilities.ControlButton("Open", "accordian-open");
		var closeButton = new RHG.Utilities.ControlButton("Close", "accordian-close");
		var opencloseToggleButton = new RHG.Utilities.ToggleButton([openButton, closeButton])
		openButton.setActionFunction(function(){
			open(AccordianPub);
			return false;
		});
		closeButton.setActionFunction(function(){
			AccordianPub.close();
			return false;
		});

		jqContent.before(opencloseToggleButton.currentControlButton.elemJq);		
		opencloseToggleButton.setState(closeButton);
		
		// Close it if it doesn't contain the current item
		if(jqContent.find(selectors.currentItem).length == 0 && !jqHeading.is(selectors.currentItem)) {
			AccordianPub.close();
		}		
		
		
		AccordianPub.elem = contentElem;
		
		return AccordianPub;
	}

	// INIT	
	classFunctionPub.init = function() {
		var selectors = thisClass.selectors;		
		targetJq = jQuery(configObject.uniqueTargetNodeOrSelector)
				
		jQuery.fn.getFirstChildren = function(selector) {
			var elems = this.find(selector);
			var newElems = elems.filter(function(){
				var isChild = false;
				var target = this;
				
				elems.each(function(){
					if (jQuery.contains(this, target)) {
						isChild = true;
					}
				})

				if (isChild == true) {
					return false;
				} else {
					return true;
				}
			});			
			return newElems;
		}
		
		var makeAccordians = function(parentElem, parentAccordian) {
			var elems = jQuery(parentElem).getFirstChildren(selectors.contentSelector);
			elems.each(function(){
				var accordianTemp = new Accordian(this);
				if (parentAccordian) {
					parentAccordian.addChild(accordianTemp);
				}
				accordians.push(accordianTemp)
				
				makeAccordians(this, accordianTemp)
			})
		}
		
		makeAccordians(configObject.uniqueTargetNodeOrSelector)
	}

	return classFunctionPub;
}
RHG.Classes.AccordianNav.init({
	"uniqueTargetNodeOrSelector": "#left-col"
})
