// 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()
{
	setupMenus();
	preloadImages();
	dialogSetup();
	
	runPostProcessing();
}

function runPostProcessing(element)
{
	if(!element)
	{
		element = document;
	}
	
	setupInputs(element);
	setupTextareas(element);
}

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);
		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.overflow = 'auto';
	//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 doNav(url)
{
	document.location.href = url;
}

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;
}