//  This file contains javascript to control generic accordions

var accordionWidth = 360;
var accordionHeaders = new Array();
var accordionLeftArrows = new Array();
var accordionRightArrows = new Array();

function setUpAccordion(){
	var sibHeaders = $$('.accordionHeader');
	var len = sibHeaders.length;
	for(i=0; i<len; i++){
		accordionHeaders[i] = sibHeaders[i];
		accordionHeaders[i].bfx = toggleAccordionAuto.bindAsEventListener(accordionHeaders[i], 0.1, true);
		Event.observe(accordionHeaders[i], 'click', accordionHeaders[i].bfx);	
	}
	
	var leftArrows = $$('.leftArrow');
	len = leftArrows.length;
	for(j=0; j<len; j++){
		accordionLeftArrows[j] = leftArrows[j];
		accordionLeftArrows[j].bfx = moveTableRight.bindAsEventListener(accordionLeftArrows[j], j, accordionLeftArrows[j].next().childElements()[0].id);
		Event.observe(accordionLeftArrows[j], 'click', accordionLeftArrows[j].bfx);	
	}
	
	var rightArrows = $$('.rightArrow');
	len = rightArrows.length;
	for(k=0; k<len; k++){
		accordionRightArrows[k] = rightArrows[k];
		accordionRightArrows[k].bfx = moveTableLeft.bindAsEventListener(accordionRightArrows[k], k, accordionRightArrows[k].previous().childElements()[0].id);
		Event.observe(accordionRightArrows[k], 'click', accordionRightArrows[k].bfx);	
	}
}

/*
function toggleAccordionAuto(parentObj){
	toggleAccordionAuto(parentObj, 0.3);
}

function toggleAccordionAuto(parentObj, speed){
	toggleAccordionAuto(parentObj, speed, true);
}
*/

function toggleAccordionAuto(parentObj, speed, closeChildren){
	var obj = parentObj.element();
	var effectsArray = new Array();
	var divId = obj.id;	
	var dataObj = $(divId + 'Data');
	if(speed == null){
		speed = 0.3;
	}
	
	var openDiv;
	if(closeChildren){
		var sibHeaders = $$('.accordionHeader');
		var sibs = $$('.accordionData');
		var len = sibs.length;
		for(i=0; i<len; i++){
			Event.stopObserving(accordionHeaders[i], 'click', accordionHeaders[i].bfx);
			if(sibHeaders[i].hasClassName('open') && (sibHeaders[i].id != obj.id)){
				openDiv = sibs[i].id;
				sibHeaders[i].removeClassName('open');
				sibHeaders[i].addClassName('closed');
				break;
			}
		}
	}
	
	if(obj.hasClassName('closed')){
		obj.removeClassName('closed');
		obj.addClassName('open');
	}
	
	if(openDiv != null){
		new Effect.Parallel([
			new Effect.BlindUp($(openDiv)),
			new Effect.BlindDown($(dataObj.id))
		], {duration: 0.1});
	}
	
	//Wait for effect to finish before adding back listeners
	setTimeout(addMouseListenersBack, 0);
}

/*
function toggleAccordionClick(obj){
	toggleAccordionClick(obj, 0.3);
}
*/
function toggleAccordionClick(obj, speed){
	var divId = obj.id;	
	var dataObj = $(divId + 'Data');
	if(speed == null){
		speed = 0.3;
	}
	new Effect.toggle(dataObj.id, 'blind', {duration: speed});
}

function toggleObjectInnerHTML(obj, closedText, openText){
	if(obj.innerHTML == closedText){
		obj.innerHTML = openText;
	} else {
		obj.innerHTML = closedText;
	}
}

function addMouseListenersBack(){
	var sibs = $$('.accordionData');
	var len = sibs.length;
		
	for(var j=0; j<len; j++){
		Event.observe(accordionHeaders[j], 'click', accordionHeaders[j].bfx);
	}
}

function  moveTableRight(event, arrayIndex, tableId){
	var arrowObj = event.element();
	var table = $(tableId);
	Event.stopObserving(accordionLeftArrows[arrayIndex], 'click', accordionLeftArrows[arrayIndex].bfx);
	if(table.positionedOffset().left < 0){
		new Effect.Move(table, { x: accordionWidth, y: 0, duration: 1.0, mode: 'relative' });
		setTimeout(addLeftArrowListenersBack, 1000);
	} else {
		new Effect.Move(table, { x: 10, y: 0, mode: 'relative', duration: 0.1, queue: 'front' });
		new Effect.Move(table, { x: -10, y: 0, mode: 'relative', duration: 0.1, queue: 'end' });
		setTimeout(addLeftArrowListenersBack, 150);
	}	
}

function addRightArrowListenersBack(){
	var arrows = $$('.rightArrow');
	var len = arrows.length;
		
	for(j=0; j<len; j++){
		Event.observe(accordionRightArrows[j], 'click', accordionRightArrows[j].bfx);
	}
}

function  moveTableLeft(event, arrayIndex, tableId){
	var arrowObj = event.element();
	var table = $(tableId);
	Event.stopObserving(accordionRightArrows[arrayIndex], 'click', accordionRightArrows[arrayIndex].bfx);
	if((table.getWidth() - Math.abs(table.positionedOffset().left)) > accordionWidth){
		new Effect.Move(table, { x: (-1 * accordionWidth), y: 0, duration: 1.0, mode: 'relative' });
		setTimeout(addRightArrowListenersBack, 1000);	
	} else {
		new Effect.Move(table, { x: -10, y: 0, mode: 'relative', duration: 0.1, queue: 'front' });
		new Effect.Move(table, { x: 10, y: 0, mode: 'relative', duration: 0.1, queue: 'end' });
		setTimeout(addRightArrowListenersBack, 150);
	}
}

function addLeftArrowListenersBack(){
	var arrows = $$('.leftArrow');
	var len = arrows.length;
		
	for(j=0; j<len; j++){
		Event.observe(accordionLeftArrows[j], 'click', accordionLeftArrows[j].bfx);
	}
}

function  moveTableUp(event, arrayIndex, tableId){
	var arrowObj = event.element();
	var table = $(tableId);
	Event.stopObserving(accordionUpArrows[arrayIndex], 'click', accordionUpArrows[arrayIndex].bfx);
	if(table.positionedOffset().top < 0){
		new Effect.Move(table, { x: 0, y: accordionHeight, duration: 1.0, mode: 'relative' });
		setTimeout(addLeftArrowListenersBack, 1000);
	} else {
		new Effect.Move(table, { x: 0, y: 10, mode: 'relative', duration: 0.1, queue: 'front' });
		new Effect.Move(table, { x: -0, y: -10, mode: 'relative', duration: 0.1, queue: 'end' });
		setTimeout(addUpArrowListenersBack, 150);
	}	
}

function addUpArrowListenersBack(){
	var arrows = $$('.upArrow');
	var len = arrows.length;
		
	for(j=0; j<len; j++){
		Event.observe(accordionUpArrows[j], 'click', accordionUpArrows[j].bfx);
	}
}

function  moveTableDown(event, arrayIndex, tableId){
	var arrowObj = event.element();
	var table = $(tableId);
	Event.stopObserving(accordionDownArrows[arrayIndex], 'click', accordionDownArrows[arrayIndex].bfx);
	if((table.getHeight() - Math.abs(table.positionedOffset().top)) > accordionHeight){
		new Effect.Move(table, { x: 0, y: (-1 * accordionHeight), duration: 1.0, mode: 'relative' });
		setTimeout(addRightArrowListenersBack, 1000);	
	} else {
		new Effect.Move(table, { x: 0, y: -10, mode: 'relative', duration: 0.1, queue: 'front' });
		new Effect.Move(table, { x: 0, y: 10, mode: 'relative', duration: 0.1, queue: 'end' });
		setTimeout(addDownArrowListenersBack, 150);
	}
}

function addDownArrowListenersBack(){
	var arrows = $$('.upArrow');
	var len = arrows.length;
		
	for(j=0; j<len; j++){
		Event.observe(accordionDownArrows[j], 'click', accordionDownArrows[j].bfx);
	}
}


