samples.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /*
  2. * https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
  3. *
  4. * contentloaded.js
  5. *
  6. * Author: Diego Perini (diego.perini at gmail.com)
  7. * Summary: cross-browser wrapper for DOMContentLoaded
  8. * Updated: 20101020
  9. * License: MIT
  10. * Version: 1.2
  11. *
  12. * URL:
  13. * http://javascript.nwbox.com/ContentLoaded/
  14. * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE
  15. *
  16. */
  17. // @win window reference
  18. // @fn function reference
  19. function contentLoaded(win, fn) {
  20. var done = false, top = true,
  21. doc = win.document,
  22. root = doc.documentElement,
  23. modern = doc.addEventListener,
  24. add = modern ? 'addEventListener' : 'attachEvent',
  25. rem = modern ? 'removeEventListener' : 'detachEvent',
  26. pre = modern ? '' : 'on',
  27. init = function(e) {
  28. if (e.type == 'readystatechange' && doc.readyState != 'complete') return;
  29. (e.type == 'load' ? win : doc)[rem](pre + e.type, init, false);
  30. if (!done && (done = true)) fn.call(win, e.type || e);
  31. },
  32. poll = function() {
  33. try { root.doScroll('left'); } catch(e) { setTimeout(poll, 50); return; }
  34. init('poll');
  35. };
  36. if (doc.readyState == 'complete') fn.call(win, 'lazy');
  37. else {
  38. if (!modern && root.doScroll) {
  39. try { top = !win.frameElement; } catch(e) { }
  40. if (top) poll();
  41. }
  42. doc[add](pre + 'DOMContentLoaded', init, false);
  43. doc[add](pre + 'readystatechange', init, false);
  44. win[add](pre + 'load', init, false);
  45. }
  46. }
  47. function ajax(url, method, params, callback) {
  48. var obj;
  49. try {
  50. obj = new XMLHttpRequest();
  51. } catch (e) {
  52. try {
  53. obj = new ActiveXObject("Msxml2.XMLHTTP");
  54. } catch (e) {
  55. try {
  56. obj = new ActiveXObject("Microsoft.XMLHTTP");
  57. } catch (e) {
  58. alert("Your browser does not support Ajax.");
  59. return false;
  60. }
  61. }
  62. }
  63. obj.onreadystatechange = function () {
  64. if (obj.readyState == 4) {
  65. callback(obj);
  66. }
  67. };
  68. obj.open(method, url, true);
  69. obj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  70. obj.setRequestHeader("Content-type","application/x-www-form-urlencoded");
  71. obj.send(params);
  72. return obj;
  73. }
  74. (function () {
  75. function trimCodeBlock(code, pad) {
  76. var i, ilen;
  77. pad = pad || 0;
  78. code = code.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); //escape html special chars
  79. code = code.split('\n');
  80. for (i = 0; i < 10; i++) {
  81. if (code[0].trim() === '') {
  82. code.splice(0, 1);
  83. }
  84. }
  85. var offset = 0;
  86. for (i = 0, ilen = code[0].length; i < ilen; i++) {
  87. if (code[0].charAt(i) != " ") {
  88. break;
  89. }
  90. offset++;
  91. }
  92. for (i = 0, ilen = code.length; i < ilen; i++) {
  93. code[i] = new Array(pad + 1).join(' ') + code[i].substring(offset);
  94. }
  95. return code;
  96. }
  97. function bindDumpButton() {
  98. Handsontable.dom.addEvent(document.body, 'click', function (e) {
  99. var element = e.target || e.srcElement;
  100. if (element.nodeName == "BUTTON" && element.name == 'dump') {
  101. var name = element.getAttribute('data-dump');
  102. var instance = element.getAttribute('data-instance');
  103. var hot = window[instance];
  104. console.log('data of ' + name, hot.getData());
  105. }
  106. });
  107. }
  108. function bindFiddleButton() {
  109. Handsontable.dom.addEvent(document.body, 'click', function (e) {
  110. var element = e.target || e.srcElement;
  111. if (element.className == "jsFiddleLink") {
  112. var keys = ['common'];
  113. var runfiddle = element.getAttribute('data-runfiddle');
  114. if (!runfiddle) {
  115. throw new Error("Edit in jsFiddle button does not contain runfiddle data");
  116. }
  117. keys.push(runfiddle);
  118. var index = window.location.href.lastIndexOf("/") + 1;
  119. var baseUrl = window.location.href.substr(0, index);
  120. var tags = [];
  121. var css = '';
  122. var js = '';
  123. var html = '';
  124. var onDomReady = true;
  125. tags.push('</style><!-- Ugly Hack due to jsFiddle issue: http://goo.gl/BUfGZ -->\n');
  126. tags.push('<script src="https://code.jquery.com/jquery-1.11.1.min.js"></script>\n');
  127. for (var i = 0, ilen = keys.length; i < ilen; i++) {
  128. var dataFillde = document.querySelectorAll('[data-jsfiddle=' + keys[i] + ']');
  129. for (var x = 0, len = dataFillde.length; x < len; x++) {
  130. var tag;
  131. if (dataFillde[x].nodeName === 'LINK') {
  132. tag = dataFillde[x].outerHTML;
  133. }
  134. else if (dataFillde[x].nodeName === 'SCRIPT' && dataFillde[x].src) {
  135. tag = dataFillde[x].outerHTML;
  136. }
  137. else if (dataFillde[x].nodeName === 'SCRIPT') {
  138. js += trimCodeBlock(dataFillde[x].innerHTML, 2).join('\n') + '\n';
  139. }
  140. else if (dataFillde[x].nodeName === 'STYLE') {
  141. css += trimCodeBlock(dataFillde[x].innerHTML).join('\n') + '\n';
  142. }
  143. else { //DIV
  144. var clone = dataFillde[x].cloneNode(true);
  145. var clonedExample = clone.querySelector('#' + runfiddle);
  146. clonedExample.innerHTML = ''; //clear example HTML, just leave container
  147. var originalHT = dataFillde[x].querySelector('#' + runfiddle);
  148. var originalStyle = originalHT.getAttribute('data-originalstyle');
  149. if (originalStyle) {
  150. clonedExample.setAttribute('style', originalStyle);
  151. }
  152. var aName = clone.querySelectorAll('a[name]');
  153. var hotHidden = clone.querySelectorAll('handsontable.hidden');
  154. for (var n = 0, nLen = aName.length; n < nLen; n++) {
  155. aName[n].parentNode.removeChild(aName[n]);
  156. }
  157. for (var h = 0, hLen = hotHidden.length; h < hLen; h++) {
  158. hotHidden[h].parentNode.removeChild(hotHidden[h]);
  159. }
  160. html += trimCodeBlock(clone.innerHTML).join('\n');
  161. }
  162. if (tag) {
  163. tag = tag.replace(' data-jsfiddle="' + keys[i] + '"', '');
  164. if (tag.indexOf('href="http') === -1 && tag.indexOf('href="//') && tag.indexOf('src="http') === -1 && tag.indexOf('src="//')) {
  165. tag = tag.replace('href="', 'href="' + baseUrl);
  166. tag = tag.replace('src="', 'src="' + baseUrl);
  167. tag = tag.replace('demo/../', '');
  168. if (this.nodeName === 'LINK' && this.rel === "import") {
  169. //web component imports must be loaded throught a CORS-enabling proxy, because our local server does not support it yet
  170. tag = tag.replace('href="http://', 'href="http://www.corsproxy.com/');
  171. onDomReady = false;
  172. }
  173. }
  174. tags.push(tag)
  175. }
  176. }
  177. }
  178. tags.push('');
  179. tags.push('<style type="text/css">');
  180. tags.push('body {background: white; margin: 20px;}');
  181. tags.push('h2 {margin: 20px 0;}');
  182. css = tags.join('\n') + '\n' + css;
  183. js += trimCodeBlock(bindDumpButton.toString(), 2).join('\n') + '\n';
  184. js += ' bindDumpButton();\n\n';
  185. if (onDomReady) {
  186. js = '$(document).ready(function () {\n\n' + js + '});';
  187. }
  188. var form = document.createElement('FORM');
  189. form.action = 'http://jsfiddle.net/api/post/library/pure/';
  190. form.method = 'POST';
  191. form.target = '_blank';
  192. form.innerHTML = '<input type="text" name="title" value="Handsontable example">' +
  193. '<textarea name="html">' + html.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea>' +
  194. '<textarea name="js">' + js.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea>' +
  195. '<textarea name="css">' + css.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea>';
  196. form.style.visibility = 'hidden';
  197. // var form = $('<form action="http://jsfiddle.net/api/post/library/pure/" method="post" target="_blank">' +
  198. // '<input type="text" name="title" value="Handsontable example">' +
  199. // '<textarea name="html">' + html.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea>' +
  200. // '<textarea name="js">' + js.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea>' +
  201. // '<textarea name="css">' + css.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '</textarea>' +
  202. // '</form>');
  203. // form.css({
  204. // visibility: 'hidden'
  205. // });
  206. document.body.appendChild(form);
  207. form.submit();
  208. form.parentNode.removeChild(form);
  209. }
  210. });
  211. }
  212. function init() {
  213. var codes = document.querySelectorAll('.descLayout pre.javascript code');
  214. for (var i = 0, lenI = codes.length; i < lenI; i++) {
  215. var scriptS = codes[i];
  216. var codeS = trimCodeBlock(codes[i].innerHTML);
  217. scriptS.innerHTML = codeS.join('\n');
  218. }
  219. var scripts = document.querySelectorAll('.codeLayout script');
  220. for (var j = 0, lenJ = scripts.length; j < lenJ; j++) {
  221. var script = scripts[j];
  222. var pre = document.createElement('PRE');
  223. pre.className = 'javascript';
  224. var code = document.createElement('CODE');
  225. var codeInner = trimCodeBlock(script.innerHTML);
  226. codeInner = codeInner.join('<br>').replace(/ /g, "&nbsp;&nbsp;");
  227. code.innerHTML = codeInner;
  228. pre.appendChild(code);
  229. script.parentNode.insertBefore(pre, script.nextSibling);
  230. }
  231. hljs.initHighlighting();
  232. bindFiddleButton();
  233. bindDumpButton();
  234. updateFooter();
  235. }
  236. function updateFooter () {
  237. var footer = document.querySelector(".footer-text");
  238. if(!footer) {
  239. return true;
  240. }
  241. // Email obfuscator script 2.1 by Tim Williams, University of Arizona
  242. // Random encryption key feature by Andrew Moulden, Site Engineering Ltd
  243. // This code is freeware provided these four comment lines remain intact
  244. // A wizard to generate this code is at http://www.jottings.com/obfuscator/
  245. var coded = "1iffw@1R42Vw4nR0fi.Gwa";
  246. var key = "GF9al7W2hVXHzeENn30K6QkruRfxov1IATMigJ4BcYLmZSyd5swUpDOCtqb8Pj";
  247. var shift = coded.length;
  248. var link = "";
  249. var ltr;
  250. for (var i = 0; i < coded.length; i++) {
  251. if (key.indexOf(coded.charAt(i)) == -1) {
  252. ltr = coded.charAt(i)
  253. link += (ltr)
  254. }
  255. else {
  256. ltr = (key.indexOf(coded.charAt(i)) - shift + key.length) % key.length
  257. link += (key.charAt(ltr))
  258. }
  259. }
  260. footer.innerHTML = 'Handsontable &copy; 2012-' + new Date().getFullYear() + ' Nextgen. Contact us at <a href="mailto:' + link + '">'+ link +'</a>.<br> Code and documentation licensed under the The MIT License.';
  261. }
  262. function initSidebar() {
  263. function collapseAll(menu) {
  264. var ul = menu.querySelectorAll('ul ul');
  265. for (var i = 0, len = ul.length; i < len; i++) {
  266. ul[i].style.display = 'none';
  267. }
  268. var current = menu.querySelectorAll('.current');
  269. for (var x = 0, xLen = current.length; x < xLen; x++) {
  270. current[x].className = current[x].className.replace('current', '');
  271. }
  272. }
  273. function expandOne(menu, expand, isImmediate) {
  274. collapseAll(menu, isImmediate);
  275. var elem = expand;
  276. while (elem != menu) {
  277. elem.className = elem.className + ' current';
  278. if (elem.nodeName == "UL") {
  279. elem.style.display = 'block';
  280. }
  281. elem = elem.parentNode;
  282. }
  283. }
  284. function importFromHtml(element, html, startWord, endWord) {
  285. if (element) {
  286. var fragment = html.substring(html.indexOf(startWord), html.indexOf(endWord));
  287. var DIV = document.createElement("DIV");
  288. DIV.style.display = 'none';
  289. DIV.innerHTML = fragment;
  290. element.appendChild(DIV);
  291. DIV.style.display = 'block';
  292. }
  293. }
  294. function onMenuLoad(html) {
  295. html = html.response || html.responseText;
  296. //top menu
  297. importFromHtml(document.getElementById('outside-links-wrapper'), html, "<!-- outside-links start -->", "<!-- outside-links end -->");
  298. //left menu
  299. var menu = document.getElementById('global-menu-clone');
  300. importFromHtml(menu, html, "<!-- menu start -->", "<!-- menu end -->");
  301. bindMenuEvents(menu);
  302. var link = menu.querySelectorAll('a');
  303. for (var i = 0; i < link.length; i++) {
  304. link[i].href = link[i].href.replace(/demo\//, "");
  305. if (link[i].href === window.location.href) {
  306. link[i].className = 'current';
  307. //expandOne(menu, link[i], true);
  308. }
  309. }
  310. }
  311. function bindMenuEvents(menu) {
  312. //collapseAll(menu, true);
  313. //Handsontable.dom.addEvent(menu, 'click', function (ev) {
  314. // var element = ev.target || ev.srcElement;
  315. //
  316. // if (element.nodeName == "H3") {
  317. // if (element.parentNode.className.indexOf('current') != -1) {
  318. // collapseAll(menu);
  319. // }
  320. // else {
  321. // expandOne(menu, element.parentNode.querySelector("ul"));
  322. // }
  323. // }
  324. //});
  325. }
  326. var menu = document.querySelector("#global-menu");
  327. if (menu) {
  328. bindMenuEvents(menu);
  329. }
  330. else {
  331. ajax("../index.html", 'GET', '', onMenuLoad);
  332. }
  333. }
  334. var initAll = function () {
  335. init();
  336. initSidebar();
  337. };
  338. contentLoaded(window, function (event) {
  339. initAll();
  340. });
  341. //if(document.addEventListener) {
  342. // document.addEventListener('DOMContentLoaded', initAll, false);
  343. //} else {
  344. // document.attachEvent('DOMContentLoaded', initAll);
  345. //}
  346. })();