function bibleToggle (elm, type) {
    elm = Element.extend(elm); // ie7
    if ('section' == type) {
        //$$('div[id^="ed_'+elm.className+'"]').invoke('toggle');
        $$('div[class~="'+elm.className+'"]').invoke('toggle');

    } else if ('entry' == type) {
        $("ed_"+elm.className).toggle();
    }
    elm.blur();
}

function toggleCancel (elm, myId, action) {
    var val = _getMyButtonValue(elm);
    var button = 'button:not([class~="'+myId.myclass+'"])';

    //reset 
    if ('cancel' == action || 'discard' == action) {
        if ('add' == val) {
            elm.hide();
        } else {
            elm.update('delete').show();
        }

        elm.next('button').hide();
        elm.next('button', 1).update(val);

        //$$(button).invoke('removeAttribute', 'disabled');
        $$(button).each(function(e){Element.extend(e).removeAttribute('disabled')});

    } else if ('save' == action) {
        if ('add' == val) {
            elm.previous('button').hide();
        } else {
            elm.previous('button').update('delete').show();
        }

        elm.hide();
        elm.next('button').update(val);

        //$$(button).invoke('removeAttribute', 'disabled');
        $$(button).each(function(e){Element.extend(e).removeAttribute('disabled')});

    // delete    
    } else if ('delete' == action) {

    // preview    
    } else if ('preview' == action) {
        elm.previous('button', 1).update('discard').show();
        elm.previous('button').update('save').show();
        elm.update('edit');

    // edit, reedit, add    
    } else {
        elm.previous('button', 1).update('cancel').show();
        elm.previous('button').hide();
        elm.update('preview');

        // I'd use invoke here but ie7
        $$(button).each(function(e){Element.extend(e).setAttribute('disabled', 'disabled')});
    }

    elm.blur();
}

function bibleEditToggle (elm) {
    elm = Element.extend(elm); // ie7

    var myId = _getMyId(elm);
    var action = elm.innerHTML;

    if (!myId.category) {
        alert('Ack 1 '+myId.category);
        return;
    }

    var elementIds = {
        textarea: myId.makeId('t'),
        display: myId.entry ? myId.makeId('ed') : myId.makeId('d'),
        wrapper: myId.makeId('w'),
        title: myId.makeId('ti')
    };


    // cancel
    if ('cancel' == action || 'discard' == action) {
        _doExit (elementIds, myId);

    // save    
    } else if ('save' == action) {
        if (bibleSave(myId, elementIds)) {
            _doExit (elementIds, myId);
        }

    // delete    
    } else if ('delete' == action) {
        bibleDelete (myId);

    // preview    
    } else if ('preview' == action) {
        biblePreview (elementIds, myId);
        hideEditor(elementIds);

    // edit, reedit    
    } else {
        bibleDisplayEdit (myId, elementIds);
        $(elementIds.display).show();
        showEditor(elementIds);
    }

    toggleCancel(elm, myId, action);
}

function _doExit (elementIds, myId) {
    hideEditor(elementIds);

    if ($(elementIds.display)) {
        $(elementIds.display).update($(elementIds.textarea) ? $(elementIds.textarea).getValue() : '');
        $(elementIds.display).hide();
    }
    if ($(elementIds.wrapper)) {
        $(elementIds.wrapper).remove();
    }
    if ($(elementIds.textarea)) {
        $(elementIds.textarea).remove();
    }
}

function _getMyId (elm) {
    var str = elm.classNames().find(function (s) {
        return s.match(/^id_/);
    });

    if (!str) return false;

    return {
            category:   str.replace(/^id_([0-9]+)_.*$/, '$1'),
            entry:      str.replace(/^id_[0-9]+_(.*)$/, '$1'),
            myclass:    str,
            makeId:     function (prefix) {return prefix+'_'+this.myclass; }         
        };
}

function _getMyButtonValue (elm) {
    var myId = _getMyId(elm);
    if (!myId.entry) {
        return 'add';
    }
    return 'edit';
}

function bibleDisplayEdit (myId, eIds) {
    var text = title = '';

    // Get data
    if ($(eIds.wrapper)) {
        text = $(eIds.textarea) ? $(eIds.textarea).getValue() : '';
        title = $(eIds.title) ? $(eIds.title).getValue() : '';
    } else if ($(myId.myclass)) {
        text = $(eIds.display) ? $(eIds.display).innerHTML : '';
        var label = 'span.'+myId.myclass;
        title = $$(label);
        title = title[0].innerHTML;
        $(eIds.display).update('');
    }
    // alert(text);

    var wrapper = createWrapper (eIds, 'edit');

    wrapper.appendChild ( 
            createTextInput (eIds, 'title', title)
            );

    if (!$(eIds.display)) {
        alert('ack! '+eIds.display);
        return;
    }

    $(eIds.display).appendChild (wrapper);
    $(eIds.display).appendChild (
            createTextarea (eIds.textarea, text)
            );
}

function createTextInput (eIds, name, value) {
    var wrapper = new Element('div',
            {
                'class':        'inputblock'
            });

    wrapper.appendChild ( new Element('label',
                {
                    'for':      name
                }).update(name)
            );
    wrapper.appendChild ( new Element('input',
            {
                'name':         name,
                'type':         'text',
                'id':           eIds[name],
                'value':        (value ? value : '')
            }));

    return wrapper;
}

function biblePreview (eIds, myId) {
    if (!$(eIds.textarea) || !$(eIds.title)) {
        alert('Ack! '+$H(eIds).toJSON());
        return false;
    }

    // get data
    var text    = tinyMCE.get(eIds.textarea).getContent().replace(/^\s*/,'');
    var title   = $(eIds.title).getValue().replace(/^\s*/,'');
    var name    = '#'+(myId.entry ? myId.entry : title.replace(/[^\w]+/g,'')+" (anchor may change)");

    var wrapper = createWrapper (eIds, 'preview');

    var div = new Element('div',
                { 
                    'class':    'title'
                });
    var span0 = new Element('span', {}).update(title);
    var span = new Element('span', {}).update(' '+name);
    div.appendChild(span0);
    div.appendChild(span);
    wrapper.appendChild(div);

    wrapper.appendChild ( 
                new Element('div',
                { 
                    'class':    'biblebody'
                }).update(text)
            );

    wrapper.appendChild ( 
            createHiddenInput (eIds.title, title)
            );

    wrapper.appendChild ( 
            createHiddenInput (eIds.textarea, text)
            );
}


function createTextarea (id, value) {
   var textarea = false;
    if (!$(id)) {
        textarea = new Element('textarea',
                {
                'id': id
                });
    } else {
        textarea = $(id);
    }
    if (value) {
        textarea.setValue(value);
    }
    return textarea;
}

function hideEditor(eIds) {
    tinyMCE.execCommand('mceRemoveControl', false, eIds.textarea);
    $(eIds.textarea).hide();
}

function showEditor(eIds) {
    $(eIds.textarea).show();
    tinyMCE.execCommand('mceAddControl', false, eIds.textarea);
}

function createHiddenInput (id, value) {
    return new Element('input',
            {
                'type':         'hidden',
                'id':           id,
                'value':        (value ? value : '')
            });
}

function createWrapper (eIds, classs) {
    if ($(eIds.wrapper)) {
        $(eIds.wrapper).remove();
    }

    var wrapper = new Element('div',
                { 
                    'id':       eIds.wrapper,
                    'class':   'section '+classs
                });

    $(eIds.display).appendChild (wrapper);

    return wrapper;
}


function bibleSave (myId, eIds) {
    var text = title = '';

    // Get data
    if ($(eIds.wrapper)) {
        text = $(eIds.textarea) ? $(eIds.textarea).getValue() : '';
        title = $(eIds.title) ? $(eIds.title).getValue() : '';
    }

    if (!text || !title) {
        alert('Neither text nor title may be empty.');
        return false;
    }

    var id      = $(myId.myclass) ? $(myId.myclass).getValue() : '';

    new Ajax.Request('/a_bible.php', {
        parameters: { 
            cat: myId.category, 
            txt: text, 
            title: title,
            id: id,
            anchor: myId.entry 
        },
        onSuccess: function(transport) {
            var data = transport.responseJSON;
            if (data.err) {
                alert("An error occured when updating this entry.");
            } else {
               window.location = '/bible.php#'+data.html;
               window.location.reload();
            }
        }
    });
}

function bibleDelete (myId) {
    if (!confirm("Are you sure you want to delete this entry?"))
        return;
    new Ajax.Request('/a_bible.php', {
        parameters: { 
            del: $(myId.myclass).getValue()
        },
        onSuccess: function(transport) {
            var data = transport.responseJSON;
            if (data.err) {
                alert("An error occured while deleting this entry.");
            } else {
               window.location = '/bible.php';
            }
        }
    });
}

// Open the anchor
document.observe('dom:loaded', function () {
    var a = false;
    if (a = (window.location.href).split('#')) {
        if (a.length == 2) {
            $$('a[name="'+a[1]+'"]').pluck('className').each(function(s){$(s).show()});
        }
    }
});
