|
2
|
1 |
/* Author: Raphaƫl Velt, IRI |
|
|
2 |
* |
|
|
3 |
* Licence: CeCILL-B - http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html |
|
|
4 |
* |
|
|
5 |
* */ |
|
|
6 |
|
|
|
7 |
Btv_Podium = function(data, opts) { |
|
|
8 |
this.options = opts || {}; |
|
|
9 |
this.options.container = this.options.container || 'podium'; |
|
|
10 |
this.options.spacing = this.options.spacing || 20; |
|
|
11 |
this.options.background = '#ffffff'; |
|
|
12 |
this.options.transitionDuration = this.options.transitionDuration || 200; |
|
|
13 |
this.$ = this.options.jquery || jQuery; |
|
|
14 |
this._$ = this.$('#' + this.options.container); |
|
|
15 |
if (!this._$.length) { |
|
|
16 |
var _el = document.createElement("div"); |
|
|
17 |
_el.id = this.options.container; |
|
|
18 |
document.body.appendChild(_el); |
|
|
19 |
this._$ = this.$(_el); |
|
|
20 |
} |
|
|
21 |
this.options.width = this.options.width || this._$.width(); |
|
|
22 |
this.options.height = this.options.height || this._$.height(); |
|
|
23 |
this.update(data, true); |
|
|
24 |
} |
|
|
25 |
|
|
|
26 |
Btv_Podium.prototype.update = function(data, noAnimate) { |
|
|
27 |
var _data = data || []; |
|
|
28 |
var i = 0; |
|
|
29 |
while (_data.length > this._$.children().length) { |
|
|
30 |
var _newCol = document.createElement("div"); |
|
|
31 |
this.$(_newCol).css({ |
|
|
32 |
"float": "left", |
|
|
33 |
"background": this.options.background, |
|
|
34 |
"margin-top": this.options.height, |
|
|
35 |
"width": 0, |
|
|
36 |
"height": 0, |
|
|
37 |
"margin-left": 0 |
|
|
38 |
}); |
|
|
39 |
this._$.append(_newCol); |
|
|
40 |
i++; |
|
|
41 |
if (i > 10) { |
|
|
42 |
break; |
|
|
43 |
} |
|
|
44 |
} |
|
|
45 |
while (_data.length < this._$.children().length) { |
|
|
46 |
this._$.children().last().detach(); |
|
|
47 |
} |
|
|
48 |
if (_data.length) { |
|
|
49 |
var _max = _data.reduce(function(_memo, _val) { |
|
|
50 |
return Math.max(_memo, _val); |
|
|
51 |
}, 1), |
|
|
52 |
_scale = this.options.height / _max, |
|
|
53 |
_spacing = Math.min(this.options.spacing, Math.floor(.5*this.options.width/_data.length)), |
|
|
54 |
_width = Math.floor(( this.options.width - (_data.length - 1) * _spacing) / _data.length), |
|
|
55 |
_this = this; |
|
|
56 |
this._$.children().each(function(_i, _e) { |
|
|
57 |
var _height = _scale * _data[_i], |
|
|
58 |
_css = { |
|
|
59 |
"margin-top": _this.options.height - _height, |
|
|
60 |
"height": _height, |
|
|
61 |
"width": _width, |
|
|
62 |
"margin-left": (_i ? _spacing : 0) |
|
|
63 |
} |
|
|
64 |
if (noAnimate) { |
|
|
65 |
_this.$(_e).css(_css); |
|
|
66 |
} else { |
|
|
67 |
_this.$(_e).animate(_css); |
|
|
68 |
} |
|
|
69 |
}); |
|
|
70 |
} |
|
|
71 |
} |