/*
	DynAPI Distribution
	FocusManager Class

	The DynAPI Distribution is distributed under the terms of the GNU LGPL license.

	requires: DynLayer
*/

FocusManager={};

// usage: FocusManager.enableFocus('auto',true,'click',lyr1,lyr2,...lyrN);
FocusManager.enableFocus=function(b,bubble,type){
	var lyr,arg=arguments;
	for (var i=3;i<arg.length;i++){
		lyr=arg[i];
		if(lyr) lyr.setFocus(b,bubble,type);
	}
};

DynLayer.prototype.setFocus = function(b,bubble,type){
	var i,topchild;
	//var d=this.design;
	bubble=(bubble==null)? true:bubble;
	if(b!=='auto' && !this.parent) return;
	if(b=='auto' && !this._hasFocusEvents) {
		if(type!='hover') type='click';
		this._focusType=type;
		this._focusBubble=bubble;
		this._hasFocusEvents=true;
		this.addEventListener(DynLayer.FocusEvent);
	}
	else if (b && !this._focused) {
		topchild=this.parent._topMostChild;
		//i = this.parent.children.length;
		if(topchild && topchild!=this) topchild.setFocus(false,bubble);
		if(this._hasTabManager) this.updateTabManager();
		this.setZIndex({topmost:true});
		this.parent._topMostChild=this;
		this._focused=true;
		this.invokeEvent('focus');
		var o=this.parent;
		if(bubble) while (o && o!=dynapi.document) {
			o.setFocus(b,bubble);
			o=o.parent;
		};
	}else if(!b && this._focused){
		topchild=this.parent._topMostChild;
		if (topchild) this.setZIndex({below:topchild});
		else this.setZIndex(thiz.z-1);
		this._focused=false;
		this.invokeEvent('blur');
		var o=this.parent;
		var ch=this.children;
		// blur children with focus
		for(var i=0;i<ch.length;i++) if(ch[i]._focused) ch[i].setFocus(false,bubble);
		if(o && o!=dynapi.document) o.setFocus(false,bubble);
	}
};

//DynLayer.prototype.setTabIndex = function(n){
//};

DynLayer.FocusEvent = {
	onclick : function(e){
		var o=e.getSource();
		if(o._focusType=='click') {
			o.setFocus(true,o._focusBubble);
		}
	},
	onmouseover : function(e){
		var o=e.getSource();
		if(o._focusType=='hover') {
			o.setFocus(true,o._focusBubble);
		}
	}
};