// 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.passData = null;
	this.updating = false;
	this.status = null;
	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:
						message = 'Error 0: Connection Aborted';
						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)
				{
					Terminal.debug('ajax', 'generating xml');
					var xml = '<ajax_return>';
						xml += '<ajax_status>1</ajax_status>';
						xml += '<ajax_message>'+e.message+'</ajax_message>';
						xml += '</ajax_return>';
					me.xmlDoc = getXMLDoc(xml);
				}
				
				//delete me.xmlHttp;
				
				me.updating = false;
				if(!me.htmlResponse)
				{
					me.message = getTagValue(me.xmlDoc, 'ajax_message');
					me.status = parseInt(getTagValue(me.xmlDoc, 'ajax_status'));
					me.success =  (me.status == 0);
				}
				me.callback(me);
			}
		};
		
		var uri = me.url+(me.url.contains('?') ? '&' : '?')+'timestamp='+getCurrentTimestamp();
		me.xmlHttp.open('POST', uri, true); // asynchronous
		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;			
	};
}

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 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;
}

function getTagValue(node, tagName)
{
	if(!node)
	{
		throw new Exception('getTagValue('+tagName+') of null node');
	}
	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()
{
	var logoutObject = new AjaxObject();
	logoutObject.callback = function(ajax)
	{
		reloadPage(0);
	};
	logoutObject.update('action=logout');
}

function randomPhoto(albumSelection, horizOnly)
{
	var ajax = new AjaxObject();
	AjaxManager.registerAjaxObject(ajax);
	var randomPhoto = document.getElementById('random_photo');
	ajax.setVariable('horizOnly', horizOnly ? true : false);
	ajax.callback = function(ajax)
	{
		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);
				
				AjaxManager.updateAjaxObject(ajax, 5*SECOND);
			}
		}
		else
		{
			AjaxManager.updateAjaxObject(ajax);
		}
	};
	ajax.update('action=random_photo&album_selection='+albumSelection);
}

function randomPhotoThumbs(section)
{
	var ajax = new AjaxObject();
	AjaxManager.registerAjaxObject(ajax);
	var container = document.getElementById('random_photo_thumbs');
	//container.style.background = 'url(images/resources/logo_faded.png) no-repeat scroll center center';
	
	var table = document.createElement('table');
	container.appendChild(table);
	var tbody = document.createElement('tbody');
	table.appendChild(tbody);
	var tr1 = document.createElement('tr');
	tbody.appendChild(tr1);
	var td1 = document.createElement('td');
	td1.style.textAlign = 'right';
	tr1.appendChild(td1);
	var imgBox1 = document.createElement('div');
	imgBox1.className = 'img_box';
	td1.appendChild(imgBox1);
	var td2 = document.createElement('td');
	td2.style.textAlign = 'left';
	tr1.appendChild(td2);
	var imgBox2 = document.createElement('div');
	imgBox2.className = 'img_box';
	td2.appendChild(imgBox2);
	var tr2 = document.createElement('tr');
	tbody.appendChild(tr2);
	var td3 = document.createElement('td');
	td3.style.textAlign = 'right';
	tr2.appendChild(td3);
	var imgBox3 = document.createElement('div');
	imgBox3.className = 'img_box';
	td3.appendChild(imgBox3);
	var td4 = document.createElement('td');
	td4.style.textAlign = 'left';
	tr2.appendChild(td4);
	var imgBox4 = document.createElement('div');
	imgBox4.className = 'img_box';
	td4.appendChild(imgBox4);
	
	var shrinker = new ShrinkObject(container);
	shrinker.hide();
	
	ajax.callback = function(ajax)
	{
		if(!ajax.success)
		{
			if(ajax.status != 2) // no albums found
			{
				AjaxManager.updateAjaxObject(ajax);
			}
			return;
		}
		
		//container.style.background = '';
		shrinker.expand();
		var thumbs = ajax.xmlDoc.getElementsByTagName('image');
		for(var i = 0; i < thumbs.length; i++)
		{
			var img = document.createElement('img');
			img.src = getTagValue(thumbs[i], 'src');
			img.size = getTagValue(thumbs[i], 'size');
			img.index = i;
			if(img)
			{
				img.onload = function()
				{
					var fader = new FadeObject(this);
					fader.hide();
					
					resizeImage(this, this.size, true);
					switch(this.index)
					{
						case 0:
							imgBox1.appendChild(this);
							break;
						case 1:
							imgBox2.appendChild(this);
							break;
						case 2:
							imgBox3.appendChild(this);
							break;
						case 3:
							imgBox4.appendChild(this);
							break;
					}
					
					fader.fadeIn();
				};
			}
		}
	};
	ajax.update('action=random_photo_thumbs&section='+section);
}

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);
}

function publicationUploadCallback(xmlDoc)
{
	var dialog = DialogManager.getDialog('publication_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();
	dialog.setInfoStatus('File successfully uploaded');
	DialogManager.closeDialog(dialog, 1*SECOND);
	
	PanelManager.updatePanelObjectByName('newsletter_list_panel'); 
	PanelManager.updatePanelObjectByName('investor_update_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('fellow_list_panel');
}

function deleteResume(id)
{
	var callback = function()
	{
		var ajax = new AjaxObject();
		ajax.callback = function(ajax)
		{
			if(!ajax.success)
			{
				showErrorDialog(ajax.message);
				return;
			}
			PanelManager.updatePanelObjectByName('fellow_list_panel');
		};
		ajax.update('action=delete_resume&id='+id);
	};
	showConfirmDialog('Are you sure you want to delete your resume?', callback);
}

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 photoUploadCallback(xmlDoc)
{
	var dialog = DialogManager.getDialog('photo_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('Photo successfully uploaded');
	DialogManager.closeDialog(dialog, 1*SECOND);
	
	PanelManager.updatePanelObjectByName('fellow_list_panel');
}

function logoUploadCallback(xmlDoc)
{
	var dialog = DialogManager.getDialog('logo_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('Logo successfully uploaded');
	DialogManager.closeDialog(dialog, 1*SECOND);
	
	PanelManager.updatePanelObjectByName('company_list_panel');
}
