Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 
 
 

169 wiersze
3.8 KiB

  1. // Navigation Object
  2. var nav_obj = {}
  3. nav_obj.observers = [];
  4. nav_obj.add_observer = function(o) { nav_obj.observers.push(o); }
  5. nav_obj.ol = [];
  6. //
  7. // notify my history so that it gets added to the back button history
  8. //
  9. nav_obj.open_notify = function(t, dt, dn, no_history) {
  10. // last should not be this (refresh)
  11. if(nav_obj.ol.length) {
  12. var tmp = nav_obj.ol[nav_obj.ol.length-1];
  13. if(tmp && tmp[0]==t && tmp[1]==dt && tmp[2]==dn) return;
  14. }
  15. if(!no_history) {
  16. // remove from history (if exists so that we can put it back on top)
  17. var tmp = [];
  18. for(var i in nav_obj.ol)
  19. if(!(nav_obj.ol[i][0]==t && nav_obj.ol[i][1]==dt && nav_obj.ol[i][2]==dn)) tmp.push(nav_obj.ol[i]);
  20. nav_obj.ol = tmp;
  21. // add to top
  22. nav_obj.ol.push([t, dt, dn])
  23. // encode
  24. en_t = encodeURIComponent(t);
  25. en_dt = encodeURIComponent(dt);
  26. en_dn = dn ? encodeURIComponent(dn) : '';
  27. if(en_t=='Page') {
  28. var id = en_dt + (dn ? ('/'+en_dn): '')
  29. } else {
  30. var id = en_t+'/'+ en_dt + (dn ? ('/'+en_dn): '')
  31. }
  32. // option to add to analytics engine
  33. if(nav_obj.on_open)
  34. nav_obj.on_open(id);
  35. // add to "back" history
  36. // replace state (to url)
  37. if(window.location.hash!='!' + id) {
  38. window.location.hash = '!' + id;
  39. }
  40. }
  41. nav_obj.notify_observers(t, dt, dn);
  42. }
  43. // Notify observers
  44. // =========================================
  45. nav_obj.notify_observers = function(t, dt, dn) {
  46. // notify observers (for menu?)
  47. for(var i=0; i<nav_obj.observers.length; i++) {
  48. var o = nav_obj.observers[i];
  49. if(o && o.notify) o.notify(t, dt, dn);
  50. }
  51. }
  52. // Remame links (for save - name change)
  53. // =========================================
  54. nav_obj.rename_notify = function(dt, oldn, newn) {
  55. for(var i=0;i<nav_obj.ol.length;i++) {
  56. var o = nav_obj.ol[i];
  57. if(o[1]==dt && o[2]==oldn) o[2]=newn;
  58. }
  59. }
  60. nav_obj.show_last_open = function() {
  61. var l = nav_obj.ol[nav_obj.ol.length-2];
  62. delete nav_obj.ol[nav_obj.ol.length-1]; // delete current open
  63. if(!l) loadpage('_home');
  64. else if(l[0]=='Page') {
  65. loadpage(l[1]);
  66. } else if(l[0]=='Report') {
  67. loadreport(l[1],l[2]);
  68. } else if(l[0]=='Form') {
  69. loaddoc(l[1],l[2]);
  70. } else if(l[0]=='DocBrowser' || l[0]=='List') {
  71. loaddocbrowser(l[1]);
  72. }
  73. }
  74. var _history_current;
  75. function history_get_name(t) {
  76. var parts = [];
  77. if(t.length>=3) {
  78. // combine all else
  79. for(var i=2; i<t.length; i++) {
  80. parts.push(t[i]);
  81. }
  82. }
  83. return parts.join('/')
  84. }
  85. //
  86. // get the page details from the location
  87. //
  88. nav_obj.get_page = function(loc) {
  89. if(!loc) loc = window.location.hash;
  90. // remove exclamation for hash-bangs
  91. if(loc.substr(0,1)=='#') { loc = loc.substr(1); }
  92. if(loc.substr(0,1)=='!') { loc = loc.substr(1); }
  93. if(!in_list(['Page/', 'Form/', 'Repor', 'DocBr', 'List/'], loc.substr(0,5))) {
  94. loc = 'Page/' + loc;
  95. }
  96. return loc.split('/');
  97. }
  98. //
  99. // function called when page is updated
  100. //
  101. function historyChange(newLocation) {
  102. var t = nav_obj.get_page(newLocation)
  103. for(var i=0;i<t.length;i++)
  104. t[i] = decodeURIComponent(t[i]);
  105. // re-opening the same page?
  106. if(nav_obj.ol.length) {
  107. var c = nav_obj.ol[nav_obj.ol.length-1];
  108. if(t.length==2) {
  109. if(c[0]==t[0] && c[1]==t[1]) return;
  110. } else {
  111. if(c[0]==t[0] && c[1]==t[1] && c[2]==t[2]) return;
  112. }
  113. }
  114. if(t[2])
  115. var docname = history_get_name(t);
  116. if(t[0]=='Form') {
  117. _history_current = newLocation;
  118. if(docname.substr(0, 3)=='New' && !(locals[t[1]] && locals[t[1]][docname])) {
  119. newdoc(t[1]);
  120. } else {
  121. loaddoc(t[1], docname);
  122. }
  123. } else if(t[0]=='Report') {
  124. _history_current = newLocation;
  125. loadreport(t[1], docname);
  126. } else if(t[0]=='Page') {
  127. _history_current = newLocation;
  128. loadpage(t[1]);
  129. } else if(t[0]=='Application') {
  130. _history_current = newLocation;
  131. loadapp(t[1]);
  132. } else if(t[0]=='DocBrowser' || t[0]=='List') {
  133. _history_current = newLocation;
  134. loaddocbrowser(t[1]);
  135. }
  136. };
  137. $(window).bind('hashchange', function() {
  138. historyChange(location.hash);
  139. });