// new edit toolbar used with permission
// by Alex King
// http://www.alexking.org/

var edButtons = new Array();
var edLinks = new Array();
var edOpenTags = new Array();
var edLinkButtonIndex;

function edButton(id, display, tagStart, tagEnd, access, open) {
    this.id = id;               // used to name the toolbar button
    this.display = display;     // label on button
    this.tagStart = tagStart;   // open tag
    this.tagEnd = tagEnd;       // close tag
    this.access = access;       // access key
    this.open = open;           // set to -1 if tag does not need to be closed
}

function zeroise(number, threshold) {
    // FIXME: or we could use an implementation of printf in js here
    var str = number.toString();
    if (number < 0) { str = str.substr(1, str.length) }
    while (str.length < threshold) { str = "0" + str }
    if (number < 0) { str = '-' + str }
    return str;
}

var now = new Date();
var datetime = now.getFullYear() + '-' + 
                zeroise(now.getMonth() + 1, 2) + '-' +
                zeroise(now.getDate(), 2) + 'T' + 
                zeroise(now.getHours(), 2) + ':' + 
                zeroise(now.getMinutes(), 2) + ':' + 
                zeroise(now.getSeconds() ,2) +
                // FIXME: we could try handling timezones like +05:30 and the like
                zeroise((now.getTimezoneOffset()/60), 2) + ':' + '00';

edButtons[edButtons.length] = 
new edButton('ed_strong'
,'strong'
,'<strong>'
,'</strong>'
,'strong'
);

edButtons[edButtons.length] = 
new edButton('ed_em'
,'em'
,'<em>'
,'</em>'
,'em'
);

//edLinkButtonIndex = edButtons.length;
//edButtons[edButtons.length] = 
//new edButton('ed_link'
//,'link'
//,''
//,'</a>'
//,'a'
//); // special case

edButtons[edButtons.length] = 
new edButton('ed_block'
,'b-quote'
,'<blockquote>'
,'</blockquote>'
,'q'
);

edButtons[edButtons.length] = 
new edButton('ed_img'
,'img'
,''
,''
,'m'
,-1
); // special case

edButtons[edButtons.length] = 
new edButton('ed_ul'
,'ul'
,'<ul>\n'
,'</ul>\n\n'
,'u'
);

edButtons[edButtons.length] = 
new edButton('ed_ol'
,'ol'
,'<ol>\n'
,'</ol>\n\n'
,'o'
);

edButtons[edButtons.length] = 
new edButton('ed_li'
,'li'
,'<li>'
,'</li>\n'
,'l'
);

//edButtons[edButtons.length] = 
//new edButton('ed_pre'
//,'code'
//,'<code>'
//,'</code>'
//,'c'
//);

//edButtons[edButtons.length] = 
//new edButton('ed_more'
//,'more'
//,'<!--more-->'
//,''
//,'t'
//,-1
//);

//edButtons[edButtons.length] = 
//new edButton('ed_next'
//,'page'
//,'<!--nextpage-->'
//,''
//,'p'
//,-1
//);

function edLink() {
    this.display = '';
    this.URL = '';
    this.newWin = 0;
}

edLinks[edLinks.length] = new edLink('WordPress'
                                    ,'http://wordpress.org/'
                                    );

edLinks[edLinks.length] = new edLink('alexking.org'
                                    ,'http://www.alexking.org/'
                                    );

function edShowButton(button, i) {
    if (button.id == 'ed_img') {
        document.write('<input type="button" tabindex="-1" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertImage(edCanvas);" value="' + button.display + '" />');
    }
    else if (button.id == 'ed_link') {
        document.write('<input type="button" tabindex="-1" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertLink(edCanvas, ' + i + ');" value="' + button.display + '" />');
    }
    else {
        document.write('<input type="button" tabindex="-1" id="' + button.id + '" accesskey="' + button.access + '" class="ed_button" onclick="edInsertTag(edCanvas, ' + i + ');" value="' + button.display + '"  />');
    }
}

function edShowLinks() {
    var tempStr = '<select onchange="edQuickLink(this.options[this.selectedIndex].value, this);"><option value="-1" selected>(Quick Links)</option>';
    for (i = 0; i < edLinks.length; i++) {
        tempStr += '<option value="' + i + '">' + edLinks[i].display + '</option>';
    }
    tempStr += '</select>';
    document.write(tempStr);
}

function edAddTag(button) {
    if (edButtons[button].tagEnd != '') {
        edOpenTags[edOpenTags.length] = button;
        document.getElementById(edButtons[button].id).value = '/' + document.getElementById(edButtons[button].id).value;
    }
}

function edRemoveTag(button) {
    for (i = 0; i < edOpenTags.length; i++) {
        if (edOpenTags[i] == button) {
            edOpenTags.splice(i, 1);
            document.getElementById(edButtons[button].id).value =       document.getElementById(edButtons[button].id).value.replace('/', '');
        }
    }
}

function edCheckOpenTags(button) {
    var tag = 0;
    for (i = 0; i < edOpenTags.length; i++) {
        if (edOpenTags[i] == button) {
            tag++;
        }
    }
    if (tag > 0) {
        return true; // tag found
    }
    else {
        return false; // tag not found
    }
}   

function edCloseAllTags() {
    var count = edOpenTags.length;
    for (o = 0; o < count; o++) {
        edInsertTag(edCanvas, edOpenTags[edOpenTags.length - 1]);
    }
}

function edQuickLink(i, thisSelect) {
    if (i > -1) {
        var newWin = '';
        if (edLinks[i].newWin == 1) {
            newWin = ' target="_blank"';
        }
        var tempStr = '<a href="' + edLinks[i].URL + '"' + newWin + '>' 
                    + edLinks[i].display
                    + '</a>';
        thisSelect.selectedIndex = 0;
        edInsertContent(edCanvas, tempStr);
    }
    else {
        thisSelect.selectedIndex = 0;
    }
}

function edSpell(myField) {
    var word = '';
    if (document.selection) {
        myField.focus();
        var sel = document.selection.createRange();
        if (sel.text.length > 0) {
            word = sel.text;
        }
    }
    else if (myField.selectionStart || myField.selectionStart == '0') {
        var startPos = myField.selectionStart;
        var endPos = myField.selectionEnd;
        if (startPos != endPos) {
            word = myField.value.substring(startPos, endPos);
        }
    }
    if (word == '') {
        word = prompt('Enter a word to look up:', '');
    }
    if (word != null && word != '') {
        window.open('http://www.m-w.com/cgi-bin/dictionary?book=Dictionary&va=' + escape(word));
    }
}

function edToolbar() {
    document.write('<div id="ed_toolbar">');
    for (i = 0; i < edButtons.length; i++) {
        edShowButton(edButtons[i], i);
    }
    document.write('<input type="button" tabindex="-1" id="ed_close" class="ed_button" onclick="edCloseAllTags();" title="Close all open tags" value="Close Tags" />');
  //document.write('<input type="button" tabindex="-1" id="ed_spell" class="ed_button" onclick="edSpell(edCanvas);" title="Dictionary lookup" value="Spell" />');
    document.write('<input type="button" tabindex="-1" id="ed_para" class="ed_button" onclick="edMakePara(edCanvas);" title="Add paragraph and line break tags" value="Format" />');
  //edShowLinks(); // disabled by default
    document.write('</div>');
}

// insertion code

function edInsertTag(myField, i) {
    //IE support
    if (document.selection) {
        myField.focus();
        sel = document.selection.createRange();
        if (sel.text.length > 0) {
            sel.text = edButtons[i].tagStart + sel.text + edButtons[i].tagEnd;
        }
        else {
            if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
                sel.text = edButtons[i].tagStart;
                edAddTag(i);
            }
            else {
                sel.text = edButtons[i].tagEnd;
                edRemoveTag(i);
            }
        }
        myField.focus();
    }
    //MOZILLA/NETSCAPE support
    else if (myField.selectionStart || myField.selectionStart == '0') {
        var startPos = myField.selectionStart;
        var endPos = myField.selectionEnd;
        var cursorPos = endPos;
        var scrollTop = myField.scrollTop;

        if (startPos != endPos) {
            myField.value = myField.value.substring(0, startPos)
                          + edButtons[i].tagStart
                          + myField.value.substring(startPos, endPos) 
                          + edButtons[i].tagEnd
                          + myField.value.substring(endPos, myField.value.length);
            cursorPos += edButtons[i].tagStart.length + edButtons[i].tagEnd.length;
        }
        else {
            if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
                myField.value = myField.value.substring(0, startPos) 
                              + edButtons[i].tagStart
                              + myField.value.substring(endPos, myField.value.length);
                edAddTag(i);
                cursorPos = startPos + edButtons[i].tagStart.length;
            }
            else {
                myField.value = myField.value.substring(0, startPos) 
                              + edButtons[i].tagEnd
                              + myField.value.substring(endPos, myField.value.length);
                edRemoveTag(i);
                cursorPos = startPos + edButtons[i].tagEnd.length;
            }
        }
        myField.focus();
        myField.selectionStart = cursorPos;
        myField.selectionEnd = cursorPos;
        myField.scrollTop = scrollTop;
    }
    else {
        if (!edCheckOpenTags(i) || edButtons[i].tagEnd == '') {
            myField.value += edButtons[i].tagStart;
            edAddTag(i);
        }
        else {
            myField.value += edButtons[i].tagEnd;
            edRemoveTag(i);
        }
        myField.focus();
    }
}

function edInsertContent(myField, myValue) {
    //IE support
    if (document.selection) {
        myField.focus();
        sel = document.selection.createRange();
        sel.text = myValue;
        myField.focus();
    }
    //MOZILLA/NETSCAPE support
    else if (myField.selectionStart || myField.selectionStart == '0') {
        var startPos = myField.selectionStart;
        var endPos = myField.selectionEnd;
        myField.value = myField.value.substring(0, startPos)
                      + myValue 
                      + myField.value.substring(endPos, myField.value.length);
        myField.focus();
        myField.selectionStart = startPos + myValue.length;
        myField.selectionEnd = startPos + myValue.length;
    } else {
        myField.value += myValue;
        myField.focus();
    }
}

/*function edInsertLink(myField, i, defaultValue) {    
    if (!defaultValue) {
        defaultValue = 'http://';
    }
    if (!edCheckOpenTags(i)) {
        var URL = prompt('Enter the URL' ,defaultValue);
        if (URL) {
            edButtons[i].tagStart = '<a href="' + URL + '">';
            edInsertTag(myField, i);
        }
    }
    else {
        edInsertTag(myField, i);
    }
} */

function edInsertLink(myField, i) {
    if (!edCheckOpenTags(i)) {
    
        //IE support
        var linkText;
        if (document.selection) {
            myField.focus();
            sel = document.selection.createRange();
            linkText=sel.text;
        }
        //MOZILLA/NETSCAPE support
        else if (myField.selectionStart || myField.selectionStart == '0') {
            var startPos = myField.selectionStart;
            var endPos = myField.selectionEnd;

            linkText=myField.value.substring(startPos, endPos);
        }

        var w = window.open('/wiki/linkdialog.jhtml?text='+escape(linkText),'GRMLinkLibrary','width=680,height=370,scrollbars=no');
        w.focus();
    }
    else {
        edInsertTag(myField, i);
    }
}


function edInsertImage(myField) {
    var w = window.open('/webshare/weblog/forms/?dialog=imagebrowser&actionPageId='+ edToolbarActionPageId,'GRMImageLibrary','width=880,height=560,scrollbars=no');
    w.focus();
}

function edMakePara(myField)
{    
    //IE support
    if (document.selection) {
        myField.focus();
        sel = document.selection.createRange();
        if (sel.text.length > 0) {
            sel.text = makePara(sel.text);
        } else {
            myField.value = makePara(myField.value);
        }
        myField.focus();
    }
    //MOZILLA/NETSCAPE support
    else if (myField.selectionStart || myField.selectionStart == '0') {
        var startPos = myField.selectionStart;
        var endPos = myField.selectionEnd;
        var cursorPos = endPos;
        var scrollTop = myField.scrollTop;

        if (startPos != endPos) {
            myField.value = myField.value.substring(0, startPos)
                          + makePara(myField.value.substring(startPos, endPos))
                          + myField.value.substring(endPos, myField.value.length);
        } else {
            myField.value = makePara(myField.value);
        }
        
        myField.focus();
        //myField.selectionStart = cursorPos;
        //myField.selectionEnd = cursorPos;
        //myField.scrollTop = scrollTop;
    }
    else {
        //alert(myField.value);
        myField.value = addPara(myField.value);
        myField.focus();
    }
}

function makePara(s)
{   
    if (s.indexOf('<p>') >= 0)
    {
        alert('Text already contains paragraph tags');
        return s;
    }
    
    var ch;
    var r = '<p>';
    var oneNL = false;
    for (var i = 0; i < s.length; i++)
    {
       ch = s.charAt(i);
       if (oneNL)
       {
           if (ch == '\r')
           {
               // ignore - windows
           }
           else if (ch == '\n')
           {
               r += '</p>\n\n<p>';
               oneNL = false;
           }
           else
           {
               r += '<br/>\n';
               r += ch;
               oneNL = false;
           }
       }
       else if (ch == '\n')
       {
           oneNL = true;
       }
       else if (ch == '\r')
       {
           // ignore - windows
       }
       else
       {
           r += ch;
       }
    }
    r += '</p>';
    return r;
}

function edInsertTagInOpener(myField, myTag) {
    //IE support
    if (window.opener.document.selection) {
        myField.focus();
        sel = window.opener.document.selection.createRange();
        if (sel.text.length == 0) {
            sel.text = '<' + myTag + '>';
        } else {
            sel.text = '<' + myTag + '>' + sel.text + '</' + myTag + '>';
        }
        myField.focus();
    }
    //MOZILLA/NETSCAPE support
    else if (myField.selectionStart || myField.selectionStart == '0') {
        var startPos = myField.selectionStart;
        var endPos = myField.selectionEnd;
        myField.value = myField.value.substring(0, startPos)
                      + myValue 
                      + myField.value.substring(endPos, myField.value.length);
        myField.focus();
        myField.selectionStart = startPos + myValue.length;
        myField.selectionEnd = startPos + myValue.length;
    } else {
        myField.value += myValue;
        myField.focus();
    }
}

