/**
 * @author Falko Zander, www.falko-zander.de
 */

/**
 * @param DOM_id String
 * @param DOM_frame_id String
 */
function cEdit(DOM_id, DOM_frame_id) {
    var THIS = this;

    this.frm = $(DOM_id);
    this.frm_cfg = this.frm.getElementsByTagName('div')[0];
    this.frm_data = this.frm.getElementsByTagName('div')[1];
    this.frm_data_content = this.frm_data.innerHTML;
    this.xhr = new cXHR();
    this.dlg = new cDialog(DOM_id, DOM_frame_id, 1, function() { THIS.frm_clear_(); });
    this.dlg.always_aligned = 1;

    this.objects = [];
    
    this.is_page_edit = false;
}

cEdit.prototype.break2br = function(value) {
    return (value != null && value != '') ? value.split('\n').join('<br />') : value;
}

cEdit.prototype.br2break = function(value) {
    return (value != null && value != '') ? value.split('<br />').join('\n') : value;
}

/**
 * @param id String
 * @param module String
 */
cEdit.prototype.up = function(id, module) {
    var d = {
        lang: CONFIG.lang.value,
        name: (typeof module != 'undefined') ? module : CONFIG.content.value,
        ID: id,
        up: '1'
    }
    this.xhr.post('/cgi-bin/edit.cgi', function(msg) { chg_lang(CONFIG.lang.value); }, JSON.stringify(d));
}

/**
 * @param id String
 * @param module String
 */
cEdit.prototype.down = function(id, module) {
    var d = {
        lang: CONFIG.lang.value,
        name: (typeof module != 'undefined') ? module : CONFIG.content.value,
        ID: id,
        down: '1'
    }
    this.xhr.post('/cgi-bin/edit.cgi', function(msg) { chg_lang(CONFIG.lang.value); }, JSON.stringify(d));
}

/**
 * @param id String
 * @param module String
 */
cEdit.prototype.load = function(id, module) {
    if (typeof module == 'undefined') module = CONFIG.content.value;
    var THIS = this;

    this.xhr.get('/cgi-bin/edit.cgi?module=' + module + '&lang=' + CONFIG.lang.value + '&id=' + id, function(msg) { THIS.create_(msg); });
}

/**
 * @param module String
 */
cEdit.prototype.create = function(module) {
    if (typeof module == 'undefined') module = CONFIG.content.value;
    var THIS = this;

    this.xhr.get('/cgi-bin/edit.cgi?module=' + module + '&lang=' + CONFIG.lang.value, function(msg) { THIS.create_(msg); });
}

cEdit.prototype.save = function() {
    var e_config = this.frm.getElementsByTagName('input');
    var e_data = this.frm.getElementsByTagName('textarea');
    
    var d = {}, i;
    for (i = e_config.length - 1; i >= 0; i--) {
        d[e_config[i].name] = e_config[i].value;
    }
    for (i = e_data.length - 1; i >= 0; i--) {
        if (this.is_page_edit == 0) e_data[i].value = this.break2br(e_data[i].value);
        d[e_data[i].name] = e_data[i].value;
    }

    var first = '', f = 0, label = '';
    for (i = this.objects.length - 1; i >= 0; i--) {
        if (this.objects[i].type == 'datepicker2') {
            if (f == 0) {
                f = 1;
                first = d[this.objects[i].name];
                label = this.objects[i].name.substr(0, this.objects[i].name.length - 2);
            } else {
                var dp = new datepicker();
                d[label] = dp.compress(first, d[this.objects[i].name]);
                delete d[label + '_1'];
                delete d[label + '_2'];
            }            
        }
    }

    this.dlg.close();
    this.is_page_edit = false;

    var THIS = this;
    if (d.ID == 'undefined') {
        d.ID = '';
        this.xhr.put('/cgi-bin/edit.cgi', function(msg) { THIS.save_(msg); }, JSON.stringify(d));
    } else {
        this.xhr.post('/cgi-bin/edit.cgi', function(msg) { THIS.save_(msg); }, JSON.stringify(d));
    }
}

/**
 * @param id String
 * @param module String
 */
cEdit.prototype.del = function(id, module) {
    var d = {
        ID: id,
        module: (typeof module != 'undefined') ? module : CONFIG.content.value,
        lang: CONFIG.lang.value
    }

    this.xhr.del('/cgi-bin/edit.cgi', function(msg) { chg_lang(CONFIG.lang.value); }, JSON.stringify(d));
}

cEdit.prototype.page = function() {
    var THIS = this;
    this.xhr.get('/cgi-bin/edit.cgi?module=pageedit&lang=' + CONFIG.lang.value + '&id=' + CONFIG.content.value, function(msg) { THIS.page_(msg); });
}

cEdit.prototype.frm_clear_ = function() {
    this.frm_data.innerHTML = this.frm_data_content;

    var parts = this.frm_cfg.innerHTML.split('<table');
    if (parts.length == 1) parts = this.frm_cfg.innerHTML.split('<TABLE');
    if (parts.length == 1) error('cEdit: unable to split');
    this.frm_cfg.innerHTML = '<table' + parts[1];

    for (var i = this.objects.length - 1; i >= 0; i--) {
        this.objects[i].obj.close();
    }
    this.objects = [];
}

/**
 * @param name String
 * @param value String
 */
cEdit.prototype.frm_add_config_ = function(name, value) {
    if (this.frm_cfg == null) error('cEdit: element not defined');
    
    var t = "<input type='hidden' name='" + name + "' value='" + value + "' />" +   //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
            this.frm_cfg.innerHTML;
    this.frm_cfg.innerHTML = t;
}

/**
 * @param name String
 * @param display_name String
 * @param value String
 * @param cols String
 * @param rows String
 * @param width String
 * @return String
 */
cEdit.prototype.frm_add_textarea_ = function(name, display_name, value, cols, rows, width) {
    var t = '';
    if (display_name != '') {
        t += "<tr><td><label for='frm_edit_" + name + "'>" + display_name + ":</label></td><td>"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
    } else {
        t += "<td colspan='2'>"; //$NON-NLS-1$
    }
    if (typeof width != 'undefined') {
        t += "<textarea name='" + name  //$NON-NLS-1$
           + "' id='frm_edit_" + name  //$NON-NLS-1$  
           + "' cols='" + cols          //$NON-NLS-1$
           + "' rows='" + rows          //$NON-NLS-1$
           + "' style='width:"          //$NON-NLS-1$
           + width 
           + "px'></textarea></td>";    //$NON-NLS-1$
    } else {
        t += "<textarea name='" + name  //$NON-NLS-1$
           + "' id='frm_edit_" + name  //$NON-NLS-1$
           + "' cols='" + cols          //$NON-NLS-1$
           + "' rows='" + rows          //$NON-NLS-1$
           + "'></textarea></td>";      //$NON-NLS-1$
    }
    
    var data = this.frm_data.innerHTML.split('</tr>');
    if (data.length == 1) data = this.frm_data.innerHTML.split('</TR>');
    if (data.length == 1) error('cEdit: unable to split');
    var length = data.length;
    data[length] = data[length - 1];
    data[length - 1] = data[length - 2];
    data[length - 2] = t;
    t = data.join('</tr>');
    this.frm_data.innerHTML = t;

    if (typeof value != 'undefined') {
        var e = $('frm_edit_' + name);
        e.value = value;
        if (!IE) e.innerHTML = value;
    }

    return 'frm_edit_' + name;
}

/**
 * @param name String
 * @param display_name String
 * @param value String
 * @return Object
 */
cEdit.prototype.frm_add_datepicker_ = function(name, display_name, value) {
    this.frm_add_textarea_(name, display_name, value, 80, 2);

    var f = function(y, m, d, id) {
        var dp = new datepicker();
        var s = dp.to_string(y, m, d);
        $(id).value = s;
    }

    return new datepicker('frm_edit_' + name, f);
}

/**
 * @param name String
 * @param display_name String
 * @param value String
 * @return Object
 */
cEdit.prototype.frm_add_datepicker2_ = function(name, display_name, value) {
    var dp = new datepicker();
    var v = dp.decompress(value);

    this.frm_add_textarea_(name + '_1', display_name + ' (von)', v[0], 80, 2);
    this.frm_add_textarea_(name + '_2', display_name + ' (bis)', v[1], 80, 2);    

    var f = function(y, m, d, id) {
        var dpi = new datepicker();
        var s = dpi.to_string(y, m, d);
        $(id).value = s;
    }

    return [{type: 'datepicker2', name: name + '_1', obj: new datepicker('frm_edit_' + name + '_1', f)}, 
            {type: 'datepicker2', name: name + '_2', obj: new datepicker('frm_edit_' + name + '_2', f)}];
}

/**
 * @param title String
 */
cEdit.prototype.frm_set_title_ = function(title) {
    var e1 = this.frm.getElementsByTagName('table')[0];
    var e2 = e1.getElementsByTagName('td')[0];
    e2.innerHTML = 'Editor: ' + title;
}

/**
 * @param msg Object
 */
cEdit.prototype.create_ = function(msg) {
    var data = JSON.parse(msg);
    var cfg = data.config;
    if (cfg == null) error('cEdit: wrong data');
    
    this.frm_set_title_(data.name);

    var t_dat = '', objs = [], i;
    for (i = 0; i < cfg.length; i++) {
        switch(cfg[i].type) {
            case 'config':
                this.frm_add_config_(cfg[i].label, data[cfg[i].label]);
                break;
            case 'textarea':
                data[cfg[i].label] = this.br2break(data[cfg[i].label]);
                objs.push(this.frm_add_textarea_(cfg[i].label, cfg[i].display_name, data[cfg[i].label], 80, 2));
                break;
            case 'textarea2':
                data[cfg[i].label] = this.br2break(data[cfg[i].label]);
                objs.push(this.frm_add_textarea_(cfg[i].label, cfg[i].display_name, data[cfg[i].label], 80, 4));
                break;
            case 'textarea3':
                data[cfg[i].label] = this.br2break(data[cfg[i].label]);
                objs.push(this.frm_add_textarea_(cfg[i].label, cfg[i].display_name, data[cfg[i].label], 80, 8));
                break;
            case 'datepicker':
                this.objects.push({type: 'datepicker', obj: this.frm_add_datepicker_(cfg[i].label, cfg[i].display_name, data[cfg[i].label])});
                break;
            case 'datepicker2':
                this.objects = this.objects.concat(this.frm_add_datepicker2_(cfg[i].label, cfg[i].display_name, data[cfg[i].label]));
                break;
            default:
                error('cEdit: wrong config type');
        }
    }
    
    var style = { width: '450px' }
    this.dlg.setstyle(style);
    this.dlg.show();

    for (i = this.objects.length - 1; i >= 0; i--) {
        var f = function f(id, obj, others) {
            $(id).onfocus = function() { obj.open(); }
            for (var j = others.length - 1; j >= 0; j--) {
                $(others[j]).onfocus = function() { obj.close(); }
            }
        }
    
        var id = this.objects[i].obj.parentid_;
        f(id, this.objects[i].obj, objs);
    }
}

/**
 * @param msg String
 */
cEdit.prototype.page_ = function(msg) {
    var style = { width: '960px' }

    this.frm_set_title_(CONFIG.content.value);
    this.frm_add_config_('module', 'pageedit');
    this.frm_add_config_('id', CONFIG.content.value);
    this.frm_add_config_('lang', CONFIG.lang.value);
    this.frm_add_textarea_('data', '', msg, 1, 20, 940);

    this.is_page_edit = true;
    
    this.dlg.setstyle(style);
    this.dlg.show();
}

/**
 * @param msg String
 */
cEdit.prototype.save_ = function(msg) {
    chg_lang(CONFIG.lang.value);
}
