/* * @ Dmitry Farafonov */ (function($){ $.ProgressBar = function(options) { this.element = $(options.boundingBox); if (options.on && options.on.complete){ this.onComplete = options.on.complete; } if (options.on && options.on.valueChange){ this.onValueChange = options.on.valueChange; } this._create(); if (options.label) this.set("label", options.label); if (options.value) this.value(options.value); if (options.max) this.set("max", options.max); }; $.ProgressBar.prototype = { options: { value: 0, max: 100 }, min: 0, _create: function() { this.element .addClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) .attr({ role: "progressbar", "aria-valuemin": this.min, "aria-valuemax": this.options.max, "aria-valuenow": this._value() }); this.valueDiv = $( "
" ) .appendTo( this.element ); this.valueDiv = $( "" ) .appendTo( this.element ); this.oldValue = this._value(); this._refreshValue(); }, _destroy: function() { this.element .removeClass( "ui-progressbar ui-widget ui-widget-content ui-corner-all" ) .removeAttr( "role" ) .removeAttr( "aria-valuemin" ) .removeAttr( "aria-valuemax" ) .removeAttr( "aria-valuenow" ); this.valueDiv.remove(); }, value: function( newValue ) { if ( newValue === undefined ) { return this._value(); } this._setOption( "value", newValue ); return this; }, _setOption: function( key, value ) { if ( key === "value" ) { //var oldVal = this.options.value; this.options.value = value; this._refreshValue(); if (this.onValueChange) this.onValueChange.apply(this, [{oldVal: this.oldValue, newVal: value}]); if ( this._value() === this.options.max ) { //this._trigger( "complete" ); if (this.onComplete) this.onComplete.apply(this); } } else if (key === "label") { $(this.element).find(".ui-progressbar-label").html(value); } else if (key === "max") { this.options.max = value; } //this._super( key, value ); }, _value: function() { var val = this.options.value; // normalize invalid value if ( typeof val !== "number" ) { val = 0; } return Math.min( this.options.max, Math.max( this.min, val ) ); }, _percentage: function() { return 100 * this._value() / this.options.max; }, _refreshValue: function() { var value = this.value(), percentage = this._percentage(); if ( this.oldValue !== value ) { this.oldValue = value; //this._trigger( "change" ); } this.valueDiv .toggle( value > this.min ) .toggleClass( "ui-corner-right", value === this.options.max ) .width( percentage.toFixed(0) + "%" ); this.element.attr( "aria-valuenow", value ); //$(this.element).find(".ui-progressbar-label").html(value + "%"); }, set: function(key, value){ this._setOption(key, value); } }; })( jQuery );