b4ef47db6a7c08c599ee90cd7f536c9aa27e6cde
[web.mtrack] / MTrackWeb / templates / images / mtrack.js / mtrack2.core.js
1 //<Script type="text/javascript">
2
3 /**
4  * Roo conversion....
5  * 
6  * pretty much rewritten by now... most of this code is getting moved to the interface
7  * classes..
8  *
9  * uses a simple  registry - all code get's added to it, 
10  * then whenever html is loaded via AJAX, we can run run through the handlers and add them.
11  * 
12  */
13
14
15
16 MTrack = {
17     init : function()
18     {
19         
20         Roo.onReady(function () {
21             //MTrack.footerSetAndWait();
22             if (authUser) {
23                 window.setTimeout(MTrack.keepLoggedIn, 30000);
24                 
25             }
26          });
27      },
28      
29      
30     // this may be handled by Pman.Login class..
31     keepLoggedIn: function()
32     {
33         Roo.Ajax.request({
34             url : baseURL + '/Login.html',
35             method:  'POST',
36             data : { refresh : 1 },
37             success : function() {
38                 
39                 window.setTimeout(MTrack.keepLoggedIn, 30000);
40                 // what if it's false..currentURL = false;
41                 
42                 
43             }
44             
45         })
46         
47     },
48      
49      
50     registry : [],
51     /**
52      * usage:
53      * MTrack.register('a.changeset-link', 'each', function() ....)
54      * MTrack.register('a.changeset-link', 'on', 'click', function() ....)
55      * 
56      */
57     register : function( selector, method, arg1, arg2) 
58     {
59         MTrack.registry.push( {
60             selector : selector,
61             method : method,
62             event : method == 'on' ? arg1 : false,
63             args : method == 'on' ? arg2 : arg1 
64         });
65     },
66     
67     
68     addHandlers : function (toWhat) 
69     {
70         // forEach? - no IE support?
71         toWhat = toWhat || document.body; // 
72         // run the main registry
73         Roo.each(MTrack.registry, function(cfg) {
74             
75             if (typeof(cfg) != 'object') {
76                 return; // skip?
77             }
78             //Roo.log("Add select:" + cfg.selector);
79             var C = cfg;
80             try { 
81                 var el = Roo.get(toWhat).select(cfg.selector,true);
82                 Roo.log("Add select : "  + cfg.selector + ' ' + cfg.event);
83                 Roo.log(el);
84                 el[cfg.method].apply(el, cfg.event ? [ cfg.event, cfg.args ] : [ cfg.args ] );
85             } catch(e) {
86                 Roo.log("Error applying select:" + C.selector);
87                 Roo.log(e);
88                 // do not throw any more..
89                 
90             }
91         });
92         //Roo.log("DONE ADD SELECTORS");
93         // any other weird crap goes here.
94         
95         if (Roo.isGecko) {
96             try { 
97                 Roo.select(toWhat,true).select("form").set( { "autocomplete" : "off" });
98             } catch(e) {
99                 //Roo.log("")
100             }
101         }
102         // time ago 
103         //jQuery.timeago.settings.allowFuture = true;
104         //$(toWhat).find('abbr.timeinterval').timeago();
105         
106         // multipe select addon
107         //$(toWhat).find("select[multiple]").asmSelect({
108         //    addItemTarget: 'bottom',
109         //    animate: false,
110         //    highlight: false,
111         //    removeLabel: '[x]',
112         //    sortable: false
113         //});
114       
115     },
116     
117     currentURL : false,
118     missingHashRequest : false,
119     
120     
121     // This is the main body load tool...
122     // it still needs to handle anchors...
123     
124     
125     ajaxLoad : function(url,cp)
126     { 
127         if (!MTrackWeb.loaded) {
128             return;
129         }
130         MTrack.currentURL = url;
131
132         // different urls load in different tabs..
133         var u_ar = url.split(/\//);
134         u_ar.shift();
135         var pg = u_ar.shift();
136         if (!pg || !pg.length) {
137             pg = 'Browse'; // default..
138         }
139         pg = pg.split('.').shift();
140         Roo.log('pg:'   + pg);
141         switch(pg) {
142             case 'Report':
143             case 'Ticket':
144                 cp = MTrackWeb.Ticket;
145                 break;
146             case 'File':
147             case 'Browse':
148             case 'Log':
149             case 'Changeset':
150                 cp = MTrackWeb.TabCode;
151                 cp._url = url;
152                 MTrackWeb.Layout.layout.getRegion('center').showPanel(cp.panel);
153                 cp.panel.fireEvent('activate', cp.panel);
154                 return;
155                 
156             
157             // new style... panel activate handles loading..
158             case 'Timeline':
159             case 'Wiki':
160                 
161                 cp = MTrackWeb['Tab' + pg];
162                 cp._url = url;
163                 MTrackWeb.Layout.layout.getRegion('center').showPanel(cp.panel);
164                 cp.panel.fireEvent('activate', cp.panel);
165                 return;
166         }
167         
168         MTrackWeb.Layout.layout.getRegion('center').showPanel(cp.panel);
169         
170                 
171         
172         Roo.Ajax.request({
173             method: 'GET',
174             url : baseURL + url,
175             params : { ajax_body : 1 },
176             success : function(data) {
177                 //cp = cp && typeof(cp) == 'object' ? cp :  MTrack.layout.getRegion('center').getPanel(pgn);
178                 
179                 //MTrack.layout.getRegion('center').showPanel(pgn);
180                 
181                 cp.tpanel.setContent(data.responseText);
182                 MTrack.addHandlers(cp.tpanel.el.dom);
183                 MTrack.missingHashes(cp.tpanel.el,url);
184             }
185          });
186          return cp.tpanel;
187         /*
188          this was ours slidy code..
189         Roo.get(document.body).scrollTo('top',0,true);
190         this.currentURL = url;
191         var target = MTrack.ajaxbody.el.dom;//Roo.get("ajaxbody");
192         var content = Roo.get("content");
193         target.setStyle('position', 'relative');
194         
195         Roo.select('.mask').show(); // must show first?
196         Roo.select('.mask-loading').show();
197         // content has a border...
198         var t = content.getBox().y  ;// - Roo.get(document).getScroll().top;// - 13;
199         var l = content.getBox().x  ;// - Roo.get(document).getScroll().left;// - 13;
200         var w = content.getBox().width+ 26;
201         var h = content.getBox().height + 26;
202      
203         Roo.select('.mask').first().setLocation(l,t);
204         Roo.select('.mask').first().setSize( w , h, false  );
205         
206         Roo.select('.mask-loading').first().setLocation(
207                 l + ( w / 2) - 16, t +   16 
208         );
209         
210         //if (MTrack.missingHashRequest) {
211             Roo.Ajax.abort();
212         //    MTrack.missingHashRequest = false;
213         //}
214         Roo.get('loader').hide();
215         Roo.get('loader').setStyle('position', 'relative');
216         Roo.Ajax.request({
217             method: 'GET',
218             url : baseURL + url,
219             params : { ajax_body : 1 },
220             success : function(data) {
221                 
222                 Roo.select('.mask').hide();
223                 Roo.get('loader').update(data.responseText);
224                 Roo.get('loader').show();
225                 Roo.get('loader').setWidth( w );
226                 Roo.get('loader').setLocation( slideleft?  l+w : l-w , t  );
227                 
228                 // old layer - move it away..
229                 target.animate(
230                     {
231                         left: { from :  0  , to : slideleft ? -1 * w  : w }
232                     },
233                     .5,
234                     function() {
235                         // reset it at end of animation - as it ends up with the new content.
236                         //target.setLocation(  0 , t ); 
237                     },
238                     'easeOut', 'motion'
239                 );
240                 
241                 Roo.get('loader').animate(
242                     {
243                             left: { from : slideleft?  l+w : l-w , to : l  }
244                     },
245                     .5,
246                     function () {
247                         target.update( Roo.get('loader').dom.innerHTML);
248                         Roo.get('loader').hide();
249                         Roo.get('loader').update("");
250                         target.show();// make sure!!
251                         target.setLocation( l ,t  );
252                         
253                         MTrack.missingHashes(target,  url);
254                         MTrack.addHandlers(target);
255                         // scroll up...
256                         
257                     },
258                      'easeOut', 'motion'
259                 );
260             }
261             //console.log('loaded dif');
262             
263                
264         });
265       
266         return false;
267         */
268     },
269     
270     
271     missingHashRequest : false,
272     missingHashes: function(el,url) {
273         
274         
275         console.log('finding missing hashes?');
276         var hashes = [];
277         if (!el || !el.select('.browse-missing-hash')) {
278             return;
279         }
280         el.select('.browse-missing-hash').each(function() {
281             hashes.push(this.dom.id);
282         });
283         
284         if (!hashes.length) {
285             Roo.log("no missing hashes");
286             return;
287         }
288         Roo.Ajax.abort();
289         Roo.Ajax.request({
290             method : 'POST',
291             url : baseURL + url,
292             params : { hashes : hashes.join(',') },
293             success : function(res) {
294                 var data = Roo.decode(res.responseText);
295                 
296                 //console.log(data.data);
297                 if (data.data) {
298                     for(var hash in data.data) {
299                         var o = data.data[hash];
300                         Roo.select('#'+ hash).first().dom.innerHTML =  o.changeby + ' : ' + o.changelog;
301                         Roo.select('#age-'+ hash).first().dom.innerHTML = o.age ; // do magic replacement!!!
302                         Roo.select('#rev-'+ hash).first().dom.innerHTML = o.rev ; // do magic replacement!!!
303                         MTrack.addHandlers(Roo.select('#age-'+ hash).first());
304                         MTrack.missingHashRequest  = false;
305                     }
306                     
307                 }
308                // console.log(data)
309             }
310         });
311         
312     }  
313     
314     
315         
316 }
317
318 Roo.onReady(function() {
319     //MTrack.addHandlers(); // adds to main body..
320     // change project.
321      
322     
323     if (authUser) {
324         Pman.Login.authUser = authUser;
325     }
326     
327     
328     // let's try the magic...
329     
330     
331     
332      
333     Roo.XComponent.on('buildcomplete', function() {
334             
335         Roo.log("build complete!");
336         MTrackWeb.loaded = true;
337         var href = (window.location.pathname + window.location.search).substring(baseURL.length);
338         try { 
339             window.history.pushState( { url: href }, document.title , window.location.pathname + window.location.search );
340         } catch (e) {}
341         
342         MTrack.currentURL = href;
343     
344         var pgn = MTrack.ajaxLoad(href);
345      
346         MTrack.blockActivate = false;
347             
348     });    
349         // new version!?!?
350         // should be completly build by pman or xcomponent..
351         //Roo.XComponent.build()
352         
353         
354             Roo.XComponent.build();  
355
356         
357         
358         return;
359    
360     
361         
362         
363 });
364
365 MTrack.init();
366 /** this is the 'back' button handler.. */
367
368 try { 
369     window.onpopstate = function(ev) {
370          
371         if (!ev.state || typeof(ev.state.url) == 'undefined') {
372             return;
373         }
374         MTrack.ajaxLoad(ev.state.url, false);
375 };
376 } catch (e) {}
377     
378      
379
380 // any date picers.. - on milestones? - not used any more...
381 MTrack.register('.dateinput', 'each', function(e) {
382     var ee = new Roo.form.DateField({
383         dateFormat: 'Y-m-d' // nice and compatible..
384     });
385     ee.applyTo(e);
386     // minDate: 0,
387     
388 } );
389
390
391 /// browse link...
392 /// in future we should be specific how you can handle this..
393 MTrack.register('a.browse-link', 'on', 'click', function(event) 
394 {
395     event.preventDefault();
396     
397     if (!MTrackWeb.loaded) {
398         return;
399     }
400     
401     var href= this.dom.getAttribute('href').substring(baseURL.length);
402     MTrackWeb.pushState({
403         url : href,
404         title : "Browse : " + href,
405         href : this.dom.href
406     })
407     
408     try { 
409         window.history.pushState( { url: href }, "Browse : " + href , this.dom.href );
410         Roo.log("history push state");
411     } catch (e) {
412         Roo.log(e);
413         
414     }
415     var slideleft = this.is('.browse-link-up')  ? 0 : 1;    
416     MTrack.ajaxLoad(href,slideleft); 
417 });
418
419
420
421 //// ------------------- OLD STUFF NEEDS TIDY UP ----------------------
422
423 /*
424
425
426 $(document).ready(function() {
427     
428      
429     
430   
431   $("textarea.wiki").markItUp({
432     nameSpace:          "wiki",
433     previewParserPath:  baseURL + "/Preview",
434     root: rootURL + "/js",
435     onShiftEnter:       {keepDefault:false, replaceWith:'\\n\\n'},
436     markupSet:  [
437       {
438         name:'Heading 1', key:'1',
439         openWith:'== ', closeWith:' ==', placeHolder:'Your title here...'
440       },
441       {
442         name:'Heading 2', key:'2',
443         openWith:'=== ', closeWith:' ===', placeHolder:'Your title here...'
444       },
445       {
446         name:'Heading 3', key:'3',
447         openWith:'==== ', closeWith:' ====', placeHolder:'Your title here...'
448       },
449       {
450         name:'Heading 4', key:'4',
451         openWith:'===== ', closeWith:' =====', placeHolder:'Your title here...'
452       },
453       {
454         name:'Heading 5', key:'5',
455         openWith:'====== ', closeWith:' ======',
456         placeHolder:'Your title here...'
457       },
458       {separator:'---------------' },
459       {name:'Bold', key:'B', openWith:"'''", closeWith:"'''"},
460       {name:'Italic', key:'I', openWith:"''", closeWith:"''"},
461       {name:'Stroke through', key:'S', openWith:'~~', closeWith:'~~'},
462       {separator:'---------------' },
463       {name:'Bulleted list', openWith:' * '},
464       {name:'Numeric list', openWith:' 1. '},
465       {separator:'---------------' },
466       {name:'Quotes', openWith:'(!(> |!|>)!)'},
467       {name:'Code', openWith:'{{{\\n', closeWith:'\\n}}}'},
468       {separator:'---------------' },1
469       {name:'Preview', call:'preview', className:'preview'}
470     ]
471   });
472
473   $.tablesorter.addParser({
474     id: 'ticket',
475     is: function(s) {
476       return /^#\d+/.test(s);
477     },
478     format: function(s) {
479       return $.tablesorter.formatFloat(s.replace(new RegExp(/#/g), ''));
480     },
481     type: 'numeric'
482   });
483  
484   $.tablesorter.addParser({
485     id: 'mtrackdate',
486     is: function(s) {
487       // don't auto-detect
488       return false;
489     },
490     format: function(s) {
491       // relies on the textExtraction routine below to pull a
492       // date/time string out of the title portion of the abbr tag
493       return $.tablesorter.formatFloat(new Date(s).getTime());
494     },
495     type: 'numeric'
496   });
497   
498   
499   
500   $("table.report, table.wiki").tablesorter({
501     textExtraction: function(node) {
502       var kid = node.childNodes[0];
503       if (kid && kid.tagName == 'ABBR') {
504         // assuming that this abbr is of class='timeinterval'
505         return kid.title;
506       }
507       // default 'simple' behavior
508       if (kid && kid.hasChildNodes()) {
509         return kid.innerHTML;
510       }
511       return node.innerHTML;
512     }
513   });
514   
515   
516   $('input.search[type=text]').each(function () {
517     if ($.browser.webkit) {
518       this.type = 'search';
519       ///$(this).attr('autosave', ABSWEB+'/');
520       $(this).attr('results', 5);
521     } else {
522       $(this).addClass('roundsearch');
523     }
524   });
525   // Convert links that are styled after buttons into actual buttons
526   $('a.button[href]').each(function () {
527     var href = $(this).attr('href');
528     var but = $('<button type="button"/>');
529     but.text($(this).text());
530     $(this).replaceWith(but);
531     but.click(function () {
532       document.location.href = href;
533       return false;
534     });
535   });
536
537   $.fn.mtrackWatermark = function () {
538     this.each(function () {
539       var ph = $(this).attr('title');
540       if ($.browser.webkit) {
541         // Use native safari placeholder for watermark
542         $(this).attr('placeholder', ph);
543       } else {
544         // http://plugins.jquery.com/files/jquery.tinywatermark-2.0.0.js.txt
545         var w;
546         var me = $(this);
547         me.focus(function () {
548           if (w) {
549             w = 0;
550             me.removeClass('watermark').data('w', 0).val('');
551           }
552         })
553         .blur(function () {
554           if (!me.val()) {
555             w = 1;
556             me.addClass('watermark').data('w', 1).val(ph);
557           }
558         })
559         .closest('form').submit(function () {
560           if (w) {
561             me.val('');
562           }
563         });
564         me.blur();
565       }
566     });
567   };
568   // Watermarking -??? what??
569   $('input[title!=""]').mtrackWatermark();
570  
571
572    
573 });
574  
575
576 // from file.php
577
578
579 // from head -- probably for reports only..
580
581  
582 $(document).ready(function() {
583          
584       $.tablesorter.addParser({
585         id: 'priority',
586         is: function(s) {
587           // don't auto-detect
588           return false;
589         },
590         format: function(s) {
591             if (typeof(priorities[s]) != 'undefined') {
592                 return priorities[s];
593             }
594             return s;
595         },
596         type: 'numeric'
597       });
598       
599       $.tablesorter.addParser({
600         id: 'severity',
601         is: function(s) {
602           // don't auto-detect
603           return false;
604         },
605         format: function(s) {
606             if (typeof(severities[s]) != 'undefined') {
607                 return severities[s];
608             }
609             return s;
610         },
611         type: 'numeric'
612     });
613 });
614
615 // from wiki..
616
617 $(document).ready(function(){
618   $('ul.wikitree').treeview({
619     collapsed: true,
620     persist: "location"
621   });
622 });
623
624  */