﻿// Unfinished ------------------------------------------------------------------
function rpComments_reply(test){
    alert('Not quite implemented yet');
}

function rpComments_edit(test){
    alert('Not quite implemented yet');
}

// Set variables and constants ------------------------------------------------
var callback;
var rp_commentServiceURL;
if (window.rpcomments_serviceurl) {
    rp_commentServiceURL = window.rpcomments_serviceurl;
}
else {
    rp_commentServiceURL = "http://matssvensson.com/paralell_content/comments/";
}

var rp_cssURL;
var rp_toolboxURL;

/* 
 if (window.rp_codebaseurl) {
 rp_toolboxURL = window.rp_codebaseurl + '/js/rp_toolbox_v2.js';
 rp_cssURL = window.rp_codebaseurl + '/css/rp_comments.css';
 }
 else {
 rp_toolboxURL = "http://restfulpath.googlecode.com/svn/trunk/js/rp_toolbox_v2.js";
 rp_cssURL = "http://restfulpath.googlecode.com/svn/trunk/css/rp_comments.css";
 }
 */
rp_toolboxURL = '/js/rp_toolbox_v2.js';
rp_cssURL = '/css/rp_comments.css';

var rp_waitMessage = '<div id="waitanim"></div>';
var rp_noContentMessage = '- Du måste skriva något först -';
var rp_linkText = "Tyck till om sidan";
var rp_initialScrollPosition = null;
var rp_currenCommentsURL = null;

var rp_xsl;
var rp_CommentSection;
var rp_commentOnloadAdded = false;
var rp_commentCSSdAdded = false;

if (window.rpcomments_local) {
    rp_xsl = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><xsl:if test="not(//div[@class=\'comment\'])"><p id="rpcomments_comments">No comments here yet, be the first to write one.</p></xsl:if><xsl:for-each select="div[@class=\'comments\']/div[@class=\'comment\']"><li class="rpcomments_comment"><xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute><h3 class="rpcomments_commenthead"><span class="rp_time rpcomments_commenttime"><xsl:value-of select="@time"/></span><span>Posted by</span><span class="rpcomments_commentauthor"><xsl:value-of select="div[@class=\'author\']"/><xsl:if test="not(div[@class=\'author\']/text())">Anonymous</xsl:if></span></h3><div><button><xsl:attribute name="onclick">rpComments_deleteComment("/<xsl:value-of select="@id"/>");</xsl:attribute>Delete</button><button onclick="rpComments_edit();return false;">Edit</button><button onclick="rpComments_reply();return false;">Reply</button></div><div class="rpcomments_commentcontent"><xsl:value-of select="div[@class=\'content\']"/></div></li></xsl:for-each></xsl:template></xsl:stylesheet>';
    rp_CommentSection = '<iframe name="rp_iframe" id="rp_iframe" onload="rp_getCommentsFromServer(rp_currenCommentsURL)" style="height: 0px; border: 0;"></iframe><div id="rpcomments_maincontainer"><h3 id="rpcomments_maincontainerhead">Comments</h3><ol id="rpcomments_comments" class="rpfx_oddeven"></ol><fieldset><form enctype="text/plain" method="post" id="rpcomments_addcomment" target="rp_iframe"><h3 id="rpcomments_addcommenthead">Add a comment</h3><input type="text" name="messagebody" id="rpcomments_messagebody"></input><div><textarea id="rpcomments_commenttext" rows="5"></textarea></div><div><input id="rpcomments_commentauthor"></input><label id="rpcomments_commentauthorlabel" for="rpcomments_commentauthor">Name</label></div><button onclick="rp_postCommentToServer(this.form); return false;">Add comment</button><div id="rpcomments_status"></div></form></fieldset></div>';
}
else {
    rp_xsl = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output method="html" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/><xsl:template match="/"><xsl:if test="not(//div[@class=\'comment\'])"><p id="rpcomments_comments">Inga kommentarer här ännu, bli först  att skriva en.</p></xsl:if><xsl:if test="div[@class=\'comments\']"><xsl:for-each select="div[@class=\'comments\']/div[@class=\'comment\']"><li class="rpcomments_comment"><xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute><h3 class="rpcomments_commenthead"><span class="rp_time rpcomments_commenttime"><xsl:value-of select="@time"/></span><span class="rpcomments_commentauthor"><xsl:value-of select="div[@class=\'author\']"/><xsl:if test="not(div[@class=\'author\']/text())">Anonym</xsl:if></span></h3><div class="rpcomments_commentcontent"><xsl:value-of select="div[@class=\'content\']"/></div></li></xsl:for-each></xsl:if></xsl:template></xsl:stylesheet>';
    rp_CommentSection = '<iframe name="rp_iframe" id="rp_iframe" onload="rp_getCommentsFromServer(rp_currenCommentsURL)" style="height: 0px; border: 0;"></iframe><fieldset id="rpcomments_maincontainer"><button id="rpcomments_hidecommentsbutton" onclick="rp_hideCommentSection(); return false;"> X </button><h3 id="rpcomments_maincontainerhead">Kommentarer</h3><ol id="rpcomments_comments" class="rpfx_oddeven"></ol><fieldset id="kommentarer"><form method="post" id="rpcomments_addcomment" target="rp_iframe"><h3 id="rpcomments_addcommenthead">Lägg till kommentar</h3><input type="text" name="messagebody" id="rpcomments_messagebody"></input><div><textarea id="rpcomments_commenttext" rows="5"></textarea></div><div><input id="rpcomments_commentauthor"></input><label id="rpcomments_commentauthorlabel" for="rpcomments_commentauthor">Namn</label></div><button onclick="rp_postCommentToServer(this.form); return false;">Skicka</button><a id="standalonelink"> </a><div id="rpcomments_status"></div></form></fieldset><button id="rpcomments_hidecommentsbutton" onclick="rp_hideCommentSection(); return false;"> X </button></fieldset>';
}

// Update commentsection -------------------------------------------------------
function rp_getDataFromServer(dataURL, callbackname){
    var head = document.getElementsByTagName("head")[0];
    var date = new Date();
    var cacheBuster = date.getTime();
    var dataScriptNode = document.createElement("script");
    dataScriptNode.setAttribute("type", "text/javascript");
    if (callbackname) {
        dataScriptNode.setAttribute("src", dataURL + "?cachebuster=" + cacheBuster + "&" + callbackname);
    }
    else {
        dataScriptNode.setAttribute("src", dataURL + "?cachebuster=" + cacheBuster);
    }
    dataScriptNode.setAttribute("id", "datanode");
    head.appendChild(dataScriptNode);
}

// Populate Comments -----------------------------------------------------------
function rp_populateComments(responseText){
    document.getElementById('rpcomments_comments').innerHTML = unescape(rpToolbox_xslTransform(responseText, rp_xsl));
    rpToolbox_timeNodes2local();
    rpToolbox_setOddEvenClasses('rpcomments_maincontainer');
    document.getElementById('rpcomments_status').innerHTML = ' &nbsp ';
    location.href = "#kommentarer";
}

// Update Count ----------------------------------------------------------------
function rp_updateCount(count, countNode){
    if (!count || count === '0' || count === '' || count === ' ') {
        countNode.firstChild.nodeValue = "";
    }
    else {
        countNode.firstChild.nodeValue = " (" + count + ")";
    }
    rpToolbox_removeClassName(countNode.parentNode, 'rp_commentcountloading');
}

// Update CommentCount ---------------------------------------------------------
function rp_updateCommentCount(countURL){
    var countNode = document.getElementById("rp_commentcount_" + countURL);
    callback = function(responseText){
        rp_updateCount(responseText, countNode);
    };
    rp_getDataFromServer(countURL + "/count.js");
}

// Get Comments From Server ----------------------------------------------------
function rp_getCommentsFromServer(commentsURL){
    document.getElementById('rpcomments_status').innerHTML = rp_waitMessage;
    callback = function(responseText){
        if (document.getElementById("rp_commentcount_" + commentsURL)) {
            rp_updateCommentCount(commentsURL);
        }
        rp_populateComments(unescape(unescape(responseText)));
    };
    rp_getDataFromServer(commentsURL + ".js");
}

// Update all CommentCounts ----------------------------------------------------
function rp_updateAllCommentCounts(countNodes){
    var countNode = countNodes.shift();
    callback = function(responseText){
        rp_updateCount(responseText, countNode);
        if (countNodes.length > 0) {
            countNode = countNodes.shift();
            rp_getDataFromServer(countNode.parentNode.href + "/count.js");
        }
    };
    rp_getDataFromServer(countNode.parentNode.href + "/count.js");
}

// Hide commentsection ---------------------------------------------------------
function rp_hideCommentSection(){
    rpToolbox_hideElement(document.getElementById('rpcomments_maincontainer'));
    window.scroll(0, rp_initialScrollPosition);
}

// Add comments ----------------------------------------------------------------
function rp_postCommentToServer(form){
    var commentText = document.getElementById('rpcomments_commenttext');
    if (commentText.value === "") {
        document.getElementById('rpcomments_status').innerHTML = rp_noContentMessage;
    }
    else {
        var authorTextField = document.getElementById('rpcomments_commentauthor');
        var messagebody = document.getElementById('rpcomments_messagebody');
        messagebody.value = escape("<div class=\"author\">" + authorTextField.value + "</div><div class=\"content\">" + escape(rpToolbox_text2HTML(commentText.value)) + "</div>");
        form.submit();
        commentText.value = "";
    }
}

// Separates and returns the path to the commented content from the comment url --
function rp_getCommetedContentPath(commentURL){
    var path = commentURL.substring(commentURL.lastIndexOf('/') + 1);
    path = decodeURIComponent(path);
    return path.addTrailingSlash();
}

// Show commentsection ---------------------------------------------------------
function rp_openCommentSection(commentsURL){
    // Save scroll position to be returned to after comments are closed (crossbrowser version)
    rp_initialScrollPosition = (window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop);
    window.document.body.style.marginBottom = '50px';
    var commentSection = document.getElementById('rpcomments_maincontainer');
    rp_currenCommentsURL = commentsURL;
    if (commentSection) {
        rpToolbox_showElement(commentSection);
        rp_getCommentsFromServer(commentsURL);
    }
    else {
        var wrapper = document.createElement('div');
        wrapper.innerHTML = rp_CommentSection;
        if (document.getElementById('rp_center')) {
            document.getElementById('rp_center').appendChild(wrapper);
        }
        else {
            document.body.appendChild(wrapper);
        }
    }
    var commentedContentURL = rp_getCommetedContentPath(commentsURL);
    var commentedContentPath = (commentedContentURL.addTrailingSlash().replace(location.href, '')).removeTrailingSlash();
    var mouseover = '';
    if (!window.rpcomments_startopened && !window.rpcomments_nocommentlinks) {
        //mouseover = 'onmouseover="rpToolbox_highLightElementByPath(\'' + commentedContentPath + '\')" onmouseout="rpToolbox_unHighLightElementByPath(\'' + commentedContentPath + '\')"';
    }
    document.getElementById('rpcomments_maincontainerhead').innerHTML = 'Kommentarer för <a href="' + commentedContentURL + '" ' + mouseover + '>' + decodeURIComponent(commentedContentURL).removeTrailingSlash().cleanUpText() + '</a>';
    
    document.getElementById('rpcomments_addcomment').action = commentsURL + "/comment";
    if (document.getElementById('standalonelink')) {
        document.getElementById('standalonelink').href = commentsURL;
    }
    location.href = "#rpcomments_maincontainer";
    return false;
}

// Create sub content comment links ---------------------------------------------------------
function rp_createSubContentCommentLinks(xml){
    var wrapper = document.createElement('div');
    wrapper.innerHTML = xml;
    var path;
    var link;
    var node;
    var item;
    var listItems = wrapper.getElementsByTagName('li');
    for (var i = 0; i < listItems.length; i++) {
        item = listItems[i];
        path = (decodeURIComponent(item.id).addTrailingSlash().replace(location.href, '')).removeTrailingSlash();
        if (path && item.innerHTML !== '0') {
            node = rpToolbox_findNodeByPath(path, document.getElementById('maincontent').firstChild);
            if (node) {
                wrapper = window.document.createElement("span");
                wrapper.innerHTML = '<a onmouseover="rpToolbox_highLightElementByPath(\'' + path + '\')" onmouseout="rpToolbox_unHighLightElementByPath(\'' + path + '\')" >' + item.innerHTML + '</a>';
                link = wrapper.firstChild;
                link.className = 'rp_commentlink';
                link.title = 'Comments for... ' + path;
                link.href = rp_commentServiceURL + item.id;
                link.onclick = function(){
                    rp_openCommentSection(this.href);
                    return false;
                };
                node.appendChild(link);
            }
        }
    }
}

// Create CommentLinks ---------------------------------------------------------
function rp_createCommentLinks(){
    //alert('rp_createCommentLinks');
    //rp_getDataFromServer(rp_commentServiceURL + encodeURIComponent(location.href.removeTrailingSlash()) + "/counts" + ".js", "callbackname=rp_createSubContentCommentLinks");
    var commentTags = rpToolbox_getElementsByClassName("rpcomments", null, "span");
    var commentTag;
    var commentLink;
    var linkText;
    var linkURL;
    var commentCount;
    var countNodes = [];
    for (var i = 0; i < commentTags.length; i++) {
        commentTag = commentTags[i];
        commentLink = document.createElement("a");
        commentLink.className = "rp_commentlink rp_commentcountloading";
        if (commentTag.firstChild && commentTag.firstChild.nodeValue) {
            linkText = commentTag.firstChild.nodeValue;
        }
        else {
            linkText = rp_linkText;
        }
        if (commentTag.id) {
            linkURL = commentTag.id;
            if (linkURL.startsWith('#')) {
                linkURL = location.href.removeTrailingSlash() + "/" + linkURL;
            }
        }
        else {
            linkURL = location.href.removeTrailingSlash();
        }
        linkURL = rp_commentServiceURL + encodeURIComponent(linkURL);
        commentLink.setAttribute("href", linkURL);
        commentLink.onclick = function(){
            rp_openCommentSection(this.href);
            return false;
        };
        commentLink.appendChild(document.createTextNode(linkText));
        commentCount = document.createElement("span");
        commentCount.setAttribute("id", "rp_commentcount_" + linkURL);
        commentCount.appendChild(document.createTextNode(' '));
        commentLink.appendChild(commentCount);
        commentTag.parentNode.replaceChild(commentLink, commentTag);
        countNodes.push(commentCount);
    }
    rp_updateAllCommentCounts(countNodes);
}

// --- Delete comment ----------------------------------------------------------
function rpComments_deleteComment(commentID){
    var callback = function(){
        rp_getCommentsFromServer(location.href);
    };
    document.getElementById('rpcomments_status').innerHTML = rp_waitMessage;
    rpToolbox_RESTdelete(location.href + commentID, callback);
}

// Import javascript toolbox if needed ---------------------------------------------------
function rpToolbox_import(toolboxURL, callback){
    if (!window.rpToolbox_toolboxLoaded) {
        rpToolbox_toolboxLoadedCallBack = callback;
        var newScriptNode = document.createElement("script");
        newScriptNode.src = toolboxURL;
        newScriptNode.type = "text/javascript";
        document.getElementsByTagName('head')[0].appendChild(newScriptNode);
    }
    else {
        callback();
    }
}

// Initiate --------------------------------------------------------------------
function rp_commentInit(){
    if (!window.rpToolbox_toolboxLoaded) {
        rpToolbox_import(rp_toolboxURL, rp_commentInit);
    }
    else {
        rpToolbox_addCSS(rp_cssURL);
        if (window.rpcomments_startopened && window.rpcomments_nocommentlinks) {
            if (window.rpcomments_local) {
                rp_openCommentSection(location.href);
            }
            else {
                rp_openCommentSection(rp_commentServiceURL + encodeURIComponent(location.href.removeTrailingSlash()));
            }
        }
        else {
            //if(window.document.body && rpToolbox_getElementByClassName('rpcomments')){
            //	document.write('<span class="rpcomments"></span>');	
            //}
            if (!rp_commentOnloadAdded) {
                rpToolbox_addOnLoad(rp_createCommentLinks);
                rp_commentOnloadAdded = true;
            }
        }
    }
}

// Start -----------------------------------------------------------------------
//rp_commentInit();

rpToolbox_addOnLoad(rp_createCommentLinks);
rpToolbox_addCSS(rp_cssURL);

