comparison views/Extractapp/TaggingText.php @ 122:a36bb5a48af4 extractapp tip

1. remove redundancy server side code. 2. All pop up sub-windows are made with dialog component of bootstrap v3.3.2
author Calvin Yeh <cyeh@mpiwg-berlin.mpg.de>
date Thu, 28 Sep 2017 22:26:48 +0200
parents 7f2c5d542616
children
comparison
equal deleted inserted replaced
121:21e89eca0b84 122:a36bb5a48af4
15 * 15 *
16 * You should have received a copy of the GNU General Public License 16 * You should have received a copy of the GNU General Public License
17 * along with Extraction-interface. If not, see <http://www.gnu.org/licenses/>. 17 * along with Extraction-interface. If not, see <http://www.gnu.org/licenses/>.
18 */ 18 */
19 19
20 /*! \file 20 /*! \file
21 * This is the view for TaggingText. 21 * This is the view for TaggingText.
22 * It shows the extraction-interface application itself. 22 * It shows the extraction-interface application itself.
23 * The input data for this view come from models/extractapp.php which is handled by controllers/extractapp.php. 23 * The input data for this view come from models/extractapp.php which is handled by controllers/extractapp.php.
24 * Input data for example, are (1)text string (containing tags if there are any), 24 * Input data for example, are (1)text string (containing tags if there are any),
25 * (2)taglist for the current topic, (3)book and section information, etc. 25 * (2)taglist for the current topic, (3)book and section information, etc.
26 * The output data are passed to backend by controller to corresponding method in model/extractapp.php. 26 * The output data are passed to backend by controller to corresponding method in model/extractapp.php.
27 * Output data is the tagged text string. 27 * Output data is the tagged text string.
28 * 28 *
29 * The user interface contains tagging area on the left side, and toolbox on the right side. 29 * The user interface contains tagging area on the left side, and toolbox on the right side.
30 * There are popup windows to assist the tagging task, for example RegEx-editors, tag-window, remove-tag-window, etc. 30 * There are popup windows to assist the tagging task, for example RegEx-editors, tag-window, remove-tag-window, etc.
31 * 31 *
32 */ 32 */
33 33
34 // --- initialize config file and input text --- 34 // --- initialize config file and input text ---
35 $stringInput = $viewmodel['stringInput']; 35 $stringInput = $viewmodel['stringInput'];
36 $wordlistArray = $viewmodel['wordlistArray']; 36 $wordlistArray = $viewmodel['wordlistArray'];
39 $topiclistArray = $viewmodel['topiclistArray']; 39 $topiclistArray = $viewmodel['topiclistArray'];
40 $default_topic_id = $viewmodel['default_topic_id']; 40 $default_topic_id = $viewmodel['default_topic_id'];
41 $topic_name = $viewmodel['topic_name']; // array of names 41 $topic_name = $viewmodel['topic_name']; // array of names
42 $topic_tag = $viewmodel['topic_tag']; 42 $topic_tag = $viewmodel['topic_tag'];
43 $topic_tag_ch = $viewmodel['topic_tag_ch']; 43 $topic_tag_ch = $viewmodel['topic_tag_ch'];
44 $info = $viewmodel['info']; 44 $info = $viewmodel['info'];
45 $messages = $viewmodel['messages']; 45 $messages = $viewmodel['messages'];
46 46
47 $taglist_infile = $viewmodel['taglist_infile']; 47 $taglist_infile = $viewmodel['taglist_infile'];
48 $book_meta = $viewmodel['book_meta']; 48 $book_meta = $viewmodel['book_meta'];
49 49
55 <meta charset="UTF-8"> 55 <meta charset="UTF-8">
56 <title>Extraction Interface</title> 56 <title>Extraction Interface</title>
57 <meta http-equiv="no-cache"> 57 <meta http-equiv="no-cache">
58 <meta http-equiv="Expires" content="-1"> 58 <meta http-equiv="Expires" content="-1">
59 <meta http-equiv="Cache-Control" content="no-cache"> 59 <meta http-equiv="Cache-Control" content="no-cache">
60 <?php include 'views/maintemplate.php'; ?>
61 <script src="../js/jquery.bootstrap-growl.min.js"></script>
60 62
61 <style> 63 <style>
62 dynasty 64 dynasty
63 { 65 {
64 color:red; 66 color:red;
69 } 71 }
70 name 72 name
71 { 73 {
72 color:orange; 74 color:orange;
73 } 75 }
76
77 body {
78 overflow: hidden;
79 padding: 15px;
80 }
81
82 #editable-area-wraper {
83 height: 90vh;
84 overflow: auto;
85 }
86
74 #editable-area { 87 #editable-area {
75 line-height:160%; 88 line-height:160%;
76 letter-spacing:1.5px; 89 letter-spacing:1.5px;
77 font-size:21px; 90 font-size:21px;
78 } 91 word-wrap: break-word;
92 }
93
79 94
80 <?php 95 <?php
81 // color on the tags 96 // color on the tags
82 foreach ( $taglistArray as $taglistValue ) { 97 foreach ( $taglistArray as $taglistValue ) {
98
83 echo $taglistValue[2]."\n{\ncolor:".$taglistValue[3]."; cursor: hand;\n}\n"; 99 echo $taglistValue[2]."\n{\ncolor:".$taglistValue[3]."; cursor: hand;\n}\n";
84 100
101 echo ".EditingMode ".$taglistValue[2]."\n{\ncursor: initial;\n}\n";
102
85 echo ".span_".$taglistValue[2]."\n{\nbackground-color:".$taglistValue[3]."\n}\n"; 103 echo ".span_".$taglistValue[2]."\n{\nbackground-color:".$taglistValue[3]."\n}\n";
86 } 104 }
87 105
88 ?> 106 ?>
89 </style> 107 </style>
106 } 124 }
107 125
108 126
109 for (var i = 0; i < taglistArray.length; i++) { 127 for (var i = 0; i < taglistArray.length; i++) {
110 var taglistValue = taglistArray[i]; 128 var taglistValue = taglistArray[i];
111 129
112 $(taglistValue[2]).css('color', taglistValue[3]); 130 $(taglistValue[2]).css('color', taglistValue[3]);
113 /*var element = document.querySelectorAll(taglistValue[2]); 131 /*var element = document.querySelectorAll(taglistValue[2]);
114 for (var j = 0; j < element.length; j++) { 132 for (var j = 0; j < element.length; j++) {
115 element[j].style.color = taglistValue[3]; 133 element[j].style.color = taglistValue[3];
116 } 134 }
117 */ 135 */
118 } 136 }
119 } 137 }
120 138
121 139
122 // ---- use cookie to save text and reload page for the up-to-date taglist 140 // ---- use cookie to save text and reload page for the up-to-date taglist
123 function updatePage() { 141 function updatePage() {
124 var text = getCookie(); 142 var text = getCookie();
125 //document.forms['receiver'].elements['message'].value = text; 143 //document.forms['receiver'].elements['message'].value = text;
126 console.log(text);
127 if (text == "reload") { 144 if (text == "reload") {
128 setCookie(""); 145 setCookie("");
129 saveTextToLGService(); 146 saveTextToLGService();
130 147
131 } 148 }
149 var form = document.createElement("form"); 166 var form = document.createElement("form");
150 form.setAttribute("method", "post"); 167 form.setAttribute("method", "post");
151 form.setAttribute("action", "./TaggingText"); // hand to controller 168 form.setAttribute("action", "./TaggingText"); // hand to controller
152 form.setAttribute("target", "_blank"); 169 form.setAttribute("target", "_blank");
153 170
154 var hiddenField = document.createElement("input"); 171 var hiddenField = document.createElement("input");
155 hiddenField.setAttribute("name", "topic"); 172 hiddenField.setAttribute("name", "topic");
156 var topic_id = JSON.parse('<?php echo json_encode($default_topic_id) ?>'); 173 var topic_id = JSON.parse('<?php echo json_encode($default_topic_id) ?>');
157 hiddenField.setAttribute("value", topic_id); 174 hiddenField.setAttribute("value", topic_id);
158 form.appendChild(hiddenField); 175 form.appendChild(hiddenField);
159 176
160 var hiddenField = document.createElement("input"); 177 var hiddenField = document.createElement("input");
161 hiddenField.setAttribute("name", "func"); 178 hiddenField.setAttribute("name", "func");
162 hiddenField.setAttribute("value", "ReloadText"); 179 hiddenField.setAttribute("value", "ReloadText");
163 form.appendChild(hiddenField); 180 form.appendChild(hiddenField);
164 181
165 _postForContineTagging(form); 182 _postForContineTagging(form);
175 $('#reloadTextButton').css("display", "block"); 192 $('#reloadTextButton').css("display", "block");
176 193
177 return; 194 return;
178 } 195 }
179 return; 196 return;
180 197
181 } 198 }
182 199
183 // on click on tagged words, call removeTagNewDiv() for the popup window 200 // on click on tagged words, call removeTagNewDiv() for the popup window
184 // popup-window overlapping issue 201 // popup-window overlapping issue
185 var pop_remove_tag_window = true; 202 var pop_remove_tag_window = true;
186 var taglistArray = JSON.parse('<?php echo json_encode($taglistArray) ?>'); 203 var taglistArray = JSON.parse('<?php echo json_encode($taglistArray) ?>');
187 for (var i = 0; i < taglistArray.length; i++) { 204 for (var i = 0; i < taglistArray.length; i++) {
188 var taglistValue = taglistArray[i]; 205 var taglistValue = taglistArray[i];
189 206
190 207
191 $(document).on("click", taglistValue[2], function (e, taglistValue) { 208 $(document).on("click", taglistValue[2], function (e, taglistValue) {
192 if ($("#editTextId").html() != "Edit text") return 0; 209 //if ($("#editTextId").html() != "Edit text") return 0;
210 if(EditingMode === "editing") return 0;
193 var tag = $(this).prop("tagName").toLowerCase(); 211 var tag = $(this).prop("tagName").toLowerCase();
194 //if (tagName != taglistValue[2]) return 0; 212 //if (tagName != taglistValue[2]) return 0;
195 213
196 // pop_remove_tag_window is a global variable which indicates if to show the remove-popup-window 214 // pop_remove_tag_window is a global variable which indicates if to show the remove-popup-window
197 if (pop_remove_tag_window) { 215 if (pop_remove_tag_window) {
198 removeTagNewDiv( e, tag , $(this)); 216 removeTagNewDiv( e, tag , $(this));
199 217
200 }; 218 };
201 return false; 219 return false;
202 }); 220 });
203 221
204 222
205 223
206 }; 224 };
207 225
208 /*
209 <?php
210 foreach ( $taglistArray as $taglistValue ) {
211 echo '$(document).on("click", "'.$taglistValue[2].'", function (e) {'."\n";
212 echo "\t".'if ( $(this).prop("tagName").toLowerCase() != "'.$taglistValue[2].'" ) return 0;'."\n";
213 echo "\t".'if ( $("#editTextId").html() != "Edit text" ) return 0;'."\n";
214 echo "\tremoveTagNewDiv( e, \"".$taglistValue[2]."\", $(this) );\n";
215 echo "});\n";
216 }
217 ?>
218 */
219
220 $(document).ready(function(){ 226 $(document).ready(function(){
221 227
222 $("#loading").hide(); 228 $("#loading").hide();
223 229
224 // --- for sidebar--- 230 // --- for sidebar---
225 //run once 231 //run once
226 var el=$('#follow-scroll'); 232 var el=$('#follow-scroll');
227 var originalelpos=el.offset().top; // take it where it originally is on the page 233 var originalelpos=el.offset().top; // take it where it originally is on the page
228 234
229 //run on scroll 235 //run on scroll
230 $(window).scroll(function(){ 236 $(window).scroll(function(){
231 var el = $('#follow-scroll'); // important! (local) 237 var el = $('#follow-scroll'); // important! (local)
232 var elpos = el.offset().top; // take current situation 238 var elpos = el.offset().top; // take current situation
233 var windowpos = $(window).scrollTop(); 239 var windowpos = $(window).scrollTop();
240 246
241 //--- for popups --- 247 //--- for popups ---
242 //run once 248 //run once
243 var el=$('#popups'); 249 var el=$('#popups');
244 var originalelpos=el.offset().top; // take it where it originally is on the page 250 var originalelpos=el.offset().top; // take it where it originally is on the page
245 251
246 //run on scroll 252 //run on scroll
247 $(window).scroll(function(){ 253 $(window).scroll(function(){
248 var el = $('#popups'); // important! (local) 254 var el = $('#popups'); // important! (local)
249 var elpos = el.offset().top; // take current situation 255 var elpos = el.offset().top; // take current situation
250 var windowpos = $(window).scrollTop(); 256 var windowpos = $(window).scrollTop();
253 el.stop().animate({'top':finaldestination},0); 259 el.stop().animate({'top':finaldestination},0);
254 }); 260 });
255 // --- 261 // ---
256 262
257 263
258 // === This case only be possible for developing on local machine ==== 264 // === This case only be possible for developing on local machine ====
259 var _GET = JSON.parse('<?php echo json_encode($_GET) ?>'); 265 var _GET = JSON.parse('<?php echo json_encode($_GET) ?>');
260 if (_GET['id']) { 266 if (_GET['id']) {
261 var info = JSON.parse('<?php echo json_encode($info) ?>'); 267 var info = JSON.parse('<?php echo json_encode($info) ?>');
262 var redirectUrl = "http://localhost:1080/localgazetteers-dev/extraction-interface/Extractapp/TaggingText"; 268 var redirectUrl = "http://localhost:1080/localgazetteers-dev/extraction-interface/Extractapp/TaggingText";
263 var section_id = info['section_id']; 269 var section_id = info['section_id'];
265 var form = $('<form action="' + redirectUrl + '" method="post">' + 271 var form = $('<form action="' + redirectUrl + '" method="post">' +
266 '<input type="hidden" name="sectionId" value="'+section_id+'" />' + 272 '<input type="hidden" name="sectionId" value="'+section_id+'" />' +
267 '</form>'); 273 '</form>');
268 $('body').append(form); 274 $('body').append(form);
269 $(form).submit(); 275 $(form).submit();
270 } 276 }
271 // -------- 277 // --------
272 278
273 // --- handle file version conflict --- 279 // --- handle file version conflict ---
274 var info = JSON.parse('<?php echo json_encode($info) ?>'); 280 var info = JSON.parse('<?php echo json_encode($info) ?>');
275 // the first time to this section. without branch_id and file_id 281 // the first time to this section. without branch_id and file_id
281 287
282 // --- handle taglist deprecation --- 288 // --- handle taglist deprecation ---
283 var taglist_infile = JSON.parse('<?php echo json_encode($taglist_infile) ?>'); 289 var taglist_infile = JSON.parse('<?php echo json_encode($taglist_infile) ?>');
284 var taglistArray = JSON.parse('<?php echo json_encode($taglistArray) ?>'); 290 var taglistArray = JSON.parse('<?php echo json_encode($taglistArray) ?>');
285 291
292 /*
286 if (taglist_infile == "") { 293 if (taglist_infile == "") {
287 console.log("Debug: taglist_infile is empty which means taglist_infile is equal to taglist in db."); 294 console.log("Debug: taglist_infile is empty which means taglist_infile is equal to taglist in db.");
288 } else { 295 } else {
289 console.log("Debug: taglist in file, length=" + taglist_infile.length); 296 console.log("Debug: taglist in file, length=" + taglist_infile.length);
290 console.log(taglist_infile); 297 console.log(taglist_infile);
292 console.log(taglistArray); 299 console.log(taglistArray);
293 300
294 // TOOD: ask user to modify/decide tags (?) 301 // TOOD: ask user to modify/decide tags (?)
295 // showing taglist_infile and taglistArray 302 // showing taglist_infile and taglistArray
296 } 303 }
297 304 */
305 //prevent user paste rich text which means html tag with attributes
306 $('[contenteditable]').on('paste', function(e) {
307 e.preventDefault();
308 var text = '';
309 if (e.clipboardData || e.originalEvent.clipboardData) {
310 text = (e.originalEvent || e).clipboardData.getData('text/plain');
311 } else if (window.clipboardData) {
312 text = window.clipboardData.getData('Text');
313 }
314 if (document.queryCommandSupported('insertText')) {
315 document.execCommand('insertText', false, text);
316 } else {
317 document.execCommand('paste', false, text);
318 }
319 });
298 }); 320 });
299 321
300 $(document).on("mouseup", '#editable-area', function (e) { 322 $(document).on("mouseup", '#editable-area', function (e) {
323
301 $('.questionMarkClass').remove(); 324 $('.questionMarkClass').remove();
302 $('.tagItemDivClass').remove(); 325 $('.tagItemDivClass').remove();
303 326
304 if ( $("#editTextId").html() != "Edit text" ) return 0; 327 //if ( $("#editTextId").html() != "Edit text" ) return 0;
305 328 if(EditingMode === "editing") return 0;
329
306 //var selection = getSelected(); 330 //var selection = getSelected();
307 selection = getSelected(); // selection is a global variable 331 selection = getSelected(); // selection is a global variable
308 332
309 range = selection.getRangeAt(0); // range is a global variable 333 range = selection.getRangeAt(0); // range is a global variable
310 334
311 container = document.createElement("div"); 335 container = document.createElement("div");
312 container.appendChild(selection.getRangeAt(0).cloneContents()); 336 container.appendChild(selection.getRangeAt(0).cloneContents());
313 337
338 let userTags = {};
339
340 <?php
341 foreach ( $taglistArray as $taglistValue ) {
342 echo "userTags['".$taglistValue[1]."']='".$taglistValue[2]."';\n";
343 }
344 ?>
314 345
315 if(selection && (selection_plain = new String(selection).replace(/^\s+|\s+$/g,''))) { 346 if(selection && (selection_plain = new String(selection).replace(/^\s+|\s+$/g,''))) {
316 try{ 347 //try{
317 var newdiv = document.createElement("div"); 348 var newdiv = document.createElement("div");
318 //newdiv.id = "tagItemDivId"; 349 //newdiv.id = "tagItemDivId";
319 //newdiv.setAttribute("class", "tagItemDivClass"); 350 //newdiv.setAttribute("class", "tagItemDivClass");
320 $(newdiv).id = "tagItemDivId"; 351 $(newdiv).id = "tagItemDivId";
321 $(newdiv).addClass("tagItemDivClass"); 352 $(newdiv).addClass("tagItemDivClass");
322 newdiv.style.cssText = 'top:'+e.pageY+'; left:'+e.pageX+';'; 353
323 //console.log(selection.getRangeAt(0).cloneContents());
324 if ( container.innerHTML.indexOf( "br" ) != -1 ) { 354 if ( container.innerHTML.indexOf( "br" ) != -1 ) {
325 // when selected words containing tags (i.e. has 'br' in the selected string), 355
356 // when selected words containing tags (i.e. has 'br' in the selected string),
326 // which means user want to apply Title / or tags all in once at each line 357 // which means user want to apply Title / or tags all in once at each line
327 // This may not be the best checking solution, since 'br' also appears between not-tagged words 358 // This may not be the best checking solution, since 'br' also appears between not-tagged words
328 359
329 var newselect = document.createElement("select"); 360 var newselect = document.createElement("select");
330 newselect.id = "TitletagType"; 361 newselect.id = "TitletagType";
331 //console.log(JSON.parse('<?php echo json_encode($taglistArray) ?>')); 362 let strTagOpts = '';
332 363
333 <?php 364 for(let key in userTags){
334 foreach ( $taglistArray as $taglistValue ) { 365
335 echo "newselect.innerHTML += \"<option value='".$taglistValue[2]."'>".$taglistValue[1]."</option>\";\n"; 366 strTagOpts += (`<option value='${userTags[key]}'>${key}</option>`);
336 } 367 }
337 ?> 368
369 newselect.innerHTML = strTagOpts;
370
338 newdiv.appendChild(newselect); 371 newdiv.appendChild(newselect);
339 372
340 //matchValue = .match(); 373 //matchValue = .match();
341 myRegexp = new RegExp("〈(.*?)〉", "g") 374 myRegexp = new RegExp("〈(.*?)〉", "g")
342 matchValue = myRegexp.exec(String(selection)); 375 matchValue = myRegexp.exec(String(selection));
343 376
344 if ( matchValue != null ) { 377 newdiv.innerHTML += `<input id='TitletagName' value='${(matchValue) ? matchValue[1] : ''}'>`;
345 newdiv.innerHTML += "<input id=\"TitletagName\" value=\""+ matchValue[1] +"\"></br>"; 378 newdiv.innerHTML += "<div style='text-align:right;margin:3px 0px 8px;'><button class='btn btn-sm btn-primary' onclick=\"addTagTitle(range, container)\">Add Title Tag To Each Line</button><div>";
346 } else { 379
347 newdiv.innerHTML += "<input id=\"TitletagName\" value=\"\"></br>";
348 }
349 newdiv.innerHTML += "<button onclick=\"addTagTitle( range, container )\">Add Title Tag To Each Line</button></br>";
350
351 /* 380 /*
352 newdiv.innerHTML += "<button onclick=\"exportTable( range, container )\">Export As A Table</button></br></br>"; 381 newdiv.innerHTML += "<button onclick=\"exportTable( range, container )\">Export As A Table</button></br></br>";
353 */ 382 */
354 383
355 var newselect = document.createElement("select"); 384 var newselect = document.createElement("select");
356 newselect.id = "RemoveTitletagType"; 385 newselect.id = "RemoveTitletagType";
357 <?php 386 newselect.innerHTML = strTagOpts;
358 foreach ( $taglistArray as $taglistValue ) {
359 echo "newselect.innerHTML += \"<option value='".$taglistValue[2]."'>".$taglistValue[1]."</option>\";\n";
360 }
361 ?>
362 newdiv.appendChild(newselect); 387 newdiv.appendChild(newselect);
363 388
364 newdiv.innerHTML += "<input id=\"RemoveTitletagName\" value=\"\"></br>"; 389 newdiv.innerHTML += "<input id=\"RemoveTitletagName\" value=\"\"><br>";
365 newdiv.innerHTML += "<button onclick=\"removeTagTitle( range, container )\">Remove</button></br>"; 390 newdiv.innerHTML += "<div style='text-align:right;margin:3px 0px;'><button class='btn btn-sm btn-default' onclick=\"removeTagTitle( range, container )\">Remove</button></br>";
391
392 let pageY = e.pageY,
393 topPosi = pageY - ( (window.innerHeight - pageY < 145 ) ? 145 : 0);
394 newdiv.style.cssText = 'top:'+ topPosi +'; left:'+e.pageX+';';
395
366 } else { 396 } else {
397
367 // for pop up window on edit-area for tag list 398 // for pop up window on edit-area for tag list
368 // newdiv.innerHTML = "Tagging word: "+String(selection)+"<br>"; 399 // newdiv.innerHTML = "Tagging word: "+String(selection)+"<br>";
369 var tagging_words = document.createElement("div"); 400 var tagging_words = document.createElement("div");
370 $(tagging_words).addClass("bg-info"); 401 $(tagging_words).addClass("bg-info");
371 $(tagging_words).text("Tagging words: " + String(selection_plain)); 402 $(tagging_words).text("Tagging words: " + String(selection_plain));
374 405
375 var tagging_tags = document.createElement("div"); 406 var tagging_tags = document.createElement("div");
376 $(tagging_tags).addClass("bg-white"); 407 $(tagging_tags).addClass("bg-white");
377 $(tagging_tags).text("Tag as: "); 408 $(tagging_tags).text("Tag as: ");
378 409
379 tagging_tags.innerHTML += "<button accesskey=\"2\" onclick=\"tagwithtitle( range, '"+String(selection_plain)+"' )\">Title</button></br>"; 410 tagging_tags.innerHTML += "<button class='btn btn-sm btn-primary' accesskey=\"2\" onclick=\"tagwithtitle( range, '"+String(selection_plain)+"' )\">Title</button>";
380 411
381 412 var tagBtns_area = document.createElement("div");
382 console.log(selection); 413 $(tagBtns_area).addClass("tagBtns-area");
383 414
384 console.log(JSON.parse('<?php echo json_encode($taglistArray) ?>')); 415 let tagVal,
385 416 tagging_btns = {R1:[], R2:[], R3:[], R4:[]},
386 console.log(JSON.parse('<?php echo json_encode($topic_tag) ?>')); 417 aryMainTaggingBtns = [],
387 418 aryTaggingBtns = [],
388 419 <?php echo "defaultTopicTag='".$topic_tag."';\n" ?>;
389 <?php 420
390 421 for(let key in userTags){
391 foreach ( $taglistArray as $taglistValue ) { 422
392 if ($taglistValue[2] == $topic_tag) { 423 tagVal = userTags[key];
393 echo "tagging_tags.innerHTML += \"<button accesskey=\\\"1\\\" onclick=\\\"tagwithOnlytag( range, selection, '".$taglistValue[2]."2' )\\\">".$taglistValue[1]."</button>\";\n"; 424
394 echo "tagging_tags.innerHTML += \"<button accesskey=\\\"1\\\" onclick=\\\"tagwithOnlytag( range, selection, '".$taglistValue[2]."' )\\\">".$taglistValue[1]."(without new line)</button>\";\n"; 425 if (tagVal == defaultTopicTag) {
395 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagStringWithTag( '\"+String(selection_plain)+\"', '".$taglistValue[2]."' )\\\">".$taglistValue[1]."(ALL)</button></br>\";\n"; 426 aryMainTaggingBtns.push(`<button class='btn btn-primary' accesskey="1" onclick="tagwithOnlytag(range, selection, '${tagVal}2')">${key}</button>`);
396 break; 427 aryMainTaggingBtns.push(`<button class='btn btn-default' onclick="tagStringWithTag('${String(selection_plain)}', '${tagVal}')">${key}(ALL)</button>`);
397 } 428 aryMainTaggingBtns.push(`<button class='btn btn-default' accesskey="1" onclick="tagwithOnlytag(range, selection, '${tagVal}')">${key}(without new line)</button>`);
429 }
430 else{
431 aryTaggingBtns.push(`<button class='btn btn-primary' onclick="tagwithOnlytag(range, selection, '${tagVal}')">${key}</button>`);
432 aryTaggingBtns.push(`<button class='btn btn-default' onclick="tagStringWithTag('${String(selection)}', '${tagVal}')">${key}(ALL)</button>`);
433 }
398 } 434 }
399 foreach ( $taglistArray as $taglistValue ) { 435
400 if ($taglistValue[2] == $topic_tag) { 436 var remainder, btnRow;
401 // pass 437 for(let idx = 0, len = aryTaggingBtns.length - 1; idx < len; idx = idx + 2){
402 } else if ($taglistValue[2] == "post_time") { 438
403 // this case could be deprecated 439 remainder = (idx / 2 % 4) + 1;
404 echo "tagging_tags.innerHTML += \"<button accesskey=\\\"3\\\" onclick=\\\"tagwithOnlytag( range, selection, '".$taglistValue[2]."' )\\\">Tag as:".$taglistValue[1]."</button>\";\n"; 440
405 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagStringWithTag( '\"+String(selection)+\"', '".$taglistValue[2]."' )\\\">Tag as:".$taglistValue[1]."(ALL)</button></br>\";\n"; 441 btnRow = tagging_btns["R" + remainder];
406 } else if ($taglistValue[2] == "office") { 442 btnRow.push(aryTaggingBtns[idx]);
407 // this case could be deprecated 443 btnRow.push(aryTaggingBtns[idx+1]);
408 echo "tagging_tags.innerHTML += \"<button accesskey=\\\"4\\\" onclick=\\\"tagwithOnlytag( range, selection, '".$taglistValue[2]."' )\\\">".$taglistValue[1]."</button>\";\n"; 444 }
409 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagStringWithTag( '\"+String(selection)+\"', '".$taglistValue[2]."' )\\\">".$taglistValue[1]."(ALL)</button></br>\";\n"; 445
410 } else { 446 var str_tagging_btns = "";
411 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagwithOnlytag(range, selection, '".$taglistValue[2]."')\\\">".$taglistValue[1]."</button>\";\n"; 447
412 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagStringWithTag( '\"+String(selection)+\"', '".$taglistValue[2]."' )\\\">".$taglistValue[1]."(ALL)</button></br>\";\n"; 448 if(aryMainTaggingBtns.length > 0){
413 449 str_tagging_btns = "<tr><td>"
414 /* testing... backup the original one 450 + aryMainTaggingBtns[0] + "</td><td>"
415 451 + aryMainTaggingBtns[1] + "</td><td colspan='2'>"
416 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagwithOnlytag( range, '\"+String(selection)+\"', '".$taglistValue[2]."' )\\\">".$taglistValue[1]."</button>\";\n"; 452 + aryMainTaggingBtns[2] + "</td></tr>";
417 echo "tagging_tags.innerHTML += \"<button onclick=\\\"tagStringWithTag( '\"+String(selection)+\"', '".$taglistValue[2]."' )\\\">".$taglistValue[1]."(ALL)</button></br>\";\n"; 453 }
418 */ 454
419 455 for(let idx = 1, len = 4; idx <= len; idx++){
420 } 456
421 } 457 btnRow = tagging_btns["R" + idx];
422 ?> 458
423 459 if(btnRow.length > 0){
424 newdiv.appendChild(tagging_tags); 460
425 461 str_tagging_btns += ("<tr><td>" + btnRow.join("</td><td>") + "</td></tr>");
426 462 }
427 // add selected words to generator regex 463 }
428 // remove this feature... 464
429 // genRegexBySelection(newdiv, selection); // append button to newdiv and handle the selection words 465 str_tagging_btns = "<table>" + str_tagging_btns + "</table>";
466
467 tagBtns_area.innerHTML = str_tagging_btns;
468
469 newdiv.appendChild(tagging_tags);
470 newdiv.appendChild(tagBtns_area);
471
472 let tagCnt = aryTaggingBtns.length / 2,
473 heightLimit = 109 + ( (tagCnt >= 4) ? 4 : ( tagCnt % 4 ) ) * 32,
474 pageY = e.pageY,
475 topPosi = pageY - ( (window.innerHeight - pageY < heightLimit ) ? heightLimit : 0);
476
477 newdiv.style.cssText = 'top:'+ topPosi +'; left:'+e.pageX+';max-height:280px;';
430 478
431 } 479 }
432 480
433 //$('#tagItemDivId').addClass(); // tagItemDivId is newdiv's id 481 //$('#tagItemDivId').addClass(); // tagItemDivId is newdiv's id
434 $('body').append(newdiv); 482 $('body').append(newdiv);
435 $('#TitletagType').val(lastAddTag); 483 $('#TitletagType').val(lastAddTag);
436 484
437 // selected some words, so hide popping up remove-tag-window 485 // selected some words, so hide popping up remove-tag-window
438 pop_remove_tag_window = false; // questionMarkID 486 pop_remove_tag_window = false; // questionMarkID
439 } 487 // }
440 catch(err){ 488 // catch(err){
441 pop_remove_tag_window = true; // questionMarkID 489 // pop_remove_tag_window = true; // questionMarkID
442 490 //
443 } 491 // }
444 } else { 492 } else {
445 // without selecting any word, so pop up remove-tag-window 493 // without selecting any word, so pop up remove-tag-window
446 pop_remove_tag_window = true; 494 pop_remove_tag_window = true;
447 } 495 }
448 496
454 //MsgBox("enter function"); 502 //MsgBox("enter function");
455 var form = document.createElement("form"); 503 var form = document.createElement("form");
456 form.setAttribute("method", "post"); 504 form.setAttribute("method", "post");
457 form.setAttribute("action", "./ExportTable"); 505 form.setAttribute("action", "./ExportTable");
458 form.setAttribute("target", "_blank"); 506 form.setAttribute("target", "_blank");
459 507
460 var hiddenField = document.createElement("input"); 508 var hiddenField = document.createElement("input");
461 hiddenField.setAttribute("name", "func"); 509 hiddenField.setAttribute("name", "func");
462 hiddenField.setAttribute("value", "exportFromExtractionInterface"); 510 hiddenField.setAttribute("value", "exportFromExtractionInterface");
463 form.appendChild(hiddenField); 511 form.appendChild(hiddenField);
464 512
465 var hiddenField = document.createElement("input"); 513 var hiddenField = document.createElement("input");
466 hiddenField.setAttribute("name", "content"); 514 hiddenField.setAttribute("name", "content");
467 hiddenField.setAttribute("value", container.innerHTML); 515 hiddenField.setAttribute("value", container.innerHTML);
468 form.appendChild(hiddenField); 516 form.appendChild(hiddenField);
469 517
470 var hiddenField = document.createElement("input"); 518 var hiddenField = document.createElement("input");
471 hiddenField.setAttribute("name", "sectionid"); 519 hiddenField.setAttribute("name", "sectionid");
472 hiddenField.setAttribute("value", "<?php echo $section_id; ?>"); 520 hiddenField.setAttribute("value", "<?php echo $section_id; ?>");
473 form.appendChild(hiddenField); 521 form.appendChild(hiddenField);
474 522
475 var hiddenField2 = document.createElement("input"); 523 var hiddenField2 = document.createElement("input");
476 hiddenField2.setAttribute("name", "topic"); 524 hiddenField2.setAttribute("name", "topic");
477 hiddenField2.setAttribute("value", topic_id); 525 hiddenField2.setAttribute("value", topic_id);
478 form.appendChild(hiddenField2); 526 form.appendChild(hiddenField2);
479 527
480 var info = JSON.parse( '<?php echo json_encode($info) ?>'); 528 var info = JSON.parse( '<?php echo json_encode($info) ?>');
481 var book_meta = JSON.parse( '<?php echo json_encode($book_meta) ?>'); 529 var book_meta = JSON.parse( '<?php echo json_encode($book_meta) ?>');
482 530
483 if (info) { 531 if (info) {
484 var hiddenField = document.createElement("input"); 532 var hiddenField = document.createElement("input");
485 hiddenField.setAttribute("name", "bookId"); 533 hiddenField.setAttribute("name", "bookId");
486 hiddenField.setAttribute("value", info['book_id']); 534 hiddenField.setAttribute("value", info['book_id']);
487 form.appendChild(hiddenField); 535 form.appendChild(hiddenField);
488 536
489 var hiddenField = document.createElement("input"); 537 var hiddenField = document.createElement("input");
490 hiddenField.setAttribute("name", "bookName"); 538 hiddenField.setAttribute("name", "bookName");
491 hiddenField.setAttribute("value", info['book_name']); 539 hiddenField.setAttribute("value", info['book_name']);
492 form.appendChild(hiddenField); 540 form.appendChild(hiddenField);
493 541
494 var hiddenField = document.createElement("input"); 542 var hiddenField = document.createElement("input");
495 hiddenField.setAttribute("name", "sectionName"); 543 hiddenField.setAttribute("name", "sectionName");
496 hiddenField.setAttribute("value", info['section_name']); 544 hiddenField.setAttribute("value", info['section_name']);
497 form.appendChild(hiddenField); 545 form.appendChild(hiddenField);
498 546
499 }; 547 };
504 document.body.removeChild(form); 552 document.body.removeChild(form);
505 } else { 553 } else {
506 document.body.appendChild(form); 554 document.body.appendChild(form);
507 form.submit(); 555 form.submit();
508 document.body.removeChild(form); 556 document.body.removeChild(form);
509 //form.submit(); // works under IE and Chrome, but not FF 557 //form.submit(); // works under IE and Chrome, but not FF
510 } 558 }
559 }
560
561 var exportMode = "all";
562
563 function onExportModeChanged(ele){
564 exportMode = ele.value
565 }
566
567 function startExport(topic_id){
568
569 switch(exportMode){
570 case "all" :
571 exportAll(topic_id);
572 break;
573 case "pages" :
574 exportPage(topic_id);
575 break;
576 }
511 } 577 }
512 578
513 function exportPage(topic_id) { 579 function exportPage(topic_id) {
514 var startPage = $('#exportPageStart').val(); 580 var startPage = $('#exportPageStart').val();
515 var endPage = $('#exportPageEnd').val(); 581 var endPage = $('#exportPageEnd').val();
516 582
517 var el = document.getElementById("editable-area"); 583 var el = document.getElementById("editable-area");
518 var str="" + el.innerHTML; 584 var str="" + el.innerHTML;
519 585
520 var regexText="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】"; 586 var regexText="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】";
521 587
522 var form = document.createElement("form"); 588 var form = document.createElement("form");
523 form.setAttribute("method", "post"); 589 form.setAttribute("method", "post");
524 form.setAttribute("action", "./ExportTable"); 590 form.setAttribute("action", "./ExportTable");
525 form.setAttribute("target", "_blank"); 591 form.setAttribute("target", "_blank");
526 592
527 var hiddenField = document.createElement("input"); 593 var hiddenField = document.createElement("input");
528 hiddenField.setAttribute("name", "func"); 594 hiddenField.setAttribute("name", "func");
529 hiddenField.setAttribute("value", "exportFromExtractionInterface"); 595 hiddenField.setAttribute("value", "exportFromExtractionInterface");
530 form.appendChild(hiddenField); 596 form.appendChild(hiddenField);
531 597
532 var hiddenField = document.createElement("input"); 598 var hiddenField = document.createElement("input");
533 hiddenField.setAttribute("name", "content"); 599 hiddenField.setAttribute("name", "content");
534 hiddenField.setAttribute("value", str.match(new RegExp(regexText, "g"))); 600 hiddenField.setAttribute("value", str.match(new RegExp(regexText, "g")));
535 form.appendChild(hiddenField); 601 form.appendChild(hiddenField);
536 602
537 var hiddenField = document.createElement("input"); 603 var hiddenField = document.createElement("input");
538 hiddenField.setAttribute("name", "topic"); 604 hiddenField.setAttribute("name", "topic");
539 hiddenField.setAttribute("value", topic_id); 605 hiddenField.setAttribute("value", topic_id);
540 form.appendChild(hiddenField); 606 form.appendChild(hiddenField);
541 607
542 _postForContineTagging(form); 608 _postForContineTagging(form);
543 609
544 610
545 /* 611 /*
546 var section_id = JSON.parse('<?php echo json_encode($section_id) ?>'); 612 var section_id = JSON.parse('<?php echo json_encode($section_id) ?>');
547 console.log("section_id: "+section_id+", topic_id: "+topic_id); 613
548 614 var hiddenField = document.createElement("input");
549 var hiddenField = document.createElement("input");
550 hiddenField.setAttribute("name", "sectionId"); 615 hiddenField.setAttribute("name", "sectionId");
551 hiddenField.setAttribute("value", section_id); 616 hiddenField.setAttribute("value", section_id);
552 form.appendChild(hiddenField); 617 form.appendChild(hiddenField);
553 618
554 var info = JSON.parse( '<?php echo json_encode($info) ?>'); 619 var info = JSON.parse( '<?php echo json_encode($info) ?>');
555 620
556 if (info) { 621 if (info) {
557 var hiddenField = document.createElement("input"); 622 var hiddenField = document.createElement("input");
558 hiddenField.setAttribute("name", "bookId"); 623 hiddenField.setAttribute("name", "bookId");
559 hiddenField.setAttribute("value", info['book_id']); 624 hiddenField.setAttribute("value", info['book_id']);
560 form.appendChild(hiddenField); 625 form.appendChild(hiddenField);
561 626
562 var hiddenField = document.createElement("input"); 627 var hiddenField = document.createElement("input");
563 hiddenField.setAttribute("name", "bookName"); 628 hiddenField.setAttribute("name", "bookName");
564 hiddenField.setAttribute("value", info['book_name']); 629 hiddenField.setAttribute("value", info['book_name']);
565 form.appendChild(hiddenField); 630 form.appendChild(hiddenField);
566 631
567 var hiddenField = document.createElement("input"); 632 var hiddenField = document.createElement("input");
568 hiddenField.setAttribute("name", "sectionName"); 633 hiddenField.setAttribute("name", "sectionName");
569 hiddenField.setAttribute("value", info['section_name']); 634 hiddenField.setAttribute("value", info['section_name']);
570 form.appendChild(hiddenField); 635 form.appendChild(hiddenField);
571 636
572 }; 637 };
574 639
575 if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1) { 640 if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1) {
576 document.body.appendChild(form); 641 document.body.appendChild(form);
577 form.submit(); 642 form.submit();
578 } else { 643 } else {
579 form.submit(); // works under IE and Chrome, but not FF 644 form.submit(); // works under IE and Chrome, but not FF
580 } 645 }
581 */ 646 */
582 } 647 }
583 648
584 function exportAll(topic_id) { 649 function exportAll(topic_id) {
586 var str= "" + el.innerHTML; 651 var str= "" + el.innerHTML;
587 var form = document.createElement("form"); 652 var form = document.createElement("form");
588 form.setAttribute("method", "post"); 653 form.setAttribute("method", "post");
589 form.setAttribute("action", "./ExportTable");//+section_id); // hand to controller 654 form.setAttribute("action", "./ExportTable");//+section_id); // hand to controller
590 form.setAttribute("target", "_blank"); 655 form.setAttribute("target", "_blank");
591 656
592 var hiddenField = document.createElement("input"); 657 var hiddenField = document.createElement("input");
593 hiddenField.setAttribute("name", "func"); 658 hiddenField.setAttribute("name", "func");
594 hiddenField.setAttribute("value", "exportFromExtractionInterface"); 659 hiddenField.setAttribute("value", "exportFromExtractionInterface");
595 form.appendChild(hiddenField); 660 form.appendChild(hiddenField);
596 661
597 662
598 663
599 var hiddenField = document.createElement("input"); 664 var hiddenField = document.createElement("input");
600 hiddenField.setAttribute("name", "content"); 665 hiddenField.setAttribute("name", "content");
601 hiddenField.setAttribute("value", str); 666 hiddenField.setAttribute("value", str);
602 form.appendChild(hiddenField); 667 form.appendChild(hiddenField);
603 668
604 var hiddenField = document.createElement("input"); 669 var hiddenField = document.createElement("input");
605 hiddenField.setAttribute("name", "topic"); 670 hiddenField.setAttribute("name", "topic");
606 hiddenField.setAttribute("value", topic_id); 671 hiddenField.setAttribute("value", topic_id);
607 form.appendChild(hiddenField); 672 form.appendChild(hiddenField);
608 673
609 _postForContineTagging(form); 674 _postForContineTagging(form);
610 675
611 } 676 }
612 677
613
614 function tagTestX(range, selection, tag) { 678 function tagTestX(range, selection, tag) {
615 console.log("selection string: ");
616 console.log(String(selection));
617 679
618 var stringSelection = String(selection); 680 var stringSelection = String(selection);
619 681
620 saveUndoText(); 682 saveUndoText();
621 var topic_tag = JSON.parse('<?php echo json_encode($topic_tag) ?>'); 683 var topic_tag = JSON.parse('<?php echo json_encode($topic_tag) ?>');
625 // stringSelection here only contains plain text (string) without the tagging structure 687 // stringSelection here only contains plain text (string) without the tagging structure
626 // how to use the existing tagging structure 688 // how to use the existing tagging structure
627 689
628 // --- 690 // ---
629 var documentFragment = range.extractContents(); 691 var documentFragment = range.extractContents();
630 692
631 693
632 var tmpStringSelection = "" 694 var tmpStringSelection = ""
633 var childNodes = documentFragment.childNodes 695 var childNodes = documentFragment.childNodes
634 for (var i = 0; i < childNodes.length; i++){ 696 for (var i = 0; i < childNodes.length; i++){
635 697
636 if (childNodes[i].outerHTML == undefined) { 698 if (childNodes[i].outerHTML == undefined) {
637 699
638 tmpStringSelection += childNodes[i].textContent 700 tmpStringSelection += childNodes[i].textContent
639 } else { 701 } else {
640 702
641 tmpStringSelection += childNodes[i].outerHTML 703 tmpStringSelection += childNodes[i].outerHTML
642 } 704 }
643 705
644 } 706 }
645 707
646 stringSelection = tmpStringSelection 708 stringSelection = tmpStringSelection;
647 709
648 range.deleteContents(); 710 range.deleteContents();
649 711
650 if ( tag==topic_tag2) { 712 if ( tag==topic_tag2) {
651 var newdiv = document.createElement(topic_tag); 713 var newdiv = document.createElement(topic_tag);
661 } 723 }
662 724
663 725
664 $('.tagItemDivClass').remove(); 726 $('.tagItemDivClass').remove();
665 727
666 728 return;
667 return 729
668 730 // TODO if no fragment... bug
669 731
670 // ---
671
672 console.log("the anchorNode: ");
673 console.log(selection.anchorNode);
674
675 console.log("the anchorNode's nextSibling");
676 console.log(next);
677
678
679 // TODO if no fragment... bug
680
681 if ( typeof selection !== 'string' ) { 732 if ( typeof selection !== 'string' ) {
682 var next = selection.anchorNode.nextSibling; 733 var next = selection.anchorNode.nextSibling;
683 734
684
685
686 // TODO fragment at the beginning of selection: anchorNode 735 // TODO fragment at the beginning of selection: anchorNode
687 var tmpStringSelection = "" 736 var tmpStringSelection = ""
688 737
689 var startInx = selection.anchorOffset 738 var startInx = selection.anchorOffset;
690 var endSelectionInx = startInx + stringSelection.length 739 var endSelectionInx = startInx + stringSelection.length;
691 var endInx = selection.anchorNode.length 740 var endInx = selection.anchorNode.length;
692 console.log("startInx=" + startInx + " endInx= " + endInx + "; endSelectionInx= " + endSelectionInx) 741
693 742 var anchorText = selection.anchorNode.textContent;
694 var anchorText = selection.anchorNode.textContent
695
696 743
697 /* 744 /*
698 console.log("anchorNode...") 745 if (selection.anchorNode.nodeType == 3 && next.nodeName != "BR" && next.nodeName != "br") {
699 if (selection.anchorNode.nodeType == 3 && next.nodeName != "BR" && next.nodeName != "br") { 746 // if (next != null && selection.anchorNode.nodeType == 3 && next.nodeName != "BR" && next.nodeName != "br") {
700 // if (next != null && selection.anchorNode.nodeType == 3 && next.nodeName != "BR" && next.nodeName != "br") {
701 // here the anchor node is text 747 // here the anchor node is text
702 748
703 //tmpStringSelection += anchorText.substring(selection.anchorOffset, selection.anchorNode.length); 749 //tmpStringSelection += anchorText.substring(selection.anchorOffset, selection.anchorNode.length);
704 tmpStringSelection += anchorText.substring(startInx, endSelectionInx); 750 tmpStringSelection += anchorText.substring(startInx, endSelectionInx);
705 751
706 console.log("append anchorText to tmpStringSelection: " + tmpStringSelection)
707
708 endInx += endSelectionInx - startInx; 752 endInx += endSelectionInx - startInx;
709 753
710 //endInx += (selection.anchorNode.length - selection.anchorOffset); 754 //endInx += (selection.anchorNode.length - selection.anchorOffset);
711 755
712 756
713 } 757 }
714 */ 758 */
715 759
716 // TODO when anchorNode is not text, but a node 760 // TODO when anchorNode is not text, but a node
717 761
718 762
719 /* 763 /*
720 if (next != null) { 764 if (next != null) {
721 765
722 if (selection.anchorNode.nodeType == 3 && next.nodeName != "BR" && next.nodeName != "br") { 766 if (selection.anchorNode.nodeType == 3 && next.nodeName != "BR" && next.nodeName != "br") {
723 var anchorText = selection.anchorNode.textContent 767 var anchorText = selection.anchorNode.textContent
724 // never goes here? 768 // never goes here?
725 tmpStringSelection += anchorText.substring(selection.anchorOffset, selection.anchorNode.length); 769 tmpStringSelection += anchorText.substring(selection.anchorOffset, selection.anchorNode.length);
726 770
727 console.log("append anchorText to tmpStringSelection: " + tmpStringSelection) 771
728 772 }
729
730 }
731 } 773 }
732 */ 774 */
733 775
734 // TODO parsing stringSelection object in string, with the tagging strucutre 776 // TODO parsing stringSelection object in string, with the tagging strucutre
735 777
736 var checkExtentNode = true 778 var checkExtentNode = true
737 779
738 while(next != null && next != undefined && next.nodeName != "BR" && next.nodeName != "br" ) { 780 while(next != null && next != undefined && next.nodeName != "BR" && next.nodeName != "br" ) {
739
740 /*
741 if (endInx >= endSelectionInx) {
742 console.log("startInx=" + startInx + " endInx= " + endInx + "; endSelectionInx= " + endSelectionInx)
743
744 console.log("debug: end of traverse. next=")
745 console.log(next)
746
747 break;
748 }
749 */
750 781
751 startInx = endInx 782 startInx = endInx
752 783
753 if (next.nodeType == 3) { // text case 784 if (next.nodeType == 3) { // text case
754 console.log("text case.") 785
755 786
756 endInx += next.textContent.length 787 endInx += next.textContent.length
757 788
758 if (endInx > endSelectionInx) { 789 if (endInx > endSelectionInx) {
759 790
760 /* 791 /*
761 tmpStringSelection += next.textContent.substring(0, endSelectionInx-startInx) 792 tmpStringSelection += next.textContent.substring(0, endSelectionInx-startInx)
762 793
763 console.log("startInx=" + startInx + " endInx= " + endInx + "; endSelectionInx= " + endSelectionInx)
764 console.log("appened next.textContent.substring tmpStringSelection (text case): " + tmpStringSelection)
765 */ 794 */
766 795
767 //checkExtentNode = false 796 //checkExtentNode = false
768 797
769 //break; 798 //break;
770 } else { 799 } else {
771 800
772
773 tmpStringSelection += next.textContent; 801 tmpStringSelection += next.textContent;
774 console.log("appened tmpStringSelection (text case): " + tmpStringSelection) 802
775
776
777 } 803 }
778 804
779 805
780 806
781 } else if (next.nodeType == 1) { // node case 807 } else if (next.nodeType == 1) { // node case
782 console.log("node case") 808
783 809 endInx += next.innerHTML.length
784 endInx += next.innerHTML.length
785 810
786 if (endInx > endSelectionInx) { 811 if (endInx > endSelectionInx) {
787 812
788 // TODO do something about tmpStringSelection here? 813 // TODO do something about tmpStringSelection here?
789
790 console.log("startInx=" + startInx + " endInx= " + endInx + "; endSelectionInx= " + endSelectionInx)
791
792 814
793 //checkExtentNode = false 815 //checkExtentNode = false
794 816
795 //break; 817 //break;
796 } else { 818 } else {
797 819
798 820
799 tmpStringSelection += next.outerHTML; 821 tmpStringSelection += next.outerHTML;
800 console.log("appened tmpStringSelection (node case): " + tmpStringSelection) 822
801 // endInx += next.outerHTML.length 823 // endInx += next.outerHTML.length
802 } 824 }
803 825
804 826
805 } else { 827 } else {
806 console.log("[debug] case: nodeType=" + next.nodeType) 828 //console.log("[debug] case: nodeType=" + next.nodeType)
807 } 829 }
808 830
809 831
810 /* 832 /*
811 833
812 } else if (next.innerHTML != undefined) { 834 } else if (next.innerHTML != undefined) {
813 835
814 836
815 endInx += next.innerHTML.length; 837 endInx += next.innerHTML.length;
816 if (endInx >= endSelectionInx) { 838 if (endInx >= endSelectionInx) {
817 break; 839 break;
818 } 840 }
819 841
820 842
821 } else { 843 } else {
822 break 844 break
823 } 845 }
824 console.log("startInx= " + startInx + "; endInx= " + endInx) 846
825 if (next.outerHTML != undefined) { 847 if (next.outerHTML != undefined) {
826 tmpStringSelection += next.outerHTML; 848 tmpStringSelection += next.outerHTML;
827 console.log("appened tmpStringSelection: " + tmpStringSelection) 849 }
828
829 }
830 */ 850 */
831 851
832 console.log("next: ");
833 console.log(next);
834 next = next.nextSibling; 852 next = next.nextSibling;
835 853
836 } 854 }
837 855
838 856
839 // TODO 857 // TODO
840 // fragment at the end of selection: extentNode 858 // fragment at the end of selection: extentNode
841 859
842 console.log("extentNode...")
843 console.log("startInx=" + startInx + " endInx= " + endInx + "; endSelectionInx= " + endSelectionInx)
844
845 var extentNode = selection.extentNode 860 var extentNode = selection.extentNode
846 861
847 862
848 if (checkExtentNode) { 863 if (checkExtentNode) {
849 864
850 if (endInx < endSelectionInx && startInx < endSelectionInx ) { 865 if (endInx < endSelectionInx && startInx < endSelectionInx ) {
851 tmpStringSelection += anchorText.substring(endInx, endSelectionInx); 866 tmpStringSelection += anchorText.substring(endInx, endSelectionInx);
852 console.log("append anchorText.substring(endInx, endSelectionInx) to tmpStringSelection: " + tmpStringSelection) 867
853
854 } else if (extentNode != null) { 868 } else if (extentNode != null) {
855 var extentText = extentNode.textContent 869 var extentText = extentNode.textContent
856 870
857 tmpStringSelection += extentText.substring(startInx, endSelectionInx); 871 tmpStringSelection += extentText.substring(startInx, endSelectionInx);
858 872
859 console.log("append extentNode to tmpStringSelection: " + tmpStringSelection)
860 } else { 873 } else {
861 tmpStringSelection += anchorText.substring(startInx, endSelectionInx); 874 tmpStringSelection += anchorText.substring(startInx, endSelectionInx);
862 console.log("append anchorText.substring(startInx, endSelectionInx) to tmpStringSelection: " + tmpStringSelection)
863 } 875 }
864 } 876 }
865 877
866 /* 878 /*
867 if (extentNode != null) { 879 if (extentNode != null) {
868 if (extentNode.nodeType == 3 ) { // text case 880 if (extentNode.nodeType == 3 ) { // text case
869 var extentText = extentNode.textContent 881 var extentText = extentNode.textContent
870 882
871 if (endInx >= endSelectionInx) { 883 if (endInx >= endSelectionInx) {
872 884
873 console.log("tmpStringSelection: " + tmpStringSelection)
874
875 console.log(extentText.substring(startInx, selection.extentOffset))
876 tmpStringSelection += extentText.substring(startInx, endSelectionInx); 885 tmpStringSelection += extentText.substring(startInx, endSelectionInx);
877
878 console.log("append extentNode to tmpStringSelection: " + tmpStringSelection)
879 886
880 } else { 887 } else {
881 tmpStringSelection += anchorText.substring(endInx, endSelectionInx); 888 tmpStringSelection += anchorText.substring(endInx, endSelectionInx);
882 889
883 } 890 }
884 } 891 }
885 } 892 }
886 */ 893 */
887 894
888 console.log("tmpStringSelection:")
889 console.log(tmpStringSelection)
890 stringSelection = tmpStringSelection; 895 stringSelection = tmpStringSelection;
891 896
892 } 897 }
893 898
894 range.deleteContents(); 899 range.deleteContents();
895 900
896 if ( tag==topic_tag2) { 901 if ( tag==topic_tag2) {
911 916
912 917
913 } 918 }
914 919
915 function tagwithOnlytag( range, selection, tag ) { 920 function tagwithOnlytag( range, selection, tag ) {
916 921
917 $('#loading').show(); 922 $('#loading').show();
918 923
919 saveUndoText(); 924 saveUndoText();
920 var topic_tag = JSON.parse('<?php echo json_encode($topic_tag) ?>'); 925 var topic_tag = JSON.parse('<?php echo json_encode($topic_tag) ?>');
921 var topic_tag2 = topic_tag+"2"; 926 var topic_tag2 = topic_tag+"2";
922 927
923 var documentFragment = range.extractContents(); 928 var documentFragment = range.extractContents();
924
925 console.log("topic_tag: "+ topic_tag + ", topic_tag2: " + topic_tag2);
926 929
927 var stringSelection = "" 930 var stringSelection = ""
928 var childNodes = documentFragment.childNodes 931 var childNodes = documentFragment.childNodes
929 for (var i = 0; i < childNodes.length; i++){ 932 for (var i = 0; i < childNodes.length; i++){
930 if (childNodes[i].outerHTML == undefined) { 933 if (childNodes[i].outerHTML == undefined) {
931 stringSelection += childNodes[i].textContent 934 stringSelection += childNodes[i].textContent
932 } else { 935 } else {
933 stringSelection += childNodes[i].outerHTML 936 stringSelection += childNodes[i].outerHTML
934 } 937 }
935 938
936 } 939 }
937
938
939 //console.log("stringSelection: " + stringSelection);
940
941 940
942 range.deleteContents(); 941 range.deleteContents();
943 942
944 if ( tag==topic_tag2) { 943 if ( tag==topic_tag2) {
945 var newdiv = document.createElement(topic_tag); 944 var newdiv = document.createElement(topic_tag);
987 986
988 function replaceSmartRegex() { 987 function replaceSmartRegex() {
989 saveUndoText(); 988 saveUndoText();
990 var startPage = $('#regexPageStart2').val(); 989 var startPage = $('#regexPageStart2').val();
991 var endPage = $('#regexPageEnd2').val(); 990 var endPage = $('#regexPageEnd2').val();
992 991
993 var el = document.getElementById("editable-area"); 992 var el = document.getElementById("editable-area");
994 var regexText=document.getElementById("regexText").value; 993 var regexText=document.getElementById("regexText").value;
995 994
996 <?php 995 <?php
997 foreach ( $wordlistArray as $wordlistValue ) { 996 foreach ( $wordlistArray as $wordlistValue ) {
998 echo "\tvar regexText1=\"List ".$wordlistValue[1]."\";\n"; 997 echo "\tvar regexText1=\"List ".$wordlistValue[1]."\";\n";
999 echo "\tregexText1 = preg_quote(regexText1);\n"; 998 echo "\tregexText1 = preg_quote(regexText1);\n";
1000 echo "\tvar replaceText1=\"".$wordlistValue[2]."\";\n"; 999 echo "\tvar replaceText1=\"".$wordlistValue[2]."\";\n";
1001 echo "\tregexText = regexText.replace(new RegExp(regexText1, \"g\"), replaceText1);\n\n"; 1000 echo "\tregexText = regexText.replace(new RegExp(regexText1, \"g\"), replaceText1);\n\n";
1002 } 1001 }
1003 ?> 1002 ?>
1004 1003
1005 var replaceText=document.getElementById("replaceText").value; 1004 var replaceText=document.getElementById("replaceText").value;
1006 var str="" + el.innerHTML; 1005 var str="" + el.innerHTML;
1007 1006 var objReg1 = new RegExp(regexText, "g");
1007 var occurrences, info;
1008 if ( startPage == "" ) { 1008 if ( startPage == "" ) {
1009 alert( "Tagged "+str.match(new RegExp(regexText, "g")).length+" entities!" ); 1009
1010 el.innerHTML = str.replace(new RegExp(regexText, "g"), replaceText); 1010 occurrences = (str.match(objReg1)||[]).length;
1011
1012 if(occurrences > 0){
1013 info = "Replaced "+ occurrences +" entities.";
1014 el.innerHTML = str.replace(objReg1, replaceText);
1015 }
1011 } else { 1016 } else {
1012 var regexText2="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】"; 1017 var regexText2="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】";
1013 var partString = ""+str.match(new RegExp(regexText2, "g")); 1018 var objReg2 = new RegExp(regexText2, "g");
1014 alert(partString); 1019 var partString = "" + str.match(objReg2);
1015 1020 //alert(partString);
1016 alert( "Tagged "+partString.match(new RegExp(regexText, "g")).length+" entities!" ); 1021
1017 var resultString = partString.replace(new RegExp(regexText, "g"), replaceText); 1022 occurrences = (partString.match(objReg1)||[]).length;
1018 1023
1019 str="" + el.innerHTML; 1024 if(occurrences > 0){
1020 el.innerHTML = str.replace(new RegExp(regexText2, "g"), resultString); 1025 info = "Replaced "+ occurrences +" entities.";
1021 } 1026 var resultString = partString.replace(objReg1, replaceText);
1027
1028 str = "" + el.innerHTML;
1029 el.innerHTML = str.replace(objReg2, resultString);
1030 }
1031 }
1032
1033 if(occurrences == 0) info = "Found 0 occurrence.";
1034
1035 $.bootstrapGrowl(info);
1022 //document.styleSheets[0].addRule("tag001", "color:green;") 1036 //document.styleSheets[0].addRule("tag001", "color:green;")
1023 } 1037 }
1024 1038
1025 function saveTextToLGService() { 1039 function saveTextToLGService() {
1026 // clean editable-area 1040 // clean editable-area
1027 $('.questionMarkClass').remove(); 1041 $('.questionMarkClass').remove();
1028 $('.tagItemDivClass').remove(); 1042 $('.tagItemDivClass').remove();
1029 1043
1030 // ------------- 1044 // -------------
1031 var info = JSON.parse('<?php echo json_encode($info) ?>'); 1045 var info = JSON.parse('<?php echo json_encode($info) ?>');
1032 var topic_id = JSON.parse('<?php echo json_encode($default_topic_id) ?>'); 1046 var topic_id = JSON.parse('<?php echo json_encode($default_topic_id) ?>');
1033 1047
1034 // if this is a new branch, ask for label 1048 // if this is a new branch, ask for label
1040 var mm = today.getMonth()+1; //January is 0! 1054 var mm = today.getMonth()+1; //January is 0!
1041 var yyyy = today.getFullYear(); 1055 var yyyy = today.getFullYear();
1042 1056
1043 if(dd<10) { 1057 if(dd<10) {
1044 dd='0'+dd 1058 dd='0'+dd
1045 } 1059 }
1046 if(mm<10) { 1060 if(mm<10) {
1047 mm='0'+mm 1061 mm='0'+mm
1048 } 1062 }
1049 today = dd+'.'+mm+'.'+yyyy; 1063 today = dd+'.'+mm+'.'+yyyy;
1050 var book_name = info['book_name']; 1064 var book_name = info['book_name'];
1051 var section_name = info['section_name']; 1065 var section_name = info['section_name'];
1052 var period = info['period']; 1066 var period = info['period'];
1053 1067
1055 if (book_name == "" || section_name == "" || period == "") { 1069 if (book_name == "" || section_name == "" || period == "") {
1056 default_label = today; 1070 default_label = today;
1057 } else { 1071 } else {
1058 default_label = book_name + "(" + cjst.chineseToPinyin(book_name).join(' ') + ")_" 1072 default_label = book_name + "(" + cjst.chineseToPinyin(book_name).join(' ') + ")_"
1059 + period + "(" + cjst.chineseToPinyin(period).join(' ') + ")_" 1073 + period + "(" + cjst.chineseToPinyin(period).join(' ') + ")_"
1060 + section_name + "(" + cjst.chineseToPinyin(section_name).join(' ') + ")_" 1074 + section_name + "(" + cjst.chineseToPinyin(section_name).join(' ') + ")_"
1061 + today; 1075 + today;
1062 } 1076 }
1063 1077
1064 1078
1065 var label = prompt("Please enter your label for this new task", default_label); 1079 var label = prompt("Please enter your label for this new task", default_label);
1066 while (label == null) { 1080 while (label == null) {
1067 alert("You haven't saved your editing."); 1081 alert("You haven't saved your editing.");
1068 return; 1082 return;
1069 } 1083 }
1070 }; 1084 };
1071 1085
1072 var form = document.createElement("form"); 1086 var form = document.createElement("form");
1073 form.setAttribute("method", "post"); 1087 form.setAttribute("method", "post");
1074 form.setAttribute("action", "./TaggingText"); // hand to controller 1088 form.setAttribute("action", "./TaggingText"); // hand to controller
1075 form.setAttribute("target", "_self"); 1089 form.setAttribute("target", "_self");
1076 1090
1077 var hiddenField = document.createElement("input"); 1091 var hiddenField = document.createElement("input");
1078 hiddenField.setAttribute("name", "func"); 1092 hiddenField.setAttribute("name", "func");
1079 hiddenField.setAttribute("value", "SaveFullTextToLGService"); 1093 hiddenField.setAttribute("value", "SaveFullTextToLGService");
1080 form.appendChild(hiddenField); 1094 form.appendChild(hiddenField);
1081 1095
1082 1096
1083 var hiddenField = document.createElement("input"); 1097 var hiddenField = document.createElement("input");
1084 hiddenField.setAttribute("name", "label"); 1098 hiddenField.setAttribute("name", "label");
1085 hiddenField.setAttribute("value", label); 1099 hiddenField.setAttribute("value", label);
1086 form.appendChild(hiddenField); 1100 form.appendChild(hiddenField);
1087 1101
1088 var hiddenField = document.createElement("input"); 1102 var hiddenField = document.createElement("input");
1089 hiddenField.setAttribute("name", "topic"); 1103 hiddenField.setAttribute("name", "topic");
1090 hiddenField.setAttribute("value", topic_id); 1104 hiddenField.setAttribute("value", topic_id);
1091 form.appendChild(hiddenField); 1105 form.appendChild(hiddenField);
1092 1106
1093 _postForContineTagging(form); 1107 _postForContineTagging(form);
1094 1108
1095 // set Cookies to triger LGService to reload for the up-to-date version 1109 // set Cookies to triger LGService to reload for the up-to-date version
1096 var value = 1; 1110 var value = 1;
1097 document.cookie = "saveTextToLGService=" + value + "; path=/LGServices/pages"; 1111 document.cookie = "saveTextToLGService=" + value + "; path=/LGServices/pages";
1098
1099 console.log("complete saving to LGService");
1100 1112
1101 } 1113 }
1102 1114
1103 function createTopic(default_topic_id) { 1115 function createTopic(default_topic_id) {
1104 var popup_status = $('#new_topic_div').css("display"); 1116 var popup_status = $('#new_topic_div').css("display");
1107 } else { 1119 } else {
1108 $('#new_topic_div').css("display", "block"); 1120 $('#new_topic_div').css("display", "block");
1109 } 1121 }
1110 1122
1111 var newtopic = document.getElementById("newTopicSubmit"); 1123 var newtopic = document.getElementById("newTopicSubmit");
1112 1124
1113 newtopic.onclick = function(){ 1125 newtopic.onclick = function(){
1114 // check if all fields are filled in 1126 // check if all fields are filled in
1115 if ($("#newTopicNameEn").val()==""|| $("#newTopicNameCh").val()=="" || $("#newTopicNamePi").val()=="" || 1127 if ($("#newTopicNameEn").val()==""|| $("#newTopicNameCh").val()=="" || $("#newTopicNamePi").val()=="" ||
1116 $("#newTopicTag").val()=="" || $("#newTopicTagName").val()=="") { 1128 $("#newTopicTag").val()=="" || $("#newTopicTagName").val()=="") {
1117 alert("Please fill in all the fields for the new topic."); 1129 alert("Please fill in all the fields for the new topic.");
1118 return; 1130 return;
1119 } 1131 }
1120 1132
1121 1133
1122 var form = document.createElement("form"); 1134 var form = document.createElement("form");
1123 form.setAttribute("method", "post"); 1135 form.setAttribute("method", "post");
1124 form.setAttribute("action", "./TaggingText"); // hand to controller 1136 form.setAttribute("action", "./TaggingText"); // hand to controller
1125 form.setAttribute("target", "_self"); 1137 form.setAttribute("target", "_self");
1126 1138
1127 var hiddenField = document.createElement("input"); 1139 var hiddenField = document.createElement("input");
1128 hiddenField.setAttribute("name", "func"); 1140 hiddenField.setAttribute("name", "func");
1129 hiddenField.setAttribute("value", "CreateNewTopic"); 1141 hiddenField.setAttribute("value", "CreateNewTopic");
1130 form.appendChild(hiddenField); 1142 form.appendChild(hiddenField);
1131 1143
1132 var hiddenField = document.createElement("input"); 1144 var hiddenField = document.createElement("input");
1133 hiddenField.setAttribute("name", "new_topic_name_en"); 1145 hiddenField.setAttribute("name", "new_topic_name_en");
1134 hiddenField.setAttribute("value", $("#newTopicNameEn").val()); 1146 hiddenField.setAttribute("value", $("#newTopicNameEn").val());
1135 form.appendChild(hiddenField); 1147 form.appendChild(hiddenField);
1136 var hiddenField = document.createElement("input"); 1148 var hiddenField = document.createElement("input");
1137 hiddenField.setAttribute("name", "new_topic_name_ch"); 1149 hiddenField.setAttribute("name", "new_topic_name_ch");
1138 hiddenField.setAttribute("value", $("#newTopicNameCh").val()); 1150 hiddenField.setAttribute("value", $("#newTopicNameCh").val());
1139 form.appendChild(hiddenField); 1151 form.appendChild(hiddenField);
1140 var hiddenField = document.createElement("input"); 1152 var hiddenField = document.createElement("input");
1141 hiddenField.setAttribute("name", "new_topic_name_pi"); 1153 hiddenField.setAttribute("name", "new_topic_name_pi");
1142 hiddenField.setAttribute("value", $("#newTopicNamePi").val()); 1154 hiddenField.setAttribute("value", $("#newTopicNamePi").val());
1143 form.appendChild(hiddenField); 1155 form.appendChild(hiddenField);
1144 var hiddenField = document.createElement("input"); 1156 var hiddenField = document.createElement("input");
1145 hiddenField.setAttribute("name", "new_topic_tag"); 1157 hiddenField.setAttribute("name", "new_topic_tag");
1146 hiddenField.setAttribute("value", $("#newTopicTag").val()); 1158 hiddenField.setAttribute("value", $("#newTopicTag").val());
1147 form.appendChild(hiddenField); 1159 form.appendChild(hiddenField);
1148 var hiddenField = document.createElement("input"); 1160 var hiddenField = document.createElement("input");
1149 hiddenField.setAttribute("name", "new_topic_tag_name"); 1161 hiddenField.setAttribute("name", "new_topic_tag_name");
1150 hiddenField.setAttribute("value", $("#newTopicTagName").val()); 1162 hiddenField.setAttribute("value", $("#newTopicTagName").val());
1151 form.appendChild(hiddenField); 1163 form.appendChild(hiddenField);
1152 1164
1153 1165
1154 _postForContineTagging(form); 1166 _postForContineTagging(form);
1155 1167
1156 } 1168 }
1157 1169
1158 $("#newTopicCancel").attr("onclick", "$('#new_topic_div').css(\"display\", \"none\");"); 1170 $("#newTopicCancel").attr("onclick", "$('#new_topic_div').css(\"display\", \"none\");");
1159 1171
1160 } 1172 }
1161 1173
1162 function chooseTopic(default_topic_id) { 1174 function chooseTopic(default_topic_id) {
1187 var changeConfirm = confirm("You're going to change topic. \nUnsaved data will be lost."); 1199 var changeConfirm = confirm("You're going to change topic. \nUnsaved data will be lost.");
1188 1200
1189 if (changeConfirm) { 1201 if (changeConfirm) {
1190 1202
1191 selected_topic = topic_select.options[topic_select.selectedIndex]; 1203 selected_topic = topic_select.options[topic_select.selectedIndex];
1192 console.log(selected_topic.text);
1193 1204
1194 var topic_id = selected_topic.value; 1205 var topic_id = selected_topic.value;
1195 1206
1196 var form = document.createElement("form"); 1207 var form = document.createElement("form");
1197 form.setAttribute("method", "post"); 1208 form.setAttribute("method", "post");
1198 form.setAttribute("action", "./TaggingText"); // hand to controller 1209 form.setAttribute("action", "./TaggingText"); // hand to controller
1199 form.setAttribute("target", "_self"); 1210 form.setAttribute("target", "_self");
1200 1211
1201 var hiddenField = document.createElement("input"); 1212 var hiddenField = document.createElement("input");
1202 hiddenField.setAttribute("name", "topic"); 1213 hiddenField.setAttribute("name", "topic");
1203 hiddenField.setAttribute("value", topic_id); 1214 hiddenField.setAttribute("value", topic_id);
1204 form.appendChild(hiddenField); 1215 form.appendChild(hiddenField);
1205 1216
1206 var hiddenField = document.createElement("input"); 1217 var hiddenField = document.createElement("input");
1207 hiddenField.setAttribute("name", "func"); 1218 hiddenField.setAttribute("name", "func");
1208 hiddenField.setAttribute("value", "ContinueTagging"); 1219 hiddenField.setAttribute("value", "ContinueTagging");
1209 form.appendChild(hiddenField); 1220 form.appendChild(hiddenField);
1210 1221
1211 _postForContineTagging(form); 1222 _postForContineTagging(form);
1212 1223
1213 1224
1214 } else { 1225 } else {
1215 return 1226 return
1216 } 1227 }
1217 }; 1228 };
1218 1229
1219 1230
1220 //Create and append the options 1231 //Create and append the options
1221 for (var i = 0; i < t.length; i++) { 1232 for (var i = 0; i < t.length; i++) {
1226 option.selected = true; 1237 option.selected = true;
1227 }; 1238 };
1228 topic_select.appendChild(option); 1239 topic_select.appendChild(option);
1229 } 1240 }
1230 1241
1231 $('#load_topic_div').append(topic_select);
1232
1233 var newbutton = document.createElement("button"); 1242 var newbutton = document.createElement("button");
1234 $(newbutton).html("Close"); 1243 $(newbutton).html('<span aria-hidden=\"true\">×</span>');
1235 $(newbutton).addClass("btn btn-xs btn-default"); 1244 $(newbutton).addClass("btn btn-xs btn-default close-btn");
1236 $(newbutton).attr("onclick", "$('#load_topic_div').css(\"display\", \"none\");"); 1245 $(newbutton).attr("onclick", "$('#load_topic_div').css(\"display\", \"none\");");
1237 $('#load_topic_div').append(newbutton); 1246 $('#load_topic_div').append(newbutton);
1238 1247
1239 } 1248 $('#load_topic_div').append(topic_select);
1240 1249
1250 }
1241 1251
1242 function _postForContineTagging(form) { 1252 function _postForContineTagging(form) {
1243 var hiddenField = document.createElement("input"); 1253 var hiddenField = document.createElement("input");
1244 hiddenField.setAttribute("name", "text"); 1254 hiddenField.setAttribute("name", "text");
1245 var el = document.getElementById("editable-area"); 1255 var el = document.getElementById("editable-area");
1246 var text = el.innerHTML; 1256 var text = el.innerHTML;
1247 hiddenField.setAttribute("value", text); 1257 hiddenField.setAttribute("value", text);
1248 form.appendChild(hiddenField); 1258 form.appendChild(hiddenField);
1249 1259
1250 // pass taglist 1260 // pass taglist
1251 var hiddenField = document.createElement("input"); 1261 var hiddenField = document.createElement("input");
1252 hiddenField.setAttribute("name", "taglistArray"); 1262 hiddenField.setAttribute("name", "taglistArray");
1253 1263
1254 // use json_encode($taglistArray), which is the up-to-date taglist (in db) instead, 1264 // use json_encode($taglistArray), which is the up-to-date taglist (in db) instead,
1255 // so replace the follwoing code 1265 // so replace the follwoing code
1256 /* 1266 /*
1257 var taglistObj = JSON.parse('<?php echo json_encode($taglist_infile) ?>'); 1267 var taglistObj = JSON.parse('<?php echo json_encode($taglist_infile) ?>');
1258 // if taglist_infile == "" means the taglist in db is up-to-date, will use taglistArray to save to file 1268 // if taglist_infile == "" means the taglist in db is up-to-date, will use taglistArray to save to file
1261 // TODO: should pass the user-decided taglist to post['taglistArray'] 1271 // TODO: should pass the user-decided taglist to post['taglistArray']
1262 taglistObj = JSON.parse('<?php echo json_encode($taglistArray) ?>'); 1272 taglistObj = JSON.parse('<?php echo json_encode($taglistArray) ?>');
1263 } 1273 }
1264 taglistArray = JSON.stringify(taglistObj); 1274 taglistArray = JSON.stringify(taglistObj);
1265 */ 1275 */
1266 1276
1267 1277
1268 var taglistArray = JSON.parse('<?php echo json_encode($taglistArray) ?>'); 1278 var taglistArray = JSON.parse('<?php echo json_encode($taglistArray) ?>');
1269 hiddenField.setAttribute("value", taglistArray); 1279 hiddenField.setAttribute("value", taglistArray);
1270 form.appendChild(hiddenField); 1280 form.appendChild(hiddenField);
1271 1281
1272 // pass book_meta 1282 // pass book_meta
1273 var hiddenField = document.createElement("input"); 1283 var hiddenField = document.createElement("input");
1274 hiddenField.setAttribute("name", "book_meta"); 1284 hiddenField.setAttribute("name", "book_meta");
1275 var book_metaObj = JSON.parse('<?php echo json_encode($book_meta) ?>'); 1285 var book_metaObj = JSON.parse('<?php echo json_encode($book_meta) ?>');
1276 book_metaArray = JSON.stringify(book_metaObj); 1286 book_metaArray = JSON.stringify(book_metaObj);
1277 1287
1278 hiddenField.setAttribute("value", book_metaArray); 1288 hiddenField.setAttribute("value", book_metaArray);
1279 form.appendChild(hiddenField); 1289 form.appendChild(hiddenField);
1280 1290
1281 1291
1282 var info = JSON.parse( '<?php echo json_encode($info) ?>'); 1292 var info = JSON.parse( '<?php echo json_encode($info) ?>');
1283 1293
1284 if (info) { 1294 if (info) {
1285 if (info['file_id']) { 1295 if (info['file_id']) {
1286 var hiddenField = document.createElement("input"); 1296 var hiddenField = document.createElement("input");
1287 hiddenField.setAttribute("name", "fileId"); 1297 hiddenField.setAttribute("name", "fileId");
1288 hiddenField.setAttribute("value", info['file_id']); 1298 hiddenField.setAttribute("value", info['file_id']);
1289 form.appendChild(hiddenField); 1299 form.appendChild(hiddenField);
1290 }; 1300 };
1291 if (info['branch_id']) { 1301 if (info['branch_id']) {
1292 var hiddenField = document.createElement("input"); 1302 var hiddenField = document.createElement("input");
1293 hiddenField.setAttribute("name", "branchId"); 1303 hiddenField.setAttribute("name", "branchId");
1294 hiddenField.setAttribute("value", info['branch_id']); 1304 hiddenField.setAttribute("value", info['branch_id']);
1295 form.appendChild(hiddenField); 1305 form.appendChild(hiddenField);
1296 }; 1306 };
1297 if (info['user_id']) { 1307 if (info['user_id']) {
1298 var hiddenField = document.createElement("input"); 1308 var hiddenField = document.createElement("input");
1299 hiddenField.setAttribute("name", "userId"); 1309 hiddenField.setAttribute("name", "userId");
1300 hiddenField.setAttribute("value", info['user_id']); 1310 hiddenField.setAttribute("value", info['user_id']);
1301 form.appendChild(hiddenField); 1311 form.appendChild(hiddenField);
1302 }; 1312 };
1303 if (info['section_id']) { 1313 if (info['section_id']) {
1304 var hiddenField = document.createElement("input"); 1314 var hiddenField = document.createElement("input");
1305 hiddenField.setAttribute("name", "sectionId"); 1315 hiddenField.setAttribute("name", "sectionId");
1306 hiddenField.setAttribute("value", info['section_id']); 1316 hiddenField.setAttribute("value", info['section_id']);
1307 form.appendChild(hiddenField); 1317 form.appendChild(hiddenField);
1308 }; 1318 };
1309 if (info['book_id']) { 1319 if (info['book_id']) {
1310 var hiddenField = document.createElement("input"); 1320 var hiddenField = document.createElement("input");
1311 hiddenField.setAttribute("name", "bookId"); 1321 hiddenField.setAttribute("name", "bookId");
1312 hiddenField.setAttribute("value", info['book_id']); 1322 hiddenField.setAttribute("value", info['book_id']);
1313 form.appendChild(hiddenField); 1323 form.appendChild(hiddenField);
1314 }; 1324 };
1315 if (info['section_name']) { 1325 if (info['section_name']) {
1316 var hiddenField = document.createElement("input"); 1326 var hiddenField = document.createElement("input");
1317 hiddenField.setAttribute("name", "sectionName"); 1327 hiddenField.setAttribute("name", "sectionName");
1318 hiddenField.setAttribute("value", info['section_name']); 1328 hiddenField.setAttribute("value", info['section_name']);
1319 form.appendChild(hiddenField); 1329 form.appendChild(hiddenField);
1320 }; 1330 };
1321 if (info['book_name']) { 1331 if (info['book_name']) {
1322 var hiddenField = document.createElement("input"); 1332 var hiddenField = document.createElement("input");
1323 hiddenField.setAttribute("name", "bookName"); 1333 hiddenField.setAttribute("name", "bookName");
1324 hiddenField.setAttribute("value", info['book_name']); 1334 hiddenField.setAttribute("value", info['book_name']);
1325 form.appendChild(hiddenField); 1335 form.appendChild(hiddenField);
1326 }; 1336 };
1327 if (info['current_fileId']) { 1337 if (info['current_fileId']) {
1328 var hiddenField = document.createElement("input"); 1338 var hiddenField = document.createElement("input");
1329 hiddenField.setAttribute("name", "currentFileId"); 1339 hiddenField.setAttribute("name", "currentFileId");
1330 hiddenField.setAttribute("value", info['current_fileId']); 1340 hiddenField.setAttribute("value", info['current_fileId']);
1331 form.appendChild(hiddenField); 1341 form.appendChild(hiddenField);
1332 }; 1342 };
1333 1343
1334 } 1344 }
1335 if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1) { 1345
1336 document.body.appendChild(form);
1337 form.submit();
1338 document.body.removeChild(form);
1339 } else {
1340 document.body.appendChild(form); 1346 document.body.appendChild(form);
1341 form.submit(); 1347 form.submit();
1342 document.body.removeChild(form); 1348 document.body.removeChild(form);
1343 //form.submit(); // works under IE and Chrome, but not FF 1349
1344 }
1345 1350
1346 } 1351 }
1347 1352
1348 function configTagsInTopic(topic_id) { 1353 function configTagsInTopic(topic_id) {
1349 var form = document.createElement("form"); 1354 var form = document.createElement("form");
1350 1355
1351 form.setAttribute("method", "post"); 1356 form.setAttribute("method", "post");
1352 form.setAttribute("action", "./ConfigTagsInTopic"); // hand to controller 1357 form.setAttribute("action", "./ConfigTagsInTopic"); // hand to controller
1353 form.setAttribute("target", "_blank"); 1358 form.setAttribute("target", "_blank");
1354 1359
1355 var hiddenField = document.createElement("input"); 1360 var hiddenField = document.createElement("input");
1356 hiddenField.setAttribute("name", "topic"); 1361 hiddenField.setAttribute("name", "topic");
1357 hiddenField.setAttribute("value", topic_id); 1362 hiddenField.setAttribute("value", topic_id);
1358 form.appendChild(hiddenField); 1363 form.appendChild(hiddenField);
1359 1364
1360 _postForContineTagging(form); 1365 _postForContineTagging(form);
1361 1366
1362 1367
1368 }
1369
1370 var toolPanelPosition = "right";
1371
1372 function moveToolPanel(toWhere){
1373
1374 if(toolPanelPosition == toWhere) return;
1375
1376 var oldAreaId, newAreaId, oldBtn, newBtn;
1377 if(toWhere == "left"){
1378 oldAreaId = 'right-tool-bar-area';
1379 newAreaId = 'left-tool-bar-area';
1380 oldBtn = 'toLeft';
1381 newBtn = 'toRight';
1382 }
1383 else{
1384 oldAreaId = 'left-tool-bar-area';
1385 newAreaId = 'right-tool-bar-area';
1386 oldBtn = 'toRight';
1387 newBtn = 'toLeft';
1388 }
1389
1390 var oldParent = document.getElementById(oldAreaId),
1391 newParent = document.getElementById(newAreaId);
1392
1393 while (oldParent.hasChildNodes()){
1394 newParent.appendChild(oldParent.firstChild);
1395 }
1396
1397 newParent.style.display = "block";
1398 oldParent.style.display = "none";
1399
1400 document.getElementById(newBtn).firstChild.style.display = "block";
1401 document.getElementById(oldBtn).firstChild.style.display = "none";
1402
1403 toolPanelPosition = toWhere;
1404
1363 } 1405 }
1364 1406
1365 $(document).on("change", '#smartRegexPopUpSelectWord', function (e) { 1407 $(document).on("change", '#smartRegexPopUpSelectWord', function (e) {
1366 var wordlistArray = JSON.parse('<?php echo json_encode($wordlistArray) ?>'); 1408 var wordlistArray = JSON.parse('<?php echo json_encode($wordlistArray) ?>');
1367 1409
1368 for (var i = 0; i < wordlistArray.length; i++) { 1410 for (var i = 0; i < wordlistArray.length; i++) {
1369 var wordlistValue = wordlistArray[i]; // wordlistValue is array(id, name, listString) 1411 var wordlistValue = wordlistArray[i]; // wordlistValue is array(id, name, listString)
1370 if ($('#smartRegexPopUpSelectWord').val() == wordlistValue[0]) { 1412 if ($('#smartRegexPopUpSelectWord').val() == wordlistValue[0]) {
1371 var textarea_text = $('#smartRegexPopUpText').val(); 1413 var textarea_text = $('#smartRegexPopUpText').val();
1372 // insert selected wordlist into textarea at cursor position 1414 // insert selected wordlist into textarea at cursor position
1373 var cursorPosition = $('#smartRegexPopUpText').prop("selectionStart"); 1415 var cursorPosition = $('#smartRegexPopUpText').prop("selectionStart");
1374 // cut textarea_text by cursorPosition 1416 // cut textarea_text by cursorPosition
1375 var text_before_cursor = textarea_text.substring(0,cursorPosition); 1417 var text_before_cursor = textarea_text.substring(0,cursorPosition);
1379 $('#smartRegexPopUpText').val( text_before_cursor+"["+wordlistValue[2]+"]{1,1}"+text_after_cursor); 1421 $('#smartRegexPopUpText').val( text_before_cursor+"["+wordlistValue[2]+"]{1,1}"+text_after_cursor);
1380 } 1422 }
1381 } 1423 }
1382 }); 1424 });
1383 1425
1384
1385 </script> 1426 </script>
1386 1427
1387 1428 <div id="loading">...</div>
1388 <!-- 1429
1389 <fieldset class="info-board"> 1430 <div class="container-fluid info-board">
1390 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#info_board">Information <span class="caret"></span></h5></legend> 1431 <div class="row">
1391 <div id="info_board" class="collapse in"> 1432 <div class="bg-danger"><strong><?php echo $messages['error']; ?> </strong></div>
1392 <div class="bg-danger"><strong><?php echo $messages['error']; ?> </strong></div> 1433 <div class="bg-warning"> <?php echo $messages['warning']; ?>
1393 <div class="bg-warning"> <?php echo $messages['warning']; ?> 1434 <button id="reloadTextButton" onclick="reloadText(<?php echo $default_topic_id; ?>)" style="display:none;">Latest Version</button>
1394 <button id="reloadTextButton" onclick="reloadText(<?php echo $default_topic_id; ?>)" style="display:none;">Latest Version</button> 1435 </div>
1436 <div class="bg-info"> <?php echo $messages['info']; ?> </div>
1437 </div>
1438 </div>
1439
1440 <div class="container-fluid">
1441 <div class="row">
1442 <div id="left-tool-bar-area" class="col-md-3 tool-col" style="display:none"></div>
1443 <div class="col-md-9 content-col">
1444 <div id="editable-area-wraper">
1445 <div id="editable-area" class="area" contenteditable="false"><?php echo $stringInput; ?></div>
1446 </div>
1395 </div> 1447 </div>
1396 <div class="bg-info"> <?php echo $messages['info']; ?> </div> 1448 <div id="right-tool-bar-area" class="col-md-3 tool-col">
1397 <div class="bg-default"> <?php echo $messages['debug']; ?> </div>
1398 </div>
1399 </fieldset>
1400
1401 -->
1402 <div id="loading">...</div>
1403
1404 <div class="info-board">
1405 <div class="bg-danger"><strong><?php echo $messages['error']; ?> </strong></div>
1406 <div class="bg-warning"> <?php echo $messages['warning']; ?>
1407 <button id="reloadTextButton" onclick="reloadText(<?php echo $default_topic_id; ?>)" style="display:none;">Latest Version</button>
1408 </div>
1409 <div class="bg-info"> <?php echo $messages['info']; ?> </div>
1410 <!--
1411 <div class="bg-default"> <?php echo $messages['debug']; ?> </div>
1412 -->
1413 </div>
1414
1415 <table border="1" style="margin:10 30 30 30; width:100%; max-width:1270px; min-width:680px">
1416 <tr>
1417 <td style="padding:0 5 0 5; margin: 0 5 0 5;">
1418 <div id="editable-area" class="area" style="max-width:980px; min-width:400px"><?php echo $stringInput; ?></div>
1419 </td>
1420 <td valign="top" style="min-width:280px; padding:0 5 0 5; margin:0 5 0 5;">
1421 <div id="popups" style="position:absolute; width:300px; "> 1449 <div id="popups" style="position:absolute; width:300px; ">
1422 <div id="load_topic_div" class="popup-topic popup-frame"></div> 1450 <div id="load_topic_div" class="popup-topic popup-frame"></div>
1423 <div id="new_topic_div" class="popup-newtopic popup-frame"> 1451 <div id="new_topic_div" class="popup-newtopic popup-frame">
1424 <div class="form-horizontal"> 1452 <div class="form-horizontal">
1425 <h4 class="text-info">New topic name:</h4> 1453 <h4 class="text-info">New topic name:</h4>
1439 <label for="newTopicNamePi" class="col-sm-5 control-label">name (pinyin)</label> 1467 <label for="newTopicNamePi" class="col-sm-5 control-label">name (pinyin)</label>
1440 <div class="col-sm-7"> 1468 <div class="col-sm-7">
1441 <input type="text" class="form-control" id="newTopicNamePi" placeholder="e.g. wu chan"> 1469 <input type="text" class="form-control" id="newTopicNamePi" placeholder="e.g. wu chan">
1442 </div> 1470 </div>
1443 </div> 1471 </div>
1444 1472
1445 1473
1446 <h4 class="text-info">Define the topic tag for the new topic:</h4> 1474 <h4 class="text-info">Define the topic tag for the new topic:</h4>
1447 <div class="form-group form-group-sm"> 1475 <div class="form-group form-group-sm">
1448 <label for="newTopicTag" class="col-sm-5 control-label">topic tag (eng)</label> 1476 <label for="newTopicTag" class="col-sm-5 control-label">topic tag (eng)</label>
1449 <div class="col-sm-7"> 1477 <div class="col-sm-7">
1469 1497
1470 </div> 1498 </div>
1471 <div id="load_regex_div" class="popup-loadregex popup-frame"></div> 1499 <div id="load_regex_div" class="popup-loadregex popup-frame"></div>
1472 <div id="regex_generator" class="popup-frame"> 1500 <div id="regex_generator" class="popup-frame">
1473 <h3>Gen Regex</h3> 1501 <h3>Gen Regex</h3>
1474 <div>Pattern 1: 1502 <div>Pattern 1:
1475 <div id="regex_pattern1" class="bg-info"></div> 1503 <div id="regex_pattern1" class="bg-info"></div>
1476 </div> 1504 </div>
1477 <div>Pattern 2: 1505 <div>Pattern 2:
1478 <div id="regex_pattern2" class="bg-info"></div> 1506 <div id="regex_pattern2" class="bg-info"></div>
1479 </div> 1507 </div>
1480 <div>Suggested Regex: 1508 <div>Suggested Regex:
1481 <div id="generated_regex" class="bg-success"></div> 1509 <div id="generated_regex" class="bg-success"></div>
1482 </div> 1510 </div>
1483 <button onclick="genRegexAddToSmartRegex()" class="btn btn-info">Add it to SmartRegex</button> 1511 <button onclick="genRegexAddToSmartRegex()" class="btn btn-info">Add it to SmartRegex</button>
1484 <button onclick="genRegexWindowClose()" class="btn btn-default">Close</button> 1512 <button onclick="genRegexWindowClose()" class="btn btn-default">Close</button>
1485 <div id="regex_generator_error_msg" class="bg-white"></div> 1513 <div id="regex_generator_error_msg" class="bg-white"></div>
1486 </div> 1514 </div>
1487 <div id="smartRegexPopUpDiv" class="popup-frame"> 1515 <div id="smartRegexPopUpDiv" class="popup-frame">
1488 Name: <input id="smartRegexPopUpName"></input><br><br> 1516
1489 Word List: 1517 Name: <input id="smartRegexPopUpName"></input>
1518 <button onclick="replaceSmartClose()" class="btn btn-sm btn-default close-btn" ><span aria-hidden="true">×</span></button><br><br>
1519 Word List:
1490 <select id="smartRegexPopUpSelectWord"> 1520 <select id="smartRegexPopUpSelectWord">
1491 <option value="NULL" selected>無</option> 1521 <option value="NULL" selected>無</option>
1492 <?php 1522 <?php
1493 foreach ( $wordlistArray as $wordlistValue ) { 1523 foreach ( $wordlistArray as $wordlistValue ) {
1494 echo "<option value=\"".$wordlistValue[0]."\">".$wordlistValue[1]."</option>\n"; 1524 echo "<option value=\"".$wordlistValue[0]."\">".$wordlistValue[1]."</option>\n";
1495 } 1525 }
1496 ?> 1526 ?>
1497 </select> 1527 </select>
1498 <!-- edit wordlist --> 1528 <!-- edit wordlist -->
1499 <button onclick="window.open('./EditWordlist')" class="btn btn-default">Edit WordList</button></br> 1529 <button onclick="window.open('./EditWordlist')" class="btn btn-sm btn-default">Edit WordList</button></br>
1500 1530
1501 <br> 1531 <br>
1502 OR (USE "|" TO SEPARATE WORDS):<br> 1532 OR (USE "|" TO SEPARATE WORDS):<br>
1503 <TEXTAREA id="smartRegexPopUpText" COLS=30 ROWS=4></TEXTAREA><br><br> 1533 <TEXTAREA id="smartRegexPopUpText" COLS=59 ROWS=4 style="width:100%;"></TEXTAREA><br><br>
1504 Tag: 1534 Tag:
1505 <select id="smartRegexPopUpSelectTag"> 1535 <select id="smartRegexPopUpSelectTag">
1506 <?php 1536 <?php
1507 foreach ( $taglistArray as $taglistValue ) { 1537 foreach ( $taglistArray as $taglistValue ) {
1508 echo "<option value=\"".$taglistValue[2]."\">".$taglistValue[1]."</option>\n"; 1538 echo "<option value=\"".$taglistValue[2]."\">".$taglistValue[1]."</option>\n";
1509 } 1539 }
1510 echo "<option value=\"title\">Title</option>\n"; 1540 echo "<option value=\"title\">Title</option>\n";
1511 ?> 1541 ?>
1512 <option value="NOTAG">不標記</option> 1542 <option value="NOTAG">不標記</option>
1513 </select><br> 1543 </select><br><br>
1514 <button id="smartRegexPopUpAdd" onclick="replaceSmartAdd()" class="btn btn-info">Add</button> 1544 <button id="smartRegexPopUpBack" onclick="replaceSmartBack()" class="btn btn-sm btn-default"><<</button>
1515 <button id="smartRegexPopUpEdit" onclick="replaceSmartEdit()" class="btn btn-success">Edit/Update</button> 1545 <button id="smartRegexPopUpAdd" onclick="replaceSmartAdd()" class="btn btn-sm btn-info" style="display:none">Add</button>
1516 <button id="smartRegexPopUpDel" onclick="replaceSmartDel()" class="btn btn-danger">Delete</button> 1546 <button id="smartRegexPopUpDel" onclick="replaceSmartRemove()" class="btn btn-sm btn-danger">Remove</button>
1517 <button id="smartRegexPopUpBack" onclick="replaceSmartBack()" class="btn btn-default"><<</button> 1547 <button id="smartRegexPopUpEdit" onclick="replaceSmartEdit()" class="btn btn-sm btn-success">Edit/Update</button>
1518 <button id="smartRegexPopUpFor" onclick="replaceSmartFor()" class="btn btn-default">>></button> 1548 <button id="smartRegexPopUpFor" onclick="replaceSmartFor()" class="btn btn-sm btn-default">>></button>
1519 <button onclick="replaceSmartClose()" class="btn btn-default" >Close</button>
1520 </div> 1549 </div>
1521 </div> 1550 </div>
1522 1551 <div id="toLeft" onclick="moveToolPanel('left')"><span class="glyphicon glyphicon-arrow-left switch-btn"></span></div>
1523 <div id="follow-scroll"> 1552 <div id="follow-scroll">
1524 <form action="javascript:void(0);"> 1553 <div class="panel panel-default" style="margin-bottom: 10px;">
1525 <fieldset class="tool-frame"> 1554 <div class="panel-body" style="padding:5px;">
1526 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#tool_topic"> Topic and Tags: <span class="caret"></span></h5></legend> 1555 Current topic is : <?php echo $topic_name['name_en']; ?> (<?php echo $topic_name['name_ch']; ?>, <?php echo $topic_name['name_pinyin']; ?>)
1527 <div id="tool_topic" class="collapse in"> 1556 </div>
1528 <div> Current topic is: 1557 </div>
1529 <?php echo $topic_name['name_en']; ?> (<?php echo $topic_name['name_ch']; ?>, <?php echo $topic_name['name_pinyin']; ?>) 1558
1530 <button onclick="chooseTopic(<?php echo $default_topic_id;?>)" class="btn btn-default btn-block">Change Topic</button> 1559 <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
1531 <!-- 1560 <div class="panel panel-default">
1532 <button onclick="createTopic(<?php echo $default_topic_id;?>)" class="btn btn-default btn-block">Create a New Topic</button> 1561 <div class="panel-heading" role="tab" id="headingOne">
1533 --> 1562 <h4 class="panel-title">
1563 <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
1564 Change Topic and Tags: <span class="caret"></span>
1565 </a>
1566 </h4>
1567 </div>
1568 <div id="collapseOne" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
1569 <div class="panel-body">
1570 <button onclick="chooseTopic(<?php echo $default_topic_id;?>)" class="btn btn-info btn-block">Change Topic</button>
1571 <br>
1572
1573 <div>Main tag: <?php echo $topic_tag_ch;?>
1574 <p class="text-muted">(Only the lines with the tag will be in the exported table.)</p>
1575 </div>
1576 <button onclick="editTaglist(<?php echo $default_topic_id; ?>)" class="btn btn-primary btn-block">Edit Tag List</button>
1577 <!-- <button onclick="configTagsInTopic(< ?php echo $default_topic_id;? >)" class="btn btn-default btn-block">Select Existing Tags (testing)</button> -->
1578 </div>
1579 </div>
1580 </div>
1581
1582 <div class="panel panel-default">
1583 <div class="panel-heading" role="tab" id="headingTwo">
1584 <h4 class="panel-title">
1585 <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
1586 Edit, Tag, Save text : <span class="caret"></span>
1587 </a>
1588 </h4>
1589 </div>
1590 <div id="collapseTwo" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingTwo">
1591 <div class="panel-body">
1592
1593 <!-- <button onclick="editText()" id="editTextId" class="btn btn-default">Edit text</button> -->
1594 <div class="btn-group" data-toggle="buttons">
1595 <label class="btn btn-default btn-sm active" onclick="switchToTaggingMode(this, 'tagging')">
1596 <input type="radio" name="EditMode" value="tagging" autocomplete="off" checked> Tagging
1597 </label>
1598 <label class="btn btn-default btn-sm" onclick="switchToEditingMode(this, 'editing')">
1599 <input type="radio" name="EditMode" value="editing" autocomplete="off"> Editing
1600 </label>
1601 </div>
1602 <button onclick="Undo()" class="btn btn-sm btn-default" id="buttonUndo" disabled="true" style="float:right;">Undo changes</button>
1603
1604 <div id="smart-regex-area" class="sub-group-area"><span><i><b>Smart Regex</b></i>©</span>
1605 <div id="smartRegexShowDiv"></div>
1606 <!-- <button onclick="smartRegexNew()" class="btn-lg">Add Regex Group</button></br> -->
1607 <button onclick="smartRegexNew()" id="smart_regex_new_id" class="btn btn-sm btn-info">Compose</button>
1608 <button onclick="smartRegexLoad(<?php echo $default_topic_id; ?>)" class="btn btn-sm btn-info">Load</button>
1609 <button onclick="smartRegexSave(<?php echo $default_topic_id; ?>)" class="btn btn-sm btn-default" style="float:right;">Save</button>
1610 <button onclick="smartRegexEmpty()" class="btn btn-sm btn-danger" style="float:right;margin-right:4px">Clear</button>
1611 </div>
1612 <div>
1613 <div id="tag-function-area" class="sub-group-area">
1614 Tag only for this range:
1615 <input type="text" size="5" id="regexPageStart"> to <input type="text" size="5" id="regexPageEnd"><br><br>
1616
1617 <div>
1618 <label>
1619 <input type="radio" name="tagging_mode" onclick="onTagModeChanged(this)" value="default" checked> Default
1620 </label>
1534 </div> 1621 </div>
1535 1622 <div>
1536 <div>Main tag: <?php echo $topic_tag_ch;?> 1623 <label>
1537 <p class="text-muted">(Only the lines with the tag will be in the exported table.)</p> 1624 <input type="radio" name="tagging_mode" onclick="onTagModeChanged(this)" value="with_line_break"> With line break
1625 </label>
1538 </div> 1626 </div>
1539 <button onclick="editTaglist(<?php echo $default_topic_id; ?>)" class="btn btn-default btn-block">Edit Tag List</button> 1627 <!--
1540 <button onclick="configTagsInTopic(<?php echo $default_topic_id;?>)" class="btn btn-default btn-block">Select Existing Tags (testing)</button> 1628 <div>
1541 1629 <label>
1630 <input type="radio" name="tagging_mode" onclick="onTagModeChanged(this)" value="space_within_block"> Allow space within block
1631 </label>
1632 </div>
1633 -->
1634 <div style="text-align:right"><button onclick="startToTag()" class="btn btn-primary">Tag</button></div>
1542 </div> 1635 </div>
1543 </fieldset> 1636 <button onclick="saveTextToLGService()" id="save_text_to_LGService_id" class="btn btn-primary btn-block" style="margin-top:10px;">Save text</button>
1544 <!-- 1637
1545 <fieldset class="tool-frame"> 1638 </div>
1546 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#tool_tag"> Tag: <span class="caret"></span></h5></legend> 1639 </div>
1547 <div id="tool_tag" class="collapse in"> 1640 </div>
1548 <div>The topic tag is: <?php echo $topic_tag_ch;?> 1641
1549 <p class="text-muted">(Only the lines with the tag will be in the exported table.)</p> 1642 <div class="panel panel-default">
1550 </div> 1643 <div class="panel-heading" role="tab" id="headingThree">
1551 <button onclick="editTaglist(<?php echo $default_topic_id; ?>)" class="btn btn-default btn-block">Edit Tag List</button> 1644 <h4 class="panel-title">
1552 <button onclick="configTagsInTopic(<?php echo $default_topic_id;?>)" class="btn btn-default btn-block">Select Existing Tags</button> 1645 <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
1553 1646 Replace By <i><b>Regex</b></i>: <span class="caret"></span>
1554 </div> 1647 </a>
1555 </fieldset> 1648 </h4>
1556 --> 1649 </div>
1557 <fieldset class="tool-frame"> 1650 <div id="collapseThree" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingThree">
1558 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#tool_edit"> Edit, Save, and Export: <span class="caret"></span></h5></legend> 1651 <div class="panel-body">
1559 <!--<button onclick="cleanUpTextArea()" style="height: 30px; width: 220px">Reform the text</button></br>--> 1652 Range: <input type="text" size="5" id="regexPageStart2"> to <input type="text" size="5" id="regexPageEnd2"><br><br>
1560 <!-- save text in local. replaced by saveTextToLGService, which is also saving on copy in local in development stage --> 1653 Regex: <input type="text" size="23" id="regexText"><br><br>
1561 <!-- 1654 Replace: <input type="text" size="23" id="replaceText"><br><br>
1562 <button onclick="saveText(<?php echo $section_id; ?>)" style="height: 30px; width: 220px">Save the text</button></br> 1655 <div style="text-align:right"><button onclick="replaceSmartRegex()" class="btn btn-primary btn-sm">Replace</button></div>
1563 --> 1656 </div>
1564 <div class="collapse in" id="tool_edit"> 1657 </div>
1565 <button onclick="editText()" id="editTextId" class="btn btn-default">Edit text</button> 1658 </div>
1566 <button onclick="Undo()" class="btn btn-default" id="buttonUndo" disabled="true">Undo changes</button> 1659
1567 1660 <div class="panel panel-default">
1568 <button onclick="saveTextToLGService()" id="save_text_to_LGService_id" class="btn btn-default btn-block">Save to LGService</button> 1661 <div class="panel-heading" role="tab" id="headingFour">
1569 <button onclick="exportAll(<?php echo $default_topic_id;?>)" class="btn btn-default btn-block">Export All</button> 1662 <h4 class="panel-title">
1570 Page: <input type="text" size="5" id="exportPageStart">to<input type="text" size="5" id="exportPageEnd"> 1663
1571 <button onclick="exportPage(<?php echo $default_topic_id;?>)" class="btn btn-default btn-sm">Export</button></br> 1664 <a class="collapsed" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseFour" aria-expanded="false" aria-controls="collapseFour">
1572 </div> 1665 <!-- Tag by <i><b>Smart Regex</b></i>©:<span class="caret"></span> -->
1573 1666 Preview<span class="caret"></span>
1574 1667 </a>
1575 </fieldset> 1668 </h4>
1576 1669 </div>
1577 <fieldset class="tool-frame"> 1670 <div id="collapseFour" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingFour">
1578 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#tool_regex"> Tag by <i><b>Smart Regex</b></i>©:<span class="caret"></span></h5></legend> 1671 <div class="panel-body">
1579 <!-- rename: "Replace By <i><b>Smart Regex</b></i>©:" to "Tag by Smart Regex" --> 1672
1580 1673 <div>
1581 <div id="tool_regex" class="collapse in"> 1674 <label>
1582 <div id="smartRegexShowDiv"></div><br> 1675 <input type="radio" name="export_mode" onclick="onExportModeChanged(this)" value="all" checked> All
1583 <!-- <button onclick="smartRegexNew()" class="btn-lg">Add Regex Group</button></br> 1676 </label>
1584 --> 1677 </div>
1585 <button onclick="smartRegexNew()" id="smart_regex_new_id" class="btn btn-default btn-block">Compile a new Regex</button> 1678 <div>
1586 <!-- rename "Search by Patterns (Smart Regex)" to "Compile a new Regex"--> 1679 <label>
1587 1680 <input type="radio" name="export_mode" onclick="onExportModeChanged(this)" value="pages">
1588 <button onclick="smartRegexLoad(<?php echo $default_topic_id; ?>)" class="btn btn-default">Load</button> 1681 Page: <input type="text" size="5" id="exportPageStart"> to <input type="text" size="5" id="exportPageEnd">
1589 <button onclick="smartRegexSave(<?php echo $default_topic_id; ?>)" class="btn btn-default">Save</button> 1682 </div>
1590 <button onclick="smartRegexEmpty()" class="btn btn-default">Clear</button></br></br> 1683
1591 Tag only for this range: </br> 1684 <div style="text-align:right"><button onclick="startExport(<?php echo $default_topic_id;?>)" class="btn btn-primary btn-sm">Preview</button></div>
1592 <input type="text" size="5" id="regexPageStart">to<input type="text" size="5" id="regexPageEnd"></br> 1685 </div>
1593 <button onclick="replaceSmartRun()" class="btn btn-default">Tag</button> 1686
1594 <button onclick="replaceSmartRunWithBr()" class="btn btn-default">Tag (with line break)</button> 1687 </div>
1595 <!-- <button onclick="replaceSmartRunSpace()" class="btn-lg">Run(Allow space between Group)</button></br> 1688 </div>
1596 --> 1689
1597 <button onclick="replaceSmartRunSpace()" class="btn btn-default btn-block">Tag (Allow space within block)</button></br> 1690 </div>
1598 1691
1599 <!-- developing...-->
1600 <!--
1601 <button onclick="genRegexWindowOpen()" id="gen_regex_window_open_id" class="btn btn-default btn-block btn-xs">Open GenRegex (developing...)</button></br>
1602 -->
1603 </div>
1604 </fieldset>
1605
1606
1607 <?php
1608 if ($default_topic_id == 1) {
1609 ?>
1610 <fieldset class="tool-frame">
1611 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#tool_rule"> Tag by rule: <span class="caret"></span></h5></legend>
1612 <div id="tool_rule" class="collapse out">
1613 <button onclick="tagNameWithLastName()" class="btn btn-default">Tag Word Begin With Surname</button></br>
1614 <button onclick="tagNameWithLastName2()" class="btn btn-default btn-sm">Tag Word Begin With</button> <input type="text" size="2" id="surname">
1615 </div>
1616 <!--<button onclick="tagTime()" style="height: 30px; width: 220px">Tag Time</button></br>-->
1617 <!--<button onclick="tagBiogAddr()" style="height: 30px; width: 220px">Tag BiogAddr</button></br>-->
1618 </fieldset>
1619
1620 <?php }?>
1621
1622
1623
1624 <fieldset class="tool-frame">
1625 <legend><h5 class="tool-topic" data-toggle="collapse" data-target="#tool_replace_by"> Replace By <i><b>Regex</b></i>: <span class="caret"></span></h5></legend>
1626 <div class="collapse out" id="tool_replace_by">
1627 Range: <input type="text" size="5" id="regexPageStart2">to<input type="text" size="5" id="regexPageEnd2"><br>
1628 Regex: <input type="text" size="23" id="regexText"></br>
1629 Replace: <input type="text" size="23" id="replaceText"><br>
1630 <button onclick="replaceSmartRegex()" class="btn btn-default btn-sm">Replace!</button>
1631 </div>
1632 </fieldset>
1633 </form>
1634 </div> 1692 </div>
1635 </td> 1693 <div id="toRight" onclick="moveToolPanel('right')"><span class="glyphicon glyphicon-arrow-right switch-btn" style="display:none"></span></div>
1636 </tr> 1694 </div>
1637 1695
1638 </table> 1696 </div>
1697
1698 </div>
1639 1699
1640 1700
1641 1701
1642 1702
1643 </body> 1703 </body>