nitdoc: Add an action on "Commit" button
[nit.git] / share / nitdoc / scripts / js-facilities.js
index d67ef9c..d2d331a 100644 (file)
@@ -1,3 +1,17 @@
+// User\r
+var userB64 = null;\r
+var sessionStarted = false;\r
+var editComment = 0;\r
+var currentfileContent = '';\r
+\r
+// SHA GitHub\r
+var shaLastCommit = "";\r
+var shaBaseTree;\r
+var shaNewTree;\r
+var shaNewCommit;\r
+var shaBlob;\r
+var shaMaster;\r
+\r
 /*\r
 * JQuery Case Insensitive :icontains selector\r
 */\r
@@ -21,11 +35,20 @@ var currentIndex = -1;
 */\r
 $(document).ready(function() {\r
 \r
+       // Hide edit tags\r
+       $('textarea').hide();\r
+       $('a[id=commitBtn]').hide();\r
+       $('a[id=cancelBtn]').hide();\r
+       // Hide Authenfication form\r
+       $(".popover").hide();\r
+       // Update display\r
+       updateDisplaying();\r
+       \r
        /*\r
        * Highlight the spoted element\r
        */\r
-       highlightBlock(currentAnchor());
-       \r
+       highlightBlock(currentAnchor());\r
+\r
        /*\r
        * Nav block folding\r
        */\r
@@ -45,8 +68,8 @@ $(document).ready(function() {
                                $(this).find("a.fold").html("+");\r
                        }\r
                        $(this).nextAll().toggle();\r
-       })
-       
+       })\r
+       \r
        // Insert search field\r
        $("nav.main ul")\r
        .append(\r
@@ -187,6 +210,13 @@ $(document).ready(function() {
                                                        currentTable.width($("#search").outerWidth());\r
                                                        $("header").append(currentTable);\r
                                                        currentTable.offset({left: $("#search").offset().left + ($("#search").outerWidth() - currentTable.outerWidth()), top: $("#search").offset().top + $("#search").outerHeight()});\r
+\r
+                                                       // Preselect first entry\r
+                                                       if(currentTable.find("tr").length > 0) {\r
+                                                               currentIndex = 0;\r
+                                                               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
+                                                               $("#search").focus();\r
+                                                       }\r
                                                break;\r
                                        }\r
                                })\r
@@ -208,14 +238,16 @@ $(document).ready(function() {
                        })\r
                )\r
         );\r
-       \r
-       /*\r
-       * Anchors jumps\r
-       */\r
-       $("a[href^='#']").click( function() {\r
-               var a = $(this).attr("href").replace(/#/, "");\r
-               highlightBlock(a);\r
-       });\r
+\r
+        // Close quicksearch list on click\r
+        $(document).click(function(e) {\r
+               if(e.target != $("#search")[0] && e.target != $("#searchTable")[0]) {\r
+                       if(currentTable != null) {\r
+                               currentTable.remove();\r
+                               currentTable = null;\r
+                       }\r
+               }\r
+        });\r
        \r
        // Insert filter field\r
        $("article.filterable h2, nav.filterable h3")\r
@@ -247,7 +279,7 @@ $(document).ready(function() {
                        })\r
                )\r
        );\r
-       
+       \r
        // Filter toggle between H I R in nav porperties list\r
        $("nav.properties.filterable .filter")\r
        .append(\r
@@ -297,9 +329,9 @@ $(document).ready(function() {
                        \r
                        $(this).toggleClass("hidden");\r
                })\r
-       );
-       
-       // Filter toggle between I R in 
+       );\r
+       \r
+       // Filter toggle between I R in \r
        $("article.properties.filterable .filter, article.classes.filterable .filter")\r
        .append(\r
                $(document.createElement("a"))\r
@@ -332,10 +364,162 @@ $(document).ready(function() {
                        \r
                        $(this).toggleClass("hidden");\r
                })\r
-       );
-       
-       //Preload filter fields with query string
+       );\r
+\r
+       /*\r
+       * Anchors jumps\r
+       */\r
+       $("a[href*='#']").click( function() {\r
+               highlightBlock($(this).attr("href").split(/#/)[1]);\r
+       });\r
+\r
+       //Preload filter fields with query string\r
        preloadFilters();\r
+       // Hide Authenfication form\r
+       $(".popover").hide();\r
+       // Display Login modal\r
+       $("#logGitHub").click(function(){ displayLogginModal(); }); \r
+       // Update display\r
+       updateDisplaying();\r
+       // If cookie existing the session is opened\r
+       if(sessionStarted){ userB64 = "Basic " + getUserPass("logginNitdoc"); }\r
+\r
+       // 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
+                       else\r
+                       {\r
+                               userName = $('#loginGit').val();\r
+                               password = $('#passwordGit').val();\r
+                               repoName = $('#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
+                       }\r
+               }       \r
+               else\r
+               {\r
+                       // Delete cookie and reset settings\r
+                       del_cookie("logginNitdoc");\r
+               }       \r
+               displayLogginModal();\r
+       });\r
+\r
+       // Activate edit mode\r
+       $('pre[class=text_label]').click(function(){\r
+               // the customer is loggued ?\r
+               if(!sessionStarted || userName == ""){\r
+                       // No => nothing happen\r
+                       return;\r
+               }\r
+               else{\r
+                       var arrayNew = $(this).text().split('\n');\r
+                       var lNew = arrayNew.length - 1;\r
+                       var adapt = "";\r
+\r
+                       for (var i = 0; i < lNew; i++) {\r
+                               adapt += arrayNew[i];\r
+                               if(i < lNew-1){ adapt += "\n"; }\r
+                       }\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
+                       // Add text in edit box\r
+                       if($(this).next().val() == ""){ $(this).next().val(adapt); }\r
+                       // Resize edit box \r
+                       $(this).next().height($(this).next().prop("scrollHeight"));\r
+                       // Select it\r
+                       $(this).next().select();\r
+                       preElement = $(this);\r
+               }\r
+       });\r
+\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
+\r
+       // Display commit form\r
+       $('a[id=commitBtn]').click(function(){\r
+               updateComment = $(this).prev().prev().val();\r
+               commentType = $(this).prev().prev().prev().attr('type');\r
+\r
+               if(updateComment == ""){ displayMessage('The comment field is empty!', 40, 45); }\r
+               else{\r
+                       if(!sessionStarted){\r
+                               displayMessage("You need to be loggued before commit something", 45, 40);\r
+                               displayLogginModal();\r
+                               return;\r
+                       }\r
+                       $('#commitMessage').val('New commit');\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
+               }\r
+        });\r
+\r
+       // Close commit form\r
+       $('.btn_close').click(function(){\r
+               $(this).hide();                 \r
+               $(this).next().hide();                  \r
+               if(editComment > 0){ editComment -= 1; }\r
+        });\r
+\r
+       //Close Popups and Fade Layer\r
+       $('body').on('click', 'a.close, #fade', function() {\r
+               if(editComment > 0){ editComment -= 1; }\r
+               $('#fade , #modal').fadeOut(function() {\r
+                       $('#fade, a.close').remove();  \r
+               });             \r
+               $('#modalQuestion').hide();\r
+       });\r
+\r
+       $('#loginAction').click(function(){\r
+               var text;\r
+               var url;\r
+               var line;\r
+               // Look if the customer is logged\r
+               if(!sessionStarted){\r
+                       displayMessage("You need to be loggued before commit something", 100, 40);\r
+                       $('.popover').show();\r
+                       return;\r
+               }               \r
+               else{ userB64 = "Basic " + getUserPass("logginNitdoc"); }\r
+               githubRepo = repoName;\r
+               editComment -= 1;\r
+               commitMessage = $('#commitMessage').val();\r
+               if(commitMessage == ""){ commitMessage = "New commit";}\r
+               if(sessionStarted){\r
+                       if ($.trim(updateComment) == ''){ this.value = (this.defaultValue ? this.defaultValue : ''); }\r
+                       else{ startCommitProcess(); }\r
+           }   \r
+           $('#modal, #modalQuestion').fadeOut(function() {\r
+               $('#login').val("");\r
+                       $('#password').val("");\r
+                       $('textarea').hide();\r
+                       $('textarea').prev().show();\r
+               });\r
+           $('a[id=cancelBtn]').hide();\r
+               $('a[id=commitBtn]').hide();\r
+       });\r
 });\r
 \r
 /* Parse current URL and return anchor name */\r
@@ -347,24 +531,24 @@ function currentAnchor() {
        return null;\r
 }\r
 \r
-/* Prealod filters field using search query */
-function preloadFilters() {
-       // Parse URL and get query string
-       var search = currentAnchor();
-       
-       if(search == null || search.indexOf("q=") == -1)
-               return;
-               
+/* Prealod filters field using search query */\r
+function preloadFilters() {\r
+       // Parse URL and get query string\r
+       var search = currentAnchor();\r
+       \r
+       if(search == null || search.indexOf("q=") == -1)\r
+               return;\r
+               \r
        search = search.substring(2, search.length);    \r
-       
-       if(search == "" || search == "undefined")
-               return;
        \r
-       $(":text").val(search);
-       $(".filter :text")
-               .removeClass("notUsed")
-               .trigger("keyup");
-
+       if(search == "" || search == "undefined")\r
+               return;\r
+       \r
+       $(":text").val(search);\r
+       $(".filter :text")\r
+               .removeClass("notUsed")\r
+               .trigger("keyup");\r
+\r
 }\r
 \r
 /* Hightlight the spoted block */\r
@@ -383,4 +567,451 @@ function highlightBlock(a) {
        \r
        target.addClass("highlighted");\r
        target.show();\r
-}
\ No newline at end of file
+}\r
+\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
+\r
+function displayLogginModal(){\r
+       if ($('.popover').is(':hidden')) { $('.popover').show(); }\r
+       else { $('.popover').hide(); }  \r
+       updateDisplaying();\r
+}\r
+\r
+function updateDisplaying(){\r
+       if (checkCookie())\r
+       {\r
+               $('#loginGit').hide();\r
+               $('#passwordGit').hide();\r
+               $('#lbpasswordGit').hide();             \r
+               $('#lbloginGit').hide();        \r
+               $('#repositoryGit').hide();\r
+               $('#lbrepositoryGit').hide();\r
+               $('#lbbranchGit').hide();  \r
+               $('#branchGit').hide();\r
+               $("#liGitHub").attr("class", "current");\r
+               $("#imgGitHub").attr("src", "resources/icons/github-icon-w.png");\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
+               sessionStarted = true;\r
+       }\r
+       else\r
+       {\r
+               sessionStarted = false;\r
+               $('#logginMessage').css({'display' : 'none'});\r
+               $("#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
+               $('#logginMessage').css({'display' : 'none'});\r
+               $('#repositoryGit').val($('#repoName').attr('name'));\r
+               $('#branchGit').val('wikidoc');  \r
+               $('#signIn').text("Sign In");\r
+               $('#loginGit').show();\r
+               $('#passwordGit').show();\r
+               $('#lbpasswordGit').show();\r
+               $('#lbloginGit').show();        \r
+               $('#repositoryGit').show();\r
+               $('#lbrepositoryGit').show();\r
+               $('#lbbranchGit').show();  \r
+               $('#branchGit').show();  \r
+       }\r
+}\r
+\r
+function setCookie(c_name, value, exdays)\r
+{\r
+       var exdate=new Date();\r
+       exdate.setDate(exdate.getDate() + exdays);\r
+       var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());\r
+       document.cookie=c_name + "=" + c_value;\r
+}\r
+\r
+function del_cookie(c_name)\r
+{\r
+    document.cookie = c_name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r
+}\r
+\r
+function getCookie(c_name)\r
+{\r
+       var c_value = document.cookie;\r
+       var c_start = c_value.indexOf(" " + c_name + "=");\r
+       if (c_start == -1) { c_start = c_value.indexOf(c_name + "="); }\r
+       if (c_start == -1) { c_value = null; }\r
+       else\r
+       {\r
+               c_start = c_value.indexOf("=", c_start) + 1;\r
+               var c_end = c_value.indexOf(";", c_start);\r
+               if (c_end == -1) { c_end = c_value.length; }\r
+               c_value = unescape(c_value.substring(c_start,c_end));\r
+       }\r
+       return c_value;\r
+}\r
+\r
+function getUserPass(c_name){\r
+       var cookie = base64.decode(getCookie(c_name));\r
+       return base64.encode(cookie.split(':')[0] + ':' + cookie.split(':')[1]);\r
+}\r
+\r
+function checkCookie()\r
+{\r
+       var cookie=getCookie("logginNitdoc");\r
+       if (cookie!=null && cookie!="")\r
+       {\r
+               cookie = base64.decode(cookie);\r
+               userName = cookie.split(':')[0];\r
+               repoName = cookie.split(':')[2];                \r
+               branchName = cookie.split(':')[3];\r
+               return true;\r
+       }\r
+       else { return false; }\r
+}\r
+\r
+\r
+/*\r
+* Base64\r
+*/\r
+base64 = {};\r
+base64.PADCHAR = '=';\r
+base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\r
+base64.getbyte64 = function(s,i) {\r
+    // This is oddly fast, except on Chrome/V8.\r
+    //  Minimal or no improvement in performance by using a\r
+    //   object with properties mapping chars to value (eg. 'A': 0)\r
+    var idx = base64.ALPHA.indexOf(s.charAt(i));\r
+    if (idx == -1) {\r
+    throw "Cannot decode base64";\r
+    }\r
+    return idx;\r
+}\r
+\r
+base64.decode = function(s) {\r
+    // convert to string\r
+    s = "" + s;\r
+    var getbyte64 = base64.getbyte64;\r
+    var pads, i, b10;\r
+    var imax = s.length\r
+    if (imax == 0) {\r
+        return s;\r
+    }\r
+\r
+    if (imax % 4 != 0) {\r
+    throw "Cannot decode base64";\r
+    }\r
+\r
+    pads = 0\r
+    if (s.charAt(imax -1) == base64.PADCHAR) {\r
+        pads = 1;\r
+        if (s.charAt(imax -2) == base64.PADCHAR) {\r
+            pads = 2;\r
+        }\r
+        // either way, we want to ignore this last block\r
+        imax -= 4;\r
+    }\r
+\r
+    var x = [];\r
+    for (i = 0; i < imax; i += 4) {\r
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) |\r
+            (getbyte64(s,i+2) << 6) | getbyte64(s,i+3);\r
+        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff));\r
+    }\r
+\r
+    switch (pads) {\r
+    case 1:\r
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) | (getbyte64(s,i+2) << 6)\r
+        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff));\r
+        break;\r
+    case 2:\r
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12);\r
+        x.push(String.fromCharCode(b10 >> 16));\r
+        break;\r
+    }\r
+    return x.join('');\r
+}\r
+\r
+base64.getbyte = function(s,i) {\r
+    var x = s.charCodeAt(i);\r
+    if (x > 255) {\r
+        throw "INVALID_CHARACTER_ERR: DOM Exception 5";\r
+    }\r
+    return x;\r
+}\r
+\r
+\r
+base64.encode = function(s) {\r
+    if (arguments.length != 1) {\r
+    throw "SyntaxError: Not enough arguments";\r
+    }\r
+    var padchar = base64.PADCHAR;\r
+    var alpha   = base64.ALPHA;\r
+    var getbyte = base64.getbyte;\r
+\r
+    var i, b10;\r
+    var x = [];\r
+\r
+    // convert to string\r
+    s = "" + s;\r
+\r
+    var imax = s.length - s.length % 3;\r
+\r
+    if (s.length == 0) {\r
+        return s;\r
+    }\r
+    for (i = 0; i < imax; i += 3) {\r
+        b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8) | getbyte(s,i+2);\r
+        x.push(alpha.charAt(b10 >> 18));\r
+        x.push(alpha.charAt((b10 >> 12) & 0x3F));\r
+        x.push(alpha.charAt((b10 >> 6) & 0x3f));\r
+        x.push(alpha.charAt(b10 & 0x3f));\r
+    }\r
+    switch (s.length - imax) {\r
+    case 1:\r
+        b10 = getbyte(s,i) << 16;\r
+        x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) +\r
+               padchar + padchar);\r
+        break;\r
+    case 2:\r
+        b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8);\r
+        x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) +\r
+               alpha.charAt((b10 >> 6) & 0x3f) + padchar);\r
+        break;\r
+    }\r
+    return x.join('');\r
+}\r
+\r
+$.fn.spin = function(opts) {\r
+  this.each(function() {\r
+    var $this = $(this),\r
+        data = $this.data();\r
+\r
+    if (data.spinner) {\r
+      data.spinner.stop();\r
+      delete data.spinner;\r
+    }\r
+    if (opts !== false) {\r
+      data.spinner = new Spinner($.extend({color: $this.css('color')}, opts)).spin(this);\r
+    }\r
+  });\r
+  return this;\r
+};\r
+\r
+function getLastCommit() \r
+{   \r
+       var urlHead = '';\r
+       if(sessionStarted){ urlHead = "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/refs/heads/"+branchName;}\r
+       else{ \r
+               // TODO: get url of the original repo.\r
+               return;\r
+       }\r
+\r
+    $.ajax({\r
+        beforeSend: function (xhr) { \r
+            if (userB64 != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: urlHead,\r
+        dataType:"json",\r
+        async: false,\r
+        success: function(success)\r
+        {              \r
+            shaLastCommit = success.object.sha;            \r
+        }\r
+    });\r
+}\r
+\r
+function getBaseTree()\r
+{      \r
+    $.ajax({ \r
+        beforeSend: function (xhr) { \r
+            if (userB64 != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/commits/" + shaLastCommit,\r
+        dataType:"json",\r
+        async: false,\r
+        success: function(success)\r
+        {   \r
+            shaBaseTree = success.tree.sha;\r
+            if (state){ setBlob(); }\r
+            else{ return; }            \r
+        },\r
+        error: function(){\r
+               return;\r
+        }\r
+    });    \r
+}\r
+\r
+function setNewTree()\r
+{\r
+    $.ajax({ \r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
+        type: "POST",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/trees", \r
+        async: false,\r
+        data:'{ "base_tree" : "'+shaBaseTree+'", '+\r
+                '"tree":[{ '+\r
+                    '"path":"'+ pathFile +'",'+\r
+                    '"mode":"100644",'+\r
+                    '"type":"blob",'+\r
+                    '"sha": "'+ shaBlob +'"'+\r
+                '}] '+\r
+            '}',        \r
+        success: function(success)\r
+        { // si l'appel a bien fonctionné\r
+            shaNewTree = JSON.parse(success).sha;\r
+            setNewCommit();            \r
+        },\r
+        error: function(){\r
+               return;\r
+        }\r
+    });\r
+}\r
+\r
+function setNewCommit()\r
+{\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
+        data:'{ "message" : "'+ commitMessage +'", '+\r
+                '"parents" :"'+shaLastCommit+'",'+ \r
+                '"tree": "'+shaNewTree+'"'+\r
+             '}',        \r
+        success: function(success)\r
+        {\r
+            shaNewCommit = JSON.parse(success).sha;\r
+            commit();          \r
+        },\r
+        error: function(){\r
+               return;\r
+        }\r
+    });\r
+}\r
+\r
+//Create a commit\r
+function commit()\r
+{\r
+    $.ajax({ \r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization", userB64); },\r
+        type: "POST",\r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/refs/heads/"+branchName, \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
+    });\r
+}\r
+\r
+// Create a blob\r
+function setBlob()\r
+{\r
+    $.ajax({\r
+        beforeSend: function (xhr) { xhr.setRequestHeader ("Authorization",  userB64); },\r
+        type: "POST",         \r
+        url: "https://api.github.com/repos/"+userName+"/"+githubRepo+"/git/blobs",         \r
+        async: false,\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
+            setNewTree();                  \r
+        },\r
+        error:function(error){ \r
+               displayMessage('Error : Problem parsing JSON', 40, 40); \r
+               return;\r
+       }\r
+    });\r
+}\r
+\r
+// Display file content\r
+function getFileContent(urlFile, newComment)\r
+{\r
+    $.ajax({\r
+        beforeSend: function (xhr) { \r
+            xhr.setRequestHeader ("Accept",  "application/vnd.github-blob.raw");\r
+            if (userB64 != ""){ xhr.setRequestHeader ("Authorization", userB64); }\r
+        },\r
+        type: "GET", \r
+        url: urlFile, \r
+        async:false,\r
+        success: function(success)\r
+        {\r
+            state = true;\r
+            replaceComment(newComment, success);            \r
+        }\r
+    });\r
+}\r
+\r
+function replaceComment(newComment, fileContent){\r
+       var arrayNew = newComment.split('\n');  \r
+       var lNew = arrayNew.length;\r
+       text = "";\r
+       var lines = fileContent.split("\n");\r
+       for (var i = 0; i < lines.length; i++) {\r
+               if(i == commentLineStart){\r
+                       // We change the comment\r
+                       for(var j = 0; j < lNew; j++){\r
+                               if(commentType == 1){ text += "\t# " + arrayNew[j] + "\n"; }\r
+                               else{\r
+                                       if(arrayNew[j] == ""){ text += "#"+"\n"; }\r
+                                       else{ text += "# " + arrayNew[j] + "\n"; }\r
+                               }\r
+                       }\r
+               }\r
+               else if(i < commentLineStart || i >= commentLineEnd){\r
+                       if(i == lines.length-1){ text += lines[i]; }\r
+                       else{ text += lines[i] + "\n"; }\r
+               }\r
+       }\r
+}\r
+\r
+function getCommentLastCommit(path){\r
+       var urlRaw;\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
+       }\r
+}\r
+\r
+function displayMessage(msg, widthDiv, margModal){\r
+       $('#modal').hide();\r
+       $('#btnCreateBranch').css('margin-left',widthDiv + '%');\r
+       $('#txtQuestion').text(msg);\r
+       $('#btnCreateBranch').text("Ok");\r
+       $('#btnCancelBranch').hide();\r
+       $('#modalQuestion').css({'left' : margModal + '%'})\r
+       $('#modalQuestion').show();\r
+       $('#modalQuestion').show().prepend('<a class="close"><img src="resources/icons/close.png" class="btnCloseQuestion" title="Close" alt="Close" /></a>');\r
+       $('body').append('<div id="fade"></div>');\r
+       $('#fade').css({'filter' : 'alpha(opacity=80)'}).fadeIn();\r
+}\r