 //
//**********************************************************************
// TWidget - funkce pro praci s s widgety
//**********************************************************************
function dpa()
	{
	var str='';
	for(var r in arguments)
		str=str+arguments[r]+"\n";
	alert(str);
	}
	
function dpc(a)
	{
	var c='';
	for(var b in a)
		c=c+b+": "+a[b]+"\n";
	alert(c);
	}
	
function TWidget()
	    {}
			
TWidget.init = function(okno)
	{
		if(okno.TWidget && okno.TWidget.proxies)
			{
			TWidget=okno.TWidget;
			}
		else
			{
			TWidget.proxies=new TProxies();
			TWidget.browser = TWidget.getBrowser();		
			TWidget.cache=new TCaches();
			TWidget.okno=okno;
			TWidget.document=okno.document;
			TWidget.ActionsID=0;
			TWidget.RunningCount=0;
			}
	}

	

TWidget.initDetect = function(okno)
		{
		if(typeof(WidgetMainWindow)=='undefined')
			{
			var oldokno=okno;
			while(okno.parent!=okno && (okno.TWidget==undefined || okno.TWidget.proxies==undefined))
				okno=okno.parent;
			if(okno.TWidget==undefined)
				okno=oldokno;
			}
		else
			okno=WidgetMainWindow;
		TWidget.init(okno);
		TCache = TWidget.okno.TCache;
		TCaches = TWidget.okno.TCaches;
		TAction = TWidget.okno.TAction;
		TActions = TWidget.okno.TActions;
		TProxy = TWidget.okno.TProxy;
		TProxies = TWidget.okno.TProxies;
		TSavedWidget = TWidget.okno.TSavedWidget;
		if(TWidget.okno.sid !=undefined)
		    TWidget.sid = TWidget.okno.sid;
		}		
		
TWidget.getElement=function(id)
		{
		return TWidget.document.getElementById(id);		
		}		

TWidget.documentBody=function()
		{
		return TWidget.document.getElementsByTagName('body')[0]
		}			
		
TWidget.getBrowser = function()
		{
		var n=navigator.appName
		if(navigator.appName == "Microsoft Internet Explorer")
			return 0;
		return 1;
		}		
		

		
//**********************************************************************
// TCache - objekt k ukladani Html fragmentu
//**********************************************************************	

function TCache()
	{
	this.cache = new Object();
	}

TCache.prototype.get = function(key)
	{
	if(this.cache[key]!=undefined)
		return this.cache[key];	
	return null;
	}
	
TCache.prototype.add = function(proxy,masterKey)
	{
	this.addData(masterKey,new TSavedWidget(proxy));
	}
	
TCache.prototype.addData = function(key,data)
	{
	this.cache[key]=data;
	}

TCache.prototype.invalidate=function(key)
	{
	this.cache[key]=undefined;
	}
	
TCache.prototype.clear = function()
	{
	this.cache=new Object;
	}

TCache.prototype.restore = function(masterKey)
	{
	var data=this.get(masterKey);
	if(data)	//obnovuji z cache
			{
			data.restore();
			return true;
			}
	return false;
	}


////***************************************/////

function TCaches()
	{
	this.objs=new Object();
	}

	
TCaches.prototype.init=function(id)		
		{
		if(!this.objs[id])
			this.objs[id]=new TCache;
		}
	
TCaches.prototype.exchange=function(id,id2)
		{
		this.init(id2);
		var a=this.cache[id];
		this.objs[id]=this.objs[id2];
		this.objs[id2]=a;
		}
			
TCaches.prototype.get=function(id)		
		{
		return this.objs[id];
		}

TCaches.prototype.cache = function(proxy,masterKey)
	{
	this.get(proxy.id).add(proxy,masterKey);
	}

TCaches.prototype.restore = function(proxy,newKey)
{
	var cache=this.get(proxy.id);
	proxy.updating=undefined;
	return cache.restore(newKey);
}	

//**********************************************************************
//TSavedWidget - informace o ulozenem widgetu (content, proxy)
//**********************************************************************
function TSavedWidget(proxy)
	{
	this.id = proxy.id;
	this.content = proxy.getElement().innerHTML;
	this.proxies=Array();
	this.addProxies(proxy);
	}
	
TSavedWidget.prototype.restore = function()
	{
	var w=TWidget.getElement(this.id);
	w.innerHTML = this.content;
	for(var i in this.proxies)
		{
		var proxy=TWidget.proxies.get(i);
		proxy.safeCallAction("restore",proxy,this.proxies[i]);
		}
	var proxy=TWidget.proxies.get(this.id);
	if(proxy.slaves)
		for(var i in proxy.slaves)
				proxy.slaves[i].safeCallAction("update",proxy.store.key);
	}
	
TSavedWidget.prototype.addProxies = function(proxy)
	{
	this.proxies[proxy.id]=proxy.safeCallAction("cache",proxy);
	if(proxy.members)
	       for(var i in proxy.members)
			{
			if(TWidget.getElement(i))
				this.addProxies(proxy.members[i]);
			}
	}

function widget_cache(id,proxy)
	{
	return cloneObject(proxy.store);
	}
	
function widget_restore(id,proxy,storeObject)
	{
	proxy.store=cloneObject(storeObject);
	}

//**********************************************************************
// TAction - objekt odesilajici pozadavky skriptu
//**********************************************************************	
		
function TAction(id,name,addAction)
		{
		if(typeof id == 'object')
			id=id.id;
		this.id = id;
		this.name = name;
		this.params = new Object();
		this.toAdd = addAction;
		this.action=TActions.get();
		this.zarazena = false;
		}
		
TAction.prototype.addParam = function(name,value)		
		{
		this.params[name]=value;
		}

		
TAction.prototype.cancel = function()
		{
		if(this.zarazena)
			this.action.remove(this);
		this.action.close();
		}

TAction.prototype.zarad = function()
		{
		if(this.zarazena)
			return;
		if(this.toAdd)
			this.action.add(this);			
		else
			this.action.replace(this);
		this.zarazena=true;
		}

TAction.prototype.close = function()
		{
		this.zarad();
		return this.action.close();
		}			
		
TAction.prototype.submit = function()
		{
		this.zarad();
		this.action.submit();
		}		
				
function TActions()
		{
		this.objects = new Object();
		this.actions = Array();
		this.toSubmit = false;
		this.leases = 0;
		}
		
TActions.prototype.add = function(co)
		{
		if(!this.objects[co.id])
			this.objects[co.id]=new Object;
		this.objects[co.id]=this.actions.push(co)-1;
		}

TActions.prototype.remove = function(co)
		{
		if(!this.objects[co.id])
			return;
		if(this.objects[co.id][co.name]!=undefined)
			this.objects[co.id][co.name]=undefined;
		}
		
TActions.prototype.replace = function(co)
		{
		if(!this.objects[co.id])
			this.objects[co.id]=new Object;
		else
			if(this.objects[co.id][co.name]!=undefined)
				{
				this.actions[this.objects[co.id][co.name]]=co;
				return this.objects[co.id][co.name];					
				}
		return this.objects[co.id][co.name]=this.actions.push(co)-1;
		}
		
TActions.prototype.submit = function()	
	{
	this.toSubmit = true;
	this.close();
	}

TActions.beginUpdate = function()
	{
	if(TWidget.RunningCount++==0)
				{
				var x=TWidget.getElement('widget_actionActive');
				if(x) x.style.display='block'; 
				x=TWidget.getElement('widget_actionDone');
				if(x) x.style.display='none';
				}
	}

TActions.endUpdate = function()
	{
	if(--TWidget.RunningCount==0)
				{
				var x=TWidget.getElement('widget_actionActive');
				if(x) x.style.display='none';
				x=TWidget.getElement('widget_actionDone');
				if(x) x.style.display='block'; 
				}
	}
	

TActions.SendUrl = function(url)
	{
	var i=TWidget.document.createElement('iframe');
	var body=TWidget.documentBody();
	i.style.display='none';
	//i.style.position = 'absolute';
	i.id='widget:iframe:'+(TWidget.ActionsID++);
	body.appendChild(i);
	//TWidget.document.getElementById('menu').innerHTML = url+'&frame='+i.id;
	i.src=url+'&frame='+i.id;
	TActions.beginUpdate();
	}

TActions.removeActionFrame = function(id)
	{
	var iff=TWidget.getElement(id);
	TWidget.documentBody().removeChild(TWidget.getElement(id));
	TActions.endUpdate();
	}

TActions.prototype.send= function()	
	{
	if(TWidget.document.widgetActions == this)
		TWidget.document.widgetActions = undefined;
	var url=location.href.replace("&session:new=","&w:session:new=");
	if(url.indexOf('?')>=0)
		url=url+'&';
	else
		url=url+'?';
	for(var i=0;i<this.actions.length;i++)
		{
		var a=this.actions[i];
		url+='w:id['+i+']='+a.id+'&w:a['+i+']='+a.name+'&';
		for(var p in a.params)
			url+='w:p['+i+']['+p+']='+a.params[p]+'&';
		}
	url = url +'w:actions='+this.actions.length+'&w:js=1&w:sid=' + TWidget.sid;
	TActions.SendUrl(url);
	}

TActions.prototype.close =function()
	{
	if(--this.leases <= 0 && this.toSubmit)
			this.send();
	return this.toSubmit;
	}
	
TActions.get = function()
	{
	if(TWidget.document.widgetActions == undefined)
		TWidget.document.widgetActions = new TActions;
	TWidget.document.widgetActions.leases ++;
	return TWidget.document.widgetActions;
	}

// **********************************************************************
// TProxy - objekt ukladajici informace o objektu
// **********************************************************************

function TProxyStore()
	{};

var TProxy = function(proxies,id,className)	
	{
	this.Proxies = proxies;
	this.id = id;
	this.store=new TProxyStore();
	this.handlers=new Object();
	this.className=className;
	proxies.add(this);
	}

TProxy.prototype.getElement = function()
	{
	return TWidget.getElement(this.id);
	}

TProxy.prototype.addSlave = function(slave)
	{
	this.addSlaveProxy(TWidget.proxies.get(slave));
	}

TProxy.prototype.addSlaveProxy = function(slave)
	{
	this.slaves[slave.id]=slave;
	}	

TProxy.prototype.addMemberProxy = function(slave)
	{
	this.members[slave.id]=slave;
	}	

TProxy.prototype.addLinkedProxy = function(slave)
	{
	this.linked[slave.id]=slave;
	}	

TProxy.prototype.setMaster = function(master, key)	
	{
	this.master=master;
	this.store.masterKey=master.key;
	}

TProxy.prototype.callAction =  function(name,a,b,c,d,e)
		{
		if(this.handlers[name])
					return this.handlers[name](this.id,a,b,c,d,e);
		else
					return undefined;		
		}

TProxy.prototype.safeCallAction =  function(name,a,b,c,d,e)
		{
		if(document.getElementById(this.id) && this.handlers[name])
					return this.handlers[name](this.id,a,b,c,d,e);
		else
					return undefined;
		}

TProxy.prototype.setStore =function(newStore)
		{
		this.store = proxy;
		}



//**********************************************************************
// TProxies
//**********************************************************************

function TProxies()
	{}
	
TProxies.prototype.add = function(proxy)
	{
	this[proxy.id] = proxy;
	}

TProxies.prototype.get = function(id)
	{
	return this[id];
	}

//**********************************************************************
//handlery etc...
//**********************************************************************

function widget_setSelectedProxy(ja,key)
{
	ja.store.key = key;
	var a=new TAction(ja.id,"selected");
	a.addParam('key',key);
	a.close();
}

function widget_setSelected(id,key)
{
	var ja=TWidget.proxies.get(id);
	if(ja)
		widget_setSelectedProxy(ja,key);
}

function widget_select(id,key,fromLinkedMaster)
{
	var ja=TWidget.proxies.get(id);
	if(ja.linkedMaster!=undefined && fromLinkedMaster!=true)
		return ja.linkedMaster.safeCallAction('select',key,ja.id);
	if(ja.store.key==key && !ja.selectIfSame)
		return false;
	var a=TActions.get();
	widget_setSelected(id,key);
	for(var i in ja.slaves)
		ja.slaves[i].safeCallAction('update',key);
	if(ja.linked) for(var i in ja.linked)
		ja.linked[i].safeCallAction('select',key,true);
	ja.safeCallAction('onSelect',key);
	a.close();
	return false;
}

function widget_loadHtml(to_id,from_id)
	{
	var from=document.getElementById(from_id);
	var to=TWidget.getElement(to_id);
	to.innerHTML = from.innerHTML;
	};

function cloneObject(co) {
	return cloneObjectTo(new Object(),co);
}

function cloneObjectTo(objectClone, co) {
  for (var property in co)
  	{
	if (typeof co[property] == 'object')
      objectClone[property] = cloneObject(co[property]);
    else
      objectClone[property] = co[property];
	 }
  return objectClone;
}

	
function widget_unsetSelectedClass(id)
{
	var f=TWidget.getElement(id);
	if(!f)
		return;
	if(f.className.substr(f.className.length-9,9)=='_selected')
		f.className = f.className.substr(0,f.className.length-9);
}

function widget_setSelectedClass(id)
{
	var f=TWidget.getElement(id);
	if(!f) 
		return false;
	if(f.className.substr(f.className.length-9,9)!='_selected')
		f.className = f.className.substr(0,f.className.length)  + '_selected';
	return true;
}	

function widget_translateKey(id, key)
{
	return key;
}

function widget_panelUpdate(id,masterKey)
{
	var ja=TWidget.proxies.get(id);
	if(ja.store.masterKey == masterKey)
			return false;		  				   //neni treba zmena
	var oldTkey;
	var tkey=ja.callAction('translateKey',masterKey);
	if(tkey==undefined) {
		tkey=masterKey;
		oldTkey=ja.store.masterKey;
	} else
		oldTkey=ja.callAction('translateKey', ja.store.masterKey);
	var action=new TAction(id,'selected');
	action.addParam('key',masterKey);
	action.zarad();
	if(oldTkey == tkey) 
		{
		ja.store.masterKey=masterKey;
		widget_select(id,masterKey);
		}
	else if(TWidget.cache.restore(ja,tkey))
		{
		ja.store.masterKey=masterKey;
		widget_select(id,masterKey);
		}
	else
		{
		var ction=new TAction(id,'update');
		ction.addParam('key',masterKey);
		ction.submit();
		}
	action.close();
	return false;
};

function widget_masterUpdate(id,masterKey)
{
	var a=TActions.get();
	widget_update(id,masterKey);
	if(!a.toSubmit)
		widget_select(id,TWidget.proxies.get(id).store.key);
	a.close();
}

function widget_update(id,masterKey)
{
	var ja=TWidget.proxies.get(id);
	if(ja.store.masterKey == masterKey)
			return false;		  				   //neni treba zmena
	if(!(TWidget.cache.restore(ja,masterKey)))
		if(ja.updating != masterKey)
			{
			ja.updating = masterKey;
			var action=new TAction(id,'update');
			action.addParam('key',masterKey);
			action.submit();
			}
	return false;
};

//****************************
//           Cookies
//****************************

function Cookies()
	{
	}

Cookies.path ="/";	
	
Cookies.create = function(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path="+Cookies.path;
}

Cookies.read = function(name) {
	var ca = document.cookie.split(';');
	var nameEQ=name+"=";
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if(c.substr(0,nameEQ.length)==nameEQ) 
			return c.substring(nameEQ.length,c.length);
	}
	return null;
}

Cookies.erase = function(name) {
	createCookie(name,"",-1);
}




function widget_scrollInViewHorById(id, container)
		{
		var selem=TWidget.getElement(container);
		var nelem=TWidget.getElement(id);
		if(selem && nelem)
			widget_scrollInViewHor(nelem, selem)
		}

function widget_scrollInViewHor(nelem, selem)
		{
		var el=nelem;
		var off=0;
		while(nelem!=selem)
			{
			off+=nelem.offsetTop;
			nelem=nelem.offsetParent;	
			if(!nelem)
				return;
			};

		if(off < selem.scrollTop || off + el.offsetHeight > selem.scrollTop + selem.clientHeight)
			{
			selem.scrollTop = off-(selem.clientHeight - el.offsetHeight )/2;	
			}
		}

TWidget.initDetect(this);
