var refreshWindows=new Array();
if (!Array.prototype.push) Array.prototype.push=new Function ("elem","for(var i=0;i<arguments.length;i++) this[this.length]=arguments[i];");
if (!Array.prototype.pop) Array.prototype.pop=new Function ("elem","var x = this[this.length-1]; this.length--; return x;");

function RefreshObject(type,fun,ref_obj,filters)
{
	this.type=type;
	this.fun=fun;
	this.ref_obj=ref_obj;
    this.filters=filters;
	//alert(ref_obj);
}

function RemoveWindowFromRefresh(win)
{
	for (i=0;i<refreshWindows.length;i++)
		if (refreshWindows[i]==win)
		{
			for (i++;i<refreshWindows.length;i++)
				refreshWindows[i-1] = refreshWindows[i];
			refreshWindows.length--;
			break;
		}
}

function AddRefreshObject(win,type,fun,ref_obj,filter)
{
	var i;
	for (i=0;i<refreshWindows.length;i++)
		if (refreshWindows[i]==win)
			break;
	refreshWindows[i] = win;

	if (typeof win.refreshObjects == "undefined")
	{
		win.refreshObjects = new Object;
	}

	if (typeof win.refreshObjects[type] == "undefined")
	{
		win.refreshObjects[type]=new Object;
		win.refreshObjects[type].all = new Array();	
		win.refreshObjects[type].filters = new Object();
		win.refreshObjects[type].nameOfType= type;
	}
	
	var tp_obj =  win.refreshObjects[type];
	var filters = new Array();

	for (i=4;i<arguments.length;i++)
	   filters.push(arguments[i]);
	
	var ro = new RefreshObject(type,fun,ref_obj,filters);
	tp_obj.all.push(ro);
    
	for (i=4;i<arguments.length;i++)
	{
		var filterek = arguments[i];
		if (typeof tp_obj.filters[filterek] == "undefined")
			  tp_obj.filters[filterek] = new Array();
		tp_obj.filters[filterek].push(ro);
	}
	


}

function RefreshObjectsInWindow(type,filter,win)
{
	var j;
	var to = win.refreshObjects[type];
	RefreshObjectsByTypeCollection(to,filter);
}

function RefreshObjectsByTypeCollection(to,filter)
{
	var j;
	//var to = win.refreshObjects[type];
	if (to)
	{
		if ( filter!="all" )
		{
			if ( typeof to.filters[filter] != "undefined" )
			{
				var ft = to.filters[filter];
				for (j=0;j<ft.length;j++)
					ft[j].fun(ft[j].ref_obj,filter,ft[j].filters);
			}
			if (typeof to.filters['all']!= "undefined")
			{
				var ft = to.filters['all'];
				for (j=0;j<ft.length;j++)
					ft[j].fun(ft[j].ref_obj,filter,ft[j].filters);
			}
		}
		else
		{
			for (j=0;j<to.all.length;j++)
				to.all[j].fun(to.all[j].ref_obj,filter,to.all[j].filters);
		}
	}
		
}

function RefreshObjects(type,filter,win)
{
	var use_gc=false;
	var i;
	if (win && !win.closed && win.refreshObjects)
	{
		 RefreshObjectsInWindow(type,filter,win)
	}
	else
		for (i=0;i<top.refreshWindows.length;i++)
		{
			var win=top.refreshWindows[i];
			if (win && !win.closed && win.refreshObjects)
				RefreshObjectsInWindow(type,filter,win)
			else
				use_gc=true;
		}
	if (use_gc)
   {
// gargage collector	
		var x= new Array();
		for (i=0;i<top.refreshWindows.length;i++)
		{
			if (top.refreshWindows[i] && !top.refreshWindows[i].closed &&  top.refreshWindows[i].refreshObjects)
			   x.push(top.refreshWindows[i]);
		}
		top.refreshWindows[i] = x;
   }
}

function InitRefreshObjectsInWin(win,xtop)
{
	var isMacIE    = (navigator.appVersion.indexOf("Mac")!=-1 && document.all);
	win.refreshTop = xtop;
	if (typeof win.refreshObjects != "undefined")
		for (var to in win.refreshObjects)
		{
			RefreshObjectsByTypeCollection(win.refreshObjects[to],'all');
		}
}
