ux/TimePicker.js
[roojs1] / ux / TimePicker.js
1
2
3  
4            
5 Roo.form.TimePicker = function(config){
6     
7     Roo.log("CTOR CALLED");
8     // these are required... error out if not avail..
9     var deps = true;
10     if (typeof(Raphael) == 'undefined') {
11         deps = false;
12     }
13     if (deps && typeof(Raphael.prototype) == 'undefined') {
14         deps = false;
15     }
16     if (!deps) {
17         Roo.log("Error - required components not found  - Raphael and piechart"); 
18         return;
19     }
20     
21     Roo.form.TimePicker.superclass.constructor.call(this, config);
22 };
23
24 Roo.extend(Roo.form.TimePicker , Roo.form.DisplayField ,  {
25     
26     paper : false,
27     width: 280,
28     height: 250,
29     
30     startHour : '7:30',
31     endHour : '19:15',
32     
33     tdisplay  : false,
34     
35     onRender : function(ct, position){
36         
37         Roo.form.DisplayField.superclass.onRender.call(this, ct, position);
38         //if(this.inputValue !== undefined){
39         this.wrap = this.el.wrap();
40         
41         this.viewEl = this.wrap.createChild({ tag: 'div', cls: 'x-form-displayfield'});
42         
43         
44         //?? needed??
45         if (this.bodyStyle) {
46             this.viewEl.applyStyles(this.bodyStyle);
47         }
48         //this.viewEl.setStyle('padding', '2px');
49         
50         this.viewEl.setHeight(this.height);
51         this.viewEl.setWidth(this.width);
52         
53         var open = this.startHour.split(':').shift() * 1;
54         var close = this.endHour.split(':').shift() * 1;
55         
56         var paper = this.paper = Raphael(this.viewEl.dom);
57         
58         paper.setSize(this.width,this.height);
59         
60         this.renderPaper(open,close);
61     },
62     
63     
64     
65     renderPaper : function( open , close )
66     { 
67         // let's create a pie chart...
68         
69         var paper = this.paper;
70         this.paper.clear();
71         
72         var data = [];
73         var colors = [];
74         
75         // say we open for 7 - 19
76         
77         open *= 1;
78         close *=1;
79         Roo.log([open, close]);
80         data.push(open);
81         
82         // colours should be configurable...
83         
84         colors.push('#003'); // off hour..
85         //var clr = [ '#003' , '#FCC' , '#FEE', '#FCC'];
86         var clr = [ '#FEE', '#FCC' ];
87                    
88         var times = [ '' ];
89         
90         for (var i = open; i < close ;i++) {
91             data.push(1);
92             if (i < 10) {
93                 times.push( '0'  + i);
94             } else { 
95                 times.push( '' + i);
96             }
97             colors.push(clr[i % clr.length]);
98         }
99         data.push( 24-close );
100         colors.push('#003');
101         
102         //Roo.log(data.length);
103         //Roo.log(JSON.stringify(data));
104         //Roo.log(JSON.stringify(colors));
105         //Roo.log(colors.length);
106
107         var outerpie = this.outerpie = paper.piechart(
108             paper.width  / 2,
109             paper.height  / 2 ,
110             110,
111             data ,
112             { 
113                 cut: data.length   ,
114                 colors :  colors,
115                 no_sort : true,
116                 start_angle :  270
117             }
118         );
119         
120         
121         // fill in th emiddle...
122         
123         paper.circle(outerpie.cx,outerpie.cy, 90).attr({fill: "#fff"})
124         // fixme .. add the quater hour segments..
125         
126         var innerpie = this.innerpie = paper.piechart(
127             paper.width  / 2,
128             paper.height  / 2 ,
129             80,
130             [ 1 , 1 ,1 , 1 ],
131             { 
132                 cut: 4   ,
133                 colors :   [ '#FEE', '#FCC' ,'#FEE', '#FCC' ] ,
134                 no_sort : true,
135                 start_angle :  90
136             }
137         );
138
139         paper.circle(outerpie.cx,outerpie.cy, 60).attr({fill: "#fff"})
140  
141         
142       
143         var tdisplay  = this.tdisplay = paper.text(outerpie.cx,outerpie.cy, "Pick\nTime").attr({
144                 font: "32px  'Lucida Sans Unicode', 'Lucida Grande', sans-serif",
145                 weight: 'bold', fill: '#000' });
146         
147         
148         
149         
150         
151         for (var i = 0; i < (24/3); i++) {
152             var angle = ( (360/24) * i * -3 )  -90;
153             var p = outerpie.sector(outerpie.cx, outerpie.cy, 120, angle, angle, false);
154             var innerp = outerpie.sector(outerpie.cx, outerpie.cy, 70, angle, angle, false);
155
156             Roo.log([p[4],p[5], (i*3)+':00']);
157             
158             var hr = (i*3);
159             
160             var txt = (hr < 12 ? hr : (hr-12)) +  (hr < 12 ? 'am' : 'pm');
161             if (!hr) { txt  = ""; }
162             if (hr == 12) {
163                 txt= '12 noon'
164             }
165             
166             paper.text(p[4],p[5], txt);
167             // inner...
168             if (i%2 ==1) {
169                 continue;
170             }
171             paper.text(innerp[4],innerp[5], ((Math.floor(i/2) * 15) + 30) % 60);
172             
173             
174         }
175         var asector = false;
176
177         var _t = this;
178         outerpie.hover(
179              // in?
180             function() {
181                 Roo.log(this.j);
182                 if (!this.j || this.j == data.length -1) {
183                     return;
184                 }
185                 var ov = _t.getValue();
186                
187                 this.sector.stop();
188                 
189                  
190                 if (this.sector != asector) {
191                     this.sector.scale(1.1, 1.1, this.cx, this.cy);
192                 }
193             
194                 var min = ov ? _t.getValue().split(':').pop() : '00';
195                 var ntime = times[this.j] + ':' + min;
196                 tdisplay.attr( { text : _t.formatTime(ntime) });
197                  
198                 
199             },
200              // out..?
201             function () {
202                 if (!this.j || this.j == data.length) {
203                     return;
204                 }
205                 if (this.sector != asector) {
206                     this.sector.animate({ transform: 's1 1 ' + this.cx + ' ' + this.cy }, 500, "bounce");
207                 }
208                     
209                 tdisplay.attr( { text : _t.formatTime(_t.getValue()) } );
210              
211         });
212         outerpie.click(function() {
213             if (!this.j || this.j == data.length -1) {
214                 return;
215             }
216            
217             var ov = _t.getValue();
218             var min = ov ? _t.getValue().split(':').pop() : '00';
219             var ntime = times[this.j] + ':' + min;
220             _t.setValue(ntime);
221             
222             if (asector) {
223                 // reset 
224                 asector.transform( 's1 1');
225             }
226             
227             //this.sector.scale(1.1, 1.1, this.cx, this.cy);
228             asector = this.sector;
229  
230             
231         });
232         
233          var bsector = false;
234
235          innerpie.hover(
236              // in?
237             function() {
238                 Roo.log(this.j);
239                 /*
240                 if (!this.j || this.j == data.length -1) {
241                     return;
242                 }
243                 */
244                 this.sector.stop();
245                 if (this.sector != bsector) {
246                     this.sector.scale(1.1, 1.1, this.cx, this.cy);
247                 }
248                 var min = this.j*15;
249                  min = min ? min : '00';
250                 
251                 var ov = _t.getValue();
252                 var hr = ov ? _t.getValue().split(':').shift() : '12';
253                 var ntime = hr + ':' + min;
254                 tdisplay.attr( { text : _t.formatTime(ntime) });
255                  
256                 
257             },
258              // out..?
259             function () {
260                 /*
261                 if (!this.j || this.j == data.length) {
262                     return;
263                 }
264                 */
265                 if (this.sector != bsector) {
266                     this.sector.animate({ transform: 's1 1 ' + this.cx + ' ' + this.cy }, 500, "bounce");
267                 }
268  
269                 tdisplay.attr( { text : _t.formatTime(_t.getValue()) } );
270              
271         });
272         innerpie.click(function() {
273              
274             Roo.log(this.j);
275             var min = this.j*15;
276             min = min ? min : '00';
277                 
278              
279             var ov = _t.getValue();
280             var hr = ov ? _t.getValue().split(':').shift() : '12';
281             var ntime = hr + ':' + min;
282             _t.setValue(ntime);
283             //tdisplay.attr( { text : _t.formatTime(ntime) });
284             
285             //var ov = _t.getValue();
286             //var min = ov ? _t.getValue().split(':').pop() : '00';
287             //var ntime = times[this.j] + ':' + min;
288             //_t.setValue(ntime);
289             
290             if (bsector) {
291                 bsector.transform( 's1 1');
292             }
293             
294             //this.sector.scale(1.1, 1.1, this.cx, this.cy);
295             bsector = this.sector;
296  
297             
298         });
299         
300         
301         
302         
303         
304         
305         //pie.each(function() { Roo.log(this)});
306         //this.setValue(this.value);
307     },
308     setValue : function(v){
309         this.value = v;
310         if (!this.viewEl) {
311             return;
312         }
313         //this.viewEl.dom.innerHTML = html;
314         Roo.form.DisplayField.superclass.setValue.call(this, v);
315         if (this.tdisplay) {
316             this.tdisplay.attr( { text : this.formatTime(v) } );
317         }
318
319     },
320     formatTime : function(ntime)
321     {
322         if (!ntime) {
323             return "Pick\nTime";
324         }
325         if (ntime == '00:00') {
326             return "Midnight";
327         }
328         if (ntime == '12:00') {
329             return "12\nnoon";
330         }
331         Roo.log(ntime);
332         var d = Date.parseDate(ntime, "H:i");
333         return d.format('h:i') + "\n" + d.format('a')  ; 
334         
335         
336         
337     }
338     
339 });