<public:component>
<attach event="ondocumentready" handler="afterbefore" />
<script type="text/javascript">

/*
 Author: Fabrizio Calderan -  http://www.fabriziocalderan.it/
 Versione 1.0 - October 27, 2008
 Do not remove this comment. Released under GNU license
*/

if (typeof window['msie_counter'] !== 'object') {
   window['msie_counter'] = [];
   window['msie_quotes'] = [];
};


function afterbefore() {

    var msie_counter = window['msie_counter'];
    var msie_quotes = window['msie_quotes'];

    var style   = element.style;
    var cstyle  = (element.currentStyle || style);
    var tagname = element.tagName;


    var quotes		= (cstyle['msie-quotes'] || '');
    var after       = (cstyle['msie-after-content'] || '');
    var before      = (cstyle['msie-before-content'] || '');
    var counter_inc = (cstyle['msie-counter-increment'] || '');
    var counter_res = (cstyle['msie-counter-reset'] || '');


    if (!quotes && !after && !before && !counter_inc && !counter_res) { return; };


    function tokenizeContent(value) {
        var tokens = [];
        var tokens_re = /^("|').*?("|')|\w+\(.*?\)|(no\-)?(open\-|close\-)quote/i;
        while (match = value.match(tokens_re)) {
            tokens[tokens.length] = match[0];
            value = value.replace(tokens_re, '').replace(/(^\s*|\s*$)/, '');
        };
        var strcontent = '';
        var len = tokens.length;
        for (i=0; i<len; i++) {
            strcontent += getTokenContent(tokens[i]);
        };
        return strcontent;
    };



	function tokenizeQuotes(value) {
		var tokens = value.split(/\s+/);
		msie_quotes[tagname] = [];
		var j = 0;
		for (var i=0; i<tokens.length; i = i+2) {
			msie_quotes[tagname][j] = [];
			msie_quotes[tagname][j]['open'] = tokens[i].replace(/(^("|')|("|')$)/g, '');
			msie_quotes[tagname][j]['close'] = tokens[i+1].replace(/(^("|')|("|')$)/g, '');
			j++;
		}
	};



    function tokenizeCounters(c) {
        var singletokens = { };
        var tokens  = c.match(/[\w]+\s*(?:\d+)?/gi);
        var tl      = tokens.length;
        while (tl--) {
            var tksplit = tokens[tl].split(/\s+/);
            if (tksplit[1]) {
                singletokens[tksplit[0]] = parseInt(tksplit[1], 10);
            }
            else {
                singletokens[tksplit[0]] = false;
            }
        };
        return singletokens;
    };



    /* Get nested elements counter index */

    var index = (function(el) {
        var index = 0;

        try {
            var element = el;
            while (element.tagName !== 'BODY') {
                element = element.parentNode;
                if (el.tagName === element.tagName) ++index;
            };
        } catch(e) { return 0; };

        return index;

    })(element) || 0;


    function getTokenContent(content) {


        if (content !== '') {

            //alert(content);

            /* simple string */
            if (/^("|')/.test(content)) {
                return content.replace(/['"]/g, '').replace(/\\A/g, '<br />');
            };


            /* attr() */
            if (match = content.match(/^attr\((.+)\)/i)) {
                var attr = match[1].toLowerCase();
                if (attr === '') return '';
                switch (attr) {

                    case 'class'    : return element.className;
                    case 'for'      : return element.getAttribute('htmlFor');
                    case 'longdesc' : return element.getAttribute('longDesc');

                    default         : var a = (element.getAttribute(attr) || element[attr]);
                                      return (typeof a !== 'string')? '' : a;
                }
            };


            /* url() */
            if (match = content.match(/^url\(((?:.*\.(\w+)).*?)\)/i)) {
                var url = match[0].replace(/['"]/g, '');
                var src = match[1].toLowerCase();
                var ext = match[2].toLowerCase();

                switch (ext) {

                    case 'gif'  :
                    case 'png'  :
                    case 'jpg'  :
                    case 'jpeg' :
                        var obj =  '<img src="' + src + '" alt="" ';
                            obj += 'onerror="this.parentNode.removeChild(this);" />';
                        return obj;

                    case 'wav'  :
                        var obj =  '<object type="audio/x-wav" data="' + src +'" ';
                            obj += 'onerror="this.parentNode.removeChild(this);" ';
                            obj += 'width="0" height="0" style="visibility:hidden;">';
                            obj += '<param name="autoplay" value="true" />';
                            obj += '<param name="autoStart" value="1" />';
                            obj += '<param name="src" value="'+ src +'" /></object>';
                        return obj;

                      default     : return '';
                }
            };

            if (content.match(/no\-(open|close)\-quote/i)) {
                return '';
            };


            if (content.match(/open\-quote/i)) {
                var i = (index < msie_quotes[tagname].length)? index : msie_quotes[tagname].length - 1;
                return msie_quotes[tagname][i]['open'];
            };

            if (content.match(/close\-quote/i)) {
                var i = (index < msie_quotes[tagname].length)? index : msie_quotes[tagname].length - 1;
                return msie_quotes[tagname][i]['close'];
            };


            /* counter() */
            if (match = content.match(/counter\((.+?)(?:\s*,\s*(.+?))?\)/i)) {

                var c = match[1].toLowerCase();
                var t = match[2].toLowerCase();

                if (typeof msie_counter[c] === 'undefined')  msie_counter[c] = [];
                if (typeof msie_counter[c][index] !== 'number')  msie_counter[c][index] = 0;
				var counter = msie_counter[c][index];

                return counter;
            }


            /* counters() */
            if (match = content.match(/counters\((.+?)(?:\s*\,\s*("|')([^'"]+?)("|')\s*)?\)/i)) {

                var c = match[1].toLowerCase();
                var s = (match[3] || '');

                if (typeof msie_counter[c] === 'undefined')  msie_counter[c] = [];
                if (typeof msie_counter[c][index] !== 'number')  msie_counter[c][index] = 0;

				var counters = '';
				var i = index;

				var e = element.parentNode;
				while (i--) {
					while (e.tagName !== 'BODY') {
						e = e.parentNode;
						if (e.tagName === element.tagName && e.indexCounter) {
							counters = [e.indexCounter[c], counters].join(s);
						}
					}
				};
				counters = [counters, msie_counter[c][index]].join('');

				if (typeof element.indexCounter === 'undefined') element.indexCounter = [];
				if (typeof element.indexCounter[c] !== 'number') element.indexCounter[c] = msie_counter[c][index];

                return counters;
            };


        };
        return '';
    };


    /* end functions */



    if ((cstyle || 0).display != 'none') {

        /* counter reset (msie-counter-reset) */
        if (counter_res !== '') {
            var tokens = tokenizeCounters(counter_res);
            for (c in tokens) {
                if (tokens.hasOwnProperty(c)) {
                    if (typeof msie_counter[c] === 'undefined') msie_counter[c] = [];
                    if (typeof msie_counter[c][index] !== 'number') msie_counter[c][index] = 0;
                    msie_counter[c][index] = tokens[c];
                }
            }
        };


        /* counter increment (msie-counter-increment) */
        if (counter_inc !== '') {
            var tokens = tokenizeCounters(counter_inc);
            for (c in tokens) {
                if (tokens.hasOwnProperty(c)) {
                    if (typeof msie_counter[c] === 'undefined') msie_counter[c] = [];
                    if (typeof msie_counter[c][index] !== 'number') msie_counter[c][index] = 0;
                    msie_counter[c][index] += (tokens[c] === false)? 1 : tokens[c];
                }
            }
        }
    };


    /* quotes (msie-quotes) */
    if (quotes !== '')	{ tokenizeQuotes(quotes) };

    /* content after (msie-after-content) */
    if (after !== '')	{ element.innerHTML += tokenizeContent(after); };

    /* content before (msie-before-content) */
    if (before !== '')	{ element.innerHTML = tokenizeContent(before) + element.innerHTML; };

    style.behavior = null;
    style = cstyle = null;

}
</script>
</public:component>
