/**
 * TrimPath Template. Release 1.0.38.
 * Copyright (C) 2004, 2005 Metaha.
 * 
 * TrimPath Template is licensed under the GNU General Public License
 * and the Apache License, Version 2.0, as follows:
 *
 * This program is free software; you can redistribute it and/or 
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed WITHOUT ANY WARRANTY; without even the 
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
 * See the GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var TrimPath;

// TODO: Debugging mode vs stop-on-error mode - runtime flag.
// TODO: Handle || (or) characters and backslashes.
// TODO: Add more modifiers.

(function() {               // Using a closure to keep global namespace clean.
    if (TrimPath == null)
        TrimPath = new Object();
    if (TrimPath.evalEx == null)
        TrimPath.evalEx = function(src) { return eval(src); };

    var UNDEFINED;
    if (Array.prototype.pop == null)  // IE 5.x fix from Igor Poteryaev.
        Array.prototype.pop = function() {
            if (this.length === 0) {return UNDEFINED;}
            return this[--this.length];
        };
    if (Array.prototype.push == null) // IE 5.x fix from Igor Poteryaev.
        Array.prototype.push = function() {
            for (var i = 0; i < arguments.length; ++i) {this[this.length] = arguments[i];}
            return this.length;
        };

    TrimPath.parseTemplate = function(tmplContent, optTmplName, optEtc) {
        if (optEtc == null)
            optEtc = TrimPath.parseTemplate_etc;
        var funcSrc = parse(tmplContent, optTmplName, optEtc);
        var func = TrimPath.evalEx(funcSrc, optTmplName, 1);
        if (func != null)
            return new optEtc.Template(optTmplName, tmplContent, funcSrc, func, optEtc);
        return null;
    }
    
    try {
        String.prototype.process = function(context, optFlags) {
            var template = TrimPath.parseTemplate(this, null);
            if (template != null)
                return template.process(context, optFlags);
            return this;
        }
    } catch (e) { // Swallow exception, such as when String.prototype is sealed.
    }
    
    TrimPath.parseTemplate_etc = {};            // Exposed for extensibility.
    TrimPath.parseTemplate_etc.statementTag = "forelse|for|if|elseif|else|var|macro";
    TrimPath.parseTemplate_etc.statementDef = { // Lookup table for statement tags.
        "if"     : { delta:  1, prefix: "if (", suffix: ") {", paramMin: 1 },
        "else"   : { delta:  0, prefix: "} else {" },
        "elseif" : { delta:  0, prefix: "} else if (", suffix: ") {", paramDefault: "true" },
        "/if"    : { delta: -1, prefix: "}" },
        "for"    : { delta:  1, paramMin: 3, 
                     prefixFunc : function(stmtParts, state, tmplName, etc) {
                        if (stmtParts[2] != "in")
                            throw new etc.ParseError(tmplName, state.line, "bad for loop statement: " + stmtParts.join(' '));
                        var iterVar = stmtParts[1];
                        var listVar = "__LIST__" + iterVar;
                        return [ "var ", listVar, " = ", stmtParts[3], ";",
                             // Fix from Ross Shaull for hash looping, make sure that we have an array of loop lengths to treat like a stack.
                             "var __LENGTH_STACK__;",
                             "if (typeof(__LENGTH_STACK__) == 'undefined' || !__LENGTH_STACK__.length) __LENGTH_STACK__ = new Array();", 
                             "__LENGTH_STACK__[__LENGTH_STACK__.length] = 0;", // Push a new for-loop onto the stack of loop lengths.
                             "if ((", listVar, ") != null) { ",
                             "var ", iterVar, "_ct = 0;",       // iterVar_ct variable, added by B. Bittman     
                             "for (var ", iterVar, "_index in ", listVar, ") { ",
                             iterVar, "_ct++;",
                             "if (typeof(", listVar, "[", iterVar, "_index]) == 'function') {continue;}", // IE 5.x fix from Igor Poteryaev.
                             "__LENGTH_STACK__[__LENGTH_STACK__.length - 1]++;",
                             "var ", iterVar, " = ", listVar, "[", iterVar, "_index];" ].join("");
                     } },
        "forelse" : { delta:  0, prefix: "} } if (__LENGTH_STACK__[__LENGTH_STACK__.length - 1] == 0) { if (", suffix: ") {", paramDefault: "true" },
        "/for"    : { delta: -1, prefix: "} }; delete __LENGTH_STACK__[__LENGTH_STACK__.length - 1];" }, // Remove the just-finished for-loop from the stack of loop lengths.
        "var"     : { delta:  0, prefix: "var ", suffix: ";" },
        "macro"   : { delta:  1, 
                      prefixFunc : function(stmtParts, state, tmplName, etc) {
                          var macroName = stmtParts[1].split('(')[0];
                          return [ "var ", macroName, " = function", 
                                   stmtParts.slice(1).join(' ').substring(macroName.length),
                                   "{ var _OUT_arr = []; var _OUT = { write: function(m) { if (m) _OUT_arr.push(m); } }; " ].join('');
                     } }, 
        "/macro"  : { delta: -1, prefix: " return _OUT_arr.join(''); };" }
    }
    TrimPath.parseTemplate_etc.modifierDef = {
        "eat"        : function(v)    { return ""; },
        "escape"     : function(s)    { return String(s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); },
        "capitalize" : function(s)    { return String(s).toUpperCase(); },
        "default"    : function(s, d) { return s != null ? s : d; }
    }
    TrimPath.parseTemplate_etc.modifierDef.h = TrimPath.parseTemplate_etc.modifierDef.escape;

    TrimPath.parseTemplate_etc.Template = function(tmplName, tmplContent, funcSrc, func, etc) {
        this.process = function(context, flags) {
            if (context == null)
                context = {};
            if (context._MODIFIERS == null)
                context._MODIFIERS = {};
            if (context.defined == null)
                context.defined = function(str) { return (context[str] != undefined); };
            for (var k in etc.modifierDef) {
                if (context._MODIFIERS[k] == null)
                    context._MODIFIERS[k] = etc.modifierDef[k];
            }
            if (flags == null)
                flags = {};
            var resultArr = [];
            var resultOut = { write: function(m) { resultArr.push(m); } };
            try {
                func(resultOut, context, flags);
            } catch (e) {
                if (flags.throwExceptions == true)
                    throw e;
                var result = new String(resultArr.join("") + "[ERROR: " + e.toString() + (e.message ? '; ' + e.message : '') + "]");
                result["exception"] = e;
                return result;
            }
            return resultArr.join("");
        }
        this.name       = tmplName;
        this.source     = tmplContent; 
        this.sourceFunc = funcSrc;
        this.toString   = function() { return "TrimPath.Template [" + tmplName + "]"; }
    }
    TrimPath.parseTemplate_etc.ParseError = function(name, line, message) {
        this.name    = name;
        this.line    = line;
        this.message = message;
    }
    TrimPath.parseTemplate_etc.ParseError.prototype.toString = function() { 
        return ("TrimPath template ParseError in " + this.name + ": line " + this.line + ", " + this.message);
    }
    
    var parse = function(body, tmplName, etc) {
        body = cleanWhiteSpace(body);
        var funcText = [ "var TrimPath_Template_TEMP = function(_OUT, _CONTEXT, _FLAGS) { with (_CONTEXT) {" ];
        var state    = { stack: [], line: 1 };                              // TODO: Fix line number counting.
        var endStmtPrev = -1;
        while (endStmtPrev + 1 < body.length) {
            var begStmt = endStmtPrev;
            // Scan until we find some statement markup.
            begStmt = body.indexOf("{", begStmt + 1);
            while (begStmt >= 0) {
                var endStmt = body.indexOf('}', begStmt + 1);
                var stmt = body.substring(begStmt, endStmt);
                var blockrx = stmt.match(/^\{(cdata|minify|eval)/); // From B. Bittman, minify/eval/cdata implementation.
                if (blockrx) {
                    var blockType = blockrx[1]; 
                    var blockMarkerBeg = begStmt + blockType.length + 1;
                    var blockMarkerEnd = body.indexOf('}', blockMarkerBeg);
                    if (blockMarkerEnd >= 0) {
                        var blockMarker;
                        if( blockMarkerEnd - blockMarkerBeg <= 0 ) {
                            blockMarker = "{/" + blockType + "}";
                        } else {
                            blockMarker = body.substring(blockMarkerBeg + 1, blockMarkerEnd);
                        }                        
                        
                        var blockEnd = body.indexOf(blockMarker, blockMarkerEnd + 1);
                        if (blockEnd >= 0) {                            
                            emitSectionText(body.substring(endStmtPrev + 1, begStmt), funcText);
                            
                            var blockText = body.substring(blockMarkerEnd + 1, blockEnd);
                            if (blockType == 'cdata') {
                                emitText(blockText, funcText);
                            } else if (blockType == 'minify') {
                                emitText(scrubWhiteSpace(blockText), funcText);
                            } else if (blockType == 'eval') {
                                if (blockText != null && blockText.length > 0) // From B. Bittman, eval should not execute until process().
                                    funcText.push('_OUT.write( (function() { ' + blockText + ' })() );');
                            }
                            begStmt = endStmtPrev = blockEnd + blockMarker.length - 1;
                        }
                    }                        
                } else if (body.charAt(begStmt - 1) != '$' &&               // Not an expression or backslashed,
                           body.charAt(begStmt - 1) != '\\') {              // so check if it is a statement tag.
                    var offset = (body.charAt(begStmt + 1) == '/' ? 2 : 1); // Close tags offset of 2 skips '/'.
                                                                            // 10 is larger than maximum statement tag length.
                    if (body.substring(begStmt + offset, begStmt + 10 + offset).search(TrimPath.parseTemplate_etc.statementTag) == 0) 
                        break;                                              // Found a match.
                }
                begStmt = body.indexOf("{", begStmt + 1);
            }
            if (begStmt < 0)                              // In "a{for}c", begStmt will be 1.
                break;
            var endStmt = body.indexOf("}", begStmt + 1); // In "a{for}c", endStmt will be 5.
            if (endStmt < 0)
                break;
            emitSectionText(body.substring(endStmtPrev + 1, begStmt), funcText);
            emitStatement(body.substring(begStmt, endStmt + 1), state, funcText, tmplName, etc);
            endStmtPrev = endStmt;
        }
        emitSectionText(body.substring(endStmtPrev + 1), funcText);
        if (state.stack.length != 0)
            throw new etc.ParseError(tmplName, state.line, "unclosed, unmatched statement(s): " + state.stack.join(","));
        funcText.push("}}; TrimPath_Template_TEMP");
        return funcText.join("");
    }
    
    var emitStatement = function(stmtStr, state, funcText, tmplName, etc) {
        var parts = stmtStr.slice(1, -1).split(' ');
        var stmt = etc.statementDef[parts[0]]; // Here, parts[0] == for/if/else/...
        if (stmt == null) {                    // Not a real statement.
            emitSectionText(stmtStr, funcText);
            return;
        }
        if (stmt.delta < 0) {
            if (state.stack.length <= 0)
                throw new etc.ParseError(tmplName, state.line, "close tag does not match any previous statement: " + stmtStr);
            state.stack.pop();
        } 
        if (stmt.delta > 0)
            state.stack.push(stmtStr);

        if (stmt.paramMin != null &&
            stmt.paramMin >= parts.length)
            throw new etc.ParseError(tmplName, state.line, "statement needs more parameters: " + stmtStr);
        if (stmt.prefixFunc != null)
            funcText.push(stmt.prefixFunc(parts, state, tmplName, etc));
        else 
            funcText.push(stmt.prefix);
        if (stmt.suffix != null) {
            if (parts.length <= 1) {
                if (stmt.paramDefault != null)
                    funcText.push(stmt.paramDefault);
            } else {
                for (var i = 1; i < parts.length; i++) {
                    if (i > 1)
                        funcText.push(' ');
                    funcText.push(parts[i]);
                }
            }
            funcText.push(stmt.suffix);
        }
    }

    var emitSectionText = function(text, funcText) {
        if (text.length <= 0)
            return;
        var nlPrefix = 0;               // Index to first non-newline in prefix.
        var nlSuffix = text.length - 1; // Index to first non-space/tab in suffix.
        while (nlPrefix < text.length && (text.charAt(nlPrefix) == '\n'))
            nlPrefix++;
        while (nlSuffix >= 0 && (text.charAt(nlSuffix) == ' ' || text.charAt(nlSuffix) == '\t'))
            nlSuffix--;
        if (nlSuffix < nlPrefix)
            nlSuffix = nlPrefix;
        if (nlPrefix > 0) {
            funcText.push('if (_FLAGS.keepWhitespace == true) _OUT.write("');
            var s = text.substring(0, nlPrefix).replace('\n', '\\n'); // A macro IE fix from BJessen.
            if (s.charAt(s.length - 1) == '\n')
            	s = s.substring(0, s.length - 1);
            funcText.push(s);
            funcText.push('");');
        }
        var lines = text.substring(nlPrefix, nlSuffix + 1).split('\n');
        for (var i = 0; i < lines.length; i++) {
            emitSectionTextLine(lines[i], funcText);
            if (i < lines.length - 1)
                funcText.push('_OUT.write("\\n");\n');
        }
        if (nlSuffix + 1 < text.length) {
            funcText.push('if (_FLAGS.keepWhitespace == true) _OUT.write("');
            var s = text.substring(nlSuffix + 1).replace('\n', '\\n');
            if (s.charAt(s.length - 1) == '\n')
            	s = s.substring(0, s.length - 1);
            funcText.push(s);
            funcText.push('");');
        }
    }
    
    var emitSectionTextLine = function(line, funcText) {
        var endMarkPrev = '}';
        var endExprPrev = -1;
        while (endExprPrev + endMarkPrev.length < line.length) {
            var begMark = "${", endMark = "}";
            var begExpr = line.indexOf(begMark, endExprPrev + endMarkPrev.length); // In "a${b}c", begExpr == 1
            if (begExpr < 0)
                break;
            if (line.charAt(begExpr + 2) == '%') {
                begMark = "${%";
                endMark = "%}";
            }
            var endExpr = line.indexOf(endMark, begExpr + begMark.length);         // In "a${b}c", endExpr == 4;
            if (endExpr < 0)
                break;
            emitText(line.substring(endExprPrev + endMarkPrev.length, begExpr), funcText);                
            // Example: exprs == 'firstName|default:"John Doe"|capitalize'.split('|')
            var exprArr = line.substring(begExpr + begMark.length, endExpr).replace(/\|\|/g, "#@@#").split('|');
            for (var k in exprArr) {
                if (exprArr[k].replace) // IE 5.x fix from Igor Poteryaev.
                    exprArr[k] = exprArr[k].replace(/#@@#/g, '||');
            }
            funcText.push('_OUT.write(');
            emitExpression(exprArr, exprArr.length - 1, funcText); 
            funcText.push(');');
            endExprPrev = endExpr;
            endMarkPrev = endMark;
        }
        emitText(line.substring(endExprPrev + endMarkPrev.length), funcText); 
    }
    
    var emitText = function(text, funcText) {
        if (text == null ||
            text.length <= 0)
            return;
        text = text.replace(/\\/g, '\\\\');
        text = text.replace(/\n/g, '\\n');
        text = text.replace(/"/g,  '\\"');
        funcText.push('_OUT.write("');
        funcText.push(text);
        funcText.push('");');
    }
    
    var emitExpression = function(exprArr, index, funcText) {
        // Ex: foo|a:x|b:y1,y2|c:z1,z2 is emitted as c(b(a(foo,x),y1,y2),z1,z2)
        var expr = exprArr[index]; // Ex: exprArr == [firstName,capitalize,default:"John Doe"]
        if (index <= 0) {          // Ex: expr    == 'default:"John Doe"'
            funcText.push(expr);
            return;
        }
        var parts = expr.split(':');
        funcText.push('_MODIFIERS["');
        funcText.push(parts[0]); // The parts[0] is a modifier function name, like capitalize.
        funcText.push('"](');
        emitExpression(exprArr, index - 1, funcText);
        if (parts.length > 1) {
            funcText.push(',');
            funcText.push(parts[1]);
        }
        funcText.push(')');
    }

    var cleanWhiteSpace = function(result) {
        result = result.replace(/\t/g,   "    ");
        result = result.replace(/\r\n/g, "\n");
        result = result.replace(/\r/g,   "\n");
        result = result.replace(/^(\s*\S*(\s+\S+)*)\s*$/, '$1'); // Right trim by Igor Poteryaev.
        return result;
    }

    var scrubWhiteSpace = function(result) {
        result = result.replace(/^\s+/g,   "");
        result = result.replace(/\s+$/g,   "");
        result = result.replace(/\s+/g,   " ");
        result = result.replace(/^(\s*\S*(\s+\S+)*)\s*$/, '$1'); // Right trim by Igor Poteryaev.
        return result;
    }

    // The DOM helper functions depend on DOM/DHTML, so they only work in a browser.
    // However, these are not considered core to the engine.
    //
    TrimPath.parseDOMTemplate = function(elementId, optDocument, optEtc) {
        if (optDocument == null)
            optDocument = document;
        var element = optDocument.getElementById(elementId);
        var content = element.value;     // Like textarea.value.
        if (content == null)
            content = element.innerHTML; // Like textarea.innerHTML.
        content = content.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
        return TrimPath.parseTemplate(content, elementId, optEtc);
    }

    TrimPath.processDOMTemplate = function(elementId, context, optFlags, optDocument, optEtc) {
        return TrimPath.parseDOMTemplate(elementId, optDocument, optEtc).process(context, optFlags);
    }
}) ();
/*
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/	
var getElementsByClassName = function (className, tag, elm){
	if (document.getElementsByClassName) {
		getElementsByClassName = function (className, tag, elm) {
			elm = elm || document;
			var elements = elm.getElementsByClassName(className),
				nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
				returnElements = [],
				current;
			for(var i=0, il=elements.length; i<il; i+=1){
				current = elements[i];
				if(!nodeName || nodeName.test(current.nodeName)) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	else if (document.evaluate) {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = "",
				xhtmlNamespace = "http://www.w3.org/1999/xhtml",
				namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
				returnElements = [],
				elements,
				node;
			for(var j=0, jl=classes.length; j<jl; j+=1){
				classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
			}
			try	{
				elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
			}
			catch (e) {
				elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
			}
			while ((node = elements.iterateNext())) {
				returnElements.push(node);
			}
			return returnElements;
		};
	}
	else {
		getElementsByClassName = function (className, tag, elm) {
			tag = tag || "*";
			elm = elm || document;
			var classes = className.split(" "),
				classesToCheck = [],
				elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
				current,
				returnElements = [],
				match;
			for(var k=0, kl=classes.length; k<kl; k+=1){
				classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
			}
			for(var l=0, ll=elements.length; l<ll; l+=1){
				current = elements[l];
				match = false;
				for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
					match = classesToCheck[m].test(current.className);
					if (!match) {
						break;
					}
				}
				if (match) {
					returnElements.push(current);
				}
			}
			return returnElements;
		};
	}
	return getElementsByClassName(className, tag, elm);
};if (!window.TFCWidget)
    window.TFCWidget = (function () {
            function tfc_find (key)
            {
                var divs = getElementsByClassName('tfc_widget', 'div');
                for (var d=0; d < divs.length; d++) {
                    if (divs[d].getAttribute('rel') != key)
                        continue;
                    return divs[d];
                }
            }
            function tfc_getIEVersion()
            // Returns the version of Internet Explorer or -1 (another browser).
            {
                var tfc_rv = -1;
                if (navigator.appName == 'Microsoft Internet Explorer'){
                    var tfc_ua = navigator.userAgent;
                    var tfc_re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
                    if (tfc_re.exec(tfc_ua) != null)
                        tfc_rv = parseFloat( RegExp.$1 );
                }
                return tfc_rv;
            }
            var tfc_IEVersion = tfc_getIEVersion();
            var tfc_html = document.getElementsByTagName('html');
            var tfc_attr = typeof tfc_html[0].xmlns == 'undefined' ? '' :tfc_html[0].xmlns;
            function tfc_load (data)
            {
                if (typeof(tfc_excl) == "object") {
                    var erevs = data['moreExpert'];
                    for (i in tfc_excl) {
                        var excl_re = new RegExp(tfc_excl[i], "i");
                        for (j in erevs) {
                            var orig_re = new RegExp("[&;]track_origin=([^&]+)");
                            var orig = orig_re.exec(erevs[j]['url']);
                            if (orig != null && orig.length > 1 && excl_re.test(orig[1])) {
                                delete erevs[j];
                            }
                        }
                    }
                }

                var div = tfc_find(data['key']);
                var IEmargin = tfc_IEVersion == 6 ? 6 : 0; // IE6 margin difference
                if (div.scrollWidth != (350 + IEmargin)) { // resize right header if greater than 350px (default)
                    var tfc_rnd = Math.floor(Math.random()*10001);
                    div.innerHTML = TrimPath.parseTemplate("\t\t\t<div class=\"tfcRoot\">\r\n\t\t\t\t<div class=\"tfc_header\">\r\n\t\t\t\t\t<div class=\"tfc_tl\"><div class=\"tfc_tr\"><div class=\"tfc_bl\"><div class=\"tfc_br\">\r\n\t\t\t\t\t\t<div class=\"tfc_info\">\r\n                        {if images[0]}\r\n\t\t\t\t\t\t\t<div class=\"tfc_header_img\" style=\" background-image : url(\'${images[0][0]}\')\">\r\n                        {else}\r\n                            <div class=\"tfc_header_img\">\r\n                        {/if}\r\n                                <a href=\"${key}\"></a>\r\n                            </div>\r\n\t\t\t\t\t\t\t<div id=\"tfc_hdr\" class=\"tfc_header_r\">\r\n\t\t\t\t\t\t\t\t<div style=\"width:100%\" class=\"tfc_title\"><a href=\"${key}\">${name}</a></div>\r\n\t\t\t\t\t\t\t\t<div class=\"tfc_expertReviews\">\r\n                                                                        {if expertScore}\r\n\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em; width: 150px;\"><span>${lang.experts} (${expertScore[1]} ${lang.reviews})</span></div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"tfc_scoreRight\" style=\"width: 160px\">\r\n\t\t\t\t\t\t\t\t\t\t<strong style=\"float:left;\">${lang.score} ${expertScore[0]}</strong>\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"tfc_score tfc_expert tfc_s${expertScore[0]}-10\"></div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n                                                                        {else}\r\n\t\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em;\"><span style=\"color:inherit;\">${lang.no_expert}</span></div>\r\n                                                                        {/if}\r\n\t\t\t\t\t\t\t\t</div><!-- br/ -->\t\t\r\n\t\t\t\t\t\t\t\t<div class=\"tfc_userReviews\">\r\n\t\t\t\t\t\t\t\t\t{if userScore}\r\n\t\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em; width: 150px;\"><span style=\"color:inherit;\">${lang.users} (${userScore[1]} ${lang.reviews})</span></div>\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"tfc_scoreRight\" style=\"width: 160px\"><strong style=\"float:left;\">${lang.score} ${userScore[0]}</strong><div class=\"tfc_score tfc_user tfc_s${userScore[0]}-10\"></div></div>\r\n\t\t\t\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em;\"><span style=\"color:inherit;\">${lang.no_user}</span></div>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t</div><!-- br/ -->\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div style=\"clear:both;\"></div>\r\n\t\t\t\t\t</div></div></div></div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div style=\"clear:left;padding-top:1px\">\r\n\t\t\t\t\t<div class=\"tfc_bottom\">\r\n\t\t\t\t\t\t<div class=\"tfc_tl\" style=\"width:100%\"><div class=\"tfc_tr\"><div class=\"tfc_br\"><div class=\"tfc_bl\">\r\n\t\t\t\t\t\t\t<div class=\"tfc_moreExpertReviews\">\r\n\t\t\t\t\t\t\t\t<span class=\"tfc_title\"><a href=\"${key}\" style=\"color : rgb(215,86,0);\">${lang.more}</a></span>\r\n\t\t\t\t\t\t\t\t{for r in moreExpert}\r\n\t\t\t\t\t\t\t\t\t<div class=\"tfc_moreReview\" style=\"margin-top: 0.4em;\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"tfc_moreReviewTop\">\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"tfc_moreFrom\" style=\"float : left; padding : 0px 3px;\"><a href=\"${r.url}\">${r.name}</a></span> \r\n\t\t\t\t\t\t\t\t\t\t\t{if r.score}\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"tfc_moreScore\" style=\"float : left\">${lang.score} ${r.score}</span><div class=\"tfc_score tfc_expert2 tfc_s${r.score}-10\"></div>\r\n\t\t\t\t\t\t\t\t\t\t\t{/if}<br/>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t{/for}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div></div></div></div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"tfc_logo\">\r\n\t\t\t\t\t<a href=\"${key}\"><small>${lang.provided_by}</small><span>TestFreaks.com</span></a>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n").process(data).replace(/tfc_hdr/i, "tfc_hdr_" + tfc_rnd);
                                
                    document.getElementById("tfc_hdr_" + tfc_rnd).style.width = (div.scrollWidth - (126 + IEmargin)) +"px";
                } else {
                    div.innerHTML = TrimPath.parseTemplate("\t\t\t<div class=\"tfcRoot\">\r\n\t\t\t\t<div class=\"tfc_header\">\r\n\t\t\t\t\t<div class=\"tfc_tl\"><div class=\"tfc_tr\"><div class=\"tfc_bl\"><div class=\"tfc_br\">\r\n\t\t\t\t\t\t<div class=\"tfc_info\">\r\n                        {if images[0]}\r\n\t\t\t\t\t\t\t<div class=\"tfc_header_img\" style=\" background-image : url(\'${images[0][0]}\')\">\r\n                        {else}\r\n                            <div class=\"tfc_header_img\">\r\n                        {/if}\r\n                                <a href=\"${key}\"></a>\r\n                            </div>\r\n\t\t\t\t\t\t\t<div id=\"tfc_hdr\" class=\"tfc_header_r\">\r\n\t\t\t\t\t\t\t\t<div style=\"width:100%\" class=\"tfc_title\"><a href=\"${key}\">${name}</a></div>\r\n\t\t\t\t\t\t\t\t<div class=\"tfc_expertReviews\">\r\n                                                                        {if expertScore}\r\n\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em; width: 150px;\"><span>${lang.experts} (${expertScore[1]} ${lang.reviews})</span></div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"tfc_scoreRight\" style=\"width: 160px\">\r\n\t\t\t\t\t\t\t\t\t\t<strong style=\"float:left;\">${lang.score} ${expertScore[0]}</strong>\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"tfc_score tfc_expert tfc_s${expertScore[0]}-10\"></div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n                                                                        {else}\r\n\t\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em;\"><span style=\"color:inherit;\">${lang.no_expert}</span></div>\r\n                                                                        {/if}\r\n\t\t\t\t\t\t\t\t</div><!-- br/ -->\t\t\r\n\t\t\t\t\t\t\t\t<div class=\"tfc_userReviews\">\r\n\t\t\t\t\t\t\t\t\t{if userScore}\r\n\t\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em; width: 150px;\"><span style=\"color:inherit;\">${lang.users} (${userScore[1]} ${lang.reviews})</span></div>\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"tfc_scoreRight\" style=\"width: 160px\"><strong style=\"float:left;\">${lang.score} ${userScore[0]}</strong><div class=\"tfc_score tfc_user tfc_s${userScore[0]}-10\"></div></div>\r\n\t\t\t\t\t\t\t\t\t{else}\r\n\t\t\t\t\t\t\t\t\t\t<div style=\"float:left; padding-right : 0.5em;\"><span style=\"color:inherit;\">${lang.no_user}</span></div>\r\n\t\t\t\t\t\t\t\t\t{/if}\r\n\t\t\t\t\t\t\t\t</div><!-- br/ -->\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div style=\"clear:both;\"></div>\r\n\t\t\t\t\t</div></div></div></div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div style=\"clear:left;padding-top:1px\">\r\n\t\t\t\t\t<div class=\"tfc_bottom\">\r\n\t\t\t\t\t\t<div class=\"tfc_tl\" style=\"width:100%\"><div class=\"tfc_tr\"><div class=\"tfc_br\"><div class=\"tfc_bl\">\r\n\t\t\t\t\t\t\t<div class=\"tfc_moreExpertReviews\">\r\n\t\t\t\t\t\t\t\t<span class=\"tfc_title\"><a href=\"${key}\" style=\"color : rgb(215,86,0);\">${lang.more}</a></span>\r\n\t\t\t\t\t\t\t\t{for r in moreExpert}\r\n\t\t\t\t\t\t\t\t\t<div class=\"tfc_moreReview\" style=\"margin-top: 0.4em;\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"tfc_moreReviewTop\">\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"tfc_moreFrom\" style=\"float : left; padding : 0px 3px;\"><a href=\"${r.url}\">${r.name}</a></span> \r\n\t\t\t\t\t\t\t\t\t\t\t{if r.score}\r\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"tfc_moreScore\" style=\"float : left\">${lang.score} ${r.score}</span><div class=\"tfc_score tfc_expert2 tfc_s${r.score}-10\"></div>\r\n\t\t\t\t\t\t\t\t\t\t\t{/if}<br/>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t{/for}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div></div></div></div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class=\"tfc_logo\">\r\n\t\t\t\t\t<a href=\"${key}\"><small>${lang.provided_by}</small><span>TestFreaks.com</span></a>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n").process(data);
                }
                if(tfc_attr.indexOf('xhtml')>=0 && tfc_IEVersion == 7 && 
                   div.scrollWidth < 400){ // xhtml/IE7 detector for IE7 element height rendering bug
                    div.innerHTML = div.innerHTML.replace(/<!-- br\/ -->/gi, "<br />");
                } else {
                    div.innerHTML = div.innerHTML.replace(/<!-- br\/ -->/gi, "");
                }
            }
            function tfc_error (data)
            {
                var div = tfc_find(data['key']);
                div.innerHTML = data['error'];
            }
            function tfc_init ()
            {
                var divs = getElementsByClassName('tfc_widget', 'div');
                for (var d=0; d < divs.length; d++) {
                    var url = divs[d].getElementsByTagName('a')[0].getAttribute('href');
                    divs[d].setAttribute('rel', url);
                    url = 'http://widget.testfreaks.com/api.php?func=tfc_load&item=' + encodeURIComponent(url);
                    divs[d].innerHTML = ''; //"Loading Data..";
                    var script = document.createElement("script"); 
                    script.setAttribute("src", url);
                    script.setAttribute("type","text/javascript");
                    var head = document.getElementsByTagName("head")[0];
                    head.appendChild(script);
                }
            }

            window.onload=tfc_init;
                
            return {
                Version : "0.0.2",
                    Load        : tfc_load,
                    Error       : tfc_error
                    }
        })();
