1 (function ($, rf) { 2 3 rf.ui = rf.ui || {}; 4 5 var defaultOptions = { 6 interval: 1000, 7 minValue: 0, 8 maxValue: 100 9 }; 10 11 var stateSelectors = { 12 initial: '> .rf-pb-init', 13 progress: '> .rf-pb-rmng', 14 finish: '> .rf-pb-fin' 15 }; 16 17 // Constructor definition 18 rf.ui.ProgressBar = function(componentId, options) { 19 // call constructor of parent class 20 $super.constructor.call(this, componentId); 21 this.__elt = this.attachToDom(); 22 this.options = $.extend(this.options, defaultOptions, options || {}); 23 this.enabled = this.options.enabled; 24 this.minValue = this.options.minValue; 25 this.maxValue = this.options.maxValue; 26 27 this.__setValue(this.options.value || this.options.minValue /* TODO - check with Ilya */); 28 29 if (this.options.resource) { 30 this.__poll(); 31 } else if (this.options.submitFunction) { 32 this.submitFunction = new Function("beforeUpdateHandler", "afterUpdateHandler", "params", "event", this.options.submitFunction); 33 this.__poll(); 34 } 35 36 if (this.options.onfinish) { 37 rf.Event.bind(this.__elt, "finish", new Function("event", this.options.onfinish)); 38 } 39 }; 40 41 // Extend component class and add protected methods from parent class to our container 42 rf.BaseComponent.extend(rf.ui.ProgressBar); 43 44 // define super class link 45 var $super = rf.ui.ProgressBar.$super; 46 47 $.extend(rf.ui.ProgressBar.prototype, (function() { 48 return { 49 name: "ProgressBar", 50 51 __isInitialState: function() { 52 return parseFloat(this.value) < parseFloat(this.getMinValue()); 53 }, 54 55 __isProgressState: function() { 56 return !this.__isInitialState() && !this.__isFinishState(); 57 }, 58 59 __isFinishState: function() { 60 return parseFloat(this.value) >= parseFloat(this.getMaxValue()); 61 }, 62 63 __beforeUpdate: function(event) { 64 if (event.componentData && typeof event.componentData[this.id] != 'undefined') { 65 this.setValue(event.componentData[this.id]); 66 } 67 }, 68 69 __afterUpdate: function(event) { 70 this.__poll(); 71 }, 72 73 __onResourceDataAvailable: function(data) { 74 var parsedData = rf.parseJSON(data); 75 if (parsedData instanceof Number || typeof parsedData == 'number') { 76 this.setValue(parsedData); 77 } 78 79 this.__poll(); 80 }, 81 82 __submit: function() { 83 if (this.submitFunction) { 84 this.submitFunction.call(this, $.proxy(this.__beforeUpdate, this), $.proxy(this.__afterUpdate, this), 85 this.__params || {}); 86 } else { 87 $.get(this.options.resource, this.__params || {}, $.proxy(this.__onResourceDataAvailable, this), 'text'); 88 } 89 }, 90 91 __poll: function(immediate) { 92 if (this.enabled) { 93 if (immediate) { 94 this.__submit(); 95 } else { 96 this.__pollTimer = setTimeout($.proxy(this.__submit, this), this.options.interval); 97 } 98 } 99 }, 100 101 __calculatePercent: function(v) { 102 var min = parseFloat(this.getMinValue()); 103 var max = parseFloat(this.getMaxValue()); 104 var value = parseFloat(v); 105 if (min < value && value < max) { 106 return (100 * (value - min))