// 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);
	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 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';
		}
		if(link.className.containsWord('dialog'))
		{
		}
		if(link.className.containsWord('download'))
		{
			link.title = 'Download';
		}
		if(link.className.containsWord('disabled'))
		{
			link.removeAttribute('href');
			link.removeAttribute('onclick');
		}
	}
}

function preloadImages()
{
	var folder = 'images/resources/';
	
	images = new Array(
	folder+'logo.png',
	folder+'menu_background.png',
	folder+'modal_screen.png',
	folder+'dialog_border.png',
	folder+'dialog_close.png',
	folder+'dialog_title_background.png',
	folder+'donate.png'
	);
	
	var img;
	for(i = 0; i < images.length; i++)
	{
		img = new Image();
		img.src = images[i];
	}
}

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);
		target.value = target.value.trim();
		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);
		}
	}
}

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 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 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 doNav(url)
{
	document.location.href = url;
}

function reloadPage(time)
{
	setTimeout('document.location.reload()', time ? time : 0);
}

function removeChildren(element)
{
	while(element.firstChild)
	{
		element.removeChild(element.firstChild);
	}
}

function getCurrentTimestamp()
{
	return Math.round(new Date().valueOf() / 1000);
}

function getWindowWidth()
{
	if(Browser.isIE)
	{
		return document.body.offsetWidth;
	}
	return window.innerWidth;
}

function getWindowHeight()
{
	if(isIE())
	{
		return document.body.offsetHeight;
	}
	return window.innerHeight;
}

function getHeight(element)
{
	if(element.style.pixelHeight)
	{
		return parseInt(element.style.pixelHeight);
	}
	else if(element.clientHeight)
	{
		return parseInt(element.clientHeight);
	}
	else
	{
		return parseInt(element.offsetHeight);
	}
}

function getWidth(element)
{
	if(element.style.pixelWidth)
	{
		return parseInt(element.style.pixelWidth);
	}
	else
	{
		return parseInt(element.offsetWidth);
	}
}

function resizeImage(img, size, tallVert)
{
	var percentage = (img.width > img.height) ? (size / img.width) : (size / img.height);
	if(tallVert && img.height > img.width)
	{
		percentage = size / img.width;
	}
	
	var width = Math.round(img.width * percentage);
	var height = Math.round(img.height * percentage);
	
	img.width = width;
	img.height = height;
}

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 validateURL(url)
{
	var regex = new RegExp();
	regex.compile("^(http|https)://[A-Za-z0-9-_]+\\.[A-Za-z0-9-_%#&\?\/.=]+$");
	return regex.test(url);
}

function htmlSpecialChars(string, quote_style)
{
	var 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 textToHTML(text)
{
	text = htmlSpecialChars(text);
	return text.replace(/\n/g, '<br />');
}
