nitdoc: Fix bug: problem when getting function information
[nit.git] / share / nitdoc / scripts / js-facilities.js
index 58cbddf..b0e928f 100644 (file)
@@ -1,8 +1,14 @@
 // User\r
 var userB64 = null;\r
+var userName = "";\r
+var password = "";\r
 var sessionStarted = false;\r
 var editComment = 0;\r
 var currentfileContent = '';\r
+var originalFileContent = '';\r
+var addNewComment = false;\r
+var commentLineStart;\r
+var commentLineEnd;\r
 \r
 // SHA GitHub\r
 var shaLastCommit = "";\r
@@ -14,6 +20,12 @@ var shaMaster;
 var repoExist = false;\r
 var branchExist = false;\r
 var githubRepo;\r
+var loginProcess = false; \r
+var signedOff = '';\r
+var userEmail = '';\r
+var commitMessage = '';\r
+var numComment = '';\r
+var showcomment = false;\r
 \r
 // Spinner vars\r
 var opts = {\r
@@ -53,6 +65,12 @@ var currentTable = null;
 //Hightlighted index in search result preview table\r
 var currentIndex = -1;\r
 \r
+// Check if a comment is editing\r
+window.onbeforeunload = function() {\r
+       if(editComment > 0){\r
+       return 'Are you sure you want to leave this page?';\r
+       }\r
+};\r
 \r
 /*\r
 * Add folding and filtering facilities to class description page.\r
@@ -67,9 +85,6 @@ $(document).ready(function() {
        $(".popover").hide();\r
        // Update display\r
        updateDisplaying();\r
-       githubRepo = $('#repoName').attr('name');\r
-       // Load comment from the original repo\r
-       reloadComment();\r
        /*\r
        * Highlight the spoted element\r
        */\r
@@ -413,23 +428,36 @@ $(document).ready(function() {
        // Sign In an github user or Log out him\r
        $("#signIn").click(function(){\r
                if(!sessionStarted){\r
-                       if($('#loginGit').val() == "" || $('#passwordGit').val() == ""){ displayMessage('The comment field is empty!', 40, 45); }\r
+                       if($('#loginGit').val() == "" || $('#passwordGit').val() == ""){ displayMessage('Please informed login/password field!', 40, 45); }\r
                        else\r
                        {\r
                                userName = $('#loginGit').val();\r
                                password = $('#passwordGit').val();\r
-                               repoName = $('#repositoryGit').val();\r
+                               githubRepo = $('#repositoryGit').val();\r
                                branchName = $('#branchGit').val();\r
                                userB64 = "Basic " +  base64.encode(userName+':'+password);\r
-                               setCookie("logginNitdoc", base64.encode(userName+':'+password+':'+repoName+':'+branchName), 1);\r
-                               $('#loginGit').val("");\r
-                               $('#passwordGit').val("");\r
+                               if(checkSignIn()){\r
+                                       // Check if repo exist\r
+                                       isRepoExisting();\r
+                                       if(repoExist){\r
+                                               $.when(isBranchExisting()).done(function(){\r
+                                                       loginProcess = true;\r
+                                                       if(branchExist){\r
+                                                               setCookie("logginNitdoc", base64.encode(userName+':'+password+':'+githubRepo+':'+branchName), 1);\r
+                                                               $('#loginGit').val("");\r
+                                                               $('#passwordGit').val("");\r
+                                                               reloadComment();\r
+                                                       }\r
+                                               });\r
+                                       }\r
+                               }\r
                        }\r
                }       \r
                else\r
                {\r
                        // Delete cookie and reset settings\r
                        del_cookie("logginNitdoc");\r
+                       closeAllCommentInEdtiting();\r
                }       \r
                displayLogginModal();\r
        });\r
@@ -442,6 +470,7 @@ $(document).ready(function() {
                        return;\r
                }\r
                else{\r
+                       numComment = $(this).attr('title');\r
                        var arrayNew = $(this).text().split('\n');\r
                        var lNew = arrayNew.length - 1;\r
                        var adapt = "";\r
@@ -451,6 +480,7 @@ $(document).ready(function() {
                                if(i < lNew-1){ adapt += "\n"; }\r
                        }\r
                        editComment += 1;\r
+                       getCommentOfFunction($(this));\r
                        // hide comment\r
                        $(this).hide();\r
                        // Show edit box \r
@@ -460,9 +490,10 @@ $(document).ready(function() {
                        // Show commit button\r
                        $(this).next().next().next().show();\r
                        // Add text in edit box\r
-                       if($(this).next().val() == ""){ $(this).next().val(adapt); }\r
+                       if($(this).next().val() == "" || $(this).next().val() != adapt){ $(this).next().val(adapt); }\r
                        // Resize edit box \r
                        $(this).next().height($(this).next().prop("scrollHeight"));\r
+                       resizeTextarea($(this).next());\r
                        // Select it\r
                        $(this).next().select();\r
                        preElement = $(this);\r
@@ -471,16 +502,10 @@ $(document).ready(function() {
 \r
        // Disable the edit mode\r
        $('a[id=cancelBtn]').click(function(){\r
-               if(editComment > 0){ editComment -= 1; }\r
-               // Hide itself\r
-               $(this).hide();\r
-               // Hide commitBtn\r
-               $(this).next().hide();\r
-               // Hide Textarea\r
-               $(this).prev().hide();\r
-               // Show comment\r
-               $(this).prev().prev().show();\r
-        });\r
+               $(this).parent().prev().children('#lblDiffCommit').text("");\r
+               showcomment = false;\r
+               closeEditing($(this));\r
+       });\r
 \r
        // Display commit form\r
        $('a[id=commitBtn]').click(function(){\r
@@ -494,8 +519,12 @@ $(document).ready(function() {
                                displayLogginModal();\r
                                return;\r
                        }\r
-                       $('#commitMessage').val('New commit');\r
-                       pathFile = $(this).prev().prev().prev().attr('tag');\r
+                       \r
+                       // Create the commit message\r
+                       commitMessage = 'Wikidoc: modified comment in ' + $(this).parent().prev().prev().html().split(' ')[1];\r
+                       $('#commitMessage').text(commitMessage);\r
+                       $('#commitMessage').css({'display': 'block'});\r
+                       pathFile = $(this).prev().prev().prev().attr('tag');\r
                        $('#modal').show().prepend('<a class="close"><img src="resources/icons/close.png" class="btn_close" title="Close" alt="Close" /></a>');\r
                        $('body').append('<div id="fade"></div>');\r
                        $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();\r
@@ -507,6 +536,8 @@ $(document).ready(function() {
                $(this).hide();                 \r
                $(this).next().hide();                  \r
                if(editComment > 0){ editComment -= 1; }\r
+               $('#chkSignedOff').attr('checked', false);\r
+               removeSignedOff();\r
         });\r
 \r
        //Close Popups and Fade Layer\r
@@ -516,6 +547,8 @@ $(document).ready(function() {
                        $('#fade, a.close').remove();  \r
                });             \r
                $('#modalQuestion').hide();\r
+               $('#chkSignedOff').attr('checked', false);\r
+               removeSignedOff();\r
        });\r
 \r
        $('#loginAction').click(function(){\r
@@ -527,22 +560,21 @@ $(document).ready(function() {
                        displayMessage("You need to be loggued before commit something", 100, 40);\r
                        $('.popover').show();\r
                        return;\r
-               }               \r
+               }\r
                else{ userB64 = "Basic " + getUserPass("logginNitdoc"); }\r
-               githubRepo = repoName;\r
                // Check if repo exist\r
                isRepoExisting();\r
                if(repoExist){\r
                        isBranchExisting();\r
                        if(branchExist){\r
                                editComment -= 1;\r
-                               commitMessage = $('#commitMessage').val();\r
+                               commitMessage = $('#commitMessage').val().replace(/\r?\n/g, '\\n').replace(/\t/g, '\\t').replace(/\"/g,'\\"');\r
                                if(commitMessage == ""){ commitMessage = "New commit";}\r
                                if(sessionStarted){\r
                                        if ($.trim(updateComment) == ''){ this.value = (this.defaultValue ? this.defaultValue : ''); }\r
                                        else{ \r
                                                displaySpinner();\r
-                                                       startCommitProcess();\r
+                                               startCommitProcess();\r
                                        }\r
                                }\r
                                $('#modal, #modalQuestion').fadeOut(function() {\r
@@ -553,11 +585,14 @@ $(document).ready(function() {
                                });\r
                                $('a[id=cancelBtn]').hide();\r
                                $('a[id=commitBtn]').hide();\r
+                               $('a[id=lblDiffCommit]').text("");\r
+                               showcomment = false;\r
                                // Re-load all comment\r
                                reloadComment();\r
                        }\r
                }\r
                else{ editComment -= 1; }\r
+               $('#chkSignedOff').attr('checked', false);\r
        });\r
        \r
        // Cancel creating branch\r
@@ -574,11 +609,20 @@ $(document).ready(function() {
                if($('#btnCreateBranch').text() != 'Ok'){\r
                        // Create the branch\r
                        createBranch();\r
-                       commitMessage = $('#commitMessage').val();\r
+                       commitMessage = $('#commitMessage').val().replace(/\r?\n/g, '\\n').replace(/\t/g, '\\t').replace(/\"/g,'\\"');\r
                        if(commitMessage == ""){ commitMessage = "New commit"; }\r
-                       if(userB64 != ""){      \r
-                               if ($.trim(updateComment) == ''){ this.value = (this.defaultValue ? this.defaultValue : ''); }\r
-                       else{ startCommitProcess(); }\r
+                       if(userB64 != ""){                      \r
+                       if(loginProcess){\r
+                                       setCookie("logginNitdoc", base64.encode(userName+':'+password+':'+githubRepo+':'+branchName), 1);        \r
+                                       $('#loginGit').val("");\r
+                                       $('#passwordGit').val("");\r
+                                       loginProcess = false;          \r
+                                       displayLogginModal();\r
+                       }\r
+                       else{\r
+                                       if ($.trim(updateComment) == ''){ this.value = (this.defaultValue ? this.defaultValue : ''); }\r
+                                       else{ startCommitProcess(); }\r
+                               } \r
                    }\r
                }\r
                else\r
@@ -587,6 +631,64 @@ $(document).ready(function() {
                }\r
        });\r
 \r
+       $('a[class=newComment]').click(function(){\r
+               addNewComment = true;                   \r
+               editComment += 1;\r
+               // hide comment\r
+               $(this).hide();\r
+               // Show edit box \r
+               $(this).next().show();\r
+               // Show cancel button\r
+               $(this).next().next().show();\r
+               // Show commit button\r
+               $(this).next().next().next().show();\r
+               // Resize edit box \r
+               $(this).next().height($(this).next().prop("scrollHeight"));\r
+               resizeTextarea($(this).next());\r
+               // Select it\r
+               $(this).next().select();\r
+               preElement = $(this);  \r
+        });\r
+\r
+       $("#dropBranches").change(function () {         \r
+               $("#dropBranches option:selected").each(function () {\r
+                       if(branchName != $(this).text()){\r
+                               branchName = $(this).text();\r
+                       }\r
+               });\r
+               $.when(updateCookie(userName, password, githubRepo, branchName)).done(function(){\r
+                       closeAllCommentInEdtiting();\r
+                       reloadComment();\r
+               });\r
+       });\r
+\r
+       $("pre").hover(\r
+               function () {\r
+                       if(sessionStarted == true){\r
+                               $(this).css({'cursor' : 'hand'});\r
+                       }\r
+                       else{\r
+                               $(this).css({'cursor' : ''});\r
+                       }\r
+               },\r
+               function () {\r
+                       if(sessionStarted == true){\r
+                               $(this).css({'cursor' : 'pointer'});\r
+                       }\r
+                       else{\r
+                               $(this).css({'cursor' : ''});   \r
+                       }\r
+               }\r
+       );\r
+\r
+       $('#chkSignedOff').click(function(){\r
+               if($(this).is(':checked')){ addSignedOff(); }\r
+               else{ removeSignedOff(); }\r
+       })\r
+\r
+       $('a[id=lblDiffCommit]').click(function(){\r
+               showComment($(this));\r
+       });\r
 });\r
 \r
 /* Parse current URL and return anchor name */\r
@@ -638,19 +740,28 @@ function highlightBlock(a) {
 \r
 // Init process to commit the new comment\r
 function startCommitProcess()\r
-{\r
-       var numL = preElement.attr("title");\r
-       commentLineStart = numL.split('-')[0] - 1;      \r
-       commentLineEnd = (commentLineStart + preElement.text().split('\n').length) - 1;\r
-       state = true;   \r
-       replaceComment(updateComment, currentfileContent);\r
-       getLastCommit();        \r
-       getBaseTree();  \r
-       editComment = false;\r
+{      \r
+       if($('#chkSignedOff').is(':checked')){\r
+               var numL = preElement.attr("title");\r
+               commentLineStart = numL.split('-')[0] - 1;      \r
+               if(addNewComment) { commentLineStart++; }\r
+               commentLineEnd = (commentLineStart + preElement.text().split('\n').length) - 1;\r
+               state = true;   \r
+               replaceComment(updateComment, currentfileContent);\r
+               getLastCommit();        \r
+               getBaseTree();  \r
+               editComment = false;\r
+       }\r
+       else{\r
+               displayMessage('Please sign this commit', 40, 40); \r
+       }\r
 }\r
 \r
 function displayLogginModal(){\r
-       if ($('.popover').is(':hidden')) { $('.popover').show(); }\r
+       if ($('.popover').is(':hidden')) { \r
+               if(sessionStarted){ getListBranches(); }\r
+               $('.popover').show(); \r
+       }\r
        else { $('.popover').hide(); }  \r
        updateDisplaying();\r
 }\r
@@ -658,6 +769,7 @@ function displayLogginModal(){
 function updateDisplaying(){\r
        if (checkCookie())\r
        {\r
+               userB64 = "Basic " + getUserPass("logginNitdoc"); \r
                $('#loginGit').hide();\r
                $('#passwordGit').hide();\r
                $('#lbpasswordGit').hide();             \r
@@ -666,15 +778,19 @@ function updateDisplaying(){
                $('#lbrepositoryGit').hide();\r
                $('#lbbranchGit').hide();  \r
                $('#branchGit').hide();\r
+               $('#listBranches').show();\r
+               $('#divGitHubRepoDisplay').show();\r
                $("#liGitHub").attr("class", "current");\r
                $("#imgGitHub").attr("src", "resources/icons/github-icon-w.png");\r
-               $('#nickName').text(userName);          \r
+               $('#nickName').text(userName);\r
                $('#githubAccount').attr("href", "https://github.com/"+userName);\r
                $('#logginMessage').css({'display' : 'block'});\r
                $('#logginMessage').css({'text-align' : 'center'});\r
-               $('.popover').css({'height' : '80px'}); \r
-               $('#signIn').text("Sign out");  \r
+               $('.popover').css({'height' : '190px'});\r
+               $('#signIn').text("Sign out");\r
+               $('#githubRepoDisplay').text(githubRepo);\r
                sessionStarted = true;\r
+               reloadComment();\r
        }\r
        else\r
        {\r
@@ -683,9 +799,9 @@ function updateDisplaying(){
                $("#liGitHub").attr("class", "");\r
                $("#imgGitHub").attr("src", "resources/icons/github-icon.png");\r
                $('#loginGit').val("");\r
-               $('#passwordGit').val("");\r
-               $('#nickName').text("");\r
-               $('.popover').css({'height' : '280px'});        \r
+               $('#passwordGit').val("");\r
+               $('#nickName').text("");\r
+               $('.popover').css({'height' : '325px'});\r
                $('#logginMessage').css({'display' : 'none'});\r
                $('#repositoryGit').val($('#repoName').attr('name'));\r
                $('#branchGit').val('wikidoc');  \r
@@ -698,6 +814,8 @@ function updateDisplaying(){
                $('#lbrepositoryGit').show();\r
                $('#lbbranchGit').show();  \r
                $('#branchGit').show();  \r
+               $('#listBranches').hide();\r
+               $('#divGitHubRepoDisplay').hide();\r
        }\r
 }\r
 \r
@@ -714,6 +832,13 @@ function del_cookie(c_name)
     document.cookie = c_name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r
 }\r
 \r
+function updateCookie(user, pwd, repo, branch){\r
+       if(checkCookie()){\r
+               branchName = branch;\r
+               setCookie("logginNitdoc", base64.encode(user+':'+pwd+':'+repo+':'+branch), 1);\r
+       }\r
+}\r
+\r
 function getCookie(c_name)\r
 {\r
        var c_value = document.cookie;\r
@@ -742,7 +867,8 @@ function checkCookie()
        {\r
                cookie = base64.decode(cookie);\r
                userName = cookie.split(':')[0];\r
-               repoName = cookie.split(':')[2];                \r
+               password = cookie.split(':')[1];\r
+               githubRepo = cookie.split(':')[2];              \r
                branchName = cookie.split(':')[3];\r
                return true;\r
        }\r
@@ -916,6 +1042,7 @@ function setNewTree()
         type: "POST",\r
         url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/trees", \r
         async: false,\r
+        dataType:'json',\r
         data:'{ "base_tree" : "'+shaBaseTree+'", '+\r
                 '"tree":[{ '+\r
                     '"path":"'+ pathFile +'",'+\r
@@ -926,7 +1053,7 @@ function setNewTree()
             '}',        \r
         success: function(success)\r
         { // si l'appel a bien fonctionné\r
-            shaNewTree = JSON.parse(success).sha;\r
+            shaNewTree = success.sha;\r
             setNewCommit();            \r
         },\r
         error: function(){\r
@@ -937,18 +1064,20 @@ function setNewTree()
 \r
 function setNewCommit()\r
 {\r
+    addSignedOff();\r
     $.ajax({ \r
         beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
         type: "POST",\r
         url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/commits", \r
         async: false,\r
+        dataType:'json',\r
         data:'{ "message" : "'+ commitMessage +'", '+\r
                 '"parents" :"'+shaLastCommit+'",'+ \r
                 '"tree": "'+shaNewTree+'"'+\r
              '}',        \r
         success: function(success)\r
         {\r
-            shaNewCommit = JSON.parse(success).sha;\r
+            shaNewCommit = success.sha;\r
             commit();          \r
         },\r
         error: function(){\r
@@ -964,11 +1093,12 @@ function commit()
         beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
         type: "POST",\r
         url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/refs/heads/"+branchName, \r
+        dataType:'json',\r
         data:'{ "sha" : "'+shaNewCommit+'", '+\r
                 '"force" :"true"'+\r
              '}',\r
         success: function(success) { displayMessage('Commit created successfully', 40, 40); },\r
-        error:function(error){ displayMessage('Error ' + JSON.parse(error).object.message, 40, 40); }\r
+        error:function(error){ displayMessage('Error ' + error.object.message, 40, 40); }\r
     });\r
 }\r
 \r
@@ -980,12 +1110,13 @@ function setBlob()
         type: "POST",         \r
         url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/blobs",         \r
         async: false,\r
+        dataType:'json',\r
         data:'{ "content" : "'+text.replace(/\r?\n/g, '\\n').replace(/\t/g, '\\t').replace(/\"/g,'\\"')+'", '+\r
                 '"encoding" :"utf-8"'+\r
             '}',\r
         success: function(success)\r
         {            \r
-            shaBlob = JSON.parse(success).sha;\r
+            shaBlob = success.sha;\r
             setNewTree();                  \r
         },\r
         error:function(error){ \r
@@ -1021,6 +1152,13 @@ function replaceComment(newComment, fileContent){
        var lines = fileContent.split("\n");\r
        for (var i = 0; i < lines.length; i++) {\r
                if(i == commentLineStart){\r
+                       if(addNewComment){\r
+                               for(var indexLine=0; indexLine < lines[i+1].length; indexxLine++){\r
+                                       if(lines[i+1].substr(indexLine,1) == "\t" || lines[i+1].substr(indexLine,1) == "#"){ text += lines[i+1].substr(indexLine,1); }\r
+                                       else{ break;}\r
+                               }\r
+                               text += lines[i] + "\n"; \r
+                       }\r
                        // We change the comment\r
                        for(var j = 0; j < lNew; j++){\r
                                if(commentType == 1){ text += "\t# " + arrayNew[j] + "\n"; }\r
@@ -1035,37 +1173,52 @@ function replaceComment(newComment, fileContent){
                        else{ text += lines[i] + "\n"; }\r
                }\r
        }\r
+       if(addNewComment){\r
+               addNewComment = false;\r
+       }\r
 }\r
 \r
-function getCommentLastCommit(path){\r
+function getCommentLastCommit(path, origin){\r
        var urlRaw;\r
+       var bkBranch = '';\r
+       if(origin){// We want to get the original file\r
+               bkBranch = branchName;\r
+               branchName = "master";\r
+       }\r
        getLastCommit();\r
        if(shaLastCommit != ""){\r
-               if (checkCookie()) { urlRaw="https://rawgithub.com/"+ userName +"/"+ repoName +"/" + shaLastCommit + "/" + path; }\r
-               else{ urlRaw="https://rawgithub.com/StefanLage/"+ $('#repoName').attr('name') +"/" + shaLastCommit + "/" + path; }\r
-\r
-               $.ajax({  \r
-               type: "GET",                \r
-               url: urlRaw,        \r
-               async: false,\r
-               success: function(success)\r
-               {\r
-                       currentfileContent = success;   \r
-               }\r
-           });\r
+               if (checkCookie()) {\r
+                       urlRaw="https://rawgithub.com/"+ userName +"/"+ githubRepo +"/" + shaLastCommit + "/" + path;\r
+                       $.ajax({  \r
+                           type: "GET",\r
+                           url: urlRaw,\r
+                           async: false,\r
+                           success: function(success)\r
+                           {\r
+                                   if(origin){ originalFileContent = success; }\r
+                                   else{ currentfileContent = success; }\r
+                           }\r
+                       });\r
+               }\r
        }\r
+       if(origin){ branchName = bkBranch; }\r
 }\r
 \r
 function displayMessage(msg, widthDiv, margModal){\r
        spinner.stop();\r
        $('#modal').hide();\r
-       $('#btnCreateBranch').css('margin-left',widthDiv + '%');\r
+       $('#btnCancelBranch').hide();   \r
+       $('#modalQuestion').show().prepend('<a class="close"><img src="resources/icons/close.png" class="btnCloseQuestion" title="Close" alt="Close" /></a>');\r
        $('#txtQuestion').text(msg);\r
        $('#btnCreateBranch').text("Ok");\r
-       $('#btnCancelBranch').hide();\r
-       $('#modalQuestion').css({'left' : margModal + '%'})\r
+       var xModal = $('#modalQuestion').css('width').split('px')[0];\r
+       var yModal = $('#modalQuestion').css('height').split('px')[0];\r
+       var x = $(document).width/2 - xModal/2;\r
+       var y = $(document).height/2 - yModal/2;\r
+       var xBtnBranch = $('#btnCreateBranch').css('width').split('px')[0];\r
+       $('#modalQuestion').css({'left' : x, 'top' : y});\r
        $('#modalQuestion').show();\r
-       $('#modalQuestion').show().prepend('<a class="close"><img src="resources/icons/close.png" class="btnCloseQuestion" title="Close" alt="Close" /></a>');\r
+       $('#btnCreateBranch').css('margin-left', xModal/2 - xBtnBranch);\r
        $('body').append('<div id="fade"></div>');\r
        $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();\r
 }\r
@@ -1171,7 +1324,9 @@ $.fn.spin = function(opts) {
 };\r
 \r
 function reloadComment(){\r
-       $.when(getCommentLastCommit($('pre[class=text_label]').attr('tag'))).done(function(){\r
+       var path = $('pre[class=text_label]').attr('tag');\r
+       $.when(getCommentLastCommit(path, false)).done(function(){\r
+               if(sessionStarted){ getCommentLastCommit(path, true); }\r
                $('pre[class=text_label]').each(function(){ getCommentOfFunction($(this)); });\r
        });\r
 }\r
@@ -1180,15 +1335,179 @@ function getCommentOfFunction(element){
        var textC = ""; \r
        var numL = element.attr("title");\r
        if(numL != null){                                       \r
-               commentLineStart = numL.split('-')[0] - 1;\r
-               commentLineEnd = (commentLineStart + element.text().split('\n').length) - 1;\r
+               commentLineStart = numL-1;              \r
+               commentLineEnd = element.attr('name').split(numL)[1].split('-')[1]-1;           \r
                var lines = currentfileContent.split("\n");\r
                for (var i = 0; i < lines.length; i++) {\r
-                       if(i >= commentLineStart-1 && i <= commentLineEnd){\r
+                       if(i >= commentLineStart-1 && i <= commentLineEnd+1){\r
                                if (lines[i].substr(1,1) == "#"){ textC += lines[i].substr(3,lines[i].length) + "\n";}\r
                                else if(lines[i].substr(0,1) == '#'){ textC += lines[i].substr(2,lines[i].length) + "\n"; }\r
                }\r
            }\r
-           if (textC != ""){ element.text(textC); }\r
+           if(textC != element.text){element.text(textC);}\r
+           if (textC != "" && editComment > 0){\r
+               var originContent = originalFileContent.split("\n");\r
+               var origin = '';\r
+               var lblDiff = element.parent().prev().children('#lblDiffCommit');\r
+               var preSave = element.parent().children('#preSave');\r
+               for (var i = 0; i < originContent.length; i++) {\r
+                       if(i >= commentLineStart-1 && i <= commentLineEnd+1){\r
+                               if (originContent[i].substr(1,1) == "#"){ origin += originContent[i].substr(3,originContent[i].length) + "\n";}\r
+                               else if(originContent[i].substr(0,1) == '#'){ origin += originContent[i].substr(2,originContent[i].length) + "\n"; }\r
+                       }\r
+               }\r
+               if(textC != origin && numL == numComment){\r
+                       // The comment is different compare to the original\r
+                       if(showcomment == false){ lblDiff.text("Show original comment"); }\r
+                       preSave.text(origin);\r
+               }\r
+               else if (numL == numComment){ lblDiff.text(""); }\r
+           }\r
+       }\r
+}\r
+\r
+// Get list of branches\r
+function getListBranches()\r
+{\r
+       cleanListBranches();\r
+    $.ajax({\r
+        beforeSend: function (xhr) { \r
+            if ($("#login").val() != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET", \r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/branches", \r
+        async:false,\r
+        dataType:'json',\r
+        success: function(success)\r
+        {   \r
+            for(var branch in success) { \r
+               var selected = '';\r
+               if(branchName == success[branch].name){\r
+                       selected = 'selected';\r
+               }\r
+               $('#dropBranches').append('<option value="" '+ selected +'>' + success[branch].name + '</option>');\r
+            }\r
+        }\r
+    });\r
+}\r
+\r
+// Delete all option in the list\r
+function cleanListBranches(){\r
+       $('#dropBranches').children("option").remove();\r
+}\r
+\r
+function closeAllCommentInEdtiting(){\r
+       $('a[id=cancelBtn]').each(function(){\r
+               closeEditing($(this));\r
+       });\r
+}\r
+\r
+function closeEditing(tag){\r
+       if(editComment > 0){ editComment -= 1; }\r
+       // Hide itself\r
+       tag.hide();\r
+       // Hide commitBtn\r
+       tag.next().hide();\r
+       // Hide Textarea\r
+       tag.prev().hide();\r
+       // Show comment\r
+       tag.prev().prev().show();\r
+}\r
+\r
+function checkSignIn(){\r
+       var response = false;\r
+       $.ajax({\r
+        beforeSend: function (xhr) {\r
+            if ($("#login").val() != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo,\r
+        async:false,\r
+        dataType:'json',\r
+        success: function(success)\r
+        {\r
+               getUserInfo();\r
+               response = true;\r
+               displayMessage('You are now logged in');\r
+        },\r
+        error: function()\r
+        {\r
+               displayMessage('Error : Wrong username or password');\r
+               response = false;\r
+        }\r
+    });\r
+    return response;\r
+}\r
+\r
+function getUserInfo(){\r
+       $.ajax({\r
+        beforeSend: function (xhr) {\r
+            if ($("#login").val() != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: "https://api.github.com/user/emails",\r
+        async:false,\r
+        dataType:'json',\r
+        success: function(success)\r
+        {        \r
+               userEmail = success;\r
+        }\r
+    });\r
+}\r
+\r
+function getSignedOff(){\r
+       $.ajax({\r
+        beforeSend: function (xhr) {\r
+            if ($("#login").val() != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: "https://api.github.com/users/"+userName,\r
+        async:false,\r
+        dataType:'json',\r
+        success: function(success)\r
+        {\r
+               signedOff = success.name;\r
+        }\r
+    });\r
+}\r
+\r
+function addSignedOff(){\r
+       $.when(getUserInfo()).done(function(){\r
+               $.when(getSignedOff()).done(function(){\r
+                       $('#commitMessage').val($('#commitMessage').val() + "\n\nSigned-off-by: "+signedOff+" <"+userEmail+">");\r
+               });\r
+       });\r
+       resizeTextarea($('#commitMessage'));\r
+}\r
+\r
+function removeSignedOff(){\r
+       $('#commitMessage').val(commitMessage); \r
+       resizeTextarea($('#commitMessage'));\r
+}\r
+\r
+function resizeTextarea(element){\r
+       var nLines = element.val().split('\n').length + 1;\r
+       element.attr('rows', nLines);\r
+}\r
+\r
+function showComment(element){\r
+       // Display the original comment\r
+       if (showcomment == true){               \r
+               showcomment = false;\r
+               element.text("Show original comment");\r
+       }\r
+       else{\r
+               // Show the comment updated in user's repo\r
+               showcomment = true;\r
+               element.text("Comment changed in "+githubRepo+" / "+branchName);\r
        }\r
+       var parent = element.parent().next(".description");             \r
+       var textarea = parent.children('#fileContent');\r
+       var text = textarea.val();      \r
+       var preSave = parent.children('#preSave');      \r
+       textarea.val(preSave.text());\r
+       preSave.text(text);\r
+       // Resize edit box\r
+       textarea.height(textarea.prop("scrollHeight"));\r
+       resizeTextarea(textarea);\r
 }\r