297ce54e8c76cbadb09bc07806851a1878fe62ad
[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.method);
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         
334     MTrackWeb.Layout.on('buildcomplete', function() {
335             
336         Roo.log("build complete!");
337         MTrackWeb.loaded = true;
338         var href = (window.location.pathname + window.location.search).substring(baseURL.length);
339         try { 
340             window.history.pushState( { url: href }, document.title , window.location.pathname + window.location.search );
341         } catch (e) {}
342         
343         MTrack.currentURL = href;
344     
345         var pgn = MTrack.ajaxLoad(href);
346      
347         MTrack.blockActivate = false;
348             
349     });    
350         // new version!?!?
351         // should be completly build by pman or xcomponent..
352         //Roo.XComponent.build()
353         
354         
355             Roo.XComponent.build();  
356
357         
358         
359         return;
360    
361     
362         
363         
364 });
365
366 MTrack.init();
367 /** this is the 'back' button handler.. */
368
369 try { 
370     window.onpopstate = function(ev) {
371          
372         if (!ev.state || typeof(ev.state.url) == 'undefined') {
373             return;
374         }
375         MTrack.ajaxLoad(ev.state.url, false);
376 };
377 } catch (e) {}
378     
379      
380
381 // any date picers.. - on milestones? - not used any more...
382 MTrack.register('.dateinput', 'each', function(e) {
383     var ee = new Roo.form.DateField({
384         dateFormat: 'Y-m-d' // nice and compatible..
385     });
386     ee.applyTo(e);
387     // minDate: 0,
388     
389 } );
390
391
392 /// browse link...
393 /// in future we should be specific how you can handle this..
394 MTrack.register('a.browse-link', 'on', 'click', function(event) 
395 {
396     event.preventDefault();
397     
398     if (!MTrackWeb.loaded) {
399         return;
400     }
401     
402     var href= this.dom.getAttribute('href').substring(baseURL.length);
403     MTrackWeb.pushState({
404         url : href,
405         title : "Browse : " + href,
406         href : this.dom.href
407     })
408     
409     try { 
410         window.history.pushState( { url: href }, "Browse : " + href , this.dom.href );
411         Roo.log("history push state");
412     } catch (e) {
413         Roo.log(e);
414         
415     }
416     var slideleft = this.is('.browse-link-up')  ? 0 : 1;    
417     MTrack.ajaxLoad(href,slideleft); 
418 });
419
420
421
422 //// ------------------- OLD STUFF NEEDS TIDY UP ----------------------
423
424 /*
425
426
427 $(document).ready(function() {
428     
429      
430     
431   
432   $("textarea.wiki").markItUp({
433     nameSpace:          "wiki",
434     previewParserPath:  baseURL + "/Preview",
435     root: rootURL + "/js",
436     onShiftEnter:       {keepDefault:false, replaceWith:'\\n\\n'},
437     markupSet:  [
438       {
439         name:'Heading 1', key:'1',
440         openWith:'== ', closeWith:' ==', placeHolder:'Your title here...'
441       },
442       {
443         name:'Heading 2', key:'2',
444         openWith:'=== ', closeWith:' ===', placeHolder:'Your title here...'
445       },
446       {
447         name:'Heading 3', key:'3',
448         openWith:'==== ', closeWith:' ====', placeHolder:'Your title here...'
449       },
450       {
451         name:'Heading 4', key:'4',
452         openWith:'===== ', closeWith:' =====', placeHolder:'Your title here...'
453       },
454       {
455         name:'Heading 5', key:'5',
456         openWith:'====== ', closeWith:' ======',
457         placeHolder:'Your title here...'
458       },
459       {separator:'---------------' },
460       {name:'Bold', key:'B', openWith:"'''", closeWith:"'''"},
461       {name:'Italic', key:'I', openWith:"''", closeWith:"''"},
462       {name:'Stroke through', key:'S', openWith:'~~', closeWith:'~~'},
463       {separator:'---------------' },
464       {name:'Bulleted list', openWith:' * '},
465       {name:'Numeric list', openWith:' 1. '},
466       {separator:'---------------' },
467       {name:'Quotes', openWith:'(!(> |!|>)!)'},
468       {name:'Code', openWith:'{{{\\n', closeWith:'\\n}}}'},
469       {separator:'---------------' },1
470       {name:'Preview', call:'preview', className:'preview'}
471     ]
472   });
473
474   $.tablesorter.addParser({
475     id: 'ticket',
476     is: function(s) {
477       return /^#\d+/.test(s);
478     },
479     format: function(s) {
480       return $.tablesorter.formatFloat(s.replace(new RegExp(/#/g), ''));
481     },
482     type: 'numeric'
483   });
484  
485   $.tablesorter.addParser({
486     id: 'mtrackdate',
487     is: function(s) {
488       // don't auto-detect
489       return false;
490     },
491     format: function(s) {
492       // relies on the textExtraction routine below to pull a
493       // date/time string out of the title portion of the abbr tag
494       return $.tablesorter.formatFloat(new Date(s).getTime());
495     },
496     type: 'numeric'
497   });
498   
499   
500   
501   $("table.report, table.wiki").tablesorter({
502     textExtraction: function(node) {
503       var kid = node.childNodes[0];
504       if (kid && kid.tagName == 'ABBR') {
505         // assuming that this abbr is of class='timeinterval'
506         return kid.title;
507       }
508       // default 'simple' behavior
509       if (kid && kid.hasChildNodes()) {
510         return kid.innerHTML;
511       }
512       return node.innerHTML;
513     }
514   });
515   
516   
517   $('input.search[type=text]').each(function () {
518     if ($.browser.webkit) {
519       this.type = 'search';
520       ///$(this).attr('autosave', ABSWEB+'/');
521       $(this).attr('results', 5);
522     } else {
523       $(this).addClass('roundsearch');
524     }
525   });
526   // Convert links that are styled after buttons into actual buttons
527   $('a.button[href]').each(function () {
528     var href = $(this).attr('href');
529     var but = $('<button type="button"/>');
530     but.text($(this).text());
531     $(this).replaceWith(but);
532     but.click(function () {
533       document.location.href = href;
534       return false;
535     });
536   });
537
538   $.fn.mtrackWatermark = function () {
539     this.each(function () {
540       var ph = $(this).attr('title');
541       if ($.browser.webkit) {
542         // Use native safari placeholder for watermark
543         $(this).attr('placeholder', ph);
544       } else {
545         // http://plugins.jquery.com/files/jquery.tinywatermark-2.0.0.js.txt
546         var w;
547         var me = $(this);
548         me.focus(function () {
549           if (w) {
550             w = 0;
551             me.removeClass('watermark').data('w', 0).val('');
552           }
553         })
554         .blur(function () {
555           if (!me.val()) {
556             w = 1;
557             me.addClass('watermark').data('w', 1).val(ph);
558           }
559         })
560         .closest('form').submit(function () {
561           if (w) {
562             me.val('');
563           }
564         });
565         me.blur();
566       }
567     });
568   };
569   // Watermarking -??? what??
570   $('input[title!=""]').mtrackWatermark();
571  
572
573    
574 });
575  
576
577 // from file.php
578
579
580 // from head -- probably for reports only..
581
582  
583 $(document).ready(function() {
584          
585       $.tablesorter.addParser({
586         id: 'priority',
587         is: function(s) {
588           // don't auto-detect
589           return false;
590         },
591         format: function(s) {
592             if (typeof(priorities[s]) != 'undefined') {
593                 return priorities[s];
594             }
595             return s;
596         },
597         type: 'numeric'
598       });
599       
600       $.tablesorter.addParser({
601         id: 'severity',
602         is: function(s) {
603           // don't auto-detect
604           return false;
605         },
606         format: function(s) {
607             if (typeof(severities[s]) != 'undefined') {
608                 return severities[s];
609             }
610             return s;
611         },
612         type: 'numeric'
613     });
614 });
615
616 // from wiki..
617
618 $(document).ready(function(){
619   $('ul.wikitree').treeview({
620     collapsed: true,
621     persist: "location"
622   });
623 });
624
625  */