nitro.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // Nitrogen Compatibility Layer
  2. function unbase64(base64) {
  3. var binary_string = window.atob(base64);
  4. var len = binary_string.length;
  5. var bytes = new Uint8Array(len);
  6. for (var i = 0; i < len; i++) bytes[i] = binary_string.charCodeAt(i);
  7. return bytes.buffer;
  8. }
  9. // Nitrogen Compatibility Layer
  10. function direct(term) { ws.send(enc(tuple(atom('direct'),term))); }
  11. function validateSources() { return true; }
  12. function querySourceRaw(Id) {
  13. var val, el = document.getElementById(Id);
  14. if (!el) {
  15. val = qs('input[name='+Id+']:checked'); val = val ? val.value : "";
  16. } else switch (el.tagName) {
  17. case 'FIELDSET':
  18. val = qs('[id="'+Id+'"]:checked'); val = val ? val.value : ""; break;
  19. case 'INPUT':
  20. switch (el.getAttribute("type")) {
  21. case 'radio': case 'checkbox': val = el ? el.checked : ""; break;
  22. case 'date': val = Date.parse(el.value); val = val && new Date(val) || ""; break;
  23. case 'calendar': val = pickers[el.id]._d || ""; break;
  24. case 'comboLookup': case 'hidden':
  25. if (el.hasAttribute('data-bind')) {
  26. val = { 'text' : el.value, 'bind' : el.getAttribute('data-bind')};
  27. } else {
  28. val = el.value;
  29. }
  30. break;
  31. default: var edit = el.contentEditable;
  32. if (edit && edit === 'true') val = el.innerHTML;
  33. else val = el.value;
  34. }
  35. break;
  36. default:
  37. if (el.getAttribute('data-text-input')) {
  38. val = querySourceRaw(el.children[1].children[0].id);
  39. } else if (el.getAttribute('data-vector-input')) {
  40. val = querySourceRaw(el.children[1].id);
  41. } else if (el.getAttribute('data-modify-input')) {
  42. sourceRaw = el.children[1] ? el.children[1].id : el.children[0].id;
  43. val = querySourceRaw(sourceRaw)
  44. } else if (el.getAttribute('data-group-input')) {
  45. val = Array.from(el.querySelectorAll('[data-group-list="saved"]')).map(function (list) {
  46. return querySourceRaw(list.id);
  47. })
  48. } else if (el.getAttribute('data-group-list')) {
  49. const items = el.querySelectorAll('[data-group-item]')
  50. val = Array.from(items).map(function (item) {
  51. let text = item.firstChild.innerHTML;
  52. let bind = item.getAttribute('data-bind');
  53. if (bind) return {'text': text, 'bind': bind};
  54. return text;
  55. });
  56. val = val.length > 1 ? val : val[0];
  57. } else if (el.getAttribute('data-edit-input')) {
  58. let sortableList = el.children[1];
  59. let sourceRaw = sortableList ? sortableList.id :
  60. el.children[0].children[0].children[0].id;
  61. val = querySourceRaw(sourceRaw);
  62. } else if (el.getAttribute('data-sortable-list')) {
  63. val = getSortableValues('#' + el.id);
  64. } else if (el.getAttribute('data-modify-list')) {
  65. val = comboLookupModifyValues(el.id);
  66. } else if (el.contentEditable === 'true') {
  67. val = el.innerHTML;
  68. } else {
  69. val = el.value;
  70. switch (val) {
  71. case "true": val = new Boolean(true); break;
  72. case "false": val = new Boolean(false); break;
  73. }
  74. }
  75. }
  76. return val;
  77. }
  78. function querySourceConvert(qs) {
  79. if (qs && qs.hasOwnProperty('text') && qs.hasOwnProperty('bind')) {
  80. return dec(unbase64(qs.bind)); }
  81. else if (qs instanceof Date) {
  82. return tuple(number(qs.getFullYear()),
  83. number(qs.getMonth() + 1),
  84. number(qs.getDate())); }
  85. else if (qs instanceof Boolean) {
  86. return atom(qs.valueOf()); }
  87. else if (qs instanceof Array) {
  88. return list.apply(null, qs.map(querySourceConvert)); }
  89. else { return bin(qs); }
  90. }
  91. function querySource(Id) {
  92. var qs = querySourceRaw(Id);
  93. return querySourceConvert(qs);
  94. }