aboutsummaryrefslogtreecommitdiffstats
path: root/ui/source/effects.scale.js
blob: a19146b9ada25b958552f92ebf0c1edb2e5acc46 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
;(function($) {
	
	$.effects.puff = function(o) {
	
		return this.queue(function() {
	
			// Create element
			var el = $(this);
		
			// Set options
			var options = $.extend(true, {}, o);
			var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode
			var percent = parseInt(o.options.percent) || 150; // Set default puff percent
			options.fade = true; // It's not a puff if it doesn't fade! :)
			var original = {height: el.height(), width: el.width()}; // Save original
		
			// Adjust
			var factor = percent / 100;
			el.from = (mode == 'hide') ? original : {height: original.height * factor, width: original.width * factor};
		
			// Animation
			options.from = el.from;
			options.percent = (mode == 'hide') ? percent : 100;
			options.mode = mode;
		
			// Animate
			el.effect('scale', options, o.duration, o.callback);
			el.dequeue();
		});
		
	};

	$.effects.scale = function(o) {
		
		return this.queue(function() {
		
			// Create element
			var el = $(this);

			// Set options
			var options = $.extend(true, {}, o);
			var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
			var percent = parseInt(o.options.percent) || (parseInt(o.options.percent) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent
			var direction = o.options.direction || 'both'; // Set default axis
			var origin = o.options.origin; // The origin of the scaling
			if (mode != 'effect') { // Set default origin and restore for show/hide
				origin = origin || ['middle','center'];
				options.restore = true;
			}
			var original = {height: el.height(), width: el.width()}; // Save original
			el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state
		
			// Adjust
			var factor = { // Set scaling factor
				y: direction != 'horizontal' ? (percent / 100) : 1,
				x: direction != 'vertical' ? (percent / 100) : 1
			};
			el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state
			if (origin) { // Calculate baseline shifts
				var baseline = $.effects.getBaseline(origin, original);
				el.from.top = (original.height - el.from.height) * baseline.y;
				el.from.left = (original.width - el.from.width) * baseline.x;
				el.to.top = (original.height - el.to.height) * baseline.y;
				el.to.left = (original.width - el.to.width) * baseline.x;
			};
			if (o.options.fade) { // Fade option to support puff
				if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;};
				if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;};
			};
		
			// Animation
			options.from = el.from; options.to = el.to; options.mode = mode;
		
			// Animate
			el.effect('size', options, o.duration, o.callback);
			el.dequeue();
		});
		
	};
	
	$.effects.size = function(o) {

		return this.queue(function() {
			
			// Create element
			var el = $(this), props = ['position','top','left','width','height','overflow','opacity'];
			var props1 = ['position','overflow','opacity']; // Always restore
			var props2 = ['width','height','overflow']; // Copy for children
			var cProps = ['fontSize'];
			var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom'];
			var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight'];
			
			// Set options
			var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode
			var restore = o.options.restore || false; // Default restore
			var scale = o.options.scale || 'both'; // Default scale mode
			var original = {height: el.height(), width: el.width()}; // Save original
			el.from = o.options.from || original; // Default from state
			el.to = o.options.to || original; // Default to state
			
			// Adjust
			var factor = { // Set scaling factor
				from: {y: el.from.height / original.height, x: el.from.width / original.width},
				to: {y: el.to.height / original.height, x: el.to.width / original.width}
			};
			if (scale == 'box' || scale == 'both') { // Scale the css box
				if (factor.from.y != factor.to.y) { // Vertical props scaling
					props = props.concat(vProps);
					el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from);
					el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to);
				};
				if (factor.from.x != factor.to.x) { // Horizontal props scaling
					props = props.concat(hProps);
					el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from);
					el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to);
				};
			};
			if (scale == 'content' || scale == 'both') { // Scale the content
				if (factor.from.y != factor.to.y) { // Vertical props scaling
					props = props.concat(cProps);
					el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from);
					el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to);
				};
			};
			$.effects.save(el, restore ? props : props1); el.show(); // Save & Show
			$.effects.createWrapper(el); // Create Wrapper
			el.css('overflow','hidden').css(el.from); // Shift
			
			// Animate
			if (scale == 'content' || scale == 'both') { // Scale the children
				vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size
				hProps = hProps.concat(['marginLeft','marginRight']); // Add margins
				props2 = props.concat(vProps).concat(hProps); // Concat
				el.find("*[width]").each(function(){
					child = $(this);
					if (restore) $.effects.save(child, props2);
					var c_original = {height: child.height(), width: child.width()}; // Save original
					child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x};
					child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x};
					if (factor.from.y != factor.to.y) { // Vertical props scaling
						child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from);
						child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to);
					};
					if (factor.from.x != factor.to.x) { // Horizontal props scaling
						child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from);
						child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to);
					};
					child.css(child.from); // Shift children
					child.animate(child.to, o.duration, o.options.easing, function(){
						if (restore) $.effects.restore(child, props2); // Restore children
					}); // Animate children
				});
			};
			
			// Animate
			el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() {
				if(mode == 'hide') el.hide(); // Hide
				$.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore
				if(o.callback) o.callback.apply(this, arguments); // Callback
				el.dequeue();
			}}); 
			
		});

	};
	
})(jQuery);