/**
/**
 * central jQuery init block
 * @project weBSR
 * @notes alle CSS-Abhängigkeiten sind ggf. projektspezifisch anzupassen!
 * @see http://docs.jquery.com/Selectors
 */

/* Debugging: Time trakking: * /
var timeDelta = 0,
    dateStart = null,
    dateEnd = null;

var getTimeDeltaByDatesInMilliseconds = function (startDate, endDate) {
    return (new Date()).setTime(Math.abs(endDate - startDate));
}
/ * */

window.dummy = true;

jQuery.fn.toIndexedArrayIgnoringKeys = function (obj, extentionProperties) {
    var result = [];
    if (obj === undefined || obj === null) {
        return result;
    }
    if ($.isArray(obj)) {
        result = obj;
    }
    if (obj.toArray) {
        result = obj.toArray();
    }
    if (typeof(obj) === "object") {
        for (var key in obj) {
            var value = obj[key];
            if (
                typeof(value) === "object" &&
                typeof(value["key"]) === "undefined"
            ) {
                value["key"] = key;
                for (var extentionProperty in extentionProperties) {
                    if (
                        typeof(value[extentionProperty] === "undefined") // to not to override already existing keys
                    ) {
                        value[extentionProperty] = extentionProperties[extentionProperty];
                    }
                }
            }
            result.push(value);
        }
    }
    return result;
};
jQuery.fn.toAssocArray = function (obj, extentionProperties, overwriteExistingProperties) {
    var result = [];
    if ($.isArray(obj)) {
        result = obj;
    }
    if (obj.toArray) {
        result = obj.toArray();
    }
    //console.group("toAssocArray");
    if (typeof(obj) === "object") {
        for (var key in obj) {
            var value = obj[key];
            if (typeof(value) === "object") {
                for (var extentionProperty in extentionProperties) {
                    if (
                        overwriteExistingProperties ||
                        typeof(value[extentionProperty]) === "undefined" // to not to override already existing keys
                    ) {
                        value[extentionProperty] = extentionProperties[extentionProperty];
                    }
                }
            }
            result[key] = value;
            //console.log(key);
            //console.dir(obj[key]);
        }
    }
    //console.log(typeof(result));
    //console.dir(result);
    //console.groupEnd();
    return result;
};

var currentFancybox = '';

// cookie functions http://www.quirksmode.org/js/cookies.html
jQuery.fn.createCookie = function(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        expires = "; expires="+date.toGMTString();
    } else {
        expires = "";
    }
    document.cookie = name+"="+value+expires+"; path=/";
};

jQuery.fn.readCookie = function(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0; i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0) === ' ') {
            c = c.substring(1,c.length);
        }
        if (c.indexOf(nameEQ) === 0) {
                return c.substring(nameEQ.length,c.length);
        }
    }

    return null;
};

jQuery.fn.eraseCookie = function(name) {
    $(this).createCookie(name,"",-1);
};


$.fn.tagName = function() {
    return this.get(0).tagName.toLowerCase();
}

// Language definition for QuickSearch
var quickSearchText = {
    "de" : "Ihr Suchbegriff...",
    "en" : "Your search Term..."
};
// Language definition for DustSearch
var dustSearchText = {
    "de" : "Mein Abfall...",
    "en" : "My Rubbish..."
};
// Language definition for myDreck
var wasteTypeFormText = {
    "de" : "Wählen Sie Ihren Abfall ...",
    "en" : "Choose your waste ..."
};
// Language definition for DreckeckenSearch
var dreckeckenSearchText = {
    "de" : "Strasse...",
    "en" : "Street..."
};










/* ###############  WasteManagement:  ############### */

// defining the cunstom events:
/*
var debugJEventFiring = function () {
    if (typeof(console) !== "undefined" && typeof(console.group) === "function") {
        if (console && console.group) {
            console.group("event: " + arguments[0][0].type);
            console.log("arguments:")
            console.dir(arguments);
            console.groupEnd();
        } else {
            alert(arguments[0][0].type);
        }
    }
}

$(window).bind(
    "onRecyclingListItemCreate",
    function (evnt) {
        debugJEventFiring(arguments);
    }
);
$(window).bind(
    "onRowDataLoading",
    function (evnt) {
        debugJEventFiring(arguments);
    }
);
$(window).bind(
    "onRawDataLoaded",
    function (evnt) {
        debugJEventFiring(arguments);
    }
);
$(window).bind(
    "onSetApplicationReadySate",
    function (evnt) {
        debugJEventFiring(arguments);
    }
);
$(window).bind(
    "onWasteListChanged",
    function (evnt) {
        debugJEventFiring(arguments);
    }
);
*/


var bsr = bsr || {};

$.extend(
    true, // deeeeeep copy
    bsr,
    {
        help: {
            defaultHelpBoxOptions: {
                'scrolling'     : 'auto',
                'titleShow'     : false,
                'transitionIn'  : 'elastic',
                'transitionOut' : 'elastic'/*,
                'easingIn'      : 'easeOutBack',
                'easingOut'     : 'easeInBack'*/,
                'padding'       : 0,
                'margin'        : 60,
                'opacity'       : true,
                'overlayOpacity': 0.4,
                'overlayColor'  : '#000',
                'hideOnOverlayClick'  : true,
                'showCloseButton'     : true,
                'onStart'       : function () {
                    $("#fancybox-wrap").addClass('help');
                },
                'onComplete'    : function () {
                    $.fancybox.resize();
                },
                'onClosed'      : function () {
                    $("#fancybox-wrap").removeClass('help');
                }
            }
        },
        wasteManagement: {
            tools: {
                createRecyclingListItem: function (itemData) {

                    //$(window).triggerHandler("onRecyclingListItemCreate", [itemData]);

					//console.log(itemData);
					// ToDo: Hier für alle doppelten Einträge mit gleichen itemData[name]
					// Die collectionStations mergen
					//itemData["collectionStations"].push("RC-Hof Brunsbütteler Damm");


                    var listItem = $("<li>");
                    listItem.append(
                        $("<a>" + itemData.name + "</a>").attr("href", itemData.infoUris[0]).click(
                            function () {
                                return (function () {
                                    bsr.wasteManagement.tools.reyclingListItemClickHandler(itemData);
                                    return false;
                                });
                            }()
                        )
                    );
                    listItem.append(
                        $('<a title="Löschen" class="remove" href="#">Löschen</a>').click(
                            function () {
                                return (function () {
                                    var itemRepresentation = arguments[0].target;
                                    bsr.wasteManagement.tools.removeRecyclingListItem(itemRepresentation, itemData);
                                    return false;
                                });
                            }()
                        )
                    );
                    if (itemData.infoLevel === "warning") {
                        listItem.addClass("warning");
                    }
                    listItem.data("itemData", itemData);

                    $('.entry-list').animate( { scrollTop: 0 }, 'fast' );
                    $(".entry-list UL").prepend(listItem);
                    $('.entry-list').animate( { scrollTop: 0 }, 'fast' );
                    bsr.wasteManagement.tools.addToUserCookie(itemData);
                    bsr.wasteManagement.tools.setRecyclingListItemsBackground();
                    //$(window).triggerHandler("onRecyclingListItemCreated", [itemData, listItem]);
                    return listItem;
                },
                createTagCloudItem: function (tagCloudItem) {
                    // emergency stepout! ...
                    if (typeof(tagCloudItem.itemData) !== "object") {
                        return;
                    }

                    //$(window).triggerHandler("onTagCloudItemCreate", [tagCloudItem]);

                    var itemData = tagCloudItem.itemData;
                    var tag = $("<a>" + itemData.name + "</a>")
                        .attr("href", itemData.infoUris[0])
                        .attr("value", tagCloudItem.value);
                    tag.click(
                        function () {
                            var fancyBoxTagCloudItemOptions = (
                                function () {
                                    var myItem = itemData;
                                    return $.extend(
                                        bsr.wasteManagement.tools.defaultInformationBoxOptions,
                                        {
                                            'href': myItem.infoUris[0],
                                            'titleFormat': function () {
                                                var tabNav = (function () {
                                                    return fancyboxTabLinkTitleHandler(-1, myItem);
                                                })();
                                                return tabNav;
                                            },
                                            'onComplete': function () {
                                                var that = this;
                                                (function () {
                                                    $("#fancybox-inner div.InformationContainer").html($("#fancybox-inner div.InformationContainer").html().replace(/<h1>.*<\/h1>/gi, "<h1>" + myItem.name + "</h1>"));
                                                })();
                                                $("div.InformationContainer div.confirmAbortButtons button.abort").css("display", "block").click(
                                                    function () {
                                                        $.fancybox.close();
                                                    }
                                                );
                                                var newlyToAdd = !bsr.wasteManagement.tools.userCookieContains(myItem);
                                                if (!newlyToAdd) {
                                                    $("div.InformationContainer div.hintAlreadyAdded").show();
                                                }
                                                if (myItem.infoLevel !== "error" && newlyToAdd) {
                                                    $("div.InformationContainer div.confirmAbortButtons button.confirm").css("display", "block").click(
                                                        function () {
                                                            var listItem = bsr.wasteManagement.tools.createRecyclingListItem(myItem);
                                                            myItem.domRepresentation = listItem;
                                                            // a bit hard! overwriting the origin of this fancybox ... to set the disapearing effect targeting to the new list item... but working ;-)
                                                            that.orig = listItem;
                                                            bsr.wasteManagement.tools.animateNewRecyclingListItem(listItem);
                                                            $.fancybox.close();
                                                            $(window).triggerHandler("onWasteListChanged");
                                                        }
                                                    );
                                                }
                                                window.setTimeout(function () {$.fancybox.resize();}, 10);
                                            },
                                            'showCloseButton': true,
                                            'orig': tag // Set the appearing effect start point to the autocomplete field.
                                        }
                                    );
                                }()
                            );
                            $.fancybox(
                                fancyBoxTagCloudItemOptions
                            );
                            return false;
                        }
                    );
                    $("div.ContentCol DIV.tagcloud").append(tag);
                    $("div.ContentCol DIV.tagcloud").append(" ");
                    //$(window).triggerHandler("onTagCloudItemCreated", [tagCloudItem]);
                },
                removeRecyclingListItem: function (elm, item) {
                    $(elm).parent().remove();
                    bsr.wasteManagement.tools.deleteFromUserCookie(item);
                    bsr.wasteManagement.tools.setRecyclingListItemsBackground();
                    $(window).triggerHandler("onWasteListChanged");
                    return false;
                },
                reyclingListItemClickHandler : function (item) {
                    $.fancybox(
                        (
                            function () {
                                return $.extend(
                                    bsr.wasteManagement.tools.defaultInformationBoxOptions,
                                    {
                                        'href': item.infoUris[0],
                                        'titleFormat'   : function () {
                                            var tabNav = (function () {
                                                return fancyboxTabLinkTitleHandler(-1, item);
                                            })();
                                            return tabNav;
                                        },
                                        'onComplete': function () {
                                            if (window.dummy) {
                                                (function () {
                                                    $("#fancybox-inner div.InformationContainer").html($("#fancybox-inner div.InformationContainer").html().replace(/<h1>.*<\/h1>/gi, "<h1>" + item.name + "</h1>"));
                                                })();
                                            }
                                            $("div.InformationContainer div.confirmAbortButtons").hide();
                                            $.fancybox.resize();
                                        },
                                        'onClosed': null,
                                        'showCloseButton': true,
                                        'orig': item.domRepresentation
                                    }
                                );
                            }()
                        )
                    );
                },
                setRecyclingListItemsBackground: function () {
                    $(".entry-list UL").children().each(
                        function (idx, elm) {
                            $(elm).removeClass("odd even").addClass(
                                idx % 2 === 0 ? "odd" : "even"
                            );
                        }
                    );
                },
                animateNewRecyclingListItem: function (listItem) {
                    listItem
                        .css("background-color", "#7f7f7f")
                        .effect(
                            "pulsate",
                            { times: 1 },
                            550,
                            function () {
                                $(this).css("background-color", "");
                            }
                        );
                },
                loadRawData: function (options) {

                    $(window).trigger("onRawDataLoading");

                    $.ajax(
                        {
                            type    : "GET",
                            cache   : false,
                            url     : bsr.wasteManagement.config.dataUris["waste-types"],
                            dataType: 'text',
                            success: function(data) {
                                //try {
                                    var loadedData = eval('{' + data + '}');
									bsr.wasteManagement.rawData.wasteTypes = loadedData.wasteTypes;

									bsr.wasteManagement.rawData.collectionStations = loadedData.collectionStations;
                                    bsr.wasteManagement.rawData.orangeBoxStations = loadedData.orangeBoxStations;

                                    /* */
                                    for (group in bsr.wasteManagement.rawData.wasteTypes) {
                                        if (bsr.wasteManagement.rawData.wasteTypes[group].synonyms !== undefined) {
											bsr.wasteManagement.data.autoCompleterData = $.merge(
                                                bsr.wasteManagement.data.autoCompleterData,
                                                $.fn.toIndexedArrayIgnoringKeys(
                                                    bsr.wasteManagement.rawData.wasteTypes[group].synonyms,
                                                    {
                                                        "group": group,
                                                        "collectionStations": bsr.wasteManagement.tools.getCollectionStationsByWastetypeGroup(group),
														"orangeBoxStations": bsr.wasteManagement.tools.getOrangeBoxStationsByWastetypeGroup(group)
                                                    }
                                                )
                                            );
                                        }
                                    }
									//console.dir(bsr.wasteManagement.data.autoCompleterData);


									var autocomplete = [];
									var knownSynon = [];
									var doubleEntries = [];

									for(autocomplete in bsr.wasteManagement.data.autoCompleterData){
									var synName = bsr.wasteManagement.data.autoCompleterData[autocomplete].name.toString();
									var synGroup = bsr.wasteManagement.data.autoCompleterData[autocomplete].group.toString();
										if($.inArray(synName, knownSynon) == -1){
											knownSynon.push(synName);
										}else{
											doubleEntries.push(autocomplete);
										}
									}
									// Füge die Orangebox Stations nur bei den Synonymen hinzu die auf in der Orangebox enthalten sind!
									var allOrangeSynonyms = [];

									for(autocomplete in bsr.wasteManagement.data.autoCompleterData){
									var synGroup = bsr.wasteManagement.data.autoCompleterData[autocomplete].group.toString();
									var synonyms = bsr.wasteManagement.data.autoCompleterData[autocomplete].name;
										if(synGroup == "Wertstoffe"){
											allOrangeSynonyms.push(synonyms);
										}
									}


									//Die Collectionstations bei den Orangecollectionsstations adden:
									var emptyStations = [];
									var oboxStations = [];
									for(autocomplete in bsr.wasteManagement.data.autoCompleterData){
										var oBoxStations = [];
										for (cStations in bsr.wasteManagement.data.autoCompleterData[autocomplete].collectionStations) {
											oBoxStations.push(bsr.wasteManagement.data.autoCompleterData[autocomplete].collectionStations[cStations]);
										}
										if(oBoxStations.length > 0){
											bsr.wasteManagement.data.autoCompleterData[autocomplete].orangeBoxStations = oBoxStations;
											if($.inArray(bsr.wasteManagement.data.autoCompleterData[autocomplete].name, allOrangeSynonyms) != -1){
											var arrName = bsr.wasteManagement.data.autoCompleterData[autocomplete].name;
												oboxStations[arrName] = oBoxStations;
												//oboxStations[arrName]["name"] = arrName;
												//oboxStations[arrName]["Stat"] = oBoxStations;
											}
										}else{
											if(bsr.wasteManagement.data.autoCompleterData[autocomplete].group == "Wertstoffe"){
												emptyStations.push(bsr.wasteManagement.data.autoCompleterData[autocomplete].name);
											}
										}
									}


									//console.log(emptyStations);
									//console.dir(oboxStations);

									for(autocomplete in bsr.wasteManagement.data.autoCompleterData){
									var synName = bsr.wasteManagement.data.autoCompleterData[autocomplete].name;
										if ($.inArray(synName, emptyStations) != -1) {
											bsr.wasteManagement.data.autoCompleterData[autocomplete].orangeBoxStations = oboxStations[synName];
										}
									}


									// Alle Orange Stations hinzufügen
									for(autocomplete in bsr.wasteManagement.data.autoCompleterData){
									var cBoxStations = [];
									var synName = bsr.wasteManagement.data.autoCompleterData[autocomplete].name.toString();
									var synGroup = bsr.wasteManagement.data.autoCompleterData[autocomplete].group.toString();
									//console.group(synName);
									//console.log(bsr.wasteManagement.data.autoCompleterData[autocomplete]);
										if($.inArray(synName, allOrangeSynonyms) != -1 || synGroup == "Wertstoffe (Orange Box)"){
											for (orangeStations in bsr.wasteManagement.rawData.orangeBoxStations) {
												if($.inArray(bsr.wasteManagement.data.autoCompleterData[autocomplete].name, allOrangeSynonyms) != -1
													|| synGroup == "Wertstoffe (Orange Box)"){

													//console.log(orangeStations);
													cBoxStations.push(orangeStations);
													for (cStations in bsr.wasteManagement.data.autoCompleterData[autocomplete].collectionStations) {
														oBoxStations.push(bsr.wasteManagement.data.autoCompleterData[autocomplete].collectionStations[cStations]);
													}
												}
											}
											//console.log(bsr.wasteManagement.data.autoCompleterData[autocomplete].name +"("+autocomplete+")");
										}
										bsr.wasteManagement.data.autoCompleterData[autocomplete].collectionStations = cBoxStations;
									//console.groupEnd();
									}

									for(var i=0; i < doubleEntries.length; i++) {
										delete bsr.wasteManagement.data.autoCompleterData[parseInt(doubleEntries[i])];
									}

									var tmpResultCompleter = [];
									var jCounter = 0;
									for(var i=0; i < bsr.wasteManagement.data.autoCompleterData.length; i++) {
										if(bsr.wasteManagement.data.autoCompleterData[i] != undefined){
											tmpResultCompleter[jCounter] = bsr.wasteManagement.data.autoCompleterData[i];
											jCounter++;
										}
									}
									bsr.wasteManagement.data.autoCompleterData = tmpResultCompleter;

                                    bsr.wasteManagement.data.autoCompleterData.sort(
                                        function (a, b) {
                                            var compA = ("" + a.name).toLowerCase();
                                            var compB = ("" + b.name).toLowerCase();
                                            return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;

                                            // the following is the usage according to the specs, but don't work in IE!
                                            //return b.name < a.name;
                                        }
                                    );
									//console.dir(bsr.wasteManagement.rawData.wasteTypes);
									//console.dir(bsr.wasteManagement.data.autoCompleterData[299]);
                                    /* */
                                    //bsr.wasteManagement.tools.setReadyState({message: "Success: Data loaded and parsed!"});

                                    $(window).triggerHandler("onRawDataLoaded");

                                //} catch(exp) {
                                  //   $(window).triggerHandler("onWastemanagementError", ["waste-management-data-loading-failed", $(".search-autocompleter").parent().parent()]);
                                //}
								//console.dir(bsr.wasteManagement.rawData.wasteTypes);

                            },
                            error: function (xmlRequest, errorType, exp) {
                                $(window).triggerHandler("onWastemanagementError", ["waste-management-data-loading-failed", $(".search-autocompleter").parent().parent()]);
                            }
                        }
                    );

                },
                getCollectionStationsByWastetypeGroup: function (group) {
                    var collectionStations = [];

                    //console.group("call of getCollectionStationsByWastetypeGroup(" + group + ")");
                    for (collectionStationId in bsr.wasteManagement.rawData.collectionStations) {
                        if ($.inArray(group, bsr.wasteManagement.rawData.collectionStations[collectionStationId].groups) != -1) {
                            collectionStations.push(collectionStationId);
                            //console.log("Added");
                        }
                        //console.log("ping");
					}

                    return collectionStations;
                },
				getOrangeBoxStationsByWastetypeGroup: function (group) {
                    var orangeBoxStations = [];

                    for (collectionStationId in bsr.wasteManagement.rawData.orangeBoxStations) {
                        if ($.inArray(group, bsr.wasteManagement.rawData.orangeBoxStations[collectionStationId].groups) != -1) {
                            orangeBoxStations.push(collectionStationId);
                            //console.log("Added");
                        }
                        //console.log("ping");
                    }
                    return orangeBoxStations;
                },
                setReadyState: function (state) {
                    //self.status = state.message;
                },
                initAutoCompleter: function () {
                    $("#waste-management-types.my-abfall").autocomplete(
                        bsr.wasteManagement.data.autoCompleterData,
                        {
                            formatItem: function(item) {
                                return item.name;
                            },
                            /* * /matchContains: true,/ * */
                            highlight: function(value, term) { // per default autocompleter highlightes _all_ matches ... we want just the first match !!!
                                return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/i, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "i"), "<strong>$1</strong>");
                            },
                            max: 30,
                            scrollHeight: 300,
                            width: 315/* * /,
                            autoFill: true/ * * // * * /,
                            mustMatch: true/ * */
                        }
                    ).result(
                        function (event, item) {

                            var inputField = $(this);
                            if (!!item) {

                                $(this).val($(this).data("previousValue"));
                                this.blur();
                                //var inputField = $(this);
                                var fancyBoxAutoCompleterOptions = (
                                    function () {
                                        var myItem = item;
                                        return $.extend(
                                            bsr.wasteManagement.tools.defaultInformationBoxOptions,
                                            {
                                                'href': myItem.infoUris[0],
                                                'titleFormat': function () {
                                                    var tabNav = (function () {
                                                        return fancyboxTabLinkTitleHandler(-1, myItem);
                                                    })();
                                                    return tabNav;
                                                },
                                                'onComplete': function () {
                                                    var that = this;
                                                    if (window.dummy) {
                                                        (function () {
                                                            $("#fancybox-inner div.InformationContainer").html($("#fancybox-inner div.InformationContainer").html().replace(/<h1>.*<\/h1>/gi, "<h1>" + myItem.name + "</h1>"));
                                                        })();
                                                    }
                                                    $("div.InformationContainer div.confirmAbortButtons button.abort").css("display", "block").click(
                                                        function () {
                                                            that.orig.focus().keydown();
                                                            $.fancybox.close();
                                                        }
                                                    );
                                                    var newlyToAdd = !bsr.wasteManagement.tools.userCookieContains(myItem);
                                                    if (!newlyToAdd) {
                                                        $("div.InformationContainer div.hintAlreadyAdded").show();
                                                    }
                                                    if (myItem.infoLevel !== "error" && newlyToAdd) {
                                                        $("div.InformationContainer div.confirmAbortButtons button.confirm").css("display", "block").click(
                                                            function () {
                                                                var listItem = bsr.wasteManagement.tools.createRecyclingListItem(myItem);
                                                                myItem.domRepresentation = listItem;
                                                                // a bit hard! overwriting the origin of this fancybox ... to set the disapearing effect targeting to the new list item... but working ;-)
                                                                that.orig.val("").focus();
                                                                that.orig = listItem;
                                                                bsr.wasteManagement.tools.animateNewRecyclingListItem(listItem);
                                                                $(window).triggerHandler("onWasteListChanged");
                                                                $.fancybox.close();
                                                            }
                                                        );
                                                    }
                                                    window.setTimeout(function () {$.fancybox.resize();}, 100);
                                                },
                                                'onClosed': function () {
                                                    var that = this;
                                                    if (that.orig === inputField) {
                                                        that.orig.focus().keydown();
                                                    }
                                                },
                                                'showCloseButton': true,
                                                'orig': inputField // Set the appearing effect start point to the autocomplete field.
                                            }
                                        );
                                    }()
                                );
                                $.fancybox(
                                    fancyBoxAutoCompleterOptions
                                );

                            } else {
                                //var inputField = $(this);
                                $.ajax(
                                    {
                                        type    : "GET",
                                        cache   : false,
                                        url     : bsr.wasteManagement.config.errors["autocompleter-no-valid-item-report"],
                                        data    : {searchValue: inputField.val()}
                                    }
                                );
                                this.blur();
                                $(window).triggerHandler("onWastemanagementError", ["autocompleter-no-valid-item", inputField]);
                            }
                        }
                    ).keyup(
                        function (evt) {
                            if (evt.keyCode === 13) { // when enter was pressed to submit the search term
                                $(this).search();
                            }
                        }
                    );
                },
                loadTagCloudData: function () {
                    $.ajax(
                        {
                            type    : "GET",
                            cache   : false,
                            url     : bsr.wasteManagement.config.dataUris["tagcloud-data"],
                            dataType: 'text',
                            success: function(data) {
                                try {
                                    var loadedData = eval('{' + data + '}');
                                    bsr.wasteManagement.rawData.tagCloudData = loadedData.tagCloudData;

                                    /* */
                                    for (var tag in bsr.wasteManagement.rawData.tagCloudData) {


                                        bsr.wasteManagement.data.tagCloudData[tag] = bsr.wasteManagement.rawData.tagCloudData[tag];
                                        bsr.wasteManagement.data.tagCloudData[tag].itemData =
                                            $.grep(
                                                bsr.wasteManagement.data.autoCompleterData,
                                                function (elm, idx) {
                                                    return elm.key === bsr.wasteManagement.rawData.tagCloudData[tag].id
                                                }
                                            )[0];
                                    }
                                    /* */
                                    //bsr.wasteManagement.tools.setReadyState({message: "Success: Tag cloud data loaded and parsed!"});
                                    bsr.wasteManagement.tools.initTagCloud();
                                } catch (exp) {
                                    /* ignore silently, just cleaning the output container */
                                    $("DIV.ContentCol DIV.tagcloud").html("");
                                }
                            },
                            error: function (xmlRequest, errorType, exp) {
                                $("DIV.ContentCol DIV.tagcloud").html("");
                                $("DIV.ContentCol DIV.tagcloud-wrapper P").html("");
                            }
                        }
                    );
                },
                initTagCloud: function () {
                    $("DIV.ContentCol DIV.tagcloud").html("");
                    $(bsr.wasteManagement.data.tagCloudData).each(
                        function (idx, elm) {
                            bsr.wasteManagement.tools.createTagCloudItem(elm);
                        }
                    );
                    $("DIV.ContentCol DIV.tagcloud").tagcloud(
                        {
                            //type: "sphere", power: .3, // power only works with 'sphere'
                            //type: "cloud", seed: 23, // seed only works with 'cloud'!
                            type: "list",
                            sizemin: 11,
                            sizemax: 20,
                            colormin: "969696",
                            colormax: "666666",
                            height: 120
                        }
                    );
                },
                loadUserCookieData: function () {
                    var userCookie = $.fn.readCookie("bsr-wasteList");
                    if (userCookie !== null) {
                        var ids = userCookie.split(",");
                        for (var id in ids) {
                            var item = $.grep(
                                bsr.wasteManagement.data.autoCompleterData,
                                function (elm, idx) {
                                    return elm.key === ids[id];
                                }
                            )[0];
                            if (item) {
                                item.domRepresentation = bsr.wasteManagement.tools.createRecyclingListItem(item);
                            }
                        }
                    } else { // create an empty cookie ...
                        $.fn.createCookie(
                            "bsr-wasteList",
                            "",
                            356*30
                        );
                    }
                    $(window).triggerHandler("onWasteListChanged");
                },
                deleteFromUserCookie: function (item) {
                    var userCookie = $.fn.readCookie("bsr-wasteList");
                    var newUserCookie = userCookie.
                                            replace(item.key, ""). // delete wasteTypeID
                                            replace(",,", ","). // get rid of double kommas
                                            replace(/,$/, ""). // delete useless komma at start
                                            replace(/^,/, ""); // delete useless kommy at end
                    $.fn.createCookie(
                        "bsr-wasteList",
                        newUserCookie,
                        356*30
                    );
                },
                userCookieContains: function (item) {
                    var userCookie = $.fn.readCookie("bsr-wasteList") || "";
                    return (userCookie.indexOf(item.key) !== -1);
                },
                addToUserCookie: function (item) {
                    var userCookie = $.fn.readCookie("bsr-wasteList") || "";
                    if (userCookie.indexOf(item.key) === -1) { // just if item isn' already saved in the cookie ...
                        var newUserCookie = userCookie + (userCookie !== "" ? "," + item.key : item.key);
                        $.fn.createCookie(
                            "bsr-wasteList",
                            newUserCookie,
                            356*30
                        );
                        return true;
                    }
                    return false;
                },
                wasteListChangedHandler: function () {

					bsr.wasteManagement.googleMapsTools.setAllStationsMapMarkers(
                        bsr.wasteManagement.tools.getApplicableCollectionsStations()
                    );

					//orangboxjs
					bsr.wasteManagement.googleMapsTools.setOrangeBoxStationsMapMarkers(
						bsr.wasteManagement.tools.getApplicableOrangeBoxStations()
					);

                    if (!!bsr.wasteManagement.googleMapsTools.bsrUserMarker) {
                        bsr.wasteManagement.googleMapsTools.setOptimizedCenterAndZoom();
                    }
                },
                getApplicableCollectionsStations: function () {
                    var currentCollectionStations = $.fn.toAssocArray(bsr.wasteManagement.rawData.collectionStations, {applicable: true}, true);

                    $(".entry-list UL LI").each(
                        function () {
                            for (var collectionStationId in currentCollectionStations) {
                                if (
                                    $.inArray(collectionStationId, $(this).data("itemData").orangeBoxStations) !== -1 &&
                                    currentCollectionStations[collectionStationId].applicable !== false
                                ) {
                                    currentCollectionStations[collectionStationId].applicable = true;
                                } else {
                                    currentCollectionStations[collectionStationId].applicable = false;
                                }
                            }
                        }
                    );


                    return currentCollectionStations;
                },
				getApplicableOrangeBoxStations: function () {

                    var currentOrangeBoxStations = $.fn.toAssocArray(bsr.wasteManagement.rawData.orangeBoxStations, {applicable: true}, true);

                    $(".entry-list UL LI").each(
                        function () {
                            for (var collectionStationId in currentOrangeBoxStations) {
                                if (
                                    $.inArray(collectionStationId, $(this).data("itemData").collectionStations) !== -1 &&
                                    currentOrangeBoxStations[collectionStationId].applicable !== false
                                ) {
                                    currentOrangeBoxStations[collectionStationId].applicable = true;
                                } else {
                                    currentOrangeBoxStations[collectionStationId].applicable = false;
                                }
                            }
                        }
                    );

                    return currentOrangeBoxStations;
                },
				addOrangeBoxLocations: function(){

				var wasteStations = [];
				var collectionWaste = [];
				var group = [];
				var singleSynonym = [];
				var OrangeStations = [];
				var searchSynName;
				var searchGroups = [];

					for (group in bsr.wasteManagement.rawData.wasteTypes) {
						if (bsr.wasteManagement.rawData.wasteTypes[group].synonyms !== undefined) {
							for( singleSynonym in bsr.wasteManagement.rawData.wasteTypes[group].synonyms){
								searchSynName = bsr.wasteManagement.rawData.wasteTypes[group].synonyms[singleSynonym].name;
								//console.log(searchSynName);
							}
						}
					}

					for (group in bsr.wasteManagement.rawData.wasteTypes) {
						if (bsr.wasteManagement.rawData.wasteTypes[group].synonyms !== undefined) {
							for( singleSynonym in bsr.wasteManagement.rawData.wasteTypes[group].synonyms){
								if(searchSynName == bsr.wasteManagement.rawData.wasteTypes[group].synonyms[singleSynonym].name){
									searchGroups.push(group);
									//console.log(searchGroups);
								}
							}
						}
					}

				//bsr.wasteManagement.tools.getOrangeBoxStations("DVDs", "CDs");
				},
				getOrangeBoxStations: function(){

					//return Stations;
				},
                showError: function (evnt, errorType, originElement) {
                    $.fancybox(
                        (
                            function () {
                                return $.extend(
                                    bsr.wasteManagement.tools.defaultInformationBoxOptions,
                                    {
                                        'titleFormat': null,
                                        'href': bsr.wasteManagement.config.errors[errorType],
                                        'onComplete': function () {
                                            $("div.InformationContainer div.confirmAbortButtons button.abort").hide();
                                            $.fancybox.resize();
                                        },
                                        'onClosed': function () {
                                            $("#fancybox-wrap").removeClass('help');
                                            $(this.orig).focus().select();
                                        },
                                        'showCloseButton': true,
                                        'hideOnOverlayClick': true,
                                        'orig': originElement
                                    }
                                );
                            }()
                        )
                    );
                }
            },
            googleMapsTools: {
                defaultMarkerOptions: {
                    stationEnabled: null,
                    stationDisabled: null,
					orangeBox: null,
					orangeBoxDisabled: null,
					//orangeBoxSmall: null,
					orangeBoxBig: null,
					orangeBoxBigDisabled: null,
                    userPosition: null
                },
                initializeDefaultMarkers: function () {
                    var bsrIconEnabled = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_enabled);
                    bsrIconEnabled.iconSize = new GSize(35, 51);
                    bsrIconEnabled.shadow = "";
                    bsrIconEnabled.shadowSize = new GSize(0, 0);
                    bsrIconEnabled.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerEnabledOptions = {icon: bsrIconEnabled};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.stationEnabled = bsrMarkerEnabledOptions;

                    var bsrIconDisabled = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_disabled);
                    bsrIconDisabled.iconSize = new GSize(35, 51);
                    bsrIconDisabled.shadow = "";
                    bsrIconDisabled.shadowSize = new GSize(0, 0);
                    bsrIconDisabled.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerDisabledOptions = {icon: bsrIconDisabled};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.stationDisabled = bsrMarkerDisabledOptions;

                    var bsrIconUser = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.user_location_marker);
                    bsrIconUser.iconSize = new GSize(34, 28);
                    bsrIconUser.shadow = "";
                    bsrIconUser.shadowSize = new GSize(0, 0);
                    bsrIconUser.imageMap = [0, 0, 0, 0];
                    var bsrMarkerUserOptions = {icon: bsrIconUser};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.userPosition = bsrMarkerUserOptions;

					// die neue Orange Box
					var bsrIconOrangeBox = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_orangebox);
                    bsrIconOrangeBox.iconSize = new GSize(16, 16);
                    bsrIconOrangeBox.shadow = "";
                    bsrIconOrangeBox.shadowSize = new GSize(0, 0);
                    bsrIconOrangeBox.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerOrangeBox = {icon: bsrIconOrangeBox};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBox = bsrMarkerOrangeBox;

					var bsrIconOrangeBoxDisabled = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_orangebox_disabled);
                    bsrIconOrangeBoxDisabled.iconSize = new GSize(16, 16);
                    bsrIconOrangeBoxDisabled.shadow = "";
                    bsrIconOrangeBoxDisabled.shadowSize = new GSize(0, 0);
                    bsrIconOrangeBoxDisabled.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerOrangeBoxDisabled = {icon: bsrIconOrangeBoxDisabled};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxDisabled = bsrMarkerOrangeBoxDisabled;

					// die neue Orange Box Startzoom Bild
					/*
					var bsrIconOrangeBoxSmall = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_orangebox);
					bsrIconOrangeBoxSmall.iconSize = new GSize(16, 16);
                    bsrIconOrangeBoxSmall.shadow = "";
                    bsrIconOrangeBoxSmall.shadowSize = new GSize(0, 0);
                    bsrIconOrangeBoxSmall.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerOrangeBoxSmall = {icon: bsrIconOrangeBoxSmall};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxSmall = bsrMarkerOrangeBoxSmall;
					*/

					// die neue Orange Box (Big Image)
					var bsrIconOrangeBoxBig = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_orangeboxbig);
                    bsrIconOrangeBoxBig.iconSize = new GSize(35, 51);
                    bsrIconOrangeBoxBig.shadow = "";
                    bsrIconOrangeBoxBig.shadowSize = new GSize(0, 0);
                    bsrIconOrangeBoxBig.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerOrangeBoxBig = {icon: bsrIconOrangeBoxBig};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBig = bsrMarkerOrangeBoxBig;

					var bsrIconOrangeBoxBigDisabled = new GIcon(G_DEFAULT_ICON, bsr.wasteManagement.config.imgUris.gmarker_orangeboxbig_disabled);
                    bsrIconOrangeBoxBigDisabled.iconSize = new GSize(35, 51);
                    bsrIconOrangeBoxBigDisabled.shadow = "";
                    bsrIconOrangeBoxBigDisabled.shadowSize = new GSize(0, 0);
                    bsrIconOrangeBoxBigDisabled.imageMap = [0, 0, 0, 31, 31, 31, 31, 0];
                    var bsrMarkerOrangeBoxBigDisabled = {icon: bsrIconOrangeBoxBigDisabled};

                    bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBigDisabled = bsrMarkerOrangeBoxBigDisabled;


                },
                initializeSingleStationMap: function () {
                    domElement = $(".google-maps")[0];
                    bsr.wasteManagement.googleMapsTools.bsrMap = new google.maps.Map2(domElement);
                    //bsrMap.addControl(new GSmallMapControl());
                    bsr.wasteManagement.googleMapsTools.bsrMap.addControl(new GSmallZoomControl());
                    bsr.wasteManagement.googleMapsTools.bsrMap.setMapType(G_NORMAL_MAP);
                    //bsr.wasteManagement.googleMapsTools.bsrMap.disableDragging();
                    var stationPosition = eval("(" + $(domElement).attr("rel") + ")");
                    bsr.wasteManagement.googleMapsTools.bsrMap.setCenter(new google.maps.LatLng(stationPosition.lat, stationPosition.lng), 14);

                    var bsrMarker = new GMarker(
                        new GLatLng(stationPosition.lat, stationPosition.lng),
                        $.extend(
                            {},
                            bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.stationEnabled,
                            {clickable: false}
                        )
                    );
                    bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(bsrMarker);

                },
                initializeAllStationsMap: function () {
                    domElement = $(".google-maps")[0];
                    bsr.wasteManagement.googleMapsTools.bsrMap = new google.maps.Map2(domElement);
                    //bsr.wasteManagement.googleMapsTools.bsrMap.addControl(new GSmallMapControl());
                    bsr.wasteManagement.googleMapsTools.bsrMap.addControl(new GLargeMapControl());
                    //bsr.wasteManagement.googleMapsTools.bsrMap.addControl(new GSmallZoomControl());
                    /**
                     * Kartenmaßstabsanzeige in Meilen und Kilometern
                     * bsr.wasteManagement.googleMapsTools.bsrMap.addControl(new GScaleControl());
                     */
                    bsr.wasteManagement.googleMapsTools.bsrMap.setMapType(G_NORMAL_MAP);
                    //bsr.wasteManagement.googleMapsTools.bsrMap.enableContinuousZoom();
                    //bsr.wasteManagement.googleMapsTools.bsrMap.enableScrollWheelZoom();

                    GEvent.addListener(
                        bsr.wasteManagement.googleMapsTools.bsrMap,
                        "click",
                        function (overlay, latLng, overlayLatLng) {
                            if (
                                overlay !== null &&
                                typeof(overlay.getTitle) === "function"
                            ) {
                                var stationId = overlay.getTitle();
                                //alert(stationId);
                                if (stationId !== undefined) {
                                    var station = bsr.wasteManagement.rawData.collectionStations[stationId];
                                    if (station !== undefined) {
                                        $.ajax(
                                            {
                                                url: station.infoUri,
                                                success: function (data, httpStatus, xhr) {
                                                    $(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content").html(data);
                                                    overlay.openInfoWindow(
                                                        $(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content").clone()[0]
                                                    );
                                                    $(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content").html("Lade ...");
                                                }
                                            }
                                        );
                                    } else {
                                        if (latLng !== undefined) {
                                            //alert(latLng);      // TODO:
                                            //console.dir(latLng);
                                        } else {
                                            //console.dir(overlay.getLatLng()); // TODO:
                                        }
                                    }
                                } else {
                                    //console.dir(latLng); // TODO:
                                }
								/* orangboxjs */

								if (stationId !== undefined) {
                                    var station = bsr.wasteManagement.rawData.orangeBoxStations[stationId];
                                    if (station !== undefined) {
                                        $.ajax(
                                            {
                                                url: station.infoUri,
                                                success: function (data, httpStatus, xhr) {
                                                    $(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content").html(data);
													$(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content p").text(stationId.substring(11,stationId.length));
                                                    overlay.openInfoWindow(
                                                        $(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content").clone()[0]
                                                    );
                                                    $(".google-maps-infowindow-tmp DIV.google-maps-infowindow-content").html("Lade ...");
                                                }
                                            }
                                        );
                                    } else {
                                        if (latLng !== undefined) {
                                            //alert(latLng);      // TODO:
                                            //console.dir(latLng);
                                        } else {
                                            //console.dir(overlay.getLatLng()); // TODO:
                                        }
                                    }
                                } else {
                                    //console.dir(latLng); // TODO:
                                }

                            }
                        }
                    );
					// nur auf den Recyling Höfen die Orange Boxes anzeigen
                    //if($(".google-maps-container.collection-stations").size() > 0){
                    GEvent.addListener(
                        bsr.wasteManagement.googleMapsTools.bsrMap,
                        "zoomend",
                        function (oldLevel, newLevel) {
							//console.log("ZOOMED: oldLevel: "+ oldLevel +" newLevel: "+newLevel);
							if(newLevel <= 11 && oldLevel != undefined){
								bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();
								bsr.wasteManagement.googleMapsTools.setAllStationsMapMarkers(
									bsr.wasteManagement.tools.getApplicableCollectionsStations()
								);
								//orangboxjs
								bsr.wasteManagement.googleMapsTools.setOrangeBoxStationsMapMarkers(
									bsr.wasteManagement.tools.getApplicableOrangeBoxStations()
								);
							}else if(newLevel == 12){
								bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();
								bsr.wasteManagement.googleMapsTools.setAllStationsMapMarkers(
									bsr.wasteManagement.tools.getApplicableCollectionsStations()
								);

								//orangboxjs
								bsr.wasteManagement.googleMapsTools.setOrangeBoxStationsMapMarkers(
									bsr.wasteManagement.tools.getApplicableOrangeBoxStations()
								);
							} else if(newLevel >= 12){

								bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();
								bsr.wasteManagement.googleMapsTools.setAllStationsMapMarkers(
									bsr.wasteManagement.tools.getApplicableCollectionsStations()
								);

								// orangboxjs Die großen Marker!
								bsr.wasteManagement.googleMapsTools.setOrangeBoxStationsMapBigMarkers(
									bsr.wasteManagement.tools.getApplicableOrangeBoxStations()
								);
							}
						}
					);
					//}
                    /**
                     * Berlin Centre - Alexanderplatz: Fernsehturm:
                     * Panoramastraße 1
                     * 10178 Berlin-Mitte
                     *     lat: 52.52086,
                     *     lng: 13.4093
                     */
                    bsr.wasteManagement.googleMapsTools.bsrMap.setCenter(new google.maps.LatLng(52.52086, 13.4093), 11);
                    bsr.wasteManagement.googleMapsTools.geocoder = new GClientGeocoder();
                    bsr.wasteManagement.googleMapsTools.geocoder.setBaseCountryCode('DE');

                    bsr.wasteManagement.googleMapsTools.createSearchControlClass();
                    var searchControlInstance = new bsr.wasteManagement.googleMapsTools.searchControl();
                    bsr.wasteManagement.googleMapsTools.bsrMap.addControl(searchControlInstance);

                },
                createSearchControlClass: function () {

                    bsr.wasteManagement.googleMapsTools.searchControl = function () {};
                    bsr.wasteManagement.googleMapsTools.searchControl.prototype = new GControl(false, true);
                    bsr.wasteManagement.googleMapsTools.searchControl.prototype.initialize = function (map) {
                        var searchControlElement = $("#google-maps-address-search-wrapper").css("display", "")[0];
                        map.getContainer().appendChild(searchControlElement);
                        return searchControlElement;
                    };
                    bsr.wasteManagement.googleMapsTools.searchControl.prototype.getDefaultPosition = function () {
                        return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(15, 14));
                    };
                },
                setOrangeBoxStationsMapMarkers: function (stations) {

                    //bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();

					for (var stationId in stations) {

                        var station = stations[stationId];
                        if (station.geoCoords !== undefined) {
                            var bsrOrangeBoxMarkerOptions = bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBox;

							var bsrOrangeBoxMarkerOptions = station.applicable ?
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBox :
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxDisabled;

                            var bsrOrangeBoxMarker = new GMarker(
                                new GLatLng(station.geoCoords.lat, station.geoCoords.lng),
                                $.extend(
                                    {},
                                    bsrOrangeBoxMarkerOptions,
                                    {title: stationId}
                                )
                            );

                            bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(bsrOrangeBoxMarker);
                        }
                    }
                    if (bsr.wasteManagement.googleMapsTools.bsrUserMarker !== undefined) {
                        bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(
                            bsr.wasteManagement.googleMapsTools.bsrUserMarker
                        );
                    }
                },
				setOrangeBoxStationsMapSmallMarkers: function (stations) {

                    //bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();

					for (var stationId in stations) {

                        var station = stations[stationId];
                        if (station.geoCoords !== undefined) {
                            //var bsrOrangeBoxSmallMarkerOptions = bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxSmall;
							var bsrOrangeBoxSmallMarkerOptions = station.applicable ?
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxSmall :
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxSmallDisabled;

                            var bsrOrangeBoxSmallMarker = new GMarker(
                                new GLatLng(station.geoCoords.lat, station.geoCoords.lng),
                                $.extend(
                                    {},
                                    bsrOrangeBoxSmallMarkerOptions,
                                    {title: stationId}
                                )
                            );

                            bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(bsrOrangeBoxSmallMarker);
                        }
                    }
                    if (bsr.wasteManagement.googleMapsTools.bsrUserMarker !== undefined) {
                        bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(
                            bsr.wasteManagement.googleMapsTools.bsrUserMarker
                        );
                    }
                },
				setOrangeBoxStationsMapBigMarkers: function (stations) {

                    //bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();

					for (var stationId in stations) {

                        var station = stations[stationId];
                        if (station.geoCoords !== undefined) {
                            //var bsrOrangeBoxBigMarkerOptions = bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBig;

							var bsrOrangeBoxBigMarkerOptions = station.applicable ?
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBig :
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBigDisabled;

							//console.log(bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBig);
							//console.log(bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.orangeBoxBigDisabled);
                            var bsrOrangeBoxBigMarker = new GMarker(
                                new GLatLng(station.geoCoords.lat, station.geoCoords.lng),
                                $.extend(
                                    {},
                                    bsrOrangeBoxBigMarkerOptions,
                                    {title: stationId}
                                )
                            );

                            bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(bsrOrangeBoxBigMarker);
                        }
                    }
                    if (bsr.wasteManagement.googleMapsTools.bsrUserMarker !== undefined) {
                        bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(
                            bsr.wasteManagement.googleMapsTools.bsrUserMarker
                        );
                    }
                },
				setAllStationsMapMarkers: function (stations) {
                    bsr.wasteManagement.googleMapsTools.bsrMap.clearOverlays();
                    for (var stationId in stations) {

                        var station = stations[stationId];
                        if (station.geoCoords !== undefined) {
                            var bsrMarkerOptions = station.applicable ?
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.stationEnabled :
                                bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.stationDisabled;

                            var bsrMarker = new GMarker(
                                new GLatLng(station.geoCoords.lat, station.geoCoords.lng),
                                $.extend(
                                    {},
                                    bsrMarkerOptions,
                                    {title: stationId}
                                )
                            );

                            bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(bsrMarker);
                        }
                    }
                    if (bsr.wasteManagement.googleMapsTools.bsrUserMarker !== undefined) {
                        bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(
                            bsr.wasteManagement.googleMapsTools.bsrUserMarker
                        );
                    }
                },

                setUserPositionMarker: function (placemark) {
                    // Remove potentially existing user marker ... there just have to be one!
                    if (bsr.wasteManagement.googleMapsTools.bsrUserMarker) {
                        bsr.wasteManagement.googleMapsTools.bsrMap.removeOverlay(
                            bsr.wasteManagement.googleMapsTools.bsrUserMarker
                        );
                    }
                    var lat = placemark.Point.coordinates[1];
                    var lng = placemark.Point.coordinates[0];
                    var bsrUserMarker = new GMarker(
                        new GLatLng(lat, lng),
                        bsr.wasteManagement.googleMapsTools.defaultMarkerOptions.userPosition
                    );
                    bsr.wasteManagement.googleMapsTools.bsrUserMarker = bsrUserMarker;
                    bsr.wasteManagement.googleMapsTools.bsrMap.addOverlay(bsrUserMarker);
                    bsr.wasteManagement.googleMapsTools.bsrMap.closeInfoWindow();

                    bsr.wasteManagement.googleMapsTools.setOptimizedCenterAndZoom(); /* placemark */

                },
                searchUserLocationByAddress: function (address) {
                    bsr.wasteManagement.googleMapsTools.lockUserLocationSearchField();
                    $("#google-maps-address-search-container .results").hide();
                    try {

                        address += ", Berlin, DE";
                        //console.log("Will ask Google for the address: " + address);
                        bsr.wasteManagement.googleMapsTools.geocoder.setBaseCountryCode('DE');
                        bsr.wasteManagement.googleMapsTools.geocoder.getLocations(
                            address,
                            function (response) {
                                if (!response || response.Status.code !== 200) {
                                    // error while connecting the google web service, or API returned an error
                                    bsr.wasteManagement.googleMapsTools.lockUserLocationSearchField();
                                    $(window).triggerHandler("onWastemanagementError", ["googlemaps-no-address-found", $(".google-maps-address-search-field-container INPUT")]);
                                } else {
                                    /* * /
                                    console.group("unfiltered google response:")
                                    console.dir(response.Placemark);
                                    console.groupEnd();
                                    / * */
                                    placemarks = bsr.wasteManagement.googleMapsTools.filterBerlinAddresses(response.Placemark);
                                    /* * /
                                    console.group("filtered google response:")
                                    console.dir(placemarks);
                                    console.groupEnd();
                                    / * */

                                    if (placemarks.length > 1) { // google found more alternatives for the address, showing the results
                                        bsr.wasteManagement.googleMapsTools.showMultipleUserLocations(placemarks);
                                    } else if (placemarks.length == 1) { // cool, just one address is found, set user's position marker:
                                        bsr.wasteManagement.googleMapsTools.setUserPositionMarker(placemarks[0]);
                                        bsr.wasteManagement.googleMapsTools.lockUserLocationSearchField();
                                    } else { // nothing valuable found ... showing error:
                                        //console.log("Nothing Found");
                                        bsr.wasteManagement.googleMapsTools.lockUserLocationSearchField();
                                        $(window).triggerHandler("onWastemanagementError", ["googlemaps-no-address-found", $(".google-maps-address-search-field-container INPUT")]);
                                    }
                                }
                            }
                        );
                    } catch (exp) {
                        //console.log("fatal error when trying to recieve google maps data");
                        bsr.wasteManagement.googleMapsTools.lockUserLocationSearchField();
                        $(window).triggerHandler("onWastemanagementError", ["googlemaps-no-address-found", $(".google-maps-address-search-field-container INPUT")]);
                    }
                },
                lockUserLocationSearchField: function () {
                    var field = $(".google-maps-address-search-field-container INPUT");
                    if (field.hasClass("waiting")) {
                        $(".google-maps-address-search-field-container INPUT")
                            .removeAttr("disabled")
                            .removeClass("waiting")
                            .focus(); // focus the element ... for FF to remember the previous state ...
                    } else {
                        $(".google-maps-container").focus(); // focus the surrounding element, 'cause otherwise the focus is stolen by "disabled" and FF has problems to reset it.
                        $(".google-maps-address-search-field-container INPUT")
                            .blur()
                            .attr("disabled", "disabled")
                            .addClass("waiting");
                    }
                },
                filterBerlinAddresses: function (googleMapsApiPlacemarks) {
                    return $.grep(
                        googleMapsApiPlacemarks,
                        function (placemark, idx) {
                            // the google maps api response structure is too different - so the quite hard fallback is needed ...
                            try {
                                // if search term was similar to "completeRubbish, Berlin, DE" as address "Berlin, Deutschland" is returned
                                // but enable, if something like "Berlin", "Berlin, DE", "Berlin, Deutschland" was searched ... tested simply bei indexOf("berlin")!!!!
                                if (
                                    /^Berlin,\s[^,]*?\s?Deutschland$/i.test(placemark.address) &&
                                    $(".google-maps-address-search-field-container INPUT").val().toLowerCase().indexOf("berlin") === -1
                                ) {
                                    return false;
                                }
                                return placemark.AddressDetails.Country.CountryNameCode === "DE" && // the country is germany,
                                       (
                                           placemark.AddressDetails.Country.AdministrativeArea && // data node exists...
                                           placemark.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName === "Berlin" && // the city is Berlin
                                           placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea && // data node exists...
                                           placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality && // data node exists...
                                           ( // and there was a decent street found as minimum -> to filter out placemakrs like "Wow, i found 'Berlin, Berlin, Germany'" ...
                                               placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare !== undefined ||
                                               (
                                                   placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality && // data node exists...
                                                   placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.Thoroughfare !== undefined
                                               ) ||
                                               placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode ||
                                               placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName === "Berlin"
                                           )
                                       ) ||
                                       (
     									   placemark.AddressDetails.Country.AdministrativeArea.Locality &&
                                           placemark.AddressDetails.Country.AdministrativeArea.Locality.LocalityName === "Berlin" &&
                                           placemark.AddressDetails.Country.AdministrativeArea.Locality.Thoroughfare !== undefined
                                       );
                            } catch (exp) {
                                /* * /
                                console.group("placemarks filter error:");
                                console.log("failure on placemark:");
                                console.log(placemark);
                                console.groupEnd();
                                / * */
                                return false;
                            }
                        }
                    );
                },
                showMultipleUserLocations: function (placemarks) {
                    var resultHTML = $("<ul />").append($("<li><strong>Meinten Sie ...</strong></li>"));
                    $.each(
                        placemarks,
                        function (idx, placemark) {
                            var district = placemark.AddressDetails.Country &&
                                           placemark.AddressDetails.Country.AdministrativeArea &&
                                           placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea &&
                                           placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality &&
                                           placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality &&
                                           placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.DependentLocalityName !== undefined ?
                                               placemark.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.DependentLocality.DependentLocalityName : "";
                            resultHTML.append(
                                $("<li />")
                                    .append(
                                        $("<a>" + placemark.address.replace(/,\s[^,]*?\s?Deutschland,?/gi, "") + (district != "" ? ", " + district : "") + "</a>")
                                        .data("placemark", placemark)
                                        .click(
                                            function () {
                                                $("#google-maps-address-search-container .results").hide("blind", {}, 500);
                                                bsr.wasteManagement.googleMapsTools.setUserPositionMarker($(this).data("placemark"));
                                            }
                                        )
                                    )
                            );
                        }
                    );
                    $("#google-maps-address-search-container .results").html("").append(resultHTML).show("blind", {}, 500, function () {
                            bsr.wasteManagement.googleMapsTools.lockUserLocationSearchField();
                        }
                    );
                },
                setOptimizedCenterAndZoom: function () {
                    if (!!!bsr.wasteManagement.googleMapsTools.bsrUserMarker) {
                        return;
                    }
                    var mapBounds = bsr.wasteManagement.googleMapsTools.bsrMap.getBounds();

                    var userLat = bsr.wasteManagement.googleMapsTools.bsrUserMarker.getLatLng().lat();
                    var userLng = bsr.wasteManagement.googleMapsTools.bsrUserMarker.getLatLng().lng();
                    var stationToUserBounds = [];
                    for (var stationId in bsr.wasteManagement.rawData.collectionStations) {
                        var station = bsr.wasteManagement.rawData.collectionStations[stationId];
                        if (station.applicable) {
                            /**
                             * Take care ... this 'greater/lower than' only works
                             * for coordinates in the nothern hemisphere which are
                             * located at the east of greenwhich, as far as i
                             * understood
                             */
                            var boundsSW = new GLatLng(
                                station.geoCoords.lat < userLat ? station.geoCoords.lat : userLat,
                                station.geoCoords.lng < userLng ? station.geoCoords.lng : userLng
                            );
                            var boundsNE = new GLatLng(
                                station.geoCoords.lat > userLat ? station.geoCoords.lat : userLat,
                                station.geoCoords.lng > userLng ? station.geoCoords.lng : userLng
                            );
                            stationToUserBounds.push(
                                {
                                    distance: boundsSW.distanceFrom(boundsNE),
                                    bounds: new GLatLngBounds(boundsSW, boundsNE)
                                }
                            );
                        }
                    }
                    // sort by distance to get the closest collectionStation for the user.
                    stationToUserBounds.sort(
                        function (a, b) {
                            var compA = (0 + a.distance);
                            var compB = (0 + b.distance);
                            return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;

                            // the following is the usage according to the specs, but don't work in IE!
                            //return a.distance > b.distance;
                        }
                    );

                    bsr.wasteManagement.googleMapsTools.bsrMap.setCenter(
                        stationToUserBounds[0].bounds.getCenter()
                    );
                    bsr.wasteManagement.googleMapsTools.bsrMap.setZoom(
                        bsr.wasteManagement.googleMapsTools.getBestGuessedZoomLevelByDistance(
                            stationToUserBounds[0].distance
                        )
                    );

                },
                getBestGuessedZoomLevelByDistance: function (distanceInMeters) {
                    if (distanceInMeters < 1200) {
                        return 15;
                    } else if (distanceInMeters < 3000) {
                        return 14;
                    } else if (distanceInMeters < 7100) {
                        return 13;
                    } else if (distanceInMeters < 8601) {
                        return 12;
                    } else { // which is Berlin at all ...
                        return 11;
                    }
                }
            },
            rawData: {
                wasteTypes: {},
                tagCloudData: {}
            },
            data: {
                autoCompleterData: [],
                tagCloudData: []
            }
        }
    }
);
bsr.wasteManagement.tools.defaultInformationBoxOptions =
    $.extend(
        {},
        bsr.help.defaultHelpBoxOptions,
        {
            'scrolling'           : 'auto',
            'titleShow'           : true,
            'titlePosition'       : 'inside',
            'speedIn'             : 600,
            'speedOut'            : 600,
            'hideOnOverlayClick'  : true,
            'showCloseButton'     : true
        }
     );




var fancyboxTabLinkHandler = function (eventKind, item) {
    $.fancybox.showActivity();
    $.ajax(
        {
            type    : "GET",
            cache   : false,
            url     : item.infoUris[eventKind],
            success: function(data) {
                if (window.dummy) {
                    data = data.replace(/<h1>.*<\/h1>/, "<h1>" + item.name + "</h1>");
                }
                $.fancybox(
                    data,
                    function () {
                        return $.extend(
                            bsr.wasteManagement.tools.defaultInformationBoxOptions,
                            {
                                'href'          : item.infoUris[0],
                                'titleFormat'   : function () {
                                    var tabNav = (function () {
                                        return fancyboxTabLinkTitleHandler(eventKind, item);
                                    })();
                                    return tabNav;
                                }/*,
                                'onComplete'    : function () {
                                    $.fancybox.resize();
                                    //$("#fancybox-wrap").css("height", parseInt($("#fancybox-wrap").css("height")) + 20 + "px");
                                    //$("#fancybox-inner").css("height", parseInt($("#fancybox-inner").css("height")) - 20 + "px");
                                    //console.dir(item.domRepresentation);
                                    this.orig = item.domRepresentation;
                                }*/
                            }
                        )
                    }()
                );
                $.fancybox.hideActivity();
            }
        }
    );

    return false;
};
var fancyboxTabLinkTitleHandler = function (eventKind, item) {
    if (item.infoUris.length > 1) {

            var tabs = $('<div class="information-tabs"></div>');
            tabs.append(
                $("<a>")
                    .addClass("first")
                    .addClass(eventKind === -1 || eventKind === 0 ? "active" : "")
                    .css(eventKind === -1 || eventKind === 0 ? {cursor: "default"} : {cursor: 'pointer'})
                    .attr("href", item.infoUris[0])
                    .click(
                        (
                            (eventKind === -1 || eventKind === 0) ?
                                function () {
                                    this.blur();
                                    return false;
                                } :
                                function (evnt) {
                                    fancyboxTabLinkHandler(0, item);
                                    return false;
                                }
                        )
                    )
                    .append("<span>Allgemeine Infos</span>")
            );
            tabs.append(
                $("<a>")
                    .addClass("last")
                    .addClass(eventKind === 1 ? "active" : "")
                    .css(eventKind === 1 ? {cursor: "default"} : {cursor: 'pointer'})
                    .attr("href", item.infoUris[1])
                    .click(
                        (
                            (eventKind === 1) ?
                                function () {
                                    this.blur();
                                    return false;
                                } :
                                function (evnt) {
                                    fancyboxTabLinkHandler(1, item);
                                    return false;
                                }
                        )
                    )
                    .append("<span>Weitere Informationen</span>")
            );
            return tabs;
    } else {
        return "";
    }
};



/* ###################  GOOGLE-MAPS:  ######################### */
var bsrMap = null;
if (
    typeof(google) !== "undefined" &&
    typeof(google.load) !== "undefined"
) {
    //var gApiScriptTag = $("HEAD").add('<script type="text/javascript" src="http://www.google.com/jsapi?key=' + gApiKey + '" />')

    try {
        google.load("maps", "2.x");
    } catch(exp) {
        /*ignore silently*/
    }

}

/* ###################  DOWNLOAD-LIST:  ######################### */
var animationSpeed = "normal"; // "slow", "normal", "fast"
var downloadListItemClickHandler = function (evnt) {
    evnt.stopPropagation();
    $(this).blur();
    childList = $(this).children("UL");
    if (childList.size() > 0) {
        if (childList.css("display") === "none") {
            // first checking all direct siblings: if open? close it!

            var parents = !$(this).parent().hasClass("LinkList") ?
                            $(this).parent().children("LI").children("UL") :
                            $("div.DownloadList > UL.LinkList > LI > UL");

            parents.each(
                function (idx, elm) {
                    var elmObj = $(elm);
                    if (elmObj.css("display") !== "none") { // this is the visible sibling
                        elmObj.hide(
                            "blind",
                            {},
                            animationSpeed,
                            function () {
                                elmObj.parent().removeClass("open");
                            }
                        );
                    }
                }
            );
            childList.parent().addClass("open");
            childList.show(
                "blind",
                {},
                animationSpeed
            );
        } else {
            var that = $(this);
            childList.hide(
                "blind",
                {},
                animationSpeed,
                function () {
                    that.removeClass("open");
                }
            );
        }
    }
};


$(document).ready(
    function() {

		/* ******************************************************************
		 * Einbinden der Browser Feature Erkennung
		  *******************************************************************/
		try {
			var bf = new piApp.helper.browser_featues()
				bf.init() // run tests
		} catch(e) {}

		/* ******************************************************************
		 * Hauptnavigation
		 * darf nicht verlinken, wenn das gerät kein Touch Device ist
		 * Aussnahme: der erste Menupunkt (Startseite)
		  *******************************************************************/
		/*try {
			if(piApp.device.touch === false) {
				$('.TabNavigation > ul > li > a').slice(1).removeAttr('href')
			}
		} catch(e){}*/

		/* ******************************************************************
		 * Speednavi
		 * BSR Power User Speed Navigation einbinden
		  *******************************************************************/
		try {
			var SN = new piApp.helper.speednavi(); SN.init();
		} catch(e) {}

		/* ******************************************************************
		 * BSRBox
		 * BSR Layer Popup ausführen
		  *******************************************************************/
		try {
			piApp.helper.bsrbox();
		} catch(e) {}

		// Layer-Popup automatisch auf der Startseite ausführen
		// bsr.de/index.html?showOrangeBox
		showOrangeBox = location.search.substring(1, location.search.length);
		if (showOrangeBox=="showOrangeBox") {
			var layer = $('div.bsrBox');
			layer_width = layer.width();
			window_mid = ($(window).width()/2);
			pos_mid = window_mid-(layer_width/2);
			pos_top = $(window).scrollTop();
			$('body').append('<div id="bsrBlackLayer"></div>')
			$('#bsrBlackLayer').css({width:$(document).width(),height:$(document).height()})
			$('#bsrBlackLayer').fadeIn('slow',function(){
				layer.css({'position':'absolute',top:'10px',left:pos_mid+'px',top:pos_top+'px',display:'block'})
				layer.animate({'opacity':1},'slow')
				if($.browser.msie){
					$('#bsrBlackLayer').css({filter:"alpha(opacity=40)"});
				}
			})
		}

		// Rollover für den Mann im Header
		$('#bsrBoxButtonHeader a.bsrBoxLink').live('hover',function(){
			$('#bsrBoxButtonHeader div').css({background:"url(/images/bsrBoxButtonHeader-a.png) no-repeat left"});
		})
		$('#bsrBoxButtonHeader a').live('mouseleave',function(){
			$('#bsrBoxButtonHeader div').css({background:"url(/images/bsrBoxButtonHeader.png) no-repeat left"});
		})

		$('a.bsrButton3 span').live('hover',function(){
			$('a.bsrButton3').css({background:"url(/images/bsrBoxButton3-a.png) no-repeat left"});
		})
		$('a.bsrButton3 span').live('mouseleave',function(){
			$('a.bsrButton3').css({background:"url(/images/bsrBoxButton3.png) no-repeat left"});
		})


        if (typeof(jsPathPrefix) === "undefined") {
            jsPathPrefix = "";
        }
        //supersleight
        if (
            $.browser.msie &&
            parseFloat($.browser.version) < 7
        ) {
            $('#PageWrapper,.bsrBox').supersleight();
        }

        //Tabellen einfaerben
        $('div#ContentContainer div.ContentCol table tr:nth-child(2n)').addClass("even");
        $('div#ContentContainer div.ContentCol table tr:first-child').addClass("head");

        $('div#ContentContainer div.ContentCol div.Content table td p:last-child').attr({style: "margin-bottom: 0px;"});
        //## WasteMAnagenement - for ClickDummy only!
        $('div.entry-list-container div.entry-list ul li:nth-child(2n)').addClass("even");

        //kein Trenner nach im ersten Sitetool
        $('ul.Sitetools li:first-child').attr({style: "background-image: none;"});

        //erster Tab Tabnavigation
        $('div.TabNavigation>ul>li:first-child').addClass("first-child");

//letztes Listenelement ohne padding unten
        $('div#ContentContainer div.Box div.BoxContent ul.LinkList').attr({style: "padding-bottom: 0px;"});
        $('div#ContentContainer div.Box div.BoxContent ul.LinkList li:last-child').attr({style: "padding-bottom: 0px;"});


        //Teaser automatisch ausrichten: hier fuer 2-spaltige Ausgabe!
        $('div#ContentContainer div.Content2Cols:odd').addClass("RightContentCol");

        //+ nach jeder 2ten ein clear einfuegen
        $('div#ContentContainer div.Content2Cols:odd').after('<br class="clear" />');
        //kein Margin oben bei ContentImg am Anfang
       // $('div#ContentContainer div.ContentCol div.Content div.ContentImage:first').attr({style: "margin-top: 0px;"});

        // fixing the boxes floating for the subhomes
        var boxColumnCounter = 0;
        var boxColumnCounterStepValue = 0;
        $('DIV#ContentContainer.Home DIV.ContentCol DIV.Content').children().each(
            function (idx, box) {
                if (box.className === "Box QuadCol") {
                    boxColumnCounter = 4;
                } else {
                    if (box.className === "Box TripleCol") {
                        boxColumnCounterStepValue = 3;
                    } else if (box.className === "Box DoubleCol") {
                        boxColumnCounterStepValue = 2;
                    } else if (box.className === "Box") {
                        boxColumnCounterStepValue = 1;
                    }
                    boxColumnCounter += boxColumnCounterStepValue;
                }
                if (boxColumnCounter > 4) {
                    $(box).before('<div class="clear"></div>');
                    //$(box).before('<div>FEHLER! [boxColumnCounter: ' + boxColumnCounter + ']</div>');
                    //alert("Die Boxen auf der Homepage sind inkorrekt befüllt!\nboxColumnCounter: " + boxColumnCounter);
                    boxColumnCounter = boxColumnCounterStepValue;
                    //$(box).before('<div>[boxColumnCounter: ' + boxColumnCounter + ']</div>');
                }
                //alert(boxColumnCounter);
                if (boxColumnCounter === 4) {
                    $(box).addClass("RightContentCol").after('<div class="clear"></div>');
                    boxColumnCounter = 0;
                }
                boxColumnCounterStepValue = 0;
            }
        );

        //Teaser-Boxen auf Folgeseiten
        //Teaser automatisch ausrichten: hier für 2- und 3-spaltige Ausgabe!
        if (!$('div.ContentWrapper').hasClass("Wide")) { // 2-spaltig
            var boxWidthCounter = 0;
            $('div.ContentWrapper div.ContentCol div.Content div.BoxArea div.Box').each(
                function (idx, elm) {
                    if (!$(elm).hasClass("DoubleCol") || !$(elm).hasClass("TripleCol") || !$(elm).hasClass("QuadCol")) {
                        boxWidthCounter++;
                    } else {
                       boxWidthCounter = 0;
                    }
                    if (boxWidthCounter == 2) {
                        $(elm).addClass("RightContentCol").after('<br class="clear" />');
                        boxWidthCounter = 0;
                    }
                }
            );
        } else { // 3-spaltig
            // Ausnahmen fuer die breite Seite
            $('div.ContentWrapper.Wide div.ContentCol div.Content div.BoxArea div.Box').each(
                function (idx, box) {
                    if (box.className === "Box QuadCol") {
                        boxColumnCounter = 3;
                    } else if (box.className === "Box TripleCol") {
                        boxColumnCounter = 3;
                    } else {
                        if (box.className === "Box DoubleCol") {
                            boxColumnCounterStepValue = 2;
                        } else if (box.className === "Box") {
                            boxColumnCounterStepValue = 1;
                        }
                        boxColumnCounter += boxColumnCounterStepValue;
                    }
                    if (boxColumnCounter > 3) {
                        $(box).before('<div class="clear"></div>');
                        //$(box).before('<div>FEHLER! [boxColumnCounter: ' + boxColumnCounter + ']</div>');
                        //alert("Die Boxen auf der Homepage sind inkorrekt befüllt!\nboxColumnCounter: " + boxColumnCounter);
                        boxColumnCounter = boxColumnCounterStepValue;
                        //$(box).before('<div>[boxColumnCounter: ' + boxColumnCounter + ']</div>');
                    }
                    if (boxColumnCounter === 3) {
                        $(box).addClass("RightContentCol").after('<div class="clear"></div>');
                        boxColumnCounter = 0;
                    }
                    boxColumnCounterStepValue = 0;
                }
            )
        }


        var homepageBanner = $('DIV#ContentContainer.Home DIV#Stage DIV.Banner');
        if (homepageBanner.size() === 2) {
            homepageBanner.last().addClass("RightContentCol");
        }


        //Inline-editing: disable sortbuttons
        $('div.ContentCol div.editContent:first div.inlinebuttons a.editbutton.sort-up').addClass("disabled");
        $('div.ContentCol div.editContent:last div.inlinebuttons a.editbutton.sort-down').addClass("disabled");
        $('div#Navigation li.editContent:first-child > div.inlinebuttons > a.editbutton.sort-up').addClass("disabled");
        $('div#Navigation li.editContent:last-child > div.inlinebuttons > a.editbutton.sort-down').addClass("disabled");

		// Vor dem auszeichnen der CSS Klassen mit Typ Icons die Bilder der Teaserboxen mit einem Link auf das gleiche Ziel des ersten Element der dazugehörigen Linkliste  austatten.

		$("div.Box div.BoxContent").each(function(){
			var linkUrl = $(this).children("ul.LinkList").children("li:first-child").children("a").attr("href");
			var linkClass = $(this).children("ul.LinkList").children("li:first-child").children("a").attr("class");
			var linkRel = $(this).children("ul.LinkList").children("li:first-child").children("a").attr("rel");
			var linkType = $(this).children("ul.LinkList").children("li:first-child").children("a").attr("type");

			if(linkUrl != null){
				$(this).children("div.BoxImg").children("img").wrapAll("<a class='"+linkClass+"' type='"+linkType+"' rel='"+linkRel+"' href='"+linkUrl+"' />");
			}
		});

		 //alle absoluten URIs im extra Fenster öffnen
        $("a[href^='http'],area[href^='http']").click(
            function () {
                this.target = "_blank";
            }
        );

		//das Kontaktformular immer im neuen Fenster öffnen
		$('a[href^="/bsr_kontakt.php"]').click(
            function () {
                this.target = "_blank";
            }
        );

		//Downloads(uä Links) via CSS-Klasse mit Typ-Icon versehen: hier ist der Link innerhalb eines li und die class muss dort ran!
        $('ul.LinkList li > a[href]').parent().addClass("dot");
        $('ul.LinkList li > a[href^="javascript:void(0)"]').parent().removeClass("dot");
        $('ul.LinkList li > a[href$=pdf]').parent().removeClass("dot").addClass("PDF");
        $('ul.LinkList li > a[href$=doc]').parent().removeClass("dot").addClass("DOC");
        $('ul.LinkList li > a[href$=xls]').parent().removeClass("dot").addClass("XLS");
        $('ul.LinkList li > a[href$=zip]').parent().removeClass("dot").addClass("ZIP");
        $('ul.LinkList li > a[href$=mov]').parent().removeClass("dot").addClass("MOV");
        $('ul.LinkList li > a[href$=mp3]').parent().removeClass("dot").addClass("MP3");
        $('ul.LinkList li > a[href$=png]').parent().removeClass("dot").addClass("IMG");
        $('ul.LinkList li > a[href$=jpg]').parent().removeClass("dot").addClass("IMG");
		$('ul.LinkList li > a[href$=jpeg]').parent().removeClass("dot").addClass("IMG");
        $('ul.LinkList li > a[href$=gif]').parent().removeClass("dot").addClass("IMG");
        $('ul.LinkList li > a[href$=bmp]').parent().removeClass("dot").addClass("IMG");
		$('ul.LinkList li > a[href$=tif]').parent().removeClass("dot").addClass("IMG");
		$('ul.LinkList li > a[href$=tiff]').parent().removeClass("dot").addClass("IMG");
		$('ul.LinkList li > a[href$=pcx]').parent().removeClass("dot").addClass("IMG");
		$('ul.LinkList li > a[href$=psd]').parent().removeClass("dot").addClass("IMG");
		$('ul.LinkList li > a[href$=svg]').parent().removeClass("dot").addClass("IMG");

        // all URIs pointing to any file in ~/*/assets/downloads/* open in a new window
        $("a[href*='assets/downloads']").click(
            function () {
                this.target = "_blank";
            }
        );

        //Subnav
		$('div#Navigation ul li > ul').parent().addClass("open");

        //PageTop
        $('#Totop').animate( { scrollTop: 0 }, 'slow' );

        // Banner-Tabs
        //$('#tabs').tabs({ fx: { opacity: 'toggle', duration:'normal'} });
        $('#tabs').tabs({ fx: {} });
        $("#tabs UL LI.tabs A").click( // pimpin' tabs to change the tabs-content's bg color
            function () {
                $("div#tabs").removeClass("White40 White60 White80 White100 Black40 Black60 Black80 Black100")
                             .addClass(this.rel);
            }
        );

        $('.ui-accordion').accordion({ active:false, collapsible:true, autoHeight:false });

        $("A.fancybox").fancybox({
            'titleShow'     : true,
            'titlePosition' : 'inside',
            'transitionIn'  : 'elastic',
            'transitionOut' : 'elastic',
            'easingIn'      : 'easeOutBack',
            'easingOut'     : 'easeInBack',
            "padding"       : 0
        });
        $("DIV.fancybox").click(
            function () {
                $("A.fancybox", $(this).parent()).click();
            }
        );






        $("INPUT#DreckeckenSearch").val(dreckeckenSearchText[currentPageLanguage]);
        $("INPUT#DreckeckenSearch").focus(
            function () {
                if (this.value === dreckeckenSearchText[currentPageLanguage]) {
                    this.value = "";
                }
            }
        ).blur(
            function () {
                if (this.value === "") {
                    this.value = dreckeckenSearchText[currentPageLanguage];
                }
            }
        );

        $("INPUT#QuickSearch").val(quickSearchText[currentPageLanguage]);
        $("INPUT#QuickSearch").focus(
            function () {
                if (this.value === quickSearchText[currentPageLanguage]) {
                    this.value = "";
                }
            }
        ).blur(
            function () {
                if (this.value === "") {
                    this.value = quickSearchText[currentPageLanguage];
                }
            }
        );

        $("INPUT#DustSearch").val(dustSearchText[currentPageLanguage]);
        $("INPUT#DustSearch").focus(
            function () {
                if (this.value === dustSearchText[currentPageLanguage]) {
                    this.value = "";
                }
            }
        ).blur(
            function () {
                if (this.value === "") {
                    this.value = dustSearchText[currentPageLanguage];
                }
            }
        );


        $("div.ContentCol DIV.tagcloud A").each(
            function (idx, ankr) {
                $(ankr)
                    .data("orgColor", $(ankr).css("color"))
                    .hover(
                        function () {
                            $(this).css("color", "#F60");
                        },
                        function () {
                            $(this).css("color", $(this).data("orgColor"));
                        }
                    );
            }
        );


        /*
        $("DIV.search-autocompleter INPUT#waste-management-types").focus(
            function () {
                if (this.value === wasteTypeFormText[currentPageLanguage]) {
                    this.value = "";
                }
            }
        ).blur(
            function () {
                if (this.value === "") {
                    this.value = wasteTypeFormText[currentPageLanguage];
                }
            }
        ).val(wasteTypeFormText[currentPageLanguage]);
        */
        $("DIV.search-autocompleter INPUT#waste-management-types").focus();
        $("DIV.search-autocompleter INPUT#waste-management-types").keyup(function () {
            //console.log("set data[previousValue]: " + this.value);
            $(this).data("previousValue", this.value);
        });

        $("A.fancybox-help").fancybox(bsr.help.defaultHelpBoxOptions);

        $("UL.LinkList LI.info A").click(
            function () {
                var that = this;
                $.fancybox(

                    $.extend(
                        {},
                        bsr.help.defaultHelpBoxOptions,
                        {
                            'content': $("DIV.HelpContainer", $(that).parent()).clone().show()[0],
                            'orig': $(that)
                        }
                    )
                );

                return false;
            }
        );

        /* fixing order of navigation points in layer navigation of main navigation */
        $("#layernavi-order").children().each( // looping the navilayers
            function () {
                var toSortNaviLayer = $("#" + this.id.replace(/layernavi/, "id") + " DIV.second-level div.content UL.LinkItems"),
                    tmpChildren = [],
                    childrenIdsSorted = $.trim($(this).text()).split(',');
                for (var i = 0; i < childrenIdsSorted.length; i++) { // looping the children
                    tmpChildren.push($("#" + childrenIdsSorted[i]).clone());
                }
                toSortNaviLayer.children().remove();
                for (var ii = 0; ii < tmpChildren.length; ii++) {
                    toSortNaviLayer.append(tmpChildren[ii]);
                }
            }
        );





        /* ### Page MyAbfall ... loading DATA: ### */
        if ($("#waste-management-types.my-abfall").size() > 0) { // it's the Page MyAbfall ...
            $("#waste-management-types.my-abfall").parent().parent().submit(function () {return false;});

            $(window).bind("onRawDataLoading", bsr.wasteManagement.googleMapsTools.initializeDefaultMarkers);
            $(window).bind("onRawDataLoading", bsr.wasteManagement.googleMapsTools.initializeAllStationsMap);

			//$(window).bind("onRawDataLoading", bsr.wasteManagement.googleMapsTools.initializeOrangeBoxStationsMap);
			/*
			$(window).bind(
                "onRawDataLoaded",
                function () {
                    bsr.wasteManagement.googleMapsTools.setAllStationsMapMarkers(
                        bsr.wasteManagement.tools.getApplicableCollectionsStations()
                    );



					bsr.wasteManagement.googleMapsTools.setOrangeBoxStationsMapSmallMarkers(
						bsr.wasteManagement.tools.getApplicableOrangeBoxStations()
					);


                }
            );
			*/

            $(window).bind("onWasteListChanged", bsr.wasteManagement.tools.wasteListChangedHandler);
            $(window).bind("onRawDataLoaded", bsr.wasteManagement.tools.initAutoCompleter);
            $(window).bind("onRawDataLoaded", bsr.wasteManagement.tools.loadUserCookieData);
            $(window).bind("onRawDataLoaded", bsr.wasteManagement.tools.loadTagCloudData);

            $(window).bind("onWastemanagementError", bsr.wasteManagement.tools.showError);

            bsr.wasteManagement.tools.loadRawData();

            $("#google-maps-address-search-container FORM").submit(
                function () {
                    bsr.wasteManagement.googleMapsTools.searchUserLocationByAddress(this.elements["google-maps-address-search-field"].value);
                    return false;
                }
            );


        /* ### /Page MyAbfall ... loading DATA ### */
        /* ### Page Abfall-ABC ... loading DATA: ### */
        } else if ($("#waste-management-types.encyclopaedia").size() > 0) {
            $(window).bind("onWastemanagementError", bsr.wasteManagement.tools.showError);
            $(window).bind(
                "onRawDataLoaded",
                function () {
                    $($("#waste-management-types.encyclopaedia")[0].form).submit(
                        function () {
                            $("#waste-management-types.encyclopaedia").search();
                            return false;
                        }
                    );
                    $("#waste-management-types.encyclopaedia").autocomplete(
                        bsr.wasteManagement.data.autoCompleterData,
                        {
                            formatItem: function(item) {
                                //console.log(item.name);
                                return item.name;
                            },
                            /* * /matchContains: true,/ * */
                            highlight: function(value, term) { // per default autocompleter highlightes _all_ matches ... we want just the first match !!!
                                return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/i, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "i"), "<strong>$1</strong>");
                            },
                            max: 30,
                            scrollHeight: 300,
                            width: 315
                            //mustMatch: true
                            //autoFill: true
                        }
                    ).result(
                        function (event, item) {
                            var inputField = $(this);
							//console.log("input: "+ item.pageUri);
                            if (!!item) {
                                self.location.href = item.pageUri;
                            } else {
                                if (inputField.val() !== "") {
                                    $.ajax(
                                        {
                                            type    : "GET",
                                            cache   : false,
                                            url     : bsr.wasteManagement.config.errors["autocompleter-no-valid-item-report"],
                                            data    : {searchValue: inputField.val()}
                                        }
                                    );
                                    $(window).triggerHandler("onWastemanagementError", ["autocompleter-no-valid-item", inputField]);
                                }
                            }
                        }
                    );
                }
            );
            $(".FunctionBox .Content2Cols .ABC A").click(
                function () {
                    $(
                        "DIV.search-autocompleter INPUT#waste-management-types",
                        $(this).parent().parent().parent()
                    ).val($(this).attr("name")).focus().keydown();

                }
            );
            bsr.wasteManagement.tools.loadRawData();

        /* ### /Page Abfall-ABC ... loading DATA ### */
        /* ### Page collections Stations Overview ###: */
        } else if ($(".google-maps-container.collection-stations").size() > 0) {
            $(window).bind("onRawDataLoading", bsr.wasteManagement.googleMapsTools.initializeDefaultMarkers);
            $(window).bind("onRawDataLoading", bsr.wasteManagement.googleMapsTools.initializeAllStationsMap);

            $(window).bind("onWastemanagementError", bsr.wasteManagement.tools.showError);

            $(window).bind(
                "onRawDataLoaded",
                function () {
                    bsr.wasteManagement.googleMapsTools.setAllStationsMapMarkers(
                        bsr.wasteManagement.tools.getApplicableCollectionsStations()
                    );

					/* orangboxjs */

					bsr.wasteManagement.googleMapsTools.setOrangeBoxStationsMapMarkers(
						bsr.wasteManagement.tools.getApplicableOrangeBoxStations()
					);


                }
            );

            bsr.wasteManagement.tools.loadRawData();

            $("#google-maps-address-search-container FORM").submit(
                function () {
                    bsr.wasteManagement.googleMapsTools.searchUserLocationByAddress(this.elements["google-maps-address-search-field"].value);
                    return false;
                }
            );

            // separate single list into two...
            if ($(".ContentCol .Content .Content2Cols UL.collection-stations").size() === 2) {
                var collectionStationsList1 = $(".ContentCol .Content .Content2Cols UL.collection-stations:first");
                var collectionStationsList2 = $(".ContentCol .Content .Content2Cols UL.collection-stations:last");
                if ($("LI", collectionStationsList2).size() === 0) {
                    /* left - right - left - right - aso. * /
                    $("LI:odd", collectionStationsList1).each(
                        function (idx, elm) {
                            collectionStationsList2.append(elm);
                        }
                    );
                    /* */
                    /* left to bottom, then right... */
                    var listElementsCount = $("LI", collectionStationsList1).size();
                    $("LI", collectionStationsList1).each(
                        function (idx, elm) {
                            if (idx > listElementsCount / 2) {
                                collectionStationsList2.append(elm);
                            }
                        }
                    );
                    /* */
                }
            }

        /* ### Page collection Station ###: */
        } else if ($(".google-maps-container.single-map").size() > 0) {
            $(window).bind("onInitializeSingleStationMap", bsr.wasteManagement.googleMapsTools.initializeDefaultMarkers);
            $(window).bind("onInitializeSingleStationMap", bsr.wasteManagement.googleMapsTools.initializeSingleStationMap);

            $(window).triggerHandler("onInitializeSingleStationMap");

            // initialize the fancyboxes with the info windows for the waste groups
            $(".entry-list-container.Spektrum .entry-list UL LI A").click(
                function () {
                    var that = $(this);
                    $.fancybox(
                        (
                            function () {
                                var item = {infoUris: [that.attr("href"), that.attr("rel")], name: that.text()};
                                return $.extend(
                                    bsr.wasteManagement.tools.defaultInformationBoxOptions,
                                    {
                                        'href': that.attr("href"),
                                        'titleFormat': function () {
                                            var tabNav = (function () {
                                                return fancyboxTabLinkTitleHandler(-1, item);
                                            })();
                                            return tabNav;
                                        },
                                        'onComplete': function () {
                                            if (window.dummy) {
                                                (function () {
                                                    $("#fancybox-inner div.InformationContainer").html($("#fancybox-inner div.InformationContainer").html().replace(/<h1>.*<\/h1>/gi, "<h1>" + item.name + "</h1>"));
                                                })();
                                            }
                                            $("div.InformationContainer div.confirmAbortButtons").hide();
                                            $.fancybox.resize();
                                        },
                                        'onClosed': null,
                                        'showCloseButton': true,
                                        'orig': that
                                    }
                                );
                            }()
                        )
                    );
                    return false;
                }
            );

        } else {
            $("div.ContentCol DIV.tagcloud").tagcloud(
                {
                    //type: "sphere", power: .3, // power only works with 'sphere'
                    //type: "cloud", seed: 23, // seed only works with 'cloud'!
                    type: "list",
                    sizemin: 11,
                    sizemax: 20,
                    colormin: "969696",
                    colormax: "666666",
                    height: 120
                }
            );
        }





        $("#waste-management-types.link-to-my-abfall").autocomplete(
            bsr.wasteManagement.data.wasteTypes,
            {
                formatItem: function(item) {
                    return item.text;
                },
                matchContains: true,
                max: 30,
                scrollHeight: 300,
                width: 315
            }
        )/*.result(
            function (event, item) {

            }
        )*/;


        $("DIV.DownloadList UL LI").click(
            downloadListItemClickHandler
        );

        if (
            $("DIV.DownloadList UL LI").size() > 0 &&
            location.search !== "" &&
            location.search.indexOf("dlid=") !== -1
        ) {
            var ankerToShow = $("#" + location.search.replace(/\?.*?[&\?]?dlid=([^&\?]*)&?.*?$/i, "$1")).css("font-weight", "bold");
            if (ankerToShow.size() > 0) {
                //                        A          LI       UL              LI
                var ancestorElement = ankerToShow.parent().parent().show().parent().addClass("open");
                while (ancestorElement.tagName() === "li" || ancestorElement.tagName() === "ul") {
                    if (ancestorElement.tagName() === "lis") {
                        ancestorElement.addClass("open");
                    } else { // "UL"
                        ancestorElement.show();
                    }
                    ancestorElement = ancestorElement.parent();
                }
            }
        }

    }
);

$(window).load(
    function(){
        /*  */
        // ContentImages in Content with caption / legend needs a width fix
        // found @http://www.blogrammierer.de/jquery-bildbreite-ermitteln-um-bildunterschriften-korrekt-darzustellen/
        $(".ContentImage").each(
            function(){
                var width = $(this).children(".ContentImageWrapper").children("IMG").width() || $(this).children(".ContentImageWrapper").children("A").children("IMG").width();
                $(this).css("width", width);
                $(this).children("SPAN").css("width", width - $(this).children("DIV.fancybox").width() - 1);
            }
        );
        /*  */
    }
);

$(document).unload(
    function () {
        bsr.wasteManagement.googleMapsTools.bsrMap.GUnload();
    }
);
