// JavaScript Document

Object.prototype.getType = function()
{
	var type = String(this.constructor).match(/function\s+(\w+)/)[1];
	return type ? type : 'null';
};
Object.prototype.isType = function(type)
{
	return this.getType() == type;
};
	
// Variable Holding
Object.prototype.variables = Array();
Object.prototype.setVariable = function(name, variable)
{
	this.variables[name] = variable;
};
Object.prototype.getVariable = function(name)
{
	return this.variables[name];
};

function Exception(message)
{
	this.message = message;
	
	this.toString = function()
	{
		return message;
	};
}

String.prototype.trim = function()
{
	return this.replace(/^\s+|\s+$/g, '');
};
String.prototype.truncate = function(length, ellipses)
{
	if(this.length > length)
	{
		if(ellipses)
		{
			return this.substring(0, length-3)+'...';
		}
		return this.substring(0, length);
	}
	return this;
}
String.prototype.contains = function(s)
{
	return this.indexOf(s, 0) != -1;
};
String.prototype.containsWord = function(s)
{
	var array = this.split(' ');
	for(var i = 0; i < array.length; ++i)
	{
		if(array[i] == s)
		{
			return true;
		}
	}
	return false;
};
Array.prototype.remove = function(element)
{
	var length = this.length;
	for(var i = 0; i < length; ++i)
	{
		var el = this.shift();
		if(el == element)
		{
			return el;
		}
		else
		{
			this.push(el);
		}
	}
	return null; // element not found
};
Array.prototype.contains = function(element)
{
	for(var i = 0; i < this.length; ++i)
	{
		if(this[i] == element)
		{
			return true;
		}
	}
	return false;
};

function Browser()
{
	var ua, s, i;
	
	this.isIE	= false;
	this.isNS	= false;
	this.version = null;
	
	ua = navigator.userAgent;
	
	s = "MSIE";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}
	
	s = "Netscape6/";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isNS = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}
	
	// Treat any other "Gecko" Browser as NS 6.1
	s = "Gecko";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isNS = true;
		this.version = 6.1;
		return;
	}
	
	s = "Opera/";
	if ((i = ua.indexOf(s)) >= 0)
	{
		this.isIE = true;
		this.version = parseFloat(ua.substr(i + s.length));
		return;
	}
}

var Browser = new Browser();

function setup()
{
	preloadImages();
	dialogSetup();
	
	runPostProcessing();
}

function runPostProcessing(element, runScripts)
{
	if(!element)
	{
		element = document;
	}
	
	setupLinks(element);
	setupInputs(element);
	setupTextareas(element);
	setupTables(element);
	replaceTextboxes(element);
	setupCollapsableDivs(element);
	if(runScripts)
	{
		executeScripts(element);
	}
}

function executeScripts(element)
{
	var scripts = element.getElementsByTagName('script');
	for(var i = 0; i < scripts.length; ++i)
	{
		eval(scripts.item(i).innerHTML);
	}
}

function setupInputField(field)
{
	var onfocus = function(event)
	{
		var target = getTarget(event);
		if(!target.className.contains('no_toggle') && target.value == target.defaultValue)
		{
			target.value = '';
		}
		target.style.color = '#353535';
		target.style.borderColor = '#3A5E8C';
	};
	var onblur = function(event)
	{
		var target = getTarget(event);
		if(!target.className.contains('no_toggle') && target.value == '')
		{
			target.value = target.defaultValue;
		}
		target.style.color = '#999999';
		target.style.borderColor = '#CCCCCC';
	};
	registerListener('focus', onfocus, field);
	registerListener('blur', onblur, field);
	field.setAttribute('autocomplete', 'off');
	if(field.value == '')
	{
		field.value = field.defaultValue; //IE7
	}
}

function setupInputs(element)
{
	var list = element.getElementsByTagName('input');
	for(var i = 0; i < list.length; i++)
	{
		var input = list.item(i);
		if(input.type == 'text' || input.type == 'password')
		{
			setupInputField(input);
		}
		else if(input.type == 'button')
		{
			if(input.className.containsWord('disabled'))
			{
				input.disabled = true;
			}
		}
	}
}

function setupLinks(element)
{
	var list = element.getElementsByTagName('a');
	for(var i = 0; i < list.length; ++i)
	{
		var link = list.item(i);
		if(link.className.containsWord('external'))
		{
			link.target = '_blank';
			link.title = 'Opens in new window';
		}
		if(link.className.containsWord('dialog'))
		{
			//link.title = 'Opens a dialog';
		}
		if(link.className.containsWord('download'))
		{
			link.title = 'Download';
		}
		if(link.className.containsWord('disabled'))
		{
			link.removeAttribute('href');
			link.removeAttribute('onclick');
			//link.title = 'Unavailable';
		}
	}
}

function setupTextarea(textarea)
{
	textarea.style.overflowX = 'auto';
	textarea.style.overflowY = 'hidden';
	textarea.setAttribute('wrap', 'virtual');
	textarea.rows = 3;
	textarea.minRows = textarea.rows;
	var onfocus = function(event)
	{
		var target = getTarget(event);
		if(!target.className.contains('no_toggle') && target.value == target.defaultValue)
		{
			target.value = '';
		}
		target.style.color = '#353535';
		target.style.borderColor = '#3A5E8C';
		onchange(event);
	};
	var onblur = function(event)
	{
		var target = getTarget(event);
		if(!target.className.contains('no_toggle') && target.value == '')
		{
			target.value = target.defaultValue;
		}
		target.style.color = '#999999';
		target.style.borderColor = '#CCCCCC';
	};
	var onchange = function(event)
	{
		var target = getTarget(event);
		while(target.scrollHeight < target.offsetHeight && target.rows > textarea.minRows)
		{
			if(target.maxRows && target.rows < target.maxRows)
			{
				target.style.overflowY = 'hidden';
			}
			target.rows--;
		}
		while(target.scrollHeight > target.offsetHeight)
		{
			if(target.maxRows && target.rows >= target.maxRows)
			{
				target.style.overflowY = 'scroll';
				break;
			}
			target.rows++;
		}
	};
	registerListener('focus', onfocus, textarea);
	registerListener('blur', onblur, textarea);
	registerListener('keyup', onchange, textarea);
	registerListener('change', onchange, textarea);
	if(textarea.value == '')
	{
		textarea.value = textarea.defaultValue; //IE7
	}
}

function setupTextareas(element)
{
	var list = element.getElementsByTagName('textarea');
	for(var i = 0; i < list.length; i++)
	{
		setupTextarea(list.item(i));
	}
}

function setupTables(element)
{
	var tables = element.getElementsByTagName('table');
	for(var i = 0; i < tables.length; ++i)
	{
		var table = tables.item(i);
		if(table.className.containsWord('sortable'))
		{
			TableSorter.makeSortable(table);
		}
		var tbody = table.getElementsByTagName('tbody').item(0);
		if(!tbody)
		{
			continue;
		}
		var rows = tbody.getElementsByTagName('tr');
		for(var j = 0; j < rows.length; ++j)
		{
			var tr = rows.item(j);
			if(!tr.className.containsWord('mouseover_skip'))
			{
				//tr.style.cursor = 'pointer';
				var onmouseover = function(event)
				{
					tr.style.backgroundColor = '#353535';
					tr.style.color = '#FFFFFF';
				};
				var onmouseout = function(event)
				{
					tr.style.backgroundColor = '#FFFFFF';
					tr.style.color = '#353535';
				};
				//registerListener('mouseover', onmouseover, tr);
				//registerListener('mouseout', onmouseout, tr);
			}
		}
	}
}

function replaceTextboxes(element)
{
	var divs = element.getElementsByTagName('div');
	for(var i = 0; i < divs.length; ++i)
	{
		if(divs.item(i).className.containsWord('textbox'))
		{
			var textbox = new TextboxObject();
			textbox.replace(divs.item(i));
		}
	}
}

function setupCollapsableDivs(element)
{
	var divs = element.getElementsByTagName('div');
	for(var i = 0; i < divs.length; ++i)
	{
		if(divs.item(i).className.containsWord('collapsible'))
		{
			var cDiv = new CollapsableDivObject(divs.item(i));
		}
	}
}

function getIFrameDocument(iframe)
{
	var doc = iframe.contentDocument ? iframe.contentDocument : iframe.contentWindow.document;
	doc.open();
	doc.close();
	return doc;
}

function reloadPage(time)
{
	setTimeout('document.location.reload()', time ? time : 0);
}

function xmlDocToString(xmlDoc)
{
	try
	{
		return (new XMLSerializer()).serializeToString(xmlDoc);
	}
	catch(e)
	{
		return xmlDoc.xml;
	}
}

function htmlSpecialChars(string, quote_style)
{
	var hash_map = hash_map = this.get_html_translation_table('HTML_SPECIALCHARS', quote_style);
	var tmp_str = string.toString();
	
	hash_map["'"] = '&#039;';
	for(var symbol in hash_map)
	{
		var entity = hash_map[symbol];
		tmp_str = tmp_str.split(symbol).join(entity);
	}
	
	return tmp_str;
}

function get_html_translation_table(table, quote_style)
{	
	var entities = {}, hash_map = {}, decimal = 0, symbol = '';
	var constMappingTable = {}, constMappingQuoteStyle = {};
	var useTable = {}, useQuoteStyle = {};
	
	// Translate arguments
	constMappingTable[0]	  = 'HTML_SPECIALCHARS';
	constMappingTable[1]	  = 'HTML_ENTITIES';
	constMappingQuoteStyle[0] = 'ENT_NOQUOTES';
	constMappingQuoteStyle[2] = 'ENT_COMPAT';
	constMappingQuoteStyle[3] = 'ENT_QUOTES';
	
	useTable	  = !isNaN(table) ? constMappingTable[table] : table ? table.toUpperCase() : 'HTML_SPECIALCHARS';
	useQuoteStyle = !isNaN(quote_style) ? constMappingQuoteStyle[quote_style] : quote_style ? quote_style.toUpperCase() : 'ENT_COMPAT';
	
	if (useTable !== 'HTML_SPECIALCHARS' && useTable !== 'HTML_ENTITIES')
	{
		throw new Error("Table: "+useTable+' not supported');
	}
	
	entities['38'] = '&amp;';
	if(useTable === 'HTML_ENTITIES')
	{
		entities['160'] = '&nbsp;';
		entities['161'] = '&iexcl;';
		entities['162'] = '&cent;';
		entities['163'] = '&pound;';
		entities['164'] = '&curren;';
		entities['165'] = '&yen;';
		entities['166'] = '&brvbar;';
		entities['167'] = '&sect;';
		entities['168'] = '&uml;';
		entities['169'] = '&copy;';
		entities['170'] = '&ordf;';
		entities['171'] = '&laquo;';
		entities['172'] = '&not;';
		entities['173'] = '&shy;';
		entities['174'] = '&reg;';
		entities['175'] = '&macr;';
		entities['176'] = '&deg;';
		entities['177'] = '&plusmn;';
		entities['178'] = '&sup2;';
		entities['179'] = '&sup3;';
		entities['180'] = '&acute;';
		entities['181'] = '&micro;';
		entities['182'] = '&para;';
		entities['183'] = '&middot;';
		entities['184'] = '&cedil;';
		entities['185'] = '&sup1;';
		entities['186'] = '&ordm;';
		entities['187'] = '&raquo;';
		entities['188'] = '&frac14;';
		entities['189'] = '&frac12;';
		entities['190'] = '&frac34;';
		entities['191'] = '&iquest;';
		entities['192'] = '&Agrave;';
		entities['193'] = '&Aacute;';
		entities['194'] = '&Acirc;';
		entities['195'] = '&Atilde;';
		entities['196'] = '&Auml;';
		entities['197'] = '&Aring;';
		entities['198'] = '&AElig;';
		entities['199'] = '&Ccedil;';
		entities['200'] = '&Egrave;';
		entities['201'] = '&Eacute;';
		entities['202'] = '&Ecirc;';
		entities['203'] = '&Euml;';
		entities['204'] = '&Igrave;';
		entities['205'] = '&Iacute;';
		entities['206'] = '&Icirc;';
		entities['207'] = '&Iuml;';
		entities['208'] = '&ETH;';
		entities['209'] = '&Ntilde;';
		entities['210'] = '&Ograve;';
		entities['211'] = '&Oacute;';
		entities['212'] = '&Ocirc;';
		entities['213'] = '&Otilde;';
		entities['214'] = '&Ouml;';
		entities['215'] = '&times;';
		entities['216'] = '&Oslash;';
		entities['217'] = '&Ugrave;';
		entities['218'] = '&Uacute;';
		entities['219'] = '&Ucirc;';
		entities['220'] = '&Uuml;';
		entities['221'] = '&Yacute;';
		entities['222'] = '&THORN;';
		entities['223'] = '&szlig;';
		entities['224'] = '&agrave;';
		entities['225'] = '&aacute;';
		entities['226'] = '&acirc;';
		entities['227'] = '&atilde;';
		entities['228'] = '&auml;';
		entities['229'] = '&aring;';
		entities['230'] = '&aelig;';
		entities['231'] = '&ccedil;';
		entities['232'] = '&egrave;';
		entities['233'] = '&eacute;';
		entities['234'] = '&ecirc;';
		entities['235'] = '&euml;';
		entities['236'] = '&igrave;';
		entities['237'] = '&iacute;';
		entities['238'] = '&icirc;';
		entities['239'] = '&iuml;';
		entities['240'] = '&eth;';
		entities['241'] = '&ntilde;';
		entities['242'] = '&ograve;';
		entities['243'] = '&oacute;';
		entities['244'] = '&ocirc;';
		entities['245'] = '&otilde;';
		entities['246'] = '&ouml;';
		entities['247'] = '&divide;';
		entities['248'] = '&oslash;';
		entities['249'] = '&ugrave;';
		entities['250'] = '&uacute;';
		entities['251'] = '&ucirc;';
		entities['252'] = '&uuml;';
		entities['253'] = '&yacute;';
		entities['254'] = '&thorn;';
		entities['255'] = '&yuml;';
	}
	
	if (useQuoteStyle !== 'ENT_NOQUOTES')
	{
		entities['34'] = '&quot;';
	}
	if (useQuoteStyle === 'ENT_QUOTES')
	{
		entities['39'] = '&#39;';
	}
	entities['60'] = '&lt;';
	entities['62'] = '&gt;';
	
	// ascii decimals to real symbols
	for(decimal in entities)
	{
		symbol = String.fromCharCode(decimal);
		hash_map[symbol] = entities[decimal];
	}
	
	return hash_map;
}

function registerListener(eventName, callback, element)
{
	if(Browser.isIE)
	{
		(element ? element : document).attachEvent('on'+eventName, callback);
	}
	else if(Browser.isNS)
	{
		success = (element ? element : document).addEventListener(eventName, callback, true);
	}
}

function unregisterListener(eventName, callback, element)
{
	if(Browser.isIE)
	{
		(element ? element : document).detachEvent('on'+eventName, callback);
	}
	if(Browser.isNS)
	{
		(element ? element : document).removeEventListener(eventName, callback, true);
	}
}

function getTarget(event)
{
	var target = null;
	if(Browser.isIE)
	{
		target = window.event.srcElement;
	}
	if(Browser.isNS)
	{
		target = event.target;
	}
	if(target.nodeType == 3) // get text node parent
	{
		target = target.parentNode;
	}
	return target;
}

function getKeyCode(event)
{
	if(Browser.isIE)
	{
		return window.event.keyCode;
	}
	if(Browser.isNS)
	{
		return event.which ? event.which : event.keyCode;
	}
}

function stopEventPropagation(event)
{
	if(Browser.isIE)
	{
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	if(Browser.isNS)
	{
		event.preventDefault();
		event.stopPropagation();
	}
}

function preloadImages()
{
	var folder = 'images/resources/';
	
	// set image urls
	var images = [
	folder+'loading.gif',
	folder+'loading_bar.gif',
	folder+'loading_small.gif',
	folder+'navtab_background_hover.png',
	folder+'button_background_hover.png',
	folder+'modal_screen.png',
	folder+'button_background_hover.png',
	folder+'dialog_border.png',
	folder+'dialog_close.png',
	folder+'dialog_title_background.png'
	];
	
	for(var i = 0; i < images.length; i++)
	{
		var img = new Image();
		img.src = images[i];
	}
}

/* General */
function textToHTML(text)
{
	return text.replace(/\n/g, '<br />');
}

function getCurrentTimestamp()
{
	return Math.round(new Date().valueOf() / 1000);
}

function stringToTimestamp(string)
{
	var date = new Date(string);
	return date.valueOf() / 1000;
}

function deleteTextbox(id)
{
	var textbox = document.getElementById(id);
	if(textbox)
	{
		if(textbox.tagName == 'div')
		{
			textbox.parentNode.removeChild(textbox);
		}
		else // remove table
		{
			var table = textbox.parentNode.parentNode;
			table.parentNode.removeChild(table);
		}
	}
}

function removeChildren(element)
{
	while(element.firstChild)
	{
		element.removeChild(element.firstChild);
	}
}

function getURLDomain(url)
{
	return url.match(/:\/\/(.[^/]+)/)[1];
}

function getURLParameter(name)
{
	name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
	var regex = new RegExp('[\\?&]'+name+'=([^&#]*)');
	var results = regex.exec(window.location.href);
	return results == null ? '' : results[1];
}

function resizeImage(img, size)
{
	var percentage = (img.width > img.height) ? (size / img.width) : (size / img.height);

	var width = Math.round(img.width * percentage);
	var height = Math.round(img.height * percentage);
	
	img.width = width;
	img.height = height;
}

function adminUser()
{
	return userIs(ADMIN);
}

function userIs(id)
{
	return id == getCookieValue('ID_NSBE');
}

function memberUserIs(id)
{
	return id == getCookieValue('MEMBER_ID_NSBE');
}

function getCookieValue(name)
{
	var cookies = document.cookie.split(';');
	for(var i = 0; i < cookies.length; i++)
	{
		var pair = cookies[i].split('=');
		pair[0] = pair[0].trim();
		if(pair[0] == name)
		{
			return pair[1];
		}
	}
	return null;
}

function onEnter(event)
{
	var keycode = getKeyCode(event);
	
	if(keycode == 13) //Enter
	{
		var target = getTarget(event);
		target.onEnterFn();
		stopEventPropagation(event);
	}
}

function onEsc(event)
{
	var keycode = getKeyCode(event);
	
	if(keycode == 27) //Esc
	{
		var target = getTarget(event);
		target.onEscFn();
		stopEventPropagation(event);
	}
}

function getWindowWidth()
{
	if(Browser.isIE)
	{
		return document.body.offsetWidth;
	}
	return window.innerWidth;
}

function getWindowHeight()
{
	if(isIE())
	{
		return document.body.offsetHeight;
	}
	return window.innerHeight;
}

function getXOffset(obj)
{
	var curleft = 0;
	if(obj.offsetParent)
	{
		while(1) 
		{
			curleft += obj.offsetLeft;
			if(!obj.offsetParent)
			{
				break;
			}
			obj = obj.offsetParent;
		}
	}
	else if(obj.x)
	{
		curleft += obj.x;
	}
	return curleft;
}

function getYOffset(obj)
{
	var curtop = 0;
	if(obj.offsetParent)
	{
		while(1)
		{
			curtop += obj.offsetTop;
			if(!obj.offsetParent)
			{
				break;
			}
			obj = obj.offsetParent;
		}
	}
	else if(obj.y)
	{
		curtop += obj.y;
	}
	return curtop;
}

function validateEmail(email)
{
	var regex = new RegExp();
	regex.compile("^[^@]{1,64}@[^@]{1,255}$");
	if(!regex.test(email))
	{
		return false;
	}
	var emailArray = email.split('@');
	var localArray = emailArray[0].split('.');
	var i;
	regex.compile("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$");
	for(i = 0; i < localArray.length; i++)
	{
		if(!regex.test(localArray[i]))
		{
			return false;
		}
	}
	regex.compile("^\[?[0-9\.]+\]?$");
	if(!regex.test(emailArray[1]))
	{
		var domainArray = emailArray[1].split('.');
		if(domainArray.length < 2)
		{
			return false;
		}
		regex.compile("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$");
		for(i = 0; i < domainArray.length; i++)
		{
			if(!regex.test(domainArray[i]))
			{
				return false;
			}
		}
	}
	return true;
}

function doNav(url)
{
	document.location.href = url;
}

function fileSizeString(size)
{
	var size = new Number(size);
	if(size >= 1024)
	{
		size /= 1024;
		if(size >= 1024)
		{
			size /= 1024;
			if(size >= 1024)
			{
				size /= 1024;
				return size.toFixed(2)+' GB';
			}
			else
				return size.toFixed(1)+' MB';
		}
		else
			return Math.round(size)+' KB';
	}
	else
		return Math.round(size)+' B';
}

function getIcon(mimetype)
{
	var icon = document.createElement('img');
	switch(mimetype)
	{
		case MIME_DOC:
			icon.src = ICON_DOC;
			break;
		case MIME_DOCX:
			icon.src = ICON_DOCX;
			break;
		case MIME_PPT:
			icon.src = ICON_PPT;
			break;
		case MIME_PPTX:
			icon.src = ICON_PPTX;
			break;
		case MIME_PDF:
			icon.src = ICON_PDF;
			break;
		case MIME_JPG:
		case MIME_GIF:
		case MIME_PNG:
			icon.src = ICON_IMG;
			break;
		default:
			icon.src = '';
	}
	return icon;
}

function getThumb(mimetype, id)
{
	var thumb = document.createElement('img');
	switch(mimetype)
	{
		case MIME_DOC:
			thumb.src = THUMB_DOC;
			break;
		case MIME_DOCX:
			thumb.src = THUMB_DOCX;
			break;
		case MIME_PPT:
			thumb.src = THUMB_PPT;
			break;
		case MIME_PPTX:
			thumb.src = THUMB_PPTX;
			break;
		case MIME_PDF:
			thumb.src = THUMB_PDF;
			break;
		case MIME_JPG:
		case MIME_GIF:
		case MIME_PNG:
			thumb.src = 'img.php?id='+id;
			break;
		default:
			thumb.src = '';
	}
	return thumb;
}

/*
--------------------- OLD ---------------------

function setVideo(name, source)
{
	code = '<br /><br />';
	code += '<embed id="VideoPlayback" allowFullScreen="true" src="'+source+'" type="application/x-shockwave-flash"></embed>';
	setCode('video', code);
}

function setGBMRecording(name, source)
{
	code = '<br /><br />';
	code += '<embed type="application/x-shockwave-flash" src="media/flvplayer.swf" id="GBMRecordingPlayback" name="movie1" bgcolor="#FFFFFF" quality="high" allowscriptaccess="always" allowfullscreen="true" flashvars="file=rtmpt://xsrv3-public.engin.umich.edu/streamingvideo&id=media/nsbe/'+source+'&amp;width=400&amp;height=326&amp;javascriptid=GBMRecordingPlayback&amp;enablejs=true&amp;autostart=false" width="400" height="326">';
	setCode('gbm_recording', code);
}

*/