/**
 * 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', {
				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 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.groupBar');
 	
	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
					});

}



function attachLetters(alphabet)
{

	nodes = alphabet.getElements('li');
	
	for (i = 0; i < nodes.length; i++)
	{
		
		nodes[i].addEvent('click', function(e){ 
			
			e = new Event(e);
			
			alphabet.getElement('a.selected').className = '';
			this.getFirst('a').className = 'selected';
			
			newUrl = '/ajax/companies/alphabet/'+this.id+'?_frameset=true';
			
			$('ajaxCompanies').set('text', 'Loading, please wait...');
			
			var req = new Request.HTML({
				url:newUrl,
				onSuccess: function(html) {
					$('ajaxCompanies').set('text', '');
					$('ajaxCompanies').adopt(html);
					attachPages($('ajaxCompanyPages'));
				},
				onFailure: function() {
					$('ajaxCompanies').set('text', 'There was a problem fetching the results, please try again.');
				}
			});
			
			req.send();
			
			e.stop(); 
		});
	}
}



function attachPages(pages)
{

	nodes = pages.getElements('a');
	
	for (i = 0; i < nodes.length; i++)
	{
		
		nodes[i].addEvent('click', function(e){ 
			
			e = new Event(e);
			
			newUrl = this.href;
			
			$('ajaxCompanies').set('text', 'Loading, please wait...');
			
			var req = new Request.HTML({
				url:newUrl+'?_frameset=true',
				onSuccess: function(html) {
					$('ajaxCompanies').set('text', '');
					$('ajaxCompanies').adopt(html);
					attachPages($('ajaxCompanyPages'));
				},
				onFailure: function() {
					$('ajaxCompanies').set('text', 'There was a problem fetching the results, please try again.');
				}
			});
			
			req.send();
			
			e.stop(); 
		});
	}
}



 /**
 *  Show/Hide content from Title Bars
 *	Note: Keiron added fixes to enable support for IE 6 by using a 'toggler' div.
 */
 
 window.addEvent('domready', function() {

	// 
	// Go through DOM, locating "collapsible" regions and add event handlers
	//
 	nodes = $(document.body).getElements('div.titleBar');
 	//nodes = nodes.concat($(document.body).getElements('div.groupBar'));
 	
	for (i = 0; i < nodes.length; i++)
	{
			
		var node = $(nodes[i].id.substring(0, (nodes[i].id.length-3)));
	
		if (node)
		{
		
			nodes[i].getElements('.toggler').each(
				function (item, index) {
					addClass(item, "on");
				} );
		
			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 || el.tagName == "IMG") return;
				
				// get children
				this.getElements('.toggler').each(
					function (item, index) {
						if (hasClass(item, "off"))
						{
							removeClass(item, "off");
							addClass(item, "on");
						}
						else
						{
							removeClass(item, "on");
							addClass(item, "off");
						
						}
					} );
			
				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);
    	
    }
    
	/**
	 * Listener for loading more suggestions
	 */
	element = $('suggestions_more');
	if (element != null) {
		 $('suggestions_more').addEvent('click', function() {
			getSuggestions();
			
			return false;
		 });
	 }
});

/**
 * Suggestions
 */
suggestions = {};
suggestions.schemes_available = true;
suggestions.events_available = true;
suggestions.items_returned = {}
suggestions.schemes_current_ids = new Array();
suggestions.events_current_ids = new Array();
suggestions.running = false;

function getSuggestions() {
	if (suggestions.running) {
		return false;
	}
	
	suggestions.running = true;
	
	suggestions.events_available = true;
	suggestions.schemes_available = true;
	
	if (!suggestions.schemes_available && !suggestions.events_available) {
		suggestions.running = false;
		
		return false;
	}
	
	$('suggestions_loader').setStyle('display', 'block');

	suggestions.items_returned = {}
	
	suggestions.schemes_current_ids = new Array();
	suggestions.events_current_ids = new Array();
	while((suggestions.schemes_available || suggestions.events_available) && countObjectProperties(suggestions.items_returned) < 5) {
		if (suggestions.schemes_available) {
			if (countObjectProperties(suggestions.items_returned) == 5) break;
			getSuggestedSchemes();
		}
		
		if (suggestions.events_available) {
			if (countObjectProperties(suggestions.items_returned) == 5) break;
			
			getSuggestedEvents();
		}
	}
	
	if (countObjectProperties(suggestions.items_returned) == 0 && !suggestions.schemes_available && !suggestions.events_available) {
		$('suggestions_none_found').setStyle('display', 'block');
		$('suggestions_more').setStyle('display', 'none');
	}
	else {
		// sort results and output to screen
		var timestamps = new Array();
		for(x in suggestions.items_returned) {
			timestamps.push(x);
		}
		
		timestamps.sort( function (a, b){return (a > b) - (a < b);} );
		
		new_items = '';
		
		for(x in timestamps) {
			if (typeof timestamps[x] != 'function' && typeof timestamps[x] != 'object') {
				new_items += suggestions.items_returned[timestamps[x]];
			}
		}
		
		$('suggestions').innerHTML = new_items;
	}
	
	if (countObjectProperties(suggestions.items_returned) != 0 && countObjectProperties(suggestions.items_returned) < 5) {
		$('suggestions_more').setStyle('display', 'none');
		$('suggestions_even_more').setStyle('display', 'block');
	}
	
	$('suggestions_loader').setStyle('display', 'none');
	
	suggestions.running = false;
}

function getSuggestedSchemes() {
	data = {'exclude_ids': suggestions.schemes_current_ids}

	var req = new Request({  
		 method: 'post',
		 url: '/ajax/schemes/suggestions/0/1',
		 data: data,
		 async: false,
		 onRequest: function() {},
		 onComplete: function(response) {
		 	schemes = JSON.decode(response);
		 	
			if (countObjectProperties(schemes) == 0) {
				suggestions.schemes_available = false;
				return;
			}
		 	
			x = 0;
			
			while(typeof schemes[x] == 'object') {
				timestamp = schemes[x].ordering_timestamp;
				while (typeof suggestions.items_returned[timestamp] == 'string') {
					timestamp += 1;
				}
				
				suggestions.items_returned[timestamp] = '<div class="scheme_suggested">\
															<div class="alert">\
																<div class="upper"><a href="/companies/'+schemes[x].company_reference+'/schemes/'+schemes[x].reference+'">'+schemes[x].title+'</a> for <a href="/companies/'+schemes[x].company_reference+'">'+schemes[x].company_title+'</a></div>\
																<div class="lower"><strong>'+schemes[x].type_formatted+'</strong>'+(schemes[x].closing_date_option == 'date' ? ' closing on '+schemes[x].date_formatted : '')+'</div>\
															</div>\
															<div class="footer"></div>\
														 </div>';
				
				suggestions.schemes_current_ids.push(schemes[x].id);
				
				x++;
			}
		 }
	}).send();
}

function getSuggestedEvents() {
	data = {'exclude_ids': suggestions.events_current_ids}
	
	var req = new Request({
		 method: 'post',
		 url: '/ajax/events/suggestions/0/1',
		 data: data,
		 async: false,
		 onRequest: function() {},
		 onComplete: function(response) {
			events = JSON.decode(response);
			
			if (countObjectProperties(events) == 0) {
				suggestions.events_available = false;
				return;
			}
			
			x = 0;
			
			while(typeof events[x] == 'object') {
				timestamp = events[x].ordering_timestamp;
				while (typeof suggestions.items_returned[timestamp] == 'string') {
					timestamp += 1;
				}
				
				suggestions.items_returned[timestamp] = '<div class="event_suggested">\
										<div class="alert">\
											<div class="upper"><strong>UPCOMING EVENT</strong> on '+events[x].date_formatted+'</div>\
											<div class="lower"><a href="/events/view/'+events[x].id+'">'+events[x].title+'</a></div>\
										</div>\
										<div class="footer"></div>\
									 </div>';
				
				suggestions.events_current_ids.push(events[x].id);
				
				x++;
			}
		
			if (!suggestions.schemes_available && x == 0) {
				$('suggestions_more').setStyle('display', 'none');
			}
		 }
	}).send();
}

function open_shortlist_reminder(scheme_id, redirect_path, closing_date) {
	redirect_path_fragment = '';
	if (redirect_path) {
		redirect_path_fragment = '&redirect_path='+redirect_path;
	}
	
	closing_date_fragment = '';
	if (closing_date) {
		closing_date_fragment = '&closing_date='+closing_date;
	}

	TB_show('Set a reminder', '/ajax/reminder/show/'+scheme_id+'?height=224&width=490'+redirect_path_fragment+closing_date_fragment, false);
}

function open_apply_now(scheme_id, redirect_path) {
	redirect_path_fragment = '';
	if (redirect_path) {
		redirect_path_fragment = '&redirect_path='+redirect_path;
	}

	TB_show('Apply for scheme', '/ajax/apply/show/'+scheme_id+'?height=400&width=700'+redirect_path_fragment, false);
}

function countObjectProperties(object) {
	var count = 0;
	
	for (k in object) if (object.hasOwnProperty(k)) count++;
	
	return count;
}

function implode (glue, pieces) {
    // Joins array elements placing glue string between items and return one string  
    // 
    // version: 911.718
    // discuss at: http://phpjs.org/functions/implode    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Waldo Malqui Silva
    // +   improved by: Itsacon (http://www.itsacon.net/)
    // +   bugfixed by: Brett Zamir (http://brett-zamir.me)
    // *     example 1: implode(' ', ['Kevin', 'van', 'Zonneveld']);    // *     returns 1: 'Kevin van Zonneveld'
    // *     example 2: implode(' ', {first:'Kevin', last: 'van Zonneveld'});
    // *     returns 2: 'Kevin van Zonneveld'
    var i = '', retVal='', tGlue='';
    if (arguments.length === 1) {        pieces = glue;
        glue = '';
    }
    if (typeof(pieces) === 'object') {
        if (pieces instanceof Array) {            return pieces.join(glue);
        }
        else {
            for (i in pieces) {
                retVal += tGlue + pieces[i];                tGlue = glue;
            }
            return retVal;
        }
    }    else {
        return pieces;
    }
}
