PageRenderTime 49ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/brlcad/branches/STABLE/src/other/hv3/bookmarks.html

https://bitbucket.org/vrrm/brl-cad-copy-for-fast-history-browsing-in-git
HTML | 553 lines | 477 code | 76 blank | 0 comment | 0 complexity | 1d1787b0969e95dd9f669764615465c6 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, LGPL-2.1, Apache-2.0, AGPL-3.0, LGPL-3.0, GPL-3.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, 0BSD, BSD-3-Clause
  1. <HTML>
  2. <HEAD>
  3. <STYLE>
  4. h1 {
  5. font-size: 1.4em;
  6. font-weight: normal;
  7. }
  8. h2 {
  9. float: left;
  10. width: 45%;
  11. border: solid 1px purple;
  12. border-right: none;
  13. border-bottom: none;
  14. color: purple;
  15. margin: 2px;
  16. background: #CCCCCC;
  17. cursor: pointer;
  18. font-size: 1.4em;
  19. }
  20. li {
  21. float: left;
  22. width: 50%;
  23. min-width: 180px;
  24. }
  25. form {
  26. margin: 0;
  27. }
  28. .bookmark[active="true"]:hover {
  29. background-color: #DDDDDD;
  30. }
  31. .bookmark[clickable="0"]:hover {
  32. background-color: #EEEEEE;
  33. }
  34. .bookmark {
  35. cursor:pointer;
  36. margin: 1px;
  37. padding: 2px 0 2px 15px;
  38. background: #EEEEEE;
  39. border-top: solid 2px purple;
  40. border-left: solid 2px purple;
  41. display: block;
  42. position: relative;
  43. float: left;
  44. width: 45%;
  45. min-width: 180px;
  46. }
  47. .bookmark a {
  48. text-decoration: none;
  49. color: black;
  50. display: block;
  51. }
  52. ul {
  53. padding: 0;
  54. margin: auto auto auto 15px;
  55. }
  56. .folder {
  57. padding: 0px 5px;
  58. margin: 0 0 10px 0;
  59. width: 100%;
  60. display: table;
  61. position: relative;
  62. }
  63. #controls {
  64. border-bottom: solid black 2px;
  65. background: white;
  66. position: fixed;
  67. top: 0px;
  68. left: 0px;
  69. right: 0px;
  70. z-index: 5;
  71. }
  72. .edit {
  73. display: block;
  74. float: right;
  75. font-size: small;
  76. color: darkblue;
  77. text-decoration: underline;
  78. font-weight: normal;
  79. padding-right: 5px;
  80. }
  81. body {
  82. margin-top: 3em;
  83. }
  84. #searchbox {
  85. width:100%;
  86. }
  87. #searchbox[active="1"] {
  88. border-color: red;
  89. }
  90. #undelete {
  91. display:block;
  92. float:right;
  93. font-size:medium;
  94. }
  95. </STYLE>
  96. <SCRIPT>
  97. var drag = new Object()
  98. drag.element = undefined
  99. drag.interval = undefined
  100. drag.x = undefined
  101. drag.y = undefined
  102. drag.original_x = undefined
  103. drag.original_y = undefined
  104. drag.isDelete = false
  105. var app = new Object()
  106. app.zFilter = ""
  107. function mouseup_handler (event) {
  108. drag.element.style.top = '0px'
  109. drag.element.style.left = '0px'
  110. drag.element.style.zIndex = 'auto'
  111. drag.element.style.backgroundColor = ""
  112. clearInterval(drag.interval)
  113. document.onmouseup = undefined
  114. document.onmousemove = undefined
  115. if (drag.isDelete) {
  116. drag.element.parentNode.removeChild(drag.element)
  117. app.version = hv3_bookmarks.remove(drag.element)
  118. var u = document.getElementById("undelete")
  119. u.innerHTML = hv3_bookmarks.get_undelete()
  120. } else if (drag.element.onclick == ignore_click) {
  121. if (drag.element.className == 'bookmark') {
  122. app.version = hv3_bookmarks.bookmark_move(drag.element)
  123. }
  124. if (drag.element.className == 'folder') {
  125. app.version = hv3_bookmarks.folder_move(drag.element)
  126. }
  127. }
  128. drag.isDelete = false
  129. drag.element = undefined
  130. return 0
  131. }
  132. function mousemove_handler (event) {
  133. drag.x = event.clientX
  134. drag.y = event.clientY
  135. return 0
  136. }
  137. function ignore_click () {
  138. this.onclick = undefined
  139. this.setAttribute("clickable", "1")
  140. return 0
  141. }
  142. function drag_cache_position(d) {
  143. d.drag_x1 = 0
  144. d.drag_y1 = 0
  145. for (var p = d; p != null; p = p.offsetParent) {
  146. d.drag_x1 += p.offsetLeft
  147. d.drag_y1 += p.offsetTop
  148. }
  149. d.drag_x2 = d.drag_x1 + d.offsetWidth
  150. d.drag_y2 = d.drag_y1 + d.offsetHeight
  151. }
  152. function drag_makedropmap(elem) {
  153. drag.drag_targets = new Array()
  154. var dlist = document.getElementsByTagName('div');
  155. for ( var i = 0; i < dlist.length; i++) {
  156. var d = dlist[i]
  157. if (d != elem && d.className == elem.className) {
  158. if (d.className == "folder" && d.id == "0") {
  159. continue
  160. }
  161. if (d.parentNode.style.display == "none") {
  162. continue
  163. }
  164. drag_cache_position(d)
  165. drag.drag_targets.push(d)
  166. }
  167. }
  168. if (elem.className == "bookmark") {
  169. var hlist = document.getElementsByTagName('h2')
  170. for ( var i = 0; i < hlist.length; i++) {
  171. var h = hlist[i]
  172. if (h.nextSibling.style.display != "none") {
  173. drag_cache_position(h)
  174. drag.drag_targets.push(h)
  175. }
  176. }
  177. hlist = document.getElementsByTagName('h1')
  178. for ( var i = 0; i < hlist.length; i++) {
  179. var h = hlist[i]
  180. drag_cache_position(h)
  181. h.drag_y2 += 15
  182. drag.drag_targets.push(h)
  183. }
  184. }
  185. drag_cache_position(drag.controls)
  186. }
  187. // This function is called periodically while an object is being
  188. // dragged (once every 20 ms or so).
  189. //
  190. function drag_update() {
  191. if (
  192. Math.abs(drag.x - drag.original_x) > 10 ||
  193. Math.abs(drag.y - drag.original_y) > 10
  194. ) {
  195. drag.element.onclick = ignore_click
  196. drag.element.setAttribute("clickable", "0")
  197. }
  198. drag.element.style.left = (drag.x - drag.original_x) + 'px'
  199. drag.element.style.top = (drag.y - drag.original_y) + 'px'
  200. if (!drag.drag_targets) {
  201. drag_makedropmap(drag.element)
  202. }
  203. drag_cache_position(drag.element)
  204. var cx = (drag.element.drag_x1 + drag.element.drag_x2) / 2
  205. var cy = (drag.element.drag_y1 + drag.element.drag_y2) / 2
  206. var isDelete = ((drag.element.drag_y1+5) < drag.controls.drag_y2)
  207. if (isDelete && !drag.isDelete) {
  208. drag.element.style.backgroundColor = "black"
  209. drag.isDelete = isDelete
  210. } else if (!isDelete && drag.isDelete) {
  211. drag.element.style.backgroundColor = ""
  212. drag.isDelete = isDelete
  213. }
  214. for (var i = 0; i < drag.drag_targets.length; i++) {
  215. var a = drag.drag_targets[i]
  216. if (a.drag_x1 < cx && a.drag_x2 > cx &&
  217. a.drag_y1 < cy && a.drag_y2 > cy
  218. ) {
  219. var x = drag.element.drag_x1
  220. var y = drag.element.drag_y1
  221. var p = a.parentNode
  222. if (a.nodeName == "H2") {
  223. p = a.nextSibling
  224. a = p.firstChild
  225. } else if (a.nodeName == "H1") {
  226. p = app.nofolder.childNodes[1]
  227. a = p.firstChild
  228. }
  229. if (drag.element.parentNode == p) {
  230. for (var j = 0; j < p.childNodes.length; j++) {
  231. var child = p.childNodes[j]
  232. if (child == a) {
  233. break
  234. } else if (child == drag.element) {
  235. a = a.nextSibling
  236. break
  237. }
  238. }
  239. }
  240. if (drag.element == a) return
  241. p.insertBefore(drag.element, a)
  242. drag_cache_position(drag.element)
  243. var sx = drag.element.drag_x1 - x
  244. var sy = drag.element.drag_y1 - y
  245. drag.original_x += sx
  246. drag.original_y += sy
  247. drag.element.style.left = (drag.x - drag.original_x) + 'px'
  248. drag.element.style.top = (drag.y - drag.original_y) + 'px'
  249. drag_makedropmap(drag.element)
  250. break
  251. }
  252. }
  253. }
  254. function mousedown_handler (elem, event) {
  255. clearInterval(drag.interval)
  256. drag.isDelete = false
  257. drag.element = elem
  258. drag.original_x = event.clientX
  259. drag.original_y = event.clientY
  260. drag.x = event.clientX
  261. drag.y = event.clientY
  262. drag.element.style.zIndex = 10
  263. drag.interval = setInterval(drag_update, 20)
  264. document.onmouseup = mouseup_handler
  265. document.onmousemove = mousemove_handler
  266. drag_makedropmap(drag.element)
  267. return 0
  268. }
  269. // Toggle visibility of folder contents.
  270. //
  271. function folder_toggle (folder, event, toggle) {
  272. var h2 = folder.childNodes[0]
  273. var ul = folder.childNodes[1]
  274. if (folder.onclick == ignore_click) return
  275. var isHidden = (1 * folder.getAttribute('folder_hidden'))
  276. if (toggle) {
  277. isHidden = (isHidden ? 0 : 1)
  278. folder.setAttribute('folder_hidden', isHidden)
  279. app.version = hv3_bookmarks.folder_hidden(folder)
  280. }
  281. if (isHidden) {
  282. /* Hide the folder contents */
  283. ul.style.display = 'none'
  284. ul.style.clear = 'none'
  285. h2.childNodes[1].innerHTML = '+ '
  286. h2.style.width = 'auto'
  287. h2.style.cssFloat = 'none'
  288. folder.style.cssFloat = 'left'
  289. folder.style.width = '45%'
  290. folder.style.clear = 'none'
  291. folder.style.marginBottom = '0'
  292. } else {
  293. /* Expand the folder contents */
  294. ul.style.display = 'table'
  295. ul.style.clear = 'both'
  296. h2.childNodes[1].innerHTML = '- '
  297. h2.style.width = '45%'
  298. h2.style.cssFloat = 'left'
  299. folder.style.clear = 'both'
  300. folder.style.cssFloat = 'none'
  301. folder.style.width = '100%'
  302. folder.style.marginBottom = '10px'
  303. }
  304. return 0
  305. }
  306. function bookmark_mousedown(elem, event) {
  307. mousedown_handler(elem, event)
  308. return 0
  309. }
  310. function folder_mousedown(elem, event) {
  311. mousedown_handler(elem.parentNode, event)
  312. return 0
  313. }
  314. function bookmark_submit(form) {
  315. var elem = form.parentNode.parentNode
  316. var new_name = form.n.value
  317. var new_uri = form.u.value
  318. var new_tags = form.t.value
  319. elem.setAttribute('bookmark_name', new_name)
  320. elem.setAttribute('bookmark_uri', new_uri)
  321. elem.setAttribute('bookmark_tags', new_tags)
  322. var a = elem.childNodes[1]
  323. a.firstChild.data = new_name
  324. a.href = new_uri
  325. app.version = hv3_bookmarks.bookmark_edit(elem)
  326. bookmark_edit(elem)
  327. return 0
  328. }
  329. function bookmark_edit(elem) {
  330. var div = elem.childNodes[2]
  331. if (div.isExpanded) {
  332. div.innerHTML = ""
  333. elem.firstChild.firstChild.data = "(edit)"
  334. elem.setAttribute("active", "true")
  335. div.isExpanded = 0
  336. } else {
  337. var str = ""
  338. str += '<FORM onsubmit="return bookmark_submit(this)">'
  339. str += '<TABLE width=100%>'
  340. str += '<TR><TD>Name: <TD width=100%><INPUT width=90% name=n></INPUT>'
  341. str += '<TR><TD>URI: <TD><INPUT width=90% name=u></INPUT>'
  342. str += '<TR><TD>Tags: <TD><INPUT width=90% name=t></INPUT>'
  343. str += '</TABLE></FORM>'
  344. div.innerHTML = str
  345. var f = div.firstChild;
  346. f.n.value = elem.getAttribute('bookmark_name')
  347. f.u.value = elem.getAttribute('bookmark_uri')
  348. f.t.value = elem.getAttribute('bookmark_tags')
  349. f.n.select()
  350. f.n.focus()
  351. elem.firstChild.firstChild.data = "(cancel)"
  352. elem.setAttribute("active", "false")
  353. div.isExpanded = 1
  354. }
  355. return 0
  356. }
  357. function folder_submit(form) {
  358. var elem = form.parentNode.parentNode.parentNode
  359. var t = elem.firstChild.childNodes[2]
  360. var new_name = form.n.value
  361. elem.setAttribute('folder_name', new_name)
  362. t.data = new_name
  363. app.version = hv3_bookmarks.folder_edit(elem)
  364. folder_edit(elem)
  365. return 0
  366. }
  367. function folder_edit(elem) {
  368. var ed = elem.firstChild.firstChild
  369. var div = elem.firstChild.childNodes[3]
  370. if (div.isExpanded) {
  371. ed.firstChild.data = "(edit)"
  372. div.innerHTML = ""
  373. div.isExpanded = 0
  374. } else {
  375. ed.firstChild.data = "(cancel)"
  376. var str = "";
  377. str += '<FORM onsubmit="return folder_submit(this)">'
  378. str += '<TABLE width=100% style="color:black;margin-left:15px">'
  379. str += '<TR><TD>Name: <TD width=100%><INPUT name=n></INPUT>'
  380. str += '</TABLE></FORM>'
  381. div.innerHTML = str
  382. f = div.firstChild
  383. f.n.value = elem.getAttribute('folder_name')
  384. f.n.select()
  385. f.n.focus()
  386. div.isExpanded = 1
  387. }
  388. return 0
  389. }
  390. // The following are "onclick" handlers for the "New Bookmark"
  391. // and "New Folder" buttons respectively.
  392. //
  393. function bookmark_new() {
  394. var id = hv3_bookmarks.bookmark_new(app.zFilter)
  395. refresh_content()
  396. bookmark_edit(document.getElementById(id))
  397. }
  398. function folder_new() {
  399. var id = hv3_bookmarks.folder_new()
  400. refresh_content()
  401. folder_edit(document.getElementById(id))
  402. }
  403. function refresh_content() {
  404. drag.content.innerHTML = hv3_bookmarks.get_html_content(app.zFilter)
  405. app.version = hv3_bookmarks.get_version()
  406. app.nofolder = document.getElementById("0")
  407. var u = document.getElementById("undelete")
  408. u.innerHTML = hv3_bookmarks.get_undelete()
  409. var dlist = document.getElementsByTagName('div');
  410. for ( var i = 0; i < dlist.length; i++) {
  411. var d = dlist[i]
  412. if (d.className == "folder") {
  413. folder_toggle(d, 0, 0)
  414. }
  415. }
  416. }
  417. function check_refresh_content() {
  418. if (app.version != hv3_bookmarks.get_version()) {
  419. refresh_content()
  420. }
  421. }
  422. function filter_bookmarks () {
  423. var s = document.getElementById("searchbox")
  424. app.zFilter = s.value
  425. refresh_content()
  426. if (app.zFilter != "") {
  427. s.setAttribute("active", "1")
  428. } else {
  429. s.setAttribute("active", "0")
  430. }
  431. return 0
  432. }
  433. function clear_filter () {
  434. var s = document.getElementById("searchbox")
  435. s.value = ""
  436. return filter_bookmarks()
  437. }
  438. function bookmark_undelete () {
  439. hv3_bookmarks.undelete()
  440. refresh_content()
  441. return 0
  442. }
  443. window.onload = function () {
  444. document.getElementById("searchbox").focus()
  445. drag.controls = document.getElementById("controls")
  446. drag.content = document.getElementById("content")
  447. refresh_content()
  448. setInterval(check_refresh_content, 2000)
  449. }
  450. </SCRIPT>
  451. </HEAD>
  452. <BODY>
  453. <TABLE id="controls"><TR>
  454. <TD align="center">
  455. <INPUT type="button" value="New Folder" onclick="folder_new()">
  456. <TD align="center">
  457. <INPUT type="button" value="New Bookmark" onclick="bookmark_new()">
  458. </INPUT>
  459. <TD align="left" style="padding-left:15px">
  460. Filter:
  461. <TD align="left" width=100% style="padding-right:2px">
  462. <FORM onsubmit="return filter_bookmarks()">
  463. <INPUT type="text" id="searchbox"></INPUT>
  464. </FORM>
  465. <TD align="center">
  466. <INPUT type="button" value="View All" onclick="clear_filter()"></INPUT>
  467. </TABLE>
  468. <H1>BOOKMARKS:<span id="undelete"></H1>
  469. <DIV id=content></DIV>
  470. <P style="clear:both;padding-top:1cm">
  471. <I>To delete individual bookmarks or entire folders, drag to the top
  472. of the page (i.e. over the "Filter:" or "New Bookmark" controls).
  473. A single level of undelete is available.
  474. </I>
  475. </P>
  476. </BODY>
  477. </HTML>