jQuery(document).ready(function($) {
    $('.zebra p:odd').addClass('odd');
    $('table.chart tbody tr:odd').addClass('odd');
    
    $(document).ajaxComplete(function() {
        $('.zebra p:odd').addClass('odd');
        $('table.chart tbody tr:odd').addClass('odd');

        $('a.lightbox').fancybox();
    });
    
    // set up datepickers
    $('.datepicker').datepicker();
    
    $('.accordion').accordion();
    
    // set up progressbars
    $('.progressbar').each(function() {
        var pct = $(this).attr('title');
        var mytext = $('<span>' + $(this).html() + '</span>'); 
        $(this).html('').progressbar({ value: pct }).append(mytext);
    });
    
    // set up collapse/expand links
    $('a.collapse').live('click', function() {
        $('#' + $(this).attr('target')).slideUp();
        $(this).removeClass('collapse').addClass('expand');
        return false; 
    });
    $('a.expand').live('click', function() {
        $('#' + $(this).attr('target')).slideDown();
        $(this).removeClass('expand').addClass('collapse');
        return false; 
    });
    
    // auto user-flash opener/closer
    $('#user-flash').fadeIn('fast').delay(5000).slideUp();
    
    // user-flash closer link
    $('#user-flash a.closer').click(function() {
       $('#user-flash').slideUp(); 
    });
    
    // tabs ajax update
    $('a.ajax').click(function() {
        updateDiv = $('#'+$(this).attr('target'));
        fetchUrl = $(this).attr('href');
        updateDiv.load(fetchUrl);
        return false; 
    });
    
    // ajax loader start/stop
    $('#ajax-loader').ajaxStart(function() {
       $(this).css('display', 'block')
              .css('float', 'left');
    });
    $('#ajax-loader').ajaxStop(function() {
       $(this).fadeOut();
    });
    
    // lightbox setup
    $('a.lightbox').fancybox({
       autoDimensions: true
    });
    
    // list striping
    $('ul.striped li:odd').addClass('odd');
});

//regexp split since browsers are ridonkulus
/* Cross-Browser Split 1.0.1
(c) Steven Levithan <stevenlevithan.com>; MIT License
An ECMA-compliant, uniform cross-browser split method */

var cbSplit;

// avoid running twice, which would break `cbSplit._nativeSplit`'s reference to the native `split`
if (!cbSplit) {

    cbSplit = function (str, separator, limit) {
        // if `separator` is not a regex, use the native `split`
        if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
            return cbSplit._nativeSplit.call(str, separator, limit);
        }

        var output = [],
            lastLastIndex = 0,
            flags = (separator.ignoreCase ? "i" : "") +
                    (separator.multiline  ? "m" : "") +
                    (separator.sticky     ? "y" : ""),
            separator = RegExp(separator.source, flags + "g"), // make `global` and avoid `lastIndex` issues by working with a copy
            separator2, match, lastIndex, lastLength;

        str = str + ""; // type conversion
        if (!cbSplit._compliantExecNpcg) {
            separator2 = RegExp("^" + separator.source + "$(?!\\s)", flags); // doesn't need /g or /y, but they don't hurt
        }

        /* behavior for `limit`: if it's...
        - `undefined`: no limit.
        - `NaN` or zero: return an empty array.
        - a positive number: use `Math.floor(limit)`.
        - a negative number: no limit.
        - other: type-convert, then use the above rules. */
        if (limit === undefined || +limit < 0) {
            limit = Infinity;
        } else {
            limit = Math.floor(+limit);
            if (!limit) {
                return [];
            }
        }

        while (match = separator.exec(str)) {
            lastIndex = match.index + match[0].length; // `separator.lastIndex` is not reliable cross-browser

            if (lastIndex > lastLastIndex) {
                output.push(str.slice(lastLastIndex, match.index));

                // fix browsers whose `exec` methods don't consistently return `undefined` for nonparticipating capturing groups
                if (!cbSplit._compliantExecNpcg && match.length > 1) {
                    match[0].replace(separator2, function () {
                        for (var i = 1; i < arguments.length - 2; i++) {
                            if (arguments[i] === undefined) {
                                match[i] = undefined;
                            }
                        }
                    });
                }

                if (match.length > 1 && match.index < str.length) {
                    Array.prototype.push.apply(output, match.slice(1));
                }

                lastLength = match[0].length;
                lastLastIndex = lastIndex;

                if (output.length >= limit) {
                    break;
                }
            }

            if (separator.lastIndex === match.index) {
                separator.lastIndex++; // avoid an infinite loop
            }
        }

        if (lastLastIndex === str.length) {
            if (lastLength || !separator.test("")) {
                output.push("");
            }
        } else {
            output.push(str.slice(lastLastIndex));
        }

        return output.length > limit ? output.slice(0, limit) : output;
    };

    cbSplit._compliantExecNpcg = /()??/.exec("")[1] === undefined; // NPCG: nonparticipating capturing group
    cbSplit._nativeSplit = String.prototype.split;

} // end `if (!cbSplit)`

// for convenience...
String.prototype.split = function (separator, limit) {
    return cbSplit(this, separator, limit);
};


