
// ##################### jquery/prototype Compability ##########################
// tomahawk uses prototype.js which is incompability with jquery, rename jquery
    jQuery.noConflict();
    var $j = jQuery;


var previewDragWindow = null;
var templateEditorDragWindow = null;

function resizeToBottom(elementName, minHeight, delta) {
    var element = mybox.getElement(elementName);
    var height = mybox.getWindowHeight();
    if (delta == null)
        delta = 0;
        
    if (document.height)
        height = Math.max(document.height, height);
    else if (document.body.scrollHeight)
        height = Math.max(document.body.scrollHeight, height);
        
    var location = mybox.getLocation(element);
    var h = height - location.y - 28 - delta;
    
    if (h > minHeight) {
        element.style.height = h + 'px';
    } else
        element.style.height = minHeight + 'py';
}

// ############################ Resource Finder ################################

var resourceFinderDragWindow = null;
var resourceInput;
var options;

function openResourceFinder(link, options) {
    resourceInput = mybox.findJSFComponent('resInput', link);
    this.options = options;
    var div = mybox.getElement('resourceFinderDiv');
    if (resourceFinderDragWindow == null)
        resourceFinderDragWindow = new mybox.DragElement('resourceFinderDiv', 'resourceFinderToolbarDiv');
    
    mybox.centerInWindow(div, 740, 500); 
    div.style.display = 'block';            
    div.style.visibility = 'visible';
}

function closeResourceFinder() {
    var div = mybox.getElement('resourceFinderDiv');
    div.style.visibility = 'hidden';
    div.style.display = 'none';        
}

var resourceAjaxRequest;

function searchResources(page) {
    var txt = mybox.getElement('rfSearchText').value;
    var img = mybox.getElement('rfSearchImg');
    img.style.display = 'block';
    var params = 'text=' + txt + "&page=" + page;
    if (options != null) {
        params += "&options=" + options;
    }
    resourceAjaxRequest = new mybox.AjaxRequest('GET',
            path + '/mybox/ajax/mybox_componentEditor.ajaxSearchResource',
            params, searchResourcesReturn);
    
    resourceAjaxRequest.run();
}

function searchResourcesReturn() {
    var img = mybox.getElement('rfSearchImg');
    img.style.display = 'none';
    var table = mybox.getElement('resourceFinderPanelDiv');
    table.innerHTML = resourceAjaxRequest.req.responseText;
}

function selectResource() {
    var form = document.forms['component:fcomponent'];
    var arr = document.getElementsByTagName('input');
    var value = null;
    for (var i = 0; i < arr.length; i++) {
        if (arr[i].type == 'radio' && arr[i].name == 'resourceFinderChk' && arr[i].checked) {
            value = arr[i].value;
        }
    }
    if (value != null) {
        resourceInput.value = value;
        closeResourceFinder();
        // some pages can use 'searchThumbnail'
        if (window.searchThumbnail != undefined)
            searchThumbnail(resourceInput);
    }
}

// ############################# Components ##########################

function resizeComponentsTreeDiv() {
    resizeToBottom('componentsTreeDiv', 300);
}                    


// ############################# ComponentType Editor ##########################

var ctypeRows = null;

function isLastRow(tr) {
    var children = tr.parentNode.getElementsByTagName('tr');    
    if (children.length > 0) {
        return tr == children[children.length - 1];
    }
    return false;
}

function ctypeSelectRowElementType(tr) {
    if (isLastRow(tr))
        return;
    
    var row = tr.rowIndex;
    var el = mybox.getElement('ctypeRowSelection');

    if (!ctypeIsRowSelected(tr)) {
        tr.className += '_';
        if (el.value == '')
            el.value = row;
        else
            el.value += ',' + row;        
    } else {
        tr.className = tr.className.substring(0, tr.className.length - '_'.length);
        var arr = mybox.getElement('ctypeRowSelection').value.split(',');
        var s = '';
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] != row) {
                if (s.length == 0)
                    s = arr[i];
                else
                    s += ',' + arr[i];
            }
        }
        el.value = s; 
    }
    var button = mybox.getElement('ctypeGroupButton'); 
    button.disabled = el.value.length == 0;
}

function ctypeIsRowSelected(tr) {
    var row = tr.rowIndex;
    var selection = mybox.getElement('ctypeRowSelection').value;
    var arr = selection.split(',');
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == row)
            return true;
    }
    return false;    
}

function ctypeResetGroups(c) {
    var table = mybox.findJSFComponent('ctypeElementsTable', c);
    var children = table.getElementsByTagName('input');
    for (var i = 0; i < children.length; i++) {
        if (children[i].name.indexOf('group') > -1) {
            children[i].value = '';
        }
    }    
}

// ##################### Classification Node Explorer ##########################

var nodeExplorerDragWindow = null;
//var openNodeExplorerLink = null;

/*
function setLinkNodeExplorer(link) {
    openNodeExplorerLink = link;
}
*/

function openNodeExplorer(linkId) {
    //openNodeExplorerLink = link;
    var iframe = mybox.getElement("nodeExplorerFrame");
    var url = path + '/faces/jsf/mybox/components/classificationsTree.jspf?linkId=' + linkId;
    iframe.src = url;

    var div = mybox.getElement("nodeExplorer");
    mybox.centerInWindow(div, 400, 350); 
    div.style.display = 'block';    
    div.style.visibility = 'visible';
    if (nodeExplorerDragWindow == null)
        nodeExplorerDragWindow = new mybox.DragElement('nodeExplorer', 'toolbarNodeExplorer');
}

function closeNodeExplorer() {
    var div = parent.document.getElementById("nodeExplorer");
    div.style.display = 'none';    
    var inputOpened = parent.document.getElementById('nodeExplorerOpenedInput');
    inputOpened.value = "false";    
}

function selectClassificationNode(description, nodeId) {
    var linkId = mybox.getElement('openNodeExplorerLink').value;
    var i = linkId.lastIndexOf(':');
    var s = linkId.substring(0, i + 1);
    var inputLabel = parent.document.getElementById(s + 'nodeSelector.label');
    var inputHidden = parent.document.getElementById(s + 'nodeSelector');
    inputLabel.value = description;    
    inputHidden.value = nodeId.substring(2, nodeId.length);        
    closeNodeExplorer();
}

// ########################### Chart editor ####################################

var chartDragWindow;

function editChart(title, elementTypeId) {
    var div = mybox.getElement('chartDiv');    
    mybox.centerInWindow(div, 500, 400); 
    div.style.display = 'block';    
    div.style.visibility = 'visible';
    mybox.getElement('chartTitle').innerHTML = title;
    var iframe = mybox.getElement('chartIframe');
    
    var url = path + '/faces/jsf/mybox/components/chartInstanceEditor.jsp?elementTypeId='
            + elementTypeId;
    iframe.src = url;
    
    if (chartDragWindow == null)
        chartDragWindow = new mybox.DragElement('chartDiv');
}

function closeChartEditor() {
    var div = mybox.getElement('chartDiv');
    div.style.display = 'none';        
}

// ############ Default button on key press event #########################

function doClick(e, buttonName) {
    try {
        var keycode;
        var target; 
        if (window.event) {
            keycode = window.event.keyCode;
            target = window.event.srcElement;
        } else if (e) {
            keycode = e.which;
            target = e.target;
        } else 
            return true; 

        if (keycode == 13) {
            var el = mybox.getElement(buttonName);
            if (el == undefined) {
                el = mybox.findJSFComponent(buttonName, target);
            }
            if (el != undefined) {
                if (el.click != undefined)
                    el.click();
                else
                    el.onclick();
            } else {
                alert('element not found ' + buttonName)
            }
            return false;
        } else
            return true;
   } catch (err) {
        alert(err);
   }
}

// ######################### Text plain editor #################################
TextEditor = function(textarea, disableSpellcheck) {
    this.textarea = textarea;
    if (disableSpellcheck == true) {
        this.textarea.spellcheck = false;
    }
    this.keyEvent = null;
    
    var ctx = this;
    var keypressFt = function(e) {
        ctx.keyEvent = e;
        ctx.keypress.call(ctx);
    }
    mybox.addEvent(this.textarea, 'keydown', keypressFt, false);    
}

TextEditor.prototype = {
    keypress : function() {
        var key = mybox.getKeyCode(this.keyEvent);
        if (key == 9) { // tab
            //this.textarea.value = this.textarea.value + "\t";
            mybox.insertAtCursor(this.textarea, "\t");
            mybox.cancelEvent(this.keyEvent);
        }
    }        
}

// ############################ HTML Editors ###################################

HtmlEditorManager = function() {    
    this.editors = new Array();
    this.params = new Array();
    this.options = new Array();
}

HtmlEditorManager.prototype = {
    
    createHTMLEditor: function(type) {
        var editor = null;
        var name = type.toLowerCase();
        if (name == MyBoxWYMeditor.NAME) {
            // WYMeditor
            editor = new MyBoxWYMeditor(this.params);
        } else if (name == MyBoxCKEditor.NAME) {
            // CKEditor
            editor = new MyBoxCKEditor(this.params, this.options);
        }        
        var textarea = this.params['textarea'];
        this.editors[textarea.id] = editor;
        return editor;
    },
    
    params: function() {
        return this.params;
    },
    
    options: function() {
        return this.options;
    },
    
    openEditor: function(type) {
        var textarea = this.params['textarea'];
        var editor = this.editors[textarea.id];
        if (editor != null) {
            editor.close();
        } 
        editor = this.createHTMLEditor(type);
        if (editor != null) {
            this.editors['' + textarea.id] = editor;
            editor.open(this.params);
        }        
    },
    
    closeEditor: function(type) {
        var textarea = this.params['textarea'];
        var editor = this.editors[textarea.id];
        if (editor != null) {
            editor.close();
            this.editors[textarea.id] = null;
        }
    }
    
}

/**
 * Abstract class for all editors
 */
MyBoxAbstractHtmlEditor = function(params, options) {
    this.opened = false;
    this.params = params;
    this.options = options;
    this.editor = null;
}

MyBoxAbstractHtmlEditor.prototype = {
    
    isOpened: function() {
        return this.opened;
    },
    
    editor: function() {
        return this.editor;
    }
}

/**
 * WYMeditor.
 *
 * @param HashMap with the keys and values:
 *      'textarea': textarea element
 *      'wymeditor.stylesheet': path to the stylesheet css
 */
MyBoxWYMeditor = function(params) {
    MyBoxAbstractHtmlEditor.call(this, params, null);
}

MyBoxWYMeditor.NAME = 'wymeditor';
MyBoxWYMeditor.STYLESHEET = 'wymeditor.stylesheet';

MyBoxWYMeditor.prototype = {
    
    open: function(params) {
        var ctx = this;
        var textarea = params['textarea'];
        $j(textarea).wymeditor({            
            stylesheet: this.params[MyBoxWYMeditor.STYLESHEET],
            postInit: function(we) {
                we.hovertools();
                we.resizable();
                ctx.editor = we;
                ctx.opened = true;
            }
        });
    },
    
    close: function() {
        if (this.editor != null) {
            this.editor.update();
            $j(this.editor._box).remove();
            $j(this.editor._element).show();
            delete this.editor;
        }        
        this.opened = false;
    },
    
    flush: function() { 
        this.editor.update();
    } 
}

/**
 * CKEditor
 *
 * @params HashMap with the keys and values:
 *      'textarea': textarea element
 */
MyBoxCKEditor = function(params, options) {
    MyBoxAbstractHtmlEditor.call(this, params, options);    
}

MyBoxCKEditor.NAME = 'ckeditor';

MyBoxCKEditor.prototype = {
    
    open: function(params) {
        this.editor = CKEDITOR.replace(this.params['textarea'], this.options);
        this.opened = true;
    },
    
    close: function() {
        if (this.editor != null) {
            this.editor.destroy();
        }
        this.opened = false;
    },
    
    flush: function() { 
    }
}

// ####################### General functions Editor ############################

function flushEditors() {
    if (typeof(htmlEditorManager) != 'undefined') {
       for (id in htmlEditorManager.editors) {
           try {
                htmlEditorManager.editors[id].flush();
           } catch (err) {
           }
       }
    }
}

