/**
 * (c) Marcus Mennemeier 2010
 */
(function($) {
    var done = {};
    var comment = /\/\*(.|\n)*?\*\//g;
    var span = $("<span/>");
    var style = span.get(0).style;

    var rewrites = [];

    // reg-groups:
    // 2: selector
    // 3: content
    function push(property, rule, replace) {
        if (!replace || style[property] !== undefined) return;
        var reg = new RegExp('(^|\\})([^}]*)[{]([^}]*' + rule + ';)', 'g');
        var local = new RegExp(';\\s*' + rule + '(?=;)', 'g');
        rewrites.push(function(text){
            var s = "";
            var m;
            while (m = reg.exec(text)) {
                var rules = (';' + m[3]).match(local);
                if (rules) {
                    s += ' ' + m[2] + ' {';
                    for (var i = 0; i < rules.length; i++) {
                        s += (rules[i] + ';').replace(local, replace);
                    }
                    s += '}';
                }
            }
            return s;
        });
    }

    // webkit & mozilla border-radius, border-top/bottom-left/right-radius
    push('borderRadius', 'border((-top|-bottom)-(left|right))?-radius:(.*?)',
            style['MozBorderRadius'] !== undefined && '-moz-border-radius$2$3:$4'
                    || style['webkitBorderRadius'] !== undefined && '-webkit-border$1-radius:$4'
        );

    // webkit & mozilla box-shadow
    push('boxShadow', 'box-shadow:(.*?)',
            style['MozBoxShadow'] !== undefined && '-moz-box-shadow:$1'
                    || style['webkitBoxShadow'] !== undefined && '-webkit-box-shadow:$1'
        );
    

    $.gcsRewriteCSS = function(sync){
        if (!rewrites.length) return;
        var me = $("html");
        var r = '';
        var style = null;
        $.each(document.styleSheets, function() {
            var href = this.href;
            if (!href || done[href]) return;
            done[href] = true;

            var options = {
                url: href,
                global: false,
                async: !sync,
                dataType: 'text',
                success: function(text) {
                    text = text.replace(comment, ' ').replace(/[\n\r\t ]+/g, ' ');
                    for (var j = 0; j < rewrites.length; j++) {
                        r += rewrites[j](text);
                    }
                    if (r) {
                        (style || (style = $('<style type="text/css"/>').appendTo("head"))).text(r);
                    }
                },
                complete: function() {
                    me.dequeue("gcsCssRewrite");
                }
            };
            me.queue("gcsCssRewrite", function(){
                try {
                    $.ajax(options);
                } catch (e) {
                    options.complete();
                }
            });
        });
        me.dequeue("gcsCssRewrite");
    };

    $($.gcsRewriteCSS);
})(jQuery);
