﻿// NB: See "http://www.learningjquery.com/2007/10/a-plugin-development-pattern" for an explanation of the jquery code structures
// create closure
(function($) {
    $.fn.replaceText = function(options) {
        // Extend our default options with those provided.
        // Note that the first arg to extend is an empty object -
        // this is to keep from overriding our "defaults" object
        var opts = $.extend({}, $.fn.replaceText.defaults, options);

        // Our plugin implementation:-
        // iterate and reformat each matched element
        return this.each(function() {
            $this = $(this);

            // build element specific options
            var o = $.meta ? $.extend({}, opts, $this.data()) : opts;
            // Store values on object
            $this[0].opts = o;
            $this[0].originalColor = $this.css("color");
            // Skip entries with empty text, as they probably contain other elements
            if ($this[0].firstChild) {
                if ($this[0].firstChild.nodeValue) {
                    if (trim($this[0].firstChild.nodeValue).length > 0) {
                        // update element styles
                        var imageUrl = getReplacementImagePath($this, o)
                        if (o.debug == true)
                            alert("imageUrl = " + imageUrl);
                        //alert(imageUrl);
                        var IE6OrLess = false;
                        if (navigator.appVersion.indexOf("MSIE") != -1)
                            if (parseFloat(navigator.appVersion.split("MSIE")[1]) < 7)
                                IE6OrLess = true;
                        if (IE6OrLess == false) {
                            $this.css({ "text-indent": "-9999px", "background-image": "url('" + imageUrl + "')", "background-repeat": "no-repeat", "color": "transparent", "display": "block" });
                        } else {
                            $this.css({ "text-indent": "-9999px", "background": "Transparent", "background-repeat": "no-repeat", "color": "transparent", "display": "block", "filter": "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, sizingMethod=crop, src='" + imageUrl + "')" });
                        }
                        // If a width or height has been set, force the element size to match
                        if (o.width)
                            $this.css({ "width": o.width.toString() + "px" });
                        if (o.height)
                            $this.css({ "height": o.height.toString() + "px" });
                        $this.addClass("replacedFont");
                        // add javascript for hover if a highlightColor was set
                        if (o.highlightColor)
                            $this.hover(highlightReplacedText, unhighlightReplacedText);
                    }
                }
            }
        });
    };
    // plugin details - added as a property on our plugin function
    $.fn.replaceText.defaults = {
        // DEVELOPMENT:- basePath: '/YEP/',
        // LIVE:- basePath: '/',
        basePath: '/',
        fontWriter: 'fontwriter.ashx',
        font: 'fonts/BadhouseLight_0.ttf',
        width: null,
        height: null,
        color: null,
        bgColor: 'transparent',
        fontSize: null,
        highlightColor: null,
        debug: false,
        forceUpperCase: false
    }
    // private methods (made private by the closure)
    function getReplacementImagePath(element, opts) {
        var url = opts.basePath + opts.fontWriter;
        url += "?font=" + opts.font;
        url += "&text=" + trim(element[0].firstChild.nodeValue);
        if (opts.height)
            url += "&height=" + opts.height.toString();
        else
            url += "&height=" + element.css("height");
        if (opts.width)
            url += "&width=" + opts.width.toString();
        var color, bgColor, fontSize;
        if (opts.color)
            color = opts.color.toString();
        else
            color = element.css("color");
        if (color.indexOf('rgb') != -1)
            color = cssRgb2Hex(color);
        color = color.replace('#', '');
        url += "&color=" + color;
        if (opts.bgColor) bgColor = opts.bgColor.toString(); else bgColor = element.css("background-color");
        if (bgColor.indexOf('rgb') != -1)
            bgColor = cssRgb2Hex(bgColor);
        url += "&bcolor=" + bgColor;
        if (opts.fontSize)
            url += "&size=" + opts.fontSize;
        else
            url += "&size=" + element.css("font-size");
        if (opts.forceUpperCase == true)
            url += "&forceUpperCase=true";
        return url;
    }
    function highlightReplacedText() {
        var backgroundImage = $(this).css("background-image");
        var color = $(this)[0].opts.highlightColor;
        if (color.indexOf('rgb') != -1)
            color = cssRgb2Hex(color);
        color = color.replace('#', '');
        backgroundImage = backgroundImage.replace(/&color=(.*)&bcolor=/ig, "&color=" + color + "&bcolor=");
        $(this).css("background-image", backgroundImage);
    }
    function unhighlightReplacedText() {
        var backgroundImage = $(this).css("background-image");
        var color = $(this)[0].opts.color;
        if (!color) color = $(this)[0].originalColor;
        if (color.indexOf('rgb') != -1)
            color = cssRgb2Hex(color);
        color = color.replace('#', '');
        //var backgroundImageBefore = backgroundImage;
        backgroundImage = backgroundImage.replace(/&color=(.*)&bcolor=/ig, "&color=" + color + "&bcolor=");
        //alert(backgroundImage + "\r\n" + color + "\r\n" + backgroundImageBefore);
        $(this).css("background-image", backgroundImage);
    }
    function cssRgb2Hex(color) {
        var c = color.replace('rgb(', '').replace(')', '').split(',');
        return rbg2hex(parseInt(c[0]), parseInt(c[1]), parseInt(c[2]));
    }
    function rbg2hex(red, green, blue) {
        var r = red.toString(16);
        var g = green.toString(16);
        var b = blue.toString(16);

        var c =
		((r.toString().length == 1) ? '0' : '') + r +
		((g.toString().length == 1) ? '0' : '') + g +
		((b.toString().length == 1) ? '0' : '') + b;

        return c;
    }
    /**
    *
    *  Javascript trim, ltrim, rtrim
    *  http://www.webtoolkit.info/
    *
    **/

    function trim(str, chars) {
        return ltrim(rtrim(str, chars), chars);
    }

    function ltrim(str, chars) {
        chars = chars || "\\s";
        return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
    }

    function rtrim(str, chars) {
        chars = chars || "\\s";
        return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
    }
    // end of closure
})(jQuery);

