// @version $Id: fixupper.js 2008-04-30 $
// @package FixUpperCaseGreekLetters
// @copyright Copyright (C) 2008 Efthimios Mavrogeorgiadis. All rights reserved.
// @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL

window.addEvent('load', function fixUppercase() {
	var elements = document.styleSheets;
	var css_rules = new Array();
	var colon = new RegExp(":");
	for (var i = 0; i < elements.length; i++) {
		var el = elements[i];
		var rules = el.cssRules?el.cssRules:el.rules;
		for (var j = 0; j < rules.length; j++) {
			var rule = rules[j];
			if (rule.style.textTransform == 'uppercase') {
				if (colon.test(rule.selectorText)) continue;
				var r = getCSSChunks(rule.selectorText);
				for (var k = 0; k < r.length; k++) {
					css_rules.push(r[k]);
				}
			}
		}
	}
	var b = fixUpTgIdCl(css_rules);
	if (b.length) {
		for (i = 0; i < b.length; i++) {
			b[i].innerHTML = changeLetters(b[i].innerHTML);
		}
	}
	var elements = document.body.getElementsByTagName("*");
	for (var i = 0; i < elements.length; i++) {
		var el = elements[i];
		if ( el.style.textTransform == 'uppercase' ) {
			el.innerHTML = changeLetters(el.innerHTML);
		}
	}
});
function changeLetters(str) {
	var before = new Array('ά', 'έ', 'ή', 'ί', 'ό', 'ύ', 'ώ', 'ΐ', 'ΰ', 'Ά', 'Έ', 'Ή', 'Ί', 'Ό', 'Ύ', 'Ώ');
	var after = new Array('α', 'ε', 'η', 'ι', 'ο', 'υ', 'ω', 'ϊ', 'ϋ', 'Α', 'Ε', 'Η', 'Ι', 'Ο', 'Υ', 'Ω');
	for (var i = 0; i < before.length; i++) {
		str = str.replace(eval('/'+before[i]+'/g'), after[i]);
	}
	return str;
}
function getCSSChunks(str) {
	var chunks = new Array();
        str = trim(str);
	var a = str.split(/\s*,\s*/);
        if (!isArray(a)) a = new Array(str);
	for (var k = 0; k < a.length; k++) {
            a[k] = trim(a[k]);
            var b = a[k].split(/\s+/);
            chunks[k] = getChunks(b);
	}
	return chunks;
}
function getChunks(b) {
	var chunks = new Object();
	chunks.tg = '';
	chunks.dd = '';
	chunks.cl = '';
	chunks.nn = new Array();
        var val = b.shift();
	chunks = getTgIdCl(val, chunks);
        if (b.length) {
            chunks.nn.push(getChunks(b));
        }
        return chunks;
}
function getTgIdCl(str, ch) {
        str = trim(str);
	if (str.match(/\./)){
		var c = str.split(/\./);
		if ( c.length > 1 ) {
			ch.tg = c[0];
			ch.cl = c[1];
		}
		else {
			ch.tg = '';
			ch.cl = c[0];
		}
	}
	else if (str.match(/#/)) {
		var c = str.split(/#/);
		if ( c.length > 1 ) {
			ch.tg = c[0];
			ch.dd = c[1];
		}
		else {
			ch.tg = '';
			ch.dd = c[0];
		}
	}
	else {
		ch.tg = str;
	}
	return ch;
}
function fixUpTgIdCl(css_rules) {
        var c = new Array();
	if (!isArray(css_rules)) {
		css_rules = new Array(css_rules);
	}
	for (var i = 0; i < css_rules.length; i++) {
		var css_rule = css_rules[i];
                if (css_rule.tg.length && css_rule.cl.length) {
                        var d = getElementsByClassName(document, css_rule.tg, css_rule.cl);
                }
                else if (css_rule.tg.length && css_rule.dd.length) {
                        var d = collectionToArray(document.getElementsByTagName(css_rule.tg));
                        for (var j = d.length - 1; j >= 0; j--) {
                            if (typeof(d[j].id) == "undefined" || d[j].id != css_rule.dd )
                                    d.splice(j, 1);
                        }
                }
                else if (css_rule.tg.length) {
                        var d = collectionToArray(document.getElementsByTagName(css_rule.tg));
                }
                else if (css_rule.cl.length) {
                        var d = getElementsByClassName(document, "*", css_rule.cl);
                }
                else if (css_rule.dd.length) {
                        var d = collectionToArray(document.getElementById(css_rule.dd));
                }
                if (d.length && css_rule.nn.length) {
                        var s = selectElements(css_rule.nn[0], d);
                	if (s.length) c = c.concat(s);
                }
                else if (d.length) {
                        c = c.concat(d);
                }
	}
	return c;
}
function selectElements(css_rule, elmnts) {
        var a = new Array();
        var b = new Array();
        if (css_rule.tg.length) {
                var pattern = new RegExp("^"+css_rule.tg+"$", "i");
                for (var i = 0; i < elmnts.length; i++) {
                    var el = elmnts[i].childNodes;
                    for (var j = 0; j < el.length; j++) {
                            if (pattern.test(el[j].nodeName)) a.push(el[j]);
                    }
                }
        }
        else {
                a = elmnts;
        }
        if (css_rule.cl.length) {
                var pattern = new RegExp("^"+css_rule.cl+"$");
                for (var i = 0; i < a.length; i++) {
                    var el = elmnts[i].childNodes;
                    for (var j = 0; j < el.length; j++) {
                            if (pattern.test(el[j].className)) a.push(el[j]);
                    }
                }
        }
        else if (css_rule.dd.length) {
		var pattern = new RegExp("^"+css_rule.dd+"$");
                for (var i = 0; i < a.length; i++) {
                    var el = elmnts[i].childNodes;
                    for (var j = 0; j < el.length; j++) {
                            if (pattern.test(el[j].id)) a.push(el[j]);
                    }
                }
        }
        else {
            b = a;
        }
        if (css_rule.nn.length && b.length) {
                var b = selectElements(css_rule.nn[0], b);
        }
        return b;
}

/**
 *
 * Taken from http://www.guyfromchennai.com/?p=27
 *
**/

function isArray(obj) {
	if (obj.constructor.toString().indexOf("Array") == -1)
		return false;
	else
		return true;
}

/**
*
*  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"), "");
}

/*
	Written by Jonathan Snook, http://www.snook.ca/jonathan
	Add-ons by Robert Nyman, http://www.robertnyman.com
*/

function getElementsByClassName(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)
}

/**
 *
 * Taken from http://www.sitepoint.com/blogs/2008/03/19/a-collection-is-not-an-array/
 *
**/

function collectionToArray(collection)
{
	var ary = [];
	for(var i=0, len = collection.length; i < len; i++)
	{
		ary.push(collection[i]);
	}
	return ary;
}