function FR_ResizableElement(min, max, def, unit, path)
{
	this.Default = def;
	this.Unit = unit;
	this.Min = min;
	this.Max = max;
	this.Path = path;
	this.Current = null;
	
	this.ChangeSize = FRE_ChangeSize;
	this.Reset = FRE_Reset;
	this.GetElements = FRE_GetElements;
}

function FRE_ChangeSize(diff)
{
	var size;
	var elements = this.GetElements(this.Path);
	
	if (this.Unit == '%')
		diff = diff*5;
		
	if (this.Current)
		size = parseInt(this.Current, 10) + parseInt(diff, 10);
	else 
		size = parseInt(this.Default, 10) + parseInt(diff, 10);
	
	if (size > this.Max)
		size = this.Max;
	if (size < this.Min)
		size = this.Min;
		
	this.Current = size;
	WindowSize = size;
	for (var idx=0; elements[idx]; idx++)
	{
		elements[idx].style.fontSize = size + this.Unit;
	}
}

function FRE_Reset()
{
	var elements = this.GetElements(this.Path);
	for (var idx=0; elements[idx]; idx++)
	{
		elements[idx].style.fontSize = '';
	}
	this.Current = null;
}

function FRE_GetElements(elementPath)
{
	if (!document.getElementsByTagName)
		return [];

	var containerList = [document];
	var elementParts,list,col,els,i,j,k;
	
	var pathElementList = elementPath.split(' ');
	for (var idx=0; pathElementList[idx]; idx++)
	{
		var singleElement = pathElementList[idx];
		if (singleElement.indexOf('.') != -1)
		{
			// elements by class 
			elementParts = singleElement.split('.');

			if (elementParts[1].indexOf("!") == 0)
			{
				// elements excluding class
				containerList = FR_GetElementsExcludingClass(elementParts[1].substring(1, elementParts[1].length), elementParts[0], containerList);
			}
			else
			{
				// elements in class
				containerList = FR_GetElementsByClass(elementParts[1], elementParts[0], containerList);
			}
		}
		else
		{
			// elements by tag
			containerList = FR_GetElementsByTag(singleElement, containerList);
		}
	}
	return containerList;
}

function FR_GetElementsByClass(className, tag, containerList)
{
	var list, classElements = new Array();
	var rgx = new RegExp("\\b" + className + "\\b", "i");
	
	for (var idx=0; containerList[idx]; idx++)
	{
		if (!tag || tag == "*")
			list = containerList[idx].all ? containerList[idx].all : containerList[idx].getElementsByTagName("*");
		else
			list = containerList[idx].getElementsByTagName(tag);
		
		for (var jdx=0; list[jdx]; jdx++)
		{
			if (rgx.test(list[jdx].className))
				classElements[classElements.length] = list[jdx];
		}
	}
	return classElements;
}

function FR_GetElementsExcludingClass(className, tag, containerList)
{
	var list, classElements = new Array();
	var classRgx = new RegExp("\\b" + className + "\\b", "i");
	for (var idx=0; containerList[idx]; idx++)
	{
		if (!tag || tag == "*")
			list = containerList[idx].all ? containerList[idx].all : containerList[idx].getElementsByTagName("*");
		else
			list = containerList[idx].getElementsByTagName(tag);
		
		for (var jdx=0; list[jdx]; jdx++)
		{
			if (!classRgx.test(list[jdx].className))
				classElements[classElements.length] = list[jdx];
		}
	}
	return classElements;
}

function FR_GetElementsByTag(tag, containerList)
{
	var list, classElements = new Array();
	for (var idx=0; containerList[idx]; idx++)
	{
		if (!tag || tag == "*")
			list = containerList[idx].all ? containerList[idx].all : containerList[idx].getElementsByTagName("*");
		else
			list = containerList[idx].getElementsByTagName(tag);
			
		for (var jdx=0; list[jdx]; jdx++)
			classElements[classElements.length] = list[jdx];
	}
	return classElements;
}

function FontResizer()
{
	this.Default = 11;
	this.Unit = 'px';
	this.Min = 5;
	this.Max = 35;
	
	this.SetResizableElements = FR_SetResizableElements;
	this.Reset = FR_Reset;
	this.ResizeBy = FR_ResizeBy;
	this.GetElementStateString = FR_GetElementStateString;
	this.Restore = FR_Restore;
	
	this.ResizableElements = new Array();
}

function FR_SetResizableElements(list, min, max, def, unit)
{
	if (!min)
		min = this.Min;
	if (!max)
		max = this.Max;
	if (!def)
		def = this.Default;
	if (!unit)
		unit = this.Unit;

	for (var idx=0; list[idx]; idx++)
	{
		this.ResizableElements[this.ResizableElements.length] = new FR_ResizableElement(min, max, def, unit, list[idx]);
	}
}
function FR_Reset()
{
	for (var idx=0; this.ResizableElements[idx]; idx++)
	{
		this.ResizableElements[idx].Reset();
	}
}
function FR_ResizeBy(diff)
{
	for (var idx=0; this.ResizableElements[idx]; idx++)
	{
		this.ResizableElements[idx].ChangeSize(diff);
	}
}
function FR_GetElementStateString()
{
	var cstr = '';
	var elementList;
	for (var idx=0; this.ResizableElements[idx]; idx++)
	{
		if (cstr.length > 0)
			cstr += ',';
		if (this.ResizableElements[idx].Current)
			cstr += this.ResizableElements[idx].Path + ':' + this.ResizableElements[idx].Current;
	}
	return cstr;
}
function FR_Restore(pathValues)
{
	for (var idx=0; this.ResizableElements[idx]; idx++)
	{
		for (var jdx=0; pathValues[jdx]; jdx++)
		{
			if (pathValues[jdx][0] && (this.ResizableElements[idx].Path == pathValues[jdx][0]))
			{
				if (pathValues[jdx][1])
					this.ResizableElements[idx].Current = pathValues[jdx][1];
				break;
			}
		}
	}
	this.ResizeBy(0);
}
var F_Sizer = new FontResizer();
var WindowSize;
/***  Browser resize and reset ***/
function BrowserResize(diff)
{
	if (F_Sizer)
		F_Sizer.ResizeBy(diff);
	if (window.frames.length)
	{
		for (var idx=0; window.frames[idx]; idx++)
		{
			var currFrame = window.frames[idx];
			if (currFrame.F_Sizer)
				currFrame.F_Sizer.ResizeBy(diff);
		}
	}
	BrowserStoreState();
}
function BrowserReset()
{
	if (F_Sizer)
		F_Sizer.Reset();
	if (window.frames.length)
	{
		for (var idx=0; window.frames[idx]; idx++)
		{
			var currFrame = window.frames[idx];
			if (currFrame.F_Sizer)
				currFrame.F_Sizer.Reset();
		}
	}
	//BrowserStoreState();
	BrowserResize(2);
}
function BrowserRestore()
{
	var val = getCookie("fr_value");
	if (val && val.length > 0)
	{
		var relements = val.split(',');
		for (var idx=0; relements[idx]; idx++)
		{
			relements[idx] = relements[idx].split(':');
		}
	
		if (F_Sizer)
			F_Sizer.Restore(relements);
			
		if (window.frames.length)
		{
			for (var idx=0; window.frames[idx]; idx++)
			{
				var currFrame = window.frames[idx];
				if (currFrame.F_Sizer)
					currFrame.F_Sizer.Restore(relements);
			}
		}
	}
}
function BrowserStoreState()
{
	var stateString = '', sizerStateString = '';
	if (F_Sizer)
		stateString = F_Sizer.GetElementStateString();
		
	if (window.frames.length)
	{
		for (var idx=0; window.frames[idx]; idx++)
		{
			var currFrame = window.frames[idx];
			if (currFrame.F_Sizer)
			{
				sizerStateString = currFrame.F_Sizer.GetElementStateString();
				if (sizerStateString && sizerStateString.length > 0)
					stateString += ',' + sizerStateString;
			}
		}
	}
	createCookie("fr_value", stateString, 0);
}
