// Flyout.js
if(typeof SbWeb == "undefined" || SbWeb == null)
	SbWeb = {};
	
var $viewsets = SbWeb.ViewSets = new ViewSets();
var $multiviews = SbWeb.MultiViews = new MultiViews();
var $flyouts = SbWeb.Flyouts = new Flyouts();

function ViewSets()
{
	this._viewSets = {};
	this.registerViewSet = registerViewSet;
	this.registerView = registerView;
	this.get_ViewSet = get_ViewSet;
	this.get_View = get_View;
	this.get_CurrentView = get_CurrentView;
	this.changeView = changeView;
	this.hideAllViews = hideAllViews;
	
	function registerViewSet(viewSetKey, onViewChanged)
	{
		if(!viewSetKey)
			throw "'viewSetKey' is required.";

		if(this._viewSets[viewSetKey])
			throw "ViewSet '" + viewSetKey + "' has already been defined.";
		
		var vs = this._viewSets[viewSetKey] = {};
		vs.key = viewSetKey;
		vs.onViewChange = onViewChanged;
		vs.views = {};
		vs.currentViewKey = null;
		return vs;
	}
	
	function registerView(viewSetKey, viewKey, id, onShowing)
	{
		var vs = this.get_ViewSet(viewSetKey);
		if(!viewKey)
			throw "'viewKey' is required.";
		
		var ele = $get(id);
		if(!ele)
			throw "invalid 'id'.";
						
		if(vs.views[viewKey])
			throw "View '" + viewKey + "' has already been defined.";
		
		var v = vs.views[viewKey] = {};
		v.key = viewKey;
		v.id = id;
		v.onShowing = onShowing;
		v.viewSet = vs;
		ele.style.display="none";
		return v;
	}
	
	function get_ViewSet(viewSetKey)
	{
		if(!viewSetKey)
			throw "'viewSetKey' is required.";
		if(!this._viewSets[viewSetKey])
			throw "invalid 'viewSetKey'.";
			
		return this._viewSets[viewSetKey];
	}
	
	function get_CurrentView(viewSetKey)
	{
		var vs = this.get_ViewSet(viewSetKey);
		return vs.currentViewKey ? vs.views[vs.currentViewKey] : null;
	}
	
	function get_View(viewSetKey, viewKey)
	{
		var vs = this.get_ViewSet(viewSetKey);
		if(!viewKey)
			throw "'viewKey' is required.";
		var v = vs.views[viewKey];
		if(!v)
			throw "invalid 'viewKey'";
		return v;
	}
	
	function changeView(viewSetKey, viewKey)
	{
		var v = this.get_CurrentView(viewSetKey);
		if(v)
		{
			$get(v.id).style.display = "none";
			$get(v.id).style.visibility = "hidden";
		}
		if(viewKey)
		{
			v = this.get_View(viewSetKey, viewKey);
			if(v.onShowing)
				v.onShowing(v);
			$get(v.id).style.display="";
			$get(v.id).style.visibility = "";
			
		}
		
		var vs = this._viewSets[viewSetKey];
		vs.currentViewKey = viewKey;
		if(vs.onViewChanged)
			vs.onViewChanged(vs);
	}
	
	function hideAllViews(viewSetKey)
	{
		this.changeView(viewSetKey, null);
	}
}

function MultiViews()
{
	this.registerMultiView = registerMultiView;
	this.registerView = registerView;
	this.changeView = changeView;
	
	function registerMultiView(multiViewKey, id)
	{
		var vs = $viewsets.registerViewSet(multiViewKey);
		vs.id = id;
		var i=0;
		var mv = $get(id);
		for(i=0;i<mv.childNodes.length;i++)
		{
			var v = mv.childNodes[i];
			if(v.nodeType == 1)
				v.style.display="none";
		}
	}
	
	function registerView(multiViewKey, viewKey, id)
	{
		var vs = $viewsets.get_ViewSet(multiViewKey);
		$viewsets.registerView(multiViewKey, viewKey, id);
		var ele = $get(id);
		if(ele.parentNode.id != vs.id)
			$get(vs.id).appendChild(ele);
	}
	
	function changeView(multiViewKey, viewKey)
	{
		$viewsets.changeView(multiViewKey, viewKey);
	}
}

function Flyouts()
{
	this._flyouts = {};
	this._key = null;
	this._flyoutId = null;
	this._extenderId = null;
	this._previousId = null;
	this._flyoutSettings = null;
	
	this.init = init;
	this.registerFlyout = registerFlyout;
	this.hide = hide;
	this.show = show;
	this.showLast = showLast;
	this.get_Extender = get_Extender;
	this.get_FlyoutSettings = get_FlyoutSettings;
	this.moveFlyoutTo = moveFlyoutTo;

	function init(flyoutId, extenderId)
	{
		this._flyoutId = flyoutId;
		this._extenderId = extenderId;
		var vs = $multiviews.registerMultiView("__flyouts", flyoutId);
	}
	
	function registerFlyout(key, id, onShowing, onShown, positioningMode, x, y)
	{
		var fo = this._flyouts[key] = {};
		fo.key = key;
		fo.id = id;
		fo.onShowing = onShowing;
		fo.onShown = onShown;
		fo.positioningMode = positioningMode ? positioningMode : AjaxControlToolkit.PositioningMode.Absolute;
		fo.x = x ? x : 0;
		fo.y = y ? y : 0;
		fo.view = $multiviews.registerView("__flyouts", key, id);
	}
	
	function get_FlyoutSettings()
	{
		return this._flyoutSettings;
	}

	function get_Extender()
	{
		return $find(this._extenderId);
	}
	
	function moveFlyoutTo(x, y)
	{
		var ele = $get(this._flyoutId);

		if(ele)
		{
			if(y)
				ele.style.top = y;
			if(x)
				ele.style.left = x;
		}
	}
	
	function hide()
	{
		var e = this.get_Extender();
		if(e)
			e.hide();
	}
	
	function showLast()
	{
		var e = this.get_Extender();
		if(e)
			e.show();
	}
	
	function show(key, target, context)
	{
		this.hide();
		
		var fo = this._flyouts[key];
		if(fo)
		{
			var b = $get(this._flyoutId);
			//if(IsIE)
				b.style.width = '1px';
			
			$multiviews.changeView("__flyouts", key);
			
			var e = this.get_Extender();
			if(e)
			{
				var fs = new FlyoutSettings(fo, $get(fo.id), target, context, fo.positioningMode, fo.x, fo.y);
									
				if(fo.onShowing)
					fo.onShowing(fs);
				
				e.set_parentElement(fs.target);
				e.set_positioningMode(fs.positioningMode);
				e.set_x(fs.x);
				e.set_y(fs.y);
				this._flyoutSettings = fs;
				
				e.show();
				
				if(fo.onShown)
				{
					fo.onShown(fs);
					var x = fs.x;
					var y = fs.y;
					var pm = fs.positioningMode;
					if(fs.positioningMode != pm)
						e.set_positioningMode(fs.positioningMode);
					if(fs.x != x)
						e.set_x(fs.x);
					if(fs.y != y)
						e.set_y(fs.y);
						
					this._flyoutSettings = fs;
				}
			}
		}
	}
}

function FlyoutSettings(flyout, content, target, context, positioningMode, x, y)
{
	this.flyout = flyout;
	this.content = content;
	this.target = target;
	this.targetId = target.id;
	this.context = context;
	this.x = x ? x : 0;
	this.y = y ? y : 0;
	this.positioningMode = positioningMode ? positioningMode : AjaxControlToolkit.PositioningMode.Absolute;
}

//var $faqs = SbWeb.FaqManager = new FaqManager();

//function FaqManager()
//{
//	
//}