/*	
	©2010 Red Ant Design
	Written by Dan the man
	Turns a regularly formatted <html> content page into a TABBED, DIV TOGGLING interface
	
	SEE EOF for example structure	
*/

var tabs_divs = Class.create({

	initialize: function(obj) {		

		// settings shared by script
		this.container = obj.container;
		this.control = obj.control;
		this.toggle = (typeof obj.toggle != 'undefined') ? obj.toggle : false;
		this.showFirst = (typeof obj.showFirst != 'undefined') ? obj.showFirst : false;
		this.tabs = [];
		this.controls = [];	
		this.maxHeights = [];
		this.content_divs = [];
	
		// big array of everything
		var kids = $(this.container).childElements();
		var vControls = $$('#'+this.container+' '+this.control);
		if (this.toggle != false) var vToggles = $$('#'+this.container+' '+this.toggle);
		var counter;
		
		// make dummy array
		var tab_array = [];
		for (var i=0;i<vControls.length;i++){
			tab_array.push([]);
		}
		
		// make the tab groups
		counter = 0;				
		var control_array = [];
		for (var i=0;i<kids.length;i++){			
			if (kids[i].inspect() != "<"+this.control+">"){
				tab_array[counter].push(kids[i]);
			}else{
				control_array.push(kids[i]);
			}
			if (kids[i].inspect() == "<"+this.control+">" && i > 0){
				counter += 1;
			}
		}
		
		// make the control divs
		/*	
			FROM THIS:
			<h2>Tab control</h2>
			<h2>Tab control</h2>
			<h2>Tab control</h2>
			
			TO THIS:
			<div id="controls">
				<h2><a href="#">Tab control</a></h2>
				<h2><a href="#">Tab control</a></h2>
				<h2><a href="#">Tab control</a></h2>
			</div>
		*/
		var el = new Element('div', {'id': 'controls'});
		for (var i=0;i<control_array.length;i++){
		
			control_array[i].innerHTML = '<a href="#tab-'+i+'" class="control-link">'+control_array[i].innerHTML+'</a>';
			control_array[i].writeAttribute({'id': 'control-'+i, 'class': 'control'});
			
			el.insert(control_array[i]);
			
			$(this.container).insert(el);				
			this.controls.push(control_array[i]);
		}
		
		// make the tab divs
		/*	
			FROM THIS:
			<h3>Toggle control</h3>
			<p>Content goes here</p>
			<p>Content goes here</p>
			
			TO THIS:
			<div class="toggle-item">
				<h3>Toggle control <span>open</span></h3>
				<div class="toggle-content">
					<p>Content goes here</p>
					<p>Content goes here</p>
				</div>
			</div>
		*/
			counter = 0;
			for (var i=0;i<tab_array.length;i++){
				var vTabClass = (this.toggle != false) ? 'tab' : '';
				var el = new Element('div', {'class': vTabClass, 'id': 'tab-'+i});		// 	
				var itm; var t; var sp;
				for (var q=0; q<tab_array[i].length; q++){				
				
					if (this.toggle != false){
						// accordions
						if (tab_array[i][q].inspect() == "<"+this.toggle+">"){	
							itm = new Element('div', {'class':'toggle-item'});
							t = new Element('div', {'id': 'toggle-content-'+counter, 'class':'toggle-content'});
					
							sp = new Element('span');
							
							// expand first item
							if (this.showFirst && q == 0 && i==0) { 
								tab_array[i][q].addClassName("active");
								sp.update("close");
							}else{
								sp.update("open");
							}
							tab_array[i][q].insert(sp);
							
							counter++;
							itm.insert(tab_array[i][q]);
							itm.insert(t);
							this.content_divs.push(t);
						}else{
							t.insert(tab_array[i][q]);
						}					
					
					}else{
						// no accordions
						itm = tab_array[i][q];
					}
					el.insert(itm);
				}	
				$(this.container).insert(el);
				this.tabs.push(el);
			}
		
		// listen for tab clicks	
		for (var i=0;i<vControls.length;i++){
			vControls[i].setStyle({'cursor': 'pointer'});
		    Event.observe(vControls[i], 'click', this.control_clicked.bindAsEventListener(this)); 
		    Event.observe(vControls[i].down(), 'click', this.control_clicked.bindAsEventListener(this)); 
		}

		// listen for toggler clicks
		if (this.toggle != false){		
			for (var i=0;i<vToggles.length;i++){
				vToggles[i].setStyle({'cursor': 'pointer'});
				vToggles[i].addClassName('toggler');
				Event.observe(vToggles[i], 'click', this.toggle_clicked.bindAsEventListener(this)); 
				Event.observe(vToggles[i].down(), 'click', this.toggle_clicked.bindAsEventListener(this)); 
			}
			
			// do the math
			this.checkMaxHeights();
		}
		this.listenForClicks();
		this.initialHide();		
		
	},
	
	
	// CLICK ON TAB	
	control_clicked: function(e){
		var a = Event.element(e);		
		if (a.match('a')) a = a.up();
		var id = a.readAttribute('id');
		var rec = id.substr(8, id.length);
		this.remote_click(e,rec,false);  
			
	},
	// allows us to call it 
	remote_click: function(e,rec, anchor){
		for (var i=0;i<this.tabs.length;i++){
			if (i==rec){
				this.tabs[i].setStyle({'display':'block'});
				if ( this.controls[i].hasClassName("active") == false) this.controls[i].addClassName("active");
			}else{
				this.tabs[i].setStyle({'display':'none'});
				if ( this.controls[i].hasClassName("active") ) this.controls[i].removeClassName("active");
			}
		}
		try { e.stop() } catch(e) {}
		if (anchor) new Effect.ScrollTo('tab-'+rec, {duration:'0'}); 
	},
	
	// CLICK ON TOGGLER
	toggle_clicked: function(e){	
		var a = Event.element(e);
		
		if (a.match('span')) a = a.up();
		// add an active state to the toggler
		a.toggleClassName("active");
		
		// update the close artwork
		(a.down().innerHTML == "close") ? a.down().update("open") : a.down().update("close");
		
		// now get ready to animate
		var el = a.next();
		var id = el.readAttribute('id');
		this.open_content(id);
		try { e.stop() } catch(e) {}	  
	},
	
	// SCALE THE TOGGLE CONTENT
	open_content : function(id){
		var el = $(id);
		var itm = id.substr(15,id.length);
		var effects = [];
		
		// SCALE UP
		if( el.getHeight() <= 20){ 
			var oHeight = this.maxHeights[itm];	// grab max height from pre-created array
			var options = {
			  sync: true,
			  scaleFrom: 1,
			  scaleContent: false,
			  transition: Effect.Transitions.sinoidal,
			  scaleMode: {
				originalHeight: oHeight
			  },
			  scaleX: false,
			  scaleY: true
			};
			effects.push(new Effect.Scale(el, 100, options));

			new Effect.Parallel(effects, {
			  duration: 0.4,
			  beforeStart: function() {
				el.setStyle({ visibility: "visible" });
				el.setStyle({ display: "block" });
			  },
			  afterFinish: function() {
				el.setStyle({ height: oHeight+"px" });
			  }
			});
			
		// SCALE DOWN
		}else{
			var options = {
			  sync: true,
			  scaleTo: 1,
			  scaleContent: false,
			  transition: Effect.Transitions.sinoidal,
			  scaleX: false,
			  scaleY: true
			};
			effects.push(new Effect.Scale(el, 1, options));

			new Effect.Parallel(effects, {
			  duration: 0.4,
			  afterFinish: function() {
				el.setStyle({ height: "0px" });
				el.setStyle({ visibility: "hidden" });
				el.setStyle({ display: "none" });
			  }
			});
		}
	},	

	// UTILITIES 
	listenForClicks : function(){
	  for (var i=0;i<this.controls.length;i++){
	  	var links = $$('a[href="#tab-'+i+'"]');
	    for (var q=0;q<links.length;q++){
	    	if (links[q].hasClassName("control-link") != true) {
	    		Event.observe(links[q], 'click', this.remote_click.bindAsEventListener(this,i,true)); 	  	
	    	}
	    }
	  }
	},
	
	get_control_index: function(control_name){
		var control = this.controls.find(function(each){
		  return (each.match(this.control+'#control-'+control_name));
		}, this);
		
		return this.controls.indexOf(control);
	},
	
    checkMaxHeights: function() {
        for(var i=0; i<this.content_divs.length; i++) {
            this.maxHeights.push(this.content_divs[i].getHeight());
        }
    },

    initialHide: function(){
		if (this.toggle != false){	
			for(var i=0; i<this.content_divs.length; i++) {
				if (this.showFirst && i==0){
					//
				}else{
					this.content_divs[i].hide();
					this.content_divs[i].setStyle({'height':0});
				}
			}
		}
		
		// hide everything
		for (var i=0;i< this.tabs.length;i++){
			this.tabs[i].setStyle({'display':'none'});		
		}
		
		// show what we need
		var deep = window.location.hash;
		var index = 0;
		var remote = false;
		if (deep.substr != "") {
			var found = this.get_control_index(deep.substr(5));
			if (found > -1) index = found;
			if (found > -1) remote = true 
		}
		
		this.remote_click(null, index, remote);
    }

		
});

/*	
	EXAMPLE:
	
	<div id="something">
	
		<h2>Tab title 1</h2>
						
		<h3>Anchor 1</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<h3>Anchor 2</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<h3>Anchor 3</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<h3>Anchor 4</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		
		<h2>Tab title 2</h2>
		
		<h3>Anchor 1</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<h3>Anchor 2</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<h3>Anchor 3</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		<h3>Anchor 4</h3>					
		<p>Fusce vel dui nisl, sit amet rhoncus nibh. Sed condimentum auctor eros, eu commodo erat cursus vel. Pellentesque ac fringilla diam. Curabitur interdum tellus a risus ornare bibendum. Cras libero risus, ornare vitae ornare blandit, pharetra id nisi. Etiam vel nisi orci. Aliquam erat volutpat. </p>
		
	</div>
	
	where :
		h2's are the tab titles
		h3's are the toggle items
		content between h3's is what should be hidden/revealed
		
	var TabsAndDivs = new tabs_divs( {'container':'something', 'control':'h2', 'toggle':'h3'} );
	
	OR to ONLY show tabs, simply omit the toggle attribute
	
	var TabsAndDivs = new tabs_divs( {'container':'something', 'control':'h2'} );
*/
