View difference between Paste ID: ws4srSsB and c58fPwTL
SHOW: | | - or go back to the newest paste.
1
<!DOCTYPE html>
2
<html>
3
<head>
4
	<title>Metro progress ring</title>
5
	<script type="text/javascript" src="metro.js"></script>
6
	<style type="text/css">
7
	.circle {
8
		height: 4px;
9
		width: 4px;
10
		list-style: disc;
11
		list-style-position: inside;
12
	}
13
	</style>
14
</head>
15
<body>
16
17
	<script type="text/javascript">
18
	(function (window, document, lib, undefined) {
19
	    "use strict";
20
	    if (lib == undefined || !lib instanceof Assembly) throw "LoadingBar must be part of an assembly.";
21
22
	    lib.ProgressRing = function (args /* { element : document element, numCircles : integer } */) {
23
	        var args = args == undefined ? { numCircles: this.numCircles, element: document.createElement('ul')} : args;
24
	        this.numCircles = args.numCircles == undefined ? this.numCircles : typeof args.numCircles == 'number' ? args.numCircles : this.numCircles;
25
	        this.element = args.element == undefined ? document.createElement('ul') : args.element;
26
	        this.element.className = 'progress-circle';
27
	        this.element.style.overflow = 'hidden';
28
	        this.setDimensions();
29
	        var _this = this;
30
	        window.addEventListener('resize', function () { _this.setDimensions() });
31
	        return this;
32
	    }
33
	    lib.ProgressRing.prototype = {
34
35
	        constructor: lib.ProgressRing,
36
	        interval: null,
37
	        element: null,
38
	        numCircles: 5,
39
	        animationSpeed: 20,
40
	        circleDisplacemenetSpeed: Math.PI,
41
	        speedUpPercentage: 0,
42
	        dimensions: new lib.Vector2(),
43
	        speedUpRange: [new lib.Vector2(256,256), new lib.Vector2(256,128)],
44
	        loops : 0,
45
	        pause : 0,
46
47
	        setDimensions: function () {
48
	            this.element.style.width = 256 + 'px';
49
	            this.element.style.height = 256 + 'px';
50
	            this.dimensions = new lib.Vector2(parseInt(this.element.style.width), parseInt(this.element.style.height));
51
	            this.midPoint = this.dimensions.clone().half();
52
	        },
53
54
	        circles : [],
55
56
	        addCirlce: function () {
57
	        	var circle = {};
58
	        	circle.element = document.createElement('li');
59
	            circle.element.className = 'circle';
60
	            circle.element.style.position = 'fixed';
61
	            //circle.element.style.display = 'block';
62
	            circle.angle = 0;
63
	            this.element.appendChild(circle.element);
64
	            this.circles.push(circle);
65
	            return circle;
66
	        },
67
68
	        removeCirlce: function (index) {
69
	            this.element.removeChild(this.circles[index].element);
70
	            this.circles.pop(this.circles[index])
71
	        },
72
73
	        clearCircles: function () {
74
	            while (this.element.hasChildNodes()) {
75
	                this.element.removeChild(this.element.lastChild);
76
	            }
77
	        },
78
79
	        start: function () {
80
	            this.stop();
81
	            this.loops = 0;
82
	            for (var i = 0; i < this.numCircles; i++)
83
	            {
84
	            	var circle = this.addCirlce()
85
                    circle.angle = ( (360/this.numCircles)*i);
86
87
                    var left = this.midPoint.x + Math.cos( circle.angle * Math.PI / 180 ) * this.midPoint.x;
88
                    var top = this.midPoint.y + Math.sin( circle.angle * Math.PI / 180 ) * this.midPoint.y;
89
90
                    circle.element.style.left = Math.floor(left) + 'px';
91
                    circle.element.style.top = Math.floor(top) + 'px';
92
	            }
93
	            this.speedUpPercentage = this.circles.length * 50;
94
95
	            var _this = this;
96-
	            return setTimeout( function(){ _this.animate();
96+
	            setTimeout( function(){ _this.animate() }, this.pause );
97
	            this.pause = 1000;
98
	        },
99
	        animate: function () {
100
101
	        	if( this.circles.length == 0 ) return this.start();
102
103
	            for (var i in this.circles)
104
	            {
105
	            	if (typeof this.circles[i] == 'object') 
106
	                {
107
	                    var position = new lib.Vector2(parseInt(this.circles[i].element.style.left),parseInt(this.circles[i].element.style.top));
108
	                    if( position.isBetween(this.speedUpRange[0],this.speedUpRange[1]))
109
	                    {
110
	                    	this.circles[i].angle += (this.circleDisplacemenetSpeed * (this.speedUpPercentage/100));
111
	                    }
112
	                    else
113
	                    {
114
	                		this.circles[i].angle += this.circleDisplacemenetSpeed;
115
	                	}
116
117
	                	//if(i == 0 ) console.log(Math.cos( this.circles[i].angle * Math.PI / 360 )*Math.sin( this.circles[i].angle * Math.PI / 360 ))
118
119
	                    var x = this.midPoint.x + Math.cos( this.circles[i].angle * Math.PI / 360 ) * this.midPoint.x;
120
	                    var y = this.midPoint.y + Math.sin( this.circles[i].angle * Math.PI / 360 ) * this.midPoint.y;
121
122
	                    this.circles[i].element.style.left = Math.floor(x) + 'px';
123
	                    this.circles[i].element.style.top = Math.floor(y) + 'px';
124
125
	                    if( position.isBetween(this.speedUpRange[0],this.speedUpRange[1]) && this.loops > 450 )
126
	                    {
127
	                    	this.removeCirlce(i);
128
	                    }
129
	        		}
130
	        	}
131
	        	var _this = this;
132
	        	this.loops++;
133
	        	//console.log(this.loops)
134
	            this.interval = setTimeout(function () { _this.animate(); }, _this.animationSpeed);
135
	        },
136
	        reset: function () {
137
	            this.clearCircles();
138
	            clearTimeout(this.interval);
139
	        },
140
	        stop: function () {
141
	            this.loops = 0;
142
	            this.clearCircles();
143
	            clearTimeout(this.interval);
144
	        }
145
	    }
146
	})(window, document, Metro)
147
148
	var lol = new Metro.ProgressRing();
149
	document.body.appendChild( lol.element );
150
	lol.start();
151
	</script>
152
153
</body>
154
</html>