bsPage.js 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716
  1. /*
  2. Copyright (C) 2014-2015 H3XL, Inc
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. */
  14. // This file holds the html for the main page
  15. var blockscadpage = {};
  16. blockscadpage.start = function() {
  17. var output = "";
  18. output += ' <div id="main">\n';
  19. output += ' <nav class="navbar" id="top-navigation-bar">\n';
  20. output += ' <div class="container-fluid">\n';
  21. output += ' <div class="navbar-center">\n';
  22. output += ' <a href="#" class="hoverStyle pull-left mar-top5">COCOCAD</a>\n';
  23. output += ' <div class="project-name-wrapper">';
  24. output += ' <input type="text" id="project-name" class="project-name-input" placeholder="Project name" maxlength="28" style="min-width: 120px;">'
  25. output += ' <i class="material-icons mdl-color-text--white pro-name-edit" style="font-size: 30px">create</i>';
  26. output += ' </div>';
  27. output += ' <ul class="nav navbar-nav">\n';
  28. // output += ' <li class="dropdown vc">\n';
  29. // output += ' <select id="languageMenu"></select>\n';
  30. // output += ' </li>\n';
  31. // output += ' <li><a " href="https://youtu.be/5RNKVn7lijM" target="_blank"> <img src="imgs/youtube_logo.png" alt="Youtube" width="100" height="50"></a></li>\n';
  32. output += ' <li class="dropdown">\n';
  33. output += ' <a href="#" class="first-link dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><i id="global" class="material-icons mdl-color-text--white">language</i></a>\n';
  34. output += ' <ul id="languageMenu" class="dropdown-menu" role="menu">\n';
  35. output += ' </ul>\n';
  36. output += ' </li>\n';
  37. output += ' <li class="dropdown"> \n';
  38. output += ' <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">'+Blockscad.Msg.PROJECT_MENU+'</a>\n';
  39. output += ' <ul id="file-menu" class="dropdown-menu" role="menu">\n';
  40. output += ' <li><a href="#" class="new-project">'+Blockscad.Msg.NEW+'</a></li>\n';
  41. output += ' <li class="divider"></li>\n';
  42. output += ' <li><a href="#" id="saveLocal">'+Blockscad.Msg.SAVE_BLOCKS_LOCAL+'</a></li>\n';
  43. output += ' <li>\n';
  44. output += ' <input type="file" accept=".xml" id="loadLocal" style="visibility: hidden; width: 1px; height: 1px" />\n';
  45. output += ' <a href="#" onclick="document.getElementById(\'loadLocal\').click(); return false">'+Blockscad.Msg.LOAD_BLOCKS_LOCAL+'</a>\n';
  46. output += ' </li>\n';
  47. output += ' <li class="divider"></li>\n';
  48. output += ' <li>\n';
  49. output += ' <input type="file" accept=".xml" id="importLocal" style="visibility: hidden; width: 1px; height: 1px" />\n';
  50. output += ' <a href="#" onclick="document.getElementById(\'importLocal\').click(); return false">'+Blockscad.Msg.IMPORT_BLOCKS_LOCAL+'</a>\n';
  51. output += ' </li>\n';
  52. output += ' <li>\n';
  53. output += ' <input type="file" accept=".stl" id="importStl" style="visibility: hidden; width: 1px; height: 1px" />\n';
  54. output += ' <a href="#" onclick="document.getElementById(\'importStl\').click(); return false">'+Blockscad.Msg.IMPORT_STL_MENU +'</a>\n';
  55. output += ' </li>\n';
  56. output += ' <li class="divider"></li>\n';
  57. output += ' <li><a href="#" id="saveOpenscad">' + Blockscad.Msg.SAVE_SCAD_LOCAL + '</a></li>\n';
  58. output += ' </ul>\n';
  59. output += ' </li>\n';
  60. output += ' <li class="dropdown">\n';
  61. output += ' <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">' + Blockscad.Msg.OPTIONS_MENU + '</a>\n';
  62. output += ' <ul id="options-menu" class="dropdown-menu" role="menu">\n';
  63. output += ' <li><a href="#" id="simpleToolbox">' + Blockscad.Msg.SIMPLE_TOOLBOX + '</a></li>\n';
  64. output += ' <li><a href="#" id="advancedToolbox">' + Blockscad.Msg.ADVANCED_TOOLBOX + '</a></li>\n';
  65. output += ' <li>\n';
  66. output += ' <a class="trigger right-caret">' + Blockscad.Msg.BLOCK_COLORS + '</a>\n';
  67. output += ' <ul class="dropdown-menu sub-menu">\n';
  68. output += ' <li><a href="#" id="colors_one">' + Blockscad.Msg.CLASSIC_COLORS + '</a></li>\n';
  69. output += ' <li><a href="#" id="colors_two">' + Blockscad.Msg.PALE_COLORS + '</a></li>\n';
  70. output += ' </ul>\n';
  71. output += ' </li>\n';
  72. output += ' </ul>\n';
  73. output += ' </li>\n';
  74. output += ' <li class="dropdown">\n';
  75. output += ' <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">' + Blockscad.Msg.EXAMPLES_MENU + '</a>\n';
  76. output += ' <ul id="examples-menu" class="dropdown-menu" role="menu">\n';
  77. output += ' <li><a href="#" id="examples_cube_with_cutouts">' + Blockscad.Msg.EXAMPLE_CUBE_WITH_CUTOUTS + '</a></li>\n';
  78. output += ' <li><a href="#" id="examples_anthias_fish">' + Blockscad.Msg.EXAMPLE_ANTHIAS_FISH +'</a></li>\n';
  79. output += ' <li><a href="#" id="examples_torus">' + Blockscad.Msg.TORUS + '</a></li>\n';
  80. output += ' <li><a href="#" id="examples_box">' + Blockscad.Msg.EXAMPLE_PARAMETRIC_BOX + '</a></li>\n';
  81. output += ' <li><a href="#" id="examples_linear_extrude">' + Blockscad.Msg.LINEAR_EXTRUDE + '</a></li>\n';
  82. output += ' <li><a href="#" id="examples_rotate_extrude">' + Blockscad.Msg.ROTATE_EXTRUDE + '</a></li>\n';
  83. output += ' <li><a href="#" id="examples_hulled_loop_sun">' + Blockscad.Msg.EXAMPLE_LOOP_SUN + '</a></li>\n';
  84. output += ' <li><a href="#" id="examples_sine_function_with_loop">' + Blockscad.Msg.EXAMPLE_LOOP_SINE + '</a></li>\n';
  85. output += ' <li><a href="#" id="examples_trefoil_knot_param_eq">' + Blockscad.Msg.EXAMPLE_PARAMETRIC_EQ_KNOT + '</a></li>\n';
  86. output += ' </ul>\n';
  87. output += ' </li>\n';
  88. output += ' <li class="dropdown">\n';
  89. output += ' <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">' + Blockscad.Msg.HELP_MENU + '</a>\n';
  90. output += ' <ul id="help-menu" class="dropdown-menu" role="menu">\n';
  91. // output += ' <li><a href="docs/" target="_blank">' + Blockscad.Msg.DOCUMENTATION_LINK + '</a></li>\n';
  92. // output += '<!-- <li class="divider"></li>\n';
  93. // output += ' <li><a href="#" id="colorPicker">Color Picker</a></li> -->\n';
  94. // output += ' <li class="divider"></li>\n';
  95. output += ' <li><a href="#" data-toggle="modal" data-target="#about-modal">' + Blockscad.Msg.ABOUT_LINK + '</a></li>\n';
  96. output += ' </ul>\n';
  97. output += ' </li>\n';
  98. // output += ' <li class="button">\n';
  99. // output += ' <a type="button" class="btn btn-default btn-lg" style="margin-top:2px" href="https://youtu.be/5RNKVn7lijM" target="_blank">'+ Blockscad.Msg.GET_STARTED_VIDEO + '</a>';
  100. // output += ' </li>\n';
  101. /* I CHANGED */
  102. /* Changed image from youtube to play.png. Replace the old one directly. Find the image from the imgs folder. */
  103. output += ' <a href="https://youtu.be/5RNKVn7lijM" target="_blank"> <img id="playButton" src="imgs/play.png" alt="Youtube Vedio" width="45" height="30"></a>';
  104. /* I CHANGED */
  105. output += ' </ul>\n';
  106. output += ' <div id="login-area" class="navbar-right">\n';
  107. output += ' </div>\n';
  108. output += ' </div> <!-- /.navbar-center-->\n';
  109. output += ' </div> <!-- /.container-fluid -->\n';
  110. output += ' </nav>\n';
  111. // output += ' <!-- after the navbar, I want a second row to contain the project name (if any), -->\n';
  112. // output += ' <!-- undo/redo/discard_all, and the "Blocks/Code" tabs. Use a div for this. -->\n';
  113. output += ' <div id="editView">\n';
  114. output += ' <a href="#blocklyContainer" data-toggle="pill" id="displayBlocks">' + Blockscad.Msg.BLOCKS_TAB + '</a>\n';
  115. output += ' <a href="#openScadPre" data-toggle="pill" id="displayCode">' + Blockscad.Msg.CODE_TAB + '</a>\n';
  116. output += ' <button type="button" class="btn btn-default mdl-button mdl-js-ripple-effect mdl-js-button mdl-button--fab mdl-color--orange" id="undoButton" style="margin-right: -5px">\n';
  117. output += ' <i class="material-icons mdl-color-text--white" style="font-size: 24px">undo</i>\n';
  118. output += ' </button>\n';
  119. output += ' <button type="button" class="btn btn-default btn btn-default mdl-button mdl-js-ripple-effect mdl-js-button mdl-button--fab mdl-color--orange" id="redoButton" style="margin-right: 20px">\n';
  120. output += ' <i class="material-icons mdl-color-text--white" style="font-size: 24px">redo</i>\n';
  121. output += ' </button>\n';
  122. output += ' <button id="trashButton" class="btn btn-default notext mdl-button mdl-js-ripple-effect mdl-js-button mdl-button--fab mdl-color--red-700" title="' + Blockscad.Msg.MOUSEOVER_TRASHCAN + '">\n';
  123. output += ' <i class="material-icons mdl-color-text--white" style="font-size: 24px">delete</i>\n';
  124. output += ' </button>\n';
  125. output += ' <!-- End of the header content -->\n';
  126. output += '\n';
  127. output += ' <!-- beginning of page content (blockly + viewer) -->\n';
  128. output += ' <div class="tab-content">\n';
  129. output += ' <div class="tab-pane active" id="blocklyContainer">\n';
  130. output += ' <div id="blocklyDiv">\n';
  131. output += '\n';
  132. output += ' <div class="resizableDiv">\n';
  133. output += ' <div id="renderDiv">\n';
  134. // output += ' <input type="text" id="defColor"/>\n';
  135. // output += ' <button type="button" id="viewReset" class="vreset">' + Blockscad.Msg.RESET_VIEW_BUTTON;
  136. // output += ' </button>\n';
  137. // output += '<!--';
  138. // output += ' <button type="button" id="picButton" class="btn btn-default btn-pushed">';
  139. // output += ' Pic';
  140. // output += ' </button>\n';
  141. // output += ' <button type="button" id="rPicButton" class="btn btn-default btn-pushed">';
  142. // output += ' Rotating Pic';
  143. // output += ' </button> \n';
  144. // output += '-->';
  145. // output += ' <button type="button" id="axesButton" class="btn btn-default btn-pushed">\n';
  146. // output += ' <img src="imgs/axes.png">\n';
  147. // output += ' </button>\n';
  148. // output += '\n';
  149. // output += '\n';
  150. output += ' <!-- <input type="text" id="colorButton"/> -->\n';
  151. // output += '\n';
  152. output += ' </div> <!--renderDiv -->\n';
  153. // output += '\n';
  154. output += ' <div id="paneContainer">\n';
  155. output += ' <div>\n';
  156. output += ' <button type="button" class="btn btn-default btn-lg changeable mdl-button mdl-js-ripple-effect mdl-js-button mdl-button--fab mdl-color--green" id="renderButton"><i class="material-icons mdl-color-text--white" style="font-size: 30px;transform: translate(-15px,-12px);">play_arrow</i></button>\n';
  157. output += ' <button type="button" class="btn btn-default btn-lg btn-danger " id="abortButton">' + Blockscad.Msg.ABORT_BUTTON + '</button>\n';
  158. output += ' </div>\n';
  159. output += ' <div class="paneButtonWrapper">\n';
  160. output += ' <div id="viewerButtons">\n';
  161. output += ' <div class="btn-group">\n';
  162. // output += ' <button id="colorButton" type="button" title="' + Blockscad.Msg.DEFAULT_COLOR_BUTTON + '" class="btn vbut btn-default">\n';
  163. output += ' <input type="text" id="defColor"/>\n';
  164. // output += ' </button>\n';
  165. output += ' </div>\n';
  166. output += ' <div class="btn-group">\n';
  167. output += ' <button id="axesButton" type="button" title="' + Blockscad.Msg.AXES_BUTTON + '" class="btn vbut btn-default flat-butt">\n';
  168. output += ' <svg viewbox="0 0 26 26">\n';
  169. output += ' <path style="stroke:#777;stroke-width:1.6;fill:none" d="m9 0.5v15h15"/>\n';
  170. output += ' <path style="stroke:#777;stroke-width:1.6;fill:none" d="m9 15-9 9"/>\n';
  171. output += ' </svg>\n';
  172. output += ' </button>\n';
  173. output += ' </div>\n';
  174. output += ' <div class="btn-group">\n';
  175. output += ' <button id="zInButton" type="button" title="' + Blockscad.Msg.ZOOM_IN_BUTTON + '" class="btn vbut btn-default">\n';
  176. output += ' <i class="material-icons mdl-color-text--grey-600" style="font-size: 30px">zoom_in</i>'
  177. // output += ' <svg viewbox="0 0 30 30">\n';
  178. // output += ' <circle r="14" style="stroke:#777;stroke-width:1.6;fill:none" cx="15" cy="15"/>\n';
  179. // output += ' <path style="stroke:#555;stroke-width:1.6;fill:none" d="m15 8v14"/>\n';
  180. // output += ' <path style="stroke:#555;stroke-width:1.6;fill:none" d="m8 15h14"/>\n';
  181. // output += ' </svg>\n';
  182. output += ' </button>\n';
  183. output += ' <button id="zOutButton" type="button" title="' + Blockscad.Msg.ZOOM_OUT_BUTTON + '" class="btn vbut btn-default">\n';
  184. output += ' <i class="material-icons mdl-color-text--grey-600" style="font-size: 30px">zoom_out</i>'
  185. // output += ' <svg viewbox="0 0 30 30">\n';
  186. // output += ' <circle r="14" style="stroke:#777;stroke-width:1.6;fill:none" cx="15" cy="15"/>\n';
  187. // output += ' <path style="stroke:#555;stroke-width:1.6;fill:none" d="m8 15h14"/>\n';
  188. // output += ' </svg>\n';
  189. output += ' </button>\n';
  190. output += ' </div>\n';
  191. output += ' <div class="btn-group">\n';
  192. output += ' <button id="zResetButton" type="button" title="' + Blockscad.Msg.ZOOM_RESET_BUTTON + '" class="btn vbut btn-default">\n';
  193. output += ' <svg viewbox="0 0 30 30">\n';
  194. output += ' <circle r="11" style="fill:none;stroke:#777;stroke-width:1.6" cx="15" cy="15"/>\n';
  195. output += ' <path d="M 15,4 15,0" style="stroke:#666;stroke-width:1.6;" />\n';
  196. output += ' <path d="m 26,15 4,0" style="stroke:#666;stroke-width:1.6;" />\n';
  197. output += ' <path d="m 15,26 0,4" style="stroke:#666;stroke-width:1.6;" />\n';
  198. output += ' <path d="M 4,15 0,15" style="stroke:#666;stroke-width:1.6;" />\n';
  199. output += ' <circle r="3" cy="15" cx="15" style="fill:#777;stroke:#777;stroke-width:1.6;" />\n';
  200. output += ' </svg>\n';
  201. output += ' </button>\n';
  202. output += ' <select id="viewMenu" class="btn btn-default">\n';
  203. output += ' <option value="diagonal">' + Blockscad.Msg.DIRECTION_DIAGONAL + '</option>\n';
  204. output += ' <option value="front">' + Blockscad.Msg.DIRECTION_FRONT + '</option>\n';
  205. output += ' <option value="top">' + Blockscad.Msg.DIRECTION_TOP + '</option>\n';
  206. output += ' <option value="right">' + Blockscad.Msg.DIRECTION_RIGHT + '</option>\n';
  207. output += ' <option value="left">' + Blockscad.Msg.DIRECTION_LEFT + '</option>\n';
  208. output += ' <option value="back">' + Blockscad.Msg.DIRECTION_BACK + '</option>\n';
  209. output += ' <option value="bottom">' + Blockscad.Msg.DIRECTION_BOTTOM + '</option>\n';
  210. output += ' </select>\n';
  211. output += ' </div>\n';
  212. output += ' <button type="button" id="cameraButton" class="btn vbut btn-default">\n';
  213. output += ' <i class="material-icons mdl-color-text--grey-600" style="font-size: 30px">camera_alt</i>\n';
  214. output += ' </button>\n';
  215. output += ' </div>\n'; // end of viewerButtons div
  216. output += ' <div id="viewerDefaults">\n';
  217. // output += ' <div class="btn-group">\n';
  218. // output += ' <button id="colorButton" type="button" title="' + Blockscad.Msg.DEFAULT_COLOR_BUTTON + '" class="btn vbut btn-default">\n';
  219. // output += ' <input type="text" id="defColor"/>\n';
  220. // output += ' </button>\n';
  221. // output += ' </div>\n';
  222. // output += ' <span id="resolution_radio" class="btn btn-default"> \n';
  223. output += ' <span id="resolution_radio"> \n';
  224. output += ' <span>Smooth:&nbsp&nbsp</span>\n';
  225. output += ' <label class="radio-inline mdl-radio mdl-js-radio mdl-js-ripple-effect"><input class="mdl-radio__button" type="radio" name="resolution" value="0.4"><span class="mdl-radio__label">Low</span></label>\n';
  226. output += ' <label class="radio-inline mdl-radio mdl-js-radio mdl-js-ripple-effect"><input class="mdl-radio__button" type="radio" name="resolution" value="1"checked><span class="mdl-radio__label">Medium</span></label>\n';
  227. output += ' <label class="radio-inline mdl-radio mdl-js-radio mdl-js-ripple-effect"><input class="mdl-radio__button" type="radio" name="resolution" value="2.25"><span class="mdl-radio__label">High</span></label>\n';
  228. output += ' </span>\n';
  229. output += ' </div>\n'; // end of viewerDefaults div
  230. output += ' <div id="renderPane">\n';
  231. // output += ' <button type="button" class="btn btn-default btn-lg changeable mdl-button mdl-js-ripple-effect mdl-js-button mdl-button--fab mdl-color--green" id="renderButton"><i class="material-icons mdl-color-text--white" style="font-size: 30px">play_arrow</i></button>\n';
  232. // output += ' <button type="button" class="btn btn-default btn-lg btn-danger " id="abortButton">' + Blockscad.Msg.ABORT_BUTTON + '</button>\n';
  233. output += ' <div id="stl_buttons" style="padding:5px 5px;border:none;">\n';
  234. output += ' <select id="render-type" style="padding:2px 4px;border:none;"></select>\n';
  235. output += ' <button type="button" class="btn btn-default btn-lg changeable" id="stlButton">' + Blockscad.Msg.GENERATE_STL + '</button>\n';
  236. output += ' </div>\n';
  237. output += ' <div id="render-ongoing">' + Blockscad.Msg.PARSE_IN_PROGRESS + ' <img id=busy src="imgs/busy2.gif"></div>\n';
  238. output += ' <div id="error-message"></div>\n';
  239. output += ' </div>\n';
  240. output += ' </div> <!-- paneButtonWrapper -->\n';
  241. output += ' </div> <!-- paneContainer -->\n';
  242. output += ' </div> <!-- resizable div -->\n';
  243. // output += ' </div> <!-- resizable div wrapper -->\n';
  244. // output += '\n';
  245. output += ' </div> <!-- blocklyDiv -->\n';
  246. output += ' </div>\n';
  247. output += ' <!-- Blockly Container (tab pane)-->\n';
  248. output += ' <pre class="tab-pane content" id="openScadPre"></pre>';
  249. // output += ' <pre class="tab-pane content" id="parsePre">';
  250. // this input is only for testing the parser. For any user-facing work this should be commented out.
  251. // output += ' <textarea id="textToParse" rows="15" cols="60"></textarea>';
  252. // output += ' <div id="parsedText" style="float:right;width:300;height:100">aaaaaaaaaaa</div>';
  253. // output += ' <button type="button" class="btn btn-default btn-lg" id="parseButton">Parse</button>';
  254. // output += ' </pre>\n';
  255. // end parser testing junk. Also look in blockscad.js for interaction with these elemenets.
  256. output += ' </div>\n';
  257. output += ' <!-- end tab content -->\n';
  258. output += ' </div> <!-- end of the #editView content -->\n';
  259. // output += '\n';
  260. output += ' <div id="projectView" class="hidden">\n';
  261. // output += ' <!-- first row - a "my projects" label, a "New" button on the right -->\n';
  262. output += ' <div style="width:100%; background-color:#bbbbff;">\n';
  263. output += ' <span class="proj-header">' + Blockscad.Msg.MY_PROJECTS + '</span>\n';
  264. output += ' <button type="button" class="btn btn-default new-project spacey">' + Blockscad.Msg.NEW_PROJECT_BUTTON + '</button>\n';
  265. output += ' <input type="text" class="search noselect" title="Filter" placeholder="' + Blockscad.Msg.PROJECT_LIST_FILTER + '" id="ptsearch"/>\n';
  266. output += ' <button type="button" class="btn btn-default plist-cancel spacey">' + Blockscad.Msg.PROJECT_LIST_EXIT + '</button>\n';
  267. output += ' </div>\n';
  268. output += ' <table id="projTable" class="table table-striped sortable" style="padding:0px">\n';
  269. output += ' <colgroup>\n';
  270. output += ' <col style="width:80px">\n';
  271. output += ' <col class="col-md-4">\n';
  272. output += ' <col class="col-md-4">\n';
  273. output += ' <!-- this was the column for "is project shared" attribute <col class="col-md-2"> -->\n';
  274. output += ' <col class="col-md-4">\n';
  275. output += ' </colgroup>\n';
  276. output += ' <thead>\n';
  277. // output += ' <!-- <tr> -->\n';
  278. output += ' <th class="sorttable_nosort" style="width:80px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</th>\n';
  279. output += ' <th class="noselect">' + Blockscad.Msg.PROJECT_NAME + '</th>\n';
  280. output += ' <th class="noselect">' + Blockscad.Msg.PROJECT_LIST_LAST_MODIFIED + '</th>\n';
  281. // output += ' <!-- this is the shared column <th>Shared</th> -->\n';
  282. output += ' <th class="sorttable_nosort"></th>\n';
  283. // output += ' <!-- </tr> -->\n';
  284. output += ' </thead> \n';
  285. output += ' <tbody id="projList">\n';
  286. output += ' </tbody>\n';
  287. output += ' </table>\n';
  288. output += ' <button type="button" id="list-more" class="btn btn-default">' + Blockscad.Msg.PROJECT_LIST_MORE_BUTTON + '</button>\n';
  289. output += ' </div> <!-- end of projectView -->\n';
  290. output += ' </div> <!-- end of main -->\n';
  291. output += '\n';
  292. output += '\n';
  293. // output += ' <!-- html for Popups -->\n';
  294. // output += ' <!-- Popup login -->\n';
  295. output += ' <div id="login-user" class="modal">\n';
  296. output += ' <div class="modal-dialog">\n';
  297. output += ' <div class="modal-md">\n';
  298. output += ' <div class="modal-content">\n';
  299. output += ' <form id="login-form">\n';
  300. output += ' <fieldset>\n';
  301. output += ' <div class="modal-header">\n';
  302. output += ' <a href="#" data-dismiss="modal" class="close">\n';
  303. output += ' </a>\n';
  304. output += ' <h3>' + Blockscad.Msg.LOGIN_BUTTON + '</h3>\n';
  305. output += ' </div>\n';
  306. output += ' <div class="modal-body">\n';
  307. output += ' <div class="form-group"> \n';
  308. output += ' <label class="control-label" for="username">' + Blockscad.Msg.USERNAME_FIELD + '</label>\n';
  309. output += ' <input class="username pull-right" id="login-username" type="text" autocomplete="off" name="username" maxlength="30" />\n';
  310. output += ' </div>\n';
  311. output += ' <div class="form-group"> \n';
  312. output += ' <label class="control-label" for="password">' + Blockscad.Msg.PASSWORD_FIELD + '</label>\n';
  313. output += ' <input type="password" name="password" id="login-password" autocomplete="off" class="password pull-right" maxlength="30"/>\n';
  314. output += ' </div>\n';
  315. output += ' </div>\n';
  316. output += ' <div class="modal-footer">\n';
  317. output += ' <div class="footer-error" id="login-error" style="margin-top:-5px; margin-bottom:12px; "></div>\n';
  318. output += ' <div>\n';
  319. output += ' <button id="logbut" class="button primary" type="submit" style="float: left;">' + Blockscad.Msg.LOGIN_BUTTON + '</button> \n';
  320. output += ' <a href="#" id="forgot-password" style="float: right;">' + Blockscad.Msg.PASSWORD_FORGOT_FIELD + '</a>\n';
  321. output += ' </div>\n';
  322. output += ' </div>\n';
  323. // output += '\n';
  324. output += ' </fieldset>\n';
  325. output += ' </form>\n';
  326. // output += '\n';
  327. output += ' </div><!-- /.modal-content -->\n';
  328. output += ' </div><!-- /.modal-md -->\n';
  329. output += ' </div><!-- /.modal-dialog -->\n';
  330. output += ' </div><!-- /.modal -->\n';
  331. // output += ' <!-- End Login Popup -->\n';
  332. // output += ' <!-- Popup change Password -->\n';
  333. output += ' <div id="change-password-modal" class="modal" data-backdrop="true">\n';
  334. output += ' <div class="modal-dialog">\n';
  335. output += ' <div class="modal-content">\n';
  336. output += ' <form id="password-settings-form" novalidate>\n';
  337. output += ' <fieldset>\n';
  338. output += ' <div class="modal-header">\n';
  339. output += ' <a href="#" data-dismiss="modal" data-target="#password-settings-modal" class="close">x\n';
  340. output += ' </a>\n';
  341. output += ' <h3>' + Blockscad.Msg.CHANGE_PASSWORD + '</h3>\n';
  342. output += ' <span>' + Blockscad.Msg.CHANGE_PASSWORD_INSTRUCTIONS + '</span>\n';
  343. output += ' </div>\n';
  344. output += ' <div class="modal-body">\n';
  345. output += ' <div class="form-group"> \n';
  346. output += ' <label class="control-label mycl" for="password">' + Blockscad.Msg.OLD_PASSWORD + ' :</label>\n';
  347. output += ' <input type="password" id="change-pw-old" name="old-password" autocomplete="off" class="password regform" maxlength="30"/>\n';
  348. output += ' <div class="form-error">\n';
  349. output += ' <span class="password-error"></span>\n';
  350. output += ' </div>\n';
  351. output += ' </div>\n';
  352. output += ' <div class="form-group"> \n';
  353. output += ' <label class="control-label mycl" for="password">' + Blockscad.Msg.NEW_PASSWORD + ' :</label>\n';
  354. output += ' <input type="password" id="change-pw-new" name="new-password" autocomplete="off" class="password regform" maxlength="30"/>\n';
  355. output += ' <div class="form-error">\n';
  356. output += ' <span class="password-error"></span>\n';
  357. output += ' </div>\n';
  358. output += ' </div>\n';
  359. output += ' <div class="form-group"> \n';
  360. output += ' <label class="control-label mycl" for="pass2">' + Blockscad.Msg.CONFIRM_NEW_PASSWORD + ' :</label>\n';
  361. output += ' <input type="password" id="change-pw-2" autocomplete="off" class="password regform" maxlength="30"/>\n';
  362. output += ' <div class="form-error">\n';
  363. output += ' <span class="password-confirm-error"></span>\n';
  364. output += ' </div> \n';
  365. output += ' </div>\n';
  366. output += ' <div class="buttons-right">\n';
  367. output += ' <button class="button primary" type="submit">' + Blockscad.Msg.CHANGE_PASSWORD + '</button> \n';
  368. output += ' </div>\n';
  369. output += ' </div>\n';
  370. output += ' <div class="modal-footer">\n';
  371. output += ' <span class="footer-error" id="pw-error"></span>\n';
  372. output += ' </div>\n';
  373. output += ' </fieldset>\n';
  374. output += ' </form>\n';
  375. // output += '\n';
  376. output += ' </div><!-- /.modal-content -->\n';
  377. output += ' </div><!-- /.modal-dialog -->\n';
  378. output += ' </div><!-- /.modal -->\n';
  379. // output += ' <!-- end change password popup -->\n';
  380. // output += ' <!-- Popup change Email -->\n';
  381. output += ' <div id="change-email-modal" class="modal" data-backdrop="true">\n';
  382. output += ' <div class="modal-dialog">\n';
  383. output += ' <div class="modal-content">\n';
  384. output += ' <form id="email-settings-form" novalidate>\n';
  385. output += ' <fieldset>\n';
  386. output += ' <div class="modal-header">\n';
  387. output += ' <a href="#" data-dismiss="modal" data-target="#email-settings-modal" class="close">x\n';
  388. output += ' </a>\n';
  389. output += ' <h3>' + Blockscad.Msg.CHANGE_EMAIL + '</h3>\n';
  390. output += ' </div>\n';
  391. output += ' <div class="modal-body">\n';
  392. output += ' <p id="current-email">' + Blockscad.Msg.CHANGE_EMAIL_CURRENT + ' :</p>\n';
  393. output += ' <div class="form-group"> \n';
  394. output += ' <label class="control-label mycl" for="email">' + Blockscad.Msg.CHANGE_EMAIL_NEW + ' :</label>\n';
  395. output += ' <input type="text" id="new-email" name="new-email" autocomplete="off" class="email regform" size="30"/>\n';
  396. output += ' <div class="form-error">\n';
  397. output += ' <span class="email-error"></span>\n';
  398. output += ' </div> \n';
  399. output += ' </div>\n';
  400. output += ' <div class="form-group"> \n';
  401. output += ' <label class="control-label mycl" for="password">' + Blockscad.Msg.PASSWORD_FIELD + ' :</label>\n';
  402. output += ' <input type="password" id="change-email-pw" name="password" autocomplete="off" class="password regform" maxlength="30"/>\n';
  403. output += ' </div> \n';
  404. output += ' <div class="buttons-right">\n';
  405. output += ' <button class="button primary" type="submit">' + Blockscad.Msg.CHANGE_EMAIL + '</button> \n';
  406. output += ' </div>\n';
  407. output += ' </div>\n';
  408. output += ' <div class="modal-footer">\n';
  409. output += ' <span class="footer-error" id="email-pw-error"></span>\n';
  410. output += ' </div>\n';
  411. output += ' </fieldset>\n';
  412. output += ' </form>\n';
  413. // output += '\n';
  414. output += ' </div><!-- /.modal-content -->\n';
  415. output += ' </div><!-- /.modal-dialog -->\n';
  416. output += ' </div><!-- /.modal -->\n';
  417. // output += ' <!-- end change password popup -->\n';
  418. // output += ' <!-- Popup register user -->\n';
  419. output += ' <div id="register-user" class="modal">\n';
  420. output += ' <div class="modal-dialog">\n';
  421. output += ' <div class="modal-content modal-md">\n';
  422. output += ' <form id="register-form">\n';
  423. output += ' <fieldset>\n';
  424. output += ' <div class="modal-header">\n';
  425. output += ' <a href="#" data-dismiss="modal" class="close">x\n';
  426. output += ' </a>\n';
  427. output += ' <h3>' + Blockscad.Msg.REGISTER_NEW_USER + '</h3>\n';
  428. output += ' </div>\n';
  429. output += ' <div class="modal-body">\n';
  430. output += ' <div class="form-group"> \n';
  431. output += ' <label class="control-label mycl" for="username">' + Blockscad.Msg.USERNAME_FIELD + '</label>\n';
  432. output += ' <input class="username regform" id="register-username" type="text" autocomplete="off" name="username" maxlength="30" />\n';
  433. output += ' <div class="form-error">\n';
  434. output += ' <span id="username-error"></span>\n';
  435. output += ' </div>\n';
  436. output += ' </div>\n';
  437. output += ' <div class="form-group"> \n';
  438. output += ' <label class="control-label mycl" for="password">' + Blockscad.Msg.PASSWORD_FIELD + '</label>\n';
  439. output += ' <input type="password" id="register-password" name="password" autocomplete="off" class="password regform" maxlength="30"/>\n';
  440. output += ' <div class="form-error">\n';
  441. output += ' <span class="password-error"></span>\n';
  442. output += ' </div>\n';
  443. output += ' </div>\n';
  444. output += ' <div class="form-group"> \n';
  445. output += ' <label class="control-label mycl" for="pass2">' + Blockscad.Msg.PASSWORD_RETYPE_FIELD + '</label>\n';
  446. output += ' <input type="password" id="pass2" autocomplete="off" class="password regform" maxlength="30"/>\n';
  447. output += ' <div class="form-error">\n';
  448. output += ' <span class="password-confirm-error"></span>\n';
  449. output += ' </div> \n';
  450. output += ' </div>\n';
  451. output += ' <div class="form-group"> \n';
  452. output += ' <label class="control-label mycl" for="email">' + Blockscad.Msg.EMAIL_FIELD + '</label>\n';
  453. output += ' <input type="text" id="register-email" name="email" autocomplete="off" class="email regform"/>\n';
  454. output += ' <div class="form-error">\n';
  455. output += ' <span class="email-error"></span>\n';
  456. output += ' </div> \n';
  457. output += ' </div>\n';
  458. output += ' </div>\n';
  459. output += ' <div class="modal-footer">\n';
  460. output += ' <span class="error"></span>\n';
  461. output += ' <div class="buttons-right">\n';
  462. output += ' <button class="button primary" type="submit">' + Blockscad.Msg.REGISTER_BUTTON + '</button> \n';
  463. output += ' </div>\n';
  464. output += ' </div>\n';
  465. // output += '\n';
  466. output += ' </fieldset>\n';
  467. output += ' </form>\n';
  468. // output += '\n';
  469. output += ' </div><!-- /.modal-content -->\n';
  470. output += ' </div><!-- /.modal-dialog -->\n';
  471. output += ' </div><!-- /.modal -->\n';
  472. // output += ' <!-- end of registration popup -->\n';
  473. // output += ' <!-- Popup password recovery-->\n';
  474. output += ' <div id="pw-recover" class="modal">\n';
  475. output += ' <div class="modal-dialog">\n';
  476. output += ' <div class="modal-content modal-md">\n';
  477. output += ' <form id="pw-recover-form" novalidate>\n';
  478. output += ' <fieldset>\n';
  479. output += ' <div class="modal-header">\n';
  480. output += ' <a href="#" data-dismiss="modal" class="close">x\n';
  481. output += ' </a>\n';
  482. output += ' <h3>' + Blockscad.Msg.RESET_PASSWORD + '</h3>\n';
  483. output += ' </div>\n';
  484. output += ' <div class="modal-body">\n';
  485. output += ' <p><b>' + Blockscad.Msg.PASSWORD_FORGOT_FIELD + '</b></p>\n';
  486. output += ' <p>' + Blockscad.Msg.RESET_PASSWORD_INSTRUCTIONS + '</p>\n';
  487. output += ' <div class="form-group"> \n';
  488. output += ' <label class="control-label mycl" for="username">' + Blockscad.Msg.USERNAME_FIELD + '</label>\n';
  489. output += ' <input class="username regform" id="recover-username" type="text" autocomplete="off" name="username" maxlength="30" />\n';
  490. output += ' <div>\n';
  491. output += ' <span class="email-error" id="un-recover-error" style="color:#b04444;"></span>\n';
  492. output += ' </div>\n';
  493. output += ' </div><p>' + Blockscad.Msg.DIALOG_OR + '</p>\n';
  494. output += ' <div class="form-group"> \n';
  495. output += ' <label class="control-label mycl" for="email">' + Blockscad.Msg.EMAIL_FIELD + '</label>\n';
  496. output += ' <input type="text" id="recover-email" name="email" autocomplete="off" class="email regform"/>\n';
  497. output += ' <div>\n';
  498. output += ' <span class="email-error" id="em-recover-error" style="color:#b04444;"></span>\n';
  499. output += ' </div> \n';
  500. output += ' </div>\n';
  501. output += ' </div>\n';
  502. output += ' <div class="modal-footer">\n';
  503. output += ' <div class="buttons-right">\n';
  504. output += ' <button class="button primary" type="submit">' + Blockscad.Msg.RESET_PASSWORD_LINK_BUTTON + '</button> \n';
  505. output += ' </div>\n';
  506. output += ' </div>\n';
  507. // output += '\n';
  508. output += ' </fieldset>\n';
  509. output += ' </form>\n';
  510. // output += '\n';
  511. output += ' </div><!-- /.modal-content -->\n';
  512. output += ' </div><!-- /.modal-dialog -->\n';
  513. output += ' </div><!-- /.modal --> <!-- end of password recovery popup -->\n';
  514. // output += ' <!-- password recovery email sent modal -->\n';
  515. output += ' <div id="recover-email-sent" class="modal">\n';
  516. output += ' <div class="modal-dialog modal-sm">\n';
  517. output += ' <div class="modal-content">\n';
  518. output += ' <div class="modal-header">\n';
  519. output += ' <a href="#" data-dismiss="modal" class="close">x\n';
  520. output += ' </a>\n';
  521. output += ' <h3>' + Blockscad.Msg.PASSWORD_RESET_EMAIL_SENT + '</h3>\n';
  522. output += ' </div>\n';
  523. output += ' <div class="modal-body">' + Blockscad.Msg.PASSWORD_RESET_EMAIL_INSTRUCTIONS;
  524. output += ' </div>\n';
  525. output += ' </div>\n';
  526. output += ' </div>\n';
  527. output += ' </div> <!-- end of password recovery email sent modal -->\n';
  528. // output += ' <!-- online delete confirm popup -->\n';
  529. output += ' <div id="online-delete-confirm" class="modal" data-backdrop="false">\n';
  530. output += ' <div class="modal-dialog modal-sm" style="width:400px">\n';
  531. output += ' <div class="modal-content">\n';
  532. output += ' <div class="modal-header">\n';
  533. output += ' <a href="#" data-dismiss="modal" class="close">x\n';
  534. output += ' </a>\n';
  535. output += ' <h4 class="modal-title"></h4>\n';
  536. output += ' </div>\n';
  537. output += ' <div class="modal-footer">\n';
  538. output += ' <button id="toss-it" class="button btn-lg btn-default primary pull-left" style="margin-left:90px" type="button" data-dismiss="modal" data-target="#online-delete-confirm">' + Blockscad.Msg.CONFIRM_DIALOG_YES + '</button> \n';
  539. output += ' <button id="whatthe" class="button btn-default btn-lg primary" style="margin-right:90px" type="button" data-dismiss="modal" data-target="#online-delete-confirm">' + Blockscad.Msg.CONFIRM_DIALOG_NO + '</button> \n';
  540. output += ' </div>\n';
  541. output += ' </div><!-- /.modal-content -->\n';
  542. output += ' </div><!-- /.modal-dialog -->\n';
  543. output += ' </div> <!-- end of online delete-confirm popup -->\n';
  544. // output += '\n';
  545. // // output += ' <!-- delete account confirm popup -->\n';
  546. output += ' <div id="delete-account-confirm" class="modal">\n';
  547. output += ' <div class="modal-dialog modal-sm" style="width:600px">\n';
  548. output += ' <div class="modal-content">\n';
  549. output += ' <div class="modal-header">\n';
  550. output += ' <h4>' + Blockscad.Msg.DELETE_ACCOUNT_CONFIRM + '</h4>\n';
  551. output += ' </div>\n';
  552. output += ' <div class="modal-footer">\n';
  553. output += ' <button id="delete-account-yes" class="button btn-lg btn-default primary pull-left" style="margin-left:10%" type="button" data-dismiss="modal" data-target="#delete-account-confirm">' + Blockscad.Msg.CONFIRM_DIALOG_YES + '</button> \n';
  554. output += ' <button class="button btn-default btn-lg primary" style="margin-right:10%" type="button" data-dismiss="modal" data-target="#delete-account-confirm">' + Blockscad.Msg.CONFIRM_DIALOG_NO + '</button> \n';
  555. output += ' </div>\n';
  556. output += ' </div><!-- /.modal-content -->\n';
  557. output += ' </div><!-- /.modal-dialog -->\n';
  558. output += ' </div>\n';
  559. // output += ' <!-- end of delete-confirm popup -->\n';
  560. // output += ' <!-- delete account popup -->\n';
  561. output += ' <div id="delete-account-modal" class="modal">\n';
  562. output += ' <div class="modal-dialog modal-sm" style="width:600px">\n';
  563. output += ' <div class="modal-content">\n';
  564. output += ' <form id="delete-account-form" novalidate>\n';
  565. output += ' <fieldset>\n';
  566. output += ' <div class="modal-header">\n';
  567. output += ' <a href="#" data-dismiss="modal" data-target="#delete-account-modal" class="close">x\n';
  568. output += ' </a>\n';
  569. output += ' <h4>' + Blockscad.Msg.DELETE_ACCOUNT + '</h4>\n';
  570. output += ' <h3>' + Blockscad.Msg.DELETE_ACCOUNT_INSTRUCTIONS_ONE + '</b></h3>\n';
  571. output += ' <p>' + Blockscad.Msg.DELETE_ACCOUNT_INSTRUCTIONS_TWO + '</p>\n';
  572. output += ' </div>\n';
  573. output += ' <div class="modal-body">\n';
  574. output += ' <div class="form-group"> \n';
  575. output += ' <label for="password">' + Blockscad.Msg.DELETE_ACCOUNT_CONFIRM_PASSWORD + ' : </label>\n';
  576. output += ' <input type="password" id="del-acct-pw" name="password" autocomplete="off" class="password regform" maxlength="30"/>\n';
  577. output += ' <div class="form-error">\n';
  578. output += ' <span class="password-error"></span>\n';
  579. output += ' </div>\n';
  580. output += ' </div>\n';
  581. output += ' <div class="buttons-right">\n';
  582. output += ' <button class="button primary btn-default btn-lg" type="submit">' + Blockscad.Msg.DELETE_ACCOUNT_BUTTON + '</button> \n';
  583. output += ' </div>\n';
  584. output += ' </div>\n';
  585. output += ' <div class="modal-footer">\n';
  586. output += ' <span class="footer-error" id="da-pw-error"></span>\n';
  587. output += ' </div>\n';
  588. output += ' </fieldset>\n';
  589. output += ' </form>\n';
  590. output += ' </div><!-- /.modal-content -->\n';
  591. output += ' </div><!-- /.modal-dialog -->\n';
  592. output += ' </div>\n';
  593. // output += ' <!-- end of delete account popup -->\n';
  594. // output += ' <!-- delete reactivate popup -->\n';
  595. output += ' <div id="delete-reactivate" class="modal">\n';
  596. output += ' <div class="modal-dialog modal-sm" style="width:500px">\n';
  597. output += ' <div class="modal-content">\n';
  598. output += ' <div class="modal-header">\n';
  599. output += ' <a href="#" data-dismiss="modal" class="close">x\n';
  600. output += ' </a>\n';
  601. output += ' <h4><b>' + Blockscad.Msg.REACTIVATE_ACCOUNT_TITLE + '</b></h4>\n';
  602. output += ' </div>\n';
  603. output += ' <div class="modal-body">\n';
  604. output += ' <p>' + Blockscad.Msg.REACTIVATE_ACCOUNT_EXPLAINED + '</p>\n';
  605. output += ' <p><a href="#" data-toggle="modal" data-target="#change-password-modal" data-dismiss="modal" data-target="#delete-reactivate">' + Blockscad.Msg.CHANGE_PASSWORD + '</a><p>'
  606. output += ' </div>\n';
  607. output += ' <div class="modal-footer">\n';
  608. output += ' <button class="button btn-default btn-lg primary" style="margin-right:10%" type="button" data-dismiss="modal" data-target="#delete-reactivate">' + Blockscad.Msg.REACTIVATE_BUTTON + '</button> \n';
  609. output += ' </div>\n';
  610. output += ' </div><!-- /.modal-content -->\n';
  611. output += ' </div><!-- /.modal-dialog -->\n';
  612. output += ' </div>\n';
  613. // output += ' <!-- end of delete reactivate popup -->\n';
  614. // output += ' <!-- About popup -->\n';
  615. output += ' <div id="about-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="about-modal" aria-hidden="true">\n';
  616. output += ' <div class="modal-dialog">\n';
  617. output += ' <div class="modal-content">\n';
  618. output += ' <div class="modal-header">\n';
  619. output += ' <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>\n';
  620. output += ' <h3 class="modal-title">BlocksCAD\n';
  621. output += ' <small>Easy, Open-Source Solid CAD for Everyone!</small></h3>\n';
  622. output += ' </div>\n';
  623. output += ' <div class="modal-body">\n';
  624. output += ' <div>\n';
  625. output += ' <p>Version ' + Blockscad.version + ' (' + Blockscad.releaseDate + ')</p>\n';
  626. output += ' <br>\n';
  627. output += ' <p>Contact us at: <a href="mailto://blockscad@einsteinsworkshop.com">blockscad@einsteinsworkshop.com</a>\n';
  628. output += ' <p><a href="https://github.com/EinsteinsWorkshop/BlocksCAD">Visit our Git Repository</a></p>\n';
  629. output += ' <p><small><small>Developed with the sponsorship of the Defense Advanced Research Projects Agency (DARPA) and delivered to the U.S. Government with Unlimited Rights as defined in DFARS 252.227-7013.<br>Approved for Public Release, Distribution Unlimited.<br>Created by Katy Hamilton, J. Yoder, and Matthew Minuti. Copyright and Trademark 2014-2015 H3XL, Inc.</small></small>\n';
  630. output += ' </p>\n';
  631. output += ' </div>\n';
  632. output += ' </div>\n';
  633. output += ' <div class="modal-footer">\n';
  634. output += ' <div class="row">\n';
  635. output += ' <div class="col-md-4">\n';
  636. output += ' <a href="http://www.gnu.org/licenses/gpl-3.0-standalone.html" target="_blank">Licensed GPLv3 or later</a></div>\n';
  637. output += ' <div class="col-md-4">\n';
  638. output += ' <a href="TOS.html" target="_blank">Terms of Service</a></div>\n';
  639. output += ' <div class="col-md-4">\n';
  640. output += ' <a href="privacy.html" target="_blank">Privacy Policy</a></div>\n';
  641. output += ' </div>\n';
  642. output += ' </div>\n';
  643. output += ' </div>\n';
  644. output += ' </div>\n';
  645. output += ' </div>\n';
  646. // output += ' <!-- Message popup -->\n';
  647. output += ' <div id="message-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="message-modal" aria-hidden="true">\n';
  648. output += ' <div class="modal-dialog modal-sm">\n';
  649. output += ' <div class="modal-content">\n';
  650. output += ' <div class="modal-header">\n';
  651. output += ' <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>\n';
  652. output += ' </div>\n';
  653. output += ' <div id="message-text" class="modal-body">Display a message here.\n';
  654. output += ' </div>\n';
  655. output += ' </div>\n';
  656. output += ' </div>\n';
  657. output += ' </div>\n';
  658. output += '<div id="outage-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="outage-modal" aria-hidden="true">\n';
  659. output += ' <div class="modal-dialog">\n';
  660. output += ' <div class="modal-content">\n';
  661. output += ' <div class="modal-header">\n';
  662. output += ' <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>\n';
  663. output += ' <h3 class="modal-title">Scheduled Database Maintenance Dec. 27</h3>\n';
  664. output += ' </div>\n';
  665. output += ' <div class="modal-body">\n';
  666. output += ' <div>\n';
  667. output += ' On Dec. 27, 2016, we will be upgrading the BlocksCAD project database. During this time, login will be disabled and you won\'t have access to your account or your saved projects. ';
  668. output += ' <br><br>If you plan to work on specific projects that day, be sure to download them to your computer before Dec. 27. Any edits to these projects or any new creations will need to be saved to your computer that day as well. \n';
  669. output += ' </div>\n';
  670. output += ' </div>\n';
  671. output += ' </div>\n';
  672. output += '</div>\n';
  673. // output += ' <!-- end of popups --> \n';
  674. return output;
  675. }