function ClientBrowser(){
	ClientBrowser.prototype.dataBrowser = new Array(
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{	// for newer Netscape (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 	
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}	
	
	);
	
	ClientBrowser.prototype.dataOS= new Array(
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}		
	
	);
	
	ClientBrowser.prototype.init = function(){
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	}
	
	ClientBrowser.prototype.searchString = function(dataBrowser){
		for (var i=0; i<dataBrowser.length; i++){
			var dataString = dataBrowser[i].string;
			var dataProp = dataBrowser[i].prop;
			this.versionSearchString = dataBrowser[i].versionSearch || dataBrowser[i].identity;
			if (dataString) {
				if (dataString.indexOf(dataBrowser[i].subString) != -1)
					return dataBrowser[i].identity;
			}
			else if (dataProp)
				return dataBrowser[i].identity;
		}
	}
	
	ClientBrowser.prototype.searchVersion = function(dataString){
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	}
}

Array.prototype.quickSort = function(){
	this.sort(0, this.length);
}

Array.prototype.sort = function(begin, end){
	if((end-1) > begin){
		var pivot = begin + Math.floor(Math.random()*(end-begin));
		pivot = this.partition(begin, end, pivot);
		
		this.sort(begin, pivot);
		this.sort((parseInt(pivot)+1), end);
	}
}

Array.prototype.partition = function(begin, end, pivot){
	var piv = this[pivot];
	this.swap(pivot, (end-1));
	var store = begin;
	for(var z=begin; z<(end-1); ++z){
		if(this[z] <= piv){
			this.swap(store, z);
			++store;
		}
	}
	this.swap((end-1), store);
	return store;
	
}

Array.prototype.swap = function(a, b){
	var temp = this[a];
	this[a] = this[b];
	this[b] = temp;
}

Array.prototype.max = function(){
	var max = new Object();
	max.x = this[0].x;
	max.y = this[0].y;
	var len = this.length;
	for(var i=1; i<len; i++){
		if(this[i].x > max.x) max.x = this[i].x;
		if(this[i].y > max.y) max.y = this[i].y
	}
	return max;
}

Array.prototype.min = function(){
	var min = new Object();
	min.x = this[0].x;
	min.y = this[0].y;
	var len = this.length;
	for(var i=1; i<len; i++){
		if(this[i].x < min.x) min.x = this[i].x;
		if(this[i].y < min.y) min.y = this[i].y;
	}
	return min;
}

function Hashtable() {
	this.hashtable = new Object();
	
	Hashtable.prototype.clear = function() {
		this.hashtable = new Object();
	}

	Hashtable.prototype.containsKey = function(key) {
		var exists = false;
		for ( var i in this.hashtable) {
			if (i == key && this.hashtable[i] != null) {
				exists = true;
				break;
			}
		}
		return exists;
	}

	Hashtable.prototype.containsValue = function(value) {
		var contains = false;
		if (value != null) {
			for ( var i in this.hashtable) {
				if (this.hashtable[i] == value) {
					contains = true;
					break;
				}
			}
		}
		return contains;
	}

	Hashtable.prototype.get = function(key) {
		return this.hashtable[key];
	}

	Hashtable.prototype.isEmpty = function() {
		return (parseInt(this.size()) == 0) ? true : false;
	}

	Hashtable.prototype.keys = function() {
		var keys = new Array();
		for ( var i in this.hashtable) {
			if (this.hashtable[i] != null)
				keys.push(i);
		}
		return keys;
	}

	Hashtable.prototype.put = function(key, value) {
		if (key == null || value == null) {
			throw "NullPointerException {" + key + "},{" + value + "}";
		} else {
			this.hashtable[key] = value;
		}
	}

	Hashtable.prototype.remove = function(key) {
		var rtn = this.hashtable[key];
		this.hashtable[key] = null;
		return rtn;
	}

	Hashtable.prototype.size = function() {
		var size = 0;
		for ( var i in this.hashtable) {
			if (this.hashtable[i] != null)
				size++;
		}
		return size;
	}

	Hashtable.prototype.toString = function() {
		var result = "";
		for ( var i in this.hashtable) {
			if (this.hashtable[i] != null)
				result += "{" + i + "},{" + this.hashtable[i] + "}\n";
		}
		return result;
	}

	Hashtable.prototype.values = function() {
		var values = new Array();
		for ( var i in this.hashtable) {
			if (this.hashtable[i] != null)
				values.push(this.hashtable[i]);
		}
		return values;
	}

	Hashtable.prototype.entrySet = function() {
		return this.hashtable;
	}
}

Function.prototype.bind = function(object){
	var method = this;
	
	this.clientBrowser = new ClientBrowser();
	this.clientBrowser.init();
	
	switch(this.clientBrowser.browser){
		case "Explorer":{
			return function(event){
				method.call(object, event || window.event);
			}
		}default:{
			return function(){
				method.apply(object, arguments);
			}
		}
	}
}

Object.prototype.Inherits = function(parent){
	if(arguments.length > 1){
		parent.apply(this, Array.prototype.slice.call(arguments, 1));
	}else{
		parent.call(this);
	}
}

Function.prototype.Inherits = function(parent){
	this.prototype = new parent();
	this.prototype.constructor = this;
}

function getBrowser(){
	var clientBrowser = new ClientBrowser();
	clientBrowser.init();
	return clientBrowser.browser;
}

function getContextRoot(){
	var path = window.location.pathname;
	return path.substr(0, path.lastIndexOf("/")+1);
}

function showProgressBar(canvas){
	var loadingDiv = document.createElement("div");
	loadingDiv.id = "loadingDiv";
	loadingDiv.className = "loadingDiv";
	loadingDiv.setAttribute("class", "loadingDiv");
	
	loadingDiv.style.height = canvas.style.height;
	loadingDiv.style.width = canvas.style.width;
	
	loadingDiv.style.display = "none";
	
	var progressBar = new Image();
	progressBar.src = 'images/ajax_loader.gif';
	progressBar.style.position = "relative";
	progressBar.height = (progressBar.height == 0) ? 55 : progressBar.height;
	progressBar.width = (progressBar.width == 0) ? 54 : progressBar.width;
	
	var top = (parseInt(canvas.style.height)/2 - progressBar.height);
	var left = (parseInt(canvas.style.width)/2 - progressBar.width);
	
	progressBar.style.top = top + "px";
	progressBar.style.left = left + "px";

	loadingDiv.appendChild(progressBar);
	return loadingDiv;
}

function hideProgressBar(){
	document.getElementById("loadingDiv").style.display = "none";
}

function QueryString(){
	this.param = new Array();
	
	var qsReg = new RegExp("[?][^#]*","i");
    hRef = unescape(window.location.href);
    var qsMatch = hRef.match(qsReg) + "";
    qsMatch = qsMatch.substr(1, qsMatch.length -1);
    
	var qsArray = qsMatch.split("&");
	var qsLength = qsArray.length;
	
	for(var i=0; i<qsLength; i++){
		var pair = qsArray[i].split("=");
		var key = pair[0];
		var value = pair[1];
		
		this.param[key] = value;
	}
	
	
}

QueryString.prototype.get = function(key){
	return (this.param[key] == undefined)? null : this.param[key];
}

QueryString.prototype.getAll = function(){
	var qsReg = new RegExp("[?][^#]*","i");
    hRef = unescape(window.location.href);
    var qsMatch = hRef.match(qsReg) + "";
    qsMatch = qsMatch.substr(1, qsMatch.length -1);
    return qsMatch;
}

function getElectionYear(){
	var defYear = 2010;
	var qs = new QueryString();
	if(qs.get("election_yr") != undefined){
		defYear = qs.get("election_yr");
	}
	return defYear;
}

