compass-jquery-plugin 0.3.2.8 → 0.3.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (542) hide show
  1. data/README.md +24 -6
  2. data/VERSION.yml +3 -3
  3. data/lib/jquery/gridify/grid_column.rb +6 -6
  4. data/lib/jquery/gridify/grid_options.rb +4 -4
  5. data/lib/jquery/mark_it_up.rb +2 -0
  6. data/lib/jquery/mobile.rb +0 -1
  7. data/templates/dynatree/jquery.dynatree.js +2896 -2880
  8. data/templates/dynatree/jquery.dynatree.min.js +55 -54
  9. data/templates/dynatree/jquery/dynatree/aero.scss +4 -2
  10. data/templates/dynatree/jquery/dynatree/aqua.scss +4 -2
  11. data/templates/dynatree/jquery/dynatree/crystal.scss +4 -2
  12. data/templates/dynatree/jquery/dynatree/xp.scss +5 -3
  13. data/templates/emulators/emulators/bb.playbook.landscape.png +0 -0
  14. data/templates/emulators/emulators/bb.playbook.landscape.scss +18 -0
  15. data/templates/emulators/emulators/bb.playbook.portrait.png +0 -0
  16. data/templates/emulators/emulators/bb.playbook.portrait.scss +18 -0
  17. data/templates/emulators/emulators/{blackberry.torch.landscape.png → bb.torch.landscape.png} +0 -0
  18. data/templates/emulators/emulators/{blackberry.torch.landscape.scss → bb.torch.landscape.scss} +1 -3
  19. data/templates/emulators/emulators/{blackberry.torch.portrait.png → bb.torch.portrait.png} +0 -0
  20. data/templates/emulators/emulators/{blackberry.torch.portrait.scss → bb.torch.portrait.scss} +1 -3
  21. data/templates/emulators/emulators/galaxy.ace.landscape.png +0 -0
  22. data/templates/emulators/emulators/galaxy.ace.landscape.scss +18 -0
  23. data/templates/emulators/emulators/galaxy.ace.portrait.png +0 -0
  24. data/templates/emulators/emulators/galaxy.ace.portrait.scss +18 -0
  25. data/templates/emulators/emulators/galaxy.s.landscape.scss +0 -2
  26. data/templates/emulators/emulators/galaxy.s.portrait.scss +0 -2
  27. data/templates/emulators/emulators/galaxy.s2.landscape.scss +0 -2
  28. data/templates/emulators/emulators/galaxy.s2.portrait.scss +0 -2
  29. data/templates/emulators/emulators/galaxy.tab.10.1.landscape.scss +0 -2
  30. data/templates/emulators/emulators/galaxy.tab.10.1.portrait.scss +0 -2
  31. data/templates/emulators/emulators/galaxy.tab.7.landscape.scss +0 -2
  32. data/templates/emulators/emulators/galaxy.tab.7.portrait.scss +0 -2
  33. data/templates/emulators/emulators/galaxy.tab.8.9.landscape.scss +0 -2
  34. data/templates/emulators/emulators/galaxy.tab.8.9.portrait.scss +0 -2
  35. data/templates/emulators/emulators/htc.sensation.landscape.png +0 -0
  36. data/templates/emulators/emulators/htc.sensation.landscape.scss +18 -0
  37. data/templates/emulators/emulators/htc.sensation.portrait.png +0 -0
  38. data/templates/emulators/emulators/htc.sensation.portrait.scss +18 -0
  39. data/templates/emulators/emulators/ipad.landscape.scss +0 -2
  40. data/templates/emulators/emulators/ipad.portrait.scss +0 -2
  41. data/templates/emulators/emulators/iphone.3.landscape.scss +0 -2
  42. data/templates/emulators/emulators/iphone.3.portrait.scss +0 -2
  43. data/templates/emulators/emulators/{iphone.4.landscape .scss → iphone.4.landscape.scss} +0 -2
  44. data/templates/emulators/emulators/iphone.4.portrait.scss +0 -2
  45. data/templates/emulators/emulators/palm.pre.2.landscape.scss +0 -2
  46. data/templates/emulators/emulators/palm.pre.2.portrait.scss +0 -2
  47. data/templates/emulators/manifest.rb +17 -5
  48. data/templates/graphics/highcharts/dark-blue.js +159 -159
  49. data/templates/graphics/highcharts/dark-green.js +159 -159
  50. data/templates/graphics/highcharts/gray.js +154 -154
  51. data/templates/graphics/highcharts/grid.js +84 -84
  52. data/templates/graphics/highcharts/highslide-config.js +2 -2
  53. data/templates/graphics/highcharts/highslide-full.js +3310 -3310
  54. data/templates/graphics/highcharts/skies.js +72 -72
  55. data/templates/graphics/jquery.ganttView.js +1550 -1550
  56. data/templates/graphics/jquery.highcharts.js +11277 -11285
  57. data/templates/graphics/jquery.sparkline.js +1072 -1072
  58. data/templates/ical/jquery.ical.js +7637 -7637
  59. data/templates/ical/jquery/ical.print.scss +3 -3
  60. data/templates/jqgrid/i18n/jqgrid/locale-ar.js +127 -127
  61. data/templates/jqgrid/i18n/jqgrid/locale-bg.js +131 -131
  62. data/templates/jqgrid/i18n/jqgrid/locale-bg1251.js +131 -131
  63. data/templates/jqgrid/i18n/jqgrid/locale-cat.js +128 -128
  64. data/templates/jqgrid/i18n/jqgrid/locale-cn.js +132 -132
  65. data/templates/jqgrid/i18n/jqgrid/locale-cs.js +129 -129
  66. data/templates/jqgrid/i18n/jqgrid/locale-da.js +128 -128
  67. data/templates/jqgrid/i18n/jqgrid/locale-de.js +134 -134
  68. data/templates/jqgrid/i18n/jqgrid/locale-el.js +127 -127
  69. data/templates/jqgrid/i18n/jqgrid/locale-en.js +128 -128
  70. data/templates/jqgrid/i18n/jqgrid/locale-es.js +129 -129
  71. data/templates/jqgrid/i18n/jqgrid/locale-fa.js +141 -141
  72. data/templates/jqgrid/i18n/jqgrid/locale-fi.js +128 -128
  73. data/templates/jqgrid/i18n/jqgrid/locale-fr.js +127 -127
  74. data/templates/jqgrid/i18n/jqgrid/locale-gl.js +127 -127
  75. data/templates/jqgrid/i18n/jqgrid/locale-he.js +128 -128
  76. data/templates/jqgrid/i18n/jqgrid/locale-hu.js +128 -128
  77. data/templates/jqgrid/i18n/jqgrid/locale-is.js +127 -127
  78. data/templates/jqgrid/i18n/jqgrid/locale-it.js +6 -6
  79. data/templates/jqgrid/i18n/jqgrid/locale-ja.js +153 -153
  80. data/templates/jqgrid/i18n/jqgrid/locale-lt.js +128 -128
  81. data/templates/jqgrid/i18n/jqgrid/locale-mne.js +134 -0
  82. data/templates/jqgrid/i18n/jqgrid/locale-mne.min.js +7 -0
  83. data/templates/jqgrid/i18n/jqgrid/locale-nl.js +145 -145
  84. data/templates/jqgrid/i18n/jqgrid/locale-no.js +12 -12
  85. data/templates/jqgrid/i18n/jqgrid/locale-pl.js +128 -128
  86. data/templates/jqgrid/i18n/jqgrid/locale-pt-br.js +128 -128
  87. data/templates/jqgrid/i18n/jqgrid/locale-pt.js +126 -126
  88. data/templates/jqgrid/i18n/jqgrid/locale-ro.js +140 -140
  89. data/templates/jqgrid/i18n/jqgrid/locale-ru.js +128 -128
  90. data/templates/jqgrid/i18n/jqgrid/locale-sk.js +128 -128
  91. data/templates/jqgrid/i18n/jqgrid/locale-sr.js +128 -128
  92. data/templates/jqgrid/i18n/jqgrid/locale-sv.js +128 -128
  93. data/templates/jqgrid/i18n/jqgrid/locale-tr.js +127 -127
  94. data/templates/jqgrid/i18n/jqgrid/locale-ua.js +128 -128
  95. data/templates/jqgrid/jquery.jqGrid.js +13477 -13443
  96. data/templates/jqgrid/jquery.jqGrid.min.js +292 -287
  97. data/templates/jqgrid/jquery/jqGrid.scss +13 -12
  98. data/templates/jqgrid/manifest.rb +2 -0
  99. data/templates/jqtouch/jquery.jqtouch.js +9601 -9556
  100. data/templates/jqtouch/jquery.jqtouch.min.js +3 -3
  101. data/templates/jqtouch/jquery/touch/default.scss +2 -2
  102. data/templates/jqtouch/jquery/touch/jqt.scss +2 -2
  103. data/templates/jqtouch/jquery/touch/jqtouch.scss +26 -5
  104. data/templates/jquery/amplify.store.js +211 -211
  105. data/templates/jquery/config/initializers/jquery.rb +2 -0
  106. data/templates/jquery/history.adapter.jquery.js +42 -36
  107. data/templates/jquery/history.html4.js +563 -563
  108. data/templates/jquery/history.html4.min.js +5 -5
  109. data/templates/jquery/history.js +1721 -1694
  110. data/templates/jquery/history.min.js +28 -27
  111. data/templates/jquery/i18n/jquery.ui/datepicker-af.js +20 -20
  112. data/templates/jquery/i18n/jquery.ui/datepicker-ar-DZ.js +18 -18
  113. data/templates/jquery/i18n/jquery.ui/datepicker-ar.js +19 -19
  114. data/templates/jquery/i18n/jquery.ui/datepicker-az.js +20 -20
  115. data/templates/jquery/i18n/jquery.ui/datepicker-bg.js +21 -21
  116. data/templates/jquery/i18n/jquery.ui/datepicker-bs.js +20 -20
  117. data/templates/jquery/i18n/jquery.ui/datepicker-ca.js +19 -19
  118. data/templates/jquery/i18n/jquery.ui/datepicker-cs.js +20 -20
  119. data/templates/jquery/i18n/jquery.ui/datepicker-da.js +20 -20
  120. data/templates/jquery/i18n/jquery.ui/datepicker-de.js +20 -20
  121. data/templates/jquery/i18n/jquery.ui/datepicker-el.js +20 -20
  122. data/templates/jquery/i18n/jquery.ui/datepicker-en-AU.js +19 -19
  123. data/templates/jquery/i18n/jquery.ui/datepicker-en-GB.js +20 -20
  124. data/templates/jquery/i18n/jquery.ui/datepicker-en-NZ.js +19 -19
  125. data/templates/jquery/i18n/jquery.ui/datepicker-eo.js +20 -20
  126. data/templates/jquery/i18n/jquery.ui/datepicker-es.js +19 -19
  127. data/templates/jquery/i18n/jquery.ui/datepicker-et.js +20 -20
  128. data/templates/jquery/i18n/jquery.ui/datepicker-eu.js +20 -20
  129. data/templates/jquery/i18n/jquery.ui/datepicker-fa.js +19 -19
  130. data/templates/jquery/i18n/jquery.ui/datepicker-fi.js +19 -19
  131. data/templates/jquery/i18n/jquery.ui/datepicker-fo.js +20 -20
  132. data/templates/jquery/i18n/jquery.ui/datepicker-fr-CH.js +20 -20
  133. data/templates/jquery/i18n/jquery.ui/datepicker-fr.js +20 -20
  134. data/templates/jquery/i18n/jquery.ui/datepicker-gl.js +19 -19
  135. data/templates/jquery/i18n/jquery.ui/datepicker-he.js +20 -20
  136. data/templates/jquery/i18n/jquery.ui/datepicker-hr.js +20 -20
  137. data/templates/jquery/i18n/jquery.ui/datepicker-hu.js +19 -19
  138. data/templates/jquery/i18n/jquery.ui/datepicker-hy.js +19 -19
  139. data/templates/jquery/i18n/jquery.ui/datepicker-id.js +19 -19
  140. data/templates/jquery/i18n/jquery.ui/datepicker-is.js +19 -19
  141. data/templates/jquery/i18n/jquery.ui/datepicker-it.js +19 -19
  142. data/templates/jquery/i18n/jquery.ui/datepicker-ja.js +20 -20
  143. data/templates/jquery/i18n/jquery.ui/datepicker-ko.js +19 -19
  144. data/templates/jquery/i18n/jquery.ui/datepicker-kz.js +19 -19
  145. data/templates/jquery/i18n/jquery.ui/datepicker-lt.js +19 -19
  146. data/templates/jquery/i18n/jquery.ui/datepicker-lv.js +19 -19
  147. data/templates/jquery/i18n/jquery.ui/datepicker-ml.js +20 -20
  148. data/templates/jquery/i18n/jquery.ui/datepicker-ms.js +19 -19
  149. data/templates/jquery/i18n/jquery.ui/datepicker-nl.js +20 -20
  150. data/templates/jquery/i18n/jquery.ui/datepicker-nl.min.js +1 -1
  151. data/templates/jquery/i18n/jquery.ui/datepicker-no.js +18 -18
  152. data/templates/jquery/i18n/jquery.ui/datepicker-pl.js +19 -19
  153. data/templates/jquery/i18n/jquery.ui/datepicker-pt-BR.js +19 -19
  154. data/templates/jquery/i18n/jquery.ui/datepicker-pt.js +19 -19
  155. data/templates/jquery/i18n/jquery.ui/datepicker-rm.js +17 -17
  156. data/templates/jquery/i18n/jquery.ui/datepicker-ro.js +20 -20
  157. data/templates/jquery/i18n/jquery.ui/datepicker-ru.js +19 -19
  158. data/templates/jquery/i18n/jquery.ui/datepicker-sk.js +19 -19
  159. data/templates/jquery/i18n/jquery.ui/datepicker-sk.min.js +1 -1
  160. data/templates/jquery/i18n/jquery.ui/datepicker-sl.js +19 -19
  161. data/templates/jquery/i18n/jquery.ui/datepicker-sq.js +20 -20
  162. data/templates/jquery/i18n/jquery.ui/datepicker-sr-SR.js +20 -20
  163. data/templates/jquery/i18n/jquery.ui/datepicker-sr.js +20 -20
  164. data/templates/jquery/i18n/jquery.ui/datepicker-sv.js +20 -20
  165. data/templates/jquery/i18n/jquery.ui/datepicker-ta.js +20 -20
  166. data/templates/jquery/i18n/jquery.ui/datepicker-th.js +20 -20
  167. data/templates/jquery/i18n/jquery.ui/datepicker-tj.js +19 -19
  168. data/templates/jquery/i18n/jquery.ui/datepicker-tr.js +19 -19
  169. data/templates/jquery/i18n/jquery.ui/datepicker-uk.js +19 -19
  170. data/templates/jquery/i18n/jquery.ui/datepicker-vi.js +20 -20
  171. data/templates/jquery/i18n/jquery.ui/datepicker-zh-CN.js +19 -19
  172. data/templates/jquery/i18n/jquery.ui/datepicker-zh-HK.js +19 -19
  173. data/templates/jquery/i18n/jquery.ui/datepicker-zh-TW.js +20 -20
  174. data/templates/jquery/jquery-ui.js +11913 -11882
  175. data/templates/jquery/jquery-ui.min.js +340 -339
  176. data/templates/jquery/jquery.bgiframe.js +27 -27
  177. data/templates/jquery/jquery.contextMenu.js +202 -202
  178. data/templates/jquery/jquery.cookie.js +26 -26
  179. data/templates/jquery/jquery.dotimeout.js +227 -227
  180. data/templates/jquery/jquery.dst.js +89 -89
  181. data/templates/jquery/jquery.easing.js +226 -0
  182. data/templates/jquery/jquery.easing.min.js +8 -0
  183. data/templates/jquery/jquery.farbtastic.js +294 -294
  184. data/templates/jquery/jquery.flashMessages.js +14 -14
  185. data/templates/jquery/jquery.form.js +761 -761
  186. data/templates/jquery/jquery.haml.js +247 -247
  187. data/templates/jquery/jquery.hotkeys.js +79 -79
  188. data/templates/jquery/jquery.js +1490 -928
  189. data/templates/jquery/jquery.layout.js +2454 -2454
  190. data/templates/jquery/jquery.mediahelpers.js +216 -0
  191. data/templates/jquery/jquery.mediahelpers.min.js +3 -0
  192. data/templates/jquery/jquery.min.js +177 -166
  193. data/templates/jquery/jquery.mousewheel.js +57 -57
  194. data/templates/jquery/jquery.offline.js +171 -171
  195. data/templates/jquery/jquery.pngFix.js +72 -72
  196. data/templates/jquery/jquery.rails.js +145 -145
  197. data/templates/jquery/jquery.replacetext.js +80 -80
  198. data/templates/jquery/jquery.themeswitchertool.js +195 -195
  199. data/templates/jquery/jquery.tmpl.js +460 -460
  200. data/templates/jquery/jquery.tmplPlus.js +78 -78
  201. data/templates/jquery/jquery.tokeninput.js +480 -475
  202. data/templates/jquery/jquery/ui/_theme.scss +14 -14
  203. data/templates/jquery/jquery/ui/black-tie/ui-icons_4ca300_256x240.png +0 -0
  204. data/templates/jquery/jquery/ui/black-tie/ui-icons_bbbbbb_256x240.png +0 -0
  205. data/templates/jquery/jquery/ui/black-tie/ui-icons_ededed_256x240.png +0 -0
  206. data/templates/jquery/jquery/ui/black-tie/ui-icons_ffcf29_256x240.png +0 -0
  207. data/templates/jquery/jquery/ui/vader/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  208. data/templates/jquery/jquery/ui/vader/ui-icons_bbbbbb_256x240.png +0 -0
  209. data/templates/jquery/jquery/ui/vader/ui-icons_c98000_256x240.png +0 -0
  210. data/templates/jquery/jquery/ui/vader/ui-icons_f29a00_256x240.png +0 -0
  211. data/templates/jquery/json.js +66 -66
  212. data/templates/jquery/json2.js +177 -177
  213. data/templates/jquery/manifest.rb +4 -0
  214. data/templates/jstree/jquery.jstree.js +5918 -5918
  215. data/templates/markitup/app/views/shared/_mark_it_up.parsed.preview.blue.html.haml +9 -0
  216. data/templates/markitup/app/views/shared/_mark_it_up.parsed.preview.html.haml +9 -0
  217. data/templates/markitup/app/views/shared/_mark_it_up.preview.blue.html.haml +8 -0
  218. data/templates/markitup/app/views/shared/_mark_it_up.preview.html.haml +8 -0
  219. data/templates/markitup/config/initializers/mark_it_up.rb +40 -0
  220. data/templates/markitup/jquery.markitup.js +586 -0
  221. data/templates/markitup/jquery.markitup.min.js +1 -0
  222. data/templates/markitup/jquery/markitup/preview/body.blue.png +0 -0
  223. data/templates/markitup/jquery/markitup/preview/bullet.blue.png +0 -0
  224. data/templates/markitup/jquery/markitup/preview/preview.blue.scss +58 -0
  225. data/templates/markitup/jquery/markitup/preview/preview.scss +7 -0
  226. data/templates/markitup/jquery/markitup/sets/bbcode.scss +34 -0
  227. data/templates/markitup/jquery/markitup/sets/bbcode/bold.png +0 -0
  228. data/templates/markitup/jquery/markitup/sets/bbcode/clean.png +0 -0
  229. data/templates/markitup/jquery/markitup/sets/bbcode/code.png +0 -0
  230. data/templates/markitup/jquery/markitup/sets/bbcode/fonts.png +0 -0
  231. data/templates/markitup/jquery/markitup/sets/bbcode/italic.png +0 -0
  232. data/templates/markitup/jquery/markitup/sets/bbcode/link.png +0 -0
  233. data/templates/markitup/jquery/markitup/sets/bbcode/list-bullet.png +0 -0
  234. data/templates/markitup/jquery/markitup/sets/bbcode/list-item.png +0 -0
  235. data/templates/markitup/jquery/markitup/sets/bbcode/list-numeric.png +0 -0
  236. data/templates/markitup/jquery/markitup/sets/bbcode/picture.png +0 -0
  237. data/templates/markitup/jquery/markitup/sets/bbcode/preview.png +0 -0
  238. data/templates/markitup/jquery/markitup/sets/bbcode/quotes.png +0 -0
  239. data/templates/markitup/jquery/markitup/sets/bbcode/stroke.png +0 -0
  240. data/templates/markitup/jquery/markitup/sets/bbcode/underline.png +0 -0
  241. data/templates/markitup/jquery/markitup/sets/css.scss +54 -0
  242. data/templates/markitup/jquery/markitup/sets/css/bold.png +0 -0
  243. data/templates/markitup/jquery/markitup/sets/css/css.png +0 -0
  244. data/templates/markitup/jquery/markitup/sets/css/italic.png +0 -0
  245. data/templates/markitup/jquery/markitup/sets/css/picture.png +0 -0
  246. data/templates/markitup/jquery/markitup/sets/css/stroke.png +0 -0
  247. data/templates/markitup/jquery/markitup/sets/css/tag.png +0 -0
  248. data/templates/markitup/jquery/markitup/sets/css/text_align_center.png +0 -0
  249. data/templates/markitup/jquery/markitup/sets/css/text_align_justify.png +0 -0
  250. data/templates/markitup/jquery/markitup/sets/css/text_align_left.png +0 -0
  251. data/templates/markitup/jquery/markitup/sets/css/text_align_right.png +0 -0
  252. data/templates/markitup/jquery/markitup/sets/css/text_indent.png +0 -0
  253. data/templates/markitup/jquery/markitup/sets/css/text_letterspacing.png +0 -0
  254. data/templates/markitup/jquery/markitup/sets/css/text_linespacing.png +0 -0
  255. data/templates/markitup/jquery/markitup/sets/css/text_lowercase.png +0 -0
  256. data/templates/markitup/jquery/markitup/sets/css/text_padding_bottom.png +0 -0
  257. data/templates/markitup/jquery/markitup/sets/css/text_padding_left.png +0 -0
  258. data/templates/markitup/jquery/markitup/sets/css/text_padding_right.png +0 -0
  259. data/templates/markitup/jquery/markitup/sets/css/text_padding_top.png +0 -0
  260. data/templates/markitup/jquery/markitup/sets/css/text_uppercase.png +0 -0
  261. data/templates/markitup/jquery/markitup/sets/default.scss +22 -0
  262. data/templates/markitup/jquery/markitup/sets/default/bold.png +0 -0
  263. data/templates/markitup/jquery/markitup/sets/default/clean.png +0 -0
  264. data/templates/markitup/jquery/markitup/sets/default/image.png +0 -0
  265. data/templates/markitup/jquery/markitup/sets/default/italic.png +0 -0
  266. data/templates/markitup/jquery/markitup/sets/default/link.png +0 -0
  267. data/templates/markitup/jquery/markitup/sets/default/picture.png +0 -0
  268. data/templates/markitup/jquery/markitup/sets/default/preview.png +0 -0
  269. data/templates/markitup/jquery/markitup/sets/default/stroke.png +0 -0
  270. data/templates/markitup/jquery/markitup/sets/dotclear.scss +38 -0
  271. data/templates/markitup/jquery/markitup/sets/dotclear/bold.png +0 -0
  272. data/templates/markitup/jquery/markitup/sets/dotclear/code.png +0 -0
  273. data/templates/markitup/jquery/markitup/sets/dotclear/h1.png +0 -0
  274. data/templates/markitup/jquery/markitup/sets/dotclear/h2.png +0 -0
  275. data/templates/markitup/jquery/markitup/sets/dotclear/h3.png +0 -0
  276. data/templates/markitup/jquery/markitup/sets/dotclear/h4.png +0 -0
  277. data/templates/markitup/jquery/markitup/sets/dotclear/h5.png +0 -0
  278. data/templates/markitup/jquery/markitup/sets/dotclear/h6.png +0 -0
  279. data/templates/markitup/jquery/markitup/sets/dotclear/italic.png +0 -0
  280. data/templates/markitup/jquery/markitup/sets/dotclear/link.png +0 -0
  281. data/templates/markitup/jquery/markitup/sets/dotclear/list-bullet.png +0 -0
  282. data/templates/markitup/jquery/markitup/sets/dotclear/list-numeric.png +0 -0
  283. data/templates/markitup/jquery/markitup/sets/dotclear/picture.png +0 -0
  284. data/templates/markitup/jquery/markitup/sets/dotclear/preview.png +0 -0
  285. data/templates/markitup/jquery/markitup/sets/dotclear/quotes.png +0 -0
  286. data/templates/markitup/jquery/markitup/sets/dotclear/stroke.png +0 -0
  287. data/templates/markitup/jquery/markitup/sets/dotclear/url.png +0 -0
  288. data/templates/markitup/jquery/markitup/sets/html.scss +42 -0
  289. data/templates/markitup/jquery/markitup/sets/html/bold.png +0 -0
  290. data/templates/markitup/jquery/markitup/sets/html/clean.png +0 -0
  291. data/templates/markitup/jquery/markitup/sets/html/h1.png +0 -0
  292. data/templates/markitup/jquery/markitup/sets/html/h2.png +0 -0
  293. data/templates/markitup/jquery/markitup/sets/html/h3.png +0 -0
  294. data/templates/markitup/jquery/markitup/sets/html/h4.png +0 -0
  295. data/templates/markitup/jquery/markitup/sets/html/h5.png +0 -0
  296. data/templates/markitup/jquery/markitup/sets/html/h6.png +0 -0
  297. data/templates/markitup/jquery/markitup/sets/html/image.png +0 -0
  298. data/templates/markitup/jquery/markitup/sets/html/italic.png +0 -0
  299. data/templates/markitup/jquery/markitup/sets/html/link.png +0 -0
  300. data/templates/markitup/jquery/markitup/sets/html/list-bullet.png +0 -0
  301. data/templates/markitup/jquery/markitup/sets/html/list-item.png +0 -0
  302. data/templates/markitup/jquery/markitup/sets/html/list-numeric.png +0 -0
  303. data/templates/markitup/jquery/markitup/sets/html/paragraph.png +0 -0
  304. data/templates/markitup/jquery/markitup/sets/html/picture.png +0 -0
  305. data/templates/markitup/jquery/markitup/sets/html/preview.png +0 -0
  306. data/templates/markitup/jquery/markitup/sets/html/stroke.png +0 -0
  307. data/templates/markitup/jquery/markitup/sets/markdown.scss +38 -0
  308. data/templates/markitup/jquery/markitup/sets/markdown/bold.png +0 -0
  309. data/templates/markitup/jquery/markitup/sets/markdown/code.png +0 -0
  310. data/templates/markitup/jquery/markitup/sets/markdown/h1.png +0 -0
  311. data/templates/markitup/jquery/markitup/sets/markdown/h2.png +0 -0
  312. data/templates/markitup/jquery/markitup/sets/markdown/h3.png +0 -0
  313. data/templates/markitup/jquery/markitup/sets/markdown/h4.png +0 -0
  314. data/templates/markitup/jquery/markitup/sets/markdown/h5.png +0 -0
  315. data/templates/markitup/jquery/markitup/sets/markdown/h6.png +0 -0
  316. data/templates/markitup/jquery/markitup/sets/markdown/italic.png +0 -0
  317. data/templates/markitup/jquery/markitup/sets/markdown/link.png +0 -0
  318. data/templates/markitup/jquery/markitup/sets/markdown/list-bullet.png +0 -0
  319. data/templates/markitup/jquery/markitup/sets/markdown/list-numeric.png +0 -0
  320. data/templates/markitup/jquery/markitup/sets/markdown/picture.png +0 -0
  321. data/templates/markitup/jquery/markitup/sets/markdown/preview.png +0 -0
  322. data/templates/markitup/jquery/markitup/sets/markdown/quotes.png +0 -0
  323. data/templates/markitup/jquery/markitup/sets/markmin.scss +38 -0
  324. data/templates/markitup/jquery/markitup/sets/markmin/bold.png +0 -0
  325. data/templates/markitup/jquery/markitup/sets/markmin/code.png +0 -0
  326. data/templates/markitup/jquery/markitup/sets/markmin/h1.png +0 -0
  327. data/templates/markitup/jquery/markitup/sets/markmin/h2.png +0 -0
  328. data/templates/markitup/jquery/markitup/sets/markmin/h3.png +0 -0
  329. data/templates/markitup/jquery/markitup/sets/markmin/h4.png +0 -0
  330. data/templates/markitup/jquery/markitup/sets/markmin/h5.png +0 -0
  331. data/templates/markitup/jquery/markitup/sets/markmin/h6.png +0 -0
  332. data/templates/markitup/jquery/markitup/sets/markmin/italic.png +0 -0
  333. data/templates/markitup/jquery/markitup/sets/markmin/link.png +0 -0
  334. data/templates/markitup/jquery/markitup/sets/markmin/list-bullet.png +0 -0
  335. data/templates/markitup/jquery/markitup/sets/markmin/list-numeric.png +0 -0
  336. data/templates/markitup/jquery/markitup/sets/markmin/picture.png +0 -0
  337. data/templates/markitup/jquery/markitup/sets/markmin/preview.png +0 -0
  338. data/templates/markitup/jquery/markitup/sets/markmin/quotes.png +0 -0
  339. data/templates/markitup/jquery/markitup/sets/rest.scss +38 -0
  340. data/templates/markitup/jquery/markitup/sets/rest/bold.png +0 -0
  341. data/templates/markitup/jquery/markitup/sets/rest/code.png +0 -0
  342. data/templates/markitup/jquery/markitup/sets/rest/h1.png +0 -0
  343. data/templates/markitup/jquery/markitup/sets/rest/h2.png +0 -0
  344. data/templates/markitup/jquery/markitup/sets/rest/h3.png +0 -0
  345. data/templates/markitup/jquery/markitup/sets/rest/h4.png +0 -0
  346. data/templates/markitup/jquery/markitup/sets/rest/h5.png +0 -0
  347. data/templates/markitup/jquery/markitup/sets/rest/italic.png +0 -0
  348. data/templates/markitup/jquery/markitup/sets/rest/link.png +0 -0
  349. data/templates/markitup/jquery/markitup/sets/rest/list-bullet.png +0 -0
  350. data/templates/markitup/jquery/markitup/sets/rest/list-numeric.png +0 -0
  351. data/templates/markitup/jquery/markitup/sets/rest/picture.png +0 -0
  352. data/templates/markitup/jquery/markitup/sets/rest/preview.png +0 -0
  353. data/templates/markitup/jquery/markitup/sets/rest/quotes.png +0 -0
  354. data/templates/markitup/jquery/markitup/sets/textile.scss +44 -0
  355. data/templates/markitup/jquery/markitup/sets/textile/bold.png +0 -0
  356. data/templates/markitup/jquery/markitup/sets/textile/code.png +0 -0
  357. data/templates/markitup/jquery/markitup/sets/textile/h1.png +0 -0
  358. data/templates/markitup/jquery/markitup/sets/textile/h2.png +0 -0
  359. data/templates/markitup/jquery/markitup/sets/textile/h3.png +0 -0
  360. data/templates/markitup/jquery/markitup/sets/textile/h4.png +0 -0
  361. data/templates/markitup/jquery/markitup/sets/textile/h5.png +0 -0
  362. data/templates/markitup/jquery/markitup/sets/textile/h6.png +0 -0
  363. data/templates/markitup/jquery/markitup/sets/textile/italic.png +0 -0
  364. data/templates/markitup/jquery/markitup/sets/textile/link.png +0 -0
  365. data/templates/markitup/jquery/markitup/sets/textile/list-bullet.png +0 -0
  366. data/templates/markitup/jquery/markitup/sets/textile/list-numeric.png +0 -0
  367. data/templates/markitup/jquery/markitup/sets/textile/paragraph.png +0 -0
  368. data/templates/markitup/jquery/markitup/sets/textile/picture.png +0 -0
  369. data/templates/markitup/jquery/markitup/sets/textile/preview.png +0 -0
  370. data/templates/markitup/jquery/markitup/sets/textile/quotes.png +0 -0
  371. data/templates/markitup/jquery/markitup/sets/textile/stroke.png +0 -0
  372. data/templates/markitup/jquery/markitup/sets/textile/table.png +0 -0
  373. data/templates/markitup/jquery/markitup/sets/texy.scss +40 -0
  374. data/templates/markitup/jquery/markitup/sets/texy/bold.png +0 -0
  375. data/templates/markitup/jquery/markitup/sets/texy/code.png +0 -0
  376. data/templates/markitup/jquery/markitup/sets/texy/disconnect.png +0 -0
  377. data/templates/markitup/jquery/markitup/sets/texy/h1.png +0 -0
  378. data/templates/markitup/jquery/markitup/sets/texy/h2.png +0 -0
  379. data/templates/markitup/jquery/markitup/sets/texy/h3.png +0 -0
  380. data/templates/markitup/jquery/markitup/sets/texy/h4.png +0 -0
  381. data/templates/markitup/jquery/markitup/sets/texy/h5.png +0 -0
  382. data/templates/markitup/jquery/markitup/sets/texy/h6.png +0 -0
  383. data/templates/markitup/jquery/markitup/sets/texy/italic.png +0 -0
  384. data/templates/markitup/jquery/markitup/sets/texy/link.png +0 -0
  385. data/templates/markitup/jquery/markitup/sets/texy/list-bullet.png +0 -0
  386. data/templates/markitup/jquery/markitup/sets/texy/list-numeric.png +0 -0
  387. data/templates/markitup/jquery/markitup/sets/texy/page_white_code.png +0 -0
  388. data/templates/markitup/jquery/markitup/sets/texy/picture.png +0 -0
  389. data/templates/markitup/jquery/markitup/sets/texy/preview.png +0 -0
  390. data/templates/markitup/jquery/markitup/sets/texy/quotes.png +0 -0
  391. data/templates/markitup/jquery/markitup/sets/texy/stroke.png +0 -0
  392. data/templates/markitup/jquery/markitup/sets/txt2tags.scss +44 -0
  393. data/templates/markitup/jquery/markitup/sets/txt2tags/bold.png +0 -0
  394. data/templates/markitup/jquery/markitup/sets/txt2tags/code.png +0 -0
  395. data/templates/markitup/jquery/markitup/sets/txt2tags/disconnect.png +0 -0
  396. data/templates/markitup/jquery/markitup/sets/txt2tags/h1.png +0 -0
  397. data/templates/markitup/jquery/markitup/sets/txt2tags/h2.png +0 -0
  398. data/templates/markitup/jquery/markitup/sets/txt2tags/h3.png +0 -0
  399. data/templates/markitup/jquery/markitup/sets/txt2tags/h4.png +0 -0
  400. data/templates/markitup/jquery/markitup/sets/txt2tags/h5.png +0 -0
  401. data/templates/markitup/jquery/markitup/sets/txt2tags/italic.png +0 -0
  402. data/templates/markitup/jquery/markitup/sets/txt2tags/link.png +0 -0
  403. data/templates/markitup/jquery/markitup/sets/txt2tags/list-bullet.png +0 -0
  404. data/templates/markitup/jquery/markitup/sets/txt2tags/list-numeric.png +0 -0
  405. data/templates/markitup/jquery/markitup/sets/txt2tags/picture.png +0 -0
  406. data/templates/markitup/jquery/markitup/sets/txt2tags/preview.png +0 -0
  407. data/templates/markitup/jquery/markitup/sets/txt2tags/quotes.png +0 -0
  408. data/templates/markitup/jquery/markitup/sets/txt2tags/stroke.png +0 -0
  409. data/templates/markitup/jquery/markitup/sets/txt2tags/underline.png +0 -0
  410. data/templates/markitup/jquery/markitup/sets/wiki.scss +42 -0
  411. data/templates/markitup/jquery/markitup/sets/wiki/bold.png +0 -0
  412. data/templates/markitup/jquery/markitup/sets/wiki/code.png +0 -0
  413. data/templates/markitup/jquery/markitup/sets/wiki/h1.png +0 -0
  414. data/templates/markitup/jquery/markitup/sets/wiki/h2.png +0 -0
  415. data/templates/markitup/jquery/markitup/sets/wiki/h3.png +0 -0
  416. data/templates/markitup/jquery/markitup/sets/wiki/h4.png +0 -0
  417. data/templates/markitup/jquery/markitup/sets/wiki/h5.png +0 -0
  418. data/templates/markitup/jquery/markitup/sets/wiki/h6.png +0 -0
  419. data/templates/markitup/jquery/markitup/sets/wiki/italic.png +0 -0
  420. data/templates/markitup/jquery/markitup/sets/wiki/link.png +0 -0
  421. data/templates/markitup/jquery/markitup/sets/wiki/list-bullet.png +0 -0
  422. data/templates/markitup/jquery/markitup/sets/wiki/list-numeric.png +0 -0
  423. data/templates/markitup/jquery/markitup/sets/wiki/picture.png +0 -0
  424. data/templates/markitup/jquery/markitup/sets/wiki/preview.png +0 -0
  425. data/templates/markitup/jquery/markitup/sets/wiki/quotes.png +0 -0
  426. data/templates/markitup/jquery/markitup/sets/wiki/stroke.png +0 -0
  427. data/templates/markitup/jquery/markitup/sets/wiki/table.png +0 -0
  428. data/templates/markitup/jquery/markitup/sets/wiki/url.png +0 -0
  429. data/templates/markitup/jquery/markitup/sets/xbbcode.scss +42 -0
  430. data/templates/markitup/jquery/markitup/sets/xbbcode/bold.png +0 -0
  431. data/templates/markitup/jquery/markitup/sets/xbbcode/clean.png +0 -0
  432. data/templates/markitup/jquery/markitup/sets/xbbcode/h1.png +0 -0
  433. data/templates/markitup/jquery/markitup/sets/xbbcode/h2.png +0 -0
  434. data/templates/markitup/jquery/markitup/sets/xbbcode/h3.png +0 -0
  435. data/templates/markitup/jquery/markitup/sets/xbbcode/h4.png +0 -0
  436. data/templates/markitup/jquery/markitup/sets/xbbcode/h5.png +0 -0
  437. data/templates/markitup/jquery/markitup/sets/xbbcode/h6.png +0 -0
  438. data/templates/markitup/jquery/markitup/sets/xbbcode/image.png +0 -0
  439. data/templates/markitup/jquery/markitup/sets/xbbcode/italic.png +0 -0
  440. data/templates/markitup/jquery/markitup/sets/xbbcode/link.png +0 -0
  441. data/templates/markitup/jquery/markitup/sets/xbbcode/list-bullet.png +0 -0
  442. data/templates/markitup/jquery/markitup/sets/xbbcode/list-item.png +0 -0
  443. data/templates/markitup/jquery/markitup/sets/xbbcode/list-numeric.png +0 -0
  444. data/templates/markitup/jquery/markitup/sets/xbbcode/paragraph.png +0 -0
  445. data/templates/markitup/jquery/markitup/sets/xbbcode/picture.png +0 -0
  446. data/templates/markitup/jquery/markitup/sets/xbbcode/preview.png +0 -0
  447. data/templates/markitup/jquery/markitup/sets/xbbcode/stroke.png +0 -0
  448. data/templates/markitup/jquery/markitup/skins/aqua.scss +136 -0
  449. data/templates/markitup/jquery/markitup/skins/aqua/bg-container-white.png +0 -0
  450. data/templates/markitup/jquery/markitup/skins/aqua/bg-container.png +0 -0
  451. data/templates/markitup/jquery/markitup/skins/aqua/bg-footer-white.png +0 -0
  452. data/templates/markitup/jquery/markitup/skins/aqua/bg-footer.png +0 -0
  453. data/templates/markitup/jquery/markitup/skins/aqua/bg-header-white.png +0 -0
  454. data/templates/markitup/jquery/markitup/skins/aqua/bg-header.png +0 -0
  455. data/templates/markitup/jquery/markitup/skins/aqua/handle.png +0 -0
  456. data/templates/markitup/jquery/markitup/skins/aqua/menu.png +0 -0
  457. data/templates/markitup/jquery/markitup/skins/aqua/spacer.gif +0 -0
  458. data/templates/markitup/jquery/markitup/skins/aqua/submenu.png +0 -0
  459. data/templates/markitup/jquery/markitup/skins/jtageditor.scss +141 -0
  460. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-container.png +0 -0
  461. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor-bbcode.png +0 -0
  462. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor-dotclear.png +0 -0
  463. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor-html.png +0 -0
  464. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor-markdown.png +0 -0
  465. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor-textile.png +0 -0
  466. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor-wiki.png +0 -0
  467. data/templates/markitup/jquery/markitup/skins/jtageditor/bg-editor.png +0 -0
  468. data/templates/markitup/jquery/markitup/skins/jtageditor/handle.png +0 -0
  469. data/templates/markitup/jquery/markitup/skins/jtageditor/menu.png +0 -0
  470. data/templates/markitup/jquery/markitup/skins/jtageditor/submenu.png +0 -0
  471. data/templates/markitup/jquery/markitup/skins/live.scss +135 -0
  472. data/templates/markitup/jquery/markitup/skins/live/bg-container.png +0 -0
  473. data/templates/markitup/jquery/markitup/skins/live/bg-footer.png +0 -0
  474. data/templates/markitup/jquery/markitup/skins/live/bg-header.png +0 -0
  475. data/templates/markitup/jquery/markitup/skins/live/editor.png +0 -0
  476. data/templates/markitup/jquery/markitup/skins/live/handle.png +0 -0
  477. data/templates/markitup/jquery/markitup/skins/live/menu.png +0 -0
  478. data/templates/markitup/jquery/markitup/skins/live/submenu.png +0 -0
  479. data/templates/markitup/jquery/markitup/skins/markitup.scss +150 -0
  480. data/templates/markitup/jquery/markitup/skins/markitup/bg-container.png +0 -0
  481. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-bbcode.png +0 -0
  482. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-dotclear.png +0 -0
  483. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-html.png +0 -0
  484. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-json.png +0 -0
  485. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-markdown.png +0 -0
  486. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-textile.png +0 -0
  487. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-wiki.png +0 -0
  488. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor-xml.png +0 -0
  489. data/templates/markitup/jquery/markitup/skins/markitup/bg-editor.png +0 -0
  490. data/templates/markitup/jquery/markitup/skins/markitup/handle.png +0 -0
  491. data/templates/markitup/jquery/markitup/skins/markitup/menu.png +0 -0
  492. data/templates/markitup/jquery/markitup/skins/markitup/submenu.png +0 -0
  493. data/templates/markitup/jquery/markitup/skins/simple.scss +117 -0
  494. data/templates/markitup/jquery/markitup/skins/simple/handle.png +0 -0
  495. data/templates/markitup/jquery/markitup/skins/simple/menu.png +0 -0
  496. data/templates/markitup/jquery/markitup/skins/simple/submenu.png +0 -0
  497. data/templates/markitup/manifest.rb +311 -0
  498. data/templates/markitup/markitup/jquery.markitup.set.bbcode.js +40 -0
  499. data/templates/markitup/markitup/jquery.markitup.set.bbcode.min.js +3 -0
  500. data/templates/markitup/markitup/jquery.markitup.set.css.js +53 -0
  501. data/templates/markitup/markitup/jquery.markitup.set.css.min.js +5 -0
  502. data/templates/markitup/markitup/jquery.markitup.set.default.js +30 -0
  503. data/templates/markitup/markitup/jquery.markitup.set.default.min.js +2 -0
  504. data/templates/markitup/markitup/jquery.markitup.set.dotclear.js +38 -0
  505. data/templates/markitup/markitup/jquery.markitup.set.dotclear.min.js +3 -0
  506. data/templates/markitup/markitup/jquery.markitup.set.html.js +40 -0
  507. data/templates/markitup/markitup/jquery.markitup.set.html.min.js +4 -0
  508. data/templates/markitup/markitup/jquery.markitup.set.markdown.js +53 -0
  509. data/templates/markitup/markitup/jquery.markitup.set.markdown.min.js +3 -0
  510. data/templates/markitup/markitup/jquery.markitup.set.markmin.js +50 -0
  511. data/templates/markitup/markitup/jquery.markitup.set.markmin.min.js +3 -0
  512. data/templates/markitup/markitup/jquery.markitup.set.rest.js +52 -0
  513. data/templates/markitup/markitup/jquery.markitup.set.rest.min.js +3 -0
  514. data/templates/markitup/markitup/jquery.markitup.set.textile.js +58 -0
  515. data/templates/markitup/markitup/jquery.markitup.set.textile.min.js +4 -0
  516. data/templates/markitup/markitup/jquery.markitup.set.texy.js +52 -0
  517. data/templates/markitup/markitup/jquery.markitup.set.texy.min.js +4 -0
  518. data/templates/markitup/markitup/jquery.markitup.set.txt2tags.js +42 -0
  519. data/templates/markitup/markitup/jquery.markitup.set.txt2tags.min.js +3 -0
  520. data/templates/markitup/markitup/jquery.markitup.set.wiki.js +61 -0
  521. data/templates/markitup/markitup/jquery.markitup.set.wiki.min.js +4 -0
  522. data/templates/markitup/markitup/jquery.markitup.set.xbbcode.js +36 -0
  523. data/templates/markitup/markitup/jquery.markitup.set.xbbcode.min.js +4 -0
  524. data/templates/mobile/config/initializers/mobile.rb +2 -0
  525. data/templates/mobile/jquery.mobile.js +4545 -4454
  526. data/templates/mobile/jquery.mobile.min.js +16 -7
  527. data/templates/mobile/jquery/mobile/960.fluid.scss +191 -0
  528. data/templates/mobile/jquery/mobile/960.scss +213 -0
  529. data/templates/mobile/jquery/mobile/_base.scss +37 -20
  530. data/templates/mobile/jquery/mobile/default.scss +48 -56
  531. data/templates/mobile/jquery/mobile/valencia.scss +43 -44
  532. data/templates/mobile/manifest.rb +2 -0
  533. data/templates/ribbon/jquery.ribbon.js +195 -195
  534. data/templates/ribbon/jquery.ribbon.min.js +1 -1
  535. data/templates/ribbon/jquery/ribbon/office.scss +12 -12
  536. data/templates/ribbon/jquery/ribbon/windows7.scss +12 -12
  537. data/templates/secret_sauce/secret_sauce.js +8 -8
  538. data/templates/tools/flowplayer.js +897 -897
  539. data/templates/tools/jquery.tools.js +3647 -3647
  540. data/templates/tools/jquery.tools.min.js +47 -47
  541. data/templates/tools/swfobject.js +760 -760
  542. metadata +350 -22
@@ -4,8 +4,8 @@
4
4
  (function(f){var i=f.document,j=f.setInterval||j,a=f.History=f.History||{};if(typeof a.initHtml4!=="undefined")throw Error("History.js HTML4 Support has already been loaded...");a.initHtml4=function(){if(typeof a.initHtml4.initialized!=="undefined")return!1;else a.initHtml4.initialized=!0;a.enabled=!0;a.savedHashes=[];a.isLastHash=function(b){var c=a.getHashByIndex();return b===c};a.saveHash=function(b){if(a.isLastHash(b))return!1;a.savedHashes.push(b);return!0};a.getHashByIndex=function(b){var c=
5
5
  null;return c=typeof b==="undefined"?a.savedHashes[a.savedHashes.length-1]:b<0?a.savedHashes[a.savedHashes.length+b]:a.savedHashes[b]};a.discardedHashes={};a.discardedStates={};a.discardState=function(b,c,e){var g=a.getHashByState(b);a.discardedStates[g]={discardedState:b,backState:e,forwardState:c};return!0};a.discardHash=function(b,c,e){a.discardedHashes[b]={discardedHash:b,backState:e,forwardState:c};return!0};a.discardedState=function(b){b=a.getHashByState(b);return a.discardedStates[b]||!1};
6
6
  a.discardedHash=function(b){return a.discardedHashes[b]||!1};a.recycleState=function(b){var c=a.getHashByState(b);a.discardedState(b)&&delete a.discardedStates[c];return!0};if(a.emulated.hashChange)a.hashChangeInit=function(){a.checkerFunction=null;var b="";if(a.isInternetExplorer()){var c=i.createElement("iframe");c.setAttribute("id","historyjs-iframe");c.style.display="none";i.body.appendChild(c);c.contentWindow.document.open();c.contentWindow.document.close();var e="",g=!1;a.checkerFunction=function(){if(g)return!1;
7
- g=!0;var d=a.getHash()||"",h=a.unescapeHash(c.contentWindow.document.location.hash)||"";if(d!==b){b=d;if(h!==d)e=d,c.contentWindow.document.open(),c.contentWindow.document.close(),c.contentWindow.document.location.hash=a.escapeHash(d);a.Adapter.trigger(f,"hashchange")}else h!==e&&(e=h,a.setHash(h,!1));g=!1;return!0}}else a.checkerFunction=function(){var c=a.getHash();c!==b&&(b=c,a.Adapter.trigger(f,"hashchange"));return!0};j(a.checkerFunction,a.options.hashChangeInterval);return!0},a.Adapter.onDomLoad(a.hashChangeInit);
8
- if(a.emulated.pushState&&(a.onHashChange=function(b){var c=a.getHashByUrl(b&&b.newURL||i.location.href),b=null;if(a.isLastHash(c))return a.busy(!1),!1;a.doubleCheckComplete();a.saveHash(c);if(c&&a.isTraditionalAnchor(c))return a.Adapter.trigger(f,"anchorchange"),a.busy(!1),!1;b=a.extractState(a.getFullUrl(c||i.location.href,!1),!0);if(a.isLastSavedState(b))return a.busy(!1),!1;a.getHashByState(b);if(c=a.discardedState(b))return a.getHashByIndex(-2)===a.getHashByState(c.forwardState)?a.back(!1):a.forward(!1),
9
- !1;a.pushState(b.data,b.title,b.url,!1);return!0},a.Adapter.bind(f,"hashchange",a.onHashChange),a.pushState=function(b,c,e,g){if(a.getHashByUrl(e))throw Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(g!==!1&&a.busy())return a.pushQueue({scope:a,callback:a.pushState,args:arguments,queue:g}),!1;a.busy(!0);var d=a.createStateObject(b,c,e),h=a.getHashByState(d),k=a.getState(!1),k=a.getHashByState(k),j=a.getHash();a.storeState(d);a.expectedStateId=d.id;a.recycleState(d);
10
- a.setTitle(d);if(h===k)return a.busy(!1),!1;if(h!==j&&h!==a.getShortUrl(i.location.href))return a.setHash(h,!1),!1;a.saveState(d);a.Adapter.trigger(f,"statechange");a.busy(!1);return!0},a.replaceState=function(b,c,e,g){if(a.getHashByUrl(e))throw Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(g!==!1&&a.busy())return a.pushQueue({scope:a,callback:a.replaceState,args:arguments,queue:g}),!1;a.busy(!0);var d=a.createStateObject(b,c,e),h=a.getState(!1),f=a.getStateByIndex(-2);
11
- a.discardState(h,d,f);a.pushState(d.data,d.title,d.url,!1);return!0},a.getHash()&&!a.emulated.hashChange))a.Adapter.onDomLoad(function(){a.Adapter.trigger(f,"hashchange")})};a.init()})(window);
7
+ g=!0;var d=a.getHash()||"",h=a.unescapeHash(c.contentWindow.document.location.hash)||"";if(d!==b){b=d;if(h!==d)e=d,c.contentWindow.document.open(),c.contentWindow.document.close(),c.contentWindow.document.location.hash=a.escapeHash(d);a.Adapter.trigger(f,"hashchange")}else h!==e&&(e=h,a.setHash(h,!1));g=!1;return!0}}else a.checkerFunction=function(){var c=a.getHash();c!==b&&(b=c,a.Adapter.trigger(f,"hashchange"));return!0};a.intervalList.push(j(a.checkerFunction,a.options.hashChangeInterval));return!0},
8
+ a.Adapter.onDomLoad(a.hashChangeInit);if(a.emulated.pushState&&(a.onHashChange=function(b){var c=a.getHashByUrl(b&&b.newURL||i.location.href),b=null;if(a.isLastHash(c))return a.busy(!1),!1;a.doubleCheckComplete();a.saveHash(c);if(c&&a.isTraditionalAnchor(c))return a.Adapter.trigger(f,"anchorchange"),a.busy(!1),!1;b=a.extractState(a.getFullUrl(c||i.location.href,!1),!0);if(a.isLastSavedState(b))return a.busy(!1),!1;a.getHashByState(b);if(c=a.discardedState(b))return a.getHashByIndex(-2)===a.getHashByState(c.forwardState)?
9
+ a.back(!1):a.forward(!1),!1;a.pushState(b.data,b.title,b.url,!1);return!0},a.Adapter.bind(f,"hashchange",a.onHashChange),a.pushState=function(b,c,e,g){if(a.getHashByUrl(e))throw Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(g!==!1&&a.busy())return a.pushQueue({scope:a,callback:a.pushState,args:arguments,queue:g}),!1;a.busy(!0);var d=a.createStateObject(b,c,e),h=a.getHashByState(d),k=a.getState(!1),k=a.getHashByState(k),j=a.getHash();a.storeState(d);a.expectedStateId=
10
+ d.id;a.recycleState(d);a.setTitle(d);if(h===k)return a.busy(!1),!1;if(h!==j&&h!==a.getShortUrl(i.location.href))return a.setHash(h,!1),!1;a.saveState(d);a.Adapter.trigger(f,"statechange");a.busy(!1);return!0},a.replaceState=function(b,c,e,g){if(a.getHashByUrl(e))throw Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(g!==!1&&a.busy())return a.pushQueue({scope:a,callback:a.replaceState,args:arguments,queue:g}),!1;a.busy(!0);var d=a.createStateObject(b,c,e),
11
+ h=a.getState(!1),f=a.getStateByIndex(-2);a.discardState(h,d,f);a.pushState(d.data,d.title,d.url,!1);return!0},a.getHash()&&!a.emulated.hashChange))a.Adapter.onDomLoad(function(){a.Adapter.trigger(f,"hashchange")})};a.init()})(window);
@@ -6,1843 +6,1870 @@
6
6
  */
7
7
 
8
8
  (function(window, undefined) {
9
- "use strict";
9
+ "use strict";
10
+
11
+ // --------------------------------------------------------------------------
12
+ // Initialise
13
+
14
+ // Localise Globals
15
+ var
16
+ console = window.console || undefined, // Prevent a JSLint complain
17
+ document = window.document, // Make sure we are using the correct document
18
+ navigator = window.navigator, // Make sure we are using the correct navigator
19
+ amplify = window.amplify || false, // Amplify.js
20
+ setTimeout = window.setTimeout,
21
+ clearTimeout = window.clearTimeout,
22
+ setInterval = window.setInterval,
23
+ clearInterval = window.clearInterval,
24
+ JSON = window.JSON,
25
+ History = window.History = window.History || {}, // Public History Object
26
+ history = window.history; // Old History Object
27
+
28
+ // MooTools Compatibility
29
+ JSON.stringify = JSON.stringify || JSON.encode;
30
+ JSON.parse = JSON.parse || JSON.decode;
31
+
32
+ // Check Existence
33
+ if (typeof History.init !== 'undefined') {
34
+ throw new Error('History.js Core has already been loaded...');
35
+ }
36
+
37
+ // Initialise History
38
+ History.init = function() {
39
+ // Check Load Status of Adapter
40
+ if (typeof History.Adapter === 'undefined') {
41
+ return false;
42
+ }
10
43
 
11
- // --------------------------------------------------------------------------
12
- // Initialise
44
+ // Check Load Status of Core
45
+ if (typeof History.initCore !== 'undefined') {
46
+ History.initCore();
47
+ }
13
48
 
14
- // Localise Globals
15
- var
16
- console = window.console || undefined, // Prevent a JSLint complain
17
- document = window.document, // Make sure we are using the correct document
18
- navigator = window.navigator, // Make sure we are using the correct navigator
19
- amplify = window.amplify || false, // Amplify.js
20
- setTimeout = window.setTimeout,
21
- clearTimeout = window.clearTimeout,
22
- setInterval = window.setInterval,
23
- JSON = window.JSON,
24
- History = window.History = window.History || {}, // Public History Object
25
- history = window.history; // Old History Object
26
-
27
- // MooTools Compatibility
28
- JSON.stringify = JSON.stringify || JSON.encode;
29
- JSON.parse = JSON.parse || JSON.decode;
30
-
31
- // Check Existence
32
- if (typeof History.init !== 'undefined') {
33
- throw new Error('History.js Core has already been loaded...');
49
+ // Check Load Status of HTML4 Support
50
+ if (typeof History.initHtml4 !== 'undefined') {
51
+ History.initHtml4();
34
52
  }
35
53
 
36
- // Initialise History
37
- History.init = function() {
38
- // Check Load Status of Adapter
39
- if (typeof History.Adapter === 'undefined') {
40
- return false;
41
- }
54
+ // Return true
55
+ return true;
56
+ };
42
57
 
43
- // Check Load Status of Core
44
- if (typeof History.initCore !== 'undefined') {
45
- History.initCore();
46
- }
58
+ // --------------------------------------------------------------------------
59
+ // Initialise Core
47
60
 
48
- // Check Load Status of HTML4 Support
49
- if (typeof History.initHtml4 !== 'undefined') {
50
- History.initHtml4();
51
- }
61
+ // Initialise Core
62
+ History.initCore = function() {
63
+ // Initialise
64
+ if (typeof History.initCore.initialized !== 'undefined') {
65
+ // Already Loaded
66
+ return false;
67
+ }
68
+ else {
69
+ History.initCore.initialized = true;
70
+ }
52
71
 
53
- // Return true
54
- return true;
72
+ // ----------------------------------------------------------------------
73
+ // Options
74
+
75
+ /**
76
+ * History.options
77
+ * Configurable options
78
+ */
79
+ History.options = History.options || {};
80
+
81
+ /**
82
+ * History.options.hashChangeInterval
83
+ * How long should the interval be before hashchange checks
84
+ */
85
+ History.options.hashChangeInterval = History.options.hashChangeInterval || 100;
86
+
87
+ /**
88
+ * History.options.safariPollInterval
89
+ * How long should the interval be before safari poll checks
90
+ */
91
+ History.options.safariPollInterval = History.options.safariPollInterval || 500;
92
+
93
+ /**
94
+ * History.options.doubleCheckInterval
95
+ * How long should the interval be before we perform a double check
96
+ */
97
+ History.options.doubleCheckInterval = History.options.doubleCheckInterval || 500;
98
+
99
+ /**
100
+ * History.options.storeInterval
101
+ * How long should we wait between store calls
102
+ */
103
+ History.options.storeInterval = History.options.storeInterval || 1000;
104
+
105
+ /**
106
+ * History.options.busyDelay
107
+ * How long should we wait between busy events
108
+ */
109
+ History.options.busyDelay = History.options.busyDelay || 250;
110
+
111
+ /**
112
+ * History.options.debug
113
+ * If true will enable debug messages to be logged
114
+ */
115
+ History.options.debug = History.options.debug || false;
116
+
117
+ /**
118
+ * History.options.initialTitle
119
+ * What is the title of the initial state
120
+ */
121
+ History.options.initialTitle = History.options.initialTitle || document.title;
122
+
123
+
124
+ // ----------------------------------------------------------------------
125
+ // Interval record
126
+
127
+ /**
128
+ * History.intervalList
129
+ * List of intervals set, to be cleared when document is unloaded.
130
+ */
131
+ History.intervalList = [];
132
+
133
+ /**
134
+ * History.clearAllIntervals
135
+ * Clears all setInterval instances.
136
+ */
137
+ History.clearAllIntervals = function() {
138
+ var i, il = History.intervalList;
139
+ if (typeof il !== "undefined" && il !== null) {
140
+ for (i = 0; i < il.length; i++) {
141
+ clearInterval(il[i]);
142
+ }
143
+ History.intervalList = null;
144
+ }
55
145
  };
146
+ History.Adapter.bind(window, "beforeunload", History.clearAllIntervals);
147
+ History.Adapter.bind(window, "unload", History.clearAllIntervals);
56
148
 
57
- // --------------------------------------------------------------------------
58
- // Initialise Core
59
149
 
60
- // Initialise Core
61
- History.initCore = function() {
62
- // Initialise
63
- if (typeof History.initCore.initialized !== 'undefined') {
64
- // Already Loaded
65
- return false;
150
+ // ----------------------------------------------------------------------
151
+ // Debug
152
+
153
+ /**
154
+ * History.debug(message,...)
155
+ * Logs the passed arguments if debug enabled
156
+ */
157
+ History.debug = function() {
158
+ if ((History.options.debug || false)) {
159
+ History.log.apply(History, arguments);
160
+ }
161
+ };
162
+
163
+ /**
164
+ * History.log(message,...)
165
+ * Logs the passed arguments
166
+ */
167
+ History.log = function() {
168
+ // Prepare
169
+ var
170
+ consoleExists = !(typeof console === 'undefined' || typeof console.log === 'undefined' || typeof console.log.apply === 'undefined'),
171
+ textarea = document.getElementById('log'),
172
+ message,
173
+ i,n
174
+ ;
175
+
176
+ // Write to Console
177
+ if (consoleExists) {
178
+ var args = Array.prototype.slice.call(arguments);
179
+ message = args.shift();
180
+ if (typeof console.debug !== 'undefined') {
181
+ console.debug.apply(console, [message,args]);
66
182
  }
67
183
  else {
68
- History.initCore.initialized = true;
184
+ console.log.apply(console, [message,args]);
69
185
  }
186
+ }
187
+ else {
188
+ message = ("\n" + arguments[0] + "\n");
189
+ }
190
+
191
+ // Write to log
192
+ for (i = 1,n = arguments.length; i < n; ++i) {
193
+ var arg = arguments[i];
194
+ if (typeof arg === 'object' && typeof JSON !== 'undefined') {
195
+ try {
196
+ arg = JSON.stringify(arg);
197
+ }
198
+ catch (Exception) {
199
+ // Recursive Object
200
+ }
201
+ }
202
+ message += "\n" + arg + "\n";
203
+ }
204
+
205
+ // Textarea
206
+ if (textarea) {
207
+ textarea.value += message + "\n-----\n";
208
+ textarea.scrollTop = textarea.scrollHeight - textarea.clientHeight;
209
+ }
210
+ // No Textarea, No Console
211
+ else if (!consoleExists) {
212
+ alert(message);
213
+ }
214
+
215
+ // Return true
216
+ return true;
217
+ };
70
218
 
71
- // ----------------------------------------------------------------------
72
- // Options
73
-
74
- /**
75
- * History.options
76
- * Configurable options
77
- */
78
- History.options = History.options || {};
79
-
80
- /**
81
- * History.options.hashChangeInterval
82
- * How long should the interval be before hashchange checks
83
- */
84
- History.options.hashChangeInterval = History.options.hashChangeInterval || 100;
85
-
86
- /**
87
- * History.options.safariPollInterval
88
- * How long should the interval be before safari poll checks
89
- */
90
- History.options.safariPollInterval = History.options.safariPollInterval || 500;
91
-
92
- /**
93
- * History.options.doubleCheckInterval
94
- * How long should the interval be before we perform a double check
95
- */
96
- History.options.doubleCheckInterval = History.options.doubleCheckInterval || 500;
97
-
98
- /**
99
- * History.options.storeInterval
100
- * How long should we wait between store calls
101
- */
102
- History.options.storeInterval = History.options.storeInterval || 1000;
103
-
104
- /**
105
- * History.options.busyDelay
106
- * How long should we wait between busy events
107
- */
108
- History.options.busyDelay = History.options.busyDelay || 250;
109
-
110
- /**
111
- * History.options.debug
112
- * If true will enable debug messages to be logged
113
- */
114
- History.options.debug = History.options.debug || false;
115
-
116
- /**
117
- * History.options.initialTitle
118
- * What is the title of the initial state
119
- */
120
- History.options.initialTitle = History.options.initialTitle || document.title;
121
-
122
-
123
- // ----------------------------------------------------------------------
124
- // Debug
125
-
126
- /**
127
- * History.debug(message,...)
128
- * Logs the passed arguments if debug enabled
129
- */
130
- History.debug = function() {
131
- if ((History.options.debug || false)) {
132
- History.log.apply(History, arguments);
133
- }
134
- };
135
-
136
- /**
137
- * History.log(message,...)
138
- * Logs the passed arguments
139
- */
140
- History.log = function() {
141
- // Prepare
142
- var
143
- consoleExists = !(typeof console === 'undefined' || typeof console.log === 'undefined' || typeof console.log.apply === 'undefined'),
144
- textarea = document.getElementById('log'),
145
- message,
146
- i,n
147
- ;
148
-
149
- // Write to Console
150
- if (consoleExists) {
151
- var args = Array.prototype.slice.call(arguments);
152
- message = args.shift();
153
- if (typeof console.debug !== 'undefined') {
154
- console.debug.apply(console, [message,args]);
155
- }
156
- else {
157
- console.log.apply(console, [message,args]);
158
- }
159
- }
160
- else {
161
- message = ("\n" + arguments[0] + "\n");
162
- }
163
-
164
- // Write to log
165
- for (i = 1,n = arguments.length; i < n; ++i) {
166
- var arg = arguments[i];
167
- if (typeof arg === 'object' && typeof JSON !== 'undefined') {
168
- try {
169
- arg = JSON.stringify(arg);
170
- }
171
- catch (Exception) {
172
- // Recursive Object
173
- }
174
- }
175
- message += "\n" + arg + "\n";
176
- }
177
-
178
- // Textarea
179
- if (textarea) {
180
- textarea.value += message + "\n-----\n";
181
- textarea.scrollTop = textarea.scrollHeight - textarea.clientHeight;
182
- }
183
- // No Textarea, No Console
184
- else if (!consoleExists) {
185
- alert(message);
186
- }
187
-
188
- // Return true
189
- return true;
190
- };
191
-
192
- // ----------------------------------------------------------------------
193
- // Emulated Status
194
-
195
- /**
196
- * History.getInternetExplorerMajorVersion()
197
- * Get's the major version of Internet Explorer
198
- * @return {integer}
199
- * @license Public Domain
200
- * @author Benjamin Arthur Lupton <contact@balupton.com>
201
- * @author James Padolsey <https://gist.github.com/527683>
202
- */
203
- History.getInternetExplorerMajorVersion = function() {
204
- var result = History.getInternetExplorerMajorVersion.cached =
205
- (typeof History.getInternetExplorerMajorVersion.cached !== 'undefined')
206
- ? History.getInternetExplorerMajorVersion.cached
207
- : (function() {
208
- var v = 3,
209
- div = document.createElement('div'),
210
- all = div.getElementsByTagName('i');
211
- while ((div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->') && all[0]) {
212
- }
213
- return (v > 4) ? v : false;
214
- })()
215
- ;
216
- return result;
217
- };
218
-
219
- /**
220
- * History.isInternetExplorer()
221
- * Are we using Internet Explorer?
222
- * @return {boolean}
223
- * @license Public Domain
224
- * @author Benjamin Arthur Lupton <contact@balupton.com>
225
- */
226
- History.isInternetExplorer = function() {
227
- var result =
228
- History.isInternetExplorer.cached =
229
- (typeof History.isInternetExplorer.cached !== 'undefined')
230
- ? History.isInternetExplorer.cached
231
- : Boolean(History.getInternetExplorerMajorVersion())
232
- ;
233
- return result;
234
- };
235
-
236
- /**
237
- * History.emulated
238
- * Which features require emulating?
239
- */
240
- History.emulated = {
241
- pushState: !Boolean(
242
- window.history && window.history.pushState && window.history.replaceState
243
- && !(
244
- (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent) /* disable for versions of iOS before version 4.3 (8F190) */
245
- || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent) /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
246
- )
247
- ),
248
- hashChange: Boolean(
249
- !(('onhashchange' in window) || ('onhashchange' in document))
250
- ||
251
- (History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8)
252
- )
253
- };
254
-
255
- /**
256
- * History.enabled
257
- * Is History enabled?
258
- */
259
- History.enabled = !History.emulated.pushState;
260
-
261
- /**
262
- * History.bugs
263
- * Which bugs are present
264
- */
265
- History.bugs = {
266
- /**
267
- * Safari 5 and Safari iOS 4 fail to return to the correct state once a hash is replaced by a `replaceState` call
268
- * https://bugs.webkit.org/show_bug.cgi?id=56249
269
- */
270
- setHash: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)),
271
-
272
- /**
273
- * Safari 5 and Safari iOS 4 sometimes fail to apply the state change under busy conditions
274
- * https://bugs.webkit.org/show_bug.cgi?id=42940
275
- */
276
- safariPoll: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)),
277
-
278
- /**
279
- * MSIE 6 and 7 sometimes do not apply a hash even it was told to (requiring a second call to the apply function)
280
- */
281
- ieDoubleCheck: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8),
282
-
283
- /**
284
- * MSIE 6 requires the entire hash to be encoded for the hashes to trigger the onHashChange event
285
- */
286
- hashEscape: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 7)
287
- };
288
-
289
- /**
290
- * History.isEmptyObject(obj)
291
- * Checks to see if the Object is Empty
292
- * @param {Object} obj
293
- * @return {boolean}
294
- */
295
- History.isEmptyObject = function(obj) {
296
- for (var name in obj) {
297
- return false;
298
- }
299
- return true;
300
- };
301
-
302
- /**
303
- * History.cloneObject(obj)
304
- * Clones a object
305
- * @param {Object} obj
306
- * @return {Object}
307
- */
308
- History.cloneObject = function(obj) {
309
- var hash,newObj;
310
- if (obj) {
311
- hash = JSON.stringify(obj);
312
- newObj = JSON.parse(hash);
313
- }
314
- else {
315
- newObj = {};
316
- }
317
- return newObj;
318
- };
319
-
320
- // ----------------------------------------------------------------------
321
- // URL Helpers
322
-
323
- /**
324
- * History.getRootUrl()
325
- * Turns "http://mysite.com/dir/page.html?asd" into "http://mysite.com"
326
- * @return {String} rootUrl
327
- */
328
- History.getRootUrl = function() {
329
- // Create
330
- var rootUrl = document.location.protocol + '//' + (document.location.hostname || document.location.host);
331
- if (document.location.port || false) {
332
- rootUrl += ':' + document.location.port;
333
- }
334
- rootUrl += '/';
335
-
336
- // Return
337
- return rootUrl;
338
- };
339
-
340
- /**
341
- * History.getBaseHref()
342
- * Fetches the `href` attribute of the `<base href="...">` element if it exists
343
- * @return {String} baseHref
344
- */
345
- History.getBaseHref = function() {
346
- // Create
347
- var
348
- baseElements = document.getElementsByTagName('base'),
349
- baseElement = null,
350
- baseHref = '';
351
-
352
- // Test for Base Element
353
- if (baseElements.length === 1) {
354
- // Prepare for Base Element
355
- baseElement = baseElements[0];
356
- baseHref = baseElement.href.replace(/[^\/]+$/, '');
357
- }
358
-
359
- // Adjust trailing slash
360
- baseHref = baseHref.replace(/\/+$/, '');
361
- if (baseHref) baseHref += '/';
362
-
363
- // Return
364
- return baseHref;
365
- };
366
-
367
- /**
368
- * History.getBaseUrl()
369
- * Fetches the baseHref or basePageUrl or rootUrl (whichever one exists first)
370
- * @return {String} baseUrl
371
- */
372
- History.getBaseUrl = function() {
373
- // Create
374
- var baseUrl = History.getBaseHref() || History.getBasePageUrl() || History.getRootUrl();
375
-
376
- // Return
377
- return baseUrl;
378
- };
379
-
380
- /**
381
- * History.getPageUrl()
382
- * Fetches the URL of the current page
383
- * @return {String} pageUrl
384
- */
385
- History.getPageUrl = function() {
386
- // Fetch
387
- var
388
- State = History.getState(false, false),
389
- stateUrl = (State || {}).url || document.location.href;
390
-
391
- // Create
392
- var pageUrl = stateUrl.replace(/\/+$/, '').replace(/[^\/]+$/, function(part, index, string) {
393
- return (/\./).test(part) ? part : part + '/';
394
- });
395
-
396
- // Return
397
- return pageUrl;
398
- };
399
-
400
- /**
401
- * History.getBasePageUrl()
402
- * Fetches the Url of the directory of the current page
403
- * @return {String} basePageUrl
404
- */
405
- History.getBasePageUrl = function() {
406
- // Create
407
- var basePageUrl = document.location.href.replace(/[#\?].*/, '').replace(/[^\/]+$/,
408
- function(part, index, string) {
409
- return (/[^\/]$/).test(part) ? '' : part;
410
- }).replace(/\/+$/, '') + '/';
411
-
412
- // Return
413
- return basePageUrl;
414
- };
415
-
416
- /**
417
- * History.getFullUrl(url)
418
- * Ensures that we have an absolute URL and not a relative URL
419
- * @param {string} url
420
- * @param {Boolean} allowBaseHref
421
- * @return {string} fullUrl
422
- */
423
- History.getFullUrl = function(url, allowBaseHref) {
424
- // Prepare
425
- var fullUrl = url, firstChar = url.substring(0, 1);
426
- allowBaseHref = (typeof allowBaseHref === 'undefined') ? true : allowBaseHref;
427
-
428
- // Check
429
- if (/[a-z]+\:\/\//.test(url)) {
430
- // Full URL
431
- }
432
- else if (firstChar === '/') {
433
- // Root URL
434
- fullUrl = History.getRootUrl() + url.replace(/^\/+/, '');
435
- }
436
- else if (firstChar === '#') {
437
- // Anchor URL
438
- fullUrl = History.getPageUrl().replace(/#.*/, '') + url;
439
- }
440
- else if (firstChar === '?') {
441
- // Query URL
442
- fullUrl = History.getPageUrl().replace(/[\?#].*/, '') + url;
443
- }
444
- else {
445
- // Relative URL
446
- if (allowBaseHref) {
447
- fullUrl = History.getBaseUrl() + url.replace(/^(\.\/)+/, '');
448
- } else {
449
- fullUrl = History.getBasePageUrl() + url.replace(/^(\.\/)+/, '');
450
- }
451
- // We have an if condition above as we do not want hashes
452
- // which are relative to the baseHref in our URLs
453
- // as if the baseHref changes, then all our bookmarks
454
- // would now point to different locations
455
- // whereas the basePageUrl will always stay the same
456
- }
457
-
458
- // Return
459
- return fullUrl.replace(/\#$/, '');
460
- };
461
-
462
- /**
463
- * History.getShortUrl(url)
464
- * Ensures that we have a relative URL and not a absolute URL
465
- * @param {string} url
466
- * @return {string} url
467
- */
468
- History.getShortUrl = function(url) {
469
- // Prepare
470
- var shortUrl = url, baseUrl = History.getBaseUrl(), rootUrl = History.getRootUrl();
471
-
472
- // Trim baseUrl
473
- if (History.emulated.pushState) {
474
- // We are in a if statement as when pushState is not emulated
475
- // The actual url these short urls are relative to can change
476
- // So within the same session, we the url may end up somewhere different
477
- shortUrl = shortUrl.replace(baseUrl, '');
478
- }
479
-
480
- // Trim rootUrl
481
- shortUrl = shortUrl.replace(rootUrl, '/');
482
-
483
- // Ensure we can still detect it as a state
484
- if (History.isTraditionalAnchor(shortUrl)) {
485
- shortUrl = './' + shortUrl;
486
- }
487
-
488
- // Clean It
489
- shortUrl = shortUrl.replace(/^(\.\/)+/g, './').replace(/\#$/, '');
490
-
491
- // Return
492
- return shortUrl;
493
- };
494
-
495
- // ----------------------------------------------------------------------
496
- // State Storage
497
-
498
- /**
499
- * History.store
500
- * The store for all session specific data
501
- */
502
- History.store = amplify ? (amplify.store('History.store') || {}) : {};
503
- History.store.idToState = History.store.idToState || {};
504
- History.store.urlToId = History.store.urlToId || {};
505
- History.store.stateToId = History.store.stateToId || {};
506
-
507
- /**
508
- * History.idToState
509
- * 1-1: State ID to State Object
510
- */
511
- History.idToState = History.idToState || {};
512
-
513
- /**
514
- * History.stateToId
515
- * 1-1: State String to State ID
516
- */
517
- History.stateToId = History.stateToId || {};
518
-
519
- /**
520
- * History.urlToId
521
- * 1-1: State URL to State ID
522
- */
523
- History.urlToId = History.urlToId || {};
524
-
525
- /**
526
- * History.storedStates
527
- * Store the states in an array
528
- */
529
- History.storedStates = History.storedStates || [];
530
-
531
- /**
532
- * History.savedStates
533
- * Saved the states in an array
534
- */
535
- History.savedStates = History.savedStates || [];
536
-
537
- /**
538
- * History.getState()
539
- * Get an object containing the data, title and url of the current state
540
- * @param {Boolean} friendly
541
- * @param {Boolean} create
542
- * @return {Object} State
543
- */
544
- History.getState = function(friendly, create) {
545
- // Prepare
546
- if (typeof friendly === 'undefined') {
547
- friendly = true;
548
- }
549
- if (typeof create === 'undefined') {
550
- create = true;
551
- }
552
-
553
- // Fetch
554
- var State = History.getLastSavedState();
555
-
556
- // Create
557
- if (!State && create) {
558
- State = History.createStateObject();
559
- }
560
-
561
- // Adjust
562
- if (friendly) {
563
- State = History.cloneObject(State);
564
- State.url = State.cleanUrl || State.url;
565
- }
566
-
567
- // Return
568
- return State;
569
- };
570
-
571
- /**
572
- * History.getIdByState(State)
573
- * Gets a ID for a State
574
- * @param {State} newState
575
- * @return {String} id
576
- */
577
- History.getIdByState = function(newState) {
578
-
579
- // Fetch ID
580
- var id = History.extractId(newState.url);
581
- if (!id) {
582
- // Find ID via State String
583
- var str = History.getStateString(newState);
584
- if (typeof History.stateToId[str] !== 'undefined') {
585
- id = History.stateToId[str];
586
- }
587
- else if (typeof History.store.stateToId[str] !== 'undefined') {
588
- id = History.store.stateToId[str];
589
- }
590
- else {
591
- // Generate a new ID
592
- while (true) {
593
- id = String(Math.floor(Math.random() * 1000));
594
- if (typeof History.idToState[id] === 'undefined' && typeof History.store.idToState[id] === 'undefined') {
595
- break;
596
- }
597
- }
598
-
599
- // Apply the new State to the ID
600
- History.stateToId[str] = id;
601
- History.idToState[id] = newState;
602
- }
603
- }
604
-
605
- // Return ID
606
- return id;
607
- };
608
-
609
- /**
610
- * History.normalizeState(State)
611
- * Expands a State Object
612
- * @param {object} State
613
- * @return {object}
614
- */
615
- History.normalizeState = function(oldState) {
616
- // Prepare
617
- if (!oldState || (typeof oldState !== 'object')) {
618
- oldState = {};
619
- }
620
-
621
- // Check
622
- if (typeof oldState.normalized !== 'undefined') {
623
- return oldState;
624
- }
625
-
626
- // Adjust
627
- if (!oldState.data || (typeof oldState.data !== 'object')) {
628
- oldState.data = {};
629
- }
630
-
631
- // ----------------------------------------------------------------------
632
-
633
- // Create
634
- var newState = {};
635
- newState.normalized = true;
636
- newState.title = oldState.title || '';
637
- newState.url = History.getFullUrl(History.unescapeString(oldState.url || document.location.href));
638
- newState.hash = History.getShortUrl(newState.url);
639
- newState.data = History.cloneObject(oldState.data);
640
-
641
- // Fetch ID
642
- newState.id = History.getIdByState(newState);
643
-
644
- // ----------------------------------------------------------------------
645
-
646
- // Clean the URL
647
- newState.cleanUrl = newState.url.replace(/\??\&_suid.*/, '');
648
- newState.url = newState.cleanUrl;
649
-
650
- // Check to see if we have more than just a url
651
- var dataNotEmpty = !History.isEmptyObject(newState.data);
652
-
653
- // Apply
654
- if (newState.title || dataNotEmpty) {
655
- // Add ID to Hash
656
- newState.hash = History.getShortUrl(newState.url).replace(/\??\&_suid.*/, '');
657
- if (!/\?/.test(newState.hash)) {
658
- newState.hash += '?';
219
+ // ----------------------------------------------------------------------
220
+ // Emulated Status
221
+
222
+ /**
223
+ * History.getInternetExplorerMajorVersion()
224
+ * Get's the major version of Internet Explorer
225
+ * @return {integer}
226
+ * @license Public Domain
227
+ * @author Benjamin Arthur Lupton <contact@balupton.com>
228
+ * @author James Padolsey <https://gist.github.com/527683>
229
+ */
230
+ History.getInternetExplorerMajorVersion = function() {
231
+ var result = History.getInternetExplorerMajorVersion.cached =
232
+ (typeof History.getInternetExplorerMajorVersion.cached !== 'undefined')
233
+ ? History.getInternetExplorerMajorVersion.cached
234
+ : (function() {
235
+ var v = 3,
236
+ div = document.createElement('div'),
237
+ all = div.getElementsByTagName('i');
238
+ while ((div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->') && all[0]) {
659
239
  }
660
- newState.hash += '&_suid=' + newState.id;
661
- }
662
-
663
- // Create the Hashed URL
664
- newState.hashedUrl = History.getFullUrl(newState.hash);
665
-
666
- // ----------------------------------------------------------------------
667
-
668
- // Update the URL if we have a duplicate
669
- if ((History.emulated.pushState || History.bugs.safariPoll) && History.hasUrlDuplicate(newState)) {
670
- newState.url = newState.hashedUrl;
671
- }
672
-
673
- // ----------------------------------------------------------------------
674
-
675
- // Return
676
- return newState;
677
- };
678
-
679
- /**
680
- * History.createStateObject(data,title,url)
681
- * Creates a object based on the data, title and url state params
682
- * @param {object} data
683
- * @param {string} title
684
- * @param {string} url
685
- * @return {object}
686
- */
687
- History.createStateObject = function(data, title, url) {
688
- // Hashify
689
- var State = {
690
- 'data': data,
691
- 'title': title,
692
- 'url': url
693
- };
694
-
695
- // Expand the State
696
- State = History.normalizeState(State);
697
-
698
- // Return object
699
- return State;
700
- };
701
-
702
- /**
703
- * History.getStateById(id)
704
- * Get a state by it's UID
705
- * @param {String} id
706
- */
707
- History.getStateById = function(id) {
708
- // Prepare
709
- id = String(id);
710
-
711
- // Retrieve
712
- var State = History.idToState[id] || History.store.idToState[id] || undefined;
713
-
714
- // Return State
715
- return State;
716
- };
240
+ return (v > 4) ? v : false;
241
+ })()
242
+ ;
243
+ return result;
244
+ };
717
245
 
718
- /**
719
- * Get a State's String
720
- * @param {State} passedState
721
- */
722
- History.getStateString = function(passedState) {
723
- // Prepare
724
- var State = History.normalizeState(passedState);
725
-
726
- // Clean
727
- var cleanedState = {
728
- data: State.data,
729
- title: passedState.title,
730
- url: passedState.url
731
- };
732
-
733
- // Fetch
734
- var str = JSON.stringify(cleanedState);
735
-
736
- // Return
737
- return str;
738
- };
246
+ /**
247
+ * History.isInternetExplorer()
248
+ * Are we using Internet Explorer?
249
+ * @return {boolean}
250
+ * @license Public Domain
251
+ * @author Benjamin Arthur Lupton <contact@balupton.com>
252
+ */
253
+ History.isInternetExplorer = function() {
254
+ var result =
255
+ History.isInternetExplorer.cached =
256
+ (typeof History.isInternetExplorer.cached !== 'undefined')
257
+ ? History.isInternetExplorer.cached
258
+ : Boolean(History.getInternetExplorerMajorVersion())
259
+ ;
260
+ return result;
261
+ };
739
262
 
740
- /**
741
- * Get a State's ID
742
- * @param {State} passedState
743
- * @return {String} id
744
- */
745
- History.getStateId = function(passedState) {
746
- // Prepare
747
- var State = History.normalizeState(passedState);
263
+ /**
264
+ * History.emulated
265
+ * Which features require emulating?
266
+ */
267
+ History.emulated = {
268
+ pushState: !Boolean(
269
+ window.history && window.history.pushState && window.history.replaceState
270
+ && !(
271
+ (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent) /* disable for versions of iOS before version 4.3 (8F190) */
272
+ || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent) /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
273
+ )
274
+ ),
275
+ hashChange: Boolean(
276
+ !(('onhashchange' in window) || ('onhashchange' in document))
277
+ ||
278
+ (History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8)
279
+ )
280
+ };
748
281
 
749
- // Fetch
750
- var id = State.id;
282
+ /**
283
+ * History.enabled
284
+ * Is History enabled?
285
+ */
286
+ History.enabled = !History.emulated.pushState;
287
+
288
+ /**
289
+ * History.bugs
290
+ * Which bugs are present
291
+ */
292
+ History.bugs = {
293
+ /**
294
+ * Safari 5 and Safari iOS 4 fail to return to the correct state once a hash is replaced by a `replaceState` call
295
+ * https://bugs.webkit.org/show_bug.cgi?id=56249
296
+ */
297
+ setHash: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)),
298
+
299
+ /**
300
+ * Safari 5 and Safari iOS 4 sometimes fail to apply the state change under busy conditions
301
+ * https://bugs.webkit.org/show_bug.cgi?id=42940
302
+ */
303
+ safariPoll: Boolean(!History.emulated.pushState && navigator.vendor === 'Apple Computer, Inc.' && /AppleWebKit\/5([0-2]|3[0-3])/.test(navigator.userAgent)),
304
+
305
+ /**
306
+ * MSIE 6 and 7 sometimes do not apply a hash even it was told to (requiring a second call to the apply function)
307
+ */
308
+ ieDoubleCheck: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 8),
309
+
310
+ /**
311
+ * MSIE 6 requires the entire hash to be encoded for the hashes to trigger the onHashChange event
312
+ */
313
+ hashEscape: Boolean(History.isInternetExplorer() && History.getInternetExplorerMajorVersion() < 7)
314
+ };
751
315
 
752
- // Return
753
- return id;
754
- };
316
+ /**
317
+ * History.isEmptyObject(obj)
318
+ * Checks to see if the Object is Empty
319
+ * @param {Object} obj
320
+ * @return {boolean}
321
+ */
322
+ History.isEmptyObject = function(obj) {
323
+ for (var name in obj) {
324
+ return false;
325
+ }
326
+ return true;
327
+ };
755
328
 
756
- /**
757
- * History.getHashByState(State)
758
- * Creates a Hash for the State Object
759
- * @param {State} passedState
760
- * @return {String} hash
761
- */
762
- History.getHashByState = function(passedState) {
763
- // Prepare
764
- var hash, State = History.normalizeState(passedState);
329
+ /**
330
+ * History.cloneObject(obj)
331
+ * Clones a object
332
+ * @param {Object} obj
333
+ * @return {Object}
334
+ */
335
+ History.cloneObject = function(obj) {
336
+ var hash,newObj;
337
+ if (obj) {
338
+ hash = JSON.stringify(obj);
339
+ newObj = JSON.parse(hash);
340
+ }
341
+ else {
342
+ newObj = {};
343
+ }
344
+ return newObj;
345
+ };
765
346
 
766
- // Fetch
767
- hash = State.hash;
347
+ // ----------------------------------------------------------------------
348
+ // URL Helpers
349
+
350
+ /**
351
+ * History.getRootUrl()
352
+ * Turns "http://mysite.com/dir/page.html?asd" into "http://mysite.com"
353
+ * @return {String} rootUrl
354
+ */
355
+ History.getRootUrl = function() {
356
+ // Create
357
+ var rootUrl = document.location.protocol + '//' + (document.location.hostname || document.location.host);
358
+ if (document.location.port || false) {
359
+ rootUrl += ':' + document.location.port;
360
+ }
361
+ rootUrl += '/';
362
+
363
+ // Return
364
+ return rootUrl;
365
+ };
768
366
 
769
- // Return
770
- return hash;
771
- };
367
+ /**
368
+ * History.getBaseHref()
369
+ * Fetches the `href` attribute of the `<base href="...">` element if it exists
370
+ * @return {String} baseHref
371
+ */
372
+ History.getBaseHref = function() {
373
+ // Create
374
+ var
375
+ baseElements = document.getElementsByTagName('base'),
376
+ baseElement = null,
377
+ baseHref = '';
378
+
379
+ // Test for Base Element
380
+ if (baseElements.length === 1) {
381
+ // Prepare for Base Element
382
+ baseElement = baseElements[0];
383
+ baseHref = baseElement.href.replace(/[^\/]+$/, '');
384
+ }
385
+
386
+ // Adjust trailing slash
387
+ baseHref = baseHref.replace(/\/+$/, '');
388
+ if (baseHref) baseHref += '/';
389
+
390
+ // Return
391
+ return baseHref;
392
+ };
772
393
 
773
- /**
774
- * History.extractId(url_or_hash)
775
- * Get a State ID by it's URL or Hash
776
- * @param {string} url_or_hash
777
- * @return {string} id
778
- */
779
- History.extractId = function (url_or_hash) {
780
- // Prepare
781
- var id;
782
-
783
- // Extract
784
- var parts,url;
785
- parts = /(.*)\&_suid=([0-9]+)$/.exec(url_or_hash);
786
- url = parts ? (parts[1] || url_or_hash) : url_or_hash;
787
- id = parts ? String(parts[2] || '') : '';
788
-
789
- // Return
790
- return id || false;
791
- };
394
+ /**
395
+ * History.getBaseUrl()
396
+ * Fetches the baseHref or basePageUrl or rootUrl (whichever one exists first)
397
+ * @return {String} baseUrl
398
+ */
399
+ History.getBaseUrl = function() {
400
+ // Create
401
+ var baseUrl = History.getBaseHref() || History.getBasePageUrl() || History.getRootUrl();
402
+
403
+ // Return
404
+ return baseUrl;
405
+ };
792
406
 
793
- /**
794
- * History.isTraditionalAnchor
795
- * Checks to see if the url is a traditional anchor or not
796
- * @param {String} url_or_hash
797
- * @return {Boolean}
798
- */
799
- History.isTraditionalAnchor = function(url_or_hash) {
800
- // Check
801
- var isTraditional = !(/[\/\?\.]/.test(url_or_hash));
407
+ /**
408
+ * History.getPageUrl()
409
+ * Fetches the URL of the current page
410
+ * @return {String} pageUrl
411
+ */
412
+ History.getPageUrl = function() {
413
+ // Fetch
414
+ var
415
+ State = History.getState(false, false),
416
+ stateUrl = (State || {}).url || document.location.href;
417
+
418
+ // Create
419
+ var pageUrl = stateUrl.replace(/\/+$/, '').replace(/[^\/]+$/, function(part, index, string) {
420
+ return (/\./).test(part) ? part : part + '/';
421
+ });
422
+
423
+ // Return
424
+ return pageUrl;
425
+ };
802
426
 
803
- // Return
804
- return isTraditional;
805
- };
427
+ /**
428
+ * History.getBasePageUrl()
429
+ * Fetches the Url of the directory of the current page
430
+ * @return {String} basePageUrl
431
+ */
432
+ History.getBasePageUrl = function() {
433
+ // Create
434
+ var basePageUrl = document.location.href.replace(/[#\?].*/, '').replace(/[^\/]+$/,
435
+ function(part, index, string) {
436
+ return (/[^\/]$/).test(part) ? '' : part;
437
+ }).replace(/\/+$/, '') + '/';
438
+
439
+ // Return
440
+ return basePageUrl;
441
+ };
806
442
 
807
- /**
808
- * History.extractState
809
- * Get a State by it's URL or Hash
810
- * @param {String} url_or_hash
811
- * @return {State|null}
812
- */
813
- History.extractState = function(url_or_hash, create) {
814
- // Prepare
815
- var State = null;
816
- create = create || false;
817
-
818
- // Fetch SUID
819
- var id = History.extractId(url_or_hash);
820
- if (id) {
821
- State = History.getStateById(id);
822
- }
443
+ /**
444
+ * History.getFullUrl(url)
445
+ * Ensures that we have an absolute URL and not a relative URL
446
+ * @param {string} url
447
+ * @param {Boolean} allowBaseHref
448
+ * @return {string} fullUrl
449
+ */
450
+ History.getFullUrl = function(url, allowBaseHref) {
451
+ // Prepare
452
+ var fullUrl = url, firstChar = url.substring(0, 1);
453
+ allowBaseHref = (typeof allowBaseHref === 'undefined') ? true : allowBaseHref;
454
+
455
+ // Check
456
+ if (/[a-z]+\:\/\//.test(url)) {
457
+ // Full URL
458
+ }
459
+ else if (firstChar === '/') {
460
+ // Root URL
461
+ fullUrl = History.getRootUrl() + url.replace(/^\/+/, '');
462
+ }
463
+ else if (firstChar === '#') {
464
+ // Anchor URL
465
+ fullUrl = History.getPageUrl().replace(/#.*/, '') + url;
466
+ }
467
+ else if (firstChar === '?') {
468
+ // Query URL
469
+ fullUrl = History.getPageUrl().replace(/[\?#].*/, '') + url;
470
+ }
471
+ else {
472
+ // Relative URL
473
+ if (allowBaseHref) {
474
+ fullUrl = History.getBaseUrl() + url.replace(/^(\.\/)+/, '');
475
+ } else {
476
+ fullUrl = History.getBasePageUrl() + url.replace(/^(\.\/)+/, '');
477
+ }
478
+ // We have an if condition above as we do not want hashes
479
+ // which are relative to the baseHref in our URLs
480
+ // as if the baseHref changes, then all our bookmarks
481
+ // would now point to different locations
482
+ // whereas the basePageUrl will always stay the same
483
+ }
484
+
485
+ // Return
486
+ return fullUrl.replace(/\#$/, '');
487
+ };
823
488
 
824
- // Fetch SUID returned no State
825
- if (!State) {
826
- // Fetch URL
827
- var url = History.getFullUrl(url_or_hash);
489
+ /**
490
+ * History.getShortUrl(url)
491
+ * Ensures that we have a relative URL and not a absolute URL
492
+ * @param {string} url
493
+ * @return {string} url
494
+ */
495
+ History.getShortUrl = function(url) {
496
+ // Prepare
497
+ var shortUrl = url, baseUrl = History.getBaseUrl(), rootUrl = History.getRootUrl();
498
+
499
+ // Trim baseUrl
500
+ if (History.emulated.pushState) {
501
+ // We are in a if statement as when pushState is not emulated
502
+ // The actual url these short urls are relative to can change
503
+ // So within the same session, we the url may end up somewhere different
504
+ shortUrl = shortUrl.replace(baseUrl, '');
505
+ }
506
+
507
+ // Trim rootUrl
508
+ shortUrl = shortUrl.replace(rootUrl, '/');
509
+
510
+ // Ensure we can still detect it as a state
511
+ if (History.isTraditionalAnchor(shortUrl)) {
512
+ shortUrl = './' + shortUrl;
513
+ }
514
+
515
+ // Clean It
516
+ shortUrl = shortUrl.replace(/^(\.\/)+/g, './').replace(/\#$/, '');
517
+
518
+ // Return
519
+ return shortUrl;
520
+ };
828
521
 
829
- // Check URL
830
- id = History.getIdByUrl(url) || false;
831
- if (id) {
832
- State = History.getStateById(id);
833
- }
522
+ // ----------------------------------------------------------------------
523
+ // State Storage
524
+
525
+ /**
526
+ * History.store
527
+ * The store for all session specific data
528
+ */
529
+ History.store = amplify ? (amplify.store('History.store') || {}) : {};
530
+ History.store.idToState = History.store.idToState || {};
531
+ History.store.urlToId = History.store.urlToId || {};
532
+ History.store.stateToId = History.store.stateToId || {};
533
+
534
+ /**
535
+ * History.idToState
536
+ * 1-1: State ID to State Object
537
+ */
538
+ History.idToState = History.idToState || {};
539
+
540
+ /**
541
+ * History.stateToId
542
+ * 1-1: State String to State ID
543
+ */
544
+ History.stateToId = History.stateToId || {};
545
+
546
+ /**
547
+ * History.urlToId
548
+ * 1-1: State URL to State ID
549
+ */
550
+ History.urlToId = History.urlToId || {};
551
+
552
+ /**
553
+ * History.storedStates
554
+ * Store the states in an array
555
+ */
556
+ History.storedStates = History.storedStates || [];
557
+
558
+ /**
559
+ * History.savedStates
560
+ * Saved the states in an array
561
+ */
562
+ History.savedStates = History.savedStates || [];
563
+
564
+ /**
565
+ * History.getState()
566
+ * Get an object containing the data, title and url of the current state
567
+ * @param {Boolean} friendly
568
+ * @param {Boolean} create
569
+ * @return {Object} State
570
+ */
571
+ History.getState = function(friendly, create) {
572
+ // Prepare
573
+ if (typeof friendly === 'undefined') {
574
+ friendly = true;
575
+ }
576
+ if (typeof create === 'undefined') {
577
+ create = true;
578
+ }
579
+
580
+ // Fetch
581
+ var State = History.getLastSavedState();
582
+
583
+ // Create
584
+ if (!State && create) {
585
+ State = History.createStateObject();
586
+ }
587
+
588
+ // Adjust
589
+ if (friendly) {
590
+ State = History.cloneObject(State);
591
+ State.url = State.cleanUrl || State.url;
592
+ }
593
+
594
+ // Return
595
+ return State;
596
+ };
834
597
 
835
- // Create State
836
- if (!State && create && !History.isTraditionalAnchor(url_or_hash)) {
837
- State = History.createStateObject(null, null, url);
838
- }
598
+ /**
599
+ * History.getIdByState(State)
600
+ * Gets a ID for a State
601
+ * @param {State} newState
602
+ * @return {String} id
603
+ */
604
+ History.getIdByState = function(newState) {
605
+
606
+ // Fetch ID
607
+ var id = History.extractId(newState.url);
608
+ if (!id) {
609
+ // Find ID via State String
610
+ var str = History.getStateString(newState);
611
+ if (typeof History.stateToId[str] !== 'undefined') {
612
+ id = History.stateToId[str];
613
+ }
614
+ else if (typeof History.store.stateToId[str] !== 'undefined') {
615
+ id = History.store.stateToId[str];
616
+ }
617
+ else {
618
+ // Generate a new ID
619
+ while (true) {
620
+ id = String(Math.floor(Math.random() * 1000));
621
+ if (typeof History.idToState[id] === 'undefined' && typeof History.store.idToState[id] === 'undefined') {
622
+ break;
839
623
  }
624
+ }
840
625
 
841
- // Return
842
- return State;
843
- };
626
+ // Apply the new State to the ID
627
+ History.stateToId[str] = id;
628
+ History.idToState[id] = newState;
629
+ }
630
+ }
844
631
 
845
- /**
846
- * History.getIdByUrl()
847
- * Get a State ID by a State URL
848
- */
849
- History.getIdByUrl = function(url) {
850
- // Fetch
851
- var id = History.urlToId[url] || History.store.urlToId[url] || undefined;
632
+ // Return ID
633
+ return id;
634
+ };
852
635
 
853
- // Return
854
- return id;
855
- };
636
+ /**
637
+ * History.normalizeState(State)
638
+ * Expands a State Object
639
+ * @param {object} State
640
+ * @return {object}
641
+ */
642
+ History.normalizeState = function(oldState) {
643
+ // Prepare
644
+ if (!oldState || (typeof oldState !== 'object')) {
645
+ oldState = {};
646
+ }
647
+
648
+ // Check
649
+ if (typeof oldState.normalized !== 'undefined') {
650
+ return oldState;
651
+ }
652
+
653
+ // Adjust
654
+ if (!oldState.data || (typeof oldState.data !== 'object')) {
655
+ oldState.data = {};
656
+ }
657
+
658
+ // ----------------------------------------------------------------------
659
+
660
+ // Create
661
+ var newState = {};
662
+ newState.normalized = true;
663
+ newState.title = oldState.title || '';
664
+ newState.url = History.getFullUrl(History.unescapeString(oldState.url || document.location.href));
665
+ newState.hash = History.getShortUrl(newState.url);
666
+ newState.data = History.cloneObject(oldState.data);
667
+
668
+ // Fetch ID
669
+ newState.id = History.getIdByState(newState);
670
+
671
+ // ----------------------------------------------------------------------
672
+
673
+ // Clean the URL
674
+ newState.cleanUrl = newState.url.replace(/\??\&_suid.*/, '');
675
+ newState.url = newState.cleanUrl;
676
+
677
+ // Check to see if we have more than just a url
678
+ var dataNotEmpty = !History.isEmptyObject(newState.data);
679
+
680
+ // Apply
681
+ if (newState.title || dataNotEmpty) {
682
+ // Add ID to Hash
683
+ newState.hash = History.getShortUrl(newState.url).replace(/\??\&_suid.*/, '');
684
+ if (!/\?/.test(newState.hash)) {
685
+ newState.hash += '?';
686
+ }
687
+ newState.hash += '&_suid=' + newState.id;
688
+ }
856
689
 
857
- /**
858
- * History.getLastSavedState()
859
- * Get an object containing the data, title and url of the current state
860
- * @return {Object} State
861
- */
862
- History.getLastSavedState = function() {
863
- return History.savedStates[History.savedStates.length - 1] || undefined;
864
- };
690
+ // Create the Hashed URL
691
+ newState.hashedUrl = History.getFullUrl(newState.hash);
865
692
 
866
- /**
867
- * History.getLastStoredState()
868
- * Get an object containing the data, title and url of the current state
869
- * @return {Object} State
870
- */
871
- History.getLastStoredState = function() {
872
- return History.storedStates[History.storedStates.length - 1] || undefined;
873
- };
693
+ // ----------------------------------------------------------------------
874
694
 
875
- /**
876
- * History.hasUrlDuplicate
877
- * Checks if a Url will have a url conflict
878
- * @param {Object} newState
879
- * @return {Boolean} hasDuplicate
880
- */
881
- History.hasUrlDuplicate = function(newState) {
882
- // Prepare
883
- var hasDuplicate = false;
695
+ // Update the URL if we have a duplicate
696
+ if ((History.emulated.pushState || History.bugs.safariPoll) && History.hasUrlDuplicate(newState)) {
697
+ newState.url = newState.hashedUrl;
698
+ }
884
699
 
885
- // Fetch
886
- var oldState = History.extractState(newState.url);
700
+ // ----------------------------------------------------------------------
887
701
 
888
- // Check
889
- hasDuplicate = oldState && oldState.id !== newState.id;
702
+ // Return
703
+ return newState;
704
+ };
890
705
 
891
- // Return
892
- return hasDuplicate;
893
- };
706
+ /**
707
+ * History.createStateObject(data,title,url)
708
+ * Creates a object based on the data, title and url state params
709
+ * @param {object} data
710
+ * @param {string} title
711
+ * @param {string} url
712
+ * @return {object}
713
+ */
714
+ History.createStateObject = function(data, title, url) {
715
+ // Hashify
716
+ var State = {
717
+ 'data': data,
718
+ 'title': title,
719
+ 'url': url
720
+ };
721
+
722
+ // Expand the State
723
+ State = History.normalizeState(State);
724
+
725
+ // Return object
726
+ return State;
727
+ };
894
728
 
895
- /**
896
- * History.storeState
897
- * Store a State
898
- * @param {Object} newState
899
- * @return {Object} newState
900
- */
901
- History.storeState = function(newState) {
902
- // Store the State
903
- History.urlToId[newState.url] = newState.id;
729
+ /**
730
+ * History.getStateById(id)
731
+ * Get a state by it's UID
732
+ * @param {String} id
733
+ */
734
+ History.getStateById = function(id) {
735
+ // Prepare
736
+ id = String(id);
904
737
 
905
- // Push the State
906
- History.storedStates.push(History.cloneObject(newState));
738
+ // Retrieve
739
+ var State = History.idToState[id] || History.store.idToState[id] || undefined;
907
740
 
908
- // Return newState
909
- return newState;
910
- };
741
+ // Return State
742
+ return State;
743
+ };
911
744
 
912
- /**
913
- * History.isLastSavedState(newState)
914
- * Tests to see if the state is the last state
915
- * @param {Object} newState
916
- * @return {boolean} isLast
917
- */
918
- History.isLastSavedState = function(newState) {
919
- // Prepare
920
- var isLast = false;
921
-
922
- // Check
923
- if (History.savedStates.length) {
924
- var
925
- newId = newState.id,
926
- oldState = History.getLastSavedState(),
927
- oldId = oldState.id;
928
-
929
- // Check
930
- isLast = (newId === oldId);
931
- }
745
+ /**
746
+ * Get a State's String
747
+ * @param {State} passedState
748
+ */
749
+ History.getStateString = function(passedState) {
750
+ // Prepare
751
+ var State = History.normalizeState(passedState);
752
+
753
+ // Clean
754
+ var cleanedState = {
755
+ data: State.data,
756
+ title: passedState.title,
757
+ url: passedState.url
758
+ };
759
+
760
+ // Fetch
761
+ var str = JSON.stringify(cleanedState);
762
+
763
+ // Return
764
+ return str;
765
+ };
932
766
 
933
- // Return
934
- return isLast;
935
- };
767
+ /**
768
+ * Get a State's ID
769
+ * @param {State} passedState
770
+ * @return {String} id
771
+ */
772
+ History.getStateId = function(passedState) {
773
+ // Prepare
774
+ var State = History.normalizeState(passedState);
936
775
 
937
- /**
938
- * History.saveState
939
- * Push a State
940
- * @param {Object} newState
941
- * @return {boolean} changed
942
- */
943
- History.saveState = function(newState) {
944
- // Check Hash
945
- if (History.isLastSavedState(newState)) {
946
- return false;
947
- }
776
+ // Fetch
777
+ var id = State.id;
948
778
 
949
- // Push the State
950
- History.savedStates.push(History.cloneObject(newState));
779
+ // Return
780
+ return id;
781
+ };
951
782
 
952
- // Return true
953
- return true;
954
- };
783
+ /**
784
+ * History.getHashByState(State)
785
+ * Creates a Hash for the State Object
786
+ * @param {State} passedState
787
+ * @return {String} hash
788
+ */
789
+ History.getHashByState = function(passedState) {
790
+ // Prepare
791
+ var hash, State = History.normalizeState(passedState);
792
+
793
+ // Fetch
794
+ hash = State.hash;
795
+
796
+ // Return
797
+ return hash;
798
+ };
955
799
 
956
- /**
957
- * History.getStateByIndex()
958
- * Gets a state by the index
959
- * @param {integer} index
960
- * @return {Object}
961
- */
962
- History.getStateByIndex = function(index) {
963
- // Prepare
964
- var State = null;
965
-
966
- // Handle
967
- if (typeof index === 'undefined') {
968
- // Get the last inserted
969
- State = History.savedStates[History.savedStates.length - 1];
970
- }
971
- else if (index < 0) {
972
- // Get from the end
973
- State = History.savedStates[History.savedStates.length + index];
974
- }
975
- else {
976
- // Get from the beginning
977
- State = History.savedStates[index];
978
- }
800
+ /**
801
+ * History.extractId(url_or_hash)
802
+ * Get a State ID by it's URL or Hash
803
+ * @param {string} url_or_hash
804
+ * @return {string} id
805
+ */
806
+ History.extractId = function (url_or_hash) {
807
+ // Prepare
808
+ var id;
809
+
810
+ // Extract
811
+ var parts,url;
812
+ parts = /(.*)\&_suid=([0-9]+)$/.exec(url_or_hash);
813
+ url = parts ? (parts[1] || url_or_hash) : url_or_hash;
814
+ id = parts ? String(parts[2] || '') : '';
815
+
816
+ // Return
817
+ return id || false;
818
+ };
979
819
 
980
- // Return State
981
- return State;
982
- };
820
+ /**
821
+ * History.isTraditionalAnchor
822
+ * Checks to see if the url is a traditional anchor or not
823
+ * @param {String} url_or_hash
824
+ * @return {Boolean}
825
+ */
826
+ History.isTraditionalAnchor = function(url_or_hash) {
827
+ // Check
828
+ var isTraditional = !(/[\/\?\.]/.test(url_or_hash));
829
+
830
+ // Return
831
+ return isTraditional;
832
+ };
983
833
 
984
- // ----------------------------------------------------------------------
985
- // Hash Helpers
834
+ /**
835
+ * History.extractState
836
+ * Get a State by it's URL or Hash
837
+ * @param {String} url_or_hash
838
+ * @return {State|null}
839
+ */
840
+ History.extractState = function(url_or_hash, create) {
841
+ // Prepare
842
+ var State = null;
843
+ create = create || false;
844
+
845
+ // Fetch SUID
846
+ var id = History.extractId(url_or_hash);
847
+ if (id) {
848
+ State = History.getStateById(id);
849
+ }
850
+
851
+ // Fetch SUID returned no State
852
+ if (!State) {
853
+ // Fetch URL
854
+ var url = History.getFullUrl(url_or_hash);
855
+
856
+ // Check URL
857
+ id = History.getIdByUrl(url) || false;
858
+ if (id) {
859
+ State = History.getStateById(id);
860
+ }
986
861
 
987
- /**
988
- * History.getHash()
989
- * Gets the current document hash
990
- * @return {string}
991
- */
992
- History.getHash = function() {
993
- var hash = History.unescapeHash(document.location.hash);
994
- return hash;
995
- };
862
+ // Create State
863
+ if (!State && create && !History.isTraditionalAnchor(url_or_hash)) {
864
+ State = History.createStateObject(null, null, url);
865
+ }
866
+ }
996
867
 
997
- /**
998
- * History.unescapeString()
999
- * Unescape a string
1000
- * @param {String} str
1001
- * @return {string}
1002
- */
1003
- History.unescapeString = function(str) {
1004
- // Prepare
1005
- var result = str;
1006
-
1007
- // Unescape hash
1008
- var tmp;
1009
- while (true) {
1010
- tmp = window.unescape(result);
1011
- if (tmp === result) {
1012
- break;
1013
- }
1014
- result = tmp;
1015
- }
868
+ // Return
869
+ return State;
870
+ };
1016
871
 
1017
- // Return result
1018
- return result;
1019
- };
872
+ /**
873
+ * History.getIdByUrl()
874
+ * Get a State ID by a State URL
875
+ */
876
+ History.getIdByUrl = function(url) {
877
+ // Fetch
878
+ var id = History.urlToId[url] || History.store.urlToId[url] || undefined;
1020
879
 
1021
- /**
1022
- * History.unescapeHash()
1023
- * normalize and Unescape a Hash
1024
- * @param {String} hash
1025
- * @return {string}
1026
- */
1027
- History.unescapeHash = function(hash) {
1028
- // Prepare
1029
- var result = History.normalizeHash(hash);
880
+ // Return
881
+ return id;
882
+ };
1030
883
 
1031
- // Unescape hash
1032
- result = History.unescapeString(result);
884
+ /**
885
+ * History.getLastSavedState()
886
+ * Get an object containing the data, title and url of the current state
887
+ * @return {Object} State
888
+ */
889
+ History.getLastSavedState = function() {
890
+ return History.savedStates[History.savedStates.length - 1] || undefined;
891
+ };
1033
892
 
1034
- // Return result
1035
- return result;
1036
- };
893
+ /**
894
+ * History.getLastStoredState()
895
+ * Get an object containing the data, title and url of the current state
896
+ * @return {Object} State
897
+ */
898
+ History.getLastStoredState = function() {
899
+ return History.storedStates[History.storedStates.length - 1] || undefined;
900
+ };
1037
901
 
1038
- /**
1039
- * History.normalizeHash()
1040
- * normalize a hash across browsers
1041
- * @return {string}
1042
- */
1043
- History.normalizeHash = function(hash) {
1044
- var result = hash.replace(/[^#]*#/, '').replace(/#.*/, '');
902
+ /**
903
+ * History.hasUrlDuplicate
904
+ * Checks if a Url will have a url conflict
905
+ * @param {Object} newState
906
+ * @return {Boolean} hasDuplicate
907
+ */
908
+ History.hasUrlDuplicate = function(newState) {
909
+ // Prepare
910
+ var hasDuplicate = false;
1045
911
 
1046
- // Return result
1047
- return result;
1048
- };
912
+ // Fetch
913
+ var oldState = History.extractState(newState.url);
1049
914
 
1050
- /**
1051
- * History.setHash(hash)
1052
- * Sets the document hash
1053
- * @param {string} hash
1054
- * @return {History}
1055
- */
1056
- History.setHash = function(hash, queue) {
1057
- // Handle Queueing
1058
- if (queue !== false && History.busy()) {
1059
- // Wait + Push to Queue
1060
- //History.debug('History.setHash: we must wait', arguments);
1061
- History.pushQueue({
1062
- scope: History,
1063
- callback: History.setHash,
1064
- args: arguments,
1065
- queue: queue
1066
- });
1067
- return false;
1068
- }
915
+ // Check
916
+ hasDuplicate = oldState && oldState.id !== newState.id;
1069
917
 
1070
- // Log
1071
- //History.debug('History.setHash: called',hash);
918
+ // Return
919
+ return hasDuplicate;
920
+ };
1072
921
 
1073
- // Prepare
1074
- var adjustedHash = History.escapeHash(hash);
922
+ /**
923
+ * History.storeState
924
+ * Store a State
925
+ * @param {Object} newState
926
+ * @return {Object} newState
927
+ */
928
+ History.storeState = function(newState) {
929
+ // Store the State
930
+ History.urlToId[newState.url] = newState.id;
931
+
932
+ // Push the State
933
+ History.storedStates.push(History.cloneObject(newState));
934
+
935
+ // Return newState
936
+ return newState;
937
+ };
1075
938
 
1076
- // Make Busy + Continue
1077
- History.busy(true);
939
+ /**
940
+ * History.isLastSavedState(newState)
941
+ * Tests to see if the state is the last state
942
+ * @param {Object} newState
943
+ * @return {boolean} isLast
944
+ */
945
+ History.isLastSavedState = function(newState) {
946
+ // Prepare
947
+ var isLast = false;
948
+
949
+ // Check
950
+ if (History.savedStates.length) {
951
+ var
952
+ newId = newState.id,
953
+ oldState = History.getLastSavedState(),
954
+ oldId = oldState.id;
955
+
956
+ // Check
957
+ isLast = (newId === oldId);
958
+ }
959
+
960
+ // Return
961
+ return isLast;
962
+ };
1078
963
 
1079
- // Check if hash is a state
1080
- var State = History.extractState(hash, true);
1081
- if (State && !History.emulated.pushState) {
1082
- // Hash is a state so skip the setHash
1083
- //History.debug('History.setHash: Hash is a state so skipping the hash set with a direct pushState call',arguments);
964
+ /**
965
+ * History.saveState
966
+ * Push a State
967
+ * @param {Object} newState
968
+ * @return {boolean} changed
969
+ */
970
+ History.saveState = function(newState) {
971
+ // Check Hash
972
+ if (History.isLastSavedState(newState)) {
973
+ return false;
974
+ }
975
+
976
+ // Push the State
977
+ History.savedStates.push(History.cloneObject(newState));
978
+
979
+ // Return true
980
+ return true;
981
+ };
1084
982
 
1085
- // PushState
1086
- History.pushState(State.data, State.title, State.url, false);
1087
- }
1088
- else if (document.location.hash !== adjustedHash) {
1089
- // Hash is a proper hash, so apply it
983
+ /**
984
+ * History.getStateByIndex()
985
+ * Gets a state by the index
986
+ * @param {integer} index
987
+ * @return {Object}
988
+ */
989
+ History.getStateByIndex = function(index) {
990
+ // Prepare
991
+ var State = null;
992
+
993
+ // Handle
994
+ if (typeof index === 'undefined') {
995
+ // Get the last inserted
996
+ State = History.savedStates[History.savedStates.length - 1];
997
+ }
998
+ else if (index < 0) {
999
+ // Get from the end
1000
+ State = History.savedStates[History.savedStates.length + index];
1001
+ }
1002
+ else {
1003
+ // Get from the beginning
1004
+ State = History.savedStates[index];
1005
+ }
1006
+
1007
+ // Return State
1008
+ return State;
1009
+ };
1090
1010
 
1091
- // Handle browser bugs
1092
- if (History.bugs.setHash) {
1093
- // Fix Safari Bug https://bugs.webkit.org/show_bug.cgi?id=56249
1011
+ // ----------------------------------------------------------------------
1012
+ // Hash Helpers
1013
+
1014
+ /**
1015
+ * History.getHash()
1016
+ * Gets the current document hash
1017
+ * @return {string}
1018
+ */
1019
+ History.getHash = function() {
1020
+ var hash = History.unescapeHash(document.location.hash);
1021
+ return hash;
1022
+ };
1094
1023
 
1095
- // Fetch the base page
1096
- var pageUrl = History.getPageUrl();
1024
+ /**
1025
+ * History.unescapeString()
1026
+ * Unescape a string
1027
+ * @param {String} str
1028
+ * @return {string}
1029
+ */
1030
+ History.unescapeString = function(str) {
1031
+ // Prepare
1032
+ var result = str;
1033
+
1034
+ // Unescape hash
1035
+ var tmp;
1036
+ while (true) {
1037
+ tmp = window.unescape(result);
1038
+ if (tmp === result) {
1039
+ break;
1040
+ }
1041
+ result = tmp;
1042
+ }
1097
1043
 
1098
- // Safari hash apply
1099
- History.pushState(null, null, pageUrl + '#' + adjustedHash, false);
1100
- }
1101
- else {
1102
- // Normal hash apply
1103
- document.location.hash = adjustedHash;
1104
- }
1105
- }
1044
+ // Return result
1045
+ return result;
1046
+ };
1106
1047
 
1107
- // Chain
1108
- return History;
1109
- };
1048
+ /**
1049
+ * History.unescapeHash()
1050
+ * normalize and Unescape a Hash
1051
+ * @param {String} hash
1052
+ * @return {string}
1053
+ */
1054
+ History.unescapeHash = function(hash) {
1055
+ // Prepare
1056
+ var result = History.normalizeHash(hash);
1057
+
1058
+ // Unescape hash
1059
+ result = History.unescapeString(result);
1060
+
1061
+ // Return result
1062
+ return result;
1063
+ };
1110
1064
 
1111
- /**
1112
- * History.escape()
1113
- * normalize and Escape a Hash
1114
- * @return {string}
1115
- */
1116
- History.escapeHash = function(hash) {
1117
- var result = History.normalizeHash(hash);
1118
-
1119
- // Escape hash
1120
- result = window.escape(result);
1121
-
1122
- // IE6 Escape Bug
1123
- if (!History.bugs.hashEscape) {
1124
- // Restore common parts
1125
- result = result
1126
- .replace(/\%21/g, '!')
1127
- .replace(/\%26/g, '&')
1128
- .replace(/\%3D/g, '=')
1129
- .replace(/\%3F/g, '?');
1130
- }
1065
+ /**
1066
+ * History.normalizeHash()
1067
+ * normalize a hash across browsers
1068
+ * @return {string}
1069
+ */
1070
+ History.normalizeHash = function(hash) {
1071
+ var result = hash.replace(/[^#]*#/, '').replace(/#.*/, '');
1131
1072
 
1132
- // Return result
1133
- return result;
1134
- };
1073
+ // Return result
1074
+ return result;
1075
+ };
1135
1076
 
1136
- /**
1137
- * History.getHashByUrl(url)
1138
- * Extracts the Hash from a URL
1139
- * @param {string} url
1140
- * @return {string} url
1141
- */
1142
- History.getHashByUrl = function(url) {
1143
- // Extract the hash
1144
- var hash = String(url)
1145
- .replace(/([^#]*)#?([^#]*)#?(.*)/, '$2')
1146
- ;
1077
+ /**
1078
+ * History.setHash(hash)
1079
+ * Sets the document hash
1080
+ * @param {string} hash
1081
+ * @return {History}
1082
+ */
1083
+ History.setHash = function(hash, queue) {
1084
+ // Handle Queueing
1085
+ if (queue !== false && History.busy()) {
1086
+ // Wait + Push to Queue
1087
+ //History.debug('History.setHash: we must wait', arguments);
1088
+ History.pushQueue({
1089
+ scope: History,
1090
+ callback: History.setHash,
1091
+ args: arguments,
1092
+ queue: queue
1093
+ });
1094
+ return false;
1095
+ }
1096
+
1097
+ // Log
1098
+ //History.debug('History.setHash: called',hash);
1099
+
1100
+ // Prepare
1101
+ var adjustedHash = History.escapeHash(hash);
1102
+
1103
+ // Make Busy + Continue
1104
+ History.busy(true);
1105
+
1106
+ // Check if hash is a state
1107
+ var State = History.extractState(hash, true);
1108
+ if (State && !History.emulated.pushState) {
1109
+ // Hash is a state so skip the setHash
1110
+ //History.debug('History.setHash: Hash is a state so skipping the hash set with a direct pushState call',arguments);
1111
+
1112
+ // PushState
1113
+ History.pushState(State.data, State.title, State.url, false);
1114
+ }
1115
+ else if (document.location.hash !== adjustedHash) {
1116
+ // Hash is a proper hash, so apply it
1117
+
1118
+ // Handle browser bugs
1119
+ if (History.bugs.setHash) {
1120
+ // Fix Safari Bug https://bugs.webkit.org/show_bug.cgi?id=56249
1121
+
1122
+ // Fetch the base page
1123
+ var pageUrl = History.getPageUrl();
1124
+
1125
+ // Safari hash apply
1126
+ History.pushState(null, null, pageUrl + '#' + adjustedHash, false);
1127
+ }
1128
+ else {
1129
+ // Normal hash apply
1130
+ document.location.hash = adjustedHash;
1131
+ }
1132
+ }
1147
1133
 
1148
- // Unescape hash
1149
- hash = History.unescapeHash(hash);
1134
+ // Chain
1135
+ return History;
1136
+ };
1150
1137
 
1151
- // Return hash
1152
- return hash;
1153
- };
1138
+ /**
1139
+ * History.escape()
1140
+ * normalize and Escape a Hash
1141
+ * @return {string}
1142
+ */
1143
+ History.escapeHash = function(hash) {
1144
+ var result = History.normalizeHash(hash);
1145
+
1146
+ // Escape hash
1147
+ result = window.escape(result);
1148
+
1149
+ // IE6 Escape Bug
1150
+ if (!History.bugs.hashEscape) {
1151
+ // Restore common parts
1152
+ result = result
1153
+ .replace(/\%21/g, '!')
1154
+ .replace(/\%26/g, '&')
1155
+ .replace(/\%3D/g, '=')
1156
+ .replace(/\%3F/g, '?');
1157
+ }
1158
+
1159
+ // Return result
1160
+ return result;
1161
+ };
1154
1162
 
1155
- /**
1156
- * History.setTitle(title)
1157
- * Applies the title to the document
1158
- * @param {State} newState
1159
- * @return {Boolean}
1160
- */
1161
- History.setTitle = function(newState) {
1162
- // Prepare
1163
- var title = newState.title;
1164
-
1165
- // Initial
1166
- if (!title) {
1167
- var firstState = History.getStateByIndex(0);
1168
- if (firstState && firstState.url === newState.url) {
1169
- title = firstState.title || History.options.initialTitle;
1170
- }
1171
- }
1163
+ /**
1164
+ * History.getHashByUrl(url)
1165
+ * Extracts the Hash from a URL
1166
+ * @param {string} url
1167
+ * @return {string} url
1168
+ */
1169
+ History.getHashByUrl = function(url) {
1170
+ // Extract the hash
1171
+ var hash = String(url)
1172
+ .replace(/([^#]*)#?([^#]*)#?(.*)/, '$2')
1173
+ ;
1174
+
1175
+ // Unescape hash
1176
+ hash = History.unescapeHash(hash);
1177
+
1178
+ // Return hash
1179
+ return hash;
1180
+ };
1172
1181
 
1173
- // Apply
1174
- try {
1175
- document.getElementsByTagName('title')[0].innerHTML = title.replace('<', '&lt;').replace('>', '&gt;').replace(' & ', ' &amp; ');
1176
- }
1177
- catch (Exception) {
1178
- }
1179
- document.title = title;
1182
+ /**
1183
+ * History.setTitle(title)
1184
+ * Applies the title to the document
1185
+ * @param {State} newState
1186
+ * @return {Boolean}
1187
+ */
1188
+ History.setTitle = function(newState) {
1189
+ // Prepare
1190
+ var title = newState.title;
1191
+
1192
+ // Initial
1193
+ if (!title) {
1194
+ var firstState = History.getStateByIndex(0);
1195
+ if (firstState && firstState.url === newState.url) {
1196
+ title = firstState.title || History.options.initialTitle;
1197
+ }
1198
+ }
1199
+
1200
+ // Apply
1201
+ try {
1202
+ document.getElementsByTagName('title')[0].innerHTML = title.replace('<', '&lt;').replace('>', '&gt;').replace(' & ', ' &amp; ');
1203
+ }
1204
+ catch (Exception) {
1205
+ }
1206
+ document.title = title;
1207
+
1208
+ // Chain
1209
+ return History;
1210
+ };
1180
1211
 
1181
- // Chain
1182
- return History;
1212
+ // ----------------------------------------------------------------------
1213
+ // Queueing
1214
+
1215
+ /**
1216
+ * History.queues
1217
+ * The list of queues to use
1218
+ * First In, First Out
1219
+ */
1220
+ History.queues = [];
1221
+
1222
+ /**
1223
+ * History.busy(value)
1224
+ * @param {boolean} value [optional]
1225
+ * @return {boolean} busy
1226
+ */
1227
+ History.busy = function(value) {
1228
+ // Apply
1229
+ if (typeof value !== 'undefined') {
1230
+ //History.debug('History.busy: changing ['+(History.busy.flag||false)+'] to ['+(value||false)+']', History.queues.length);
1231
+ History.busy.flag = value;
1232
+ }
1233
+ // Default
1234
+ else if (typeof History.busy.flag === 'undefined') {
1235
+ History.busy.flag = false;
1236
+ }
1237
+
1238
+ // Queue
1239
+ if (!History.busy.flag) {
1240
+ // Execute the next item in the queue
1241
+ clearTimeout(History.busy.timeout);
1242
+ var fireNext = function() {
1243
+ if (History.busy.flag) return;
1244
+ for (var i = History.queues.length - 1; i >= 0; --i) {
1245
+ var queue = History.queues[i];
1246
+ if (queue.length === 0) continue;
1247
+ var item = queue.shift();
1248
+ History.fireQueueItem(item);
1249
+ History.busy.timeout = setTimeout(fireNext, History.options.busyDelay);
1250
+ }
1183
1251
  };
1252
+ History.busy.timeout = setTimeout(fireNext, History.options.busyDelay);
1253
+ }
1184
1254
 
1185
- // ----------------------------------------------------------------------
1186
- // Queueing
1255
+ // Return
1256
+ return History.busy.flag;
1257
+ };
1187
1258
 
1188
- /**
1189
- * History.queues
1190
- * The list of queues to use
1191
- * First In, First Out
1192
- */
1193
- History.queues = [];
1259
+ /**
1260
+ * History.fireQueueItem(item)
1261
+ * Fire a Queue Item
1262
+ * @param {Object} item
1263
+ * @return {Mixed} result
1264
+ */
1265
+ History.fireQueueItem = function(item) {
1266
+ return item.callback.apply(item.scope || History, item.args || []);
1267
+ };
1194
1268
 
1195
- /**
1196
- * History.busy(value)
1197
- * @param {boolean} value [optional]
1198
- * @return {boolean} busy
1199
- */
1200
- History.busy = function(value) {
1201
- // Apply
1202
- if (typeof value !== 'undefined') {
1203
- //History.debug('History.busy: changing ['+(History.busy.flag||false)+'] to ['+(value||false)+']', History.queues.length);
1204
- History.busy.flag = value;
1205
- }
1206
- // Default
1207
- else if (typeof History.busy.flag === 'undefined') {
1208
- History.busy.flag = false;
1209
- }
1269
+ /**
1270
+ * History.pushQueue(callback,args)
1271
+ * Add an item to the queue
1272
+ * @param {Object} item [scope,callback,args,queue]
1273
+ */
1274
+ History.pushQueue = function(item) {
1275
+ // Prepare the queue
1276
+ History.queues[item.queue || 0] = History.queues[item.queue || 0] || [];
1210
1277
 
1211
- // Queue
1212
- if (!History.busy.flag) {
1213
- // Execute the next item in the queue
1214
- clearTimeout(History.busy.timeout);
1215
- var fireNext = function() {
1216
- if (History.busy.flag) return;
1217
- for (var i = History.queues.length - 1; i >= 0; --i) {
1218
- var queue = History.queues[i];
1219
- if (queue.length === 0) continue;
1220
- var item = queue.shift();
1221
- History.fireQueueItem(item);
1222
- History.busy.timeout = setTimeout(fireNext, History.options.busyDelay);
1223
- }
1224
- };
1225
- History.busy.timeout = setTimeout(fireNext, History.options.busyDelay);
1226
- }
1278
+ // Add to the queue
1279
+ History.queues[item.queue || 0].push(item);
1227
1280
 
1228
- // Return
1229
- return History.busy.flag;
1230
- };
1281
+ // Chain
1282
+ return History;
1283
+ };
1231
1284
 
1232
- /**
1233
- * History.fireQueueItem(item)
1234
- * Fire a Queue Item
1235
- * @param {Object} item
1236
- * @return {Mixed} result
1237
- */
1238
- History.fireQueueItem = function(item) {
1239
- return item.callback.apply(item.scope || History, item.args || []);
1285
+ /**
1286
+ * History.queue (item,queue), (func,queue), (func), (item)
1287
+ * Either firs the item now if not busy, or adds it to the queue
1288
+ */
1289
+ History.queue = function(item, queue) {
1290
+ // Prepare
1291
+ if (typeof item === 'function') {
1292
+ item = {
1293
+ callback: item
1240
1294
  };
1295
+ }
1296
+ if (typeof queue !== 'undefined') {
1297
+ item.queue = queue;
1298
+ }
1299
+
1300
+ // Handle
1301
+ if (History.busy()) {
1302
+ History.pushQueue(item);
1303
+ } else {
1304
+ History.fireQueueItem(item);
1305
+ }
1306
+
1307
+ // Chain
1308
+ return History;
1309
+ };
1241
1310
 
1242
- /**
1243
- * History.pushQueue(callback,args)
1244
- * Add an item to the queue
1245
- * @param {Object} item [scope,callback,args,queue]
1246
- */
1247
- History.pushQueue = function(item) {
1248
- // Prepare the queue
1249
- History.queues[item.queue || 0] = History.queues[item.queue || 0] || [];
1311
+ /**
1312
+ * History.clearQueue()
1313
+ * Clears the Queue
1314
+ */
1315
+ History.clearQueue = function() {
1316
+ History.busy.flag = false;
1317
+ History.queues = [];
1318
+ return History;
1319
+ };
1250
1320
 
1251
- // Add to the queue
1252
- History.queues[item.queue || 0].push(item);
1253
1321
 
1254
- // Chain
1255
- return History;
1256
- };
1322
+ // ----------------------------------------------------------------------
1323
+ // IE Bug Fix
1257
1324
 
1258
- /**
1259
- * History.queue (item,queue), (func,queue), (func), (item)
1260
- * Either firs the item now if not busy, or adds it to the queue
1261
- */
1262
- History.queue = function(item, queue) {
1263
- // Prepare
1264
- if (typeof item === 'function') {
1265
- item = {
1266
- callback: item
1267
- };
1268
- }
1269
- if (typeof queue !== 'undefined') {
1270
- item.queue = queue;
1271
- }
1325
+ /**
1326
+ * History.stateChanged
1327
+ * States whether or not the state has changed since the last double check was initialised
1328
+ */
1329
+ History.stateChanged = false;
1272
1330
 
1273
- // Handle
1274
- if (History.busy()) {
1275
- History.pushQueue(item);
1276
- } else {
1277
- History.fireQueueItem(item);
1278
- }
1279
-
1280
- // Chain
1281
- return History;
1282
- };
1283
-
1284
- /**
1285
- * History.clearQueue()
1286
- * Clears the Queue
1287
- */
1288
- History.clearQueue = function() {
1289
- History.busy.flag = false;
1290
- History.queues = [];
1291
- return History;
1292
- };
1331
+ /**
1332
+ * History.doubleChecker
1333
+ * Contains the timeout used for the double checks
1334
+ */
1335
+ History.doubleChecker = false;
1293
1336
 
1337
+ /**
1338
+ * History.doubleCheckComplete()
1339
+ * Complete a double check
1340
+ * @return {History}
1341
+ */
1342
+ History.doubleCheckComplete = function() {
1343
+ // Update
1344
+ History.stateChanged = true;
1294
1345
 
1295
- // ----------------------------------------------------------------------
1296
- // IE Bug Fix
1346
+ // Clear
1347
+ History.doubleCheckClear();
1297
1348
 
1298
- /**
1299
- * History.stateChanged
1300
- * States whether or not the state has changed since the last double check was initialised
1301
- */
1302
- History.stateChanged = false;
1349
+ // Chain
1350
+ return History;
1351
+ };
1303
1352
 
1304
- /**
1305
- * History.doubleChecker
1306
- * Contains the timeout used for the double checks
1307
- */
1353
+ /**
1354
+ * History.doubleCheckClear()
1355
+ * Clear a double check
1356
+ * @return {History}
1357
+ */
1358
+ History.doubleCheckClear = function() {
1359
+ // Clear
1360
+ if (History.doubleChecker) {
1361
+ clearTimeout(History.doubleChecker);
1308
1362
  History.doubleChecker = false;
1363
+ }
1309
1364
 
1310
- /**
1311
- * History.doubleCheckComplete()
1312
- * Complete a double check
1313
- * @return {History}
1314
- */
1315
- History.doubleCheckComplete = function() {
1316
- // Update
1317
- History.stateChanged = true;
1318
-
1319
- // Clear
1320
- History.doubleCheckClear();
1321
-
1322
- // Chain
1323
- return History;
1324
- };
1325
-
1326
- /**
1327
- * History.doubleCheckClear()
1328
- * Clear a double check
1329
- * @return {History}
1330
- */
1331
- History.doubleCheckClear = function() {
1332
- // Clear
1333
- if (History.doubleChecker) {
1334
- clearTimeout(History.doubleChecker);
1335
- History.doubleChecker = false;
1336
- }
1337
-
1338
- // Chain
1339
- return History;
1340
- };
1341
-
1342
- /**
1343
- * History.doubleCheck()
1344
- * Create a double check
1345
- * @return {History}
1346
- */
1347
- History.doubleCheck = function(tryAgain) {
1348
- // Reset
1349
- History.stateChanged = false;
1350
- History.doubleCheckClear();
1351
-
1352
- // Fix IE6,IE7 bug where calling history.back or history.forward does not actually change the hash (whereas doing it manually does)
1353
- // Fix Safari 5 bug where sometimes the state does not change: https://bugs.webkit.org/show_bug.cgi?id=42940
1354
- if (History.bugs.ieDoubleCheck) {
1355
- // Apply Check
1356
- History.doubleChecker = setTimeout(
1357
- function() {
1358
- History.doubleCheckClear();
1359
- if (!History.stateChanged) {
1360
- //History.debug('History.doubleCheck: State has not yet changed, trying again', arguments);
1361
- // Re-Attempt
1362
- tryAgain();
1363
- }
1364
- return true;
1365
- },
1366
- History.options.doubleCheckInterval
1367
- );
1368
- }
1369
-
1370
- // Chain
1371
- return History;
1372
- };
1373
-
1374
- // ----------------------------------------------------------------------
1375
- // Safari Bug Fix
1376
-
1377
- /**
1378
- * History.safariStatePoll()
1379
- * Poll the current state
1380
- * @return {History}
1381
- */
1382
- History.safariStatePoll = function() {
1383
- // Poll the URL
1384
-
1385
- // Get the Last State which has the new URL
1386
- var
1387
- urlState = History.extractState(document.location.href),
1388
- newState;
1365
+ // Chain
1366
+ return History;
1367
+ };
1389
1368
 
1390
- // Check for a difference
1391
- if (!History.isLastSavedState(urlState)) {
1392
- newState = urlState;
1393
- }
1394
- else {
1395
- return;
1396
- }
1369
+ /**
1370
+ * History.doubleCheck()
1371
+ * Create a double check
1372
+ * @return {History}
1373
+ */
1374
+ History.doubleCheck = function(tryAgain) {
1375
+ // Reset
1376
+ History.stateChanged = false;
1377
+ History.doubleCheckClear();
1378
+
1379
+ // Fix IE6,IE7 bug where calling history.back or history.forward does not actually change the hash (whereas doing it manually does)
1380
+ // Fix Safari 5 bug where sometimes the state does not change: https://bugs.webkit.org/show_bug.cgi?id=42940
1381
+ if (History.bugs.ieDoubleCheck) {
1382
+ // Apply Check
1383
+ History.doubleChecker = setTimeout(
1384
+ function() {
1385
+ History.doubleCheckClear();
1386
+ if (!History.stateChanged) {
1387
+ //History.debug('History.doubleCheck: State has not yet changed, trying again', arguments);
1388
+ // Re-Attempt
1389
+ tryAgain();
1390
+ }
1391
+ return true;
1392
+ },
1393
+ History.options.doubleCheckInterval
1394
+ );
1395
+ }
1396
+
1397
+ // Chain
1398
+ return History;
1399
+ };
1397
1400
 
1398
- // Check if we have a state with that url
1399
- // If not create it
1400
- if (!newState) {
1401
- //History.debug('History.safariStatePoll: new');
1402
- newState = History.createStateObject();
1403
- }
1401
+ // ----------------------------------------------------------------------
1402
+ // Safari Bug Fix
1403
+
1404
+ /**
1405
+ * History.safariStatePoll()
1406
+ * Poll the current state
1407
+ * @return {History}
1408
+ */
1409
+ History.safariStatePoll = function() {
1410
+ // Poll the URL
1411
+
1412
+ // Get the Last State which has the new URL
1413
+ var
1414
+ urlState = History.extractState(document.location.href),
1415
+ newState;
1416
+
1417
+ // Check for a difference
1418
+ if (!History.isLastSavedState(urlState)) {
1419
+ newState = urlState;
1420
+ }
1421
+ else {
1422
+ return;
1423
+ }
1424
+
1425
+ // Check if we have a state with that url
1426
+ // If not create it
1427
+ if (!newState) {
1428
+ //History.debug('History.safariStatePoll: new');
1429
+ newState = History.createStateObject();
1430
+ }
1431
+
1432
+ // Apply the New State
1433
+ //History.debug('History.safariStatePoll: trigger');
1434
+ History.Adapter.trigger(window, 'popstate');
1435
+
1436
+ // Chain
1437
+ return History;
1438
+ };
1404
1439
 
1405
- // Apply the New State
1406
- //History.debug('History.safariStatePoll: trigger');
1407
- History.Adapter.trigger(window, 'popstate');
1440
+ // ----------------------------------------------------------------------
1441
+ // State Aliases
1442
+
1443
+ /**
1444
+ * History.back(queue)
1445
+ * Send the browser history back one item
1446
+ * @param {Integer} queue [optional]
1447
+ */
1448
+ History.back = function(queue) {
1449
+ //History.debug('History.back: called', arguments);
1450
+
1451
+ // Handle Queueing
1452
+ if (queue !== false && History.busy()) {
1453
+ // Wait + Push to Queue
1454
+ //History.debug('History.back: we must wait', arguments);
1455
+ History.pushQueue({
1456
+ scope: History,
1457
+ callback: History.back,
1458
+ args: arguments,
1459
+ queue: queue
1460
+ });
1461
+ return false;
1462
+ }
1463
+
1464
+ // Make Busy + Continue
1465
+ History.busy(true);
1466
+
1467
+ // Fix certain browser bugs that prevent the state from changing
1468
+ History.doubleCheck(function() {
1469
+ History.back(false);
1470
+ });
1471
+
1472
+ // Go back
1473
+ history.go(-1);
1474
+
1475
+ // End back closure
1476
+ return true;
1477
+ };
1408
1478
 
1409
- // Chain
1410
- return History;
1411
- };
1479
+ /**
1480
+ * History.forward(queue)
1481
+ * Send the browser history forward one item
1482
+ * @param {Integer} queue [optional]
1483
+ */
1484
+ History.forward = function(queue) {
1485
+ //History.debug('History.forward: called', arguments);
1486
+
1487
+ // Handle Queueing
1488
+ if (queue !== false && History.busy()) {
1489
+ // Wait + Push to Queue
1490
+ //History.debug('History.forward: we must wait', arguments);
1491
+ History.pushQueue({
1492
+ scope: History,
1493
+ callback: History.forward,
1494
+ args: arguments,
1495
+ queue: queue
1496
+ });
1497
+ return false;
1498
+ }
1499
+
1500
+ // Make Busy + Continue
1501
+ History.busy(true);
1502
+
1503
+ // Fix certain browser bugs that prevent the state from changing
1504
+ History.doubleCheck(function() {
1505
+ History.forward(false);
1506
+ });
1507
+
1508
+ // Go forward
1509
+ history.go(1);
1510
+
1511
+ // End forward closure
1512
+ return true;
1513
+ };
1412
1514
 
1413
- // ----------------------------------------------------------------------
1414
- // State Aliases
1515
+ /**
1516
+ * History.go(index,queue)
1517
+ * Send the browser history back or forward index times
1518
+ * @param {Integer} queue [optional]
1519
+ */
1520
+ History.go = function(index, queue) {
1521
+ //History.debug('History.go: called', arguments);
1522
+
1523
+ // Prepare
1524
+ var i;
1525
+
1526
+ // Handle
1527
+ if (index > 0) {
1528
+ // Forward
1529
+ for (i = 1; i <= index; ++i) {
1530
+ History.forward(queue);
1531
+ }
1532
+ }
1533
+ else if (index < 0) {
1534
+ // Backward
1535
+ for (i = -1; i >= index; --i) {
1536
+ History.back(queue);
1537
+ }
1538
+ }
1539
+ else {
1540
+ throw new Error('History.go: History.go requires a positive or negative integer passed.');
1541
+ }
1415
1542
 
1416
- /**
1417
- * History.back(queue)
1418
- * Send the browser history back one item
1419
- * @param {Integer} queue [optional]
1420
- */
1421
- History.back = function(queue) {
1422
- //History.debug('History.back: called', arguments);
1423
-
1424
- // Handle Queueing
1425
- if (queue !== false && History.busy()) {
1426
- // Wait + Push to Queue
1427
- //History.debug('History.back: we must wait', arguments);
1428
- History.pushQueue({
1429
- scope: History,
1430
- callback: History.back,
1431
- args: arguments,
1432
- queue: queue
1433
- });
1434
- return false;
1435
- }
1543
+ // Chain
1544
+ return History;
1545
+ };
1436
1546
 
1437
- // Make Busy + Continue
1438
- History.busy(true);
1439
1547
 
1440
- // Fix certain browser bugs that prevent the state from changing
1441
- History.doubleCheck(function() {
1442
- History.back(false);
1443
- });
1548
+ // ----------------------------------------------------------------------
1549
+ // Initialise
1444
1550
 
1445
- // Go back
1446
- history.go(-1);
1551
+ /**
1552
+ * Create the initial State
1553
+ */
1554
+ History.saveState(History.storeState(History.extractState(document.location.href, true)));
1555
+
1556
+ /**
1557
+ * Bind for Saving Store
1558
+ */
1559
+ if (amplify) {
1560
+ History.onUnload = function() {
1561
+ // Prepare
1562
+ var
1563
+ currentStore = amplify.store('History.store') || {},
1564
+ item;
1565
+
1566
+ // Ensure
1567
+ currentStore.idToState = currentStore.idToState || {};
1568
+ currentStore.urlToId = currentStore.urlToId || {};
1569
+ currentStore.stateToId = currentStore.stateToId || {};
1570
+
1571
+ // Sync
1572
+ for (item in History.idToState) {
1573
+ if (!History.idToState.hasOwnProperty(item)) {
1574
+ continue;
1575
+ }
1576
+ currentStore.idToState[item] = History.idToState[item];
1577
+ }
1578
+ for (item in History.urlToId) {
1579
+ if (!History.urlToId.hasOwnProperty(item)) {
1580
+ continue;
1581
+ }
1582
+ currentStore.urlToId[item] = History.urlToId[item];
1583
+ }
1584
+ for (item in History.stateToId) {
1585
+ if (!History.stateToId.hasOwnProperty(item)) {
1586
+ continue;
1587
+ }
1588
+ currentStore.stateToId[item] = History.stateToId[item];
1589
+ }
1447
1590
 
1448
- // End back closure
1449
- return true;
1450
- };
1591
+ // Update
1592
+ History.store = currentStore;
1593
+
1594
+ // Store
1595
+ amplify.store('History.store', currentStore);
1596
+ };
1597
+ // For Internet Explorer
1598
+ History.intervalList.push(setInterval(History.onUnload, History.options.storeInterval));
1599
+ // For Other Browsers
1600
+ History.Adapter.bind(window, 'beforeunload', History.onUnload);
1601
+ History.Adapter.bind(window, 'unload', History.onUnload);
1602
+ // Both are enabled for consistency
1603
+ }
1451
1604
 
1452
- /**
1453
- * History.forward(queue)
1454
- * Send the browser history forward one item
1455
- * @param {Integer} queue [optional]
1456
- */
1457
- History.forward = function(queue) {
1458
- //History.debug('History.forward: called', arguments);
1459
-
1460
- // Handle Queueing
1461
- if (queue !== false && History.busy()) {
1462
- // Wait + Push to Queue
1463
- //History.debug('History.forward: we must wait', arguments);
1464
- History.pushQueue({
1465
- scope: History,
1466
- callback: History.forward,
1467
- args: arguments,
1468
- queue: queue
1469
- });
1470
- return false;
1471
- }
1472
1605
 
1473
- // Make Busy + Continue
1474
- History.busy(true);
1606
+ // ----------------------------------------------------------------------
1607
+ // HTML5 State Support
1475
1608
 
1476
- // Fix certain browser bugs that prevent the state from changing
1477
- History.doubleCheck(function() {
1478
- History.forward(false);
1479
- });
1609
+ if (History.emulated.pushState) {
1610
+ /*
1611
+ * Provide Skeleton for HTML4 Browsers
1612
+ */
1480
1613
 
1481
- // Go forward
1482
- history.go(1);
1614
+ // Prepare
1615
+ var emptyFunction = function() {
1616
+ };
1617
+ History.pushState = History.pushState || emptyFunction;
1618
+ History.replaceState = History.replaceState || emptyFunction;
1619
+ }
1620
+ else {
1621
+ /*
1622
+ * Use native HTML5 History API Implementation
1623
+ */
1624
+
1625
+ /**
1626
+ * History.onPopState(event,extra)
1627
+ * Refresh the Current State
1628
+ */
1629
+ History.onPopState = function(event) {
1630
+ // Reset the double check
1631
+ History.doubleCheckComplete();
1632
+
1633
+ // Check for a Hash, and handle apporiatly
1634
+ var currentHash = History.getHash();
1635
+ if (currentHash) {
1636
+ // Expand Hash
1637
+ var currentState = History.extractState(currentHash || document.location.href, true);
1638
+ if (currentState) {
1639
+ // We were able to parse it, it must be a State!
1640
+ // Let's forward to replaceState
1641
+ //History.debug('History.onPopState: state anchor', currentHash, currentState);
1642
+ History.replaceState(currentState.data, currentState.title, currentState.url, false);
1643
+ }
1644
+ else {
1645
+ // Traditional Anchor
1646
+ //History.debug('History.onPopState: traditional anchor', currentHash);
1647
+ History.Adapter.trigger(window, 'anchorchange');
1648
+ History.busy(false);
1649
+ }
1650
+
1651
+ // We don't care for hashes
1652
+ History.expectedStateId = false;
1653
+ return false;
1654
+ }
1483
1655
 
1484
- // End forward closure
1485
- return true;
1486
- };
1656
+ // Prepare
1657
+ var newState = false;
1658
+
1659
+ // Prepare
1660
+ event = event || {};
1661
+ if (typeof event.state === 'undefined') {
1662
+ // jQuery
1663
+ if (typeof event.originalEvent !== 'undefined' && typeof event.originalEvent.state !== 'undefined') {
1664
+ event.state = event.originalEvent.state || false;
1665
+ }
1666
+ // MooTools
1667
+ else if (typeof event.event !== 'undefined' && typeof event.event.state !== 'undefined') {
1668
+ event.state = event.event.state || false;
1669
+ }
1670
+ }
1487
1671
 
1488
- /**
1489
- * History.go(index,queue)
1490
- * Send the browser history back or forward index times
1491
- * @param {Integer} queue [optional]
1492
- */
1493
- History.go = function(index, queue) {
1494
- //History.debug('History.go: called', arguments);
1672
+ // Ensure
1673
+ event.state = (event.state || false);
1495
1674
 
1496
- // Prepare
1497
- var i;
1675
+ // Fetch State
1676
+ if (event.state) {
1677
+ // Vanilla: Back/forward button was used
1678
+ newState = History.getStateById(event.state);
1679
+ }
1680
+ else if (History.expectedStateId) {
1681
+ // Vanilla: A new state was pushed, and popstate was called manually
1682
+ newState = History.getStateById(History.expectedStateId);
1683
+ }
1684
+ else {
1685
+ // Initial State
1686
+ newState = History.extractState(document.location.href);
1687
+ }
1498
1688
 
1499
- // Handle
1500
- if (index > 0) {
1501
- // Forward
1502
- for (i = 1; i <= index; ++i) {
1503
- History.forward(queue);
1504
- }
1505
- }
1506
- else if (index < 0) {
1507
- // Backward
1508
- for (i = -1; i >= index; --i) {
1509
- History.back(queue);
1510
- }
1511
- }
1512
- else {
1513
- throw new Error('History.go: History.go requires a positive or negative integer passed.');
1514
- }
1689
+ // The State did not exist in our store
1690
+ if (!newState) {
1691
+ // Regenerate the State
1692
+ newState = History.createStateObject(null, null, document.location.href);
1693
+ }
1515
1694
 
1516
- // Chain
1517
- return History;
1518
- };
1695
+ // Clean
1696
+ History.expectedStateId = false;
1519
1697
 
1698
+ // Check if we are the same state
1699
+ if (History.isLastSavedState(newState)) {
1700
+ // There has been no change (just the page's hash has finally propagated)
1701
+ //History.debug('History.onPopState: no change', newState, History.savedStates);
1702
+ History.busy(false);
1703
+ return false;
1704
+ }
1520
1705
 
1521
- // ----------------------------------------------------------------------
1522
- // Initialise
1706
+ // Store the State
1707
+ History.storeState(newState);
1708
+ History.saveState(newState);
1523
1709
 
1524
- /**
1525
- * Create the initial State
1526
- */
1527
- History.saveState(History.storeState(History.extractState(document.location.href, true)));
1710
+ // Force update of the title
1711
+ History.setTitle(newState);
1528
1712
 
1529
- /**
1530
- * Bind for Saving Store
1531
- */
1532
- if (amplify) {
1533
- History.onUnload = function() {
1534
- // Prepare
1535
- var
1536
- currentStore = amplify.store('History.store') || {},
1537
- item;
1538
-
1539
- // Ensure
1540
- currentStore.idToState = currentStore.idToState || {};
1541
- currentStore.urlToId = currentStore.urlToId || {};
1542
- currentStore.stateToId = currentStore.stateToId || {};
1543
-
1544
- // Sync
1545
- for (item in History.idToState) {
1546
- if (!History.idToState.hasOwnProperty(item)) {
1547
- continue;
1548
- }
1549
- currentStore.idToState[item] = History.idToState[item];
1550
- }
1551
- for (item in History.urlToId) {
1552
- if (!History.urlToId.hasOwnProperty(item)) {
1553
- continue;
1554
- }
1555
- currentStore.urlToId[item] = History.urlToId[item];
1556
- }
1557
- for (item in History.stateToId) {
1558
- if (!History.stateToId.hasOwnProperty(item)) {
1559
- continue;
1560
- }
1561
- currentStore.stateToId[item] = History.stateToId[item];
1562
- }
1713
+ // Fire Our Event
1714
+ History.Adapter.trigger(window, 'statechange');
1715
+ History.busy(false);
1563
1716
 
1564
- // Update
1565
- History.store = currentStore;
1566
-
1567
- // Store
1568
- amplify.store('History.store', currentStore);
1569
- };
1570
- // For Internet Explorer
1571
- setInterval(History.onUnload, History.options.storeInterval);
1572
- // For Other Browsers
1573
- History.Adapter.bind(window, 'beforeunload', History.onUnload);
1574
- History.Adapter.bind(window, 'unload', History.onUnload);
1575
- // Both are enabled for consistency
1717
+ // Return true
1718
+ return true;
1719
+ };
1720
+ History.Adapter.bind(window, 'popstate', History.onPopState);
1721
+
1722
+ /**
1723
+ * History.pushState(data,title,url)
1724
+ * Add a new State to the history object, become it, and trigger onpopstate
1725
+ * We have to trigger for HTML4 compatibility
1726
+ * @param {object} data
1727
+ * @param {string} title
1728
+ * @param {string} url
1729
+ * @return {true}
1730
+ */
1731
+ History.pushState = function(data, title, url, queue) {
1732
+ //History.debug('History.pushState: called', arguments);
1733
+
1734
+ // Check the State
1735
+ if (History.getHashByUrl(url) && History.emulated.pushState) {
1736
+ throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).');
1576
1737
  }
1577
1738
 
1739
+ // Handle Queueing
1740
+ if (queue !== false && History.busy()) {
1741
+ // Wait + Push to Queue
1742
+ //History.debug('History.pushState: we must wait', arguments);
1743
+ History.pushQueue({
1744
+ scope: History,
1745
+ callback: History.pushState,
1746
+ args: arguments,
1747
+ queue: queue
1748
+ });
1749
+ return false;
1750
+ }
1578
1751
 
1579
- // ----------------------------------------------------------------------
1580
- // HTML5 State Support
1752
+ // Make Busy + Continue
1753
+ History.busy(true);
1581
1754
 
1582
- if (History.emulated.pushState) {
1583
- /*
1584
- * Provide Skeleton for HTML4 Browsers
1585
- */
1755
+ // Create the newState
1756
+ var newState = History.createStateObject(data, title, url);
1586
1757
 
1587
- // Prepare
1588
- var emptyFunction = function() {
1589
- };
1590
- History.pushState = History.pushState || emptyFunction;
1591
- History.replaceState = History.replaceState || emptyFunction;
1758
+ // Check it
1759
+ if (History.isLastSavedState(newState)) {
1760
+ // Won't be a change
1761
+ History.busy(false);
1592
1762
  }
1593
1763
  else {
1594
- /*
1595
- * Use native HTML5 History API Implementation
1596
- */
1597
-
1598
- /**
1599
- * History.onPopState(event,extra)
1600
- * Refresh the Current State
1601
- */
1602
- History.onPopState = function(event) {
1603
- // Reset the double check
1604
- History.doubleCheckComplete();
1605
-
1606
- // Check for a Hash, and handle apporiatly
1607
- var currentHash = History.getHash();
1608
- if (currentHash) {
1609
- // Expand Hash
1610
- var currentState = History.extractState(currentHash || document.location.href, true);
1611
- if (currentState) {
1612
- // We were able to parse it, it must be a State!
1613
- // Let's forward to replaceState
1614
- //History.debug('History.onPopState: state anchor', currentHash, currentState);
1615
- History.replaceState(currentState.data, currentState.title, currentState.url, false);
1616
- }
1617
- else {
1618
- // Traditional Anchor
1619
- //History.debug('History.onPopState: traditional anchor', currentHash);
1620
- History.Adapter.trigger(window, 'anchorchange');
1621
- History.busy(false);
1622
- }
1623
-
1624
- // We don't care for hashes
1625
- History.expectedStateId = false;
1626
- return false;
1627
- }
1628
-
1629
- // Prepare
1630
- var newState = false;
1631
-
1632
- // Prepare
1633
- event = event || {};
1634
- if (typeof event.state === 'undefined') {
1635
- // jQuery
1636
- if (typeof event.originalEvent !== 'undefined' && typeof event.originalEvent.state !== 'undefined') {
1637
- event.state = event.originalEvent.state || false;
1638
- }
1639
- // MooTools
1640
- else if (typeof event.event !== 'undefined' && typeof event.event.state !== 'undefined') {
1641
- event.state = event.event.state || false;
1642
- }
1643
- }
1644
-
1645
- // Ensure
1646
- event.state = (event.state || false);
1647
-
1648
- // Fetch State
1649
- if (event.state) {
1650
- // Vanilla: Back/forward button was used
1651
- newState = History.getStateById(event.state);
1652
- }
1653
- else if (History.expectedStateId) {
1654
- // Vanilla: A new state was pushed, and popstate was called manually
1655
- newState = History.getStateById(History.expectedStateId);
1656
- }
1657
- else {
1658
- // Initial State
1659
- newState = History.extractState(document.location.href);
1660
- }
1661
-
1662
- // The State did not exist in our store
1663
- if (!newState) {
1664
- // Regenerate the State
1665
- newState = History.createStateObject(null, null, document.location.href);
1666
- }
1667
-
1668
- // Clean
1669
- History.expectedStateId = false;
1670
-
1671
- // Check if we are the same state
1672
- if (History.isLastSavedState(newState)) {
1673
- // There has been no change (just the page's hash has finally propagated)
1674
- //History.debug('History.onPopState: no change', newState, History.savedStates);
1675
- History.busy(false);
1676
- return false;
1677
- }
1678
-
1679
- // Store the State
1680
- History.storeState(newState);
1681
- History.saveState(newState);
1682
-
1683
- // Force update of the title
1684
- History.setTitle(newState);
1685
-
1686
- // Fire Our Event
1687
- History.Adapter.trigger(window, 'statechange');
1688
- History.busy(false);
1689
-
1690
- // Return true
1691
- return true;
1692
- };
1693
- History.Adapter.bind(window, 'popstate', History.onPopState);
1694
-
1695
- /**
1696
- * History.pushState(data,title,url)
1697
- * Add a new State to the history object, become it, and trigger onpopstate
1698
- * We have to trigger for HTML4 compatibility
1699
- * @param {object} data
1700
- * @param {string} title
1701
- * @param {string} url
1702
- * @return {true}
1703
- */
1704
- History.pushState = function(data, title, url, queue) {
1705
- //History.debug('History.pushState: called', arguments);
1706
-
1707
- // Check the State
1708
- if (History.getHashByUrl(url) && History.emulated.pushState) {
1709
- throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).');
1710
- }
1764
+ // Store the newState
1765
+ History.storeState(newState);
1766
+ History.expectedStateId = newState.id;
1711
1767
 
1712
- // Handle Queueing
1713
- if (queue !== false && History.busy()) {
1714
- // Wait + Push to Queue
1715
- //History.debug('History.pushState: we must wait', arguments);
1716
- History.pushQueue({
1717
- scope: History,
1718
- callback: History.pushState,
1719
- args: arguments,
1720
- queue: queue
1721
- });
1722
- return false;
1723
- }
1724
-
1725
- // Make Busy + Continue
1726
- History.busy(true);
1768
+ // Push the newState
1769
+ history.pushState(newState.id, newState.title, newState.url);
1727
1770
 
1728
- // Create the newState
1729
- var newState = History.createStateObject(data, title, url);
1730
-
1731
- // Check it
1732
- if (History.isLastSavedState(newState)) {
1733
- // Won't be a change
1734
- History.busy(false);
1735
- }
1736
- else {
1737
- // Store the newState
1738
- History.storeState(newState);
1739
- History.expectedStateId = newState.id;
1771
+ // Fire HTML5 Event
1772
+ History.Adapter.trigger(window, 'popstate');
1773
+ }
1740
1774
 
1741
- // Push the newState
1742
- history.pushState(newState.id, newState.title, newState.url);
1775
+ // End pushState closure
1776
+ return true;
1777
+ };
1778
+
1779
+ /**
1780
+ * History.replaceState(data,title,url)
1781
+ * Replace the State and trigger onpopstate
1782
+ * We have to trigger for HTML4 compatibility
1783
+ * @param {object} data
1784
+ * @param {string} title
1785
+ * @param {string} url
1786
+ * @return {true}
1787
+ */
1788
+ History.replaceState = function(data, title, url, queue) {
1789
+ //History.debug('History.replaceState: called', arguments);
1790
+
1791
+ // Check the State
1792
+ if (History.getHashByUrl(url) && History.emulated.pushState) {
1793
+ throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).');
1794
+ }
1743
1795
 
1744
- // Fire HTML5 Event
1745
- History.Adapter.trigger(window, 'popstate');
1746
- }
1796
+ // Handle Queueing
1797
+ if (queue !== false && History.busy()) {
1798
+ // Wait + Push to Queue
1799
+ //History.debug('History.replaceState: we must wait', arguments);
1800
+ History.pushQueue({
1801
+ scope: History,
1802
+ callback: History.replaceState,
1803
+ args: arguments,
1804
+ queue: queue
1805
+ });
1806
+ return false;
1807
+ }
1747
1808
 
1748
- // End pushState closure
1749
- return true;
1750
- };
1751
-
1752
- /**
1753
- * History.replaceState(data,title,url)
1754
- * Replace the State and trigger onpopstate
1755
- * We have to trigger for HTML4 compatibility
1756
- * @param {object} data
1757
- * @param {string} title
1758
- * @param {string} url
1759
- * @return {true}
1760
- */
1761
- History.replaceState = function(data, title, url, queue) {
1762
- //History.debug('History.replaceState: called', arguments);
1763
-
1764
- // Check the State
1765
- if (History.getHashByUrl(url) && History.emulated.pushState) {
1766
- throw new Error('History.js does not support states with fragement-identifiers (hashes/anchors).');
1767
- }
1809
+ // Make Busy + Continue
1810
+ History.busy(true);
1768
1811
 
1769
- // Handle Queueing
1770
- if (queue !== false && History.busy()) {
1771
- // Wait + Push to Queue
1772
- //History.debug('History.replaceState: we must wait', arguments);
1773
- History.pushQueue({
1774
- scope: History,
1775
- callback: History.replaceState,
1776
- args: arguments,
1777
- queue: queue
1778
- });
1779
- return false;
1780
- }
1812
+ // Create the newState
1813
+ var newState = History.createStateObject(data, title, url);
1781
1814
 
1782
- // Make Busy + Continue
1783
- History.busy(true);
1815
+ // Check it
1816
+ if (History.isLastSavedState(newState)) {
1817
+ // Won't be a change
1818
+ History.busy(false);
1819
+ }
1820
+ else {
1821
+ // Store the newState
1822
+ History.storeState(newState);
1823
+ History.expectedStateId = newState.id;
1784
1824
 
1785
- // Create the newState
1786
- var newState = History.createStateObject(data, title, url);
1825
+ // Push the newState
1826
+ history.replaceState(newState.id, newState.title, newState.url);
1787
1827
 
1788
- // Check it
1789
- if (History.isLastSavedState(newState)) {
1790
- // Won't be a change
1791
- History.busy(false);
1792
- }
1793
- else {
1794
- // Store the newState
1795
- History.storeState(newState);
1796
- History.expectedStateId = newState.id;
1828
+ // Fire HTML5 Event
1829
+ History.Adapter.trigger(window, 'popstate');
1830
+ }
1797
1831
 
1798
- // Push the newState
1799
- history.replaceState(newState.id, newState.title, newState.url);
1832
+ // End replaceState closure
1833
+ return true;
1834
+ };
1800
1835
 
1801
- // Fire HTML5 Event
1802
- History.Adapter.trigger(window, 'popstate');
1803
- }
1836
+ // Be aware, the following is only for native pushState implementations
1837
+ // If you are wanting to include something for all browsers
1838
+ // Then include it above this if block
1804
1839
 
1805
- // End replaceState closure
1806
- return true;
1807
- };
1840
+ /**
1841
+ * Setup Safari Fix
1842
+ */
1843
+ if (History.bugs.safariPoll) {
1844
+ History.intervalList.push(setInterval(History.safariStatePoll, History.options.safariPollInterval));
1845
+ }
1808
1846
 
1809
- // Be aware, the following is only for native pushState implementations
1810
- // If you are wanting to include something for all browsers
1811
- // Then include it above this if block
1847
+ /**
1848
+ * Ensure Cross Browser Compatibility
1849
+ */
1850
+ if (navigator.vendor === 'Apple Computer, Inc.' || (navigator.appCodeName || '') === 'Mozilla') {
1851
+ /**
1852
+ * Fix Safari HashChange Issue
1853
+ */
1812
1854
 
1813
- /**
1814
- * Setup Safari Fix
1815
- */
1816
- if (History.bugs.safariPoll) {
1817
- setInterval(History.safariStatePoll, History.options.safariPollInterval);
1818
- }
1855
+ // Setup Alias
1856
+ History.Adapter.bind(window, 'hashchange', function() {
1857
+ History.Adapter.trigger(window, 'popstate');
1858
+ });
1819
1859
 
1820
- /**
1821
- * Ensure Cross Browser Compatibility
1822
- */
1823
- if (navigator.vendor === 'Apple Computer, Inc.' || (navigator.appCodeName || '') === 'Mozilla') {
1824
- /**
1825
- * Fix Safari HashChange Issue
1826
- */
1827
-
1828
- // Setup Alias
1829
- History.Adapter.bind(window, 'hashchange', function() {
1830
- History.Adapter.trigger(window, 'popstate');
1831
- });
1832
-
1833
- // Initialise Alias
1834
- if (History.getHash()) {
1835
- History.Adapter.onDomLoad(function() {
1836
- History.Adapter.trigger(window, 'hashchange');
1837
- });
1838
- }
1839
- }
1860
+ // Initialise Alias
1861
+ if (History.getHash()) {
1862
+ History.Adapter.onDomLoad(function() {
1863
+ History.Adapter.trigger(window, 'hashchange');
1864
+ });
1865
+ }
1866
+ }
1840
1867
 
1841
- } // !History.emulated.pushState
1868
+ } // !History.emulated.pushState
1842
1869
 
1843
- }; // History.initCore
1870
+ }; // History.initCore
1844
1871
 
1845
- // Try and Initialise History
1846
- History.init();
1872
+ // Try and Initialise History
1873
+ History.init();
1847
1874
 
1848
1875
  })(window);