/* 
 * Hier werden alle Javascript geladen und ausgefuehrt, wenn sie benoetigt
 * werden
 */

// fuer alte Browser brauchen wir trim
if (String.prototype.trim==null) String.prototype.trim = function(){
    return this.replace(/^\s*/, '').replace(/\s*$/, '');
}

/**
 * script fuer tooltips als plugin fuer jquery
 *
 * Die Struktur sollte dann in etwa so aussehen
 *
 * .tooltip
 *   .tooltip-trigger bezeichnung
 *   .tooltip-box
 *     .tooltip-heading Ueberschrift
 *     .tooltip-content Inhalt
 *
 * es geht aber auch folgende
 * .tooltip
 *   %strong platzhalter
 *   [.tooltip-heading Uberschrift]
 *   .content Inhalt
 */
$.fn.tooltip = function(){
    return this.each(function(){
        var trigger = $(this).children('.tooltip-trigger, strong');
        var box = $(this).find('.tooltip-box');
        if (box.length == 0) {
            box = $(this).children('div.content').wrap('<div class="tooltip-box"></div>').parent();
        }
        // schauen ob es eine ueberschrift gibt und platzieren
        var headings = $(this).find('.tooltip-heading').length;
        if (headings == 0) {
            box.prepend('<div class="tooltip-heading">'+trigger.text()+'</div>');
        } else if (box.children('.tooltip-heading').length == 0 && headings > 0) {
            box.prepend($(this).children('.tooltip-heading'));
        }

        box.addClass('ui-widget ui-widget-content ui-corner-all portlet ui-dialog')
            .find('.tooltip-heading').addClass('portlet-header ui-widget-header ui-corner-all').end()
            .find('.tooltip-content').addClass('clearfix portlet-content').end()

        box.hide();
        $(this).hover(function(){
            // move in
            var scroll_diff = {'left': $(window).scrollLeft(),'top': $(window).scrollTop()};
            var trigger_position = trigger.offset();
            var trigger_size = {'width': trigger.width(),'height': trigger.height()};
            var doc_width = $(window).width();

            var left = trigger_position.left;
            // wenn rechts kein platz mehr ist, dann die box nach Links verschieben
            if ((doc_width - 10) < (trigger_position.left - scroll_diff.left + box.width())) {
                left = doc_width - 10 - box.width();
            }
            var top = 0;
            var top_spacing = 5;

            if ($(this).hasClass("tooltip-no-top-spacing")){
                top_spacing = 0;
            }
            // wenn nach unten kein Platz mehr ist, dann die Boxen ueber den Trigger schieben
            if ((trigger_position.top - scroll_diff.top + trigger_size.height + box.height() + top_spacing) < $(window).height()) {
                top = trigger_position.top - scroll_diff.top + trigger_size.height + top_spacing;
            } else {
                top = trigger_position.top - scroll_diff.top - box.height() - (top_spacing * 2);
            }
            box.attr('style', 'position: fixed; top: '+ top + 'px; left: '+ left + 'px;');
            box.show();
        },
        function(){
            // move out
            box.hide();
        })
    });
};

/*
 * mit dieser Funktion laesst sich Javascript laden
 * und der dazugehoerige Code-Block ausfuehren, sobald
 * das Script geladen wurde
 */
function load_js_file(name, block) {
    $.getScript(urls.paths.javascript+name, function(){
        if (block != null) {
            block();
        }
    })
}

function call_dummy_send(event) {
    if (event.keyCode == 13) {
        $('#dummy_send').click();
    }
    return false;
}

/**
 * erweitert die URL um Parameter
 *
 * Die Parameter, die per JSON-Array uebergeben werden, werden an die URL
 * angehangen.
 * {'test1': 'test2', 'test3': 'test4'} ==> erweitert die URL um &test1=test2&test3=test4
 */
function add_to_url(url, options) {
    $.each(options, function(key, item){
        url += '&amp;' + key + '=' + item;
    })
    return url;
}

function setParameter(type, name, value) {
    if (type == 'session' || type == 'profile') {
        params = {
            'sessionid': sessionid,
            'action': 'set'
        };
        params['parametercache-set'+type+'value-'+name+'-'+value] = 1;
        $.ajax({
            type: "GET",
            url: "ajax.php",
            data: params
        });
    }
}

function getParameter(type, name) {
    if (type == 'session' || type == 'profile') {
        params = {
            'name'  : name,
            'type'  : type,
            'action': 'get',
            'module': 'parametercache'
        }
        var result = null;
        $.ajax({
            async: false,
            dataType: 'json',
            type: 'POST',
            url : 'ajax.php?sessionid='+sessionid,
            data: params,
            success: function(data, status) {
                result = data;
            }
        })
        return result;
    } else {
        return null;
    }
}

function delParameter(type, name) {
    params = {
        'module': 'parametercache',
        'type'  : type,
        'name'  : name,
        'action': 'del'
    }
    $.ajax({
        type: 'POST',
        url : 'ajax.php?sessionid='+sessionid,
        data: params
    })
}

function setParameterAjax(type, name, value) {
    //console.log('-->'+value.toSource()+'\n'+typeof(value));
    // Wenn wir ein Object bekommen, konvertieren wir es einfach zu String und
    // entfernen die () um das Resultat
    if (typeof(value) == 'object') {
        /* manche Objekte werden in () gepackt, die weg muessen */
        //value = value.toSource().replace(/^\((.*)\)$/, "$1");
        value = JSON.stringify(value);
    }
    params = {
        'module'   : 'parametercache',
        'type'     : type,
        'name'     : name,
        'value'    : value,
        'action'   : 'set'
    }
    $.ajax({
        type: 'POST',
        url : 'ajax.php?sessionid='+sessionid,
        data: params
    })
}

function arrangeTable(table, lists) {
    var elements = null;
    if (lists['hide'].length > 0) {
        elements = $('#'+lists['hide'][0]).parent().children('th')
        // alle Elemente durchgehen und loeschen
        $.each(lists['hide'], function(key, item){
            var element = $('#'+item);
            var index = elements.index(element);
            // in der Tabelle alle Zeilen durchgehen und die Zellen mit
            // dem Index loeschen (hoffentlich gibt es da nix anderes als td o.O)
            if (element.length > 0) {
                table.children('tbody').children('tr').each(function(){
                    $(this).children('*:eq('+index+')').hide().removeClass('article_list_hide');
                })
            }
        })
    }
    if (lists['show'].length > 0) {
        // wir brauchen die th-liste fuer den index
        // das selbe wie oben, nur zeigen wir diesmal die Zellen wieder an
        // zusaetzlich wird aber auch umsortiert, weil die Reihenfolge
        // in diesem Fall interessant ist
        $.each(lists['show'], function(key, item){
            elements = $('#'+lists['show'][0]).parent().children()
            var element = $('#'+item);
            var index = elements.index(element);

            if (element.length > 0) {
                table.children('tbody').children('tr').each(function(){
                    node = $(this).children('*:eq('+index+')');
                    if (key == 0) {
                        $(this).prepend(node.show());
                    } else {
                        node.show().insertAfter($(this).children('*:eq('+(key - 1)+')'));
                    }
//                    if ((element.attr('class') || '').indexOf('article_list_hide') >= 0) {
//                        node.hide();
//                    }
                })
            }
        })
    }
}

function tableClearList(list) {
    columns = [];
    $.each(list, function(key, value){
        columns[key] = value.replace(/^list\-(.*)/, '$1')
    });
    return columns;
}

/**
 * funktion setzt den Status einer Box
 *
 * @param box die Box, die geaendert werden soll
 * @param open true if the box ist open/extended
 * @param show welcher der Boxen soll angezeigt werden
 */
function box_set_status(box, open, show) {
    if (open == undefined) {
        open = false;
    }
    box_set_extend(box, open);
    // wenn wir aufmachen, erst dann soll auch was angezeigt werden
    if (open) {
        box_set_select(box, show);
    }
}
/*
 * box auf-/zuklappen
 */
function box_set_extend(box, open) {
    // parameter nur neu zur DB schicken, wenn sich was geaendert hat
    if (flag_extended_box[box.attr('id')] != open) {
        flag_extended_box[box.attr('id')] = open;
        setParameterAjax('profile', 'flag_extended_box', flag_extended_box);
    }
    // auf- und zuklappen + icon neu setzen
    if (open) {
        box.find('.box_tree').addClass('box_large');
        box.find('.box_extend').removeClass('ui-icon-arrowthickstop-1-s').
            addClass('ui-icon-arrowthickstop-1-n').attr('title', 'Box schliessen');
    } else {
        // das hide() brauchen wir, damit beim Start alles schoen versteckt ist
        box.find('.box_tree').hide().removeClass('box_large');
        box.find('.box_extend').removeClass('ui-icon-arrowthickstop-1-n').
            addClass('ui-icon-arrowthickstop-1-s').attr('title', 'Box oeffnen');
    }
}
/*
 * Box auswaehlen und anzeigen
 */
function box_set_select(box, show) {
    // beim ersten mal wollen alle immer alles sehen
    if (show == undefined) {
        show = flag_selected_box[box.attr('id')] || 'all';
    }
    // status nur verschicken, wenn sich was geaendert hat
    if (flag_selected_box[box.attr('id')] != show) {
        flag_selected_box[box.attr('id')] = show;
        setParameterAjax('profile', 'flag_selected_box', flag_selected_box);
    }
    // alles verstecken und selektierte Box anzeigen
    box.find('.box_tree').hide();
    box.find('.box_'+show).show();
    // treeview generieren, wenn sie noch nicht da ist
    if (box.find('.box_'+show+' .ui-owntree').length == 0) {
        box_generate_tree(box, show);
    }
}
/*
 * treeview generieren
 */
function box_generate_tree(box, show) {
    // in diesem Array sind die Optionen zu allen
    // Trees gespeichert.
    var trees = {
        'product_group_tree_all': {
            expand: 'one',
            targetURL: add_to_url(urls.link.main, {
                module: 'article',
                submodule: 'search'
            }),
            source: {
                url: add_to_url(urls.link.ajax, {
                    sessionid: sessionid,
                    module: 'warenbereich'
                }).replace(/\&amp;/g, '&')
            },
            afterAppend: function(event, ui) {
                format_tree_node($(ui.node));
            }
        },
        'producer_tree_all': {
            expand: 'one',
            targetURL: add_to_url(urls.link.main, {
                module: 'article',
                submodule: 'search'
            }),
            source: {
                url: add_to_url(urls.link.ajax, {
                    sessionid: sessionid,
                    module: 'lieferanten'
                }).replace(/\&amp;/g, '&')
            },
            afterAppend: function(event, ui) {
                format_tree_node($(ui.node));
            }
        },
        'product_group_tree_selection': {
            targetURL: add_to_url(urls.link.article_search_in_search, {
                module: 'article',
                submodule: 'search',
                suchnr: article_search_number
            }),
            source: {
                url: add_to_url(urls.link.ajax, {
                    sessionid: sessionid,
                    module: 'article',
                    submodule: 'product_group',
                    suchnr: article_search_number
                }).replace(/\&amp;/g, '&')
            },
            afterAppend: function(event, ui) {
                format_tree_node($(ui.node));
            }
        },
        'producer_tree_selection': {
            targetURL: add_to_url(urls.link.article_search_in_search, {
                module: 'article',
                submodule: 'search',
                suchnr: article_search_number
            }),
            source: {
                url: add_to_url(urls.link.ajax, {
                    sessionid: sessionid,
                    module: 'article',
                    submodule: 'supplier',
                    suchnr: article_search_number
                }).replace(/\&amp;/g, '&')
            },
            afterAppend: function(event, ui) {
                format_tree_node($(ui.node));
            }
        }
    };
    setTimeout(function(){
        $('#'+box.attr('id')+'_tree_'+show).owntree(trees[box.attr('id')+'_tree_'+show]);
    }, 10)
}

/*
 * Preise formatiert ausgeben
 */
function format_price(zahl) {
    // alles was reinkommt in einen String konvertieren und dann
    // ein bissel die Zeichen hin und her schubsen
    if (zahl != null){
        zahl = zahl.toString().replace(/\,/, '.');
        wert = Math.round(zahl * 100) / 100;
        wert = wert.toFixed(2);
        wert = wert.replace(/\./,",");
        while(wert.match(/^(\d+)(\d{3}\b)/)) {
            wert = wert.replace(/^(\d+)(\d{3}\b)/, RegExp.$1 + '.' + RegExp.$2);
        }
        return wert + ' ' + currency;
    } else {
        return '';
    }
};

function format_tree_node(node) {
    //.replace(/\&/g, '&amp;')
    var text = node.children('.ui-heading').text().replace(/\&/g, '&amp;').replace(/\s---\s$/, '').split(' --- ');

    var newnodes = '';
    if (node.children('span.ui-heading').length > 0) {
        node.children('.ui-heading').remove();
        if (text.length == 3) {
            newnodes = '<span class="ui-heading float_right"> / '+text[2]+'</span>';
        }
        node.append(newnodes + '<span class="ui-heading float_right">'+text[1]
            +'</span><span class="ui-heading">'+text[0]+'</span>');
    } else if (node.children('a.ui-heading').length > 0) {
        //var href = node.children('a.ui-heading').attr('href').replace(/\&/g, '&amp;');
        var href = node.children('a.ui-heading').attr('href').replace(/\&/g, '&amp;');
        node.children('.ui-heading').remove();
        if (text.length == 3) {
            newnodes = '<a class="ui-heading float_right" href="'+
                href.replace(/(.*)&amp;suchnr=[0-9]*(&amp;.*)/, '$1$2')+
                '" title="Alle Artikel von &quot;'+text[0]+'&quot; anzeigen.">'+
                text[2]+'</a><span class="float_right font_weight_bold" style="margin-left: 3px; margin-right: 3px;"> / </span>';
        }
        node.append(newnodes + '<a class="ui-heading float_right" href="'+href+'"'+
            ' title="In Suchergebniss enthaltene Artikel von &quot;'+text[0]+'&quot; anzeigen.">'+
            text[1]+'</a><a class="ui-heading" href="'+href+'">'+text[0]+'</a>');
    }
}

function sort_table_with_id(table) {
    var list = getParameter('profile', 'list-'+table.attr('id'))
    if (list == null) {
        list = {'show': [], 'hide': []}
        table.children('tbody').children('tr').children('th').each(function(){
            if ($(this).is('.article_list_hide')) {
                list['hide'].push($(this).attr('id'));
            } else {
                list['show'].push($(this).attr('id'));
            }
        })
    }
    arrangeTable(table, list);
}
