Edit in JSFiddle

/**
 * jquery progressbar plugin
 * company: tribal-china
 * author: Andrew
 * date: 2011-09-25
 * version: 1.1.0
 */
;
(function($) {

    // all plugin method
    var methods = {
        // init progress bar 
        init: function(options) {

            var opts = $.extend({}, $.fn.progressbar.settings, options);

            return this.each(function() {

                var data = $(this).data('progressbar');

                // check whether plugin has been init
                if (!data) {

                    var percent = '0%';
                    if (opts.value > opts.min) {
                        percent = Math.round((opts.value - opts.min) / (opts.max - opts.min) * 100) + '%';
                    }

                    var $barCon = $(this).css({
                        width: opts.width,
                        height: opts.height
                    }).addClass('progressbar').data('progressbar', {
                        min: opts.min,
                        max: opts.max,
                        value: opts.value,
                        started: false
                    });

                    var $bar = $('<div />').css({
                        width: percent,
                        height: opts.height
                    }).addClass('progressbar-value').appendTo($barCon);

                    // bind custom event with namespace '.progressbar'
                    $barCon.bind('change.progressbar', opts.change).bind('complete.progressbar', opts.complete).bind('start.progressbar', opts.start);
                }
            });
        },

        // get min value
        getMin: function() {
            return this.data('progressbar').min;
        },

        // get max value
        getMax: function() {
            return this.data('progressbar').max;
        },

        // get current value
        getValue: function() {
            return this.data('progressbar').value;
        },

        // set current value
        setValue: function(val) {
            var min = methods.getMin.apply(this),
                max = methods.getMax.apply(this),
                baseData = this.data('progressbar');

            // trigger start event
            if (!baseData.started) {
                var startEvent = $.extend({}, baseData, {
                    type: 'start.progressbar'
                });

                this.trigger(startEvent);
                baseData.started = true;
            }

            if (val < min) val = min;
            if (val > max) val = max;
            baseData.value = val;

            var percent = Math.round((val - min) / (max - min) * 100) + '%';
            this.find('div.progressbar-value').animate({
                'width': percent
            }, function() {

                // trigger complete event
                if (val == max) {
                    var completeEvent = $.extend({}, baseData, {
                        type: 'complete.progressbar',
                        percent: percent
                    });

                    $(this).parent().trigger(completeEvent);
                }
            });

            var changeEvent = $.extend({}, baseData, {
                type: 'change.progressbar',
                percent: percent
            });

            // trigger change event
            this.trigger(changeEvent);
        }
    };

    // options or method
    $.fn.progressbar = function(method) {

        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if ($.isPlainObject(method)) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('progressbar plugin don not support method: ' + method + ', please check');
        }
    };

    // default settings 
    $.fn.progressbar.settings = {
        min: 0,
        max: 100,
        value: 0,
        height: 30,
        width: 200,
        start: function(event) {},
        change: function(event) {},
        complete: function(event) {}
    };
})(jQuery);


// for test
var count = 0;
done = false;
$('#progressbar').progressbar({
    min: 10,
    max: 110,
    height: 30,
    width: 200,
    complete: function(event) {
        done = true;
        console.log('job done');
    },
    change: function(event) {
        console.log(event.value);
    }
});
setTimeout(function() {
    count += Math.floor(Math.random() * 10);

    $('#progressbar').progressbar('setValue', count)

    if (done) return;

    setTimeout(arguments.callee, Math.floor(Math.random() * 1000));

}, Math.floor(Math.random() * 1000));
<div id="progressbar"></div>
.progressbar {
    border: 1px solid #acacac;
    border-radius: 8px;
    box-shadow: -1px 1px 5px #8c8c8c inset;
    background-color:#dcdcdc;
    overflow: hidden;
}
.progressbar-value {
    border-radius: 8px;
    background-color: #8EEB00;
}