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 (!win.refreshObjects)
	{
		win.refreshObjects = new Object;
	}

	if (!win.refreshObjects[type])
	{
		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 (!tp_obj.filters[filterek])
			  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 ( to.filters[filter] )
			{
				var ft = to.filters[filter];
				for (j=0;j<ft.length;j++)
					ft[j].fun(ft[j].ref_obj,filter,ft[j].filters);
			}
			if (to.filters['all'])
			{
				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;
	for (var to in win.refreshObjects)
	{
		//alert(to);
		RefreshObjectsByTypeCollection(win.refreshObjects[to],'all');
	}
    //if (document.all)
    //	win.onunload= new Function("window.refreshTop.RemoveWindowFromRefresh(window);");
    //else
	//	win.onunload= new Function("window.refreshTop.RemoveWindowFromRefresh(window);");

	//if (isMacIE)
	//	win.top= top;
		//	if (!win.parent.onbeforeunload)
    //        win.parent.onbeforeunload = new Function("for (var i =0; i<window.frames.length;i++) if (window.frames[i].onbeforeunload) window.frames[i].onbeforeunload();");
}

