/**
 * Extends $ with common graphite functions
 */
$.extend({
    graphite: {

        blockButtons: function()
        {
            $('.buttons').block({ message: null, overlayCSS: {
                paddingTop: '12px',
                backgroundColor: '#4A4E50',
                opacity: '0.5'
            }, baseZ: 900 });
        },

        unblockButtons: function()
        {
            $('.buttons').unblock();
        },

        /**
         * Templating
         */
        tmpl: function(template, data)
        {
            if ($.isArray(template))
            {
                template = template.join('');
            }

            return tmpl(template, data);
        },

        /**
         * Common utils
         */
        utils: {

            /**
             * String utils
             */
            string: {
                ucfirst: function(str)
                {
                    return str.charAt(0).toUpperCase() + str.substring(1);
                },

                leftPad: function(str, count, padding)
                {
                    padding = padding || ' ';

                    var zeropad = str.toString();

                    while(zeropad.length < count)
                    {
                        zeropad = padding + zeropad;
                    }

                    return zeropad;
                }
            },

            /**
             * Number utils
             */
            number: {

                /**
                 * Format number with a comma
                 */
                formatWithComma: function(number)
                {
                    if (isNaN(number))
                    {
                        return number;
                    }

                    var asString = (number % 1000).toString();

                    var x = parseInt(number / 1000, 10);

                    while (x > 0)
                    {
                        asString = (x % 1000) + ',' + $.graphite.utils.string.leftPad(asString, 3, '0');
                        x = parseInt(x / 1000, 10);
                    }

                    return asString;
                },

                /**
                 * Get a random integer
                 */
                random: function()
                {
                    return Math.floor(Math.random() * 1000000001);
                }

            },

            date: {
                format: function(date, format)
                {
                    var d = Date.fromString(date);
                    return d.asString(format);
                }
            },

            /**
             * ...
             */
            time: {
                format: function(time, format)
                {
                    var t = Time.fromString(time);
                    return t.asString(format);
                }
            }
        }

    }
});
