﻿// important namespaces
if (window.com == undefined)
    window.com = {};
if (window.com.refreshdev == undefined)
    window.com.refreshdev = {};

// object oriented sweetness
com.refreshdev.UpsideDownEngine = {
    // customizable classname
    className: 'upsidedowntext',
    
    // credit: http://www.sevenwires.com/play/UpsideDownLetters.html
    flipTable: {
        a : '\u0250',
        b : 'q',
        c : '\u0254',
        d : 'p',
        e : '\u01DD',
        f : '\u025F',
        g : '\u0183',
        h : '\u0265',
        i : '\u0131',
        j : '\u027E',
        k : '\u029E',
        l : '\u05DF',
        m : '\u026F',
        n : 'u',
        r : '\u0279',
        t : '\u0287',
        v : '\u028C',
        w : '\u028D',
        y : '\u028E',
        '.' : '\u02D9',
        '[' : ']',
        '(' : ')',
        '{' : '}',
        '?' : '\u00BF',
        '!' : '\u00A1',
        "\'" : ',',
        '<' : '>',
        '_' : '\u203E',
        '\\' : '\\',
        ';' : '\u061B',
        '\u203F' : '\u2040',
        '\u2045' : '\u2046',
        '\u2234' : '\u2235'
    }, 
    
    flipText: function(input) {
        var last = input.length - 1;
        var result = new Array(input.length);
        for (var i = last; i >= 0; --i) {
            var c = input.charAt(i);
            var r = this.flipTable[c];
            result[last - i] = r != undefined ? r : c;
        }
        return result.join('');
    },
    
    // credit: http://www.robertnyman.com/2005/11/07/the-ultimate-getelementsbyclassname/
    getElementsByClassName: function(oElm, strTagName, strClassName){
	    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
	    var arrReturnElements = new Array();
	    strClassName = strClassName.replace(/\-/g, "\\-");
	    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
	    var oElement;
	    for(var i=0; i<arrElements.length; i++){
		    oElement = arrElements[i];
		    if(oRegExp.test(oElement.className)){
			    arrReturnElements.push(oElement);
		    }
	    }
	    return (arrReturnElements)
    },
    
    // credit: http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
    addEvent: function ( obj, type, fn ) {
        if (obj.addEventListener)
	        obj.addEventListener( type, fn, false );
        else if (obj.attachEvent)
        {
	        obj["e"+type+fn] = fn;
	        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
	        obj.attachEvent( "on"+type, obj[type+fn] );
        }
    },
    
    // credit: this is totally my code 
    init: function() {
        // setup table data
        for (i in this.flipTable) {
            this.flipTable[this.flipTable[i]] = i;
        }
        
        this.addEvent(window,'load',function() {
            var ude = com.refreshdev.UpsideDownEngine;
            var els = ude.getElementsByClassName(document,'*',ude.className);
            
            for (var i in els) {
                var el = els[i];                
                if (el.innerHTML != null)
                    el.innerHTML = ude.flipText(el.innerHTML.toLowerCase());
            }
        });
    }     
};
// start it up!
com.refreshdev.UpsideDownEngine.init();