//////////////////////////////////////////////
// ColumnBrowser Object VERSION_0.8
//////////////////////////////////////////////
//
// The ColumnBrowser is the the column container
// component that handles the slice layout, population
// etc
//
// Ali Russell 10.2006
//
//////////////////////////////////////////////

var ColumnBrowser = Class.create();
ColumnBrowser.prototype = {
//
// Member Variables
m_renderSurfaceId: "DefaultColumnBrowserSurfaceID",
m_closedColumnsRenderSurfaceId: "DefaultClosedColumnsSurfaceID",
m_renderSurface: null,
m_controlSurface: null, 
m_isClosed: true,
m_nextIsClosed: true,
m_isAnimating: false,
m_animationFactor: 1.0,
m_animationAmount: 0.1,
m_animateTimeout: -1,
m_closedTitle: "Home > Click to Start Browsing!",
m_openTitle: "Explore ",
m_closedHeight: 2.0,
m_openHeight: 15,
m_currentHeight: 2.5,
m_openColumns: new Array(),
m_allColumns: new Array(),
m_defaultSlice: new Array(),
m_minColumnWidth: 180,
m_listScrollPopupTimeout: -1,
m_columnsLoaded: false,
m_xmlRequest: new XMLHttpRequest(),
m_loadingText: "<div class='loading'><img src='./pics/ColumnBrowser/loading.gif' /><br>Loading Columns</div>",
m_initialHistory: null,
m_historyArray: null,
m_historyString: "",

m_initialBreadcrumb: "mSpace Explorer ",
m_initialMinimisedBreadcrumb: "mSpace Explorer (Click to Open)",
m_isStarted: false,
m_intialEventCall: null, 
m_intialEventParams: null,
m_closedColumnsControl: null,
m_minimisedHistoryHash: null,

m_acceptingInput: true,

m_columnHistoryUrl: "",


columnsLoaded: false,
firstDataLoad: false,

spacerPadding: 0,


//
// Constructor
initialize: function(objectOptions)
	{
		window.ColumnBrowser = this;
		//Override the defatul object parameters, with those from the objectOptions.
		ParseOptions(objectOptions, this);
		
		var prePopOverride = window.mSpaceApplication.GetGlobalSetting("prePopulate");
		if (prePopOverride!=null)
		{
			window.g_prePopulate = eval(prePopOverride);
		}
		else
		{
			window.g_prePopulate = true;
		}
		
		var backHighlightOverride = window.mSpaceApplication.GetGlobalSetting("backHighlight");
		if (backHighlightOverride!=null)
		{
			window.g_backHighlight = eval(backHighlightOverride);
		}
		else
		{
			window.g_backHighlight = true;
		}
		
		
		var columnLoadAnimateOverride = window.mSpaceApplication.GetGlobalSetting("columnLoadAnimate");
		if (columnLoadAnimateOverride!=null)
		{
			window.g_columnLoadAnimate = eval(columnLoadAnimateOverride);
		}
		else
		{
			window.g_columnLoadAnimate = true;
		}		
		
		
		
		this.m_loaddefaultSliceBtn = Builder.node('div', {className : "loadSliceBtn", title: "Load the default slice..."});
		RegisterEvent(this.m_loaddefaultSliceBtn, "click", this, "LoadDefaultSlice");
		
		this.m_resetSliceBtn = Builder.node('div', {className : "resetSliceBtn", title: "Reset the current slice..."});
		RegisterEvent(this.m_resetSliceBtn, "click", this, "ResetSlice");		
		
		
		///////////////// LOAD THE COLUMN BROWSER STATUS  ///////////////
		/////////////////////////////////////////////////////////////////
		
		
		
		//Create the minimised column container div
		this.m_minimisedControlSurface = createDiv("ColumnBrowserMinimised");
		
		this.m_minColumnBrowserHeader = createDiv("ColumnBrowserHeader");
		this.m_minimisedControlSurface.appendChild(this.m_minColumnBrowserHeader);
		
		this.m_minHeaderbreadcrumb = createDiv("breadcrumb", true);
		this.m_minHeaderbreadcrumb.innerHTML = this.m_initialMinimisedBreadcrumb;
		
		this.m_headerOpenColsBtn = createDiv("opencolsbtn", true);
		
		this.m_minColumnBrowserHeader.appendChild(this.m_headerOpenColsBtn);
		this.m_minColumnBrowserHeader.appendChild(this.m_minHeaderbreadcrumb);
		
		
		
		
		//Create the column container div
		this.m_controlSurface = createDiv("ColumnBrowser");
		
		
		this.m_headerbreadcrumb = createDiv("breadcrumb", true);
		this.m_headerbreadcrumb.innerHTML = this.m_initialBreadcrumb;
		
		this.m_headerAddColsBtn = createDiv("addcolsbtn", true);
	
		
		//Create the column header
		this.m_columnBrowserHeader = createDiv("ColumnBrowserHeader");
		
		this.m_columnBrowserHeader.appendChild(this.m_headerAddColsBtn);
		this.m_columnBrowserHeader.appendChild(this.m_headerbreadcrumb);
		
		this.m_controlSurface.appendChild(this.m_columnBrowserHeader);
		
			
		
		
		
		//Create the column container.
		this.m_columnContainer = createDiv("ColumnContainer");
		
		this.m_columnHolder = createDiv("Holder", true);
		this.m_columnContainer.appendChild(this.m_columnHolder);
		
		this.m_controlSurface.appendChild(this.m_columnContainer);
			
		
		
		//Create the dummy Column
		this.m_dummyColumn = createDiv("DummyColumn");
		
		this.m_dummyColumnSpacer = createDiv("Spacer", true);
		this.m_dummyColumn.appendChild(this.m_dummyColumnSpacer);

		this.m_dummyColumnContents = createDiv("Contents", true);
		this.m_dummyColumnContents.innerHTML = "Move Here";	
		this.m_dummyColumnSpacer.appendChild(this.m_dummyColumnContents);
		
		
		
		//Create the list A-Z notifier
		this.m_listPositionPopup = createDiv("ListPositionPopup");
		this.m_listPositionPopup.style.top = "0px";
		this.m_listPositionPopup.style.left = "0px";
		
		this.m_listPositionPopup.style.display = "none";
		this.m_listPositionPopup.innerHTML = "ListPopup";
		
		this.m_columnContainer.appendChild(this.m_listPositionPopup);
		
		
		this.UpdateStatus(true);
		
		//Register custom events
		////////////////////////

		mSpaceApplication.Subscribe("mSpaceApplication.PageResize", this);
		mSpaceApplication.Subscribe("mSpaceApplication.Start", this);
		mSpaceApplication.Subscribe("mSpaceApplication.HistoryStart", this);
		mSpaceApplication.Subscribe("mSpaceApplication.StartMinimised", this);
		
		mSpaceApplication.Subscribe("mSpaceHistory.PopHistory", this);
		mSpaceApplication.Subscribe("mSpaceHistory.UpdateHistory", this);
		
		mSpaceApplication.Subscribe("Column.StartDrag", this);
		mSpaceApplication.Subscribe("Column.StopDrag", this);
		mSpaceApplication.Subscribe("Column.Drag", this);
		mSpaceApplication.Subscribe("Column.DragOpen", this);
		mSpaceApplication.Subscribe("Column.MoveLeft", this);
		mSpaceApplication.Subscribe("Column.MoveRight", this);
		mSpaceApplication.Subscribe("Column.Close", this);
		mSpaceApplication.Subscribe("Column.Open", this);
		mSpaceApplication.Subscribe("Column.InitialLoad", this);
		
		mSpaceApplication.Subscribe("Column.SelectItem", this);
		mSpaceApplication.Subscribe("Column.SelectItemWithSlice", this);
		mSpaceApplication.Subscribe("Column.UnSelectItem", this);
		mSpaceApplication.Subscribe("Column.UnSelectAll", this);
		
		mSpaceApplication.Subscribe("ColumnBrowser.ClearSelections", this);
		mSpaceApplication.Subscribe("ColumnBrowser.QueueColumn", this);
		mSpaceApplication.Subscribe("ColumnBrowser.SendSlice", this);
		
		//mSpaceApplication.Subscribe("ColumnBrowser.SetSlice", this);
				
	
		//Listen for any clicks, in case col browser is not open
		mSpaceApplication.Subscribe("Item.MouseClick", this);
	
		
		
		mSpaceApplication.Subscribe("List.Scroll", this);
		mSpaceApplication.Subscribe("List.LoadPartialItems", this);
		
		
		mSpaceApplication.Subscribe("mSpaceHistory.HistoryChange", this);
		mSpaceApplication.Subscribe("ColumnBrowser.LoadHistory", this);
		
		//Register DOM events
		/////////////////////
		
	
		RegisterEvent(this.m_headerAddColsBtn, "click", this, "OpenClosedCols");
		
		RegisterEvent(this.m_headerOpenColsBtn, "click", this, "StartFromMinimised");
		RegisterEvent(this.m_minHeaderbreadcrumb, "click", this, "StartFromMinimised");
		
		this.HistoryStart(objectOptions.history);

	},
	
Notify: function(eventName, eventParams)
	{
		switch(eventName)
		{
			case 'mSpaceApplication.PageResize' : this.Resize(eventParams); break;
			case 'mSpaceHistory.UpdateHistory' : this.UpdateHistory(eventParams); break;
			case 'mSpaceHistory.PopHistory' : this.LoadHistory(eventParams); break;
			case 'mSpaceApplication.HistoryStart' : this.HistoryStart(eventParams); break;
			case 'mSpaceApplication.StartMinimised' : this.StartMinimised(eventParams); break;
			case 'mSpaceApplication.Start' : this.Start(eventParams); break;
			case 'Column.StartDrag' : this.StartDrag(eventParams); break;
			case 'Column.StopDrag' : this.StopDrag(eventParams); break;	
			case 'Column.Drag' : this.Drag(eventParams); break;	
			case 'Column.DragOpen' : this.DragOpen(eventParams); break;	
			case 'Column.MoveLeft' : this.ColumnMoveLeft(eventParams); break;	
			case 'Column.MoveRight' : this.ColumnMoveRight(eventParams); break;	
			case 'Column.Close' : this.ColumnClose(eventParams); break;	
			case 'Column.Open' : this.ColumnOpen(eventParams); break;	
			case 'Column.InitialLoad' : this.ColumnLoad(eventParams); break;	
			case 'Column.SelectItem' : this.SelectItem(eventParams); break;
			case 'Column.SelectItemWithSlice' : this.SelectItemWithSlice(eventParams); break;
			case 'Column.UnSelectItem' : this.UnSelectItem(eventParams); break;
			case 'Column.UnSelectAll' : this.UnSelectAll(eventParams); break;
			case 'ColumnBrowser.ClearSelections' : this.ClearColumnSelections(eventParams); break;
			case 'ColumnBrowser.QueueColumn' : this.QueueColumn(eventParams); break;
			case 'ColumnBrowser.SendSlice' : this.SendSlice(eventParams); break;			
			case 'List.Scroll' : this.ShowListScrollPopup(eventParams); break;	
			case 'Item.MouseClick' : this.ExternalItemClick(eventParams); break;
			case 'List.LoadPartialItems' : this.LoadPartialColumnData(eventParams); break;
			case 'mSpaceHistory.HistoryChange' : this.HistoryChange(eventParams); break;
			case 'ColumnBrowser.LoadHistory' : this.LoadFromHistory(eventParams); break;
			default: break;
		}
	},	
	
Resize: function(isAnimating)
	{
		
		//alert(this.m_columnBrowserHeader.clientWidth);
	
		
			//this.m_columnBrowserHeader.style.width = this.m_controlSurface.clientWidth +  "px";
			
			//resize the column holder div
			//var closedColsWidth = (this.m_columnBrowserHeader.clientWidth - (this.m_headerText.offsetWidth + this.m_openCloseBtn.offsetWidth + this.m_reloadBtn.offsetWidth)) - 1;
			//this.m_closedColumnsBar.style.width = closedColsWidth + "px";	
			
			//this.m_closedColumnControl.Resize(closedColsWidth);
			
			if (isAnimating)
				return;
		
			//Ie needs a refresh of the column container size, so that it
			//displays stuff properly during animation
			/*if (true)//browserDetails[0]=="msie")
			{
				if (this.m_isClosed)
				{
					this.m_controlSurface.style.height = this.m_closedHeight + "em";
					this.m_columnContainer.style.height =  "0px";
					this.m_columnContainer.style.display = "none";			
				}
				else
				{
					this.m_controlSurface.style.height = this.m_openHeight + "em";
					this.m_columnContainer.style.height = (this.m_controlSurface.offsetHeight-this.m_columnBrowserHeader.offsetHeight) + "px";
					this.m_columnContainer.style.display = "block";
				}
			}	*/	
	
	
		this.m_columnContainer.style.height = (this.m_controlSurface.clientHeight - this.m_columnBrowserHeader.offsetHeight) + "px";
	
			
	
			if (this.m_openColumns.length==0)
				return;

			var colLength = Math.floor((this.m_columnContainer.clientWidth-1)/this.m_openColumns.length);
			
			var totalMins = 0;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				totalMins += this.m_openColumns[i].m_minColWidth;
			}			
			
			var minWidthDifference = (this.m_columnContainer.clientWidth-1) - totalMins;
			var minWidthAddition = Math.floor(minWidthDifference/this.m_openColumns.length);
			
			if (minWidthAddition<0)
				minWidthAddition = 0;
			
			
				
			var spacerPadding = 0;
			//Getting the padding only works in ie, so this compensates for the lack of 
			//moz-box-typ.? css style
			var styleString = getStyle(this.m_dummyColumn, "padding");
			if ((styleString!="undefined") && (styleString!=""))
			{
				spacerPadding = parseInt(styleString);
				this.spacerPadding = spacerPadding;
			}			
			
			
			this.m_dummyColumn.style.width = (colLength-(spacerPadding*2)) + "px";		
			this.m_dummyColumn.style.height = (this.m_columnContainer.clientHeight) + "px";
				
				//force a resize of the col widths
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				//this.m_openColumns[i].m_controlSurface.style.width = colLength + "px";
				//this.m_openColumns[i].m_controlSurface.style.height = this.m_columnHolder.offsetHeight + "px";
				this.m_openColumns[i].Resize(minWidthAddition, (this.m_columnContainer.clientHeight));
			}					
			this.m_columnHolder.style.width = (this.m_openColumns.length * colLength) + "px";
				
				
			var totalWidth = 0;
			for (var i=0;i<this.m_columnHolder.childNodes.length;i++)
			{
				var childNode = this.m_columnHolder.childNodes[i];
				totalWidth += childNode.offsetWidth;
			}
			

			
			
			
				
			this.m_columnHolder.style.width = totalWidth + "px";
			
			
			var scrollBarH = 0;
			if ((this.m_columnHolder.offsetWidth)>this.m_columnContainer.offsetWidth)
			{
				scrollBarH = 0;
			}
			this.m_columnHolder.style.height = (this.m_columnContainer.clientHeight-scrollBarH) + "px";			
			
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				//this.m_openColumns[i].m_controlSurface.style.width = colLength + "px";
				//this.m_openColumns[i].m_controlSurface.style.height = this.m_columnHolder.offsetHeight + "px";
				this.m_openColumns[i].Resize(minWidthAddition, (this.m_columnContainer.clientHeight-scrollBarH-(spacerPadding*2)));
			}		
			
			

			
			if ((browserDetails[0]!="msie"))
			{
				//Fix for Mozilla that refreshes the scroll bars on resize
				//as they stay persistant when resizing the window and 
				//NOTE: Causes overflow problem on ie though
				this.m_columnContainer.style.overflow = "hidden";
				this.m_columnContainer.style.overflow = "auto";
				this.m_columnContainer.style.overflowX = "auto";
				this.m_columnContainer.style.overflowY = "hidden";
			}
			
			//alert(this.m_controlSurface.offsetParent.clientWidth + "  " + this.m_controlSurface.offsetParent.offsetWidth);
			//this.m_controlSurface.style.width = this.m_controlSurface.offsetParent.clientWidth + "px";
			

			
			//this.m_columnContainer.style.width = this.m_controlSurface.clientWidth + "px";
			
	},
	
	
HistoryStart: function(histObj)
	{
		if (histObj)
		{		
			if (histObj["Column.SelectItemHistory"])
			{
				this.m_renderSurface = document.getElementById(this.m_renderSurfaceId);
				this.m_renderSurface.innerHTML = "";
				this.m_renderSurface.appendChild(this.m_controlSurface);		
				
		
				var cc_renderSurface = document.getElementById(this.m_closedColumnsRenderSurfaceId);
				this.m_closedColumnControl = new ClosedColumnBrowser({ renderSurface: cc_renderSurface });
		
				this.LoadColumns(histObj);

				mSpaceApplication.Resize(false);
				
				this.m_isStarted = true;
				this.m_acceptingInput = true;				
			}	
	
		}
		
	},

Start: function(histObj)
	{
		
		//The mSpace application is starting, so add the column browser to the page
		
		this.m_renderSurface = document.getElementById(this.m_renderSurfaceId);
		this.m_renderSurface.innerHTML = "";
		this.m_renderSurface.appendChild(this.m_controlSurface);		
		

		var cc_renderSurface = document.getElementById(this.m_closedColumnsRenderSurfaceId);
		this.m_closedColumnControl = new ClosedColumnBrowser({ renderSurface: cc_renderSurface });		
		
		if (histObj)
		{
			if (histObj['url'])
			{
				mSpaceApplication.FireEvent("InformationControl.SetUrl", histObj['url']);
			}				
			else if (histObj['initurl'] && (!window.mSpaceInformationControl.m_beenUsed))
			{
				mSpaceApplication.FireEvent("InformationControl.SetUrl", histObj['initurl']);
			}			
			
			
		}
		
		
		this.LoadColumns();
		mSpaceApplication.Resize(false);
		
		this.m_isStarted = true;
		this.m_acceptingInput = true;
	},
	
StartMinimised: function()
	{
		this.m_renderSurface = document.getElementById(this.m_renderSurfaceId);
		this.m_renderSurface.innerHTML = "";
		this.m_renderSurface.appendChild(this.m_minimisedControlSurface);
		
		this.m_acceptingInput = false;
		
		
	},
	
StartFromMinimised: function(e, element)
	{
		if (this.m_minimisedHistoryHash!=null)
		{
			this.Start(this.m_minimisedHistoryHash);
		}
		else
		{
			this.Start();
		}
	},
	
AddColumn: function(eventParams, display, position)
	{
			
			var c = new Column(eventParams);
			
			
			
			this.m_allColumns.push(c);
			if (display)
			{
				c.ShowContents(true);
				
				this.m_openColumns.push(c);	
				this.m_defaultSlice.push(c);
				this.m_columnHolder.appendChild(c.m_controlSurface);
			}
			else
			{
				this.m_closedColumnControl.AddColumn(c);
			}
			
			var colLength = (this.m_columnContainer.offsetWidth-1)/this.m_openColumns.length;
			if (colLength<this.m_minColumnWidth)
				colLength = this.m_minColumnWidth;
			
			this.m_columnHolder.style.width = (colLength*this.m_openColumns.length) + "px";
			
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				this.m_openColumns[i].m_controlSurface.style.width = colLength + "px";
			}			
	},

MouseClick: function(e, element)
	{
		if (element==this.m_columnBrowserHeader)
		{
			if (this.m_isClosed)
			{
				if(HelpOn!= null && HelpOn)
				{
						return;
				}
		
				this.m_currentHeight = this.m_closedHeight;
				this.m_nextIsClosed = false;
				this.StartAnimation();
			}
		}
		else if (element==this.m_openCloseBtn)
		{
			if (!this.m_isClosed)
			{
				this.m_currentHeight = this.m_openHeight;
				this.m_nextIsClosed = true;
				this.StartAnimation();				
			}
		}
		else if (element==this.m_reloadBtn)
		{
			if(HelpOn!= null && HelpOn)
			{
					return;
			}
				
			this.ClearAllColumnSelections();
		}
	},

MouseOver: function(e, element)
	{
		mSpaceApplication.FireEvent("Cursor.Change", "pointer");
		var thisObj = this;
		var xPos = mousePosX(e) + 10;
		var yPos = mousePosY(e) - 10;

		if(element==this.m_openCloseBtn)
		{
			this.m_tooltipTimeout = setTimeout(function() {mSpaceApplication.FireEvent("Tooltip.Show", {sender: thisObj, x: xPos, y: yPos, message: 'Open/Close the Column Browser'}); }, TooltipTimeout);
		}
		else if(element==this.m_reloadBtn)
		{
			if(HelpOn)
			{
				mSpaceApplication.FireEvent("Help.ShowHighlight", {element: element, name: "ColumnBrowser.Reload"});
			}
			this.m_tooltipTimeout = setTimeout(function() {mSpaceApplication.FireEvent("Tooltip.Show", {sender: thisObj, x: xPos, y: yPos, message: 'Reset the Column Browser'}); }, TooltipTimeout);
		}
		else if(element==this.m_columnBrowserHeader)
		{
			if(HelpOn && this.m_isClosed)
			{
				mSpaceApplication.FireEvent("Help.ShowHighlight", {element: element, name: "ColumnBrowser.Closed"});
			}
		}
	},

MouseOut: function(e, element)
	{
		if (this.m_tooltipTimeout!=-1)
			clearTimeout(this.m_tooltipTimeout);

		mSpaceApplication.FireEvent("Cursor.Reset");
		mSpaceApplication.FireEvent("Tooltip.Hide", {sender: this});
	},
	
StartAnimation: function()
	{
		this.m_isAnimating = true;
		var thisObj = this;
		this.m_columnContainer.style.display = "none";
		this.m_animateTimeout = window.setInterval(function() { thisObj.Animate(); }, 25);
	},
	
Animate: function()
	{
		var targetHeight = this.m_openHeight;
		if (this.m_nextIsClosed)
			targetHeight = this.m_closedHeight;
		var currentHeight =  this.m_currentHeight;
		
		
		var heightChange = ((targetHeight-currentHeight) * 0.15);
		var newHeight =  currentHeight + Math.ceil(((targetHeight-currentHeight) * 0.15));
		if (heightChange<0)
		{
			newHeight =  currentHeight + Math.floor(((targetHeight-currentHeight) * 0.15));
		}
		this.m_currentHeight = newHeight;
		if (Math.abs(newHeight-targetHeight)<1)
		{
			if (this.m_animateTimeout!=-0.1)
			{
				clearInterval(this.m_animateTimeout);
			}			
			this.FinishAnimation();
		}
		else
		{
			this.m_controlSurface.style.height = newHeight + "em";
			this.m_columnContainer.style.height = (this.m_controlSurface.clientHeight-this.m_columnBrowserHeader.offsetHeight) + "px";
			this.Resize(true);
		}
		
	},
	
FinishAnimation: function()
	{
		this.m_columnContainer.style.display = "";
		this.m_isAnimating = false;
		this.m_animateTimeout = -1;
		this.m_isClosed = this.m_nextIsClosed;
		this.UpdateStatus();
	},
	
UpdateStatus: function(initialUpdate)
	{		
		if (!initialUpdate)
			mSpaceApplication.Resize(false);
		
		
		if ((!this.m_columnsLoaded) && (!this.m_isClosed))
		{
			
			//this.LoadColumns();
			mSpaceApplication.Resize(false);
		}
	},
	
StartDrag: function(column)
	{
			//resize the dummy column to same as current.
			this.m_dummyColumn.style.width = (column.m_currentWidth-(this.spacerPadding*2)) + "px";		
			this.m_dummyColumn.style.height = (this.m_columnContainer.clientHeight) + "px";
			
		this.m_columnHolder.insertBefore(this.m_dummyColumn, column.m_controlSurface);
		this.m_columnHolder.removeChild(column.m_controlSurface);
		document.body.appendChild(column.m_controlSurface);
		column.m_controlSurface.style.position = "absolute";		
		
	},

StopDrag: function(column)
	{
		document.body.removeChild(column.m_controlSurface);
		this.m_columnHolder.insertBefore(column.m_controlSurface, this.m_dummyColumn.nextSibling);
		this.m_columnHolder.removeChild(this.m_dummyColumn);
		column.m_controlSurface.style.position = "static";
		
		if (window.g_prePopulate==false)
		{
			var colFound = false;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				var currentCol = this.m_openColumns[i];
				if (column!=currentCol)
				{
					if (colFound)
					{
						currentCol.ClearSelections();
					}
				}
				else
				{
					colFound = true;
				}
			}		
		}
		
		if (window.g_prePopulate==false)
		{
			var lastColSelection = -1;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				var col = this.m_openColumns[i];
				var selLength = 0;
				for (key in col.GetSelectedItems())
				{
					selLength += 1;
					break;
				}
				if (selLength>0)
				{
					col.ShowContents(true);
					lastColSelection = i;
				}
			}
			
			if ((lastColSelection+1)<this.m_openColumns.length)
			{
				this.m_colToUpdate = this.m_openColumns[(lastColSelection+1)];
			}
			
			for (var i=(lastColSelection+1);i<this.m_openColumns.length;i++)
			{
				
				var col = this.m_openColumns[i];
				col.ShowContents(false);
			}
			
		}			
		
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Drag] " + column.m_Label });
		

		this.UpdateColumns({ column: column });
		
		
		
		

	},
	
Drag: function(column)
	{
		if (!column.m_isDragging)
			return;
			
		var colXPos = column.m_controlSurface.offsetLeft ;
		var colToInsertBefore = null;
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column!=currentCol)
			{
				var currentColXPos = findPosX(currentCol.m_controlSurface);
				var currentColWidth = currentCol.m_controlSurface.offsetWidth;
				
				if (colXPos<(currentColXPos+(currentColWidth/2) - this.m_columnContainer.scrollLeft))
				{
					colToInsertBefore = currentCol;
					break;
				}
			}
			
		}
		
		var newArray = new Array();
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column!=currentCol)
			{
				if (currentCol==colToInsertBefore)
				{
					newArray.push(column);
				}
				newArray.push(currentCol);
			}
		}
		
		this.m_openColumns = newArray;
		
		if (colToInsertBefore!=null)
		{
			this.m_columnHolder.removeChild(this.m_dummyColumn);
			this.m_columnHolder.insertBefore(this.m_dummyColumn, colToInsertBefore.m_controlSurface);
		}
		else
		{
			this.m_openColumns.push(column);
			this.m_columnHolder.removeChild(this.m_dummyColumn);
			this.m_columnHolder.appendChild(this.m_dummyColumn);
		}
	},
	
ColumnMoveLeft: function(column)
	{		
		var colToInsertBefore = null;
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column==currentCol)
			{
				if (i>0)
				{
					colToInsertBefore = this.m_openColumns[i-1];
					break;
				}
				else
				{
					return;
				}
			}
			
		}
		
		var newArray = new Array();
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column!=currentCol)
			{
				if (currentCol==colToInsertBefore)
				{
					newArray.push(column);
				}
				newArray.push(currentCol);
			}
		}
		this.m_openColumns = newArray;
	
		this.m_columnHolder.removeChild(column.m_controlSurface);
		this.m_columnHolder.insertBefore(column.m_controlSurface, colToInsertBefore.m_controlSurface);
		
		if (window.g_prePopulate==false)
		{
			var colFound = false;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				var c = this.m_openColumns[i];
				if (colFound)
				{
					c.ShowContents(false);					
				}
				if (c==column)
				{
					colFound = true;
					this.m_colToUpdate = c;	
				}
			}			
		}		
		
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Move Left] " + column.m_Label });
		
		this.UpdateColumns({ column: column } );
		
	},
	
ColumnMoveRight: function(column)
	{
		var colToInsertAfter = null;
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column==currentCol)
			{
				if (i<(this.m_openColumns.length-1))
				{
					colToInsertAfter = this.m_openColumns[i+1];
					break;
				}
				else
				{
					return;
				}
			}
			
		}
		
		var newArray = new Array();
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column!=currentCol)
			{
				newArray.push(currentCol);
				if (currentCol==colToInsertAfter)
				{
					newArray.push(column);
				}
			}
		}
		
		this.m_openColumns = newArray;
	
		this.m_columnHolder.removeChild(colToInsertAfter.m_controlSurface);
		this.m_columnHolder.insertBefore(colToInsertAfter.m_controlSurface, column.m_controlSurface);	
		
		if (window.g_prePopulate==false)
		{
			var colFound = false;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				var c = this.m_openColumns[i];
				if (colFound)
				{
					c.ShowContents(false);
				}
				if (c==colToInsertAfter)
				{
					colFound = true;
					this.m_colToUpdate = c;	
				}
			}			
		}		
		
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Move Right] " + column.m_Label });
		
		this.UpdateColumns({ column: column } );
	},
	
ColumnClose: function(column)
	{
		var newArray = new Array();
		
		var colFound = false;
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var currentCol = this.m_openColumns[i];
			if (column!=currentCol)
			{
				newArray.push(currentCol);
				if ((window.g_prePopulate==false) && colFound)
				{
					currentCol.ClearSelections();
				}
			}
			else
			{
				colFound = true;
			}
		}
		
		this.m_openColumns = newArray;	
		
		this.m_columnHolder.removeChild(column.m_controlSurface);

		mSpaceApplication.FireEvent("Column.SetClosed", column);
		
		this.m_closedColumnControl.AddColumn(column);
		
		mSpaceApplication.Resize(false);
		
		
		
		if (window.g_prePopulate==false)
		{
			var lastColSelection = -1;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				var col = this.m_openColumns[i];
				var selLength = 0;
				for (key in col.GetSelectedItems())
				{
					selLength += 1;
					break;
				}
				if (selLength>0)
				{
					col.ShowContents(true);
					lastColSelection = i;
				}
			}
			
			if ((lastColSelection+1)<this.m_openColumns.length)
			{
				this.m_colToUpdate = this.m_openColumns[(lastColSelection+1)];
			}
			
			for (var i=(lastColSelection+1);i<this.m_openColumns.length;i++)
			{
				
				var col = this.m_openColumns[i];
				col.ShowContents(false);
			}
			
		}
		
		
		
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Close] " + column.m_Label });
		
		this.UpdateColumns();
		
	},	
	
ColumnOpen: function(column)
	{
		
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Open] " + column.m_Label });
		
		if (window.g_prePopulate==true)
		{
			column.ShowContents(true);
		}		

		mSpaceApplication.FireEvent("Column.SetOpen", {m_Uri: column});
		
		this.m_openColumns.push(column);
		
		if (window.g_prePopulate==false)
		{
			var lastColSelection = 0;
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				var col = this.m_openColumns[i];
				var selLength = 0;
				for (key in col.GetSelectedItems())
				{
					selLength += 1;
					break;
				}
				if (selLength>0)
				{
					col.ShowContents(true);
					lastColSelection = i;
				}
			}
			
			if ((lastColSelection+1)<this.m_openColumns.length)
			{
				this.m_colToUpdate = this.m_openColumns[(lastColSelection+1)];
			}
			
			for (var i=(lastColSelection+1);i<this.m_openColumns.length;i++)
			{
				
				var col = this.m_openColumns[i];
				col.ShowContents(false);
			}
			
		}		
		
		if (window.g_columnLoadAnimate)
		{
			column.m_controlSurface.style.visibility = "hidden";
		}
		this.m_columnHolder.appendChild(column.m_controlSurface);
		
			
	
		mSpaceApplication.Resize(false);
		
		if (window.g_columnLoadAnimate)
		{
			this.OpenAnimateColumn((this.m_openColumns.length-1));
		}		
		

		this.UpdateColumns({ column: column } );
		
		
	},	
	
DragOpen: function(column)
	{
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Open] " + column.m_Label });
		
		if (window.g_prePopulate==true)
		{
			column.ShowContents(true);
		}		
		
		this.m_openColumns.push(column);
		
		mSpaceApplication.FireEvent("Column.SetOpen", {m_Uri: column.m_Uri});
		
		if (window.g_columnLoadAnimate)
		{
			column.m_controlSurface.style.visibility = "hidden";
		}
		this.m_columnHolder.appendChild(column.m_controlSurface);
		
		mSpaceApplication.Resize(false);
		
		this.m_closedColumnControl.RemoveBtn(column);
	},
	
ColumnLoad: function(column)
	{
		this.UpdateColumns({ column: column } );
	},
	
UpdateColumns: function(eventParams)
	{		
			this.QueryServer(eventParams);
	},
	
	
QueryServer: function(eventParams)
	{
		
			var getColumnsUrl = window.mSpaceApplication.GetServerUrl("slicegetitems");
			
			if ((eventParams) && (eventParams.column))
			{
				getColumnsUrl += "&columnclicked=" + URLEncode(eventParams.column.m_Uri);
			}
			
			if ((eventParams) && (eventParams.listitem))
			{
				getColumnsUrl += "&itemclicked=" + URLEncode(eventParams.listitem.uri);
			}	
			
			if ((eventParams) && (eventParams.sliceString))
			{
				getColumnsUrl += eventParams.sliceString;
			}	
			else
			{			
				getColumnsUrl += this.GetColumnParamString();			
			}
			
			getColumnsUrl += this.GetColumnFilterParamString();
			
			if (this.m_columnHistoryUrl!=getColumnsUrl)
			{
				this.LoadColumnsFromUrl(getColumnsUrl);
			}
		
		
		
		//this.LoadColumnContentsData();
	},
	
LoadColumnsFromUrl: function(getColumnsUrl)
	{
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				this.m_openColumns[i].SetLoading(true);
			}		
			
			
			//prompt("",getColumnsUrl);
			mSpaceApplication.FireEvent("Log.Event", { type: "DataEvent", message: "[Load URL] " + getColumnsUrl });
			 
			var thisObj = this;

			// BUG FIX IN FIREFOX FOR 'NS_ERROR_NOT_INITIALIZED' ERROR
			// IE7 also needs to have its XMLHttpRequest object reset for each request
			if((browserDetails[0]=="msie") && (browserDetails[1]=="7.0") || XMLRequestBusy_ColumnBrowser && thisObj.m_xmlRequest.readyState != 4 && thisObj.m_xmlRequest.readyState != 0)
			{
				this.m_xmlRequest.onreadystatechange = function () {}; // Must clear the handler otherwise a status 4 is called which makes the script think it has made a successful call
				this.m_xmlRequest.abort();
				this.m_xmlRequest = new XMLHttpRequest();
			}

			// Use the onload function if the browser is anything other than ie <7.0.  Fixes problems on some firefox and mozilla
			// versions
			if ((browserDetails[0]=="msie") )//&& (browserDetails[1]!="7.0"))
			{
				this.m_xmlRequest.onreadystatechange = function() {
					try {
						if(thisObj.m_xmlRequest.readyState == 4 && (thisObj.m_xmlRequest.status == 200 || thisObj.m_xmlRequest.status == 304)) {
							//#################
							//RESULTS
							//#################
							XMLRequestBusy_ColumnBrowser = false;
							thisObj.LoadColumnContentsData(thisObj.m_xmlRequest.responseText);
						}
					}catch (e){
						thisObj.m_columnContent.innerHTML = "Error Loading Columns: " + e;
						throw(e);
					}			  
				};
			}else{
				this.m_xmlRequest.onload = function() {
					try {
						//#################
						//RESULTS
						//#################
						XMLRequestBusy_ColumnBrowser = false;
						thisObj.LoadColumnContentsData(thisObj.m_xmlRequest.responseText);
					}
					catch (e)
					{
						//thisObj.m_columnContent.innerHTML = "Error Loading Columns: " + e;
						throw(e);
					}				  
				};			
			}

			if ((browserDetails[0]=="msie") && (browserDetails[1]!="7.0"))
			{
				window.setTimeout( function()
											{
												thisObj.m_xmlRequest.open('GET', getColumnsUrl);
												XMLRequestBusy_ColumnBrowser = true;
												thisObj.m_xmlRequest.send(null);
											}
									,500);
			}
			else
			{
				this.m_xmlRequest.open('GET', getColumnsUrl);
				XMLRequestBusy_ColumnBrowser = true;
				this.m_xmlRequest.send(null);			
			}			
	},
	
LoadColumnContentsData: function(resultText)
	{
		
		var columnDetails = new Array();
		try
		{
			eval ("columnDetails = " + resultText);
		}
		catch (e)
		{
			alert(e);
		}
		
		for (var i = 0;i<columnDetails.length;i++)
		{
			var colNewDataObject = columnDetails[i];
			if (colNewDataObject.Uri)
			{
				var colObject = this.GetColumn(colNewDataObject.Uri);
				if (colObject!=null)
				{
					colObject.UpdateColumnData(colNewDataObject, (!this.firstDataLoad));
				}
			}
		}
		
		
		this.m_historyString = this.GetColumnParamString();
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			this.m_openColumns[i].SetLoading(false);
		}			
		
		mSpaceApplication.FireEvent("ColumnBrowser.ColumnChange", this.m_openColumns);
		
		
		this.m_headerbreadcrumb.innerHTML = "";
		
		this.m_headerbreadcrumb.appendChild(this.GetSliceString());
		
		if (!this.firstDataLoad)
		{
			this.firstDataLoad = true;
		}
	},
	
UpdateColumnHistory: function()
	{
		var newHistoryArray = new Array();
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			newHistoryArray.push(this.m_openColumns[i].GetHistoryObject())
		}
		
		this.m_historyArray = newHistoryArray;
		//alert("1");
		this.m_historyString = ObjectToString(this.m_historyArray);
		
		
	},
	
UpdateInitialColumnHistory: function()
	{
		var newHistoryArray = new Array();
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			newHistoryArray.push(this.m_openColumns[i].GetHistoryObject())
		}
			
		this.m_initialHistory = newHistoryArray;
		
		this.m_historyString = ObjectToString(this.m_initialHistory);
	},	
	
LoadHistory: function(historyStack)
	{
		if (historyStack['ColumnBrowser.History'])
		{
			
			var historyString = historyStack['ColumnBrowser.History'];
			//alert("2");
			if (historyString!=ObjectToString(this.m_historyArray))
			{
				this.ClearColumns();
				var historyArray = new Array();
				eval("historyArray = " + historyString + ";");
				for (var i=0; i<historyArray.length;i++)
				{
					var columnDetails = historyArray[i];
					
					var column = this.GetColumn(columnDetails.uri);
					column.ReplaceItems(columnDetails);
					
					this.m_closedColumnControl.RemoveColumn(column);
					
					column.ShowContents(true);
					
					this.m_openColumns.push(column);
					this.m_columnHolder.appendChild(column.m_controlSurface);
		
					
					
				}
				
				mSpaceApplication.Resize(false);
				
				var newHistoryArray = new Array();
				for (var i=0;i<this.m_openColumns.length;i++)
				{
					newHistoryArray.push(this.m_openColumns[i].GetHistoryObject())
				}
				
				this.m_historyArray = newHistoryArray;		
				//alert("3");
				var historyString = ObjectToString(this.m_historyArray);				
				
			}
			
		}
		else
		{
			if (this.m_initialHistory)
			{
				this.ClearColumns();
				var historyArray = this.m_initialHistory;
				for (var i=0; i<historyArray.length;i++)
				{
					var columnDetails = historyArray[i];
					
					var column = this.GetColumn(columnDetails.uri);
					column.ReplaceItems(columnDetails);
					
					this.m_closedColumnControl.RemoveColumn(column);
					
					this.m_openColumns.push(column);
					
					column.ShowContents(true);
					
					this.m_columnHolder.appendChild(column.m_controlSurface);
		
					
					
				}
				
				mSpaceApplication.Resize(false);
				
				var newHistoryArray = new Array();
				for (var i=0;i<this.m_openColumns.length;i++)
				{
					newHistoryArray.push(this.m_openColumns[i].GetHistoryObject())
				}
				
				this.m_historyArray = newHistoryArray;	
				//alert("4");
				var historyString = ObjectToString(this.m_historyArray);	
			}
		}
	},
	
LoadFirstHistory: function(historyStack)
	{
		if (historyStack['ColumnBrowser.History'])
		{
			
			var historyString = historyStack['ColumnBrowser.History'];

			this.ClearColumns();
			var historyArray = new Array();
			eval("historyArray = " + historyString + ";");
			for (var i=0; i<historyArray.length;i++)
			{
				var columnDetails = historyArray[i];
				
				var column = this.GetColumn(columnDetails.uri);
				column.ReplaceItems(columnDetails);
				
				column.ShowContents(true);
				
				this.m_closedColumnControl.RemoveColumn(column);
				
				this.m_openColumns.push(column);
				column.m_controlSurface.style.visibility = "hidden";
				this.m_columnHolder.appendChild(column.m_controlSurface);	
				
	
				
				
			}
			
			mSpaceApplication.Resize(false);
			
			var newHistoryArray = new Array();
			for (var i=0;i<this.m_openColumns.length;i++)
			{
				newHistoryArray.push(this.m_openColumns[i].GetHistoryObject())
			}
			
			this.m_historyArray = newHistoryArray;		
			//alert("5");
			var historyString = ObjectToString(this.m_historyArray);				
				
			
			
		}		
	},

ClearColumns: function()
	{
		var tempArr = new Array();
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			tempArr.push(this.m_openColumns[i]);
		}
		
		for (var i=0;i<tempArr.length;i++)
		{
			var column = tempArr[i];
			
			this.m_columnHolder.removeChild(column.m_controlSurface);
			
			this.m_closedColumnControl.AddColumn(column);
			
		}
		
		this.m_openColumns = new Array();
		
	},
	
//Called when a column item is selected
SelectItem: function(eventParams)
	{
		this.UpdateColumns(eventParams);
	},
	
SelectItemWithSlice: function(eventParams)
	{
		this.UpdateColumns(eventParams);
	},

//Called whan a column item is unselected
UnSelectItem: function(eventParams)
	{
		this.UpdateColumns(eventParams);
	},

UnSelectAll: function(eventParams)
{
	for (var i=0;i<this.m_openColumns.length;i++)
	{
		var c = this.m_openColumns[i];
		if(c == eventParams.column)
		{
			this.m_colToUpdate = c;
			break;
		}
	}
	this.UpdateColumns(eventParams);
},
	
ShowListScrollPopup: function(eventParams)
	{
		if (this.m_listScrollPopupTimeout!=-1)
		{
			clearTimeout(this.m_listScrollPopupTimeout);
			this.m_listScrollPopupTimeout = -1;
		}
		
		this.m_listPositionPopup.innerHTML = eventParams.text;
		this.m_listPositionPopup.style.display = "";
		this.m_listPositionPopup.style.left = (findPosX(eventParams.list.m_listItemHolder) + (eventParams.list.m_listItemHolder.offsetWidth/2) - this.m_columnContainer.scrollLeft) + "px";
		this.m_listPositionPopup.style.top = (findPosY(eventParams.list.m_controlSurface) + (eventParams.list.m_controlSurface.offsetHeight/2) + eventParams.list.m_controlSurface.scrollTop) + "px";
		this.m_listPositionPopup.style.marginTop = -(this.m_listPositionPopup.offsetHeight/2) + "px";
		this.m_listPositionPopup.style.marginLeft = -(this.m_listPositionPopup.offsetWidth/2) + "px";
			
		
		var thisObj = this;
		this.m_listScrollPopupTimeout = setTimeout(function() { thisObj.HideListScrollPopup(); }, 1000);
	},
	
HideListScrollPopup: function()
	{
		if (this.m_listScrollPopupTimeout!=-1)
		{
			clearTimeout(this.m_listScrollPopupTimeout);
			this.m_listScrollPopupTimeout = -1;
		}		
		
		this.m_listPositionPopup.innerHTML = "";
		this.m_listPositionPopup.style.display = "none";		
	},
	
LoadColumns: function(historyObject)
	{
			if (this.m_columnsLoaded)
				return;
		
			this.m_columnsLoaded = true;
			var thisObj = this;
			
			this.m_columnContainer.innerHTML =  this.m_loadingText;

			// BUG FIX IN FIREFOX FOR 'NS_ERROR_NOT_INITIALIZED' ERROR
			if(XMLRequestBusy_ColumnBrowser && thisObj.m_xmlRequest.readyState != 4 && thisObj.m_xmlRequest.readyState != 0)
			{
				this.m_xmlRequest.onreadystatechange = function () {}; // Must clear the handler otherwise a status 4 is called which makes the script think it has made a successful call
				this.m_xmlRequest.abort();
				this.m_xmlRequest = new XMLHttpRequest();
			}
			
			var getColumnsUrl = window.mSpaceApplication.GetServerUrl("slicegetitems");

			//prompt("", getColumnsUrl);
			mSpaceApplication.FireEvent("Log.Event", { type: "DataEvent", message: "[Load URL] " + getColumnsUrl });

			// Use the onload function if the browser is anything other than ie <7.0.  Fixes problems on some firefox and mozilla
			// versions
			if ((browserDetails[0]=="msie") )//&& (browserDetails[1]!="7.0"))
			{
				this.m_xmlRequest.onreadystatechange = function() {
					if(thisObj.m_xmlRequest.readyState == 4 && (thisObj.m_xmlRequest.status == 200 || thisObj.m_xmlRequest.status == 304)) {
						//#################
						//RESULTS
						//#################
						XMLRequestBusy_ColumnBrowser = false;
						thisObj.InitialLoadColumnData(thisObj.m_xmlRequest.responseText, historyObject);
					} 
				};
			}else{
				this.m_xmlRequest.onload = function() {
					try {
						//#################
						//RESULTS
						//#################
						XMLRequestBusy_ColumnBrowser = false;
						thisObj.InitialLoadColumnData(thisObj.m_xmlRequest.responseText, historyObject);
					}
					catch (e)
					{
						thisObj.m_columnContainer.innerHTML = "Error Loading Columns: " + e;
						throw(e);
					}				  
				};			
			}
		
			
			if ((browserDetails[0]=="msie") && (browserDetails[1]!="7.0"))
			{
				window.setTimeout( function()
											{
												thisObj.m_xmlRequest.open('GET', getColumnsUrl);
												XMLRequestBusy_ColumnBrowser = true;
												thisObj.m_xmlRequest.send(null);
											}
									,500);
			}
			else
			{
				this.m_xmlRequest.open('GET', getColumnsUrl);
				XMLRequestBusy_ColumnBrowser = true;
				this.m_xmlRequest.send(null);			
			}		
	},
	
InitialLoadColumnData: function(columnDataString, historyObject)
	{
		//alert(columnDataString);
		
		var columns = new Array();
		eval("columns = " + columnDataString);
		
		this.m_columnContainer.innerHTML = "";
		this.m_columnContainer.appendChild(this.m_columnHolder);
		this.m_columnContainer.appendChild(this.m_listPositionPopup);
		
		for (var i=0; i<columns.length; i++)
		{
			if ((columns[i].ctp==0) || (columns[i].ctp==1))
			{
				this.AddColumn(columns[i], (columns[i].isDefault), i);
			}
			
		}

		// Set open columns as being open
		for(var i=0; i<this.m_openColumns.length; i++)
			mSpaceApplication.FireEvent("Column.SetOpen", this.m_openColumns[i]);
		
		if (historyObject)
		{
			this.HistoryChange(historyObject);
		}
		
		
		mSpaceApplication.Resize(false);
		
		mSpaceApplication.FireEvent("AdvancedSearch.Populate", this.m_openColumns);	
		mSpaceApplication.FireEvent("ColumnBrowser.LoadColumns", this.m_openColumns);
		

	},
	
GetColumn: function(uri)
	{
		for (var i=0;i<this.m_allColumns.length;i++)
		{
			if (this.m_allColumns[i].m_Uri==uri)
			{
				return this.m_allColumns[i];
			}
		}
		return null;
	},
	
UpdateHistory: function(historyStack)
	{
		if (historyStack['ColumnBrowser.History'])
		{
			
			var historyString = historyStack['ColumnBrowser.History'];
			
			if (historyString!=this.m_historyString)
			{
				mSpaceApplication.FireEvent("mSpaceHistory.AddHistory", { name: 'ColumnBrowser.History', history: this.m_historyString });
			}
		}
		else if (this.m_historyString!="")
		{
			mSpaceApplication.FireEvent("mSpaceHistory.AddHistory", { name: 'ColumnBrowser.History', history: this.m_historyString });
		}
	},
	
	
ClearColumnSelections: function(column)
	{
		//Loop through all the open columns, and clear selections up till the passed columns
		if (column!=null)
		{
			for (var i=0;i<this.m_allColumns.length;i++)
			{
				if (this.m_allColumns[i]!=column)
				{
					this.m_allColumns[i].ClearSelections();
				}
				else
				{
					break;
				}
			}			
		}
	},

ClearAllColumnSelections: function()
	{
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			this.m_openColumns[i].m_list.m_selectedItems = new Object();
			this.m_openColumns[i].m_list.UpdateListItems();
			this.m_openColumns[i].m_allBtn.style.display='none';

			this.m_openColumns[i].m_lastClickInSlice = false;	
		}

		mSpaceApplication.FireEvent("Column.UnSelectAll", {column: this.m_openColumns[0]});
	},
	
QueueColumn: function(eventParams)
	{
		if (!eventParams.column)
		{
			return;
		}
			
		var column = eventParams.column;
		
		column.ShowContents(true);
		
		mSpaceApplication.FireEvent("Log.Event", { type: "InteractEvent", message: "[Column Auto Open] " + column.m_Label });	
		
		var newColsArray = new Array();
		
		newColsArray.push(column);
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			newColsArray.push(this.m_openColumns[i]);
		}
		
		this.m_openColumns = newColsArray;
		
		if (this.m_openColumns.length>1)
		{
			this.m_columnHolder.insertBefore(column.m_controlSurface, this.m_openColumns[1].m_controlSurface);
		}
		else
		{
			this.m_columnHolder.appendChild(column.m_controlSurface);
		}
	
		mSpaceApplication.Resize(false);
		this.Resize(false);
	
	},
	
	
GetSliceString: function()
	{
		var returnDiv = createDiv("float", true);
		
		returnDiv.appendChild(this.m_loaddefaultSliceBtn);
		returnDiv.appendChild(this.m_resetSliceBtn);
		
		
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var col = this.m_openColumns[i];
			var colDiv = col.GetSliceString();
			
			if ((colDiv!=null))
			{
				var spacer = createDiv("float", true);
				spacer.innerHTML = " / ";
				returnDiv.appendChild(spacer);
			}
			
			returnDiv.appendChild(colDiv);
		}		
		
		return returnDiv;
	},
	
	
ExternalItemClick: function(eventParams)
	{
		if (!this.m_isStarted)
		{
			this.m_intialEventCall = "Item.MouseClick";
			this.m_intialEventParams = eventParams;
			
			if (this.m_acceptingInput)
			{
				this.Start();
			}
		}
	},
	
OpenClosedCols: function()
	{
		if (this.m_closedColumnControl!=null)
		{
				this.m_closedColumnControl.Open();
		}
	},
	
AcceptingInput: function()
	{
		return this.m_acceptingInput;
	},
	
LoadPartialColumnData: function(eventParams)
	{
			if (!this.m_columnsLoaded)
				return;
		
			var thisObj = this;
			
			if (eventParams.col)
			{
				eventParams.col.SetLoading(true, true);
			}
			

			// BUG FIX IN FIREFOX FOR 'NS_ERROR_NOT_INITIALIZED' ERROR
			if((browserDetails[0]=="msie") && (browserDetails[1]=="7.0") || XMLRequestBusy_ColumnBrowser && thisObj.m_xmlRequest.readyState != 4 && thisObj.m_xmlRequest.readyState != 0)
			{
				this.m_xmlRequest.onreadystatechange = function () {}; // Must clear the handler otherwise a status 4 is called which makes the script think it has made a successful call
				this.m_xmlRequest.abort();
				this.m_xmlRequest = new XMLHttpRequest();
			}
			
			var start = eventParams.start - 50;
			if (start<0)
			{
				start = 0;
			}
			var getColumnsUrl = window.mSpaceApplication.GetServerUrl("slicegetitems") + "columnrestrict=" + URLEncode(eventParams.col.m_Uri) + "&start=" + start + "&itemscount=100" ;
			
			getColumnsUrl += this.GetColumnParamString();
			
			//get the filter text for the partial column update in case
			//this is a server side text filter request
			getColumnsUrl += eventParams.col.GetFilterUrlText();

			//prompt("", getColumnsUrl);
			mSpaceApplication.FireEvent("Log.Event", { type: "DataEvent", message: "[Load URL] " + getColumnsUrl });

			// Use the onload function if the browser is anything other than ie <7.0.  Fixes problems on some firefox and mozilla
			// versions
			if ((browserDetails[0]=="msie") )//&& (browserDetails[1]!="7.0"))
			{
				this.m_xmlRequest.onreadystatechange = function() {
					var a=0;
					if(thisObj.m_xmlRequest.readyState == 4 && (thisObj.m_xmlRequest.status == 200 || thisObj.m_xmlRequest.status == 304)) {
						//#################
						//RESULTS
						//#################
						XMLRequestBusy_ColumnBrowser = false;
						thisObj.PartialColumnDataResults(thisObj.m_xmlRequest.responseText, eventParams.clear);
					} 
				};
			}else{
				this.m_xmlRequest.onload = function() {
					try {
						//#################
						//RESULTS
						//#################
						XMLRequestBusy_ColumnBrowser = false;
						thisObj.PartialColumnDataResults(thisObj.m_xmlRequest.responseText, eventParams.clear);
					}
					catch (e)
					{
						thisObj.m_columnContainer.innerHTML = "Error Loading Columns: " + e;
						throw(e);
					}				  
				};			
			}
		
			
			if ((browserDetails[0]=="msie") && (browserDetails[1]!="7.0"))
			{
				window.setTimeout( function()
											{
												thisObj.m_xmlRequest.open('GET', getColumnsUrl);
												XMLRequestBusy_ColumnBrowser = true;
												thisObj.m_xmlRequest.send(null);
											}
									,500);
			}
			else
			{
				this.m_xmlRequest.open('GET', getColumnsUrl);
				XMLRequestBusy_ColumnBrowser = true;
				this.m_xmlRequest.send(null);			
			}		
	},
	
PartialColumnDataResults: function(columnDataString, clear)
	{
		//alert(columnDataString);
		
		var columns = new Array();
		eval("columns = " + columnDataString);
		
		for (var i=0; i<columns.length; i++)
		{
			var col = this.GetColumn(columns[i].Uri);
			if (col!=null)
			{
				col.SetLoading(false, false);
				col.LoadVisibleListItems(columns[i], clear);
			}
		}
		

	},
	
GetColumnParamString: function()
	{
		var retString = "";
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var col = this.m_openColumns[i];
			
			var colStr = "&col[]=col:" + URLEncode(col.m_Uri);
			
			var selArr = col.GetSelectedItems();
			
			var count = 0;
			for (var li in selArr)
			{
				if (selArr[li].uri)
				{
					retString += colStr + "&col[]=val:" + URLEncode(selArr[li].uri);
					count ++;					
				}
			}
			
			if (count==0)
			{
				retString += colStr + "&col[]=val:";
			}
		}		
		return retString;
	},
	
GetColumnFilterParamString: function()
	{
		var retString = "";
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var col = this.m_openColumns[i];
			retString += col.GetFilterUrlText();
		}		
		return retString;
	},	
	
	
	
HistoryChange: function(histObj)
	{
		if (histObj["Column.SelectItemHistory"])
		{
			var historyUrl = histObj["Column.SelectItemHistory"];
			mSpaceApplication.FireEvent("Log.Event", { type: "DataEvent", message: "[columns_load_history] " + historyUrl});
			this.LoadFromHistory(historyUrl);
		}		
	},
	
LoadFromHistory: function(historyUrl)
	{		
		this.LoadColumnsFromUrl(window.mSpaceApplication.GetServerUrl("slicegetitems") + "&" + historyUrl);		
	},
	
LoadColumnsInBackground: function()
	{
		if (this.columnsLoaded)
			return;
			
		var getColumnsUrl = window.mSpaceApplication.GetServerUrl("slicegetitems") + "&itemscount=-1";
		
		mSpaceApplication.FireEvent("DataController.Request", { 'sender' : this, 'id' : 'loadcolsbg', 'type' : "GET",'url' : getColumnsUrl })
			
	},
	
HandleResponse: function(id, data)
	{
		if (id=='loadcolsbg')
		{
			this.columnsLoaded = true;
			
			var columns = new Array();
			columns = eval(data);
		
		
			/*for (var i=0; i<columns.length; i++)
			{
				this.AddColumn(columns[i], (columns[i].isDefault), i);
			}*/
			
			mSpaceApplication.FireEvent("ColumnBrowser.ColumnsLoaded", columns);
			
		}
	},
	
ResetSlice: function()
	{
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var c = this.m_openColumns[i];
			c.Reset();
			
			
		}
		
		this.UpdateColumns();
	},


LoadDefaultSlice: function()
	{
		for (var i=0;i<this.m_openColumns.length;i++)
		{
			var c = this.m_openColumns[i];
			c.Reset();
			
			this.m_closedColumnControl.AddColumn(c);
			
			this.m_columnHolder.removeChild(c.m_controlSurface);
			
			c.SetClosed(c.m_Uri);
			
		}
		
		this.m_openColumns = new Array();
		
		for (var i=0;i<this.m_defaultSlice.length;i++)
		{
			var c = this.m_defaultSlice[i];			
			c.Reset();
			
			this.m_closedColumnControl.RemoveColumn(c);
			
			this.m_openColumns.push(c);
			this.m_columnHolder.appendChild(c.m_controlSurface);		
			
			c.SetOpen(c.m_Uri);
			
		}		

		mSpaceApplication.Resize(false);
		
		
		this.UpdateColumns();
	}
	
	
}











































var ClosedColumnBrowser = Class.create();
ClosedColumnBrowser.prototype = {

//local variables
m_renderSurface: null,
m_closedColumns: new Array(),
m_controlSurface: null,
m_buttonHolder: null,
m_scrollOverflow: 0,
m_lastSurfaceWidth:0,
m_closedColumnTitle: "Drag new columns into slice",

//
// Constructor
initialize: function(objectOptions)
	{
		ParseOptions(objectOptions, this);
		
		if (this.m_renderSurface!=null)
		{
		
			this.m_controlSurface = createDiv("ClosedColumnsSurface");		
			this.m_controlSurface.style.display = "none";
			this.m_renderSurface.appendChild(this.m_controlSurface);
			
			this.m_containerDiv = createDiv("container", true);
			this.m_controlSurface.appendChild(this.m_containerDiv);
		
			
			
			this.m_titleDiv = createDiv("title", true);
			this.m_containerDiv.appendChild(this.m_titleDiv);
			
			this.m_titleTextDiv = createDiv("titleText", true);
			this.m_titleTextDiv.innerHTML = this.m_closedColumnTitle;
						
			this.m_titleDiv.appendChild(this.m_titleTextDiv);
			
			
			this.m_closeBtn = createDiv("closeBtn", true);
			this.m_closeBtn.title = "Click to close the available columns panel";
			this.m_titleDiv.appendChild(this.m_closeBtn);			
			
			
			
			RegisterEvent(this.m_closeBtn, "click", this, "Close");
			
			
			
			
		}
	},
	
AddColumn: function(column)
	{
		
		for (var i=0;i<this.m_closedColumns.length;i++)
		{
			var colObj = this.m_closedColumns[i];
			if (column==colObj.column)
			{
				return;
			}
		}
		
		var tempDiv = createDiv("closedColumnBtn", true);
		
		var leftSide = createDiv("ccbtn_leftSide", true);
		var tl = createDiv("ccbtn_tl", true);
		leftSide.appendChild(tl);
		var bl = createDiv("ccbtn_bl", true);
		leftSide.appendChild(bl);
		
		tempDiv.appendChild(leftSide);
		
		var textCont = createDiv("ccbtn_label", true);
		textCont.innerHTML = column.m_Label;
		tempDiv.appendChild(textCont);
		
		var rightSide = createDiv("ccbtn_rightSide", true);
		var tr = createDiv("ccbtn_tr", true);
		rightSide.appendChild(tr);
		var br = createDiv("ccbtn_br", true);	
		rightSide.appendChild(br);
		
		tempDiv.appendChild(rightSide);
		
		
		
		

		
		this.m_containerDiv.appendChild(tempDiv);
		
		
		RegisterEvent(tempDiv, "click", this, "MouseClick");
		RegisterEvent(tempDiv, "mousedown", this, "MouseDown");
		RegisterEvent(tempDiv, "mouseover", this, "MouseOver");
		RegisterEvent(tempDiv, "mouseout", this, "MouseOut");
		
		var colObj = new Object();
		colObj.column = column;
		colObj.divNode = tempDiv;
		this.m_closedColumns.push(colObj);
		
		this.SortButtons();
	},
	
RemoveColumn: function(column)
	{
		var newArr = new Array();
		for (var i=0;i<this.m_closedColumns.length;i++)
		{
			var colObj = this.m_closedColumns[i];
			if (column!=colObj.column)
			{
				newArr.push(colObj);
			}
			else
			{
				this.m_containerDiv.removeChild(colObj.divNode);
			}
		}
		this.m_closedColumns = newArr;
		
		this.SortButtons();
		

	},
		
	
MouseClick: function(e, element)
	{
		/*if (element==this.m_buttonLeft)
		{
			if (this.m_buttonContainer.scrollLeft>0)
			{
				this.m_buttonContainer.scrollLeft = this.m_buttonContainer.scrollLeft - 10;
				if (this.m_buttonContainer.scrollLeft<0)
					this.m_buttonContainer.scrollLeft = 0;
				
				mSpaceApplication.Resize();
			}
		}
		if (element==this.m_buttonRight)
		{
			if (this.m_buttonContainer.scrollLeft<this.m_scrollOverflow)
			{
				this.m_buttonContainer.scrollLeft = this.m_buttonContainer.scrollLeft + 10;
				if (this.m_buttonContainer.scrollLeft>this.m_scrollOverflow)
					this.m_buttonContainer.scrollLeft = this.m_scrollOverflow;				
				
				mSpaceApplication.Resize();
			}
		}		
		else
		{

		}*/
	},
	
MouseDown: function(e, element)
	{

		if(HelpOn!= null && HelpOn)
		{
				return;
		}
		
		var openCol = null;
		for (var i=0;i<this.m_closedColumns.length;i++)
		{
			var colObj = this.m_closedColumns[i];
			if (colObj.divNode==element)
			{
				openCol = colObj.column;
			}
		}
		
		if (openCol!=null)
		{
			mSpaceApplication.FireEvent("Column.DragOpen", openCol);
			openCol.StartDrag();
		}	
		
	},

MouseOver: function(e, element)
	{
		if(HelpOn)
		{
			mSpaceApplication.FireEvent("Help.ShowHighlight", {element: this.m_controlSurface, name: "ColumnBrowser.ScrollLeft"});
		}
		
		var openCol = null;
			for (var i=0;i<this.m_closedColumns.length;i++)
			{
				var colObj = this.m_closedColumns[i];
				if (colObj.divNode==element)
				{
					openCol = colObj.column;
				}
			}
			
			if (openCol!=null)
			{
				mSpaceApplication.FireEvent("Cursor.Change", "pointer");

				/*if(HelpOn && HelpUseHighlight)
				{
					mSpaceApplication.FireEvent("Help.ShowHighlight", {element: element, name: "Column.Closed"});
				}*/
				
				var xPos = mousePosX(e) + 10;
				var yPos = mousePosY(e) - 10;
				
				//this.m_tooltipTimeout = setTimeout(function() {mSpaceApplication.FireEvent("Tooltip.Show", {sender: openCol, x: xPos, y: yPos, message: 'Information about this column needed here'}); }, TooltipTimeout);
			}	
	},

MouseOut: function(e, element)
	{
		if(HelpOn && HelpUseHighlight)
		{
			mSpaceApplication.FireEvent("Help.HideHighlight");
		}
		
		var openCol = null;
			for (var i=0;i<this.m_closedColumns.length;i++)
			{
				var colObj = this.m_closedColumns[i];
				if (colObj.divNode==element)
				{
					openCol = colObj.column;
				}
			}
			
			if (openCol!=null)
			{
				/*if (this.m_tooltipTimeout!=-1)
					clearTimeout(this.m_tooltipTimeout);*/

				mSpaceApplication.FireEvent("Cursor.Reset");
				//mSpaceApplication.FireEvent("Tooltip.Hide", {sender: openCol});
			}	
	},
	
Resize: function(surfaceWidth)
	{
		
	},
	
GetButton: function(column)
	{
		for (var i=0;i<this.m_closedColumns.length;i++)
		{
			var colObj = this.m_closedColumns[i];
			if (column=colObj.column)
			{
				return colObj.divNode;
			}
		}		
		return null;
	},
	
RemoveBtn: function(column)
	{
			var newArray = new Array();
			for (var i=0;i<this.m_closedColumns.length;i++)
			{
				var colObj = this.m_closedColumns[i];
				if (colObj.column==column)
				{
					this.m_containerDiv.removeChild(colObj.divNode);
				}
				else
				{
					newArray.push(colObj);
				}
			}
			
			this.m_closedColumns = newArray;
			
			this.SortButtons();
			
			this.Resize();
	},
	
SortButtons: function()
	{
		var thisObj = this;
		this.m_closedColumns.sort(function(itema, itemb) { return thisObj.SortButtonsFunction(itema, itemb); });
		this.m_closedColumns.reverse();
		
			for (var i=0;i<this.m_closedColumns.length;i++)
			{
				var colObj = this.m_closedColumns[i];
				this.m_containerDiv.removeChild(colObj.divNode);
				this.m_containerDiv.appendChild(colObj.divNode);
			}		
	},
	
SortButtonsFunction: function(itema, itemb)
	{
		if (itema.column.m_Label<itemb.column.m_Label)
		{
			return -1;
		}
		else if (itema.column.label>itemb.column.label)
		{
			return 1;
		}	
		else
		{
			return 0;
		}
	},
	
Close: function()
	{
		this.m_controlSurface.style.display = "none";
	},
	
Open: function()
	{
		this.m_controlSurface.style.display = "";
	}
	
}
