//----------------------------------------------------------------------------
/** 
 * @fileoverview RESTEditor implementation 
 * @author Roger Ineichen roger@projekt01.ch
 * @author Arne Brodowski mail@arnebrodowski.de
 * @version Modified by Arne Brodowski 
 */
//----------------------------------------------------------------------------


var RESTEditorToolBarButtons = new Array(); // array of buttons

//---[ image resources ]-------------------------------------------------------
//var restEditorBold = './img/restEditorBold.gif';
//var restEditorItalic = './img/restEditorItalic.gif';
//var restEditorLink = './img/restEditorLink.gif';
//var restEditorCode = './img/restEditorCode.gif';
//var restEditorRule = './img/restEditorRule.gif';
//var restEditorBoldActive = './img/restEditorBoldActive.gif';
//var restEditorItalicActive = './img/restEditorItalicActive.gif';
//var restEditorLinkActive = './img/restEditorLinkActive.gif';
//var restEditorCodeActive = './img/restEditorCodeActive.gif';
//var restEditorRuleActive = './img/restEditorRuleActive.gif';

var restEditorBold = '/site_media/rest/img/text_bold.png';
var restEditorItalic = '/site_media/rest/img/text_italic.png';
var restEditorLink = '/site_media/rest/img/text_link.png';
var restEditorCode = '/site_media/rest/img/restEditorCode.gif';
var restEditorRule = '/site_media/rest/img/text_horizontalrule.png';
var restEditorFirstHeading = '/site_media/rest/img/text_heading_1.png';
var restEditorSecondHeading = '/site_media/rest/img/text_heading_2.png';
var restEditorIndent = '/site_media/rest/img/text_indent.png';
var restEditorImage = '/site_media/rest/img/picture.png';
var restEditorBrowse = '/site_media/rest/img/pictures.png';
var restEditorImageAdd = '/site_media/rest/img/picture_add.png';
var restEditorList = '/site_media/rest/img/text_list_bullets.png';

var restEditorBoldActive = './img/restEditorBoldActive.gif';
var restEditorItalicActive = './img/restEditorItalicActive.gif';
var restEditorLinkActive = './img/restEditorLinkActive.gif';
var restEditorCodeActive = './img/restEditorCodeActive.gif';
var restEditorRuleActive = './img/restEditorRuleActive.gif';


function RESTEditorToolBarButton(id, imgSrc) {
    this.id = id;
    this.imgSrc = imgSrc;
}


function RESTEditorToolBar(id) {
    this.id = id;
}

RESTEditorToolBar.prototype.init = function() {
    var self = this;
    this.textarea = document.getElementById(this.id);
    if ((typeof(document["selection"]) == "undefined")
        && (typeof(this.textarea["setSelectionRange"]) == "undefined")) {
        return;
    }
    this.resteditor = document.createElement("div");
    this.resteditor.className = 'RESTEditorToolBar';
    
    this.textarea.resteditor = self;
    
    id = 'resteditor-bold'
    title = "Bold text: **Example**"
    this.addButton(id, title, restEditorBold, function() {
        self.encloseSelection("**", "**");
        return false;
    });

    id = 'resteditor-italic'
    title = "Italic text: *Example*"
    this.addButton(id, title, restEditorItalic, function() {
        self.encloseSelection("*", "*");
        return false;
    });

    id = 'resteditor-link'
    title = "Link: `http://www.example.com/`_ "
    this.addButton(id, title, restEditorLink, function() {
        var uri = prompt("Enter URL")
        var sel = self.encloseSelection("`", "`_");
        if(uri != null) {
            self.appendAtEnd('.. _`' + sel + '`: '+uri)
        }else{
            self.appendAtEnd('.. _`' + sel + '`: ')
        }
        return false;
    });
/*
    id = 'code'
    title = "Code block: {{{ example }}}"
    this.addButton(id, title, restEditorCode, function() {
        self.encloseSelection("\n::\n\n  ", "\n");
    });
*/
    id = 'resteditor-rule'
    title = "Horizontal rule: ----"
    this.addButton(id, title, restEditorRule, function() {
        self.encloseSelection("\n----\n", "");
        return false;
    });
    
    id = 'resteditor-firstheadline'
    title = "Enclose text with headline markup"
    this.addButton(id, title, restEditorFirstHeading, function() {
       var sel = self.getSelection();
       var pad = sel.length ? Array(sel.length +1).join("=") : "";
       self.encloseSelection(pad+"\n", "\n"+pad+"\n\n");
       return false;
    });
    
    id = 'resteditor-secondheadline'
    title = "Add second level headline underline"
    this.addButton(id, title, restEditorSecondHeading, function() {
        var sel = self.getSelection();
        var pad = sel.length ? Array(sel.length +1).join("-") : "";
        self.encloseSelection("","\n"+pad+"\n");
        return false;
    });
    
    id = 'resteditor-indent'
    title = "Indent the selection by 4 chars"
    this.addButton(id, title, restEditorIndent, function() {
        self.indentSelection();
        return false;
    });
    
    id = "resteditor-list"
    title = "Add List"
    this.addButton(id, title, restEditorList, function() {
        self.encloseSelection("", "\n* \n* \n* \n")
        return false;
    });
    
    id = "resteditor-image"
    title = "Add an Image"
    this.addButton(id, title, restEditorImage, function() {
        var imageID = prompt("Enter Image-ID");
        if(imageID == null || imageID == "") {
            imageID = "";
        }else{
            imageID = "#"+imageID;
        }
        self.encloseSelection("","\n.. image:: "+imageID+"\n   :alt: \n")
        return false;
    });
    
    id = "resteditor-images"
    title = "Browse Images"
    this.addButton(id, title, restEditorBrowse, function() {
        function openImageChooser() {
    		var win = window.open('/__images__/', 'Image Chooser', 'height=500,width=800,resizable=yes,scrollbars=yes');
    		win.focus();
    		return false;
    	}
        
        openImageChooser();
        
    	function dismissPopup(win, pk) {
    		win.close()
    		self.encloseSelection("","\n.. image:: #"+pk+"\n   :alt: \n")
    	}
    	// evil but it works :S
        window.dismissPopup = dismissPopup;
       return false;
    });
    
    id = "resteditor-image-add"
    title = "Upload Image"
    this.addButton(id, title, restEditorImageAdd, function() {
        function openUploadWindow() {
            var win = window.open('/__upload__/', 'Image Upload', 'height=500,width=800,resizable=yes, scrollbars=yes');
            win.focus();
            return false;
        }
        
        openUploadWindow();
        
        function dismissUploader(win, pk) {
            win.close()
            self.encloseSelection("", "\n.. image:: #"+pk+"\n   :alt: \n")
        }
        
        window.dismissUploader = dismussUploader;
        return false;
    });
    
    this.textarea.parentNode.insertBefore(this.resteditor, this.textarea);
    
    // handle TAB pressed inside the textarea and convert to 4 spaces
    $(this.textarea).keydown(function(e){
        kc = e.keyCode ? e.keyCode : e.charCode ? e.charCode : e.which;
        if(kc == 9) { // TAB
            e.preventDefault();
            self.indentSelection()
            // naive approach to refocus the textarea. patches welcome.
            setTimeout("$('#"+this.id+"').focus()", 0)
            return false
        }
    })

   
    
}

RESTEditorToolBar.prototype.encloseSelection = function(prefix, suffix) {
    textarea = this.textarea;
    this.textarea.focus();
    var start, end, sel, scrollPos, subst;
    if (typeof(document["selection"]) != "undefined") {
        sel = document.selection.createRange().text;
    } else if (typeof(textarea["setSelectionRange"]) != "undefined") {
        start = textarea.selectionStart;
        end = textarea.selectionEnd;
        scrollPos = textarea.scrollTop;
        sel = textarea.value.substring(start, end);
    }
    if (sel.match(/ $/)) { // exclude ending space char
        sel = sel.substring(0, sel.length - 1);
        suffix = suffix + " ";
    }
    subst = prefix + sel + suffix;
    if (typeof(document["selection"]) != "undefined") {
        var range = document.selection.createRange().text = subst;
        textarea.caretPos -= suffix.length;
    } else if (typeof(textarea["setSelectionRange"]) != "undefined") {
        textarea.value = textarea.value.substring(0, start) + subst +  
            textarea.value.substring(end);
      if (sel) {
            textarea.setSelectionRange(start + subst.length, start + subst.length);
      } else {
            textarea.setSelectionRange(start + prefix.length, start + prefix.length);
      }
      textarea.scrollTop = scrollPos;
    }
    return sel
}

RESTEditorToolBar.prototype.getSelection = function() {
    textarea = this.textarea;
    this.textarea.focus();
    var start, end, sel, scrollPos, subst;
    if (typeof(document["selection"]) != "undefined") {
        sel = document.selection.createRange().text;
    } else if (typeof(textarea["setSelectionRange"]) != "undefined") {
        start = textarea.selectionStart;
        end = textarea.selectionEnd;
        scrollPos = textarea.scrollTop;
        sel = textarea.value.substring(start, end);
    }
    if (sel.match(/ $/)) { // exclude ending space char
        sel = sel.substring(0, sel.length - 1);
        suffix = suffix + " ";
    }
    return sel;
}

RESTEditorToolBar.prototype.appendAtEnd = function(content) {
    textarea = this.textarea;
    this.textarea.focus();
    scrollPos = textarea.scrollTop;
    textarea.value += ("\n" + content)
    textarea.scrollTop = scrollPos;
}

RESTEditorToolBar.prototype.indentSelection = function() {
    textarea = this.textarea;
    this.textarea.focus();
    var start, end, sel, scrollPos, subst;
    if (typeof(document["selection"]) != "undefined") {
        sel = document.selection.createRange().text;
    } else if (typeof(textarea["setSelectionRange"]) != "undefined") {
        start = textarea.selectionStart;
        end = textarea.selectionEnd;
        scrollPos = textarea.scrollTop;
        sel = textarea.value.substring(start, end);
    }
    //if (sel.match(/ $/)) { // exclude ending space char
    //    sel = sel.substring(0, sel.length - 1);
    //    suffix = suffix + " ";
    //}
    
    var matches = sel.match(/^(.*?)$/mg);
    if (matches.length > 1) {
		for (var i = 0; i < matches.length; i++) {
			matches[i] = matches[i] ? '    ' + matches[i] : '';
		}
		caretPosition = matches.join("\n")
	} else {
	    if(matches.length == 1) {
	        caretPosition = "    "+ matches[0]
	    }else{
		caretPosition = "    "
	    }
	}
	textarea.value = textarea.value.substring(0, start) + caretPosition +  
        textarea.value.substring(end);
    textarea.scrollTop = scrollPos;
	
}

RESTEditorToolBar.prototype.addButton = function(id, title, imgSrc, fn) {
    var btn = new RESTEditorToolBarButton(id, imgSrc)
    var a = document.createElement("A");
    var img = document.createElement("IMG");
    RESTEditorToolBarButtons[id] = btn;
    img.id = id;
    a.href = "#";
    a.title = title;
    $(a).click(fn);
    /*$(a).mouseover(function(e) {
        if (e) {
            ele = e.target.tagName ? e.target : e.target.parentNode;
        } else {
            ele = window.event.srcElement;
        }
        btn = RESTEditorToolBarButtons[ele.id];
        activeImgSrc = btn.activeImgSrc;
        ele.src = activeImgSrc;
        return false;
    });
    $(a).mouseout(function(e) {
        if (e) {
            ele = e.target.tagName ? e.target : e.target.parentNode;
        } else {
            ele = window.event.srcElement;
        }
        btn = RESTEditorToolBarButtons[ele.id];
        imgSrc = btn.imgSrc;
        ele.src = imgSrc;
        return false;
    });
    */
    a.tabIndex = 9999;
    img.src = imgSrc;
    img.alt = title;
    a.appendChild(img);
    this.resteditor.appendChild(a);
}

jQuery.fn.restEditor = function() {
  return this.each(function(){
    var editor = new RESTEditorToolBar(this.id);
    editor.init();
  });
};

$(function(){
	$('#id_content').restEditor();
})

