// JavaScript Document

/*----------------------------INSTRUCTIONS----------------------

any items between <a></a> will be replaced by an image unless the attribute 'noConvert="true"' is added
using the attribute imageClass (should be the same as the previous div's ID) will allow the script to look for a cssRules specific to that image
	img.[imageClass]  and img.[imageClass]:hover
The hover rule can be used if the original <a></a> has an href reference in it.  Including an href will cause a rollover effect in color to take place

These Must be in a css style sheet somewhere:  img.imageReplacement  and img.imageReplacement:hover
	These will set the defaults for the images color, size, and font;
	If color or font-size is not included then this script will supply default values.
	If a font is not included this program will not convert the file;
	Font must be specified in the 'font-family' rule and is of the form 'directory,fontfilename,fontextension';
		where directory is the subdirectory where the font is listed.  If the path is many levels deep, then additional 'directory,' can be specified
	using an attribute of line-height will specify an angle the text is to be rotated.  
		A positive number will rotate counter clockwise
		A negative number will rotate clockwise
		Angle is in degrees
		
To make the background transparent you must use the css property background:none;  This will be read as backgroundcolor:transparent
	

*///------------------------------------------------------------
//-----------------globals
var browser=navigator.appName;
var platform = navigator.platform;
var cookies = navigator.cookieEnabled;
var MSIEWin = false;
if ((browser == "Microsoft Internet Explorer") && (platform = "Win32"))
	MSIEWin = true;
		
var defaultFontSize = null;
var defaultFontColor = null;
var defaultBackgroundColor = null;
var defaultHoverFontColor = null;
var defaultFont = null;
var defaultAngle = null;
var imageHolder = new imageHolderObject();

//-----------------------------------

function serialize( mixed_value ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Arpad Ray (mailto:arpad@php.net)
    // +   improved by: Dino
    // %          note: We feel the main purpose of this function should be to ease the transport of data between php & js
    // %          note: Aiming for PHP-compatibility, we have to translate objects to arrays
    // *     example 1: serialize(['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
    // *     example 2: serialize({firstName: 'Kevin', midName: 'van', surName: 'Zonneveld'});
    // *     returns 2: 'a:3:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";s:7:"surName";s:9:"Zonneveld";}'
 
    var _getType = function( inp ) {
        var type = typeof inp, match;
        if (type == 'object' && !inp) {
            return 'null';
        }
        if (type == "object") {
            if (!inp.constructor) {
                return 'object';
            }
            var cons = inp.constructor.toString();
            if (match = cons.match(/(\w+)\(/)) {
                cons = match[1].toLowerCase();
            }
            var types = ["boolean", "number", "string", "array"];
            for (key in types) {
                if (cons == types[key]) {
                    type = types[key];
                    break;
                }
            }
        }
        return type;
    };
    var type = _getType(mixed_value);
    var val, ktype = '';
    
    switch (type) {
        case "function": 
            val = ""; 
            break;
        case "undefined":
            val = "N";
            break;
        case "boolean":
            val = "b:" + (mixed_value ? "1" : "0");
            break;
        case "number":
            val = (Math.round(mixed_value) == mixed_value ? "i" : "d") + ":" + mixed_value;
            break;
        case "string":
            val = "s:" + mixed_value.length + ":\"" + mixed_value + "\"";
            break;
        case "array":
        case "object":
            val = "a";
            /*
            if (type == "object") {
                var objname = mixed_value.constructor.toString().match(/(\w+)\(\)/);
                if (objname == undefined) {
                    return;
                }
                objname[1] = serialize(objname[1]);
                val = "O" + objname[1].substring(1, objname[1].length - 1);
            }
            */
            var count = 0;
            var vals = "";
            var okey;
            for (key in mixed_value) {
                ktype = _getType(mixed_value[key]);
                if (ktype == "function" && ktype == "object") { 
                    continue; 
                }
                
                okey = (key.match(/^[0-9]+$/) ? parseInt(key) : key);
                vals += serialize(okey) +
                        serialize(mixed_value[key]);
                count++;
            }
            val += ":" + count + ":{" + vals + "}";
            break;
    }
    if (type != "object" && type != "array") val += ";";
    return val;
}

function urlencode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // %          note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
                                     
    var histogram = {}, histogram_r = {}, code = 0, tmp_arr = [];
    var ret = str.toString();
    
    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };
    
    // The histogram is identical to the one in urldecode.
    histogram['!']   = '%21';
    histogram['%20'] = '+';
    
    // Begin with encodeURIComponent, which most resembles PHP's encoding functions
    ret = encodeURIComponent(ret);
    
    for (search in histogram) {
        replace = histogram[search];
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }
    
    // Uppercase for full PHP compatibility
    return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) {
        return "%"+m2.toUpperCase();
    });
    
    return ret;
}

function phpFontImageObject(cssRuleName, textString)
{		
	var textColor = null;
	var textSize = null;
	var backgroundColor = null;

	var cssRule = findRule(cssRuleName);
//alert("Rule Name: "+cssRuleName+" = "+cssRule);
	textSize = getFontSize(cssRule);
	
	if (cssRuleName.match(/(:hover)$/))
	{
		textColor = getHoverFontColor(cssRule);
		//alert(textString+": cssRule("+cssRule+")+ textColor"+textColor);
	}
	else
		textColor = getFontColor(cssRule);
	
	backgroundColor = getBackgroundColor(cssRule);
	var font = getFont(cssRule);
	var angle = getAngle(cssRule);
	
	var fontImageObject = new Object();
	fontImageObject.imageFunction = "drawText";
	fontImageObject.fontAngle = angle;
	fontImageObject.fontSize = textSize;
	fontImageObject.font = font;
	fontImageObject.backgroundColor = backgroundColor;
	//fontImageObject.width = 300;
	//fontImageObject.height = 300;
	fontImageObject.fontColor = textColor;
	fontImageObject.text = textString;
	if (textString == "Seniors")
	fontImageObject.debug = false;
	else
	fontImageObject.debug = false;

	//if (textString == "Seniors")
	//alert("Seniors -- "+backgroundColor);
	var phpFontObject = urlencode(serialize(fontImageObject));
	var srcString = 'phpFontImage.php?phpImageInst='+phpFontObject;
	if (fontImageObject.debug)
		window.location.href = srcString;
	return (srcString);
}

function grabAndReplaceAElements()
{
	var aElement = document.getElementsByTagName("a");
	for(var aCount=aElement.length-1; aCount >= 0; aCount--)
	{
		var textContent = aElement[aCount].childNodes[0].nodeValue;
		var href = aElement[aCount].getAttribute("href");
		//alert(textContent+": href("+href+")");
		var noConvert = aElement[aCount].getAttribute("noConvert");
		var classNameReference = aElement[aCount].getAttribute("imageClass");
		var onClickReference = aElement[aCount].getAttribute("onclick");
		var attributeArray = aElement[aCount].attributes;
		
		var targetString = "";
		for(var attCount=0; attCount < attributeArray.length; attCount++)
		{
			if (attributeArray[attCount].specified)
			{
				if (attributeArray[attCount].nodeName.match(/^(target)/))
				{
					if (MSIEWin)
						targetString = 'target="'+attributeArray[attCount].nodeValue+'"';
					else
						targetString = 'target="'+attributeArray[attCount].value+'"';
						
				}
				
			}
		}
		
	//	alert(targetString);
		
		var classReference;
		if ((classNameReference != "")&&(classNameReference != null))
		{
			classReference = "class='"+classNameReference+"'";
			classNameReference = " img."+classNameReference;
		}
		else
		{
			classNameReference = "img";	
			classReference = "";
		}
		
		var onClickString = "";
		if (onClickReference)
		{
			onClickReference = cleanJavaFunctionCall(onClickReference);
			if (onClickReference.match(/[;]$/))
				onClickString = 'onClick="'+onClickReference+'"';
			else
				onClickString = 'onClick="'+onClickReference+';"';
		}
					
		if(noConvert != "true")
		{	
			var newImageTag;
			var src = phpFontImageObject(classNameReference, textContent);
//alert("Document # of images: "+document.images.length);
			if (href)
			{
				//alert(textContent+": in Href");
				var imgID = "cpt"+compactImageText(textContent);
				var swapString = 'id="'+imgID+'" onmouseover="swapOutImage(this);" onmouseout="swapBackImage(this);"';
				//newImageTag = '<a href="'+href+'" '+targetString+' '+onClickString+'><img '+classReference+' '+swapString+' src="'+src+'" alt="'+textContent+'" /></a>';
				
				newImageTag = '<img '+classReference+' '+swapString+' src="'+src+'" alt="'+textContent+'" />';
				var hoverClassNameReference = classNameReference+":hover";
				var srcHover = phpFontImageObject(hoverClassNameReference, textContent);
//if (textContent == "main menu"){
	//alert("Adding: "+imgID+"\nSRC:\n"+src+"\nsrcHover\n"+srcHover);
	//alert("newImageTag: "+newImageTag);}
				imageHolder.addItems(imgID, src, srcHover);
			}	
			else
			if (onClickReference)
			{
				var imgID = "cpt"+compactImageText(textContent);
				var swapString = 'id="'+imgID+'" onmouseover="swapOutImage(this);" onmouseout="swapBackImage(this);"';
				//newImageTag = '<a '+onClickString+'><img '+classReference+' '+swapString+' src="'+src+'" alt="'+textContent+'" /></a>';
				newImageTag = '<img '+classReference+' '+swapString+' src="'+src+'" alt="'+textContent+'" />';
				var hoverClassNameReference = classNameReference+":hover";
				var srcHover = phpFontImageObject(hoverClassNameReference, textContent);	
				imageHolder.addItems(imgID, src, srcHover);
			}
			else
				newImageTag = '<img '+classReference+' src="'+src+'" alt="'+textContent+'" />';
				
			//aElement[aCount].parentNode.innerHTML = newImageTag;
			aElement[aCount].innerHTML = newImageTag;
			//if (textContent.match(/(testimonials)/))
			//alert(aElement[aCount].parentNode.innerHTML);
			
		}
				
	}
}
function cleanJavaFunctionCall(javaFunctionCall)
{
	var functionString = javaFunctionCall.toString();
	var startSubstring = functionString.indexOf("{");
	var endSubstring = functionString.indexOf("}");
	
	if ((startSubstring != "-1") && (endSubstring != "-1"))
	{
		functionString = functionString.substring(startSubstring+1,endSubstring);
		functionString = functionString.replace(/\s/g,"");
	}
	return (functionString);
}

function swapOutImage(element)
{
	element.style.cursor = "hand";
	imageHolder.swapOutNormalImage(element.id);
}

function swapBackImage(element)
{
	element.style.cursor = "auto";
	imageHolder.swapBackHoverImage(element.id);
}

//----------------- OBJECT ---------------------
function imageHolderObject()
{
	this.imageIDs = new Array();
	this.normalSRCImages = new Array();
	this.hoverSRCImages = new Array();
	this.addItems = addItems;
	this.findImageID = findImageID;
	this.swapOutNormalImage = swapOutNormalImage;
	this.swapBackHoverImage = swapBackHoverImage;
	this.showIDs = showIDs;
}

function showIDs()
{
	var ids = "";
	for(var arrayIndex = 0; arrayIndex < this.imageIDs.length; arrayIndex++)
	{
		ids += this.imageIDs[arrayIndex]+"\n";;
	}
	
	//alert(ids);
	
}

function findImageID(imageID)
{
	var arrayIndex = 0;
	var itemFound = false;
	for(arrayIndex = 0; arrayIndex < this.imageIDs.length; arrayIndex++)
	{	
		if (this.imageIDs[arrayIndex] == imageID)
		{
			itemFound = true;
			break;
		}
	}

	if (itemFound)
		return(arrayIndex);
	else
		return(-1);
}

function swapOutNormalImage(imageID)
{
	itemIndex = this.findImageID(imageID);
	if (itemIndex != -1)
	{
		document.getElementById(imageID).src = this.hoverSRCImages[itemIndex].src;	
	}
}

function swapBackHoverImage(imageID)
{
	itemIndex = this.findImageID(imageID);
	if (itemIndex != -1)
	{
		document.getElementById(imageID).src = this.normalSRCImages[itemIndex].src;	
	}
}



function addItems(imageID,normalSRC,hoverSRC)
{
	var numIDsBefore = this.imageIDs.length;
	this.imageIDs.push(imageID);
	var newNormalImage = new Image();
	newNormalImage.src = normalSRC;
	this.normalSRCImages.push(newNormalImage);
	var newHoverImage = new Image();
	newHoverImage.src = hoverSRC;
	this.hoverSRCImages.push(newHoverImage);
	
}
//-----------------------------------------------
function compactImageText(text)
{
	var newText = text.replace(/\s/g,"");
	
	return (newText);
}

function setDefaults()
{
	var rule = findRule("img.imageReplacement");
	defaultFontSize = getFontSize(rule);
	defaultFontColor = getFontColor(rule);
	defaultBackgroundColor = getBackgroundColor(rule);
	defaultFont = getFont(rule);
	defaultAngle = getAngle(rule);
	var hoverRule = findRule("img.imageReplacement:hover");
	defaultHoverFontColor = getHoverFontColor(hoverRule);

//		alert("rule: "+rule+" - defaultFont: "+defaultFont+" - defaulthoverFontColor: "+defaultHoverFontColor);

	if ((defaultFont == false) || (defaultHoverFontColor == false))
		return (false);
	else
		return (true);
}

function replaceText()
{
	if (setDefaults())
		grabAndReplaceAElements();
}

function findRule(ruleToFind, temporary)
{
	var ruleReference = false;

	if (ruleToFind)
	{
		if (MSIEWin)
		{	
			for(var ssCount = 0; ssCount < (document.styleSheets.length); ssCount++)
			{
				for(var ruleCount = 0; ruleCount < (document.styleSheets[ssCount].rules.length); ruleCount++)
				{
					var rule = document.styleSheets[ssCount].rules[ruleCount].selectorText;
					if (typeof(rule) == "string")
					{
						//alert(rule);
						if (strCompare(ruleToFind,rule))
						{
							ruleReference = document.styleSheets[ssCount].rules[ruleCount];
							break;
						}
					}
				}
				if (ruleReference != false)
					break;
			}
		}
		else
		{
			for(var ssCount = 0; ssCount < (document.styleSheets.length); ssCount++)
			{
				for(var ruleCount = 0; ruleCount < (document.styleSheets[ssCount].cssRules.length); ruleCount++)
				{
					var rule = document.styleSheets[ssCount].cssRules[ruleCount].selectorText;
					if (typeof(rule) == "string")
					{
						if (strCompare(ruleToFind,rule))
						{
							ruleReference = document.styleSheets[ssCount].cssRules[ruleCount];
							break;
						}
					}
				}
				if (ruleReference != false)
					break;
			}
			
		}
	}
	return (ruleReference);
}

function getAngle(rule, defaultOverride)
{
	if(defaultAngle == null)
		defaultAngle = 0;

	var checkRule = true;
	
	var angle = defaultAngle;
	
	if (defaultOverride)
	{
		if (defaultOverride != false)
		{
			if (defaultOverride.style.lineHeight)
			{
				angle = defaultOverride.style.lineHeight;
				checkRule = false;
			}
		}
	}
	
	if ((rule != false) && (checkRule))
	{
		if (rule.style.lineHeight)
			angle = rule.style.lineHeight;
	}
	
	return (angle);
	
}

function getFont(rule, defaultOverride)
{
	if(defaultFont == null)
		defaultFont = false;

	var checkRule = true;
	
	var font = defaultFont;
	
	if (defaultOverride)
	{
		if (defaultOverride != false)
		{
			if (defaultOverride.style.fontFamily)
			{
				font = createFontPath(defaultOverride.style.fontFamily);
				checkRule = false;
			}
		}
	}

	if ((rule != false) && (checkRule))
	{
		//	alert(rule.selectorText);
		if (rule.style.fontFamily)
		{
			font = createFontPath(rule.style.fontFamily);
		}
	}
	
	
	//if ((rule != false) && (rule.selectorText == "img.imagelabel"))
		//alert("Font: "+font);
	
	return (font);
}

function createFontPath(fontFamilyPath)
{
	var fontArray = fontFamilyPath.split(",");
	var arrCount = 0;
	var fontPath = "";
	var spaceRegEx = /\s/g;
	for (arrCount = 0; arrCount < (fontArray.length - 2); arrCount++)
	{
		fontArray[arrCount] = fontArray[arrCount].replace(spaceRegEx,"");
		fontPath +=  fontArray[arrCount] + "/";
	}
	fontPath += fontArray[arrCount].replace(spaceRegEx,"")+"."+fontArray[arrCount+1].replace(spaceRegEx,"");
	
	return(fontPath);
	
}

function getBackgroundColor(rule, defaultOverride)
{
	var checkRule = true;
	
	if (defaultBackgroundColor == null)
		defaultBackgroundColor = "#ffffff";
		
	var backgroundColor = defaultBackgroundColor;

	if (defaultOverride)
	{	
		if (defaultOverride != false)
		{
			if (defaultOverride.style.backgroundColor)
			{
				backgroundColor = defaultOverride.style.backgroundColor;
				checkRule = false;
			}
			
		}
		
	}

	if ((rule != false) && (checkRule))
	{
		
		if (rule.style.backgroundColor)
			backgroundColor = rule.style.backgroundColor;
		
	}
	
	return(backgroundColor);

}

function getHoverFontColor(rule, defaultOverride)
{
	var hoverFontColor = defaultHoverFontColor;
	
	if (rule!= false)
	{
		//if (rule.selectorText.toLowerCase() == "tell a friend")
			//alert("found");
		hoverFontColor = getFontColor(rule,defaultOverride);
	}
	
	return(hoverFontColor);
}

function getFontColor(rule, defaultOverride)
{
	var checkRule = true;
	var isHover = false;
	
	if (rule != false)
	{
		if ((rule.selectorText).match(/(:hover)$/))
			isHover = true;
	}
	
	if ((defaultFontColor == null) && (isHover == false))
		defaultFontColor = "#ffffff";
	else
		if ((defaultHoverFontColor == null) && (isHover == true))
			defaultHoverFontColor == "#888888";
		
	var fontColor;
	
	if (isHover)
		fontColor = defaultHoverFontColor;
	else
		fontColor = defaultFontColor;
	
	if (defaultOverride)
	{
		if (defaultOverride != false)
		{
			if (defaultOverride.style.color)
			{
				fontColor = defaultOverride.style.color;
				checkRule = false;
			}
		}
	}

	if ((rule != false) && (checkRule))
	{
		if (rule.style.color)
		
			fontColor = rule.style.color;
	}
		
	
	return(fontColor);
}

function getFontSize(rule, defaultOverride)
{	
	var checkRule = true;

	if (defaultFontSize == null)
		defaultFontSize = 12;
		
	var fontSize = defaultFontSize;
	
	if (defaultOverride)
	{
		if (defaultOverride != false)
		{
			if (defaultOverride.style.fontSize)
			{
				fontSize = fontSizeConverter(defaultOverride.style.fontSize,"pt");
				checkRule = false;
			}
		}
	}
	
	if ((rule != false) && (checkRule))
	{
		if (rule.style.fontSize)
			fontSize = fontSizeConverter(rule.style.fontSize,"pt");
	}
	
	return(fontSize);
}

function fontSizeConverter(fontSizeString, desiredOutputUnit)
{
	var validUnitTypes = ["pt","px","em","%"];
	
	fontSizeString = fontSizeString.toLowerCase();
	
	var pattern = new RegExp("(em|px|pt|%)$","i");
	
	var fontParts = pattern.exec(fontSizeString);
	var passedUnit = fontSizeString.substr(fontParts.index,fontSizeString.length-fontParts.index);
	var fontSize = fontSizeString.substr(0,fontParts.index);
	
	var multiplier = 0;
	switch(desiredOutputUnit.toLowerCase())
	{
		case 'pt':
			multiplier = 12;
			break;
		case 'px':
			multiplier = 16;
			break;
		case 'em':
			multiplier = 1;
			break;
		case '%':
			multiplier = 100;
			break;
	}
	
	switch(passedUnit)
	{
		case 'pt':
			multiplier = multiplier/12;
			break;
		case 'px':
			multiplier = multiplier/16;
			break;
		case 'em':
			multiplier = multiplier/1;
			break;
		case '%':
			multiplier = multiplier/100;
			break;
	}
		
	var convertedValue = (fontSize * multiplier);
	
	return(convertedValue);
	
	
}

function cleanString(stringToClean, L)
{
	if (L)
		return(stringToClean.replace(/\s/,"").toLowerCase());
	else
		return(stringToClean.replace(/\s/,""));
}

function strCompare(stringA,stringB)
{
	var stringAClean = stringA.replace(/\s/,"").toLowerCase();
	var stringBClean = stringB.replace(/\s/,"").toLowerCase();
	
	//alert("^"+stringAClean+"^ --- ^"+stringBClean+"^");
	
	var result = false;
	var stringACleanArray = stringAClean.split(",");
	var stringBCleanArray = stringBClean.split(",");
	
	for (var aloop = 0; aloop < stringACleanArray.length; aloop++)
	{
		for (var bloop = 0; bloop < stringBCleanArray.length; bloop++)
		{
			if (stringACleanArray[aloop] == stringBCleanArray[bloop])
			{
				result = true;
				break;
			}
		}
		if (result == true)
			break;
	}
	
	
	//if ((stringAClean) == (stringBClean))
		//result = true;
	
	return(result);
}