(function($) {
    var baseHref = $('base').attr('href');
    var tempForm = $('.form-events form').attr('data-xml');
    var createShowBox = function(div, data) {
        var that = this;
        var html = '<div class="ppMod bubble article article-rte">' +
				'<div class="iPpMod iBubble">' +
				'<p class="date">' + data.date + ' ' + data.city + '</p>' +
				'<div class="description">' +
				'<div class="image-container">' +
				'<img src="' + data.image + '" alt=""/>' +
				((data.isHighlight != undefined && data.isHighlight) ? '<img class="highlight" src="' + data.image + '" alt=""/>' : '') +
				'</div>' +
				'<p>' +
				'<a href="' + data.url + '" class="nostyle">' + data.title + '</a>' +
				data.description +
				' <a href="' + data.url + '">mehr</a>' +
				'</p>' +
				'</div>' +
				'<ul>' +
        //				'<li><a href="#" rel="memory">Merken</a></li>' +
        //				'<li><a href="#" rel="routing">Route bis hier</a></li>' +
				'</ul>' +
				'<div class="fb"></div>' +
				'<a href="#" class="close">&nbsp;</a>' +
				'</div>' +
				'<div class="cursor">' +
				'</div>' +
				'</div>';
        div.append(html);

        //$('.fb', div).fbLike(baseHref + data.url, pp.fbLike);
        $('a.close', div).click(function() {
            that.hide();
            return false;
        });
    };

    var configBingMaps = {};

    $(function() {
        configBingMaps = {
            key: window.CONFIG.BingMaps.key,
            pushPins: null,
            infoBox: createShowBox,
            icon: {
                url: 'fileadmin/layout/img/master/bingmaps-pin.png',
                width: 39,
                height: 42
            }

        };
    });


    var updateResults = function(results, toReplace) {
        if (toReplace != null) {
            $(toReplace).after(results);
            $(results).addClass('inv');
        }
        /*Facebook*/

        $('tbody tr', results).each(function() {
            var aHref = $('a:first', this).attr("href");

            //$('td:last', this).fbLike(baseHref + aHref, pp.fbLike);
        });
        /*Paginator*/
        $('.paginator a', results).click(function() {
            ajaxPaginator(results, $(this).attr('data-xml'));
            return false;
        });

        if (toReplace != null) {
            $(toReplace).remove();
            $(results).removeClass('inv');
        }


    };



    $(function() {
        var options = {
            showOn: "button",
            buttonImage: "/fileadmin/layout/img/master/datepickerIcon.png",
            buttonImageOnly: true,
            maxDate: new Date(2011, 11, 31),
            minDate: new Date(2011, 0, 1)
        };
	
	// added by heiko hardt 31.10.2011 #############################
        var options2012 = {
            showOn: "button",
            buttonImage: "/fileadmin/layout/img/master/datepickerIcon_blue.png",
            buttonImageOnly: true,
            maxDate: new Date(2012, 11, 31),
            minDate: new Date(2012, 0, 1)
        };
	// add end ##########################################


        if ($('#field-date input[type="text"]').length) {
            options.beforeShow = function(input, inst) {
                var p = inst.dpDiv.parent();
                var off = $(input).offset();
                var sib = $(input).siblings('img').offset();
                p.offset({ left: off.left * -1 + sib.left + 24, top: off.top * -1 + sib.top - 27 });

            };
            options.onSelect = function(dateText, inst) {
                if (inst.id == "date-from") {

                    $("#date-till").datepicker("option", "minDate", dateText);
                }
            };

        } else {
            options.onSelect = function(dateText, inst) {
                if (inst.id == "eventbegin_date") {

                    $("#eventend_date").datepicker("option", "minDate", dateText);
                }
            };
        }
	
	// changed by heiko hardt 31.10.2011 #############################
	// $('.dateTime .date, #field-date input[type="text"]').each(function() {
	$('.dateTime.year2011 .date, #field-date input[type="text"]').each(function() {
            $(this).datepicker(options);
        });

	// added by heiko hardt 31.10.2011 #############################
        $('.dateTime.year2012 .date, #field-date input[type="text"]').each(function() {
            $(this).datepicker(options2012);
        });
	// add end ##########################################
	
    });

    /* Events Detail*/
    $(function() {
        $('.events-detail').each(function() {

            var that = $(this),
					map = $('._bingmaps', that),
					p = $.parseJSON($.trim($('script', map).html()));
            configBingMaps.pushPins = p.pins;
            map.bingmaps(configBingMaps);
        })
    });

    //    $(window).keypress(function(e) {
    //        if (e.keyCode == 13) {
    //            var formHref = $('.form-events form').attr('data-xml');
    //            updateHtml(formHref);
    //        }
    //    });


    /* Events Detail*/
    $(function() {
        updateResults($('.tx-veranstaltungskalender-pi2 .events-list-view, .tx-veranstaltungskalender-pi6 .events-list-view'), null);
    });

    /*Filter Anzeigen*/
    /*****************/
    /*****************/
    function updateHtml(form) {
        var searchValues = $('.searchValues', form);
        var fieldDate = "";
        var fieldCategorie = "";
        var fieldTargetgroup = "";
        var dateFrom = "";
        var dateTill = "";
        var timeArea = "";
        var cityAndRadiusZip = "";
        var cityAndRadiusRadius = "";
        var cityAndRadiusArea = "";
        var search_term = "";

        /*Suchbegriff Filter*/
        if ($('input#search-term', form).val() != undefined) {
            if ($('input#search-term', form).val().length > 0 && $('input#search-term', form).val() != "Suchbegriff (Name / Ort / Kategorie)") {
                search_term += "<li>Suchbegriff: ";
                search_term += ($('input#search-term', form).val());
                search_term += "</li>";
            }
        }

        /*Datum Filter*/
        if ($('#field-date input:checked + label', form).length > 0) {
            fieldDate += "<li>Datum: ";
            $('#field-date input:checked + label', form).each(function() {
                if ($(this).text() == "Zeitraum") {
                    dateFrom = $('input#date-from', form).val();
                    dateTill = $('input#date-till', form).val();
                    if (dateFrom.length > 0 && dateTill.length > 0) {
                        timeArea = $(this).text() + ": " + dateFrom + " - " + dateTill;
                        fieldDate += timeArea;
                    }
                }
                else {
                    fieldDate += $(this).text() + ", ";
                }
            });

            if ($('#field-date input:checked + label', form).text() == "Zeitraum") {
                if (fieldDate.length > 11) {
                    fieldDate = fieldDate + "</li>";
                }
            }
            else {
                fieldDate = fieldDate.substr(0, fieldDate.length - 2);
                fieldDate += "</li>";
            }

        }

        /*Ort & Umkreis Filter*/
        if ($('input#cityAndRadius-zip', form).val() != undefined) {
            cityAndRadiusZip = ($('input#cityAndRadius-zip', form).val());
            cityAndRadiusRadius = ($('input#cityAndRadius-radius', form).val());
            if (cityAndRadiusZip.length > 0 && cityAndRadiusZip != "Ort oder PLZ" && cityAndRadiusRadius != undefined) {
                cityAndRadiusArea += "<li>Ort & Umkreis: ";
                cityAndRadiusArea += cityAndRadiusZip + ", " + cityAndRadiusRadius + "km ";
                cityAndRadiusArea += "</li>";
            }
        }
        /*Kategorgie Filter*/
        if ($('#field-categorie input:checked + label', form).length > 0) {
            if ($('#field-categorie input:checked + label', form).length == ($('#field-categorie input', form).length - 1) || ($('#field-categorie input:checked + label', form).val() == "Alle")) {
                fieldCategorie += "<li>Kategorie: Alle </li>";
            }
            else {
                fieldCategorie += "<li>Kategorie: ";
                $('#field-categorie input:checked + label', form).each(function() {
                    fieldCategorie += $(this).text() + ", ";
                });
                fieldCategorie = fieldCategorie.substr(0, fieldCategorie.length - 2);
                fieldCategorie += "</li>";
            }
        }

        /*Zielgruppe Filter*/
        if ($('#field-targetgroup input:checked + label', form).length > 0) {
            if ($('#field-targetgroup input:checked + label', form).length == ($('#field-targetgroup input', form).length - 1)) {
                fieldCategorie += "<li>Zielgruppe: Alle </li>";
            }
            else {
                fieldTargetgroup += "<li>Zielgruppe: ";
                $('#field-targetgroup input:checked + label', form).each(function() {
                    fieldTargetgroup += $(this).text() + ", ";
                });
                fieldTargetgroup = fieldTargetgroup.substr(0, fieldTargetgroup.length - 2);
                fieldTargetgroup += "</li>";
            }
        }

        /*HTML dem Div anhängen*/
        searchValues.empty();
        if (search_term.length > 0 || fieldDate.length > 0 || cityAndRadiusArea.length > 0 || fieldCategorie.length > 0 || fieldTargetgroup.length > 0) {
            var searchValuesHtml = '<p><strong>Ihre Such-Einstellungen</strong></p><ul class="easyClear">' + search_term + fieldDate + cityAndRadiusArea + fieldCategorie + fieldTargetgroup + '</li></ul><p class="notepad"><a href="javascript:void(0)" class="clickme">Suche zur&uuml;cksetzen</a></p>'
            searchValues.append(searchValuesHtml);
        }
    };

    /*FORM RESET über input type="reset"*/
    /* $('.clickme').live('click', function() {
    $('.clickMeButton').trigger('click');
    $('.searchValues').empty();
    var formHref = $('.form-events form').attr('data-xml');
    updateHtml(formHref);
    $('.submit').trigger('click');
    });*/

    /* Events search*/
    $(function() {
        var sendTimeOut = null;

        var noBrowserCache = function(href) {
            href = href + '&ts=' + (new Date()).getTime();
            return href;
        };

        var sendForm = function(form, href) {


            clearTimeout(sendTimeOut);
            sendTimeOut = setTimeout(function() {
                ajaxSubmit(form, href);
            }, 200);
        };

        var lastRequest = 0;
        var ajaxSubmit = function(form, href) {
            updateHtml(form);
            var parent = $(form).parent();
            var results = $(".events-list-view", parent);
            var map = $("._bingmaps", parent);
            results.fadeTo('fast', 0.5);
            $('.loader').show();
            $('input[placeholder]', form).each(function() {
                if ($(this).val() == $(this).attr('placeholder')) {
                    $(this).val('');
                }
            });
            $.post(noBrowserCache(href), $(form).serialize() + '&tx_veranstaltungskalender_pi3%5Bsubmit%5D=submit', function(data) {
                var r = $('request', data).text();
                if (r > lastRequest) {
                    lastRequest = r;
                    var l = $('list', data), m = $('map', data), eL = $('length', data), me = $('memory', data), p;
                    //					console.debug($('length', data), $('memory', data));
                    if (l.length) {
                        updateResults($(l.text()), results);
                    }
                    if (m.length) {
                        p = $.parseJSON(m.text());
                        if (p.pins) {
                            updateMaps(map, p.pins);
                        }
                    }
                    if (eL.length) {
                        updateLength(eL.text());
                    }
                    if (me.length) {
                        updateMemory(me.text());
                    }
                } else {
                    results.fadeTo('fast', 1);
                    $('.loader').hide();
                }
                //updateResults($('div.form-events .results', data), results);
            }, 'xml');
            $('input[placeholder]', form).each(function() {
                if ($(this).val() == '') {
                    $(this).val($(this).attr('placeholder'));
                }
            });
        };

        var ajaxPaginator = function(form, href) {
            form.fadeTo('fast', 0.5);
            $.post(noBrowserCache(href), null, function(data) {
                var l = $('list', data);
                updateResults($(l.text()), form);
            });

        };
        var tabSelected = 0;
        var updateResults = function(results, toReplace) {
            if (toReplace != null) {
                $(toReplace).after(results);
                $(results).addClass('inv');
            }
            /*Facebook*/
            /*
            $('tbody tr', results).each(function() {
            var aHref = $('a:first', this).attr("href");

            //$('td:last', this).fbLike(baseHref + aHref, pp.fbLike);

            });
            */
            /*Paginator*/
            $('.paginator a', results).click(function() {
                ajaxPaginator(results, $(this).attr('data-xml'));
                return false;
            });

            if (toReplace != null) {
                $(toReplace).remove();
                $(results).removeClass('inv');
                $('.loader').hide();
            }


        };

        var updateLength = function(str) {
            $('.tx-veranstaltungskalender-pi3 .eventsLength').html(str);
        };

        var updateMemory = function(str) {
            $('.tx-veranstaltungskalender-pi3 .memory').html(str);
        };


        var updateMaps = function(map, pins) {

            if (tabSelected == 1) {
                var p, j;
                if ($('script', map).length) {
                    j = $.parseJSON($.trim($('script', map).html()));
                    $('script', map).remove();
                    p = (bingMapsPins.length) ? bingMapsPins : j.pins;
                    configBingMaps.pushPins = p;
                    map.bingmaps(configBingMaps);
                } else {
                    p = (pins.length) ? pins : bingMapsPins;
                    map.bingmaps('clearPushPins');
                    map.bingmaps('pushPins', { pushPins: p });
                }
                bingMapsPins = [];
            } else {
                bingMapsPins = pins;
            }
        };

        var checkToggle = function(cbs, d, last, summaryCheck) {
            if (summaryCheck == undefined || summaryCheck == null) {
                summaryCheck = false;
            }
            if (last == d) {
                if (d.checked) {
                    cbs.each(function() {
                        if (this != d) {
                            this.checked = false;
                            $(this).parent('p').fadeTo('fast', 0.5);
                        }
                    });
                } else {
                    cbs.each(function() {
                        if (this != d) {
                            $(this).parent('p').fadeTo('fast', 1);
                        }
                    });
                }
            } else {
                d.checked = false;
                var checkedCounter = 1;
                cbs.each(function() {
                    if (this != d) {
                        $(this).parent('p').fadeTo('fast', 1);
                        if (this.checked) checkedCounter++;
                    }
                });
                if (summaryCheck && checkedCounter == cbs.length) {
                    d.checked = true;
                    checkToggle(cbs, d, d, summaryCheck);
                }
            }

        };

        var formEvents = $('.form-events form');
        var bingMapsPins = [];
        if (formEvents.length) {
            var formHref = $('.form-events form').attr('data-xml');
            updateHtml(formEvents);

            $(":checkbox, :radio", formEvents).click(function() {
                sendForm(formEvents, formHref)
            });
            $("select", formEvents).change(function() {
                sendForm(formEvents, formHref)
            });
            $(":text", formEvents).blur(function() {
                sendForm(formEvents, formHref)
            });

            formEvents.submit(function() {
                ajaxSubmit(formEvents, formHref);
                return false;
            });
            var resultTaps = formEvents.siblings(".results");

            updateResults($('.events-list-view', resultTaps), null);


            var list = $('.tab', resultTaps);

            var navBar = '<ul class="navbar">';
            var idCounter = 1;
            list.each(function() {
                var i = 'result-tabs-' + (idCounter++) + Date.parse(new Date());
                this.id = i;
                var h = $('h3:first', this);
                h.addClass('inv');
                navBar += '<li><a href="#' + i + '">' + h.text() + '</a></li>';
            });
            navBar += '</ul>';
            $(list[0]).before(navBar);
            $(".tabs", resultTaps).tabs({
                selected: tabSelected,
                select: function(event, ui) {
                    tabSelected = ui.index;
                },
                show: function(event, ui) {
                    updateMaps($('._bingmaps', resultTaps), []);
                }

            });

            fields = $('#field-categorie, #field-targetgroup', formEvents);
            fields.each(function() {
                var defaultField = $('input:checkbox:first', this)[0];
                var checkboxes = $('input:checkbox', this);
                checkToggle(checkboxes, defaultField, defaultField, true);
                checkboxes.click(function() {
                    checkToggle(checkboxes, defaultField, this, true);
                });
            });
            fields = $('#field-date', formEvents);
            fields.append($('#ui-datepicker-div').wrap('<div class="datepicker-wrapper" />').parent());
            fields.each(function() {
                var defaultField = $('input#date-period', this)[0];
                var checkboxes = $('input:checkbox', this);
                checkToggle(checkboxes, defaultField, defaultField, false);
                checkboxes.click(function() {
                    checkToggle(checkboxes, defaultField, this, false);
                    var periodData = $('#date-period-data');
                    if (defaultField.checked) {
                        periodData.fadeTo('fast', 1);
                    } else {
                        periodData.fadeTo('fast', .5);
                    }
                });
            });

            fields = $('#field-cityAndRadius', formEvents);
            fields.each(function() {
                function refreshText(value) {
                    textValue.text('bis ' + value);
                }

                var radius = [];
                var select = $('select', this);
                var sliderLabel = '<ul>';
                $.each(select[0].options, function(i, o) {
                    if (i % 2 == 0) {
                        var c = (i == 0) ? 'first' : (i == 4) ? 'last' : '';

                        sliderLabel += '<li class="' + c + '"><span>' + o.text + '</span></li>';
                    }
                    radius.push({ text: o.text, value: o.value });
                });
                sliderLabel += '</ul>';
                sliderLabel = $(sliderLabel);
                var temp = { name: select.attr('name'), id: select.attr('id'), selected: select[0].selectedIndex };
                var hiddenSelect = $('<input type="hidden" id="' + temp.id + '" name="' + temp.name + '" />').val(radius[temp.selected].value);
                var textValue = $('<span class="value" />');
                select.replaceWith(hiddenSelect);
                $('.cityAndRadius-radius-block label', this).append(textValue);
                var slider = $("<div id='slider'></div>").insertAfter(hiddenSelect).slider({
                    min: 0,
                    max: radius.length - 1,
                    range: "min",
                    value: temp.selected,
                    change: function(event, ui) {
                        var v = radius[ui.value];
                        hiddenSelect.val(v.value);
                        refreshText(v.text);
                        sendForm(formEvents, formHref);
                    },
                    slide: function(event, ui) {
                        var v = radius[ui.value];
                        hiddenSelect.val(v.value);
                        refreshText(v.text);
                    }
                }).append(sliderLabel);
                refreshText(radius[temp.selected].text);

            });
        }
        $('.clickme').live('click', function(event) {
            $('.clickMeButton').trigger('click');
            $('.searchValues').empty();
            var formHref = $('.form-events form').attr('data-xml');
            updateHtml(formHref);
            $('.search-term-block .submit').trigger('click');

            return false;

        });
    });

    /*FORM RESET über input type="reset"*/

})(jQuery)

