var BS_FONTSIZECHANGE_MINFONTSIZE = 7;
var BS_FONTSIZECHANGE_MAXFONTSIZE = 20;

var BS_FontSizeChange_Interval = 500;
var BS_FontSizeChange_CurrentFontSize;
var BS_FontSizeChange_IntervalObject;

function BS_FontSizeChange_CheckFontSize(cookieName)
{
    var fontSize = null;
    try
    {
        fontSize = BS_FontSizeChange_ReadCookie(cookieName);
        if (fontSize != null && typeof(fontSize) != "undefined")
        {
	        BS_FontSizeChange_SetFontSize(fontSize, cookieName);
	        BS_FontSizeChange_CurrentFontSize = fontSize;
	        BS_FontSizeChange_IntervalObject = window.setInterval("BS_FontSizeChange_DelayChange()", BS_FontSizeChange_Interval);
	    }
    }
    catch(e)
    {
        //alert(e.message);
    }
}

function BS_FontSizeChange_DelayChange(size)
{
    window.clearInterval(BS_FontSizeChange_IntervalObject);
    BS_FontSizeChange_SetAllDocumentFontSize(BS_FontSizeChange_CurrentFontSize)
}

function BS_FontSizeChange_SetFontSize(size, cookieName)
{
    try
    {
        BS_FontSizeChange_SetAllDocumentFontSize(size);
        BS_FontSizeChange_SetCookieAll(size);
        BS_FontSizeChange_SetImageButton(size);
    }
    catch(e)
    {
        //alert(e.message);
    }
}

function BS_FontSizeChange_SetCookieAll(size)
{
	var cookieNames = BS_FontSizeChange_GetAllWebPartCookieNames();
	for(var i = 0; i < cookieNames.length; i ++)
	{
        BS_FontSizeChange_SetCookie(cookieNames[i], size, 365);
	}
}

function BS_FontSizeChange_GetAllWebPartCookieNames()
{
	var elements = document.getElementsByName("BS_FontSizeChange_Image");
	var cookieNames = new Array();
	for(var i = 0; i < elements.length; i ++)
	{
		if(cookieNames.toString().indexOf(elements[i].cookiename) == -1)
		{
			cookieNames.push(elements[i].cookiename);
		}
	}
	
	return cookieNames;
}

function BS_FontSizeChange_SetAllDocumentFontSize(size)
{
	BS_FontSizeChange_ChangeAllElements(document, size);
		
    for(var i = 0; i < document.frames.length; i++)
    {
    	BS_FontSizeChange_ChangeAllElements(document.frames[i].document, size)
    }
}

function BS_FontSizeChange_RestoreDefault(cookieName)
{
    try
    {
	    var cookieNames = BS_FontSizeChange_GetAllWebPartCookieNames();
	    for(var i = 0; i < cookieNames.length; i ++)
	    {
            BS_FontSizeChange_DeleteCookie(cookieNames[i]);
	    }
    		
        BS_FontSizeChange_ReloadWindow(true);
    }
    catch(e)
    {
        //alert(e.message);
    }
}

function BS_FontSizeChange_ChangeAllElements(doc, size)
{
    BS_FontSizeChange_SetFontSizeByTagName(doc, "div", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "span", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "input", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "a", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "td", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "th", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "select", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "font", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "textarea", size);
    BS_FontSizeChange_SetFontSizeByTagName(doc, "IE:MENUITEM", size);
}

function BS_FontSizeChange_Increase(cookieName, defaultTextControlID)
{
    try
    {
        var units = "pt";
        var fontSizeNumber = 8;
        var fontSizeString = BS_FontSizeChange_ReadCookie(cookieName);
        if (fontSizeString != null)
        {
            units = BS_FontSizeChange_GetFontUnitsFromSizeString(fontSizeString);
            fontSizeNumber = parseInt(fontSizeString.substring(0, fontSizeString.indexOf(units)));
        }
        else
        {
            var info = BS_FontSizeChange_GetDefaultFontInfo();
            units = info.units;
            fontSizeNumber = info.size;
        }
        
        if((units == "px" && fontSizeNumber < 20) || (units == "pt" && fontSizeNumber < 20))
        {
            fontSizeNumber ++;
        }
        else
        {
        }
        
        var fontSize = fontSizeNumber.toString() + units;
        BS_FontSizeChange_SetFontSize(fontSize, cookieName);
    }
    catch(e)
    {
        //alert(e.message);
    }
}

function BS_FontSizeChange_Decrease(cookieName, defaultTextControlID)
{
    try
    {
        var units = "pt";
        var fontSizeNumber = 8;
        var fontSizeString = BS_FontSizeChange_ReadCookie(cookieName);
        if (fontSizeString != null)
        {
            units = BS_FontSizeChange_GetFontUnitsFromSizeString(fontSizeString);
            fontSizeNumber = parseInt(fontSizeString.substring(0, fontSizeString.indexOf(units)));
        }
        else
        {
            var info = BS_FontSizeChange_GetDefaultFontInfo();
            units = info.units;
            fontSizeNumber = info.size;
            if(fontSizeNumber > 9)
            {
                fontSizeNumber = 9;
            }
        }
        
        if((units == "px" && fontSizeNumber > 10) || (units == "pt" && fontSizeNumber > 7))
        {
            fontSizeNumber --;
        }
        else
        {
        }
        
        var fontSize = fontSizeNumber.toString() + units;
        BS_FontSizeChange_SetFontSize(fontSize, cookieName);
    }
    catch(e)
    {
        //alert(e.message);
    }
}

function BS_FontSizeChange_GetDefaultFontUnits(defaultTextControlID)
{
    var defaultTextControl = document.getElementById(defaultTextControlID);
    var sizeString = defaultTextControl.currentStyle.fontSize;
    var units = "";
    if (sizeString)
    {
        if(sizeString.indexOf("pt") != -1)
        {
            units = "pt";
        }
        else if(sizeString.indexOf("px") != -1)
        {
            units = "px";
        }
        else
        {
            units = "pt";
        }
    }
    else
    {
        units = "pt";
    }
    
    return units;
}

function BS_FontSizeChange_GetFontUnitsFromSizeString(sizeString)
{
    var units = "";
    if (sizeString)
    {
        if(sizeString.indexOf("pt") != -1)
        {
            units = "pt";
        }
        else if(sizeString.indexOf("px") != -1)
        {
            units = "px";
        }
        else if(sizeString.indexOf("em") != -1)
        {
            units = "em";
        }
        else
        {
            units = "";
        }
    }
    else
    {
        units = "pt";
    }
    
    return units;
}

function BS_FontSizeChange_CollectFontInfo(controls, fontInfo)
{
    for(var i = 0; i < controls.length; i ++)
    {
        var control = controls[i];
        if(control.innerHTML.indexOf("<") == -1)
        {
            var fontSizeString = control.currentStyle.fontSize;
            var units = BS_FontSizeChange_GetFontUnitsFromSizeString(fontSizeString);
            var fontSizeNumber = parseInt(fontSizeString.substring(0, fontSizeString.indexOf(units)));
            if(units == "pt")
            {
                fontInfo.ptCount ++;
                var isNewSize = true;
                for(var j = 0; j < fontInfo.ptSizes.length; j ++)
                {
                    if(fontInfo.ptSizes[j] == fontSizeNumber)
                    {
                        fontInfo.ptSizesCount[j] = fontInfo.ptSizesCount[j] + 1;
                        isNewSize = false;
                        break;
                    }
                }
                
                if(isNewSize)
                {
                    fontInfo.ptSizes.push(fontSizeNumber);
                    fontInfo.ptSizesCount.push(1);
                }
            }
            else if(units == "px")
            {
                fontInfo.pxCount ++;
                var isNewSize = true;
                for(var j = 0; j < fontInfo.pxSizes.length; j ++)
                {
                    if(fontInfo.pxSizes[j] == fontSizeNumber)
                    {
                        fontInfo.pxSizesCount[j] = fontInfo.pxSizesCount[j] + 1;
                        isNewSize = false;
                        break;
                    }
                }
                
                if(isNewSize)
                {
                    fontInfo.pxSizes.push(fontSizeNumber);
                    fontInfo.pxSizesCount.push(1);
                }
            }
            else
            {}
            
        }
    }
}

function BS_FontSizeChange_GetDefaultFontInfo()
{
    var info = {size:0, units:"pt"};
    try
    {
        var spanArray = document.getElementsByTagName("span");
        var pArray = document.getElementsByTagName("p");
        var divArray = document.getElementsByTagName("divArray");
        var tdArray = document.getElementsByTagName("td");
        var bArray = document.getElementsByTagName("b");
        var fontArray = document.getElementsByTagName("font");
        var aArray = document.getElementsByTagName("a");
        
        var fontInfo = {ptCount:0, pxCount:0, ptSizes:Array(), ptSizesCount:Array(), pxSizes:Array(), pxSizesCount:Array(),temp:0};
        BS_FontSizeChange_CollectFontInfo(spanArray, fontInfo);
        BS_FontSizeChange_CollectFontInfo(pArray, fontInfo);
        BS_FontSizeChange_CollectFontInfo(divArray, fontInfo);
        BS_FontSizeChange_CollectFontInfo(tdArray, fontInfo);
        BS_FontSizeChange_CollectFontInfo(bArray, fontInfo);
        BS_FontSizeChange_CollectFontInfo(fontArray, fontInfo);
        BS_FontSizeChange_CollectFontInfo(aArray, fontInfo);
        //1px = 1/96 inch, 1pt = 1/72 inch, 9pt = 12px
        var sum = 0;
        var sumPt = 0;
        var sumPx = 0;
        for(var k = 0; k < fontInfo.ptSizes.length; k ++)
        {
            sumPt += fontInfo.ptSizesCount[k] * fontInfo.ptSizes[k];
        }
        for(var m = 0; m < fontInfo.pxSizes.length; m ++)
        {
            sumPx += fontInfo.pxSizesCount[m] * fontInfo.pxSizes[m];
        }
        sum = sumPt + (sumPx / 12) * 9;
        var avg = sum / (fontInfo.ptCount + fontInfo.pxCount);
        info.size = avg.toString() == "NaN" ? 9 : parseInt(avg);
    }
    catch(e)
    {
        info.size = 8;
        info.units = "pt";
    }
    
    return info;
}

function BS_FontSizeChange_GetDefaultFontSize(defaultTextControlID)
{
    var defaultTextControl = document.getElementById(defaultTextControlID);
    var sizeString = defaultTextControl.currentStyle.fontSize;
    var units = BS_FontSizeChange_GetDefaultFontUnits(defaultTextControlID);
    var size = parseInt(sizeString.substring(0, sizeString.indexOf(units)));
    return size;
}


function BS_FontSizeChange_SetFontSizeByTagName(doc, tag, size)
{
    var elements = doc.getElementsByTagName(tag);
    for(var i = 0; i < elements.length; i ++)
    {
        elements[i].style.fontSize = size;
    }
}

function BS_FontSizeChange_SetCookie(name, value, expires) 
{
    var argv = BS_FontSizeChange_SetCookie.arguments;
    var argc = BS_FontSizeChange_SetCookie.arguments.length;
    var path = (argc > 3) ? argv[3] : "/";
    var domain = (argc > 4) ? argv[4] : null;
    var secure = (argc > 5) ? argv[5] : false;
    
    var expdate = new Date();
        expdate.setTime(expdate.getTime() + (expires * 24 * 60 * 60 * 1000));
        
    document.cookie = name + "=" + escape (value) +((expires == null) ? "" : ("; expires="+ expdate.toGMTString()))
    +((path == null) ? "" : ("; path=" + path)) +((domain == null) ? "" : ("; domain=" + domain))
    +((secure == true) ? "; secure" : "");
}

function BS_FontSizeChange_ReadCookie(name) 
{
    var arg = name + "=";
    var alen = arg.length;
    var clen = document.cookie.length;
    var i = 0;
    while (i < clen)
    {
        var j = i + alen;
        if (document.cookie.substring(i, j) == arg)
            return BS_FontSizeChange_GetCookieVal(j);
            
        i = document.cookie.indexOf(" ", i) + 1;
        
        if (i == 0) 
            break;
    }
    return null;
}

function BS_FontSizeChange_GetCookieVal(offset)
{
    var endstr = document.cookie.indexOf (";", offset);
    if (endstr == -1)
        endstr = document.cookie.length;
    return unescape(document.cookie.substring(offset, endstr));
}

function BS_FontSizeChange_DeleteCookie(name)
{
    var exp = new Date();
    exp.setTime (exp.getTime() - 1);
    var cval = BS_FontSizeChange_ReadCookie (name);
    document.cookie = name + "=" + cval + "; expires="+ exp.toGMTString() + "; path=/";
}

function BS_FontSizeChange_ReloadWindow(refresh)
{
    if(refresh)
    {
        var url = window.location.href;
        if(url.indexOf("#") == url.length - 1)
        {
            window.location.href = url.substring(0, url.length - 1)
        }
        else
        {
            window.location.href = url;
        }
    }
    else
    {
        window.location.reload();
    }
}

function BS_FontSizeChange_SetImageButton(sizeString)
{
    var units = BS_FontSizeChange_GetFontUnitsFromSizeString(sizeString);
    var fontSizeNumber = parseInt(sizeString.substring(0, sizeString.indexOf(units)));
    
    if(fontSizeNumber == 7)
    {
			BS_FontSizeChange_DisableImageButton("small");
    }
    else if(fontSizeNumber == 20)
    {
			BS_FontSizeChange_DisableImageButton("large");
    }
    else
  	{
  		BS_FontSizeChange_DisableImageButton("none");
  	}
}

function BS_FontSizeChange_DisableImageButton(name)
{
	if(name == null || name == "" || name.toString() == "undefined")
	{
		name = "none";
	}
	else
	{
	}
	
	name = name.toLowerCase();
	var images = document.getElementsByName("BS_FontSizeChange_Image");
	for(var i = 0; i < images.length; i ++)
	{
		var imageUrlBase = images[i].src.substring(0, images[i].src.lastIndexOf("/") + 1);
		if(images[i].src.indexOf(name) != -1)
		{
			images[i].src = imageUrlBase + "font_size_" + name + "_disabled.gif";
			images[i].style.cursor = "default";
		}
		else
		{
			images[i].src = images[i].src.replace("_disabled", "");
			images[i].style.cursor = "hand";
		}
	}
}