var TextHtml = new Object();
TextHtml.editorWindow = null;
TextHtml.editorDocument = null;
TextHtml.selectionChangeLocked = false;
TextHtml.selectionData;

TextHtml.GetElementAscensor = function(e, n) {
    while (e) {
        if (e.nodeName.compareTo(n)) return e;
        e = e.parentNode;
    }
    return null;
}

TextHtml.GetElementDocument = function(e) {
    return e.ownerDocument || e.document;
}

var TextHtmlSelection = function() {};

TextHtmlSelection.Save = function() {
    if (!TextHtml.editorDocument) return;
    
    var r, s = TextHtml.editorDocument.selection;

    if (s)
    {
        r = s.createRange();
        
        if (r && (r.parentElement && TextHtml.GetElementDocument(r.parentElement()) != TextHtml.editorDocument) || 
            (r.item && TextHtml.GetElementDocument(r.item(0)) != TextHtml.editorDocument))
            r = null;
    }
    
    this.selectionData = r;
}

TextHtmlSelection.Release = function() {
    delete this.selectionData;
}

TextHtmlSelection.Restore = function() {    
    if (!this.selectionData)
        return;
    
    TextHtml.selectionChangeLocked = true;
    
    try {
        if (String(this.GetSelectionDocument(
            TextHtml.editorDocument.selection).body.contentEditable) == 'true')
        {
            TextHtml.selectionChangeLocked = false;
            return; 
        }
        this.selectionData.select();
    } catch (e) {}
    
    TextHtml.selectionChangedLocked = false;
}

TextHtmlSelection.GetSelectionDocument = function(s) {
    var r = s.createRange();
    return r ? TextHtml.GetElementDocument(
        r.item ? r.item(0) : r.parentElement()) : null;
}

TextHtmlSelection.GetParentElement = function() {
    switch (this.GetType())
    {
        case 'Control':
            var e = TextHtmlSelection.GetSelectedElement();
            return e ? e.parentElement : null;
        
        case 'None':
            return null;
        
        default:
            return this.GetSelection().createRange().parentElement();
    }
}

TextHtmlSelection.GetType = function()
{
    try
    {
        var ieType = TextHtmlSelection.GetSelection().type;
        
        if (ieType == 'Control' || ieType == 'Text')
            return ieType;
        
        if (this.GetSelection().createRange().parentElement)
            return 'Text';
    }
    catch (e) {}
    
    return 'None';
}

TextHtmlSelection.GetSelection = function() {
    if (isIE)
    {
        TextHtmlSelection.Restore();
        return TextHtml.editorDocument.selection;
    }
    else
        return TextHtml.editorWindow.getSelection();
}

TextHtmlSelection.GetSelectedElement = function(tagName) {
    var s = TextHtml.editorWindow && this.GetSelection();
    
    if (!s || s.rangeCount < 1) return null;
    
    var r = s.getRangeAt(0);
    
    if (r.startContainer != r.endContainer || r.startContainer.nodeType != 1 || 
        r.startOffset != r.endOffset - 1) return null;
    
    var e = r.startContainer.childNodes[r.startOffset];
    
    if (e.nodeType != 1) return null;
    
    if (!e || !e.tagName.compareTo(tagName))
        e = TextHtmlSelection.MoveToAncestorNode(tagName);
    
    return e;
}

TextHtmlSelection.MoveToAncestorNode = function(tagName) {
    if (isIE)
    {
        var n, r = this.GetSelection().createRange();
        
        if (!TextHtml.editorDocument) return null;
        
        if (this.GetSelection().type == 'Control')
        {
            for (var i = 0; i < r.length; i++)
                if (r(i).parentNode)
                {
                    n = r(i).parentNode;
                    break;
                }
        }
        else
            n = r.parentElement();
       
        while (n && !n.nodeName.compareTo(tagName))
            n = n.parentNode;
        
        return n;
        
    }
    else
    {
        var c = this.GetSelectedElement(tagName);
        
        if (!c) c = this.GetSelection().getRangeAt(0).startContainer;
        
        while (c)
        {
            if (c.nodeName.compareTo(tagName)) return c;
            
            c = c.parentNode; 
        }
        
        return null;
    }
}

TextHtmlSelection.SelectNode = function(node) {
    var r = TextHtml.editorDocument.createRange();
    r.selectNode(node);
    
    var s = this.GetSelection();
    s.removeAllRanges();
    s.addRange(r);
}

TextHtmlSelection.Collapse = function(toStart) {
    var s = this.GetSelection();
    
    if (toStart == null || toStart === true)
        s.collapseToStart();
    else
        s.collapseToEnd();
}

var TextHtmlTable = function() {};

TextHtmlTable.ClearRow = function(r)
{
    for (var i = 0; i < r.cells.length; i++)
        r.cells[i].innerHTML = '&nbsp;';
}

TextHtmlTable.Delete = function(t) {
    if (!t) t = TextHtmlSelection.GetSelectedElement('table');
    if (!t) return;
    
    TextHtmlSelection.SelectNode(t);
    TextHtmlSelection.Collapse();
    
    if (t.parentNode.childNodes.length == 1)
        t.parentNode.parentNode.removeChild(t.parentNode);
    else
        t.parentNode.removeChild(t);
}

TextHtmlTable.InsertRow = function(insertBefore)
{
    var r = TextHtmlSelection.MoveToAncestorNode('TR');
    
    if (!r) return;
    
    var nr = r.cloneNode(true);
    r.parentNode.insertBefore(nr, r);
    TextHtmlTable.ClearRow(insertBefore ? nr : r);
}

TextHtmlTable.DeleteRows = function(r)
{
    if (!r)
    {
        var cells = TextHtmlTable.GetSelectedCells();
        var rowsToDelete = new Array();
        
        for (var i = 0; i < cells.length; i++)
        {
            r = TextHtml.GetElementAscensor(cells[i], 'tr');
            rowsToDelete[r.rowIndex] = r;
        }
        
        for (var i = rowsToDelete.length; i >= 0; i--)
        {
            if (rowsToDelete[i])
                TextHtmlTable.DeleteRows(rowsToDelete[i]);
        }
    }
    
    var t = TextHtml.GetElementAscensor(r, 'table');
    
    if (t.rows.length == 1)
        return TextHtmlTable.Delete(t);
    
    r.parentNode.removeChild(r);
    
    return false;   
}

TextHtmlTable.InsertColumn = function(insertBefore) {
    var c = null, n = this.GetSelectedCells();
    
    if (n && n.length)
        c = n[insertBefore ? 0 : n.length - 1];
    
    if (!c) return;
    
    var index = c.cellIndex;
    
    var t = TextHtml.GetElementAscensor(c, 'table');
    
    for (var i = 0; i < t.rows.length; i++)
    {
        var r = t.rows[i];
        
        if (r.cells.length < index + 1) continue;
        
        c = r.cells[index].cloneNode(false);
        
        var bc = r.cells[index];
        
        if (insertBefore)
            r.insertBefore(c, bc);
        else if (bc.nextSibling)
            r.insertBefore(c, bc.nextSibling);
        else
            r.appendChild(c);
            
    }
}

TextHtmlTable.DeleteColumns = function(c) 
{
    if (!c)
    {
        var colsToDelete = TextHtmlTable.GetSelectedCells();
        
        for (var i = colsToDelete.length; i >= 0; i--)
            if (colsToDelete[i]) 
                TextHtmlTable.DeleteColumns(colsToDelete[i]);
        
        return;
    }
    
    var t = TextHtml.GetElementAscensor(c, 'table'), index = c.cellIndex;
    
    for (var i = t.rows.length - 1; i >= 0; i--)
    {
        var r = t.rows[i];
        
        if (index == 0 && r.cells.length == 1)
        {
            TextHtmlTable.DeleteRows(r);
            continue;
        }
        
        if (r.cells[index])
            r.removeChild(r.cells[index]);
    }
    
}

TextHtmlTable.GetSelectedCells = function()
{
    if (isIE && TextHtmlSelection.GetType() == 'Control')
    {
        var td = TextHtmlSelection.MoveToAncestorNode('td');
        return td ? [td] : [];    
    }
    
    var cells = new Array(), s = TextHtmlSelection.GetSelection();
    
    if (isIE)
    {
        var r = s.createRange();
        var p = TextHtmlSelection.GetParentElement();
        
        if (p && p.tagName.compareTo('td'))
            cells[0] = p;
        else
        {
            p = TextHtmlSelection.MoveToAncestorNode('table');
            
            if (p)
            {
                for (var i = 0; i < p.cells.length; i++)
                {
                    var cr = TextHtml.editorDocument.body.createTextRange();
                    cr.moveToElementText(p.cells[i]);
                    
                    if (r.inRange(cr) || (r.compareEndPoints('StartToStart', cr) >= 0 && 
                        r.compareEndPoints('StartToEnd', cr) <= 0) || 
                        (r.compareEndPoints('EndToStart', cr) >= 0 && r.compareEndPoints('EndToEnd', cr) <= 0))
                        cells[cells.length] = p.cells[i];
                    
                }
            }
        }
    }
    else
    {
        if (s.rangeCount == 1 && s.anchorNode.nodeType == 3)
        {
            var p = TextHtml.GetElementAscensor(s.anchorNode, 'td');
            if (p) cells[0] = p;
            return cells;
        }
        
        for (var i = 0; i < s.rangeCount; i++)
        {
            var c, r = s.getRangeAt(i), sc = r.startContainer;
            
            c = sc.tagName.compareTo('td') ? sc : sc.childNodes[r.startOffset];
            
            if (c.tagName.compareTo('td'))
                cells[cells.length] = c;
        }
    }
    
    return cells;
}

// JavaScript Document
prefix = "";

var textHtml_selectedMedia = "";
var textHtml_editorMode = 'html';
var textHtml_lastSaved = "";
var textHtml_globalRange;

function TextHtml_ShowMediaLinkSettings(id, icon)
{
    var e = $(id + '_mediaLinkSettings');
    
    AjaxUpdater('editor.php', id + '_mediaLinkSettings', 
      { parameters: { method: 'getMediaList' }, 
      onComplete: TextHtml_OnMediaListLoaded } );
    
    e.show('block');
    
    Status(e, 'loading');
}

function TextHtml_OnMediaListLoaded(t)
{}

function TextHtml_SelectMedia(element, path)
{
    textHtml_selectedMedia = path;
    
    for (var i = 2; i < element.parentNode.childNodes.length; i++)
    {
        if (element.parentNode.childNodes[i].style)
            element.parentNode.childNodes[i].style.border = '1px dotted #d8d8d8';
    }

    element.style.border = '1px solid #c10000';
}

function TextHtml_InsertSelectedMedia(id)
{
    var doc = document.getElementById(currentModuleID).contentWindow.document;
    
    if (textHtml_selectedMedia != "")
    {
        TextHtml_Set(currentModuleID, 'InsertImage', textHtml_selectedMedia);
        HideById('mediaSettings');
    }
}

function TextHtml_ViewMode(target)
{
    $(target + '_edit').contentWindow.document.designMode = "Off";
    $(target + '_edit').hide();
    $(target + '_editorTools').hide();
    $(target + '_codeBox').hide();
    $(target).innerHTML = textHtml_lastSaved;
    $(target).show('block');
    $(target + '_saveBtn').hide();
    $(target + '_viewMode').hide();
    $(target + '_endBtn').hide();
    $(target + '_editBtn').show('inline');
}

function TextHtml_EditMode(target, theme, cssClass)
{
    ShowById(target + "_saveBtn", "inline");
    HideById(target + "_editBtn");
    ShowById(target + "_viewMode", "inline");
    $(target + '_endBtn').show('inline');
    
    var element = document.getElementById(target);    
    var box = document.getElementById(target + "_edit");
    var doc = box.contentWindow.document;
  
    textHtml_lastSaved = element.innerHTML;
    
    doc.open();
    
    doc.write("<html><head>");
    doc.write("<link rel='stylesheet' type='text/css' href='themes/base/skin.css' />");
    doc.write("<link rel='stylesheet' type='text/css' href='" + theme + "skin.css' />");
    doc.write("<body><div id='" + target + "_content' class='" + cssClass + "' CONTENTEDITABLE='true'>" + element.innerHTML + "</div>");
    doc.write("</body>");
    doc.write("</html>");
    doc.close();

    Show(box, "block");
    //doc.designMode = "On";
    Hide(element);
    
    ShowById(target + '_editorTools', "block");
    
    TextHtml.editorWindow = box.contentWindow;
    TextHtml.editorDocument = TextHtml.editorWindow.document;
    
    setTimeout('PrepareTables()', 500);
}

function PrepareTables()
{
    var tables = TextHtml.editorDocument.getElementsByTagName('table');

    for (var i = 0; i < tables.length; i++)
    {
        Event.observe(tables[i], 'contextmenu', TextHtml_ShowContextMenu);
        tables[i].setAttribute('border', '1');
    }
    
    Event.observe($(TextHtml.editorDocument.getElementsByTagName('div')[0]), 
        'click', function() { $('contextMenu').hide(); });
    
    if (isIE)
        TextHtml.editorDocument.attachEvent('onbeforedeactivate', 
            function() { TextHtmlSelection.Save() });
}

function TextHtml_RemoveTableEvents()
{
    var tables = TextHtml.editorDocument.getElementsByTagName('table');

    for (var i = 0; i < tables.length; i++)
    {
        tables[i].setAttribute('border', '0');
        Event.stopObserving(tables[i], 'contextmenu', TextHtml_ShowContextMenu);
    }
}

function TextHtml_ProcessLinks(id)
{
    // add class 'mail' to new mailto links
    var pattern = /(EXT_NML)/g;
    var content = $(id).contentWindow.document.body.innerHTML;

    $(id).contentWindow.document.body.innerHTML = 
        content.replace(pattern, '" class="mail"');
    
    // add target='_blank' to all new popup links
    pattern = /(EXT_POPUP)/g;
    
    $(id).contentWindow.document.body.innerHTML = 
        $(id).contentWindow.document.body.innerHTML.replace(
            pattern, '" target="_blank"');
    
    // add class 'backlink' to new history.back links
    pattern = /(EXT_BACK)/g
    
    $(id).contentWindow.document.body.innerHTML = 
        $(id).contentWindow.document.body.innerHTML.replace(
            pattern, '" class="backlink"');
}

function TextHtml_Set(id, command, args)
{ 
    var doc = TextHtml.editorDocument;

    if (isIE)
    {    
        TextHtmlSelection.GetSelection();
        doc.execCommand(command, false, args)
    }
    else
    {
        doc.execCommand(command, false, args);
    }
    
    switch (command)
    {
        case "CreateLink": TextHtml_ProcessLinks(id); break;
    }     
}

function TextHtml_ShowLinkSettings(id, button)
{
    currentModuleID = id;
    
    var win = document.getElementById(id).contentWindow;    
    var sel = isIE ? win.document.selection.createRange() : win.getSelection();
    var str = isIE ? sel : sel.getRangeAt(0);
    var mailPattern = /(@)/g;

    if (isIE)
        textHtml_globalRange = sel;

    var element = document.getElementById('hyperlinkSettings');
    
    var s_url = document.getElementById('hyperlinkSettingsUrl');
    s_url.value = '';
    
    if (mailPattern.test(str))
    {
        var s_protocol = document.getElementById('hyperlinkSettingsProtocol');
        s_protocol.selectedIndex = 2;
        s_url.value = str;
    }

    element.style.display = 'block';
    element.style.position = 'absolute';    
}

function TextHtml_ShowTableSettings(id, button)
{
    var e = $('tableSettings');
    e.show('block');
    e.style.position = 'relative';
}

function TextHtml_InsertTable(id)
{
    var rows = $F('tableSettingsRows');
    var cols = $F('tableSettingsColumns');
    
    var t = TextHtml.editorDocument.createElement('table');
    t.setAttribute('cellpadding', $F('tableSettingsCellPadding'));
    t.setAttribute('cellspacing', $F('tableSettingsCellSpacing'));
    t.setAttribute('border', $F('tableSettingsBorder'));
    t.style.width = $F('tableSettingsWidth') + $F('tableSettingsWidthUnit')
    t.style.height = $F('tableSettingsHeight');
    
    var tbody = TextHtml.editorDocument.createElement('tbody');
    
    for (var i = 0; i < rows; i ++)
    {
        var tr = TextHtml.editorDocument.createElement('tr');
        
        for (var j = 0; j < cols; j++)
        {
            var td = TextHtml.editorDocument.createElement('td');
            td.innerHTML = '&nbsp;';
            tr.appendChild(td);
        }
        
        tbody.appendChild(tr);
    }
    
    t.appendChild(tbody);

    TextHtml_InsertNodeAtSelection(t);
    
    $('tableSettings').hide();
}

function TextHtml_InsertNodeAtSelection(node)
{
    var sel = TextHtmlSelection.GetSelection();
    
    if (!isIE)
    { 
        var r = sel.getRangeAt(0);
        sel.removeAllRanges();
        r.deleteContents();
        
        var c = r.startContainer;
        var p = r.startOffset;
        
        r = document.createRange();
        
        if (c.nodeType == 3 && node.nodeType == 3)
        {
            c.insertData(p, node.nodeValue);
            r.setEnd(c, p + node.length);
            r.setStart(c, p + node.length);
        }
        else
        {
            var an;
            
            if (c.nodeType == 3)
            {
                var tn = c;
                c = tn.parentNode;
                var txt = tn.nodeValue;
                
                var tb = txt.substr(0, p);
                var ta = txt.substr(p);
                
                var bn = document.createTextNode(tb);
                an = document.createTextNode(ta);
                
                c.insertBefore(an, tn);
                c.insertBefore(node, an);
                c.insertBefore(bn, node);
                
                c.removeChild(tn);
            }
            else
            {
                an = c.childNodes[p];
                c.insertBefore(node, an);
            }
            
            r.setEnd(an, 0);
            r.setStart(an, 0);
        }
        
        sel.addRange(r);
        
        Event.observe(node, 'contextmenu', TextHtml_ShowContextMenu);
    }
    else
    {
        // CHANGE THAT BASTARD!
        var d = TextHtml.editorDocument.getElementsByTagName('div')[0];
        d.appendChild(node);
        
        node.attachEvent('oncontextmenu', function(ev){TextHtml_ShowContextMenu(ev);(ev)});
    }
}

var textHtml_mediaIsLoaded = false;

function TextHtml_ShowMediaSettings(id, button)
{
    currentModuleID = id;
    
    if (isIE)
        textHtml_globalRange = document.getElementById(id).contentWindow.document.selection.createRange();
    
    var element = document.getElementById('mediaSettings');
    
    element.style.display = 'block';
    
    if (!textHtml_mediaIsLoaded)
    {
        AjaxUpdater('ajaxHandler.php', 'mediaSettingsGridElements_data', 
          { parameters: { method: 'reloadMedia' }, onComplete: TextHtml_MediaLoaded });
        
        TextHtml_Status('mediaSettingsGridElements', 'loading');
    }
    else
        TextHtml_MediaLoaded();
}

function TextHtml_MediaLoaded(t)
{
    TextHtml_Status('mediaSettingsGridElements', 'data');
    textHtml_mediaIsLoaded = true; 
}

function TextHtml_Status(id, status)
{
    if ($(id))
    {
        $(id).childElements().each(function (i) { 
            if (i.className == status) i.show('block'); else i.hide(); });
    }
}

function TextHtml_SetLink(id, url)
{
    var protocol = '';
    
    if ($F('externalOrEmail'))
    {
        protocol = $F('hyperlinkSettingsProtocol');
        var url = $F('hyperlinkSettingsUrl');
        
        if (protocol == 'mailto:')
            url += "EXT_NML";
    }
    else if ($F('internal'))
    {
        var url = "index.php?tabid=" + $F('internalPage');
    }
    else if ($F('mediaFile'))
    {
        var url = $F('mediaFiles');
    }
    else if ($F('historyBack'))
    {
        var url = "javascript:history.back();EXT_BACK";
    }    
    
    if ($F('hyperlinkSettingsTarget'))
        url += "EXT_POPUP";
    
    TextHtml_Set(currentModuleID, 'CreateLink', protocol + url);
    $('hyperlinkSettings').hide();
}

function TextHtml_GetBox(moduleKey)
{
    return $(moduleKey + '_edit').contentWindow;
}

function TextHtml_EditorViewMode(moduleKey, mode)
{
    textHtml_editorMode = mode;
    
    var box = TextHtml_GetBox(moduleKey);
    var codeBox = document.getElementById(moduleKey + '_codeBox');
    var htmlBox = box.document.getElementById(moduleKey + '_content');
    
    if (mode == 'code')
    {
        TextHtml_RemoveTableEvents();
    
        codeBox.value = TextHtml_GetContent(moduleKey).trim();
        HideById(moduleKey + '_edit');
        Show(codeBox, "block");
        
    }
    else
    {
        htmlBox.innerHTML = codeBox.value;
        Hide(codeBox);
        ShowById(moduleKey + '_edit', "block");
        
        setTimeout('PrepareTables()', 250);
    }
}

function TextHtml_SaveContent(moduleKey, module)
{
    $('contextMenu').hide();
    
    var tables = TextHtml.editorDocument.getElementsByTagName('table');
    for (var i = 0; i < tables.length; i++)
        tables[i].setAttribute('border', '0');
    
    var content = textHtml_editorMode == 'html' ? 
        TextHtml_GetContent(moduleKey) : $(moduleKey + '_codeBox').value;

    textHtml_lastSaved = content;
    
    content = escape(content);    
    content = content.replace(/(\+)/gi, "%2B");
    
    var multiContentPattern = /(mcc)/gi;
    
    var method = multiContentPattern.test(moduleKey) ? 
        'textHtml.saveMultiContent' : 'textHtml.save';
    
    AjaxCall(method,'module=' + module + '&content=' + content);
    
    ShowLoadingInfo('Inhalt wird gespeichert...');
    
    for (var i = 0; i < tables.length; i++)
        tables[i].setAttribute('border', '1');
}

function TextHtml_GetContent(moduleKey)
{  
    var code = TextHtml_GetBox(moduleKey).document.getElementById(
        moduleKey + '_content').innerHTML;
    code = code.replace(/\n/gi, "");    
    code = code.replace(/<BR>/gi, "<br />\n");
    
    return code;
}

function TextHtml_ShowContextMenu(ev)
{    
    $('contextMenu').show('block');
    $('contextMenu').moveToMouse(ev, $('main').select('iframe')[0]);
    $('contextMenu').targetElement = Event.element(ev).parentNode.parentNode.parentNode;
    Event.stop(ev);
    
    return false;
}

function TextHtml_InitContextMenu()
{
    var cm = $('contextMenu');
    
    cm.select('li').each(function(e) { 
        e.observe('mouseover', function() { e.addClassName('active'); (e)}); 
        e.observe('mouseout', function() { e.removeClassName('active'); (e)});
    });
}

function TextHtml_ContextMenu_ShowSub(id)
{
    TextHtml_ContextMenu_HideSubs();
    $('contextMenu_' + id).show('block');
}

function TextHtml_ContextMenu_HideSubs()
{
    $('contextMenu').select('ul[class=sub]').invoke('hide');
}
