// JavaScript Document

var curentDateTime = 0;

var eventObj = function(title) {
	
	this.id = 1;
	this.Title = 'No Name Event';
	this.StartDate = '';
	this.EndDate = '';
	this.Venue = {
		Name: '',
		URL: ''
	}
	this.Summary = '';
	this.Status = '';
	this.eventGroup = '';
	
	this.elem = null;
	
	if ( title != '' ) {
		this.Title = title;
	}
	
	this.createAsSidebarItem = function() {
		
		this.elem = jQuery('<a />');
		this.elem.attr('href', '/event/'+this.id);
		
		var prototype = $('#sideitem_events').find('.prototype');

		prototype.find('.title').text(this.Title);
		prototype.find('.sidbar_event_item').attr('start', this.StartDate.getTime());
		prototype.find('.sidbar_event_item').attr('end', this.EndDate.getTime());
		
		prototype.find('.status').removeClass('attending');
		prototype.find('.status').removeClass('tentative');
		prototype.find('.status').removeClass('notattending');
		
		switch(this.Status) {
			case('attending'):
				prototype.find('.status').text('Attending');
				prototype.find('.status').addClass('attending');
				break;
				
			case('tentative'):
				prototype.find('.status').text('Tentative');
				prototype.find('.status').addClass('tentative');
				break;
				
			case('notattending'):
				prototype.find('.status').text('Not Attending');
				prototype.find('.status').addClass('notattending');
				break;
				
			default:
				prototype.find('.status').text('');
		}
		
		var popup_html = '<h1>'+this.Title+'</h1>\n';
		popup_html += '<strong>Start Date:</strong> '+this.StartDate.toLocaleString()+'<br />\n';
		popup_html += '<strong>End Date:</strong> '+this.EndDate.toLocaleString()+'<br />\n';
		if ( this.Venue.Name != '' ) { popup_html += '<strong>Venue:</strong> '+this.Venue.Name+'<br />\n'; }
		else if ( this.Venue.URL != '' ) { popup_html += '<strong>Venue:</strong> '+this.Venue.URL+'<br />\n'; }
		
		if ( this.Summary != '' ) { popup_html += '<p>'+this.Summary+'</p>\n'; }
		
		prototype.find('.popup_content').html(popup_html);
		
		this.elem.html(prototype.html());
		this.setTimeLabel();
		this.setProgressBar();
		this.insertEvent();
	}
	
	
	this.insertEvent = function() {
		
		if ( $("#events_group_"+this.eventGroup).children().length == 0 ) {
			// If this group is empty, then just put it anywhere
			$("#events_group_"+this.eventGroup).append(this.elem);
		}
		else {
			var thisEvent = this;
			var attached = false;
			if ( this.eventGroup == 'now' || this.eventGroup == 'past' ) { var thisEventTime = thisEvent.EndDate.getTime(); }
			else { var thisEventTime = thisEvent.StartDate.getTime(); }
			
			$("#events_group_"+this.eventGroup).children().each( function() {				
				if ( $(this).find('.sidbar_event_item').attr('start') < thisEventTime && !attached  ) {
					// If there is an event with a lower time then inter before it
					$(this).before(thisEvent.elem);
					attached = true;
				}
			});
			
			if ( !attached ) {
				// if there are no more events in the list and this 
				// still haven't been instered then add to end of list
				$("#events_group_"+this.eventGroup+"").children('a:last').after(this.elem);
			}
		}
		
	}
	
	
	this.moveGroup = function(toGroup){
		
		this.eventGroup = toGroup;
		
		var thisEvent = this;

		this.elem.slideUp(900, function() {
			$("#events_group_"+toGroup).prepend(thisEvent.elem);
			thisEvent.setTimeLabel();
			thisEvent.setProgressBar();
			thisEvent.elem.slideDown(900, function() { });
			vastEvents.gadget.update(true);
		});
	}
	
	
	this.setProgressBar = function() {
		
		var thisElem = this;
		
		if ( this.eventGroup == 'now' ) {
			
			var secondsLeft = ( ( this.EndDate.getTime() - vastEvents.lastRequestTime.getTime() ) / 1000 );
			var percentage = Math.ceil( 100 * secondsLeft / ( ( this.EndDate.getTime() - this.StartDate.getTime() ) / 1000 ) );  
			
			this.elem.find('.event_prog_bar').css( {right: percentage+'%'} );
			
			this.elem.find('.event_prog_bar').animate( {right: '0%'}, (secondsLeft*1000), 'linear', function() {  
				thisElem.moveGroup('past');
			});
			
		}
		else if ( this.eventGroup != 'past' ) {
			
			var secondsLeft = ( ( this.StartDate.getTime() - vastEvents.lastRequestTime.getTime() ) / 1000 );
			
			switch(this.eventGroup) {
				case('upcoming'):
					var moveToGroup = 'next';
					break;
				case('next'):
					var moveToGroup = 'now';
					break;
			}
			
			this.elem.find('.event_prog_bar').animate( {right: '0%'}, (secondsLeft*1000), 'linear', function() {  
				thisElem.moveGroup(moveToGroup);
			});
			
		}
	}
	
	
	this.setTimeLabel = function() {
		
		var timeRanges = {
			'minutes' : 1000*60,
			'hours'	: 1000*60*60,
			'days' : 1000*60*60*24
		}
		
		switch(this.eventGroup) {
			
			case('upcoming'):
				var time = Math.ceil( ( this.StartDate.getTime() - vastEvents.lastRequestTime.getTime() ) / timeRanges.days );
				if ( time > 1 ) {
					var timeLabel = time+' days to go';
				}
				else {
					var timeLabel = 'Tomorrow';
				}
				break;
			
			case('next'):
				var time = Math.ceil( ( this.StartDate.getTime() - vastEvents.lastRequestTime.getTime() ) / timeRanges.hours );
				if ( time > 1 ) {
					var timeLabel = time+' hours to go';
				}
				else {
					time = Math.ceil( ( this.StartDate.getTime() - vastEvents.lastRequestTime.getTime() ) / timeRanges.minutes );
					if ( time > 1 )  {
						var timeLabel = time+' minutes to go';
					}
					else {
						var timeLabel = 'Starting!';
					}
				}
				break;
				
			case('now'):
				var time = Math.ceil( ( this.EndDate.getTime() - vastEvents.lastRequestTime.getTime() ) / timeRanges.days );
				if ( time > 1 ) {
					var timeLabel = time+' days left';
				}
				else {
					time = Math.ceil( ( this.EndDate.getTime() - vastEvents.lastRequestTime.getTime() ) / timeRanges.hours );
					if ( time > 1 ) {
						var timeLabel = time+' hours left';
					}
					else {
						time = Math.ceil( ( this.EndDate.getTime() - vastEvents.lastRequestTime.getTime() ) / timeRanges.minutes );
						if ( time > 1 ) {
							var timeLabel = time+' minutes left';
						}
						else {
							var timeLabel = 'Ending';
						}
					}
				}
				break;
				
			case('past'):
				var time = Math.ceil( ( vastEvents.lastRequestTime.getTime() - this.EndDate.getTime() ) / timeRanges.days );
				if ( time > 1 ) {
					var timeLabel = time+' days ago';
				}
				else {
					time = Math.ceil( ( vastEvents.lastRequestTime.getTime() - this.EndDate.getTime() ) / timeRanges.hours );
					if ( time > 1 ) {
						var timeLabel = time+' hours ago';
					}
					else {
						time = Math.ceil( ( vastEvents.lastRequestTime.getTime() - this.EndDate.getTime() ) / timeRanges.minutes );
						if ( time > 1 ) {
							var timeLabel = time+' minutes ago';
						}
						else {
							var timeLabel = 'Just Ended';
						}
					}
				}
				break;
			
			default:
				var timeLabel = '';
		}
		
		this.elem.find('.time').text( timeLabel  );
	}
	
}



var vastEvents = {
	
	lastRequestTime: new Date(),
	
	gadget: {
		
		events: new Array(),
		
		load: function(eventFile) {
			
			$.get(eventFile, function(data) {
				
				//vastEvents.lastRequestTime = vastDates.parse_iCal($(data).find('events').attr('time'));
				var eventList = vastEvents.parser.parseXML(data);
			
				jQuery.each(eventList, function(i) {
					this.createAsSidebarItem();
					vastEvents.gadget.events.push(this);
				});
				
				vastEvents.gadget.update();
				jQuery.periodic(vastEvents.gadget.update, {frequency: 10});
				register_popop('.sidbar_event_item', '<h1>Event</h1>Default text for events');
				
			}, 'xml');
			
		},
		
		update: function(animate) {
			
			if (animate) { var slideTime = 500; }
			else { slideTime = 0; }
			
			vastEvents.lastRequestTime = new Date();	
			
			$.each(vastEvents.gadget.events, function() {
				this.setTimeLabel();
			});
			
			var groups = new Array('upcoming','next','now','past'); 
			$.each(groups, function() {
									
				if ( $('#events_group_'+this).children().length > 0 ) {
					
					var sortList = new Array();
					$.each($('#events_group_'+this).children(), function(i) {
						sortList[1] = $(this).html();
					});
					
					$('#events_group_'+this+'_title').slideDown(slideTime);
				}
				else {
					$('#events_group_'+this+'_title').slideUp(slideTime);
				}
			});
			
			return true;
		}
		
	},
	
	parser: {
		
		parseXML: function(data) {
			
			var eventList = new Array();
			var eventsData = $(data).find('event');
			
			$.each(eventsData,function(i) {
									   
				var newEvent = 	new eventObj();

				newEvent.id 		= $(this).attr('id');
				newEvent.Title 		= $(this).children('name').text();
				newEvent.StartDate 	= vastDates.parse_iCal($(this).find('start').text());
				newEvent.EndDate 	= vastDates.parse_iCal($(this).find('end').text());
				newEvent.Venue.Name = $(this).find('venue').find('name').text();
				newEvent.Venue.URL 	= $(this).find('venue').find('url').text();
				newEvent.Summary 	= $(this).find('summary').text();
				newEvent.Status 	= $(this).find('status').text();
				
				if ( vastEvents.lastRequestTime.getTime() < newEvent.StartDate.getTime() ) {
					var next = new Date(vastEvents.lastRequestTime);
					next.setDate(next.getDate()+1);
					if ( next.getTime() > newEvent.StartDate.getTime() ) {
						newEvent.eventGroup = 'next';
					}
					else {
						newEvent.eventGroup = 'upcoming';
					}
				}
				else {
					if ( vastEvents.lastRequestTime.getTime() <= newEvent.EndDate.getTime() ) {
						newEvent.eventGroup = 'now';
					}
					else {
						newEvent.eventGroup = 'past';	
					}
				}
				
				eventList.push(newEvent);
				
			});
			
			
		
			return eventList;
			

		},
		
		
		parseJSON: function(file) {

		}
		
	}
	
	
}


