/**
 * - ist Provider spezifisch
 * - ist leer wenn es für einen Provider keinen Zusatz gibt!
 */
var zusatz_config = { };

/**
 * - ist für alle Provider gleich
 * - gibt den Tarifnamen für eine Spalte zurück
 **/
function getTarifName(col) {
    var tarif = $('tarif_' + col);
    var zusatz = $('zusatz_' + col);
    
    var tarif_name = $F(tarif) + ($F(zusatz) != 'kein' ? ' ' + $F(zusatz) : '');
    
    return tarif_name;
}

/**
 * - ist für alle Provider gleich
 * - updated nur das Zusatzfeld anhand von zusatz_config
 **/
function updateZusatz(col) {
    var tarif = $('tarif_' + col);
    var tarif_value = $F(tarif);
    
    var zusatz = $('zusatz_' + col);
    var zusatz_value = $F(zusatz);
    
    zusatz.clearOptions();
    var has_zusatz = false;
    
    for (var property in zusatz_config[tarif_value]) {
        zusatz.addOption(property, zusatz_config[tarif_value][property]);
        has_zusatz = true;
    }
    
    if ( ! has_zusatz) {
        zusatz.addOption('kein', 'kein');
    }
    
    if (has_zusatz) {
        zusatz.show();
    } else {
        zusatz.hide();
    }
}

/**
 * - ist für alle Provider gleich
 * - updated Infofeld oben und Infolink links. 
 **/
function updateRateInfo(col) {
    var tarif_name = getTarifName(col);
    /* * /
    if ( ! rates[tarif_name]) {
        return;
    }
    /* */
    if (tarif_name != 'bitte aussuchen') {
        $('tarif_info_slink_' + col).href = rates[tarif_name]['info'];
        $('tarif_info_slink_' + col).show();
        
        $('tarif_info_' + col).innerHTML = rates[tarif_name]['beschreibung'];
        $('tarif_info_' + col).show();
    } else {
        $('tarif_info_slink_' + col).hide();
        
        $('tarif_info_' + col).hide();
    }
}

/**
 * - ist Provider spezifisch
 * - gibt zurück welche Tarif Auswahl im nächsten Feld möglich sein soll
 * - gibt zurück ob die nächte Spalte angezeigt werden soll! 
 */
function getNextRates(col, next_rates) {
    return false;
}

/**
 * - ist für alle Provider gleich
 * - updated das folgende Tarif- und Zusatz-feld
 * - wendet updateTarif und updateZusatz rekusiv an
 */
function updateNextRate(col) {
    updateRateInfo(col);
    
    if (col == maximum_rates) {
        return;
    }
    
    var tarif = $('tarif_' + col);
    
    var next_rates = [ {'name' : 'weiterer Tarifwunsch?', 'value' : 'bitte aussuchen'} ];
    var next_show = false;
    
    if ($F(tarif) == 'bitte aussuchen') {
        next_show = false;
    } else {
        next_show = getNextRates(col, next_rates) && next_rates.length > 1;
    }
    
    var next_tarif = $('tarif_' + (col + 1));
    var next_tarif_value = $F(next_tarif);
    
    var next_zusatz = $('tarif_' + (col + 1));
    var next_zusatz_value = $F(next_zusatz);
    
    next_tarif.clearOptions();
    for (var i = 0; i < next_rates.length; i++) {
        next_tarif.addOption(next_rates[i]['value'], next_rates[i]['name']);
    }
    next_tarif.selectValue(next_tarif_value);
    
    updateZusatz(col + 1);
    next_zusatz.selectValue(next_zusatz_value);
    
    updateNextRate(col + 1);
    updateCategoryOptionDisplay(col + 1);
    
    if (next_show) {
        next_tarif.show();
    } else {
        next_tarif.hide();
    }
}

/**
 * - ist Provider spezifisch
 * - welche Kategorien zum aktuellen Tarif nicht gewählt werden können
 */
function getHiddenCategories(col) {
    return [];
}
 
/**
 * - ist für alle Provider gleich
 * - updated die Sichtbarkeit einzelner Kategorien
 */
function updateCategoryOptionDisplay(col) {
    var hidden_categories = getHiddenCategories(col);
    
    for (var row = 1; row <= 3; row++) {
        
        var category = $('kategorie_' + row + '_' + col);
        var selected = $F(category);
        
        category.clearOptions();
        category.addOption('bitte aussuchen', 'bitte Gerät wählen');
        
        var hiddenSelected = false;
        for (var i = 0; i < kategorien.length; i++) {
            if (hidden_categories.include(kategorien[i].name)) {
                if (kategorien[i].id == selected) {
                    hiddenSelected = true;
                }
                continue;
            }
            if (row > 1 && ! kategorien[i].single) {
                continue;
            }
            
            category.addOption(kategorien[i].id, kategorien[i].name);
        }
        
        if (hiddenSelected) {
            updateCategory(row, col);
        } else {
            category.selectValue(selected);
        }
    }
}

/**
 * - ist für alle Provider gleich
 * - füllt ein Device mit den Werten zu der Kategorie
 */
function updateDevice(row, col) {
    var kategorie = $('kategorie_' + row + '_' + col);
    var kategorie_value = $F(kategorie);
    
    var geraet = $('geraet_' + row + '_' + col);
    var gerate_value = $F(geraet);
    
    geraet.clearOptions();
    
    if (kategorie_value == 'bitte aussuchen') {
        return;
    }
    
    for (var device_id in geraete[kategorie_value]) {
        if (row > 1 && ! geraete[kategorie_value][device_id]['single']) {
            continue;
        }
        geraet.addOption(device_id, geraete[kategorie_value][device_id]['name']);
    }
    
    geraet.selectValue(gerate_value);
}

/**
 * - ist für alle Provider gleich
 * - gibt zurück ob die Kategorie sichtbar sein sollten! 
 */
function isCategoryVisible(row, col) {
    if (row <= 1) {
        var tarif_name = getTarifName(col);
        return tarif_name != 'bitte aussuchen';
    }
    if ( ! isCategoryVisible(row - 1, col)) {
        return false;
    }
    var prev_kategorie_value = $F('kategorie_' + (row - 1)  + '_' + col);
    return prev_kategorie_value != 'bitte aussuchen';
}

/**
 * - ist für alle Provider gleich
 * - gibt zurück ob das Geraet sichtbar sein sollten! 
 */
function isDeviceVisible(row, col) {
    if ( ! isCategoryVisible(row, col)) {
        return false;
    }
    var kategorie_value = $F('kategorie_' + row  + '_' + col);
    return kategorie_value != 'bitte aussuchen';
}

/**
 * - ist für alle Provider gleich
 * - setzt die Sichtbarkeit von Geraet und Kategorie entsprechend is(Device|Category)Visible()
 */
function updateDeviceVisibility() {
    for (var row = 1; row <= 3; row++) {
        var show_category_row = false;
        var show_device_row = false;
        
        for (var col = 1; col <= maximum_rates; col++) {
            if (isCategoryVisible(row, col)) {
                $('kategorie_' + row + '_' + col).show();
                show_category_row = true;
            } else {
                $('kategorie_' + row + '_' + col).hide();
            }
            
            if (isDeviceVisible(row, col)) {
                $('geraet_' + row + '_' + col).show();
                show_device_row = true;
            } else {
                $('geraet_' + row + '_' + col).hide();
            }
            updateDeviceInfo(row, col);
        }
        
        if (show_category_row) {
            $('kategorie_row_' + row).show();
        } else {
            $('kategorie_row_' + row).hide();
        }
        
        if (show_device_row) {
            $('geraete_row_' + row).show();
        } else {
            $('geraete_row_' + row).hide();
        }
    }
}

/**
 * - ist für alle Provider gleich
 * - setzt die Geraete-Informationen
 */
function updateDeviceInfo(row, col) {
    var device_visible = isDeviceVisible(row, col);
    
    if (device_visible) {
        var kategorie_value = $F('kategorie_' + row  + '_' + col);
        var geraet_value = $F('geraet_' + row  + '_' + col);
        
        $('geraet_info_slink_' + row + '_' + col).href = geraete[kategorie_value][geraet_value]['info'];
        $('geraet_info_slink_' + row + '_' + col).show();
        
        $('geraet_info_bild_' + row + '_' + col).src = geraete[kategorie_value][geraet_value]['bild'];
        $('geraet_info_avail_' + row + '_' + col).src = imagesurl + color[geraete[kategorie_value][geraet_value]['avail']] + '-ng.png';
        $('geraet_info_link_' + row + '_' + col).href = geraete[kategorie_value][geraet_value]['info'];
        
        $('geraet_info_' + row + '_' + col).show();
        
    } else {
        $('geraet_info_slink_' + row + '_' + col).hide();
        
        $('geraet_info_' + row + '_' + col).hide();
    }
}

/**
 * - ist für alle Provider gleich
 * - führt die notwendigen änderungen durch wenn eine Kategorie geändert wird 
 */
function updateCategory(row, col) {
    var kategorie = $('kategorie_' + row + '_' + col);
    var kategorie_value = $F(kategorie);
    
    updateDevice(row, col);
    
    if (kategorie_value != 'bitte aussuchen') {
        updateDeviceInfo(row, col);
        return;
    }
    
    var next_kategorie;
    var next_kategorie_value;
    
    for (var i = row + 1; i <= 3; i++) {
        next_kategorie = $('kategorie_' + i + '_' + col);
        next_kategorie_value = $F(next_kategorie);
         
        if (next_kategorie_value != 'bitte aussuchen') {
            break;
        } 
    }
   
    if (i > 3) {
        updateDeviceInfo(row, col);
        return;
    }
   
    kategorie.selectValue(next_kategorie_value);
    
    updateDevice(row, col);
    
    $('geraet_' + row + '_' + col).selectValue($F('geraet_' + i + '_' + col));
    updateDeviceInfo(row, col);
    
    next_kategorie.selectValue('bitte aussuchen');
    updateCategory(i, col);
}

var PREIS_CACHE = 0;

/**
 * - ist für alle Provider gleich
 */
function updatePreis() {

    var preis = $('preis');

    var tarife = new Array();
    var geraete = new Array();
    
    for (var col = 1; col <= maximum_rates; col++) {        
        var tarif = getTarifName(col);
        
        if (tarif == 'bitte aussuchen' && col == 1) {
            preis.update('bitte 1. Tarif aussuchen');
            return;
        }
        if (tarif == 'bitte aussuchen') {
            continue;
        }
        /* * /
        if ( ! rates[tarif]) {
            continue;
        }
        /* */
        tarife[tarife.length] = rates[tarif]['id'];
        
        /* geraete */
        for (var row = 1; row <= 3; row++) {
            var geraet = $F('geraet_' + row + '_' + col);
            if (geraet && geraet != 'bitte aussuchen') {
                geraete[geraete.length] = geraet;
            }
        }
    }
    
    preis.update('wird berechnet ...');
    
    new Ajax.JsonRPC('calculatePrice', [versionId, 'nv', frontend, tarife, geraete], replacePrice, jsonrpcurl);
}

/**
 * - ist für alle Provider gleich
 */
function replacePrice(retval) {
    var preis = $('preis');
    
    if (retval == 's') {
        preis.update('Zuviel Startguthaben!');
        preis.removeClassName('preiszahl');
        preis.addClassName('preistext');
    } else if (retval == 'a') {
        preis.update('Auszahlungsbetrag ändern!');
        preis.removeClassName('preiszahl');
        preis.addClassName('preistext');
    } else {
        preis.update(retval + ',00 Euro');
        preis.removeClassName('preistext');
        preis.addClassName('preiszahl');
    }
    
    PREIS_CACHE = retval;
}

/**
 * - ist für alle Provider gleich
 */
function empfehlen_generator() {
    var preis = document.getElementById("id_preis");

    var tarife = new Array();
    var geraete = new Array();
    var t_length = 0;
    var g_length = 0;
    var url = 'http://' + window.location.hostname + '/handyshop.php?q=__q__s__g__empfehlen__p__';
    
    for (var i = 1; i <= 5; i++) {
        
        var tarif = document.getElementsByName('tarif_'+i)[0];
        var zusatz = document.getElementsByName('zusatz_'+i)[0];
        
        if (tarif === undefined) {
            continue;
        }
        if (tarif.value == 'bitte aussuchen' && i == 1) {
            return;
        }
        if (tarif.value == 'bitte aussuchen') {
            continue;
        }
        var tname = tarif.value;
        var    zname = zusatz.value;
        if (zname != 'kein') {
            
            tname = tname + ' ' + zname;
            
        }
        t_length = i; 
        if (t_length == 1) {
            url += '__u__rate_id__g__'+rates[tname]['id'];
        } else {
            url += '__u__rate_id'+ (t_length) +'__g__'+ rates[tname]['id'];
        }
        
        /* geraete */
        for (var j = 1; j <= 3; j++) {
            var geraet = document.getElementsByName('geraet_'+j+'_'+i)[0];
            if (geraet.value != 'bitte aussuchen' && geraet.value != '') {
                g_length++; 
                if (g_length == 1) {
                    url += '__u__device_id__g__'+geraet.value;
                } else {
                    url += '__u__device_id'+ (g_length) +'__g__'+ geraet.value;
                }
            }
        }
    }
    
    url += '__u__in__g__kombinator';
    links = (screen.width/2)-(700/2);
    oben = (screen.height/2)-(700/2);
    window.open(url, 'empfehlen', 'scrollbars=yes,resizable=yes,width=700,height=700,top='+oben+',left='+links);        
}

/* tarif */
function setTarif(col, value) {
    var tarif = $('tarif_' + col);
    
    tarif.selectValue(value);
    
    updateZusatz(col);
    updateNextRate(col);
    updateCategoryOptionDisplay(col);
    updateDeviceVisibility();
}

/* zusatz */
function setZusatz(col, value) {
    var zusatz = $('zusatz_' + col);
    
    zusatz.selectValue(value);
  
    updateNextRate(col);
    updateCategoryOptionDisplay(col);
    updateDeviceVisibility();
}

/* kategorie */
function setKategorie(row, col, value) {
    var kategorie = $('kategorie_' + row + '_' + col);
    
    kategorie.selectValue(value);
    
    updateCategory(row, col);
}

/* geraet */
function setGeraet(row, col, value) {
    var geraet = $('geraet_' + row + '_' + col);
    
    geraet.selectValue(value);
    
    updateDeviceInfo(row, col);
}

function popupDetails(url, title) {
    var width  = 630;
    var height = 700;
    
    var left = (screen.availWidth - width) / 2;
    var top  = (screen.availHeight - height) /2;
    
    var features = [];
    
    features.push('scrollbars=yes');
    features.push('resizable=yes');
    
    features.push('top=' + top);
    features.push('left=' + left);
    features.push('width=' + width);
    features.push('height=' + height);
    
    popup = window.open(url, title, features.join(','));
    
    if (popup) {
        popup.focus();
        return false;
    }
    return true;
}
