/**
 * SimpleTabs - Unobtrusive Tabs with Ajax
 *
 * @example
 *
 *	var tabs = new SimpleTabs($('tab-element'), {
 * 		selector: 'h2.tab-tab'
 *	});
 *
 * @version		1.0
 *
 * @license		MIT License
 * @author		Harald Kirschner <mail [at] digitarald.de>
 * @copyright	2007 Author
 */
var Tabs = new Class({

	Implements: [Events, Options],

	/**
	 * Options
	 */
	options: {
		show: 0,
		selector: '.tab-tab',
		classWrapper: 'tab-wrapper',
		classMenu: 'tab-menu',
		classContainer: 'tab-container',
		onSelect: function(toggle, container, index) {
			toggle.addClass('tab-selected');
			container.setStyle('display', '');
		},
		onDeselect: function(toggle, container, index) {
			toggle.removeClass('tab-selected');
			toggle.blur();
			container.setStyle('display', 'none');
		},
		onRequest: function(toggle, container, index) {
			container.addClass('tab-ajax-loading');
		},
		onComplete: function(toggle, container, index) {
			container.removeClass('tab-ajax-loading');
		},
		onFailure: function(toggle, container, index) {
			container.removeClass('tab-ajax-loading');
		},
		onAdded: Class.empty,
		getContent: null,
		ajaxOptions: {},
		cache: true
	},

	/**
	 * Constructor
	 *
	 * @param {Element} The parent Element that holds the tab elements
	 * @param {Object} Options
	 */
	initialize: function(element, options) {
		this.element = $(element);
		this.setOptions(options);
		this.selected = null;
		this.build();
	},

	build: function() {
		this.tabs = [];
		this.menu = new Element('ul', {'class': this.options.classMenu});
		this.wrapper = new Element('div', {'class': this.options.classWrapper});

		this.element.getElements(this.options.selector).each(function(el) {
			var content = el.get('href') || (this.options.getContent ? this.options.getContent.call(this, el) : el.getNext());
			this.addTab(el.innerHTML, el.title || el.innerHTML, content);
		}, this);
		this.element.empty().adopt(this.menu, this.wrapper);

		if (this.tabs.length) this.select(this.options.show);
	},

	/**
	 * Add a new tab at the end of the tab menu
	 *
	 * @param {String} inner Text
	 * @param {String} Title
	 * @param {Element|String} Content Element or URL for Ajax
	 */
	addTab: function(text, title, content) {
		var grab = $(content);
		var container = (grab || new Element('div'))
			.setStyle('display', 'none')
			.addClass(this.options.classContainer)
			.inject(this.wrapper);
		var pos = this.tabs.length;
		var evt = (this.options.hover) ? 'mouseenter' : 'click';
		var tab = {
			container: container,
			toggle: new Element('li').grab(new Element('a', {
				id: removeSpaces(title),
				href: '#',
				title: title
			}).grab(
				new Element('span', {html: text})
			)).addEvent(evt, this.onClick.bindWithEvent(this, [pos])).inject(this.menu)
		};
		if (!grab && $type(content) == 'string') tab.url = content;
		this.tabs.push(tab);
		return this.fireEvent('onAdded', [tab.toggle, tab.container, pos]);
	},

	onClick: function(evt, index) {
		this.select(index);
		return false;
	},

	/**
	 * Select the tab via tab-index
	 *
	 * @param {Number} Tab-index
	 */
	select: function(index) {
		if (this.selected === index || !this.tabs[index]) return this;
		if (this.ajax) this.ajax.cancel().removeEvents();
		var tab = this.tabs[index];
		var params = [tab.toggle, tab.container, index];
		if (this.selected !== null) {
			var current = this.tabs[this.selected];
			if (this.ajax && this.ajax.running) this.ajax.cancel();
			params.extend([current.toggle, current.container, this.selected]);
			this.fireEvent('onDeselect', [current.toggle, current.container, this.selected]);
		}
		this.fireEvent('onSelect', params);
		if (tab.url && (!tab.loaded || !this.options.cache)) {
			this.ajax = this.ajax || new Request.HTML();
			this.ajax.setOptions({
				url: tab.url,
				method: 'get',
				update: tab.container,
				onFailure: this.fireEvent.pass(['onFailure', params], this),
				onComplete: function(resp) {
					tab.loaded = true;
					this.fireEvent('onComplete', params);
				}.bind(this)
			}).setOptions(this.options.ajaxOptions);
			this.ajax.send();
			this.fireEvent('onRequest', params);
		}
		this.selected = index;
		return this;
	}

});

/**
 *  END SimpleTabs
 */ 
	
function hasClass(ele,cls) 
{
	return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}

function addClass(ele,cls) 
{
	if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}

function removeClass(ele,cls) 
{
	if (hasClass(ele,cls)) {
		var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
		ele.className=ele.className.replace(reg,' ');
	}
}

function hideText(thisfield) {
	if (thisfield.value == thisfield.title) {
		thisfield.value = "";
		removeClass(thisfield, "subtle");
	}
}

function showText(thisfield) {
	if (thisfield.value == "") {
		thisfield.value = thisfield.title;		
		addClass(thisfield, "subtle");
	}
}

function createCookie(name,value,days) 
{
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) 
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) 
{
	createCookie(name,"",-1);
}
function removeSpaces(string) {
 	return string.split(' ').join('-');
}

function attachCalendarControls(calendar)
{

	var calendar;

	nodes = new Array($(calendar).getElements('a.prev'), $(calendar).getElements('a.next'));
	
	for (i = 0; i < nodes.length; i++)
	{
	
		nodes[i].addEvent('click', function(e) {
				
			e = new Event(e);
			
			//$(calendar).set('text', 'Loading, please wait...');
			date 	= this.href.substring(this.href.length-7);
			var url = '/calendar/get/'+calendar+'/'+date+'?_frameset=true';
			
			var req = new Request.HTML({
				url: url,
				onSuccess: function(html) {
					$(calendar).set('text', '');
					$(calendar).adopt(html);
					attachCalendarControls(calendar);
					attachCalendarTooltips(calendar, eventList);
				},
				onFailure: function() {
					var url = '/calendar/set/'+calendar+'/'+date+'?_frameset=true';
					window.location.href = url;
					//$('sourceWrapper').set('text', 'There was a problem fetching the calendar, please refresh the page.');
				}
			});
			
			req.send();
				
			e.stop();
			
		});
	}
}



function showHideContainer(source, container, showText, hideText) {
	linkStyle = 'link';
	toggleElement($(source), $(container), showText, hideText);
	$(source).addEvent('click', function(e) {
		toggleElement(this, $(container), showText, hideText);
	});
}

function moreLess(container)
{

	var toggle 	= $(container).getElement('a.toggle');
	var img 	= $(toggle).getElement('img');
	var less 	= $(container).getElement('div.less');
	var more 	= $(container).getElement('div.more');
	
	toggle.addEvent('click', function(e) {
	
		e = new Event(e);
		
		//alert("boo");
	
		if (more.style.display == 'none')
		{
			less.style.display = 'none';
			more.style.display = 'block';
			img.src = '/static/images/site/button-less.gif';
		}
		else
		{
			more.style.display = 'none';
			less.style.display = 'block';
			img.src = '/static/images/site/button-more.gif';
		
		}
		
		e.stop();
	});

}


function toggleElement(obj, container,  showText, hideText) {
		if (hasClass(obj, linkStyle + 'Off')) {
			removeClass(obj, linkStyle + 'Off');
			addClass(obj, linkStyle + 'On');
			container.style.display = 'block';
			obj.innerHTML = hideText;
		} else {
			removeClass(obj, linkStyle + 'On');
			addClass(obj, linkStyle + 'Off');
			container.style.display = 'none';
			obj.innerHTML = showText;
		}
}


function collapseHeaders()
{

	nodes = $(document.body).getElements('div.titleBar');
 	
	for (i = 0; i < nodes.length; i++)
	{
			
		var node = $(nodes[i].id.substring(0, (nodes[i].id.length-3)));

		removeClass(nodes[i], "on");
		addClass(nodes[i], "off");
		node.style.display = 'none';
	}
}




function attachCalendarTooltips(calendar, eventList)
{
	eventList.each(function(el,i) {
		if (eventList[i] && eventList[i].length) {
			html = '';

			eventList[i].each(function(el2,j) {
				if (eventList[i][j]) {
					html += '<span class="time">' + eventList[i][j]['time'] + '</span><span class="title">' + eventList[i][j]['title'] + '</span><br />';
				}
			});

			$('day_'+i).title = html;
		}
	});

	var diaryTips = new Tips('.event', {
						fixed: true,
						className: 'tips',
						offsets: {'x': -7, 'y': 18},
						hideDelay: 500
					});

}


 /**
 *  Show/Hide content from Title Bars
 */
 
 window.addEvent('domready', function() {

	// 
	// Go through DOM, locating "collapsible" regions and add event handlers
	//
 	nodes = $(document.body).getElements('div.titleBar');
 	
	for (i = 0; i < nodes.length; i++)
	{
			
		var node = $(nodes[i].id.substring(0, (nodes[i].id.length-3)));
	
		if (node)
		{
		
			addClass(nodes[i], 'on');
		
			nodes[i].addEvent('click', function(e) {
			
				var node = $(this.id.substring(0, (this.id.length-3)));
				
				var el = (e&&e.target) || (event&&event.srcElement);
				if (el.tagName == "INPUT" || el.href) return;
			
				if (hasClass(this, "off"))
				{
					removeClass(this, "off");
					addClass(this, "on");
					node.style.display = 'block';
				}
				else
				{
					removeClass(this, "on");
					addClass(this, "off");
					node.style.display = 'none';
				
				}
				
			});
		}
	}
	
	
	nodes = $(document.body).getElements('.selectAll');
	
	for (i = 0; i < nodes.length; i++)
	{
	
		var element = new Element('input', {
			'type': 'checkbox',
			'title': "Select all",
			'events': {
				'click': function(){
	
					var parent = this.getParent('table');
					var checkboxes = parent.getElements('input');
					
					for (j = 0; j < checkboxes.length; j++)
					{
						if (checkboxes[j].type == 'checkbox')
						{
							checkboxes[j].checked = (this.checked) ? true : false;
							var parentRow = checkboxes[j].getParent('tr');
							if (this.checked) {
								parentRow.addClass('selected');
							}
							else
							{
								parentRow.removeClass('selected');
							}
						}
					}
					
				}
			}
		});
    
    	nodes[i].grab(element);
    	
    }
	
});