function TabbedPane(varName)
{
	this.paneID			= null; // OVERRIDE
	this.iframeID		= null; // OVERRIDE
	this.loadingID		= null;
	this.varName 		= varName;
	this.size 			= 0;
	this.selectedTab 	= null;
	this.lastSelectedTab= null;
	this.styler			= null; // OVERRIDE
	this.urlMaker		= null;	// OVERRIDE
	this.tabs			= new Array();
	this.tabContentID	= new Array();
	this.tabURLData		= new Array();
	
	this.registerTab 	= function(tabID, tabContentID, tabURLData)
	{
		this.tabs.push(document.getElementById(tabID));
		this.tabContentID.push(tabContentID);
		this.tabURLData.push(tabURLData);
		
		if(this.styler != null)
			this.styler(this.tabs[this.size], 'Registered');
		eval("this.tabs[this.size].onclick = function (e) {" + this.varName + ".select(" + this.size + ");};");
		this.size++;
	}
	
	this.select			= function(index)
	{
		if(this.selectedTab == index) return;
		if(this.selectedTab != null)
		{
			this.unselect(this.selectedTab);
			this.request(index);
		}
		this.selectedTab = index;
		if(this.styler != null)
			this.styler(this.tabs[index], 'Selected');
	}
	
	this.unselect		= function(index)
	{
		if(this.styler != null)
			this.styler(this.tabs[index], 'Unselected');
		this.lastSelectedTab = index;
	}
	
	this.hideLastContent= function()
	{
		if(document.getElementById(this.tabContentID[this.lastSelectedTab]) != null)
			document.getElementById(this.tabContentID[this.lastSelectedTab]).style.display = "none";
	}
	
	this.request		= function(index)
	{
		if(document.getElementById(this.tabContentID[index]) == null)
		{
			if(this.loadingID != null && this.styler != null)
				this.styler(document.getElementById(this.loadingID), "Loading");
				
			G_REQUEST_QUEUE.enqueue(this.varName + ".requestGranted(" + index + ");");
			G_REQUEST_QUEUE.enqueue(this.varName + ".requestLoaded(" + index + ");");
			if(G_REQUEST_QUEUE.size() == 2)
				G_REQUEST_QUEUE.process();
		}
		else
		{
			this.hideLastContent();
			document.getElementById(this.tabContentID[index]).style.display = "block";
		}
	}
	
	this.requestGranted	= function(index)
	{
		var iframe = document.getElementById(this.iframeID);
		iframe.src = this.urlMaker(this.tabURLData[index]);
	}
	
	this.requestLoaded	= function(index)
	{
		var sourceElement	= frames[this.iframeID].document.getElementById(this.tabContentID[index]);	
		var destinElement	= document.createElement("DIV");
		destinElement.setAttribute("id", this.tabContentID[index]);
		destinElement.innerHTML = sourceElement != null ? sourceElement.innerHTML : "<b>No questions have been listed.</b>";

		if(this.loadingID != null && this.styler != null)
			this.styler(document.getElementById(this.loadingID), "Done Loading");
		
		this.hideLastContent();
		document.getElementById(this.paneID).appendChild(destinElement);
		
		if(G_REQUEST_QUEUE.size() > 0)
			G_REQUEST_QUEUE.process();
	}
}

function RequestProcessingQueue()
{
	this.requests = new Array();
	
	this.size = function()
	{
		return this.requests.length;
	}
	this.enqueue = function (command)
	{
		this.requests.push(command);
		this.requestCount++;
	}
	this.process = function()
	{
		if(this.requests.length > 0)
		{
			eval(this.requests.shift());
		}
	}
}
