// JavaScript Document

var AjaxManager = new AjaxManagerObject();

/* General */

function AjaxManagerObject()
{
	var me = this;
	
	var ajaxObjects = Array();
	ajaxObjects.get = function(id)
	{
		for(var i = 0; i < this.length; ++i)
		{
			if(this[i].id == id)
			{
				return this[i];
			}
		}
		return null;
	};

	this.getAjaxObject = function(id)
	{
		return ajaxObjects.get(id);
	};
	this.registerAjaxObject = function(ajax)
	{
		ajaxObjects.push(ajax);
	};
	this.destroyAjaxObject = function(ajax)
	{
		delete ajaxObjects.remove(me.ajaxObjects.get(ajax.id));
	};
	this.updateAjaxObject = function(ajax, delay)
	{
		return setTimeout('AjaxManager.getAjaxObject('+ajax.id+').update()', delay ? delay : 0);
	};
}

function AjaxObject(url)
{
	var me = this;
	
	// variables
	this.htmlResponse = false;
	this.url = url ? url : 'ajax.php';	
	this.updating = false;
	this.success = false;
	this.message = null;
	this.callback = function(ajax) {};
	this.xmlDoc = null;
	this.id = getCurrentTimestamp();
	
	// functions
	this.abort = function()
	{
		if(me.updating)
		{
			me.updating = false;
			me.xmlHttp.abort();
			delete me.xmlHttp;
		}
	};
	
	this.update = function(passData)
	{
		if(me.updating == true)
		{
			return false;
		}
		
		me.updating = true;
		me.xmlHttp = AjaxObject.getXmlHttpObject();
		
		if(me.xmlHttp == null)
		{
			return false;
		}
		me.xmlHttp.onreadystatechange = function()
		{
			if(me.xmlHttp.readyState == 4 || me.xmlHttp.readyState == "complete")
			{
				switch(me.xmlHttp.status)
				{
					case 0:
						return;
					case 200:
						me.setVariable('responseText', me.xmlHttp.responseText);
						me.success = true;
						break;
					case 400:
						message = 'Error 400: Bad Request';
						break;
					case 401:
						message = 'Error 401: Authentication Required';
						break;
					case 403:
						message = 'Error 403: Access Forbidden';
						break;
					case 404:
						message = 'Error 404: Not Found';
						break;
					case 408:
						message = 'Error 408: Request Timeout';
						break;
					case 500:
						message = 'Error 500: Server Error';
						break;
					default:
						message = 'Unknown Error: ' + xmlHttp.status;
						break;
				}
				
				// get xmlDoc
				delete me.xmlDoc;
				try
				{
					if(!me.success)
					{
						throw new Exception(message);
					}
					if(!me.htmlResponse)
					{
						me.xmlDoc = me.xmlHttp.responseXML;
					}
				}
				catch(e)
				{
					var xml = '<ajax_return>';
						xml += '<status>1</status>';
						xml += '<message>'+e.message+'</message>';
						xml += '</ajax_return>';
					me.xmlDoc = getXMLDoc(xml);
				}
				
				//delete me.xmlHttp;
				
				me.updating = false;
				if(!me.htmlResponse)
				{
					me.message = getTagValue(me.xmlDoc, 'message');
					me.success =  parseInt(getTagValue(me.xmlDoc, 'status')) == 0;
				}
				
				me.callback(me);
			}
		};
		
		//var uri = me.url+'?'+(passData ? passData+'&' : '')+'timestamp='+getCurrentTimestamp();
		var uri = me.url+(me.url.contains('?') ? '&' : '?')+'timestamp='+getCurrentTimestamp();
		me.xmlHttp.open('POST', uri, true);
		me.xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // for sending POST vars
		if(passData)
		{
			me.passData = passData;
		}
		me.xmlHttp.send(me.passData);
		return true;			
	};
}

function getXMLDoc(xml)
{
	var xmlDoc = null;
	
	try //Firefox, Mozilla, Opera, etc.
	{
		var parser = new DOMParser();
		xmlDoc = parser.parseFromString(xml, 'text/xml');
	}
	catch(e) //Internet Explorer
	{
		try
		{
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async = false;
			xmlDoc.loadXML(xml);
		}
		catch(e) {}
	}
	
	return xmlDoc;
}

AjaxObject.getXmlHttpObject = function()
{	
	var xmlHttp = null;
	
	try
	{// Firefox, Opera 8.0+, Safari
		xmlHttp = new XMLHttpRequest();
	}
	catch(e)
	{// Internet Explorer
		try
		{
			xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
		}
		catch(e1)
		{
			try
			{
				xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
			}
			catch(e2)
			{
				alert("Your browser doesn't support AJAX.");
			}
		}
	}
	
	return xmlHttp;
}

function getTagValue(node, tagName)
{
	var tags = node.getElementsByTagName(tagName);
	if(tags.length == 0)
	{
		return null;
	}
	var childNodes = tags[0].childNodes;
	if(childNodes.length == 0)
	{
		return null;
	}
	return childNodes[0].nodeValue;
}

function getImage(xmlDoc, id)
{
	var images = xmlDoc.getElementsByTagName('image');
	for(i = 0; i < images.length; ++i)
	{
		if(getTagValue(images[i], 'id') == id)
		{
			var img = document.createElement('img');
			img.src = getTagValue(images[i], 'src');
			img.size = getTagValue(images[i], 'size');
			return img;
		}
	}
	return null;
}

function getLink(xmlDoc, id)
{
	var links = xmlDoc.getElementsByTagName('link');
	for(i = 0; i < links.length; ++i)
	{
		if(getTagValue(links[i], 'id') == id)
		{
			var lnk = document.createElement('a');
			lnk.href = unescape(getTagValue(links[i], 'href'));
			var text = getTagValue(links[i], 'text');
			if(text)
			{
				lnk.appendChild(document.createTextNode(text));
			}
			var title = getTagValue(links[i], 'title');
			if(title)
			{
				lnk.title = title;
			}
			return lnk;
		}
	}
	return null;
}

function getDateString(node)
{	
	var unixTimestamp = parseInt(getTagValue(node, 'date'));
	var date = new Date(unixTimestamp * 1000);
	return (date.getMonth()+1) + '/' + date.getDate() + '/' + date.getFullYear();
}

/* End General */

function logout(action)
{
	var logoutObject = new AjaxObject();
	logoutObject.callback = function(ajax)
	{
		reloadPage(0);
	};
	logoutObject.update('action='+action);
}

function randomPhoto(albumSelection, horizOnly)
{
	var ajax = new AjaxObject();
	AjaxManager.registerAjaxObject(ajax);
	ajax.setVariable('randomPhoto', document.getElementById('random_photo'));
	ajax.setVariable('horizOnly', horizOnly ? true : false);
	ajax.callback = function(ajax)
	{
		var randomPhoto = ajax.getVariable('randomPhoto');
		
		if(!ajax.success)
		{
			AjaxManager.updateAjaxObject(ajax, 5*SECOND);
			return;
		}
		
		var img = getImage(ajax.xmlDoc, 'random_photo');
		if(img)
		{
			var horizOnly = ajax.getVariable('horizOnly');
			img.onload = function()
			{
				if(horizOnly && img.height > img.width)
				{
					AjaxManager.updateAjaxObject(ajax);
					return;
				}
				resizeImage(img, img.size);
				
				var random_photo = document.getElementById('random_photo');
				var photo_link = getLink(ajax.xmlDoc, 'image_link');
				photo_link.className = 'img';
				photo_link.appendChild(img);
				
				removeChildren(random_photo);
				random_photo.appendChild(photo_link);
					
				var br = document.createElement('br');
				random_photo.appendChild(br);
				
				var album_link = getLink(ajax.xmlDoc, 'album_link');
				album_link.className = 'caption';
				random_photo.appendChild(album_link);
				
				AjaxManager.updateAjaxObject(ajax, 5*SECOND);
			}
		}
		else
		{
			debug('randomPhoto', 'Failed to retrieve random photo');
			AjaxManager.updateAjaxObject(ajax);
		}
	};
	ajax.update('action=random_photo&album_selection='+albumSelection);
}

function latestTweets()
{
	var ajax = new AjaxObject();
	AjaxManager.registerAjaxObject(ajax);
	ajax.callback = function(ajax)
	{
		var latestTweets = document.getElementById('latest_tweets');
		removeChildren(latestTweets);
		
		if(!ajax.success)
		{
			var tr = document.createElement('tr');
			var td = document.createElement('td');
			tr.appendChild(td);
			latestTweets.appendChild(tr);
			
			var div = document.createElement('div');
			//div.className = 'error';
			div.appendChild(document.createTextNode(ajax.message));
			td.appendChild(div);
			return;
		}
		
		var tweets = ajax.xmlDoc.getElementsByTagName('tweet');
		for(var i = 0; i < tweets.length; ++i)
		{
			var tweet = tweets.item(i);
			var owner = getTagValue(tweet, 'owner');
			var href = getTagValue(tweet, 'link');
			var date = getTagValue(tweet, 'date');
			var time = getTagValue(tweet, 'time');
			var text = getTagValue(tweet, 'text');
			
			var tr = document.createElement('tr');
			
			var infoTD = document.createElement('td');
			infoTD.className = 'tweet_info';
			var a = document.createElement('a');
			a.className = 'external';
			a.href = href;
			a.target = '_blank';
			a.appendChild(document.createTextNode(owner));
			infoTD.appendChild(a);
			infoTD.appendChild(document.createElement('br'));
			infoTD.appendChild(document.createTextNode(date));
			infoTD.appendChild(document.createElement('br'));
			infoTD.appendChild(document.createTextNode(time));
			tr.appendChild(infoTD);
			
			var textTD = document.createElement('td');
			textTD.className = 'text';
			textTD.innerHTML = text;
			tr.appendChild(textTD);
			
			latestTweets.appendChild(tr);
		}
		runPostProcessing(latestTweets);
		
		AjaxManager.updateAjaxObject(ajax, 1*MINUTE);
	};
	ajax.update('action=get_latest_tweets');
}

function uploadCallback(xmlDoc)
{
	var dialog = DialogManager.getDialog('upload_dialog');
	
	if(getTagValue(xmlDoc, 'status') != 0)
	{
		dialog.setErrorStatus(getTagValue(xmlDoc, 'message'));
		var form = dialog.getVariable('form');
		form.style.display = 'block';
		return;
	}
	
	var fileID = getTagValue(xmlDoc, 'file_id');
	dialog.hideTitle();
	dialog.hideButtonZone();
	getFileInfo(fileID, dialog);
	dialog.setInfoStatus('File successfully uploaded');
	DialogManager.closeDialog(dialog, 1*SECOND);
	
	PanelManager.updatePanelObjectByName('file_list_panel'); 
}

function resumeUploadCallback(xmlDoc)
{
	var dialog = DialogManager.getDialog('resume_upload_dialog');
	
	if(getTagValue(xmlDoc, 'status') != 0)
	{
		dialog.setErrorStatus(getTagValue(xmlDoc, 'message'));
		var form = dialog.getVariable('form');
		form.style.display = 'block';
		return;
	}
	
	dialog.hideTitle();
	dialog.hideBodyContent();
	dialog.hideButtonZone();
	dialog.setInfoStatus('Resume successfully uploaded');
	DialogManager.closeDialog(dialog, 1*SECOND);
	
	PanelManager.updatePanelObjectByName('member_resume_panel');
}

function getFileInfo(fileID, dialog, setTitle)
{
	var ajax = new AjaxObject();
	ajax.callback = function(ajax)
	{
		if(!ajax.success)
		{
			showErrorDialog(ajax.message);
			return;
		}
		
		var dialog = ajax.getVariable('dialog');
		
		var fileNode = ajax.xmlDoc.getElementsByTagName('file')[0];
		if(setTitle)
		{
			dialog.setTitle(getTagValue(fileNode, 'name'));
		}
		
		var table = document.createElement('table');
		var tbody = document.createElement('tbody');
		table.appendChild(tbody);
		dialog.dialogBodyContent.className = 'calign';
		table.style.width = 'auto';
		table.style.margin = 'auto';
		var tr = document.createElement('tr');
		tbody.appendChild(tr);
		
		var thumbnailCell = document.createElement('td');
		thumbnailCell.style.width = THUMB_SIZE+'px';
		tr.appendChild(thumbnailCell);
		
		var thumbnail = getThumb(getTagValue(fileNode, 'mimetype'), getTagValue(fileNode, 'id'));
		thumbnail.onload = function()
		{
			resizeImage(this, THUMB_SIZE);
			thumbnailCell.appendChild(this);
		};
		
		var infoCell = document.createElement('td');
		infoCell.style.paddingLeft = '10px';
		infoCell.align = 'left';
		infoCell.vAlign = 'top';
		tr.appendChild(infoCell);
		
		var filename = document.createElement('h4');
		filenameText = getTagValue(fileNode, 'filename');
		filename.appendChild(document.createTextNode(filenameText.truncate(25, true)));
		filename.title = filenameText;
		infoCell.appendChild(filename)
		
		infoCell.appendChild(document.createTextNode(fileSizeString(getTagValue(fileNode, 'size'))));
		infoCell.appendChild(document.createElement('br'));
		infoCell.appendChild(document.createTextNode(getDateString(fileNode)));
		
		dialog.appendBodyContent(table);
		
		dialog.clearStatus();
	};
	ajax.setVariable('dialog', dialog);
	dialog.setStatus('Loading...');
	ajax.update('action=get_file&id='+fileID);
}

function deleteResume()
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			var resumePanel = PanelManager.getPanelObjectByName('member_resume_panel');
			if(!ajax.success)
			{
				resumePanel.setErrorStatus(ajax.message);
				return;
			}
			resumePanel.update();
		};
		ajax.update('action=delete_resume');
	};
	showConfirmDialog('Are you sure you want to delete your resume?', callback);
}

function deleteMember(id)
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			PanelManager.updatePanelObjectByName('member_list_panel');
		};
		ajax.update('action=delete_member&id='+id);
	};
	showConfirmDialog('Are you sure you want to delete this member?', callback);
}

function deleteUser(id)
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			PanelManager.updatePanelObjectByName('user_list_panel');
		};
		ajax.update('action=delete_user&id='+id);
	};
	showConfirmDialog('Are you sure you want to delete this user?', callback);
}

function deleteActivity(id)
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			PanelManager.updatePanelObjectByName('activity_list_panel');
		};
		ajax.update('action=delete_activity&id='+id);
	};
	showConfirmDialog('Are you sure you want to delete this activity?', callback);
}

function deleteCompany(id)
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			PanelManager.updatePanelObjectByName('company_list_panel');
		};
		ajax.update('action=delete_company&id='+id);
	};
	showConfirmDialog('Are you sure you want to delete this company?', callback);
}

function deleteFile(id)
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			PanelManager.updatePanelObjectByName('file_list_panel');
		};
		ajax.update('action=delete_file&id='+id);
	};
	showConfirmDialog('Are you sure you want to delete this file?', callback);
}
