/*
 * Copyright (c) 2010, glig.com All Rights Reserved
 *
 * Editor scripts.
 */

//==============================================================
// Editor :: glig.ui.editor
//==============================================================

var glig       = (glig ? glig : function() {});
glig.ui        = (glig.ui ? glig.ui : function() {});
glig.ui.editor = (glig.ui.editor ? glig.ui.editor : function() {});

glig.ui.editor.insert_text = function(textarea_id, text)
{
    var textarea = glig.resolve_target(textarea_id);

    textarea.focus();

    if(document.selection)
    {
        textarea.focus();
        var range = document.selection.createRange();
//        if(range.parentNode != textarea)
//            return false;

        range.text = text;
    }
    else if(glig.isset(textarea.selectionStart))
    {
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;

        textarea.value = textarea.value.substring(0, start) + text + textarea.value.substring(end, textarea.value.length);
    }
    else
    {
        textarea.value += text;
    }

    if(start != null)
    {
        glig.ui.editor.set_caret_position(textarea_id, start + text.length);
    }

    return true;
}

glig.ui.editor.set_caret_position = function(textarea_id, pos)
{
    var textarea = glig.resolve_target(textarea_id);

    if(textarea.createTextRange)
    {
        var range = textarea.createTextRange();
        range.move('character', pos);
//        range.collapse(true); 
//        range.moveEnd('character', pos); 
//        range.moveStart('character', pos); 

        range.select();
    }
    else if(glig.isset(textarea.selectionStart))
    {
        textarea.focus();
        textarea.setSelectionRange(pos, pos);
    }
}

glig.ui.editor.set_selection_range = function(textarea_id, start, end)
{
    var textarea = glig.resolve_target(textarea_id);

    if(textarea.setSelectionRange)
    {
        textarea.setSelectionRange(start, end);
    }
    else if(textarea.createTextRange)
    {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', end);
        range.moveStart('character', start);
        range.select();
    }
}

glig.ui.editor.wrap_selection = function(options)
{
    var textarea_id  = options["textarea_id"];
    var prefix       = glig.arrvar(options, "prefix");
    var postfix      = glig.arrvar(options, "postfix");
    var default_text = glig.arrvar(options, "default_text", "");
    var select       = glig.arrvar(options, "select", false);

    var textarea = glig.resolve_target(textarea_id);

    textarea.focus();

    if(document.selection)
    {
        range = document.selection.createRange();
        range.text = prefix + range.text + postfix;

        text = (text ? text : default_text);
    }
    else if(glig.isset(textarea.selectionStart))
    {
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var text = textarea.value.substring(start, end);

        text = (text ? text : default_text);

        textarea.value = textarea.value.substring(0, start) + prefix + text + postfix + textarea.value.substring(end, textarea.value.length);
    }
    if(start != null)
    {
        if(end == start || select)
            offset = start + prefix.length;
        else
            offset = end + prefix.length + postfix.length;

        glig.ui.editor.set_caret_position(textarea_id, offset);
    }

    if(select)
    {
        glig.ui.editor.set_selection_range(textarea_id, start + prefix.length, start + prefix.length + text.length);
    }
}

glig.ui.editor.insert_tag = function(textarea_id, tag, attribute, value)
{
    var prefix  = "<" + tag + " " + attribute + "=" + value + ">";
    var postfix = "</" + tag + ">";

    glig.ui.editor.wrap_selection
    ({
        "textarea_id":  textarea_id,
        "prefix":       prefix,
        "postfix":      postfix
    });
}

glig.ui.editor.insert_link = function(textarea_id, url)
{
    var prefix  = "<a href=\"" + encodeURI(url) + "\">";
    var postfix = "</a>";

    glig.ui.editor.wrap_selection
    ({
        "textarea_id":  textarea_id,
        "prefix":       prefix,
        "postfix":      postfix,
        "default_text": "Link",
        "select":       true
    });
}

glig.ui.editor.insert_image = function(textarea_id, url)
{
    var code = "<img src=\"" + encodeURI(url) + "\" />";
    glig.ui.editor.insert_text(textarea_id, code);
}

glig.ui.editor.perform_action = function(textarea_id, action, rel)
{
    glig.ui.close_popin_panel();

    if(action == "bold")
    {
        glig.ui.editor.wrap_selection
        ({
            "textarea_id":  textarea_id,
            "prefix":       "<b>",
            "postfix":      "</b>"
        });
    }
    else if(action == "italic")
    {
        glig.ui.editor.wrap_selection
        ({
            "textarea_id":  textarea_id,
            "prefix":       "<i>",
            "postfix":      "</i>"
        });
    }
    else if(action == "underline")
    {
        glig.ui.editor.wrap_selection
        ({
            "textarea_id":  textarea_id,
            "prefix":       "<u>",
            "postfix":      "</u>"
        });
    }
    else if(action == "align_left" || action == "align_center" || action == "align_right")
    {
        glig.ui.editor.insert_tag(textarea_id, "p", "align", action.substr(6));
    }
    else if(action == "font")
    {
        panel = glig.ui.open_popin_panel({ "rel": rel, "class": "font_picker_widget" });
        glig.ui.editor.font_picker_draw(panel, textarea_id);
    }
    else if(action == "color")
    {
        panel = glig.ui.open_popin_panel({ "rel": rel, "class": "color_picker_widget" });
        glig.ui.color_picker.draw(panel, textarea_id, "glig.ui.editor.color_picker_process");
    }
    else if(action == "size")
    {
        panel = glig.ui.open_popin_panel({ "rel": rel, "class": "font_picker_widget" });
        glig.ui.editor.font_size_picker_draw(panel, textarea_id);
    }
    else if(action == "link")
    {
        panel = glig.ui.open_popin_panel({ "rel": rel, "class": "link_adder_widget" });
        glig.ui.editor.link_adder_draw(panel, textarea_id);
    }
    else if(action == "image")
    {
        panel = glig.ui.open_popin_panel({ "rel": rel, "class": "image_adder_widget" });
        glig.ui.editor.image_adder_draw(panel, textarea_id);
    }
}

glig.ui.editor.add_smiley = function(textarea_id, label)
{
    // convenience function

    var code = " :" + label + ":";
    glig.ui.editor.insert_text(textarea_id, code);
    return false;
}

glig.ui.editor.submit_preview = function(preview_id, textarea_id)
{
    var preview = glig.resolve_target(preview_id);
    var textarea = glig.resolve_target(textarea_id);

    if(!preview || !textarea)
        return false;

    glig.ajax.send_request
    ({
        "url":       "/ajax/submit_preview?form_id=text_editor_widget",
        "method":    "post",
        "post_vars": { "content": textarea.value },
        "callback":  glig.ui.editor.preview_response_received,
        "args":      { "preview_id": preview_id }
    });

    return false;
}

glig.ui.editor.preview_response_received = function(options)
{
    //@@@@@@
    var preview = glig.resolve_target(options["args"]["preview_id"]);

    preview.style.visibility = "visible";

    if(options["error"] == false)
    {
        preview.innerHTML = options["response"];
    }
    else
    {
        preview.innerHTML = "An error occurred. Please try again!";
    }
}

glig.ui.editor.font_picker_draw = function(panel, textarea_id)
{
    js = "glig.ui.editor.font_picker_process('" + textarea_id + "',className)";

    str  =  "";
    str += "<ul>";
    str += "<li class=font_normal onClick=\"" + js + "\">Normal</a><br>";
    str += "<li class=font_times onClick=\"" + js + "\">Times New Roman</a><br>";
    str += "<li class=font_courier onClick=\"" + js + "\">Courier New</a><br>";
    str += "<li class=font_tahoma onClick=\"" + js + "\">Tahoma</a><br>";
    str += "<li class=font_verdana onClick=\"" + js + "\">Verdana</a><br>";
    str += "<li class=font_comic onClick=\"" + js + "\">Comic Sans</a><br>";
    str += "<li class=font_impact onClick=\"" + js + "\">Impact</a><br>";
    str += "</ul>";

    panel.innerHTML = str;
}

glig.ui.editor.font_size_picker_draw = function(panel, textarea_id)
{
    js = "glig.ui.editor.font_size_picker_process('" + textarea_id + "',className)";

    str  =  "";
    str += "<ul>";
    str += "<li class=size_tiny onClick=\"" + js + "\">Tiny</a><br>";
    str += "<li class=size_small onClick=\"" + js + "\">Small</a><br>";
    str += "<li class=size_normal onClick=\"" + js + "\">Normal</a><br>";
    str += "<li class=size_large onClick=\"" + js + "\">Large</a><br>";
    str += "<li class=size_huge onClick=\"" + js + "\">Huge</a><br>";
    str += "</ul>";

    panel.innerHTML = str;
}

glig.ui.editor.link_adder_draw = function(panel, textarea_id)
{
    str  =  "";
    str += "<form onSubmit=\"glig.ui.editor.link_adder_process('" + textarea_id + "', this); return false\">";
    str += "<b>URL:</b>";
    str += "<input type=text name=url class=url value='http://'>";

    str += "<input type=button value=insert class=button_insert onClick=\"glig.ui.editor.link_adder_process('" + textarea_id + "', this.form)\">";
    str += "</form>";

    panel.innerHTML = str;
}

glig.ui.editor.image_adder_draw = function(panel, textarea_id)
{
    str  =  "";
    str += "<form onSubmit=\"glig.ui.editor.image_adder_process('" + textarea_id + "', this); return false;\">";
    str += "<b>Image URL:</b>";
    str += "<input type=text name=url class=url value='http://'>";

    str += "<input type=button value=insert class=button_insert onClick=\"glig.ui.editor.image_adder_process('" + textarea_id + "', this.form)\">";
    str += "</form>";

    panel.innerHTML = str;
}

glig.ui.editor.color_picker_process = function(textarea_id, value)
{
    glig.ui.editor.insert_tag(textarea_id, "font", "color", value);
    glig.ui.close_popin_panel();
}

glig.ui.editor.font_picker_process = function(textarea_id, value)
{
    glig.ui.editor.insert_tag(textarea_id, "font", "class", value);
    glig.ui.close_popin_panel();
}

glig.ui.editor.font_size_picker_process = function(textarea_id, value)
{
    glig.ui.editor.insert_tag(textarea_id, "font", "class", value);
    glig.ui.close_popin_panel();
}

glig.ui.editor.link_adder_process = function(textarea_id, form)
{
    var url = form.url.value;

    glig.ui.editor.insert_link(textarea_id, url);
    glig.ui.close_popin_panel();
}

glig.ui.editor.image_adder_process = function(textarea_id, form)
{
    var url = form.url.value;

    glig.ui.editor.insert_image(textarea_id, url);
    glig.ui.close_popin_panel();
}
