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