/**
 * $Id: younison.js 1012 2008-06-24 20:13:59Z Rick $
 * 
 * Younison Javascript functions
 * 
 * @author Rick Pastoor <rickpastoor@gmail.com>
 * @author Mathijs Kadijk <mkadijk@gmail.com>
 */

/* Younison functions */
var younison = 
{
	reloadCaptcha : function()
	{
		date = new Date();
		document.getElementById('captcha').src = 'younison/captcha/' + date.getTime();
	},
	
	addToComposeField : function(toAdd)
	{
		// Split the current string
		var curUsers = document.getElementById('username').value.split(',');
		
		// Do we have currently filled in users?
		if (curUsers.length-1 == 0)
		{
			document.getElementById('username').value = toAdd + ', ';
		}
		else
		{
			delete curUsers[curUsers.length-1];
			
			var newString = curUsers.join(',');
			document.getElementById('username').value = newString + ' ' + toAdd + ', ';
		}
		
		document.getElementById('username').focus();
		younison.searchFriendsByCompose('');
	},
	
	searchFriendsByComposeTimeout : null,
	
	searchFriendsByComposeWithDelay : function(username)
	{
		clearTimeout(younison.searchFriendsByComposeTimeout);
		younison.searchFriendsByComposeTimeout = window.setTimeout(younison.searchFriendsByCompose, 250, username);
	},
	
	lastFriendsByComposeSearch : null,
	
	searchFriendsByCompose : function(username)
	{
		var usernames;
		var username;
	
		if (username.length > 0)
		{
			usernames = username.split(',');
			username = usernames[usernames.length-1];
			username = username.replace(/^\s+/, '');
		}
		
		if (username != younison.lastFriendsByComposeSearch)
		{
			celer.ajax.sendRequest({url : 'search/friends/' + escape(username), handleFunction : younison.handleSearchFriendsByCompose});
			
			younison.lastFriendsByComposeSearch = username;
		}
	},
	
	handleSearchFriendsByCompose : function (result)
	{
		result = eval(result);
		
		var curDiv = document.getElementById('composeResults');
		
		var curTable = document.getElementById('composeResultsTable');
		
		while(curTable.firstChild)
		{
			curTable.removeChild(curTable.firstChild);
		}
		
		var curRow = document.createElement('tr');
		
		for (i = 0; i < result.length; i++)
		{
			var avatarImg = document.createElement('img');
			avatarImg.setAttribute('src', result[i]['avatar']);
			avatarImg.setAttribute('alt', result[i]['username']);
			
			var imgAnchor = document.createElement('a');
			imgAnchor.href = "javascript:;";
			imgAnchor.setAttribute('class', 'smallthumb-' + result[i]['account_type'] + ' topmargin');
			imgAnchor.setAttribute('onClick', 'younison.addToComposeField(\'' + result[i]['username'] + '\');');
			imgAnchor.appendChild(avatarImg);
			
			var usernameAnchor = document.createElement('a');
			usernameAnchor.href = "javascript:;";
			usernameAnchor.setAttribute('class', 'link-' + result[i]['account_type']);
			usernameAnchor.setAttribute('onClick', 'younison.addToComposeField(\'' + result[i]['username'] + '\');');
			usernameAnchor.innerHTML = result[i]['username'];
			
			var curCell = document.createElement('td');
			curCell.setAttribute('align', 'center');
			curCell.setAttribute('valign', 'middle');
			curCell.setAttribute('width', '25%');
			curCell.appendChild(imgAnchor);
			curCell.appendChild(usernameAnchor);
			
			curRow.appendChild(curCell);
			
			if (i % 2 == 1)
			{
				curTable.appendChild(curRow);
				curRow = document.createElement('tr');
			}
		}
		
		curTable.appendChild(curRow);
	},
	
	switchMassmailMode : function (turnOn, type)
	{
		if (turnOn)
		{
			if (type == 'admin')
			{
				document.getElementById('composeResultsTable').style.display = 'none';
				document.getElementById('massmailBox').style.display = 'block';
				document.getElementById('composeHeader').innerHTML = 'Make your selection:';
			}
			
			document.getElementById('username').disabled = true;
		}
		else
		{
			if (type == 'admin')
			{
				document.getElementById('composeResultsTable').style.display = 'block';
				document.getElementById('massmailBox').style.display = 'none';
				document.getElementById('composeHeader').innerHTML = 'Suggested users:';
			}
			
			document.getElementById('username').disabled = false;
		}
	}
};

/* Admin/news */
function flipPollOptions()
{
	document.getElementById('pollrow').style.display = (document.getElementById('poll_enabled').checked) ? 'table-row' : '';
}

function flipPollType()
{
	if (document.getElementById('poll_type_statement').checked)
	{
		document.getElementById('poll_options_statement').style.display = 'block';
		document.getElementById('poll_options_poll').style.display = '';
		document.getElementById('poll_statement_question').focus();
	}
	else
	{
		document.getElementById('poll_options_statement').style.display = '';
		document.getElementById('poll_options_poll').style.display = 'block';
		document.getElementById('poll_poll_question').focus();
	}
}

function addPollAnswer()
{
	var nextAnswerID = document.getElementById('nextAnswerID').value;
	var numberAnswers = document.getElementById('numberAnswers').value;
	
	// Create input
	var input = document.createElement('input');
	input.setAttribute('type', 'text');
	input.setAttribute('name', 'poll_answer_' + nextAnswerID);
	input.setAttribute('id', 'poll_answer_' + nextAnswerID);
	input.setAttribute('class', 'formtable-field');
	
	// Create remove link
	var link = document.createElement('a');
	link.setAttribute('href', 'javascript:removeAnswer(' + nextAnswerID + ')');
	link.innerHTML = 'Remove';
	
	// Create td
	var td1 = document.createElement('td');
	
	// Append child
	td1.appendChild(input);
	
	// Create td
	var td2 = document.createElement('td');
	
	td2.appendChild(link);
	
	// Create tr
	var tr = document.createElement('tr');
	tr.setAttribute('id', 'poll_answer_row_' + nextAnswerID);
	
	// Append tds
	tr.appendChild(td1);
	tr.appendChild(td2);
	
	// Show in form
	document.getElementById('poll_answers_table').appendChild(tr);
	
	// Set focus
	document.getElementById('poll_answer_' + nextAnswerID).focus();
	
	// Update counters
	document.getElementById('numberAnswers').value = ++numberAnswers;
	document.getElementById('nextAnswerID').value = ++nextAnswerID;
}

function removeAnswer(answer)
{
	document.getElementById('poll_answers_table').removeChild(document.getElementById('poll_answer_row_' + answer));
	document.getElementById('numberAnswers').value = document.getElementById('numberAnswers').value - 1;
}

/* Profile functions */
younison.profile =
{
	removeAvatar : function()
	{
		// Ask confirmation
		if (confirm('Are you sure you want to delete your avatar?'))
		{
			// Do AJAX request to delete the avatar
			if (celer.ajax.sendRequest({url : 'profile/deleteavatar'}))
			{
				document.getElementById('avatarimg').src = 'img/no-profile-img.jpg';
				document.getElementById('removeAvatarLink').style.display = '';
			}
			else
				return true;
		}
		
		// If success do stop following the link
		return false;
	}
};

/* Invite friends functions */
younison.invites =
{
	inviteID : '',
	
	addFriend : function()
	{
		// Tabelrij aanmaken
		
		/**
		 * tr
		 * - td1
		 * -- input realname
		 * - td2
		 * -- input email
		 */
		 
		 var realnameInput = document.createElement('input');
		 realnameInput.name = 'realname[' + younison.invites.inviteID + ']';
		 realnameInput.type = 'text';
		 realnameInput.className = 'formtable-field-nowidth';
		 realnameInput.maxlength = '80';
		 
		 var emailInput = document.createElement('input');
		 emailInput.name = 'email[' + younison.invites.inviteID + ']';
		 emailInput.type = 'text';
		 emailInput.className = 'formtable-field-nowidth';
		 emailInput.size = '22';
		 emailInput.maxlength = '80';
		 
		 var td1 = document.createElement('td');
		 td1.setAttribute('style', 'padding-left: 5px;');
		 td1.appendChild(realnameInput);
		 
		 var td2 = document.createElement('td');
		 td2.setAttribute('style', 'text-align: right; padding-right: 5px;');
		 td2.appendChild(emailInput);
		 
		 var tr = document.createElement('tr');
		 tr.appendChild(td1);
		 tr.appendChild(td2);
		 
		 document.getElementById('invites').appendChild(tr);
		 
		 younison.invites.inviteID++;
		 
		 realnameInput.focus();
	}
};

/* Calendar functions */
younison.calendar =
{
	calendarType : '',
	displayedMonth : '',
	displayedWeek : '',
	displayedYear : '',
	endDate : '',
	events : '',
	organizers : '',
	selectedDay : '',
	startDate : '',
	startTime : '',
	userid : '',
	username : '',
	
	newEvent : function()
	{
		var datum = younison.calendar.selectedDay.substr(3,4) + '-' + younison.calendar.selectedDay.substr(7,2) + '-' + younison.calendar.selectedDay.substr(9,2);
		window.location.assign(celer.base + 'calendar/addevent/' + younison.calendar.username + '/' + datum);
	},
	
	selectDay : function(type, elementId)
	{
		if (type == 'month')
		{
			// Huidige selectie opheffen
			if (younison.calendar.selectedDay != '')
			{
				// Is dit toevallig de huidige dag?
				if (document.getElementById(younison.calendar.selectedDay).className != 'days current')
					document.getElementById(younison.calendar.selectedDay).style.background = '#FFF';
			}
			
			// Nieuw element selecteren	
			document.getElementById(elementId).style.background = '#F6F6F6';
		}
		else
		{
			// Huidige selectie opheffen
			if (younison.calendar.selectedDay != '')
				document.getElementById(younison.calendar.selectedDay).className = 'day';
				
			// Nieuw element selecteren	
			document.getElementById(elementId).className = 'day current-week-day';
		}
		
		// Opslaan
		younison.calendar.selectedDay = elementId;
	},
	
	switchView : function(username, action)
	{
		var date = new Date();
		var year = date.getFullYear();
		var monthweek = '';
		
		if (action == 'month')
		{
			// Als er een dag geselecteerd is springen we naar deze gegevens
			if (younison.calendar.selectedDay != '')
			{
				year = younison.calendar.selectedDay.substr(3,4);
				monthweek = younison.calendar.selectedDay.substr(7,2);
			}
			// Als dat niet zo is pakken we gewoon de gepresenteerde maand
			else if (younison.calendar.displayedMonth != '')
			{
				year = younison.calendar.displayedYear;
				monthweek = younison.calendar.displayedMonth;
			}
			// Als geen van beide aanwezig is gaan we naar de huidige maand
			else
			{
				monthweek = date.getMonth();
			}
		}
		else if (action = 'week')
		{
			// Als er geen dag geselecteerd is springen we naar deze gegevens
			if (younison.calendar.selectedDay != '')
			{
				date = younison.calendar.selectedDay;
			}
			// Als dat niet zo is pakken we gewoon de gepresenteerde maand, eerste dag
			else if (younison.calendar.displayedMonth != '')
			{
				date = 'day' + younison.calendar.displayedYear + younison.calendar.displayedMonth + '01';
			}
			else
			{
				d = new Date();
				date = 'day' + d.getFullYear() + d.getMonth() + '01';
			}
			
			year = date.substr(3,4);
			
		    monthweek = younison.calendar.getWeek(parseInt(date.substr(3,4)), parseInt(date.substr(7,2)), parseInt(date.substr(9,2)));
		}
		
		window.location.assign(celer.base + 'calendar/' + username + '/' + action + '/' + year + '/' + monthweek);
	},
	
	clearCalendar : function()
	{
		if (younison.calendar.calendarType != '')
		{
			if (younison.calendar.calendarType == 'month')
				younison.calendar.clearCalendarMonth();
			else if (younison.calendar.calendarType == 'week')
				younison.calendar.clearCalendarWeek();
		}
	},
	
	clearCalendarWeek : function()
	{	
		var jsEvents = younison.calendar.events;
		var org = younison.calendar.organizers;
		
		for(var i = 0; i < jsEvents.length; i++)
		{
			if (org[jsEvents[i].organizer] == 'yes')
			{
				document.getElementById('day' + jsEvents[i].date).removeChild(document.getElementById('eventbox_' + jsEvents[i].id));
			}
		}
	},
	
	clearCalendarMonth : function()
	{
		var jsEvents = younison.calendar.events;
		var org = younison.calendar.organizers;
		
		for(var i = 0; i < jsEvents.length; i++)
		{
			if (org[jsEvents[i].organizer] == 'yes')
			{
				document.getElementById('ulday' + jsEvents[i].date).removeChild(document.getElementById('event_' + jsEvents[i].id));
			}
		}
	},
	
	fetchEvents : function()
	{
		celer.ajax.sendRequest({url : 'calendar/fetchcalendar/' + younison.calendar.userid + '/' + younison.calendar.startDate + '/' + younison.calendar.endDate, handleFunction: younison.calendar.fetchEventsCallback});
	},
	
	fetchEventsCallback : function(responseText)
	{
		younison.calendar.events = eval('(' + responseText + ')');
	},
	
	showCalendar : function()
	{
		if (younison.calendar.calendarType != '')
		{
			if (younison.calendar.calendarType == 'month')
				younison.calendar.showMonthCalendar();
			else if (younison.calendar.calendarType == 'week')
				younison.calendar.showWeekCalendar();
		}
	},
	
	showWeekCalendar : function()
	{	
		// showCalendar
		var jsEvents = younison.calendar.events;
		var org = younison.calendar.organizers;
		
		var originalWidth = 96;
		var previousDate = '';
		var endTimes = new Array();
		var previousLevel = 0;
		var margintop = 0;
		var previousTime = '';
		
		for(var i = 0; i < jsEvents.length; i++)
		{
			// Dit event weergeven?
			if (org[jsEvents[i].organizer] == 'yes')
			{
				var width = 96;
				var level = 0;
				
				if (previousDate == '' || previousDate == jsEvents[i].date)
				{
					// Berekeningen ivm width
					for(var j = 0; j < endTimes.length; j++)
					{
						endTimesObj = eval('(' + endTimes[j] + ')');
						if (jsEvents[i].start_stamp < endTimesObj.stop_stamp)
						{
							level++;
							if (level < previousLevel)
								level = previousLevel;
						}
					}
					
					width = width - (level * 5);
				}
				else
				{
					// Array leegmaken
					endTimes = new Array();
					previousLevel = 0;
					margintop = 0;
					previousTime = '';
				}
				
				// Hoogte berekenen
				var currentTimeObject = new celer.date(jsEvents[i].date_formatted + ' ' + jsEvents[i].start_short);
				
				if (previousTime == '')
				{
					var starttime = new celer.date(jsEvents[i].date_formatted + ' ' + younison.calendar.startTime);
					var diff = currentTimeObject.format('U') - starttime.format('U');
					margintop = (diff / 1800) * 25 - 1;
				}
				else
				{
					
					var previousTimeObject = new celer.date(jsEvents[i].date_formatted + ' ' + previousTime);
					var diff = currentTimeObject.format('U') - previousTimeObject.format('U');
					margintop = (diff / 1800) * 25 - 1;
				}
				
				previousDate = jsEvents[i].date;
				previousTime = jsEvents[i].end_short;
				previousLevel = level;
				
				endTimes.push('{"stop_stamp":"' + jsEvents[i].stop_stamp + '","level":"' + level + '"}');
				
				younison.calendar.addEventToWeek(jsEvents[i].id, jsEvents[i].color, jsEvents[i].height, margintop, width, jsEvents[i].title, jsEvents[i].start_short, jsEvents[i].end_short, jsEvents[i].location, jsEvents[i].date, jsEvents[i].organizerName, jsEvents[i].organizerType);
			}
		}
	},
	
	showMonthCalendar : function()
	{
		// showCalendar
		var jsEvents = younison.calendar.events;
		var org = younison.calendar.organizers;
		
		for(var i = 0; i < jsEvents.length; i++)
		{
			// Dit event weergeven?
			if (org[jsEvents[i].organizer] == 'yes')
			{
				younison.calendar.addEventToMonth(jsEvents[i].id, jsEvents[i].type, jsEvents[i].title, jsEvents[i].date, jsEvents[i].start_short, jsEvents[i].end_short);
			}
		}
	},
	
	/**
	 * @param string date YYYYMMDD
	 */
	addEventToMonth : function(id, type, title, date, starttime, endtime)
	{
		/**
		 * li
		 * - a
		 */
		 
		 var a = document.createElement('a');
		 a.setAttribute('href', 'calendar/editevent/' + id + '/month');
		 a.className = type;
		 a.onmouseover = function() {
		 	ddrivetip(starttime + ' - ' + endtime + '<br />' + title);
		 }
		 a.onmouseout = hideddrivetip;
		 // @TODO: shorttitle bepalen
		 a.innerHTML = title;
		 
		 var li = document.createElement('li');
		 li.appendChild(a);
		 li.setAttribute('id', 'event_' + id);
		 
		 document.getElementById('ulday'+date).appendChild(li);
	},
	
	addEventToWeek : function(id, eventcolor, eventHeight, topmargin, eventWidth, title, fromtime, totime, locat, date, organizerName, organizerType)
	{
		/**
		 * a
		 * - div
		 * -- div
		 * --- span title
		 * --- span time
		 * --- span location
		 */
		 
		 var span_title = document.createElement('span');
		 span_title.className = title;
		 span_title.innerHTML = title;
		 
		 var span_time = document.createElement('span');
		 span_time.className = 'time';
		 span_time.innerHTML = fromtime + ' - ' + totime;
		 
		 var span_location = document.createElement('span');
		 span_location.setAttribute('class', 'lokatie');
		 span_location.innerHTML = locat;
		 
		 var div = document.createElement('div');
		 div.className = 'event-inner';
		 div.appendChild(span_title);
		 div.appendChild(span_time);
		 div.appendChild(span_location);
		 
		 var div2 = document.createElement('div');
		 div2.className = 'event-' + eventcolor;
		 div2.appendChild(div);
		 div2.style.height = eventHeight + 'px';
		 div2.style.marginTop = topmargin + 'px';
		 div2.style.width = eventWidth + 'px';
		 
		 var a = document.createElement('a');
		 a.setAttribute('href', 'calendar/editevent/' + id + '/week');
		 a.setAttribute('style', 'cursor:pointer');
		 a.setAttribute('id','eventbox_' + id);
		 a.onmouseover = function() {
		 	ddrivetip('<table><tr><td>Organizer:</td><td><a style="text-decoration: none" class="link-' + organizerType + '">' + organizerName + '</a></td></tr><tr><td>Title:</td><td>' + title + '</td></tr><tr><td>Location:</td><td>' + locat + '</td></tr><tr><td>Time:</td><td>' + fromtime + ' - ' + totime + '</td></tr></table>');
		 }
		 a.onmouseout = hideddrivetip;
		 a.appendChild(div2);
		 
		 // Append to date
		 document.getElementById('day'+date).appendChild(a);
	},
	
	getWeek : function(y, m, d)
	{
  		var ms1d = 864e5;
  		var ms7d = 7*ms1d;
  		var DC3 = Date.UTC(y, m-1, d+3) / ms1d; // an Absolute Day Number
  		var AWN = Math.floor(DC3 / 7); // an Absolute Week Number
  		var Wyr = new Date(AWN * ms7d).getUTCFullYear();
  		var weekNumber = (AWN - Math.floor( Date.UTC(Wyr, 0, 7) / ms7d ) + 1);
  		return weekNumber;
	},
	
	/**
	 * Organizer management functies
	 * 
	 * flipOrganizer - laat een organizer wel of niet zien in de calendar
	 */
	flipOrganizer : function(organizer)
	{
		// Clear calendar
		younison.calendar.clearCalendar();
		
		var org = younison.calendar.organizers;
		var visible = 'no';
		
		if (org[organizer] == 'yes')
		{
			org[organizer] = 'no';
		}
		else
		{
			org[organizer] = 'yes';
			visible = 'yes';
		}
		
		// Checkbox regelen
		if (visible == 'yes')
			document.getElementById('calendarfriend_'+organizer).checked = true;
		else
			document.getElementById('calendarfriend_'+organizer).checked = false;
		
		// Show calendar
		younison.calendar.showCalendar();
		
		// Do AJAX als laatste, zodat de calendar er iig staat
		celer.ajax.sendRequest({url : 'calendar/changecalendarfriend/' + organizer + '/' + visible});
	},
	
	/**
	 * De calendar-friend-functies
	 * 
	 * addCalendarFriend - voegt een calendar friend toe
	 * addCalendarFriendCallback - verwerkt de AJAX callback
	 * removeCalendarFriend - verwijdert een calendar friend
	 */
	addCalendarFriend : function()
	{
		var selectedItem = escape(document.getElementById('friends').value);
		
		if (selectedItem != '')
		{
			// Do AJAX request to add friend
			celer.ajax.sendRequest({url : 'calendar/addcalendarfriend/' + selectedItem, handleFunction: younison.calendar.addCalendarFriendCallback});
		}
	},
	
	addCalendarFriendCallback : function(responseText)
	{
		var response = eval('(' + responseText + ')');
		
		// Remove item from optionlist
		document.getElementById('friends').removeChild(document.getElementById('user_'+response.id));
		
		// Calendar clearen
		younison.calendar.clearCalendar();
		
		// Add to organizers array
		younison.calendar.organizers[response.id] = 'yes';
		
		var removeimg = document.createElement('img');
		removeimg.setAttribute('src', 'img/delete-friend.gif');
		removeimg.setAttribute('alt', 'Delete friend');
		removeimg.className = 'floatright';
		
		var aremove = document.createElement('a');
		aremove.appendChild(removeimg);
		aremove.href = 'javascript:;';
		aremove.onclick = function(){
			younison.calendar.removeCalendarFriend(response.id, response.username);
		}
		
		var input = document.createElement('input');
		input.setAttribute('type', 'checkbox');
		input.setAttribute('onclick', 'younison.calendar.flipOrganizer(\'' + response.id + '\')');
		input.setAttribute('id', 'calendarfriend_' + response.id);
		
		var ausername = document.createElement('a');
		ausername.setAttribute('href', 'javascript:;');
		ausername.onclick = function() {
			younison.calendar.flipOrganizer(response.id);
		}
		ausername.className = 'link-' + response.account_type;
		ausername.innerHTML = response.username;
		
		var p = document.createElement('p');
		p.setAttribute('id', 'friendrow_' + response.id);
		p.className = 'match-with';
		p.appendChild(aremove);
		p.appendChild(input);
		p.appendChild(ausername);
		
		// IE Fix: eerst appenden en dan checked setten
		input.setAttribute('checked', true);
		
		document.getElementById('calendarfriends').appendChild(p);
		
		// Fetch calendars
		younison.calendar.fetchEvents();
		
		// Redraw calendar
		younison.calendar.showCalendar();
	},
	
	removeCalendarFriend : function(friend_id, username)
	{
		// Friend verwijderen uit db
		celer.ajax.sendRequest({url : 'calendar/removecalendarfriend/' + escape(friend_id)});
		
		// Clear calendar
		younison.calendar.clearCalendar();
		
		// Friend verwijderen uit organizers
		younison.calendar.organizers[friend_id] = 'no';
		
		// Show calendar
		younison.calendar.showCalendar();
		
		// Boxje in friendslist hiden
		document.getElementById('calendarfriends').removeChild(document.getElementById('friendrow_' + friend_id));
		
		// Toevoegen aan select
		var option = document.createElement('option');
		option.setAttribute('id', 'user_' + friend_id);
		option.setAttribute('value', friend_id);
		option.innerHTML = username;
		
		document.getElementById('friends').appendChild(option);
	}
};