diff js/taggingtext.js @ 47:886f43b26ee2 extractapp

move/remove develop folder
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 17 Mar 2015 10:54:13 +0100
parents
children b2c1fae5cf6a
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/js/taggingtext.js	Tue Mar 17 10:54:13 2015 +0100
@@ -0,0 +1,898 @@
+// === for taggingtext.php ===
+var stringBeforeChange="";
+var stringBeforeChangeStack = [];
+var lastAddTag="";
+
+window.onbeforeunload = function() {
+    return "Are you sure?";
+};
+
+
+/*
+$(document).on("mouseup", function (e) {
+    e.stopPropagation();
+    $('.questionMarkClass').remove();
+    $('.tagItemDivClass').remove();
+    alert("Remove");
+});
+
+
+$(document).on("click", '.questionMarkClass', function (e) {
+    e.stopPropagation();
+});
+*/
+function tagTime() {
+    saveUndoText();
+    var el = document.getElementById("editable-area");
+    var str="" + el.innerHTML;
+
+    var regexText=/(<?php echo $wordlistArray[0][2]; ?>)(○?)(一|二|三|四|五|六|七|八|九)?(○?)(十)?(○?)(一|二|三|四|五|六|七|八|九|元|十)(○?)(年)/g;
+    var replaceText="<time>$1$2$3$4$5$6$7$8$9</time>";
+    var matchedCount = str.match(regexText).length;
+    str = str.replace(regexText, replaceText);
+    
+    var regexText=/(?!(>))(<?php echo $wordlistArray[0][2]; ?>)/g;
+    var replaceText="<time>$1$2</time>";
+    matchedCount += str.match(regexText).length;
+    el.innerHTML = str.replace(regexText, replaceText);
+    
+    var regexText=/(一|二|三|四|五|六|七|八|九)?(○?)(十)?(○?)(一|二|三|四|五|六|七|八|九|元|十)(○?)(年)(?!(<))/g;
+    var replaceText="<time>$1$2$3$4$5$6$7</time>";
+    matchedCount += str.match(regexText).length;
+    el.innerHTML = str.replace(regexText, replaceText);
+    
+    alert( "Tagged "+matchedCount+" entities!" );
+}
+
+function removeTagNewDiv( eventObject, tagName, tagObject ) {
+    saveUndoText();
+    var newdiv = document.createElement("div");
+    newdiv.id = "questionMarkId";
+    newdiv.setAttribute("class", "questionMarkClass");
+    newdiv.style.cssText = 'top:'+eventObject.pageY+'; left:'+eventObject.pageX+'; position:absolute; background-color: white; border:1px solid black; padding: 5px';
+    newdiv.innerHTML = "Tag: "+tagName+"<br>Value: "+tagObject.text()+"<br>";
+    
+    
+    var newbutton = $('<button>Remove this</button>').mouseup(function (e2) {
+        var textKeep = $(this).parent().parent().html();
+        var regexText=/<div(.*?)<\/div>/g;
+        var replaceText="";
+        textKeep = textKeep.replace(regexText, replaceText);
+    
+        $(this).parent().parent().replaceWith( textKeep );
+    });
+    newbutton.appendTo(newdiv);
+    
+    var newbutton = $('<button>Remove this(with newline)</button>').mouseup(function (e2) {
+        var textKeep = $(this).parent().parent().html();
+        var regexText=/<div(.*?)<\/div>/g;
+        var replaceText="";
+        textKeep = textKeep.replace(regexText, replaceText);
+    
+        var newLineBefore = $(this).parent().parent().prev();
+        if ( newLineBefore.prop("tagName") == "BR" ) {
+            $(this).parent().parent().prev().replaceWith( );
+        }
+        $(this).parent().parent().replaceWith( textKeep );
+    });
+    newbutton.appendTo(newdiv);
+    
+    var newbutton = $('<button>Remove all</button>').mouseup(function (e2) {
+        var textKeep = $(this).parent().parent().html();
+        var regexText=/<div(.*?)<\/div>/g;
+        var replaceText="";
+        textKeep = textKeep.replace(regexText, replaceText);
+    
+        $(this).parent().parent().replaceWith( textKeep );
+        
+        var el = document.getElementById("editable-area");
+        var regexText=new RegExp("<"+tagName+">("+textKeep+")</"+tagName+">", "g");
+        var replaceText="$1";
+        var str="" + el.innerHTML;
+        
+        if ( str.match(regexText)==null ) {
+            alert( "Removed 1 entity!" );
+        } else {
+            alert( "Removed "+(parseInt(str.match(regexText).length)+1)+" entities!" );
+        }
+        el.innerHTML = str.replace(regexText, replaceText);
+    });
+    newbutton.appendTo(newdiv);
+    
+    var newbutton = $('<button>Remove all(with newline)</button>').mouseup(function (e2) {
+        var textKeep = $(this).parent().parent().html();
+        var regexText=/<div(.*?)<\/div>/g;
+        var replaceText="";
+        textKeep = textKeep.replace(regexText, replaceText);
+    
+        $(this).parent().remove();
+        
+        var el = document.getElementById("editable-area");
+        var regexText=new RegExp("<br><"+tagName+">("+textKeep+")</"+tagName+">", "g");
+        var replaceText="$1";
+        var str="" + el.innerHTML;
+        
+        alert( "Removed "+str.match(regexText).length+" entities!" );
+        el.innerHTML = str.replace(regexText, replaceText);
+    });
+    newbutton.appendTo(newdiv);
+    
+    tagObject.append(newdiv);
+}
+
+
+
+function removeTagTitle( range, container ) {
+    saveUndoText();
+    range.deleteContents();
+    
+    lastAddTag = $('#RemoveTitletagType').val();
+    
+    var stringtemp = container.innerHTML;
+    
+    if ( $('#RemoveTitletagName').val() == "" ) {
+        var regexText="<"+lastAddTag+">〈(.*?)〉</"+lastAddTag+">";
+        var replaceText="";
+        stringtemp = stringtemp.replace(new RegExp(regexText, "g"), replaceText);
+        
+        var regexText="<"+lastAddTag+">(.*?)</"+lastAddTag+">";
+        var replaceText="$1";
+        stringtemp = stringtemp.replace(new RegExp(regexText, "g"), replaceText);
+    } else {
+        var regexText="<"+lastAddTag+">〈"+$('#RemoveTitletagName').val()+"〉</"+lastAddTag+">";
+        var replaceText="";
+        stringtemp = stringtemp.replace(new RegExp(regexText, "g"), replaceText);
+        
+        var regexText="<"+lastAddTag+">("+$('#RemoveTitletagName').val()+")</"+lastAddTag+">";
+        var replaceText="$1";
+        stringtemp = stringtemp.replace(new RegExp(regexText, "g"), replaceText);
+    }
+    
+    var newdiv = document.createElement("aaaa");
+    newdiv.innerHTML = stringtemp;
+    range.insertNode(newdiv);
+    
+    var el = document.getElementById("editable-area");
+    
+    var regexText=/<aaaa>/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    var regexText=/<\/aaaa>/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    $('.tagItemDivClass').remove();
+}
+
+function addTagTitle( range, container ) {
+    saveUndoText();
+    lastAddTag = $('#TitletagType').val();
+    var tag = "<"+$('#TitletagType').val()+">〈"+$('#TitletagName').val()+"〉</"+$('#TitletagType').val()+">";
+    range.deleteContents();
+    var stringtemp = container.innerHTML;
+
+    var regexText=/<br>/g;
+    var replaceText="<br>"+tag;
+    stringtemp = stringtemp.replace(regexText, replaceText);
+    
+    var newdiv = document.createElement("aaaa");
+    newdiv.innerHTML = tag+stringtemp;
+    range.insertNode(newdiv);
+    
+    var el = document.getElementById("editable-area");
+    
+
+    var regexText=/<aaaa>/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    var regexText=/<\/aaaa>/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    $('.tagItemDivClass').remove();
+}
+
+function cleanUpTextArea() {
+    var el = document.getElementById("editable-area");
+    
+    var regexText=/<div>/gi;
+    var replaceText='<br>';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    var regexText=/<\/div>/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    
+    var regexText=/<span style="(.*?)">/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+    
+    var regexText=/<\/span>/gi;
+    var replaceText='';
+    el.innerHTML = el.innerHTML.replace(regexText, replaceText);
+}
+
+function Undo() {
+    if ( stringBeforeChangeStack.length > 0 ) {
+        var el = document.getElementById("editable-area");
+        el.innerHTML = stringBeforeChangeStack.pop();
+    } else {
+        var el = document.getElementById("buttonUndo");
+        el.disabled = true;
+    }
+}
+
+function saveUndoText() {
+    var el = document.getElementById("editable-area");
+    //stringBeforeChange = el.innerHTML;
+    stringBeforeChangeStack.push(el.innerHTML); 
+    var el = document.getElementById("buttonUndo");
+    el.disabled = false;
+}
+
+function editText() {
+    var el = document.getElementById("editable-area");
+    if ( $("#editTextId").html() == "Edit the text" ) {
+        saveUndoText();
+        el.contentEditable = true;
+        $("button").attr("disabled", true);
+        $("#editTextId").attr("disabled", false);
+        $("#editTextId").html("Edit completed!");
+    } else {
+        el.contentEditable = false;
+        cleanUpTextArea();
+        $("button").attr("disabled", false);
+        $("#editTextId").html("Edit the text");
+    }
+}
+
+
+function saveText(section_id) {
+    var el = document.getElementById("editable-area");
+    $.ajax({
+        url : './'+section_id,
+        async : false,
+        type : 'POST',
+        data : 'func=SaveFullText'+'&text='+encodeURIComponent(el.innerHTML)+'&filename='+section_id,
+        // data : 'func=SaveFullText'+'&text='+el.innerHTML+'&filename='+section_id
+        success: function (e) {
+            alert("Saved!");
+        },
+        error: function (e) {
+            alert("Haven't saved!");
+        }
+    }).done(function(result) {
+    });
+    
+    
+}
+
+
+
+function preg_quote (str, delimiter) {
+  // http://kevin.vanzonneveld.net
+  // +   original by: booeyOH
+  // +   improved by: Ates Goral (http://magnetiq.com)
+  // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+  // +   bugfixed by: Onno Marsman
+  // +   improved by: Brett Zamir (http://brett-zamir.me)
+  // *     example 1: preg_quote("$40");
+  // *     returns 1: '\$40'
+  // *     example 2: preg_quote("*RRRING* Hello?");
+  // *     returns 2: '\*RRRING\* Hello\?'
+  // *     example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
+  // *     returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
+  return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&');
+}
+
+function replaceRegex() {
+    saveUndoText();
+    
+    var startPage = $('#regexPageStart2').val();
+    var endPage = $('#regexPageEnd2').val();
+    var el = document.getElementById("editable-area");
+    var str="" + el.innerHTML;
+    
+    var regexText=document.getElementById("regexText").value;
+    var replaceText=document.getElementById("replaceText").value;
+    var str="" + el.innerHTML;
+    
+    if ( startPage == "" ) {
+        alert( "Tagged "+str.match(new RegExp(regexText, "g")).length+" entities!" );
+        el.innerHTML = str.replace(new RegExp(regexText, "g"), replaceText);
+    } else {
+        var regexText2="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】";
+        var partString = ""+str.match(new RegExp(regexText2, "g"));
+        alert(partString);
+        
+        alert( "Tagged "+partString.match(new RegExp(regexText, "g")).length+" entities!" );
+        var resultString = partString.replace(new RegExp(regexText, "g"), replaceText);
+        
+        str="" + el.innerHTML;
+        el.innerHTML = str.replace(new RegExp(regexText, "g"), resultString);
+    }
+    
+    //document.styleSheets[0].addRule("tag001", "color:green;")
+}
+
+
+//Tagging Items
+function getSelected() {
+    if(window.getSelection) {
+        return window.getSelection();
+    } else if (document.getSelection) { 
+        return document.getSelection(); 
+    } else {
+        var selection = document.selection && document.selection.createRange();
+        if(selection.text) {
+            return selection.text;
+        }
+        return false;
+    }
+    return false;
+}
+
+function tagStringWithTag( stringValue, tag ) {
+    saveUndoText();
+    var el = document.getElementById("editable-area");
+    var regexText="("+String(stringValue)+")";
+    if ( tag=="person") {
+        var replaceText="<br><"+tag+">$1</"+tag+">";
+    } else {
+        var replaceText="<"+tag+">$1</"+tag+">";
+    }
+    var str="" + el.innerHTML;
+
+    $('.tagItemDivClass').remove();
+    alert( "Tagged "+str.match(new RegExp(regexText, "g")).length+" entities!" );
+    el.innerHTML = str.replace(new RegExp(regexText, "g"), replaceText);
+}
+
+
+function tagwithtitle( range, stringSelection ) {
+    saveUndoText();
+    range.deleteContents();
+    //var newdiv = document.createElement("br");
+    //range.insertNode(newdiv);
+    range.insertNode(document.createTextNode("〈"+stringSelection+"〉"));
+    var newdiv = document.createElement("br");
+    range.insertNode(newdiv);
+    
+    $('.tagItemDivClass').remove();
+}
+
+function tagNameWithLastName() {
+    saveUndoText();
+    var el = document.getElementById("editable-area");
+    var regexText=/(○|】|^)(王|李|張|趙|劉|陳|楊|吳|黃|黄|朱|孫|郭|胡|呂|高|宋|徐|程|林|鄭|范|何|韓|曹|馬|許|田|馮|杜|周|曾|汪|蘇|董|方|蔡|梁|石|謝|賈|薛|彭|崔|唐|潘|鄧|史|錢|侯|魏|羅|葉|沈|孟|姚|傅|丁|章|蕭|蔣|盧|陸|袁|晁|譚|邵|歐陽|孔|詹|俞|尹|廖|閻|洪|夏|雷|葛|文|柳|陶|毛|丘|龔|蒲|邢|郝|龐|安|裴|折|施|游|金|鄒|湯|虞|嚴|鍾)([^○(舉人|縣人|歲貢|間任)]{1,3}|○[^○])(?=(○|$))/g;
+    var replaceText="$1<br><person>$2$3</person>$4";
+    var str="" + el.innerHTML;
+    
+    alert( "Tagged "+str.match(regexText).length+" entities!" );
+    el.innerHTML = str.replace(regexText, replaceText);
+}
+
+function tagNameWithLastName2() {
+    saveUndoText();
+    var el = document.getElementById("editable-area");
+    var regexText="(○|】|^)("+$('#surname').val()+")([^○(舉人|縣人|歲貢|間任)]{1,3}|○[^○])(?=(○|$))";
+    var replaceText="$1<br><person>$2$3</person>$4";
+    var str="" + el.innerHTML;
+    
+    alert( "Tagged "+str.match(new RegExp(regexText, "g")).length+" entities!" );
+    el.innerHTML = str.replace(new RegExp(regexText, "g"), replaceText);
+}
+
+function tagBiogAddr() {
+    saveUndoText();
+    var el = document.getElementById("editable-area");
+    var str="" + el.innerHTML;
+
+    var regexText=/(○)([^○]{1,6})(○?)(人)/g;
+    var replaceText="$1<biog_addr>$2</biog_addr>$3$4";
+    el.innerHTML = str.replace(regexText, replaceText);
+    
+    alert( "Tagged "+str.match(regexText).length+" entities!" );
+}
+
+function smartRegexNew() {
+    $('#smartRegexPopUpDiv').css("display", "block");
+    $('#smartRegexPopUpDiv').css("background-color", "White");
+    $('#smartRegexPopUpDiv').css("width", "400px");
+    $('#smartRegexPopUpDiv').css("height", "300px");
+    $('#smartRegexPopUpDiv').css("top", "170px");
+    $('#smartRegexPopUpDiv').css("left", "-400px");
+    $('#smartRegexPopUpDiv').css("border", "1px solid black");
+    $('#smartRegexPopUpDiv').css("padding", "5px");
+    
+    $('#smartRegexPopUpAdd').attr("disabled", false);
+    $('#smartRegexPopUpEdit').attr("disabled", "disabled");
+    $('#smartRegexPopUpDel').attr("disabled", "disabled");
+    $('#smartRegexPopUpBack').attr("disabled", "disabled");
+    $('#smartRegexPopUpFor').attr("disabled", "disabled");
+}
+
+function replaceSmartClose() {
+    $('#smartRegexPopUpDiv').css("display", "none");
+    $("#smartRegexPopUpSelectWord").val("NULL");
+    $("#smartRegexPopUpText").val("");
+    $("#smartRegexPopUpName").val("");
+}
+
+function replaceSmartEdit(){
+    thisObject = $('#smartRegexPopUpDiv').attr("editID");
+
+    $('#smartRegexShowDiv > #'+thisObject).attr("class", "span_"+$("#smartRegexPopUpSelectTag").val());
+    $('#smartRegexShowDiv > #'+thisObject).attr("regexText", $("#smartRegexPopUpText").val());
+    $('#smartRegexShowDiv > #'+thisObject).attr("regexReplace", $("#smartRegexPopUpSelectTag").val());
+    $('#smartRegexShowDiv > #'+thisObject).text($("#smartRegexPopUpName").val());  // smartRgextPopUpName.val() is the name of this regex
+
+}   
+
+function replaceSmartDel() {
+    thisObject = $('#smartRegexPopUpDiv').attr("editID");
+    $('#smartRegexShowDiv > #'+thisObject).remove();
+}
+
+function replaceSmartFor() {
+    thisObject = $('#smartRegexPopUpDiv').attr("editID");
+    //var wahaha = $('#'+thisObject).clone();
+    //var hahawa = $('#'+thisObject).next();
+    //$('#'+thisObject).remove();
+    //wahaha.insertAfter(hahawa);
+    $('#smartRegexShowDiv > #'+thisObject).insertAfter( $('#'+thisObject).next() );
+}
+
+function replaceSmartBack() {
+    thisObject = $('#smartRegexPopUpDiv').attr("editID");
+    //var wahaha = $('#'+thisObject).clone();
+    //var hahawa = $('#'+thisObject).prev();
+    //$('#'+thisObject).remove();
+    //wahaha.insertBefore(hahawa);
+    $('#smartRegexShowDiv > #'+thisObject).insertBefore( $('#'+thisObject).prev() );
+}
+
+function replaceSmartAdd() {
+    var newdiv = document.createElement("span");
+    newdiv.innerHTML = " "+$("#smartRegexPopUpName").val()+" ";
+    $(newdiv).css("border", "1px solid black");
+    $(newdiv).css("width", "100px");
+    
+    $(newdiv).attr("class", "span_"+$("#smartRegexPopUpSelectTag").val());
+    $(newdiv).attr("id", "span_"+$("#smartRegexPopUpName").val());
+    $(newdiv).attr("regexText", $("#smartRegexPopUpText").val());
+    $(newdiv).attr("regexReplace", $("#smartRegexPopUpSelectTag").val());
+    
+    $('#smartRegexShowDiv').append(newdiv);
+    
+    replaceSmartClose();
+}
+
+$(document).on("click", '#smartRegexShowDiv > span', function (e) {
+    
+    $('#smartRegexPopUpDiv').css("display", "block");
+    $('#smartRegexPopUpDiv').css("background-color", "White");
+    $('#smartRegexPopUpDiv').css("width", "400px");
+    $('#smartRegexPopUpDiv').css("height", "300px");
+    $('#smartRegexPopUpDiv').css("top", "100px");
+    $('#smartRegexPopUpDiv').css("left", "-400px");
+    $('#smartRegexPopUpDiv').css("border", "1px solid black");
+    //$('#smartRegexPopUpDiv').css("padding", "5px");    
+    
+
+    $('#smartRegexPopUpDiv').attr("editID", $(this).attr("id"));
+    
+    
+    var _id = $(this).attr("id");
+    var aa = document.getElementById(_id);
+    var name = aa.textContent;
+   
+    $('#smartRegexPopUpName').val(name);
+    // $('#smartRegexPopUpName').val($(this).html());
+    // why there is a <span i="transmark"></span> inbetween? 
+
+
+    $('#smartRegexPopUpText').val($(this).attr("regexText"));
+    $('#smartRegexPopUpSelectTag').val($(this).attr("regexReplace"));
+    
+    $('#smartRegexPopUpAdd').attr("disabled", "disabled");
+    $('#smartRegexPopUpEdit').attr("disabled", false);
+    $('#smartRegexPopUpDel').attr("disabled", false);
+    $('#smartRegexPopUpBack').attr("disabled", false);
+    $('#smartRegexPopUpFor').attr("disabled", false);
+});
+
+function smartRegexEmpty() {
+    $('#smartRegexShowDiv').html("");
+}
+
+function replaceSmartRunWithBr() {
+
+    var replaceSmartRegexString = "";
+    var replaceSmartReplaceString = "";
+    var count=1;
+    
+    saveUndoText();
+    
+    $('#smartRegexShowDiv').children('span').each(function () {
+        replaceSmartRegexString += "(" + $(this).attr("regexText") + ")";
+        if ( $(this).attr("regexReplace") == "notag" || $(this).attr("regexReplace") == "NOTAG") {
+            replaceSmartReplaceString += "$" + count;
+        } else if ( $(this).attr("regexReplace") == "title" ) {
+            replaceSmartReplaceString += "<br>〈" + "$" + count + "〉<br>";
+        } else {
+            // with <br> before
+            replaceSmartReplaceString += "<br><" + $(this).attr("regexReplace") + ">" + "$" + count + "</"+ $(this).attr("regexReplace") +">";
+        }
+        count++;
+    });
+        
+        
+    var startPage = $('#regexPageStart').val();
+    var endPage = $('#regexPageEnd').val();
+    var el = document.getElementById("editable-area");
+    var str="" + el.innerHTML;
+    
+    if ( startPage == "" ) {
+        alert( "Tagged "+str.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+        el.innerHTML = str.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+    } else {
+        var regexText="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】";
+        var partString = ""+str.match(new RegExp(regexText, "g"));
+        alert(partString);
+        
+        alert( "Tagged "+partString.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+        var resultString = partString.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+        
+        str="" + el.innerHTML;
+        el.innerHTML = str.replace(new RegExp(regexText, "g"), resultString);
+    }
+}
+
+function replaceSmartRun() {
+
+    var replaceSmartRegexString = "";
+    var replaceSmartReplaceString = "";
+    var count=1;
+    
+    saveUndoText();
+    
+    $('#smartRegexShowDiv').children('span').each(function () {
+        replaceSmartRegexString += "(" + $(this).attr("regexText") + ")";
+        if ( $(this).attr("regexReplace") == "notag" || $(this).attr("regexReplace") == "NOTAG" ) {
+            replaceSmartReplaceString += "$" + count;
+        } else if ( $(this).attr("regexReplace") == "title" ) {
+            replaceSmartReplaceString += "<br>〈" + "$" + count + "〉<br>";
+        } else {
+            replaceSmartReplaceString += "<" + $(this).attr("regexReplace") + ">" + "$" + count + "</"+ $(this).attr("regexReplace") +">";
+        }
+        count++;
+    });
+        
+        
+    var startPage = $('#regexPageStart').val();
+    var endPage = $('#regexPageEnd').val();
+    var el = document.getElementById("editable-area");
+    var str="" + el.innerHTML;
+    
+    if ( startPage == "" ) {
+        alert( "Tagged "+str.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+        el.innerHTML = str.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+    } else {
+        var regexText="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】";
+        var partString = ""+str.match(new RegExp(regexText, "g"));
+        alert(partString);
+        
+        alert( "Tagged "+partString.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+        var resultString = partString.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+        
+        str="" + el.innerHTML;
+        el.innerHTML = str.replace(new RegExp(regexText, "g"), resultString);
+    }
+}
+
+function replaceSmartRunSpace() {
+
+    var replaceSmartRegexString = "";
+    var replaceSmartReplaceString = "";
+    var count=1;
+    saveUndoText();
+    
+    $('#smartRegexShowDiv').children('span').each(function () {
+        //alert($(this).attr("regexText"));
+        replaceSmartRegexString += "(" + $(this).attr("regexText") + ")(○*)";
+        if ( $(this).attr("regexReplace") == "notag" || $(this).attr("regexReplace") == "NOTAG") {
+            replaceSmartReplaceString += "$" + count;
+        } else if ( $(this).attr("regexReplace") == "title" ) {
+            replaceSmartReplaceString += "<br>〈" + "$" + count + "〉<br>";
+        } else {
+            replaceSmartReplaceString += "<" + $(this).attr("regexReplace") + ">" + "$" + count + "</"+ $(this).attr("regexReplace") +">";
+        }
+        count++;
+        replaceSmartReplaceString += "$" + count;
+        count++;
+    });
+    
+    var startPage = $('#regexPageStart').val();
+    var endPage = $('#regexPageEnd').val();
+    var el = document.getElementById("editable-area");
+    var str="" + el.innerHTML;
+    
+    if ( startPage == "" ) {
+        alert( "Tagged "+str.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+        el.innerHTML = str.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+    } else {
+        var regexText="【<a([^<>]*?)>"+startPage+"</a>】(.*?)【<a([^<>]*?)>"+endPage+"</a>】";
+        var partString = ""+str.match(new RegExp(regexText, "g"));
+        alert(partString);
+        
+        alert( "Tagged "+partString.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+        var resultString = partString.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+        
+        str="" + el.innerHTML;
+        el.innerHTML = str.replace(new RegExp(regexText, "g"), resultString);
+    }
+    
+    //alert( "Tagged "+str.match(new RegExp(replaceSmartRegexString, "g")).length+" entities!" );
+    //el.innerHTML = str.replace(new RegExp(replaceSmartRegexString, "g"), replaceSmartReplaceString);
+}
+
+function smartRegexSave(topic_id) {
+    console.log("topic_id"+topic_id);
+    var name=prompt("Please enter this Regex name",RegexLoadedName);
+
+    if (name!=null){
+        $.ajax({
+            type : 'POST',
+            url : './TaggingText',
+            async : false,
+            data : 'func=SmartRegexSave'+'&text='+encodeURIComponent($('#smartRegexShowDiv').html())+'&filename='+name+'&topic_id='+topic_id,
+            error: function (result) {
+                alert("Error");
+            },
+            success: function (result) {
+                var obj = jQuery.parseJSON(result);
+
+                if (obj == "ErrorDB") {
+                    alert("Error when saving to database!!");
+
+                } else if (obj == "ForceSave") {
+                    var retVal = confirm("You will over write the previous regex file. Do you want to proceed?");
+                    
+                    if( retVal == true ){
+                        // update regex file
+                        $.ajax({
+                            type : 'POST',
+                            url : './TaggingText',
+                            async : false,
+                            data : 'func=SmartRegexSave'+'&text='+encodeURIComponent($('#smartRegexShowDiv').html())+'&filename='+name+'&topic_id='+topic_id+'&forcesave=1',
+                            error: function (result) {
+                                alert("Error");
+                            },
+                            success: function (result) {
+                                alert("Update regex file.");
+                            }
+                        });
+                    }else{
+                        alert("You have not saved the regex file.");
+                    }
+
+                } else {
+                    alert("Saved!");
+                }
+            }
+        }).done(function(result) {
+        });
+    }
+}
+
+function smartRegexLoad(topic_id) {
+    $('#load_regex_div').html("");
+    $('#load_regex_div').css("display", "block");
+    $('#load_regex_div').css("border", "1px solid black");
+    $('#load_regex_div').css("background-color", "White");
+    $('#load_regex_div').css("width", "300px");
+    $('#load_regex_div').css("height", "70px");
+    $('#load_regex_div').css("top", "100px");
+    $('#load_regex_div').css("left", "-300px");
+    
+    var newselect = document.createElement("select");
+    newselect.id = "loadRegexSelect";
+            
+    $.ajax({
+        type: 'POST', 
+        url: './TaggingText',
+        dataType: 'json',
+        data: "func=SmartRegexLoad&topic_id="+topic_id,
+        //cache: false,
+        success: function (data) {
+            $.each(data, function(index, element) {
+                // index is the filename (without '.txt')
+                // element is the content in the file
+                newselect.innerHTML += "<option value=\""+index+"\">"+index+"</option>\n";
+                //alert(index);
+                //alert(element);
+                var newdiv = document.createElement("div");
+                $(newdiv).css("display", "none");
+                $(newdiv).html(element);
+                
+                $(newdiv).attr("id", "div_"+index);
+                $('#load_regex_div').append(newdiv);
+            });
+            
+            
+        },
+        error: function (data) {
+            console.log("SmartRegexLoad fails");
+        }
+
+    });
+
+    /*
+    $.ajax({
+        type: 'POST', 
+        url: '../models/_extractapp_func.php',
+        dataType: 'json',
+        data: "func=SmartRegexLoad",
+        //cache: false,
+        success: function (data) {
+            $.each(data, function(index, element) {
+                newselect.innerHTML += "<option value=\""+index+"\">"+index+"</option>\n";
+                //alert(index);
+                //alert(element);
+                var newdiv = document.createElement("div");
+                $(newdiv).css("display", "none");
+                $(newdiv).html(element);
+                $(newdiv).attr("id", "div_"+index);
+                $('#load_regex_div').append(newdiv);
+            });
+            
+        },
+        error: function (data) {
+            console.log("SmartRegexLoad fails");
+        }
+
+    });
+    */
+    
+    $('#load_regex_div').append(newselect);
+    var newbutton = document.createElement("button");
+    $(newbutton).html("Load");
+    $(newbutton).addClass("btn btn-info");
+    $(newbutton).attr("onclick", "loadRegexAdd()");
+    $('#load_regex_div').append(newbutton);
+    var newbutton = document.createElement("button");
+    $(newbutton).html("Close");
+    $(newbutton).addClass("btn btn-default");
+    $(newbutton).attr("onclick", "$('#load_regex_div').css(\"display\", \"none\");");
+    $('#load_regex_div').append(newbutton);
+}
+
+var RegexLoadedName = "";
+function loadRegexAdd() {
+    RegexLoadedName = $('#loadRegexSelect').val();
+    var divName = "#div_"+RegexLoadedName;
+    var name = $(divName).html();
+    $('#smartRegexShowDiv').html(name );
+    $('#load_regex_div').css("display", "none");
+}
+// ===
+
+
+// === for editwordlist.php ===
+function addNewList() {
+    var el = document.getElementById("listNameText");
+    $.ajax({
+        //url : '../../models/_extractapp_func.php',
+        url : './Editwordlist',
+        async : false,
+        type : 'POST',
+        data : 'func=AddNewList'+'&text='+el.value,
+        success: function (e) {
+            alert("Added!");
+            document.location.reload(true);
+        },
+        error: function (e) {
+            console.log("error when add new list");
+            alert("Haven't added new list!!");
+        }
+    }).done(function(result) {
+        
+    });
+}
+
+function saveWordlist(id ) {
+    var el = document.getElementById("editable-area");
+    $.ajax({
+        url : './Editwordlist',
+        async : false,
+        type : 'POST',
+        data : 'func=SaveWordlist'+'&text='+el.innerHTML+'&filename='+id,
+        success: function (e) {
+            alert("Saved!");
+        },
+        error: function (e) {
+            alert("Haven't saved!");
+        }
+    }).done(function(result) {
+        
+    });
+    
+}
+
+function editWordlistText( id ) {
+    var el = document.getElementById("editable-area");
+    el.contentEditable = true;
+}
+
+function replaceRegex() {
+    var el = document.getElementById("editable-area");
+    var regexText=document.getElementById("regexText").value;
+    var replaceText=document.getElementById("replaceText").value;
+    var str="" + el.innerHTML;
+    el.innerHTML = str.replace(new RegExp(regexText, "g"), replaceText);
+}
+
+function showListContent( id ) {
+    var xhr = new XMLHttpRequest();
+    xhr.onreadystatechange = process;
+    xhr.open("POST", "../data/wordlist/"+id+".txt?t=" + Math.random(), true);
+    // TODO: should show the latest wordlist file. eg. id_timestamp.txt, rather than open the original id.txt file 
+
+
+    xhr.send();
+
+    function process() {
+        if (xhr.readyState == 4) {
+            var el = document.getElementById("editable-area");
+            var str = xhr.responseText
+            var regexText=/\n/g;
+            var replaceText="<br>\n";
+            el.innerHTML = str.replace(regexText, replaceText);
+            
+            document.getElementById("button-area").innerHTML=
+            "<form action=\"javascript:void(0);\"> \
+                <fieldset><legend>Edit:</legend> \
+                    <button id=\"buttonEditText\" onclick=\"editWordlistText("+id+")\" style=\"height: 30px; width: 220px\">Edit the text</button></br> \
+                    <button id=\"buttonSaveText\" onclick=\"saveWordlist("+id+")\" style=\"height: 30px; width: 220px\">Save the text</button> \
+                </fieldset> \
+                <fieldset><legend>Replace By Regex:</legend> \
+                    Regex: <input type=\"text\" size=\"30\" id=\"regexText\"></br> \
+                    Replace: <input type=\"text\" size=\"30\" id=\"replaceText\"><br> \
+                    <button onclick=\"replaceRegex()\">Replace!</button> \
+                </fieldset> \
+            </form>";
+        }
+    }
+}
+
+// ============
+
+// === for edittaglist.php ===
+function editTaglist(topic_id) {
+    var form = document.createElement("form");
+    form.setAttribute("method", "post");
+    form.setAttribute("action", "./EditTaglist");
+    form.setAttribute("target", "_blank");
+    
+    var hiddenField = document.createElement("input");      
+    hiddenField.setAttribute("name", "topic_id");
+    hiddenField.setAttribute("value", topic_id);
+    form.appendChild(hiddenField);
+    
+    if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1) {
+        document.body.appendChild(form);
+        form.submit();
+    } else {
+        form.submit(); // works under IE and Chrome, but not FF  
+    }
+}
+
+
+// ============
+// 
+
+