var _containersData = new Array();
var _linksData = new Array(); 

registerPlugin('Containers');

/**
 * Wechselt den Modus der Container
 * @link http://www.gregphoto.net/sortable/advanced  
 * @author Alexander Wegener
 */
function Containers_switchMode(mode) {
    if (mode == 'personalize') {
        // Container Headline- und Link-Editoren enablen
        enableHeadlineEditors();
        enableLinkEditors(); 
        
        // Links in Containern dragdropbar machen
        var arrContainmentsContainers = new Array();
        var i = 0;
        _containersData.each(function(container, index) {
            arrContainmentsContainers[i++] = "LinkContainer" + container.id + "Linklist";
        });

        _containersData.each(function(container, index) {
            Sortable.create("LinkContainer" + container.id + "Linklist",
                            {dropOnEmpty: true,
                             zindex: 1000,
                             ghosting: true,
                             containment: arrContainmentsContainers,
                             constraint: false,
                             "onUpdate": function(elm) {
                                                            moveLink(elm);
                                                            disableLinkEditors();
                                                            window.setTimeout("enableLinkEditors()", 100);
                             }});
        });
        arrContainmentsContainers[i] = "RecycleBin";
        
        var arrContainmentsColumns = new Array();
        for (i=1; i<=_userSettings['container_columns']; i++) {
            arrContainmentsColumns[i-1] = "LinkColumn" + i;
        }
        
        // Papierkorb dropable machen
        Sortable.create("RecycleBin", {dropOnEmpty: true,
                                       containment: arrContainmentsContainers.concat(arrContainmentsColumns),
                                       onUpdate: function(elm){deleteContent(elm);}});
        
        // LinkContainer verschiebbar machen
        for (i=1; i<=_userSettings['container_columns']; i++) {
            Sortable.create("LinkColumn"+i, {dropOnEmpty: true,
                                             zindex: 1000,
                                             ghosting: true,
                                             handle: 'headline',
                                             containment: arrContainmentsColumns,
                                             constraint: false,
                                             "onUpdate": function(elm){
                                                                            moveContainer(elm);
                                                                            disableHeadlineEditors();
                                                                            window.setTimeout("enableHeadlineEditors()", 100);
                                             }});
        }
        
    } else {
        // alle inPlaceEditors für Links und Kategorie-Titel sperren
        disableHeadlineEditors();
        disableLinkEditors();

        for (i=1; i<=_userSettings['container_columns']; i++) {
            Sortable.destroy("LinkColumn" + i);
        }
        Sortable.destroy("RecycleBin");
        
        _containersData.each(function(container, index) { 
            Sortable.destroy("LinkContainer" + container.id + "Linklist");
        });
    }
}

/**
 * Gibt alle linksData-Objekte eines Containers ALS KOPIE zurück
 * @author Alexander Wegener
 */
function getLinksDataByContainer(container_id) {
    var linksInContainer = new Array();

    _linksData.each(function(link, index) {
        if (link.container_id == container_id) {
            linksInContainer[linksInContainer.length] = link;    
        }
    });
    return linksInContainer;
}


/**
 * Macht einen Link anklickbar, falls die Seite im "use"-Modus ist.
 * Setzt gleichzeitig einen AJAX-Request zum Erhöhen der Klicks dieses Links ab.
 * @author Alexander Wegener
 */
function clickOnLink(link_id) {
    if ($('Body').className != 'use') {
        return false;    
    }
    index = getIndexByPropertyValue(_linksData, 'id', link_id);
    $('LinkAnchor' + link_id).href = siteWebroot + 'Links/click/' + link_id;
    _linksData[index]['hits'] = _linksData[index]['hits'] + 1;
    window.setTimeout('restoreLinkUrl(' + link_id + ')', 100);
}


function restoreLinkUrl(link_id) {
    index = getIndexByPropertyValue(_linksData, 'id', link_id);
    if (_linksData[index]) {
        $('LinkAnchor' + link_id).href = _linksData[index].url;  
    }    
}


/**
 * Löscht einen Link
 * @author Alexander Wegener
 */
function removeLink(link_id) {
    index = iL(link_id); 
    if (_linksData[index]) {
        // Ajax Request zum Löschen des Links aus der Datenbank absetzen
        new Ajax.Request(siteWebroot + 'Links/delete/' + link_id);
        
        var container_id = _linksData[index]['container_id'];
        
        // Element aus linksData Array löschen
        _linksData[index] = null;
        _linksData = _linksData.compact();
        
        sortLinks(container_id);
        return true;
    }
    return false;
}


/**
 * Verschiebt einen Link von einem Container in einen anderen
 * @author Alexander Wegener
 */
function moveLink(obj) {
    var link_ids = new Array();
    var container_id = obj.id.substr(13);
    container_id = container_id.substr(0, container_id.length-container_id.substr(-8).length);

    // Alle Links im Container durchgehen  
    for (i=0, len=obj.childNodes.length; i<len; i++) {
        link_id = obj.childNodes[i].id.substr(8);
        
        // ...die Link-IDs sammeln...
        link_ids[link_ids.length] = link_id;
        
        // ...und die Container ID verändern
        index = getIndexByPropertyValue(_linksData, 'id', link_id); 
        _linksData[index]['container_id'] = container_id;
    }  

    new Ajax.Request(siteWebroot + 'Links/reorder/' + container_id + '/' + link_ids.join(","));
    
    window.setTimeout('sortLinks(' + container_id + ')', 100);
}

/**
 * Fügt einen Link einem Container hinzu
 * @author Alexander Wegener
 */
function addLink(json) {
    if (json.offline) {
        var local_url = confirm('Diese Internetadresse ist nicht erreichbar. ' + 
                                'Falls diese Adresse zu einer lokalen- oder Intranetseite ' + 
                                'gehört, müssen Sie ihn als "lokalen Link" hinzufügen.\n\n' +
                                'Wollen Sie ' + json.url + ' als "lokalen Link" hinzufügen?');
                                
        if (local_url) {
            $('LinkLocalUrl').checked = true;  
            $('LinkAddForm').enable(); 
            $('LinkAddForm').request({
                onComplete: function(request) {
                    if (addLink(request.responseText.evalJSON())) {
                        hideDialogWindow();
                    }
                },
                parameters: Form.serialize('LinkAddForm')
            });
            $('LinkAddForm').disable();
        } else {
            $('LinkAddForm').enable();
        }
    } else {
        var linkHTML = '<li id="LinkItem' + json.Link.id + '">' +
                       '<a href="' + (json.Link.local_url? json.Link.local_url: json.Url.url) + '"  id="LinkAnchor' + json.Link.id + '" onclick="return clickOnLink(\'' + json.Link.id + '\');">' +
                       json.Link.title + '</a><span class="newLink">neu</span></li>';

        new Insertion.Top($('LinkContainer' + json.Link.container_id + 'Linklist'), linkHTML);
        $('LinkItem' + json.Link.id).hide();
        
        _linksData[_linksData.length] = $H({
            id: json.Link.id,
            url: (json.Link.local_url? json.Link.local_url: json.Url.url),
            title: json.Link.title,
            container_id: json.Link.container_id,
            sort: json.Link.sort,
            hits: 0,
            display: false,
            editor: null,
            newLink: true
        });
        
        initLink(json.Link.id, _linksData.length-1);
        
        sortLinks(json.Link.container_id); 
        return true;
    }    
}




/**
 * Erkennt zu löschenden Inhalt aus dem Papierkorb und behandelt diesen entsprechend
 * @author Alexander Wegener
 */
function deleteContent(obj) {
    if (obj.firstChild) {
        if (obj.firstChild.id && obj.firstChild.id.substr(0, 13) == 'LinkContainer') {
            // Content = LinkContainer
            var container_id = obj.firstChild.id.substr(13);
            removeContainer(container_id);
        } else if (obj.firstChild.firstChild) {
            if (obj.firstChild.firstChild.id &&
                obj.firstChild.firstChild.id.substr(0, 10) == 'LinkAnchor') {
                // Content = Link
                removeLink(obj.firstChild.firstChild.id.substr(10));  
            }
        }
        while (obj.firstChild) {
            obj.removeChild(obj.firstChild);
        }
    }  
}


var linkUrlObserver;
function getUrlTitle() {
    if (linkUrlObserver) {
        window.clearTimeout(linkUrlObserver);
    }
    linkUrlObserver = window.setTimeout('loadUrlTitle()', 1000);    
}

function loadUrlTitle(url) {
    if ($('UrlUrl').value) {
        new Ajax.Request(siteWebroot + 'Links/getUrlTitle?myurl=' + encodeURIComponent($('UrlUrl').value),
                         {  onLoading: function() { //$('LinkContainerId').focus();
                                                    $('LinkTitle').disable();
                                                    $('LinkTitleSpinner').show();
                            },
                            onComplete: function(request) {
                                                            $('LinkTitleSpinner').hide();
                                                            $('LinkTitle').enable();
                                                            $('LinkTitle').value = request.responseText;
                            }
                         });
    }
}


/**
 * Initialisiert einen Container
 * @author Alexander Wegener
 */
function initContainer(container_id, index) {
    _containersData[index]['editor'] =
        new Ajax.InPlaceEditor($('LinkContainer' + container_id + 'Headline'),
                               siteWebroot + 'Containers/editTitle/' + container_id,
                               {
                                   submitOnBlur: true,
                                   okButton: false,
                                   cancelLink: false,
                                   savingText: '...',
                                   highlightendcolor: '#FFFFFF',
                                   ajaxOptions: {method:'post'}
                               });  
}

/**
 * Initiiert einen Link
 * @author Alexander Wegener
 */
function initLink(link_id, index) {
    if (_linksData[index]['display'] == false) {
        $('LinkItem' + link_id).hide();
        $('LinkContainerHide' + _linksData[index]['container_id']).show();    
    }
    _linksData[index]['editor'] =
        new Ajax.InPlaceEditor($('LinkAnchor' + link_id),
                               siteWebroot + 'Links/editTitle/' + link_id,
                               {
                                  submitOnBlur: true,
                                  okButton: false,
                                  cancelLink: false,
                                  savingText: '...',
                                  highlightendcolor: '#FFFFFF',
                                  onComplete: function(trans, elm) {
                                      index = getIndexByPropertyValue(_linksData, 'id', elm.id.substr(10));
                                      _linksData[index]['title'] = elm.innerHTML;
                                  },
                                  ajaxOptions: {method:'post'}
                               });
}

/**
 * Initialisiert die Containers inkl. Links
 * @author Alexander Wegener
 */
function Containers_init() {
    // Erstelle InPlaceEditors fuer LinkContainer Ueberschriften
    _containersData.each(function(container, index) {
        initContainer(container.id, index);
    });
    disableHeadlineEditors();

    // Erstelle InPlaceEditors fuer Links
    _linksData.each(function(link, index) {
        initLink(link.id, index);
    }); 
    disableLinkEditors();   
}

/**
 * Aktiviert alle InPlace-Editoren fuer Ueberschriften
 * @author Alexander Wegener
 */
function enableHeadlineEditors() {
    _containersData.each(function(container, index) {
        if (!container.editor) {
            initContainer(container.id, index);
        }
        container.editor.editing = false;
        container.editor.options.highlightcolor = '#FFFF3F';
        $('LinkContainer' + container.id + 'Headline').title = 'Zum Editieren des Titels bitte anklicken';
    });
}

/**
 * Deaktiviert alle InPlace-Editoren fuer Ueberschriften
 * @author Alexander Wegener
 */
function disableHeadlineEditors() {
    _containersData.each(function(container, index) {
        if (!container.editor) {
            initContainer(container.id, index);
        }                     
        container.editor.editing = true;
        container.editor.options.highlightcolor = 'transparent';
        $('LinkContainer' + container.id + 'Headline').title = '';    
    });
}

/**
 * Aktiviert alle InPlace-Editoren fuer Links
 * @author Alexander Wegener
 */
function enableLinkEditors() {
    _linksData.each(function(link, index) {
        link.editor.editing = false;
        link.editor.options.highlightcolor = '#FFFF3F';
        $('LinkAnchor' + link.id).title = 'Zum Editieren des Titels bitte anklicken';
    });
}

/**
 * Deaktiviert alle InPlace-Editoren fuer Links
 * @author Alexander Wegener
 */
function disableLinkEditors() {
    _linksData.each(function(link, index) {
        if (!link.editor) {
            initLink(link.id, index);
        } 
        link.editor.editing = true;
        link.editor.options.highlightcolor = 'transparent';
        $('LinkAnchor' + link.id).title = link.url + ' (Besuche: ' + link.hits + ')';
    });
} 

/**
 * Fügt einen Container hinzu
 * @author Alexander Wegener
 */
function addContainer(json) {
    Containers_switchMode('use');
    
    new Insertion.Top($('LinkColumn' + json.Container.column), json.HTML.unescapeHTML()); 
    
    _containersData[_containersData.length] = $H({
        id: json.Container.id,
        title: json.Container.title,
        minimized: false,
        column: json.Container.column,
        hidden: true,
        editor: null
    });
    
    initContainer(json.Container.id, _containersData.length-1);
    
    $('LinkContainer' + json.Container.id).hide();
    Effect.SlideDown('LinkContainer' + json.Container.id); 
    
    Containers_switchMode('personalize');
}

/**
 * Wechselt einen Container zwischen minimiert und maximiert
 * @author Alexander Wegener
 */
function minimizeContainer(container_id) {
    index = getIndexByPropertyValue(_containersData, 'id', container_id);
    if (_containersData[index]['minimized']) {
        _containersData[index]['minimized'] = false;
        switchClass('LinkContainer' + container_id, 'container', 'containerMinimized');
        //$('LinkContainer' + container_id + 'Linklist').show();
        Effect.BlindDown('LinkContainer' + container_id + 'Linklist');
        $('LinkContainerMinimizeButton' + container_id).src = siteWebroot + 'img/design.green/links.container.button.minimize.png';
    } else {
        _containersData[index]['minimized'] = true;
        Effect.BlindUp('LinkContainer' + container_id + 'Linklist');
        window.setTimeout("switchClass('LinkContainer" + container_id + "', 'container', 'containerMinimized')", 1000);
        $('LinkContainerMinimizeButton' + container_id).src = siteWebroot + 'img/design.green/links.container.button.maximize.png';
    }
}

function iL(id) {
    return getIndexByPropertyValue(_linksData, 'id', id);
}

function iC(id) {
    return getIndexByPropertyValue(_containersData, 'id', id);
}

/**
 * Sortiert alle Links in einem Container
 * @author
 */
function sortLinks(container_id) {
    var linksInContainer = getLinksDataByContainer(container_id);

    if (linksInContainer.length == 0) {
        return;
    }
    
    // Sortiert die Links nach ausgewählter Sortiermethode
    switch (_userSettings['links_sorting_method']) {
        case 2:
            linksInContainer.sort(sortByTitle);
            break;     
        case 3:
            linksInContainer.sort(sortBySort);
            break;
        case 1:
        default:
            linksInContainer.sort(sortBySort);
            linksInContainer.reverse();
    }

    // Alle neuen Links nach oben
    for (var i=0; i<linksInContainer.length; i++) {
        if (linksInContainer[i]['newLink']) {
            $('LinkContainer' + container_id + 'Linklist').appendChild($('LinkItem' + linksInContainer[i]['id']).remove());    
            
            if (!linksInContainer[i]['display']) { 
                Effect.SlideDown('LinkItem' + linksInContainer[i]['id']);
                _linksData[iL(linksInContainer[i]['id'])]['display'] = true;
            }
        }     
    }
    
    indexC = iC(container_id);
    // Ordnet alle Links neu an
    var countLinks = 0;
    for (var i=0; i<linksInContainer.length; i++) {
        
        if (!linksInContainer[i]['newLink']) {
            index = iL(linksInContainer[i]['id']);
            $('LinkContainer' + container_id + 'Linklist').appendChild($('LinkItem' + linksInContainer[i]['id']).remove());    
            
            if (countLinks >= _userSettings['links_show_amount'] &&
                _containersData[indexC]['hidden'] &&
                _linksData[index]['display']) {
                
                _linksData[index]['display'] = false;      
                Effect.SlideUp('LinkItem' + linksInContainer[i]['id']);
            } else if(!linksInContainer[i]['display'] &&
                      (!_containersData[indexC]['hidden'] ||
                      countLinks < _userSettings['links_show_amount'])) { 
                
                Effect.SlideDown('LinkItem' + linksInContainer[i]['id']);
                _linksData[index]['display'] = true;
            }
            countLinks = countLinks + 1;
        }
    }
    
    
    // Zeigt "Ausklappen"-Button, falls mehr als 'links_show_amount' Links im Container sind
    if (!$('LinkContainerHide' + container_id).visible()) {
        if (i > _userSettings['links_show_amount']) {
            $('LinkContainerHide' + container_id).show(); 
        }
    } else {
        if (i <= _userSettings['links_show_amount']) {
            $('LinkContainerHide' + container_id).hide(); 
        }
    }
}

/**
 * Zeigt versteckte Links eines Containers
 * @author Alexander Wegener
 */
 
function toggleLinkContainerHide(container_id) {
    index = getIndexByPropertyValue(_containersData, 'id', container_id);  
    if (_containersData[index]['hidden']) {
        $('LinkContainerHide' + container_id).src = siteWebroot + 'img/design.green/links.container.button.hide.gif';
        _containersData[index]['hidden'] = false;   
        
        sortLinks(container_id);
        
        // TODO: a-title and img-alt: 'Verstecken'
    } else {
        $('LinkContainerHide' + container_id).src = siteWebroot + 'img/design.green/links.container.button.unhide.gif';
        _containersData[index]['hidden'] = true;
        
        sortLinks(container_id);
        
        // TODO: a-title and img-alt: 'Ausklappen'
    }    
}


/**
 * Löscht einen LinkContainer
 * @author Alexander Wegener
 */
function removeContainer(container_id, noRequest) {
    if (!noRequest) {
        new Ajax.Request(siteWebroot + 'Containers/delete/' + container_id);
    } else {
        $('LinkContainer' + container_id).remove();
    }
    
    _linksData.each(function(link, index) {
        if (link.container_id == container_id) {
            _linksData[index] = null;
        }  
    });
    _linksData = _linksData.compact();
    
    _containersData[iC(container_id)] = null;
    _containersData = _containersData.compact();
    
    return true;    
}

/**
 * Verschiebt einen LinkContainer
 * @author Alexander Wegener
 */
function moveContainer(obj) {
    var container_ids = new Array(); 
    var column_id = obj.id.substr(10);  
    
    for (var i=0; i<obj.childNodes.length; i++) {
        if (obj.childNodes[i].nodeName == 'LI') {
            container_ids[container_ids.length] = obj.childNodes[i].id.substr(13);
        }
    }
    new Ajax.Request(siteWebroot + 'Containers/reorder/' + column_id + '/' + container_ids.join(","));
}