var lindab;
var override = false;

if(typeof(isIE6) == "undefined") {
  isIE6 = false;
}
if(typeof(isIE7) == "undefined") {
  isIE7 = false;
}
if(typeof(isIE8) == "undefined") {
  isIE8 = false;
}

// Protect your $
(function($)
{
  // Lindab specific functions
  lindab = $.lnd = {
    
    // VARS
    vars: {
      list: {},
      set: function(key, fn) {
        this.list[key] = fn;
      },
      get: function(key) {
        return this.list[key];
      }
    },
    
    // STATES
    states: {
      list: {},
      set: function(key, fn) {
        this.list[key] = fn;
      },
      get: function(key) {
        return this.list[key];
      }
    },
    
    // UTILS
    utils: {
      /*
       * 
       */
      isString: function(rule, value) {
        var rules = {
          empty: function(val) {
            return !(val && val != '') || false;
          }  
        };
        if(rule == 'EMPTY') {
          return rules.empty(value);
        } else if(rule = 'NOT_EMPTY') {
          return !rules.empty(value);
        }
      },
      /*
       * 
       */
      log: function() {
        if(!lindab.states.get('debug')) return;
        if(typeof(console) != "undefined") {
	        console.log(arguments);
				}
      }
    },
    
    // BOOKMARKS
    bookmark: {
      hash: function(prefix, data) {
        
        return prefix + this.serialize(data);
      },
      serialize: function(data) {
        var arr = [];
        var seperator = ':';
        $.each(data, function(key, val) {
          arr.push(key + seperator + val)
        }); 
        return arr.join(';');
      },
      unSerialize: function(prefix, hash) {
        hash = hash.replace(prefix, '');
        var data = {};
        var arr = hash.split(';');
        $.each(arr, function(index, key) {
          var item = key.split(':');
          data[item[0]] = item[1]; 
        });
        return data;
      },
      add: function(container, item) {
        
        var bookmarkData = container.metadata().bookmarkData;
        var itemBookmarkData = item.metadata().bookmarkData;
        var hash = this.hash(bookmarkData.prefix, itemBookmarkData);
        
        jQuery.history.load(hash);
        
      }
    },
    // AJAX
    ajax: {
      events: {
        list: {},
        set: function(key, fn) {
          this.list[key] = fn;
        },
        get: function(key) {
          return this.list[key];
        }
      },
      /*
       * 
       */
      request: function(data) {
        
        // setup default values for a ajax request 
        var defaults = {
            type: 'get',
            data: {},
            dataType: 'json',
            url: '',
            callback: null,
            element: null
        };
        
        // get metadata from element and extend default options
        var options = $.extend(defaults, data);
				
        // if no valid url is passed return.
        if(lindab.utils.isString('EMPTY',options.url)) return;
        
        // exec ajax request
        $.ajax({
          data: options.data,
          dataType: options.dataType,
          type: options.type,
          url: options.url,
          cache: window.isAuth === undefined,
          success: function(response) {
            // Debug request
            lindab.utils.log('ajax.linkHandler','Request sucessful', options, response);
            
            // if callback is a string look for it in the callback list.
						if(typeof(lindab.ajax.events.get(options.callback)) == "function") {
	            if(options.callback) {
                lindab.ajax.events.get(options.callback).call(this, options, response);
              }
              
            }
            
          }
        });
      }
    },
    
    guides: {
			stripListHTML: function(html) {
				var tmp = document.createElement("DIV");
				tmp.innerHTML = html;
				return tmp.textContent || tmp.innerText;
			},
    	parseGuideList: function() {
    		var chunk = $($(".guide-view-content").outerHtml());
    		var output = '';
    		
    		$.each($("*",chunk), function(key,val) {
    			val = $(val);
    			if(val.is("tbody tr")) {
		    		var image = val.find(".image").html();
		    		var name = val.find(".name").html();
		    		var code = val.find(".code").html();
		    		var num = val.find(".num").html();
		    		if(name) {
		    			output += $.trim(name);
		    		}
		    		if(code) {
		    			output += ' - ' + $.trim(code);
		    		}
		    		if(num) {
		    			output += ': ' + $.trim(num);
		    		}
		    		if(image) {
		    			output += '<br />' + $.trim(image);
		    		}
                    output += '<br /><br />';
    			} else if(val.is("h3")) {
    				output += '<h2>' + $.trim(val.text()) + '</h2><br /><br />';
    			}
    		});
    		
    		var price = chunk.find(".estimated-cost");
    		if(price.exists()) {
    			output += '<h2>' + price.find("span:first").text() + '</h2><br />';
    			output += price.find("h2:first").text();
    		}
    		
    		return output;
    	}
    },
    
    // Search
    autocomplete: {
      
      config: {
        cache: {},
        timer: false,
        interval: 500,
        limit: 2,
        index: false
      },
      
      init: function() {
        
        var self = this;
        
        this.loadingImage = $('<img class="lnd-loading-image" src="' + lindab.vars.get('guipath') + 'img/loader-anim-16x16-blue.gif"/>').hide();
        this.closeImage = $('<img class="lnd-close-image" src="' + lindab.vars.get('guipath') + 'img/icon-close-small.gif"/>').hide();
        $('#lnd-quicksearch').append(this.loadingImage, this.closeImage);
        
        self.bind();
       
      },
      bind: function() {
        var input = document.getElementById("lnd-quicksearch-field");
        var search = $(input);
        var fieldset = $('#lnd-quicksearch');
        var submitbutton = fieldset.find(".lnd-input-submit input");
        var self = this;
        var timer;
        var interval = self.config.interval;
        var limit = self.config.limit;
        var lastVal;
        search.attr('autocomplete', 'off');

        this.closeImage.click(function() {
          self.close();
        });
        
        search.bind("submitForm",function() {
          var field = $(this);
          var options = field.metadata();
          var url = options.searchurl;
          var param = options.param;
          var inputval = field.val();
          if(inputval == input.defaultValue) {
            return false;
          } else if(!inputval || inputval == "" || inputval == null) {
            return false;
          }
          var val = $.trim(field.val());
          $.gotoURL(url + "?" + param + "=" + val);
        });
        
        submitbutton.click(function() {
          search.trigger("submitForm");
          return false;
        });

        $(window).click(function(event) {
          var target = event.target;
          if( $(target).parents('#lnd-quicksearch:eq(0)').length == 0 ) self.close();          
        });
        fieldset.keydown(function(event) {
          var keyCode = event.which;
          var key = {
              27: {
                name: 'ESCAPE'
              },
              13: {
                name: 'ENTER'
              },
              38: {
                name: 'UP'
              },
              40: {
                name: 'DOWN'
              }
          }
          if(keyCode in key) {
            return self.handleKeys(key[keyCode]);
          }
        });
        search.keyup(function(event) {
          var val = $.trim(search.val());
          var length = val.length;
          // clear timeout
          clearTimeout(timer);
          if(length < limit) {
            self.clear();
          } else if(length >= limit) {
            timer = setTimeout(function() {
              if(val != lastVal) self.search(val);
              lastVal = val;
            }, interval);
          }
        });
      },
      close: function() {
        $('#lnd-quiksearch-autocomplete').slideUp();
        if(this.closeImage.is(':visible')) this.closeImage.hide();
      },
      show: function() {
        var container = $('#lnd-quiksearch-autocomplete');
        if(container.is(':hidden')) container.slideDown();
        if(this.closeImage.is(':hidden')) this.closeImage.fadeIn();
      },
      clear: function() {
        this.render('');
        this.close();
      },
      search: function(term) {
        var data = $('#lnd-quicksearch-field').metadata();
        var url = data.url; //'/ajax/ajax-autocomplete.php';
        var key = data.param;
        var self = this;
        var cache = self.config.cache;
        // show loading animation
        self.closeImage.hide();
        self.loadingImage.fadeIn();
        // check for term in search cache, if found render and return
        if(term in cache) {
          self.render(cache[term]);
          return;
        }
        var params = {};
        params[key] = term;
        // term is not found in cache, make the json call and render results
        $.getJSON(url, params, function(data) {
          cache[term] = data.html;
          self.render(data.html);
        });
        
      },
      render: function(html) {
        var self = this;
        var target = $('#lnd-quiksearch-autocomplete');
        if(!target.is(".abort")) {
	        target.html(html);
	        this.config.index = false;
	        this.listItems = $('#lnd-quiksearch-autocomplete').find('li:not(.header)');
	        this.listItems.hover(function() {
	          $(this).addClass('selected');
	          self.config.index = $(this).index();
	        },
	        function() {
	          $(this).removeClass('selected');
	        }).click(function() {
	          var link = $(this).find('a:first');
	          $.gotoURL(link.attr("href"));
	          return false;
	        });
	        this.loadingImage.hide();
	        this.show();
        }
      },
      
      getNextIndex: function(key, index, length) {
        var first = 0;
        var last = (length - 1)
        if(key == 'UP') {
          if(index === false) return last;
          index--;
          if(index < 0) index = last;
        } else {
          if(index === false) return first;
          index++;
          if(index == length) index = first;
        }
        return index;
      },
      
      handleKeys: function(key) {
        if(key.name == 'ENTER') {
          var selecteditem = $('#lnd-quiksearch-autocomplete .selected');
          if(selecteditem.exists()) {
            var link = selecteditem.find('a:first');
            $.gotoURL(link.attr("href"));
          } else {
          	$('#lnd-quiksearch-autocomplete').addClass("abort");
            $('#lnd-quicksearch-field').trigger("submitForm");
          }
          return false;
          //return;
        } else if(key.name == 'ESCAPE') {
          this.close();
          return;
        } else {  
          var index = this.getNextIndex(key.name, this.config.index,  this.listItems.length);
          this.listItems.removeClass('selected');
          this.listItems.eq(index).addClass('selected');
          this.config.index = index;
        }
        return false;
      }
    },
    
    // Map
    maps: {
      
      // If this flag is true a search will be made on the google maps 'idle' event
      searchOnIdleEvent: false,

      searchWithinCountry: false,

      init: function() {
        
        $('.show-on-map').live('click', function () {
            var val = $(this).parent().find('.group-title').text();
            lindab.maps.search.makeGoogleMapsSearch(val);
        });

        var parent = $("#lnd-finddealer");
        var search = $("#dealersearch-term");
        search.attr("autocomplete","off");
        
        this.imagePath;
        
        // Set the map to shop europe as default
        var myLatlng = new google.maps.LatLng(55, 15);
        var myZoom = 3;

        var letGoogleSetCountryBounds = true;
        
        var metaData = parent.metadata();
        var initViewCountry = metaData.initViewCountry;
        var initViewLat = metaData.initViewLat;
        var initViewLng = metaData.initViewLng;
        var initViewZoom = metaData.initViewZoom;
        if (initViewCountry != '' && initViewLat && initViewLng && initViewZoom) {
            // A country is set with preferred position and zoom
            myLatlng = new google.maps.LatLng(initViewLat, initViewLng);
            myZoom = initViewZoom;
            letGoogleSetCountryBounds = false;
        }

        this.options = {
          scrollwheel: false,
          zoom: myZoom,
          center: myLatlng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        }

        this.map = new google.maps.Map(document.getElementById("mapCanvas"), this.options);

        if (initViewCountry != '' && letGoogleSetCountryBounds) {
            lindab.maps.findAddress(initViewCountry, function (results) {
                lindab.maps.centerMapAndFitBounds(results);
                lindab.maps.searchWithinCountry = true;
            });
        }

        // Add google maps event listeners
        google.maps.event.addListener(this.map, 'dragstart', function () {
            lindab.maps.list.stopRenderListLoop();
        });
        lindab.maps.searchOnIdleEvent = false;
        google.maps.event.addListener(this.map, 'idle', function() {
            if (lindab.maps.searchOnIdleEvent) {
                lindab.maps.searchOnIdleEvent = false;
                lindab.maps.search.makeSearch();
            }
        });
        google.maps.event.addListener(this.map, 'dragend', function() {
            lindab.maps.searchOnIdleEvent = true;
        });
        google.maps.event.addListener(this.map, 'zoom_changed', function() {
            lindab.maps.searchOnIdleEvent = true;
        });


        // bind search  button
        this.search.bind();
        
        // Make a search when changing category in the category selection
        $('#dealersearch-category').change(function () {
            lindab.maps.search.makeSearch();
        });

        // Init the list
        lindab.maps.list.init();

      },
      
      markers: {
          
          clearMarkers: function (dealers) {
             for (var i in dealers) {
                dealers[i].marker.setMap(null);
             }
          },

          renderMarkers: function (dealers) {
             var guiPath = lindab.vars.get('guipath');
             
             for (var i in dealers) {
                var official = dealers[i].IsLindabBranch == "true";
                var image = (official) ? 'img/maps/marker-official.png': 'img/maps/marker.png';

                var marker = new google.maps.Marker({
                    map: lindab.maps.map,
                    position: new google.maps.LatLng(dealers[i].Latitude, dealers[i].Longitude),
                    icon: guiPath + image
                });

                dealers[i].marker = marker;
             }
             
             return dealers;
          },

          addListener: function (marker, listElement) {
             google.maps.event.addListener(marker, 'click', function() {
                listElement.trigger('click');
             });
          }

      },

      map: {
        // The dealers that are going to be rendered on the map
        dealersToRender: []
      },

      list: {

        renderListLoop: null,
        
        // All dealers in the map
        dealers: [],

        // Dealers that are rendered in the list
        renderedDealers: [],

        // A flag to set if the overlay should be keft after a search
        keepOverlayAfterSearch: false,

        formatDealerArray: function (data) {
            var d = [];
            
            for (var i=0; i<data.length; i++) {
                var region = data[i];
                for (var j=0; j<region.dealers.length; j++) {
                    var dealer = region.dealers[j];
                    var index = dealer.Id;
                    d[index] = dealer;
                    d[index].regionIndex = region.Region; // The region name is the index for regions
                    d[index].Region = region.Region;
                    d[index].Index = index;
                }
            }

            return d;
        },

        // Returns the dealers that is present in the newData and not in the oldData
        getDealerListDiff: function (oldData, newData) {
            var diff = [];
            for (var i in newData) {
                if (!oldData[i]) {
                    diff[i] = newData[i];
                }
            }

            return diff;
        },

        scrollTo: function(elem) {
            var list = $('#mapList');
            var height = list.height();
            var scrollTop = list.scrollTop();
            var min = scrollTop;
            var max = min + height;
            var top = min + elem.position().top;

            if(top < min || top > max) {
                list.scrollTop(top);
            }
        },

        elementToScrollTo: undefined,

        scrollToSelected: function () {
            if (lindab.maps.list.elementToScrollTo) {
                lindab.maps.list.scrollTo(lindab.maps.list.elementToScrollTo);
            }
        },

        init: function () {
            lindab.maps.list.bind();
        },

        bind: function () {
            $('#mapList .location').live('click', function () {
                var self = $(this);
                if (!self.hasClass('selected')) {
                    lindab.maps.list.clearSelected();
                    lindab.maps.overlay.render(self);
                    self.addClass('selected');
                
                    var data = self.metadata();
                    var dealerIndex = data.dealerIndex;
                    var dealer = lindab.maps.list.dealers[dealerIndex];

                    lindab.maps.list.keepOverlayAfterSearch = true;
                    lindab.maps.panToPoint(dealer.marker.getPosition());

                    // Store the element so we can scroll to it when all locations are rendered in the list
                    lindab.maps.list.elementToScrollTo = self;

                    dealer.marker.setZIndex(google.maps.Marker.MAX_ZINDEX+1);

                    // Change the marker icon to a selected icon
                    if (data.official) {
                        dealer.marker.setIcon(lindab.vars.get('guipath') + 'img/maps/marker-official-marked.png');
                    } else {
                        dealer.marker.setIcon(lindab.vars.get('guipath') + 'img/maps/marker-marked.png');
                    }
                }
            });
        },

        clearSelected: function () {
            $('#mapList .selected').each(function () {
                var sel = $(this);
                var data = sel.metadata();
                var dealerIndex = data.dealerIndex;
                var dealer = lindab.maps.list.dealers[dealerIndex];
                
                if (dealer && dealer.marker) {
                    
                    // Set the z-index to a lower value than the selected z-index has
                    dealer.marker.setZIndex(google.maps.Marker.MAX_ZINDEX);

                    if(data.official) {
                        dealer.marker.setIcon(lindab.vars.get('guipath') + 'img/maps/marker-official.png');
                    } else {
                        dealer.marker.setIcon(lindab.vars.get('guipath') + 'img/maps/marker.png');
                    }
                }

                sel.removeClass('selected');
            });

        },

        removeDealersLoop: null,

        removeRegionsLoop: null,

        stopRemoveDealersLoop: function () {
            if (lindab.maps.list.removeDealersLoop) {
                clearTimeout(lindab.maps.list.removeDealersLoop);
            }
        },

        stopRemoveRegionsLoop: function () {
            if (lindab.maps.list.removeRegionsLoop) {
                clearTimeout(lindab.maps.list.removeRegionsLoop);
            }
        },

        removeDealersDelay: function (dealers, time) {
            lindab.maps.list.removeDealersLoop = setTimeout( function () {
                var nr = 30;
                for (var i in dealers) {
                    var d = dealers[i];
                    
                    var item = $('#mapList #' + d.Index);
                    // Check if it exists in the list, because it might have been removed when removing regions
                    if (item.length > 0) {
                        item.remove();
                    }
                    delete lindab.maps.list.renderedDealers[d.Index];
                    delete dealers[i];

                    nr--;
                    if (nr <= 0) {
                        break;
                    }
                }

                if (nr <= 0) {
                    lindab.maps.list.removeDealersDelay(dealers, 50);
                } else {
                    // Scroll to the selected element in the list
                    lindab.maps.list.scrollToSelected();
                }
                
            }, time);
        },

        // Removes regions from the list that are no longer on hte map. When this is done the
        // dealers that are in the list but not on the map are removed
        // @param regionsInList - the regions in the list to compare with the regions in the map
        //                        so we can know which regions to remove
        // @param regionsToKeep - the regions that should be on the map
        // @param dealers - the dealers to remove when finished removing the regions
        removeRegionsDelay: function (regionsInList, regionsToKeep, dealers, time) {
            lindab.maps.list.removeRegionsLoop = setTimeout( function () {
                var nr = 30;
                for (var i in regionsInList) {
                    if (!regionsToKeep[i]) {
                        regionsInList[i].remove();
                    }
                    delete regionsInList[i];

                    nr--;
                    if (nr <= 0) {
                        break;
                    }
                }

                if (nr <= 0) {
                    lindab.maps.list.removeRegionsDelay(regionsInList, regionsToKeep, dealers, 50);
                } else {
                    // All regions that are no longer on the map are removed
                    // now let´s remove the dealers that are no longer on the
                    // map but are in the same regions as on the map
                    lindab.maps.list.removeDealersDelay(dealers, 0);
                }
            }, time);
        },

        // Removes dealers from the list
        // @param dealers - the dealers to remove
        // @param regionsToKeep - the regions that should be on the map
        removeDealers: function (dealers, regionsToKeep) {
            var regionsInList = [];
            $('#mapList .group').each(function () {
                var self = $(this);
                var meta = self.metadata();
                regionsInList[meta.groupIndex] = self;
            });
            lindab.maps.list.stopRemoveDealersLoop();
            lindab.maps.list.stopRemoveRegionsLoop();
            lindab.maps.list.removeRegionsDelay(regionsInList, regionsToKeep, dealers, 25);
        },

        renderListDelay: function (timeout) {
        
            lindab.maps.list.renderListLoop = setTimeout(function () {
                var max = 30;

                while (max > 0 && lindab.maps.map.dealersToRender.length > 0) {
                    
                    var dealer = lindab.maps.map.dealersToRender.shift();
                    // Get the dealer from the dealers list because that is where
                    // the marker including the marker click callback is set
                    dealer = lindab.maps.list.dealers[dealer.Index];

                    var regionElement = null;

                    $('#mapList .group').each(function () {
                        var self = $(this);
                        var meta = self.metadata();
                        if (meta.groupIndex == dealer.regionIndex) {
                            regionElement = self;
                        }
                    });

                    if (regionElement == null) {
                        // Render a new region
                        regionElement = $("#findadealer-list-group").tmpl(dealer);
                        regionElement.appendTo("#mapList");
                    }

                    var element = $("#findadealer-list-location").tmpl(dealer);
                    element.appendTo(regionElement);
                    lindab.maps.markers.addListener(dealer.marker, element);
                    lindab.maps.list.renderedDealers[dealer.Index] = dealer;

                    max--;
                }

                if (max <= 0) {
                    lindab.maps.list.renderListDelay(50);
                } else {
                    // We´re finnished rendering the list
                    // Scroll to the selected element in the list
                    lindab.maps.list.scrollToSelected();
                }

            }, timeout);

        },

        stopRenderListLoop: function () {
            if (lindab.maps.list.renderListLoop) {
                clearTimeout(lindab.maps.list.renderListLoop);
            }
        }

      },

      search: {
        
        makeSearch: function() {
            
            if (lindab.maps.list.keepOverlayAfterSearch) {
                lindab.maps.list.keepOverlayAfterSearch = false;
            } else {
                lindab.maps.overlay.close();
                lindab.maps.list.clearSelected();
            }

            // Stop any ongoing search result listing
            lindab.maps.list.stopRenderListLoop();
            // Stop any ongoing dealer deletion from the list
            lindab.maps.list.stopRemoveDealersLoop();
            lindab.maps.list.stopRemoveRegionsLoop();
            
            // Get the upper left and lower right coordinates and the category
            // to send the search-query to the server
            var cat = $('#dealersearch-category option:selected').first().val();
            bounds = lindab.maps.map.getBounds();
            var nE = bounds.getNorthEast();
            var sW = bounds.getSouthWest();
            
            var url = $("#lnd-finddealer").metadata().url;

            if (cat == '0') {
                cat = '';
            }

            url += '?lat1=' + sW.lat() + '&lng1=' + sW.lng() + '&lat2=' + nE.lat() + '&lng2=' + nE.lng() + '&cat=' + cat;

            if (lindab.maps.searchWithinCountry || $("#lnd-finddealer").metadata().dealerSearchWithinCountry) {
                var country = $("#lnd-finddealer").metadata().initViewCountry;
                url += '&filterCountry=' + country;
                lindab.maps.searchWithinCountry = false;
            }

            lindab.ajax.request({
                url: url,
                callback: 'mapslist-init'
            });

        },

        makeGoogleMapsSearch: function (val) {
            // Make a google maps search with the search word
            lindab.maps.findAddress(val, function (results) {
                lindab.maps.centerMapAndFitBounds(results);
                lindab.maps.searchOnIdleEvent = true;
                // The search will be made when the google maps 'idle' event fires
            });
        },

        handleSearchResult: function(data) {
            var regionsToKeep = [];
            var sortIndex = 0;
            for (var i=0; i<data.length; i++) {
                if (data[i].Region == '') {
                    data[i].Region = 'FIND_A_DEALER_EMPTY_REGION';
                }
                regionsToKeep[data[i].Region] = data[i].Region;
                
                // Set a sortIndex on the dealers so they are rendered in teh same order they appear in the json fron the server
                for (var j=0; j<data[i].dealers.length; j++) {
                    data[i].dealers[j].sortIndex = sortIndex;
                    sortIndex++;
                }
            }

            // Format the return data into an optimized format
            var newDealers = lindab.maps.list.formatDealerArray(data);

            // Get the new dealers to add to the list
            var addToListDealers = lindab.maps.list.getDealerListDiff(lindab.maps.list.renderedDealers, newDealers);
            // Get the new dealers to add to the map
            var addToMapDealers = lindab.maps.list.getDealerListDiff(lindab.maps.list.dealers, newDealers);

            // Get the dealers that are no longer on the map
            var removeDealers = lindab.maps.list.getDealerListDiff(newDealers, lindab.maps.list.dealers);

            // Remove markers
            for (var i in removeDealers) {
                delete lindab.maps.list.dealers[i];
            }
            
            // Remove dealers from the map
            lindab.maps.markers.clearMarkers(removeDealers);

            if (data.length == 0) {
                lindab.maps.list.renderedDealers = [];
                var noResult = $('#findadealer-no-search-result').tmpl();
                $("#mapList").html(noResult);
            } else {
                $('#mapList .lnd-noresult').remove();
            
                // Remove dealers from the list
                lindab.maps.list.removeDealers(removeDealers, regionsToKeep);

                // Render the new markers on the map
                addToMapDealers = lindab.maps.markers.renderMarkers(addToMapDealers);
            
                for (var i in addToMapDealers) {
                    lindab.maps.list.dealers[i] = addToMapDealers[i];
                }

                // Render the list
                lindab.maps.map.dealersToRender = [];
                for (var i in addToListDealers) {
                    lindab.maps.map.dealersToRender[addToListDealers[i].sortIndex] = addToListDealers[i];
                }
                lindab.maps.list.renderListDelay(0);
            }
        },

        bind: function() {
          
          var self = this;
          
          lindab.ajax.events.set('mapslist-init', function (options, data) {
            lindab.maps.search.handleSearchResult(data);
          });
          
          var submit = $('#dealersearch-submit').click(function() {
            var target = $("#mapList");
            var input = document.getElementById("dealersearch-term");
            var val = $(input).val();
            lindab.maps.search.makeGoogleMapsSearch(val);
            
            return false;
          });
          
          $('#dealersearch-term').keydown(function(e) {
            if(e.which == 13) {
              submit.trigger('click');
              return false;
            }
          });

        }
      },
      
      findAddress: function(address, callback) {
        if (!lindab.maps.geocoder) {
            lindab.maps.geocoder = new google.maps.Geocoder();
        }
        
        lindab.maps.geocoder.geocode( { 'address': address, 'bounds': lindab.maps.map.getBounds() }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            if (callback) {
                callback(results);
            }
          } else {
            // This place was not found
            lindab.maps.search.handleSearchResult([]);
            lindab.maps.overlay.close();
          }
        });
      },
      
      // results as returned from findAddress(...)
      centerMapAndFitBounds: function(results) {
        if (results) {
            // Center the map at the first location in the results
            var location = results[0].geometry.location;
            lindab.maps.map.setCenter(location);

            var viewPort = results[0].geometry.viewport;
            if (viewPort) {
                lindab.maps.map.fitBounds(viewPort);
            }
        }
      },

      panToPoint: function(point) {
        // Make sure a search is made after the pan
        lindab.maps.searchOnIdleEvent = true;
        this.map.panTo(point);
      },
      
      overlay: {
        render: function(elem) {
          var overlay = $('#mapOverlay').empty();
          var dealerIndex = $(elem).metadata().dealerIndex;
          var element = $("#findadealer-map-overlay").tmpl(lindab.maps.list.renderedDealers[dealerIndex]);

          overlay.html(
              $(element).html()
          );
          overlay.fadeIn();
        },
        close: function() {
          var overlay = $('#mapOverlay');
          overlay.hide();
        }
      }
      
    },
    
    // USER INTERFACE
    ui: {
			translation: {
				getTranslation: function(string) {
					return lndTranslations[lndLanguage][string];
				}
			},
			animation: {
				animateResultModules: function(mods,count) {
			    if(!count) {
			      count = 0;
			    }
			    var ml = mods.length;
			    var mod = $(mods[count]);
			    count++;
			    mod.fadeIn(120,"easeOutCubic",function() {
			      lindab.ui.animation.animateResultModules(mods,count);
			    });
				}
			},
      tools: {
        minitip: function(elem) {
          var parent = elem;
          var tip = $('<div id="lnd-minitip" class="lnd-minitip"><p class="lnd-tipcontents"></p></div>');
          var ppos = null;
          var showMiniTip = function() {
            ppos = parent.offset();
            if(parent.data("minitip")) {
              tip = parent.data("minitip");
            } else {
              var tiptext = parent.metadata().tiptext;
              tip.find(".lnd-tipcontents").html(tiptext);
              tip.css("top",(ppos.top+27));
              parent.data("minitip",tip);
            }
            $("#document").append(tip);
            var tw = tip.width();
            tip.css("left",(ppos.left-tw)+27);
          }
          var hideMiniTip = function() {
            tip.remove();
          }
          parent.hover(function() {
            showMiniTip();
          },function() {
            hideMiniTip();
          });
        },
        stockinfo: function(elem) {
          var parent = elem;
          
          if(!parent.exists()) { 
            return false;
          } 
          
          var metaurl = parent.metadata().stockURL;
          lindab.ajax.request({
            url: metaurl,
            callback: 'stockdata-callback',
            element: parent
          });
        },
        areaselector: function(elem) {
          var parent = elem;
          
          var areas = parent.find(".lnd-areas");
          var tabs = parent.find(".lnd-areatabs");
          var arrow = tabs.find(".lnd-area-arrow");
          var links = tabs.find(".lnd-selector .lnd-link");
          
          var slidetime = 5000; 
          
          var singleInit = function() {
            setTimeout(function() {
              parent.hide().removeClass("lnd-module-areaselector-init").fadeIn(1000);
            }, 1000);
          }
          
          var moveArrow = function(color) {
            arrow.find(".lnd-area-arrow-inner").css("background-color",color);
            tabs.find(".lnd-selector-active").prepend(arrow);
          };
          
          var initSelector = function() {
            var time = parent.metadata().slideTimeoutSeconds;
            if(time) {
              slidetime = (time*1000);
            } else {
              slidetime = 8000;
            }
            var count = areas.find(".lnd-area").length;
            if(count > 1) {
							setTimeout(function() {
	              var random = (Math.floor(Math.random()*count+1)-1);
	              parent.addClass("lnd-module-areaselector-loop");
	              tabs.find(".lnd-selector:eq("+random+") .lnd-link").trigger("triggerClick");
            	}, 1000);
            }
          }
          
          var nextArea = function() {
            if(parent.is(".lnd-module-areaselector-loop")) {
              var count = (areas.find(".lnd-area").length-1);
              var position = tabs.find(".lnd-selector-active").index();
              if((position+1) > count) {
                tabs.find(".lnd-selector:first .lnd-link").trigger("triggerClick");
              } else {
                tabs.find(".lnd-selector-active").next().find(".lnd-link").trigger("triggerClick");
              }
							return false;
            }
          }
          
          parent.hover(function() {
          	$(this).addClass("lnd-module-areaselector-pause");
          }, function() {
          	$(this).removeClass("lnd-module-areaselector-pause");
          });
          
          links.click(function() {
          	parent.removeClass("lnd-module-areaselector-loop lnd-module-areaselector-pause");
            if(parent.hasClass("inmotion")) {
            	return false;
            }
            var innerparent = $(this).parent();
            if(innerparent.is(".lnd-selector-active")) { return false; }
            parent.addClass("inmotion");
            $(this).trigger("triggerClick");
            return false;
          });
          
          links.bind("triggerClick",function() {
          	if(!parent.is(".lnd-module-areaselector-pause:not('.lnd-module-areaselector-init')")) {
          		
	          	var ah = areas.outerHeight();
	          	var th = tabs.outerHeight();
	          	var oh = ah + th;
	          	parent.css("height",oh);
	            var link = $(this);
	            var color = link.metadata().color;
	            var bordercolor = "#E0E0E0";
	            if(!color) {
	              color = "#1E83D7";
	            }
	            var areatarget = ".lnd-area-" + $(this).metadata().target;
	            var tabtarget = ".lnd-selector-" + $(this).metadata().target;
	
							var newarea = areas.find(areatarget);
							var currentarea = areas.find(".lnd-area-active"); 
							
							// First run
	            if(parent.is(".lnd-module-areaselector-init")) {
	            	parent.hide().removeClass("lnd-module-areaselector-init").fadeIn(1000);
		            areas.find(".lnd-area-active").removeClass("lnd-area-active");
		            areas.find(areatarget).addClass("lnd-area-active");
	            } else {
	            	// Looping
	            	newarea.addClass("lnd-area-onnext").css("opacity",1.0);
		            currentarea.css("opacity",1.0).fadeTo(1200,0,function() {
			            newarea.removeClass("lnd-area-onnext").addClass("lnd-area-active");
		            	currentarea.removeClass("lnd-area-active");
			            parent.removeClass("inmotion");
		            });
	            }
	
	            tabs.find(".lnd-selector-active").removeClass("lnd-selector-active").css("border-top-color",bordercolor).css("border-right-color",bordercolor).css("border-left-color","#FFF");
	            tabs.find(".lnd-selector-first").css("border-left-color",bordercolor);
	            tabs.find(tabtarget).addClass("lnd-selector-active").css("border-top-color",color).css("border-color",color);
	
	            links.css("background-color","transparent");
	            link.css("background-color",color);
	
	            moveArrow(color);
          	}

            if(parent.is(".lnd-module-areaselector-loop")) {
		          setTimeout(function() {
		            nextArea();
		          },slidetime);
	          }
	          return false;
          });
          
          if(parent.exists()) { 
						if(parent.is(".lnd-module-areaselector-one")) {
            	singleInit();
          	} else {
          		initSelector();
          	}
          }
          return false;
	        
        },
        mediatabs: function(elem) {
          if(elem.exists()) {
            var elem = elem;
            var options = elem.metadata();
            var tabshtml = $('<ul class="lnd-mediatabs"></ul>');
            var inittabs = function() {
              var tabsinner = '';
              if(options.rotateSWF) {
                tabsinner += '<li class="lnd-mediatab lnd-mediatab-rotate"><a href="#" class="lnd-media-rotate">'+lindab.ui.translation.getTranslation("rotate")+'</a></li>';
              }
              if(options.videoSWF) {
                tabsinner += '<li class="lnd-mediatab lnd-mediatab-video"><a href="#" class="lnd-media-video">'+lindab.ui.translation.getTranslation("video")+'</a></li>';
              }
              tabsinner += '<li class="lnd-mediatab lnd-mediatab-images"><a href="#" class="lnd-media-images lnd-media-active">'+lindab.ui.translation.getTranslation("images")+'</a></li>';
              tabshtml.html(tabsinner);
              tabshtml.find(".lnd-mediatab:first").addClass("lnd-mediatab-first");
              tabshtml.find(".lnd-mediatab:last").addClass("lnd-mediatab-last");
              bindClickEvents();
              elem.wrapInner('<div class="imagemedia"></div>');
              elem.prepend(tabshtml);
            }
            var bindClickEvents = function() {
  
              var defaultwidth = 700;
              var defaultheight = 394;
              var flashversion = "9";
              var teaser = lindab.vars.get('guipath') + "img/asset-movieoverlay.gif";
              
              tabshtml.find("a").click(function() {
                
                if($(this).is(".lnd-media-active")) { 
                  return false; 
                } else {
                  elem.find(".lnd-media-active").removeClass("lnd-media-active");
                  $(this).addClass("lnd-media-active");  
                }
                
                var flashvars = {};
                var params = {};
                var attributes = {};

                if($(this).is(".lnd-media-images")) {
                  // IMAGES
                  elem.removeClass("lnd-module-mediatabs-active");
                  elem.find(".flashmedia").remove().end().find(".imagemedia").show();
                  return false;
                } else if($(this).is(".lnd-media-rotate")) {
                  // ROTATE
                  elem.find(".imagemedia").hide().end().find(".flashmedia").remove();
                  elem.append($('<div class="rotatemedia flashmedia"><div id="rotatemedia"></div></div>'));
                  var movietarget = "rotatemedia";
                  
                  var movieheight = options.rotateSWF["height"];
                  if(!movieheight) {
                    movieheight = defaultheight;
                  }
                  var moviewidth = options.rotateSWF["width"];
                  if(!moviewidth) {
                    moviewidth = defaultwidth;
                  }
                  
                  flashvars.mediaURL = options.rotateSWF["url"];
                  
                } else {
                  // VIDEO
                  elem.find(".imagemedia").hide().end().find(".flashmedia").remove();
                  elem.append($('<div class="videomedia flashmedia"><div id="videomedia"></div></div>'));
                  var movietarget = "videomedia";
                  
                  var movieheight = options.videoSWF["height"];
                  if(!movieheight) {
                    movieheight = defaultheight;
                  }
                  var moviewidth = options.videoSWF["width"];
                  if(!moviewidth) {
                    moviewidth = defaultwidth;
                  }
                  
                  flashvars.mediaURL = options.videoSWF["url"];
                }

                flashvars.controlColor = "0x0776d3";
                flashvars.showTimecode = "false";
                flashvars.showScalingButton = "false";
                flashvars.controlBackColor = "0xFFFFFF";
                flashvars.teaserURL = teaser;
                flashvars.autoPlay = "true";
                flashvars.defaultVolume = "50";
                flashvars.controlsEnabled = "true";
                
                params.wmode = "transparent";
                
                if(moviewidth < 700 || movieheight < 394) {
                  flashvars.teaserURL = lindab.vars.get('guipath') + "img/asset-movieoverlay-small.gif"
                  var target = elem.find(".flashmedia");
                  var moviepos = $('<div class="moviepos"></div>');
                  moviepos.css("height",movieheight);
                  moviepos.css("width",moviewidth);
                  moviepos.css("margin-left",0-(moviewidth/2));
                  moviepos.css("margin-top",0-(movieheight/2));
                  target.addClass("flashmedia-small").wrapInner(moviepos);
                }
                
                elem.addClass("lnd-module-mediatabs-active");
                if(swfobject.hasFlashPlayerVersion(flashversion)) {
                  swfobject.embedSWF(lindab.vars.get('guipath') + "swf/NonverBlaster.swf", movietarget, moviewidth, movieheight, flashversion, lindab.vars.get('guipath') + "swf/expressinstall.swf", flashvars, params, attributes);
                } else {
                  var fallback = $('<p class="lnd-noflash"></p>');
                  fallback.html(lindab.ui.translation.getTranslation("needflash"));
                  $("#" + movietarget).html(fallback);
                }
                return false;
              });
            }
            inittabs();
          }
        },
        inlineFormHandler: function(elem) {
          var validate = elem.metadata().validate;
          var performvalidation = false;
          var validateEmail = function(string) {
            // contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
            return /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(string);
          };
          var validateEmpty = function(string) {
            if(lindab.utils.isString('EMPTY',string)) {
              return false;
            } else {
              return true;
            }
          };
          var validateForm = function(modalform) {
            if(!modalform) {
              modalform = false;
            }
            var sendform = true;
            var messages = elem.metadata().errors;
            var errorelem = $('<p class="lnd-formerror-message"></p>)');
            elem.find(".lnd-formelement-validate").each(function() {
              var type = $(this).metadata().validation;
              if(type) {
                if(type == "email") {
                  if(validateEmail($(this).val())) {
                    $(this).removeClass("lnd-formelement-error");
                    $(this).parent().removeClass("lnd-formrow-error").find(".lnd-formerror-message").remove();
                  } else {
                    sendform = false;
                    if(!$(this).parent().is(".lnd-formrow-error")) {
                      var message = errorelem.html(messages[type]).clone();
                      $(this).addClass("lnd-formelement-error").after(message).parent().addClass("lnd-formrow-error");
                    }                  
                	}
                } else if(type == "empty") {
                  if(validateEmpty($(this).val())) {
                    $(this).removeClass("lnd-formelement-error");
                    $(this).parent().removeClass("lnd-formrow-error").find(".lnd-formerror-message").remove();
                  } else {
                    sendform = false;
                    if(!$(this).parent().is(".lnd-formrow-error")) {
                      var message = errorelem.html(messages[type]).clone();
                      $(this).addClass("lnd-formelement-error").after(message).parent().addClass("lnd-formrow-error");
                    }
                  }
                }
              }
            });
            if(modalform) {
              var sm = $.modal;
              sm.setContainerDimensions();
            }
            return sendform;
          };
          
          // init, fire
          elem.find(".lnd-button-submit").click(function() {
            var options = elem.metadata();
            var forminput = elem.find(".lnd-formelement").serialize();
            options.element = elem;
            options.data = forminput;
            if(options.sendtype) {
	            options.type = options.sendtype;
            }
            if(validate) {
              performvalidation = true;
            }
            var modalform = false;
            elem.parents(".lnd-module-modalcontents").exists(function() {
              modalform = true;
            });
            if(performvalidation) {
              if(validateForm(modalform)) {
                lindab.ajax.request(options);  
              }
            } else {
              lindab.ajax.request(options);
            }
          });
        },
        colorpicker: function(elem) {
          elem.find(".lnd-list-colors li").hover(function() {
            $(this).addClass("lnd-hover");
          }, function() {
            $(this).removeClass("lnd-hover");
          }).click(function() {
            $(this).find("a").click();
          }).find("a").click(function() {
            if($(this).parent().is(".lnd-active")) { return false; }
            var target = $(this).attr("href");
            target = ".lnd-" + target.replace("#","");
            elem.find(".lnd-color-active").removeClass("lnd-color-active").end().find(target).addClass("lnd-color-active");
            elem.find(".lnd-active").removeClass("lnd-active");
            $(this).parent().addClass("lnd-active");
            return false;
          });
        }
      },
      navigation: {
        searchfilters: function(elem) {
          var moduleparent = elem;
          var targetparent = $("#lnd-searchresult");
          var targetparentinner = targetparent.find(".lnd-group-search");
          
          // type filters
          moduleparent.find(".lnd-searchfilters-type .lnd-link").live("click",function() {
            var linkparent = $(this).parent();
            moduleparent.find(".lnd-searchfilters-type li").removeClass("lnd-active");
            linkparent.addClass("lnd-active");
            var typefilter = $(this).metadata().typefilter;
            if(typefilter) {
              targetparentinner.find(".lnd-searchgroup").addClass("lnd-searchgroup-hidden");
              targetparentinner.find(".lnd-searchgroup-" + typefilter).removeClass("lnd-searchgroup-hidden");
            } else {
              typefilter = "";
              targetparentinner.find(".lnd-searchgroup-hidden").removeClass("lnd-searchgroup-hidden");
            }
            moduleparent.data("typefilter",typefilter);
            return false;
          });
          
          // category filters
          moduleparent.find(".lnd-searchfilters-category .lnd-link").bind("activestate",function() {
            var linkparent = $(this).parent();
            $("#lnd-searchfilters").find(".lnd-searchfilters-category li").removeClass("lnd-active");
            linkparent.addClass("lnd-active");
          });
          
        },
        modalwindow: function(elem) {
          var openModal = function() {
            var options = elem.metadata();
            options.dataType = "html";
            options.element = elem;
            // perform
            lindab.ajax.request(options);
          };
          openModal();
          return false;
        },
        topselect: function(elem) {
          var parent = $("#lnd-topselectors");
          var sub = parent.find(".lnd-holder-topselectors");
          var arrow = parent.find(".lnd-arrow");
          var closer = parent.find(".lnd-close");
          
          var openSelector = function(elem,callback) {
            if(lindab.states.get('browser-capable')) {
            if(elem.is(".lnd-link-topselect-open")) {
              // CLOSES THE BOX - HIDES THE INNER
              var select = elem.metadata().selector;
              parent.slideUp(500,"easeOutCubic",function() {
                parent.removeClass("lnd-holder-topselectors-open");
                elem.removeClass("lnd-link-topselect-open");
                sub.removeClass("lnd-holder-topselectors-section lnd-holder-topselectors-language");
                  callback.call();
              });              
              }
              else {
              if(parent.is(".lnd-holder-topselectors-open")) {
                // KEEPS THE BOX OPEN - CHANGES INNER
                $(".lnd-link-topselect-open").removeClass("lnd-link-topselect-open");
                elem.addClass("lnd-link-topselect-open");
                var select = elem.metadata().selector;
                sub.removeClass("lnd-holder-topselectors-section lnd-holder-topselectors-language").addClass("lnd-holder-topselectors-" + select);
                var sh = sub.outerHeight();
                parent.animate({
                  'height': sh
                },500,"easeOutCubic",function() {
                    callback.call();
                });
                }
                else {
                // OPENS THE BOX - SHOWS INNER
                elem.addClass("lnd-link-topselect-open");
                var select = elem.metadata().selector;
                sub.removeClass("lnd-holder-topselectors-section lnd-holder-topselectors-language").addClass("lnd-holder-topselectors-" + select);
                parent.css("height","auto").addClass("lnd-holder-topselectors-open").slideDown(500,"easeOutCubic", function(){
                  var sh = sub.outerHeight();
                  parent.css("height",sh);
                     callback.call();
                  });
                }
              }
            }
            // IE 6 & 7
            else {
              if(elem.is(".lnd-link-topselect-open")) {
                // CLOSES THE BOX - HIDES THE INNER
                var select = elem.metadata().selector;
                parent.hide(0,function(){
                  parent.removeClass("lnd-holder-topselectors-open");
                  elem.removeClass("lnd-link-topselect-open");
                  sub.removeClass("lnd-holder-topselectors-section lnd-holder-topselectors-language");
                });
              }
              else {
                if (parent.is(".lnd-holder-topselectors-open")) {
                  // KEEPS THE BOX OPEN - CHANGES INNER
                  $(".lnd-link-topselect-open").removeClass("lnd-link-topselect-open");
                  elem.addClass("lnd-link-topselect-open");
                  var select = elem.metadata().selector;
                  sub.removeClass("lnd-holder-topselectors-section lnd-holder-topselectors-language").addClass("lnd-holder-topselectors-" + select);
                }
                else {
                  // OPENS THE BOX - SHOWS INNER
                  elem.addClass("lnd-link-topselect-open");
                  var select = elem.metadata().selector;
                  sub.removeClass("lnd-holder-topselectors-section lnd-holder-topselectors-language").addClass("lnd-holder-topselectors-" + select);
                  parent.addClass("lnd-holder-topselectors-open").show(0,function(){
                  });
                }
              }
              
            }
          }
          
          closer.click(function() {
            $(".lnd-link-topselect-open").click();
          });
          
          var positionArrow = function() {
            
            if($(".lnd-holder-topselectors").is(".lnd-holder-topselectors-section")) {
              var menu = $(".lnd-topbar .lnd-menu-left");
            } else {
              var menu = $(".lnd-topbar .lnd-menu-right");
            }

            var position = menu.position();
            position = position.left;
            if(menu.is(".lnd-menu-left")) {
              position = (menu.width() - 14); 
            } else if(menu.is(".lnd-menu-right")) {
              position = (position-20);
            }
            arrow.show().css("left",position);
          }
          
          var hideArrow = function() {
            arrow.hide();
          }
          
          elem.click(function() {
            hideArrow();
            var callback = function() {
              hideArrow();
              positionArrow();
            }
            openSelector(elem,callback);
            return false;
          });
          
          if(parent.is(".lnd-topselectors-open")) {
            positionArrow();
          }
        },
        autocut: function(elem) {
          var words = elem.metadata().words;
          var dots = '...';
          var par = elem.find('.lnd-paragraph-cut:first');
          var org = par.html().trim();
          var spaces = org.split(" ");
          var count = 0;
          var newtxt = "";
          $.each(spaces,function(key,val) {
            newtxt += val;
            count++;
            if(count > words) {
              newtxt += dots; 
              return false;
            } else {
              newtxt += " ";
            }
          });

          par.html(newtxt);
          elem.data("contents",{'org':org,'shorts':newtxt});
          //elem.prepend(newtxt);
          
          elem.find(".lnd-cutlink").live("click",function()
          {
            if($(this).is(".lnd-link-expandable-open")) {
              // close
              $(this).removeClass("lnd-link-expandable-open").html($(this).data('fliptitle'));
              par.html(elem.data().contents.shorts);
            } else {
              // open
              $(this).data("fliptitle",$(this).html());
              $(this).addClass("lnd-link-expandable-open").html(elem.metadata().fliptitle);
              par.html(elem.data().contents.org);
            }
            return false;
          });
        },
        contactselect: {
          updateHTML: function(obj) {
            var contacttmpl = $('<div class="lnd-contact-person"><div class="lnd-column lnd-left"><img class="lnd-contactimage" src="" alt=""/></div><div class="lnd-column lnd-right"><h6 class="lnd-heading lnd-heading-box lnd-contactname"></h6><p class="lnd-contacttitle"></p><p class="lnd-contactphone"></p><div class="lnd-tools"><a href="#" class="lnd-link lnd-contactemail"><span>E-mail</span></a><a href="#" class="lnd-link lnd-contactvcard"><span>Download v-card</span></a></div></div></div>');
            var output = $("<div></div>");
            var counter = 0;
            $.each(obj,function() {
              var contact = this;
              var contacthtml = contacttmpl.clone();

              if(counter == 0) {
                contacthtml.addClass("lnd-contact-person-active");
              }
              
              if(contact.image) {
                contacthtml.removeClass("lnd-no-contact-image").find(".lnd-contactimage").attr("src",contact.image);         
              } else {
                contacthtml.addClass("lnd-no-contact-image").find(".lnd-contactimage").remove();
              }
              if(contact.name) {
                contacthtml.find(".lnd-contactname").html(contact.name);         
              } else {
                contacthtml.find(".lnd-contactname").remove();
              }
              if(contact.title) {
                contacthtml.find(".lnd-contacttitle").html(contact.title);
              } else {
                contacthtml.find(".lnd-contacttitle").remove();
              }
              if(contact.phone) {
                contacthtml.find(".lnd-contactphone").html(contact.phone);
              } else {
                contacthtml.find(".lnd-contactphone").remove();
              }
              if(contact.email) {
                contacthtml.find(".lnd-contactemail").attr("href","mailto:" + contact.email);
                contacthtml.find(".lnd-contactemail").html("<span>" + contact.emaillabel + "</span>");
              } else {
                contacthtml.find(".lnd-contactemail").remove();
              }
              if(contact.vcard) {
                contacthtml.find(".lnd-contactvcard").attr("href",contact.vcard);
                contacthtml.find(".lnd-contactvcard").html("<span>" + contact.vcardlabel + "</span>");
              } else {
                contacthtml.find(".lnd-contactvcard").remove();
              }
              output.append(contacthtml);
              counter++;
            });
            var returndata = {
              html: output.html(),
              count: counter
            }
            return returndata;
          },
          buildContacts: function(elem,id,obj) {
            var select = elem;
            var htmldata = select.data('html');
            if(typeof(htmldata) != "undefined") {
              if(typeof(htmldata[id]) != "undefined") {
                var returndata = htmldata[id];
              } else {
                var returndata = lindab.ui.navigation.contactselect.updateHTML(obj);
              }
            } else {
              var returndata = lindab.ui.navigation.contactselect.updateHTML(obj);
            }
            var storedata = {};
            storedata[id] = returndata;
            var old = select.data('html');
            var newd = $.extend(old,storedata);
            select.data('html',newd);
            return returndata;
          }
        },
				getMainContents: function(data)
				{
					var $loader = $('<div class="lnd-contentsloader"><span>'+lindab.ui.translation.getTranslation("loading")+'...</span></div>');
					var $parent = $("#lnd-maincontents");
					$parent.prepend($loader);
					$parent.find(".lnd-maincontents").addClass("lnd-loading");
	        lindab.ajax.request({
	          url: data.contentsData.url,
	          callback: 'maincontents-loader'
	        }); 
				},        
        topMenuHover: function(state, element) {
          var elem = element;
          var li = elem.parents('li:first');
          var ul = li.parents('ul:first');
          var img = elem.find('img');
          
					if(li.is(".lnd-listitem-menu-drilldown-active")) { return; }
          
          if(state == 'over') { 
            li.addClass("hover");
            if(!li.is(".active")) {
              li.addClass("active");
              li.animate({
                opacity: 0.8
              },250,function() {
                img.css("margin-top","-50px");
                elem.css("background-position","right -50px");
                li.animate({
                  opacity: 1
                }, 250, function() {
                  li.removeClass("active");
                });
              });
            }
          } else if(state == 'out') {
            
            img.css("margin-top","0");
            li.stop().css("opacity","1");
            elem.css("background-position","right 0");
            li.removeClass("hover").removeClass("active");
          }
        },
        /*
         * 
         */
        drilldown: function(action, element) {
					
          var $drilldown = $("#lnd-drilldown");
          var $menuitem = $(element);
          var $item = $("a",$menuitem);
					
					if($menuitem.is(".lnd-listitem-menu-drilldown-progress")) { return false; }
					
					if(action == "open") {
						if($menuitem.is(".lnd-listitem-menu-drilldown-active")) { return false; }
						$menuitem.addClass("lnd-listitem-menu-drilldown-progress");
            $menuitem.removeClass("hover").removeClass("active").removeClass("lnd-listitem-menu-drilldown-loading");
            $menuitem.addClass("lnd-listitem-menu-drilldown-active");
            $drilldown.show();
            //$drilldown.find(".lnd-holder-drilldown").hide();
            //$("img",$item).css("margin-top","-150px");
            //$item.stop().css("opacity","1");
            //$item.css("background-position","right -150px");
            $drilldown.find(".lnd-holder-drilldown").slideDown(500,"easeOutCubic",function() {
							$menuitem.removeClass("lnd-listitem-menu-drilldown-progress");
              if(!$drilldown.is(".lnd-drilldown-init")) {
                var ddh = $drilldown.find(".lnd-holder-drilldown");
                if(ddh.is(".lnd-holder-drilldown-ba3") || !ddh.is(".lnd-holder-drilldown-flex")) {
                  $drilldown.addClass("lnd-drilldown-init");
                  var drillheight = 0;
                  $.each($drilldown.find(".lnd-level-1 li"),function() {
                    drillheight = drillheight + $(this).outerHeight(true);
                  });
                  $drilldown.data("drillheight",drillheight);
                  $drilldown.find(".lnd-level").css("height",drillheight+1);
                  $drilldown.find(".lnd-holder-drilldown").css("height",drillheight-2);
                }
              }
						});
            
            // remove breadcrumb
            lindab.ui.navigation.breadcrumb.disable();
            
					} else {
						$menuitem.addClass("lnd-listitem-menu-drilldown-progress");
            //$("img",$item).css("margin-top","0");
            //$item.stop().css("opacity","1");
            //$item.css("background-position","right 0");
            $menuitem.removeClass("lnd-listitem-menu-drilldown-active");
            $(".lnd-holder-drilldown",$drilldown).slideUp(500,"easeOutCubic",function() {
              $drilldown.hide();
							$menuitem.removeClass("lnd-listitem-menu-drilldown-progress");
            });
            
            
            // generate breadcrumb
            lindab.ui.navigation.breadcrumb.construct();
            
            
					}
					
          return false;
        },
        slideshow: function(elem) {
					// slideshow-elements exists
					if(elem.exists()) {
	          var titleholder = elem.find(".lnd-image-description-holder");
						// handle the image description
	          var checkTitle = function() {
	            var current = elem.find(".lnd-item-active img");
	            var title = current.attr("title");
	            titleholder.append('<p class="lnd-image-description">' + title + '</p>');
	            titleholder.find(".lnd-image-description").show();
	            if(title.length > 0) {
	              titleholder.removeClass("empty");
	              if(!titleholder.is(".loaded")) {
	                titleholder.addClass("loaded").show();
	              } else {
	                titleholder.slideDown(250,"easeOutCubic");
	              }
	            } else {
	              titleholder.addClass("empty");
	            }
	          }
						// update the counter
	          var updateCount = function(count) {
	            var target = elem.find(".lnd-image-activeslide");
	            target.html(count);
	          }
						// trigger next image when clicking anywhere inside the slide
	          elem.find(".lnd-item-active").live("click",function() {
	            elem.find(".lnd-slide-navigation-next").click();
	          });
						// show and hide image description on mouse over and out
	          elem.hover(function() {
	            if(!elem.is(".sliding") && !titleholder.is(".empty")) {
	              elem.addClass("sliding");
	              titleholder.slideDown(function() {
	                elem.removeClass("sliding");
	              });
	            }
	          },function() {
	            if(!elem.is(".sliding") && !titleholder.is(".empty")) {
	              elem.addClass("sliding");
	              titleholder.slideUp(function() {
	                elem.removeClass("sliding");
	              });
	            }
	          });
						// slide the images
	          elem.find(".lnd-slide-navigation").click(function() {
	            if(elem.is(".slide-active")) { return false; }
	            titleholder.hide().find(".lnd-image-description").remove();
	            elem.addClass("slide-active");
	            var dir = $(this).is(".lnd-slide-navigation-next") ? 'left' : 'right';
	            var count = ((elem.find(".lnd-item").length)-1);
	            var counter = elem.data("counter");
	            if(typeof(counter) == "undefined") {
	              counter = 0;
	              elem.data("counter",counter);
	            }
	            var active = elem.find(".lnd-item-active");
	            if(dir == "left") {
	              counter++;
	              if(counter > count) {
	                counter = 0;
	                var image = elem.find(".lnd-item:first");
	              } else {
	                var image = active.next(".lnd-item");
	              }
	              var nextclass = "lnd-item-next-left";
	            } else {
	              counter--;
	              if(counter < 0) {
	                counter = count;
	                var image = elem.find(".lnd-item:last");
	              } else {
	                var image = active.prev(".lnd-item");
	              }
	              var nextclass = "lnd-item-next-right";
	            }
	
	            image.addClass("lnd-item-next " + nextclass );
	            var aw = active.width();
	            var nw = image.width();
	            
	            if(dir == "left") {
	              active.animate({
	                'left': 0-aw
	              },500,"easeOutCubic",function() {
	                active.removeClass("lnd-item-active").removeAttr("style");
	              });
	              image.animate({
	                'right': 0
	              },500,"easeOutCubic",function() {
	                image.removeClass("lnd-item-next lnd-item-next-left").addClass("lnd-item-active").removeAttr("style");
	                elem.removeClass("slide-active");
	                checkTitle();
	              });
	            } else {
	              active.animate({
	                'left': 0+aw 
	              },500,"easeOutCubic",function() {
	                active.removeClass("lnd-item-active").removeAttr("style");
	              });
	              image.animate({
	                'left': 0
	              },500,"easeOutCubic",function() {
	                image.removeClass("lnd-item-next lnd-item-next-right").addClass("lnd-item-active").removeAttr("style");
	                elem.removeClass("slide-active");
	                checkTitle();
	              });
	            }
	            updateCount(counter+1);
	            elem.data("counter",counter);
	            return false;
	          });
						// start with checking the image title
	          checkTitle();
					}
        },
        tabs: function(container) {
            var activeCssClass = 'active';
            container.find("li a:not('.lnd-link-taboverride')").live("click", function() {
                var elem = $(this);
                var ul = elem.parents('ul.lnd-tabs:eq(0)');
                ul.find('li.active').removeClass(activeCssClass);
                elem.parent().addClass(activeCssClass);
                var href = elem.attr("href");
			    if(href != "#") {
                    if ($.isBrowserIE() == "7" && (href.indexOf('http://') == 0 || href.indexOf('https://') == 0)) {
                        return true;
                    } else {
                        var parent = elem.parents(".lnd-module-tabs:first");
					    var target = $(href);
					    target.exists(function() {
						    parent.find(".lnd-tabcontents").hide();
						    target.show();
					    });
					    return false;
                    }
			    }
            });
        },
        breadcrumb: {
          template: '<div class="lnd-breadcrumb"><div class="lnd-group lnd-group-breadcrumb"><div id="lnd-breadcrumb" class="lnd-holder lnd-holder-breadcrumb"><ul>{{each Items}}<li class="${cssClass}"><a href="${url}">${title}</a>{{/each}}</li></ul><span class="lnd-shadow-breadcrumb"></span></div></div></div>',
          loadDrilldown: function() {
						var breadcrumb = $('#lnd-breadcrumb');
						var options = {
							url: breadcrumb.metadata().url,
							callback: breadcrumb.metadata().callback
						};
	          lindab.ajax.request(options);
					},
					activate: function() {
						
						var breadcrumb = $('#lnd-breadcrumb');
            var inner = breadcrumb.find("ul:first");
						
            breadcrumb.click(function() {
              var trigger = $('li.lnd-listitem-menu-drilldown',$("#lnd-topmenu"));
              trigger.addClass("lnd-listitem-menu-drilldown-loading");
							lindab.ui.navigation.breadcrumb.loadDrilldown();
              return false;
            });
            
            breadcrumb.hoverIntent(function() {
              lindab.ui.navigation.breadcrumb.hoverTrigger("over");
            }, function() {
              lindab.ui.navigation.breadcrumb.hoverTrigger("out");
            });
					},
					render: function(items) {
						
						if(items.length > 0) {
            
	            var breadcrumb = $.tmpl(this.template, {Items: items});
              var inner = breadcrumb.find("ul:first");
	            //breadcrumb.hide();
	            
	            //lindab.ui.navigation.breadcrumb.disable();
	            
              $('.lnd-breadcrumb').remove();
              $('#lnd-topmenu').after(breadcrumb);
              breadcrumb.hide().slideDown();
              
	            breadcrumb.click(function() {
	              breadcrumb.slideUp();
                var trigger = $('li.lnd-listitem-menu-drilldown');
                var state = trigger.is(".lnd-listitem-menu-drilldown-active") ? 'close' : 'open';
                lindab.ui.navigation.drilldown(state, trigger);
	              return false;
	            });
							
							breadcrumb.hoverIntent(function() {
								lindab.ui.navigation.breadcrumb.hoverTrigger("over");
							}, function() {
								lindab.ui.navigation.breadcrumb.hoverTrigger("out");
							});

						}
            
          },
          disable: function() {
            $('#lnd-breadcrumb').unbind().stop().slideUp(function() {
              $('.lnd-breadcrumb').remove();
            });
          },
          construct: function() {
            
            var data = $('#lnd-drilldown').find('a.lnd-levelitem-parent-active, a.lnd-levelitem-active');
            var arr = []
            var dataLength = data.length;
            data.each(function(index) {
              var css = (index == 0) ? 'home' : (index >= (dataLength - 1)) ? 'last' : '';
              var elem = $(this); 
              arr.push({
                cssClass: css,
                title: elem.text(),
                url: elem.attr('href')
              });
            });
            // render html and append to document.
            this.render(arr);
            
          },
					hoverTrigger: function(state) {
						var elem = $('#lnd-breadcrumb');
						if(!elem.data("loaded")) {
							var eh = elem.height();
							elem.data("heights",{'org':eh,'to':(eh+5)}).data("loaded",true);
						}
						if(state == "over") {
							elem.stop().delay(1000).animate({
								height: elem.data("heights").to
							},{
								duration: 250,
								queue: false
							},function() {
								elem.addClass("lnd-breadcrumb-down");
							});
						} else {
              elem.stop().animate({
                height: elem.data("heights").org
              },{
								duration: 250,
								queue: false
							},function() {
								elem.removeClass("lnd-breadcrumb-down");
							});
						}
					}
        },
        inlineExpandable: function(elem) {
          elem.find(".lnd-shareurl").live("click",function() {
            $(this).focus().select();
          });
          elem.find(".lnd-expandtrigger").live("click",function() {
            if(elem.is(".lnd-listitem-expandable-open")) {
              // close
              elem.removeClass("lnd-listitem-expandable-open").find(".lnd-hidden").hide();
            } else {
              // open
              elem.addClass("lnd-listitem-expandable-open").find(".lnd-hidden").show(0,function() {
                elem.find(".lnd-shareurl").click();
              });
            }
            return false;
          });
        }
      }
    },
    
    // FUNCTIONS (EXTENDED TO $)
    functions:
    {
    	guideToolsLink: function(elem) {
    		if(elem.is(".print")) {
    			window.print();
    			return false;
    		} else if(elem.is(".share")) {
    			lindab.ui.navigation.modalwindow(elem);
    			return false;
    		}
    	},
      triggerLayouts: function(scope) {
        if(!scope) {
          var scope = $(document);
        }
        $(".lnd-maincontents-home:not('.lnd-maincontents-guides') .lnd-column-right",scope).css("display","block");
      },
      setupPrint: function() {
			 	var ps = $("#lnd-printsetup");
				if(ps.exists()) {
					var meta = $("#lnd-printsetup").metadata({type:'elem',name:'script'}).printdata;
			 		if(meta) {
			   		var printelement = $('<div id="lnd-printheader" class="lnd-printheader"></div>');
			 			var printheader = meta.printHeader;
						var printurl = $('<p class="lnd-printurl"><strong>' + lindab.ui.translation.getTranslation("printurl") + ':</strong> <span class="lnd-url">' + meta.printURL + '</span></p>');
						var printlogo = $('<div class="lnd-printlogo"><img src="'+meta.printLogo+'" width="200" height="48" alt="Lindab" title="Lindab" /></div>');
						printelement.html('<h2 class="lnd-heading lnd-heading-print">'+printheader+'</h2>');
						printelement.prepend(printlogo);
						printelement.append(printurl);
					 	$("body").prepend(printelement);
			 		}
				}
      },
      gotoURL: function(url) {
        document.location = url;
        return false;
      },
      bindLindabEvents: function(scope) {
        if(!scope) {
          var scope = $(document);
        }
        $(".lnd-autocut",scope).autocut();
        $(".lnd-image-rc",scope).lndRoundedCorners();
        $(".lnd-listitem-expandable",scope).inlineExpandable();

        // Inline form handler
        $(".lnd-module-inlineform",scope).inlineForm();
        
        // Slideshow handler
        $('div.lnd-module-slideshow',scope).slideshow();
        
        // Contact navigation
        $(".lnd-module-box .lnd-contact .lnd-contact-navigation",scope).lindabContactNavigation();
        
        if($.isBrowserIE() != false) {
          $.bindMSIEEvents(scope);
        }
        
      },
      isBrowserIE: function()
      {
        var browser = false;
        if(isIE6)
        {
          browser = "6";
        } else if(isIE7)
        {
          browser = "7";
        } else if(isIE8)
        {
          browser = "8";
        }
        return browser;
      },
      bindMSIEEvents: function(scope)
      {
        if(!scope) {
          var scope = $(document);
        }
				var version = $.isBrowserIE();
        switch(version)
        {
          case "9":
          case "8":
						lindab.states.set('browser-capable',true);
          break;
          case "7":
            lindab.states.set('browser-capable',false);
          break;
          case "6":
            lindab.states.set('browser-capable',false);
            // Trigger layout to column for proper rendering
            $.triggerLayouts(scope);
            // Try and eliminate background-flickering in MSIE6
            try {
              document.execCommand('BackgroundImageCache', false, true);
            } catch(e) {}
          break;
          default:
            lindab.states.set('browser-capable',true);
          break;
        }
      }
      
    },
    
    // EXTENSIONS (EXTENDS AS PLUGINS, CHAINABLE)
    extensions:
    {
      lindabContactNavigation: function() {
        return this.each(function() {
          var nav = $(this);
          var parent = nav.parents(".lnd-contact");
          
          $(".lnd-nav",nav).click(function() {
            var active = $(".lnd-contact-person-active",parent);
            var contacts = $(".lnd-contact-person",parent);
            var count = contacts.length-1;
            var index = $(".lnd-contact-person-active",parent).index();
            var current = index+1;
            if($(this).is(".lnd-nav-next")) {
              if((index+1) > count) {
                var next = $(".lnd-contact-person",parent).eq(0);
                current = 1;
              } else {
                var next = active.next();
                current = current+1;
              }
              active.removeClass("lnd-contact-person-active");
              next.addClass("lnd-contact-person-active");
            } else {
              if((index-1) < 0) {
                var next = $(".lnd-contact-person",parent).eq(count);
                current = count+1;
              } else {
                var next = active.prev();
                current = current-1;
              }
              active.removeClass("lnd-contact-person-active");
              next.addClass("lnd-contact-person-active");
            }
            
            $(".lnd-nav-track-current",nav).html(current);
            return false;
          });
        });
      },
      lindabMiniTip: function() {
        return this.each(function() {
          lindab.ui.tools.minitip($(this));
        });
      },
      inlineExpandable: function() {
        return this.each(function() {
          lindab.ui.navigation.inlineExpandable($(this));
        });
      },
      outerHtml: function()
      {
        return $('<div></div>').append(this.eq(0).clone()).html();
      },
      exists: function(fn) {
	      var l = this.length;
	      if($.isFunction(fn)) {
	        if(l > 0) fn.apply(this);
	        return this;
	      } else {
	        return (l > 0) ? true : false;
	      }
	    },
      ajaxLink: function() {
        
          $(this).live('click', function() {
            var elem = $(this);
            var options = elem.metadata();
            options.element = elem;
						// check for a precall function and execute it
						if(options.precall) {
							if(typeof(lindab.ajax.events.get(options.precall)) == "function") {
								lindab.ajax.events.get(options.precall).call(this, options);
							}
            } else {
	            // perform the ajax-request
	            lindab.ajax.request(options);
						}
            // cancel standard click event
            return false;
          });
        
      },
      lindabTrackLink: function() {
        
          $(this).live('click', function() {
            var elem = $(this);
            var options = elem.metadata();
            options = options.trackingData;
            var trackurl = options.trackingURL;
            var callback = options.trackingCallback;
            if(callback) {
              if(typeof(window[callback]) == "function") {
                window[callback].call(this, trackurl);
              } else {
                if(typeof(_gaq) != "undefined") {
                  _gaq.push(['_trackPageview'], trackurl);  
                }
              }
            } else {
              if(typeof(_gaq) != "undefined") {
                _gaq.push(['_trackPageview'], trackurl);
              }
            }
          });
        
      },
      slideshow: function() {
        return this.each(function()
        {
          lindab.ui.navigation.slideshow($(this));
        });
      },
			lndRoundedCorners: function()
			{
				return this.each(function()
				{
					var $parent = $(this);
					var setCorners = function()
					{
						
						var $wrap = $("a",$parent);
						var $top = $('<span class="border-top"></span>');
						var $bottom = $('<span class="border-bottom"></span>');
            var bottomheight = $("img",$wrap).height();
            if(!bottomheight) {
              bottomheight = "160";
            }
						$bottom.height(bottomheight);
						$wrap.append($top,$bottom);
					}
					setCorners();
					if($.isBrowserIE() == "6")
					{
						$parent.hover(function()
						{
							$(this).addClass("image-hover");
						}, function()
						{
							$(this).removeClass("image-hover");
						});
					}
				});
			},
      inputMemory: function()
      {
        return this.each(function()
        {
          $(this).focus(function()
          {
            if(this.value == this.defaultValue)
            {
             this.value = "";
            }       
          }).blur(function()
          {
            if(!this.value.length)
            {
              this.value = this.defaultValue;
            }
          });
        });
      },
			lndTopMenu: function()
			{
				return this.each(function()
				{
					var ul = $parent = $(this);
					//ul.removeClass("lnd-list-topmenu-std");
					/*
					ul.find('li a').hover(function() {
					  lindab.ui.navigation.topMenuHover('over', $(this));
					}, function() {
					  lindab.ui.navigation.topMenuHover('out', $(this));
					});
					*/
					ul.find('li.lnd-listitem-menu-drilldown').click(function() {
						var bc = $(".lnd-breadcrumb .lnd-holder-breadcrumb");
						if(bc.exists()) {
							bc.click();
						} else {
						  var state = $(this).is(".lnd-listitem-menu-drilldown-active") ? 'close' : 'open';
						  lindab.ui.navigation.drilldown(state, this);
						}
					  return false;
					});
					
				});
			},
      autocut: function() {
        return this.each(function() {
          lindab.ui.navigation.autocut($(this));
        });
      },
      lindabTopSelect: function() {
        return this.each(function() {
          lindab.ui.navigation.topselect($(this));
        });
      },
      searchFilters: function() {
        return this.each(function() {
          lindab.ui.navigation.searchfilters($(this));
        });
      },
      inlineForm: function() {
        return this.each(function() {
          lindab.ui.tools.inlineFormHandler($(this));
        });
      }
    }       
  };

  // Extend the Lindab specific functions into the $-scope
  $.extend($.lnd.functions);
  $.fn.extend($.lnd.extensions);
  
  
  // events callbacks.
	lindab.ajax.events.set('maincontents-loader', function(options, data) {
		var $parent = $("#lnd-maincontents");
		$('#lnd-drilldown').data("active",false);
		$parent.find(".lnd-contentsloader").fadeOut(250,function() {
			$parent.empty().append(data.maincontentshtml);
      $.bindLindabEvents($parent);
		});
	});
  
  lindab.ajax.events.set('areaselector-item', function(options, data) {
    override = true;

    var item = options.element;
    var html = data.drilldownhtml;
    
    var drilldown = $('#lnd-drilldown');
    var holder = drilldown.find('.lnd-holder-drilldown');
    holder.find('ul').remove();
    holder.prepend(html);
    
    lindab.ui.navigation.drilldown('open', $('li.lnd-listitem-menu-drilldown'));
    
    lindab.bookmark.add(drilldown, item);
    
    if(data) {
      if(data.contentsData) {
        lindab.ui.navigation.getMainContents(data);
      }
    }
    
  });
	
  lindab.ajax.events.set('categoryheader-item', function(options, data) {
    override = true;

    var item = options.element;
    var html = data.drilldownhtml;
    
    var drilldown = $('#lnd-drilldown');
		var holder = drilldown.find('.lnd-holder-drilldown');
    holder.find('ul').remove();
		holder.prepend(html);
    
    lindab.ui.navigation.drilldown('open', $('li.lnd-listitem-menu-drilldown'));
		
		lindab.bookmark.add(drilldown, item);
		
    if(data) {
      if(data.contentsData) {
				lindab.ui.navigation.getMainContents(data);
      }
    }
    
  });
  
  lindab.ajax.events.set('categoryheader-item-home-callback', function(options, data) {
    override = true;

    var item = options.element;
    //var html = data.drilldownhtml;
    
    //var holder = drilldown.find('.lnd-holder-drilldown');
    //holder.find('ul').remove();
    //holder.prepend(html);
    
    //lindab.ui.navigation.drilldown('open', $('li.lnd-listitem-menu-drilldown'));
    
    var drilldown = $('#lnd-drilldown');
    lindab.bookmark.add(drilldown, item);
    
    if(data) {
      if(data.contentsData) {
        lindab.ui.navigation.getMainContents(data);
      }
    }
    
  });
  
  lindab.ajax.events.set('breadcrumb-item', function(options, data) {
    override = true;

    var item = options.element;
    var html = data.drilldownhtml;
    
    var drilldown = $('#lnd-drilldown');
		var holder = drilldown.find('.lnd-holder-drilldown');
    holder.find('ul').remove();
		holder.prepend(html);
    
    var trigger = $('li.lnd-listitem-menu-drilldown');
    var state = trigger.is(".lnd-listitem-menu-drilldown-active") ? 'close' : 'open';
    lindab.ui.navigation.drilldown(state, trigger);

    //lindab.ui.navigation.drilldown('open', trigger);
    
  });
	
  lindab.ajax.events.set('drilldown-precall', function(options) {
    var item = $(this);
    var level = item.parents(".lnd-level");
    var drilldown = $('#lnd-drilldown');

    if(!drilldown.data("active")) {
      item.addClass("lnd-levelitem-loading");
      drilldown.data("active",true);
      // perform the ajax-request
      lindab.ajax.request(options);

      level.nextAll(".lnd-level").remove();
      level.find(".lnd-levelitem").removeClass("lnd-levelitem-active lnd-levelitem-parent-active");
      $("#lnd-drilldown .lnd-levelitem-active").addClass("lnd-levelitem-parent-active").removeClass("lnd-levelitem-active");
      item.addClass("lnd-levelitem-active");
      
    }
      
  });
	
  lindab.ajax.events.set('drilldown-item', function(options, data) {
		override = true;
		
    var item = options.element;
    var level = item.parents(".lnd-level");
		
		if(data) {
			if(data.drilldownhtml) {
	      var html = data.drilldownhtml;
	      level.after(html);
				item.removeClass("lnd-levelitem-loading");
			} else {
				item.removeClass("lnd-levelitem-loading");
			}
		}
    
		// store to history
    var container = $('#lnd-drilldown');
    lindab.bookmark.add(container, item);
		
    if(data) {
	  	if(data.contentsData) {
				lindab.ui.navigation.getMainContents(data);
			} else {
				container.data("active",false);
			}
    } else {
			container.data("active",false);
		}
		
  });
  
  lindab.ajax.events.set('drilldown-bookmark', function(options, data) {
    var html = data.drilldownhtml;
    
    var parent = $('#lnd-drilldown');
    
    if(parent.is(".lnd-drilldown-home")) {
      
    } else {
    
      var drilldown = parent.find('.lnd-holder-drilldown');
      drilldown.find('ul').remove();
      drilldown.prepend(html);
      
      lindab.ui.navigation.drilldown('open', $('li.lnd-listitem-menu-drilldown'));

    }
    
    if(data) {
      if(data.contentsData) {
				lindab.ui.navigation.getMainContents(data);
      }
    }
  });
	
  lindab.ajax.events.set('productcategory-tabs-precall', function(options) {
    var elem = $(this);
		if(!elem.parent().is(".active")) {
			if(!elem.is(".lnd-tabcontents-loaded")) {
				var $parent = $("#lnd-tabs-body");
				var $loader = $('<div class="lnd-contentsloader"><span>'+lindab.ui.translation.getTranslation("loading")+'...</span></div>');
				$parent.find(".lnd-tabcontents").addClass("lnd-loading");
				$parent.prepend($loader);
	      // perform the ajax-request
	      lindab.ajax.request(options);
			} else {
		    var $parent = $("#lnd-tabs-body");
		    $parent.find(".lnd-tabcontents").hide();
		    $parent.find("." + options.tab).show();
			}
		}
      
  });
	
  lindab.ajax.events.set('productcategory-tabs-callback', function(options,data) {
		var elem = options.element;
		elem.addClass("lnd-tabcontents-loaded");
		$html = $('<div class="lnd-tabcontents"></div>');
		$html.html(data.tabshtml).addClass(options.tab);
    var $parent = $("#lnd-tabs-body");
    $parent.append($html);
		$loader = $parent.find(".lnd-contentsloader");
		$loader.fadeOut(250,function() {
			$loader.remove();
	    $parent.find(".lnd-tabcontents").removeClass("lnd-loading").hide();
	    $parent.find("." + options.tab).show();
	    //$(".lnd-image-rc",$parent).lndRoundedCorners();
      $.bindLindabEvents($parent);
		});
  });
	
  lindab.ajax.events.set('productcategory-expand-precall', function(options) {
    var elem = options.element;
		if(elem.is(".lnd-expandable-loading")) { return false; }
		elem.addClass("lnd-expandable-loading");
		if(typeof(elem.data("url")) != "undefined") {
			options.url = elem.data("url");
		}
		options.data = { 'url': options.url };
    // perform the ajax-request
    lindab.ajax.request(options);
  });
	
  lindab.ajax.events.set('productcategory-expand-callback', function(options,data) {
    var elem = options.element;
		var parent = elem.parents(".lnd-row:first");
    if(data) {
      if(data.morehtml) {
				var html = $(data.morehtml);
				html.find(".lnd-module").hide();
			  parent.before(html);
				var modules = html.find(".lnd-module");
				lindab.ui.animation.animateResultModules(modules);
				//$(".lnd-image-rc",html).lndRoundedCorners();
        $.bindLindabEvents(html);
			}
      if(data.nexturl) {
				elem.data("url",data.nexturl);
	    } else {
				elem.remove();
			}
    }
		elem.removeClass("lnd-expandable-loading");
  });
	
  lindab.ajax.events.set('searchresult-products-expand-precall', function(options) {
    var elem = options.element;
    if(elem.is(".lnd-expandable-loading")) { return false; }
    elem.addClass("lnd-expandable-loading");
    if(typeof(elem.data("url")) != "undefined") {
      options.url = elem.data("url");
    }
    options.data = { 'url': options.url };
    // perform the ajax-request
    lindab.ajax.request(options);
  });
  
  lindab.ajax.events.set('searchresult-products-expand-callback', function(options,data) {
    var elem = options.element;
    var parent = elem.parents(".lnd-row:first");
    if(data) {
      if(data.morehtml) {
        var html = $(data.morehtml);
        html.find(".lnd-module").hide();
        parent.before(html);
        var modules = html.find(".lnd-module");
        lindab.ui.animation.animateResultModules(modules);
        //$(".lnd-image-rc",html).lndRoundedCorners();
        $.bindLindabEvents(html);
      }
      if(data.nexturl) {
        elem.data("url",data.nexturl);
      } else {
        elem.remove();
      }
    }
    elem.removeClass("lnd-expandable-loading");
  });
  
  lindab.ajax.events.set('documentlist-sort-precall', function(options) {
    var elem = options.element;
    var parent = elem.parents(".lnd-row-resulttable:first");
    var namelink = parent.find(".lnd-sortorder-name:first");
    var createdlink = parent.find(".lnd-sortorder-created:first");
    if(options.sortcol == "name") {
      if(typeof(namelink.data("nameurl")) != "undefined") {
        options.url = namelink.data("nameurl");
      }
    } else if(options.sortcol == "created") {
      if(typeof(createdlink.data("createdurl")) != "undefined") {
        options.url = createdlink.data("createdurl");
      }
    }
    options.data = { 'url': options.url };
    // perform the ajax-request
    lindab.ajax.request(options);
  });
  
  lindab.ajax.events.set('documentlist-sort-callback', function(options,data) {
    var elem = options.element;
    var parent = elem.parents(".lnd-row-resulttable:first");
    if(data) {
      if(data.resulthtml) {
        parent.html(data.resulthtml);
      }
    }
  });
  
  lindab.ajax.events.set('documentlist-expand-precall', function(options) {
    var elem = options.element;
    if(elem.is(".lnd-expandable-loading")) { return false; }
    elem.addClass("lnd-expandable-loading");
    if(typeof(elem.data("url")) != "undefined") {
      options.url = elem.data("url");
    }
    options.data = { 'url': options.url };
    // perform the ajax-request
    lindab.ajax.request(options);
  });
  
  lindab.ajax.events.set('documentlist-expand-callback', function(options,data) {
    var elem = options.element;
    var parent = elem.parents(".lnd-row-resulttable:first");
    var namelink = parent.find(".lnd-sortorder-name:first");
    var createdlink = parent.find(".lnd-sortorder-created:first");
    var target = parent.find(".lnd-module-table-documents tbody:first");
    if(data) {
      if(data.morehtml) {
        target.append(data.morehtml);
      }
      if(data.nameurl) {
        namelink.data("nameurl",data.nameurl);
      }
      if(data.createdurl) {
        createdlink.data("createdurl",data.createdurl);
      }
      if(data.nexturl) {
        elem.data("url",data.nexturl);
      } else {
        elem.remove();
      }
    }
    elem.removeClass("lnd-expandable-loading");
  });
  
  lindab.ajax.events.set('searchresult-filter-precall', function(options) {
    var elem = options.element;
    var parent = $("#lnd-searchfilters");
    var htmltarget = $("#lnd-searchresult .lnd-group-search");

    if(elem.parent().is(".lnd-active")) { return false; }
    
    elem.trigger("activestate");

    var typefilter = parent.data("typefilter");
    if(!typefilter) {
      typefilter = "all";
    }
    
    var loader = $('<div class="lnd-contentsloader"><span>'+lindab.ui.translation.getTranslation("loading")+'...</span></div>');
    htmltarget.addClass("lnd-loading");
    $("#lnd-searchresult").prepend(loader);
    
    //options.url = elem.data("url");
    options.data = { 'type' : typefilter };
    
    // perform the ajax-request
    lindab.ajax.request(options);
  });
  
  lindab.ajax.events.set('searchresult-filter-callback', function(options,data) {
    var elem = options.element;
    var htmltarget = $("#lnd-searchresult .lnd-group-search"); 

    var loader = $("#lnd-searchresult").find(".lnd-contentsloader");
    
    loader.fadeOut(250,function() {
      loader.remove();
      htmltarget.html(data.searchhtml).removeClass("lnd-loading");
      $.bindLindabEvents(htmltarget);
    });
  });
  
  lindab.ajax.events.set('stockdata-callback', function(options,data) {
    var elem = options.element;
    if(data) {
      if(data.html) {
        elem.prepend(data.html);
      }
    }
  });
  
  lindab.ajax.events.set('inlineform-submit-callback', function(options,data) {
    var elem = options.element;
    if(data) {
      if(data.resulthtml) {
        elem.html(data.resulthtml);
      }
    }
  });
  
  lindab.ajax.events.set('modalopen-callback', function(options,data) {
    var elem = options.element;
    if(data) {
      $.modal(data,
      {
        'appendTo': "#document",
        'closeHTML': '<a href="#" class="lnd-close">'+lindab.ui.translation.getTranslation("close")+'</a>',
        'autoResize': true,
        'overlayClose': true,
        'minHeight': 300,
        'maxHeight': 500,
        'minWidth': 300,
        'maxWidth': 500,
        'onOpen': function(dialog)
        {
          dialog.overlay.fadeIn('fast', function() {
            var modaltitle = $('<div class="lnd-modalheader"><h2 class="lnd-heading"></h2></div>');
            modaltitle.find("h2").html(options.modaltitle); 
            dialog.container.prepend(modaltitle);
            dialog.container.show();
            dialog.data.show();
            $.bindLindabEvents(dialog.data);
          });
        },
        'onClose': function(dialog)
        {
          dialog.data.hide();
          dialog.container.hide();
          dialog.overlay.fadeOut('fast', function () {
            $.modal.close();
          });
        }
      });
    }
  });
  
  lindab.ajax.events.set('modalopen-guide-callback', function(options,data) {
    var elem = options.element;
    if(data) {
      $.modal(data,
      {
        'appendTo': "#document",
        'closeHTML': '<a href="#" class="lnd-close">'+lindab.ui.translation.getTranslation("close")+'</a>',
        'autoResize': true,
        'overlayClose': true,
        'minHeight': 300,
        'maxHeight': 500,
        'minWidth': 300,
        'maxWidth': 500,
        'onOpen': function(dialog)
        {
          dialog.overlay.fadeIn('fast', function() {
            var modaltitle = $('<div class="lnd-modalheader"><h2 class="lnd-heading"></h2></div>');
            modaltitle.find("h2").html(options.modaltitle); 
            dialog.container.prepend(modaltitle);
            dialog.container.show();
            dialog.data.show();
            $.bindLindabEvents(dialog.data);
            var slhtml = lindab.guides.parseGuideList();
            var html = $('<div class="lnd-formrow"><textarea class="lnd-formelement lnd-formelement-hidden" id="input-sl" name="input-sl">' + slhtml +'</textarea></div>');
            dialog.data.find(".lnd-inlineform-fields").append(html);
          });
        },
        'onClose': function(dialog)
        {
          dialog.data.hide();
          dialog.container.hide();
          dialog.overlay.fadeOut('fast', function () {
            $.modal.close();
          });
        }
      });
    }
  });
  
  lindab.ajax.events.set('newslist-expand-precall', function(options) {
    var elem = options.element;
    if(elem.is(".lnd-expandable-loading")) { return false; }
    elem.addClass("lnd-expandable-loading");
    if(typeof(elem.data("url")) != "undefined") {
      options.url = elem.data("url");
    }
    options.data = { 'url': options.url };
    // perform the ajax-request
    lindab.ajax.request(options);
  });
  
  lindab.ajax.events.set('newslist-expand-callback', function(options,data) {
    var elem = options.element;
    var parent = elem.parents(".lnd-newslist:first").find(".lnd-module-newslist ul:first");
    if(data) {
      if(data.morehtml) {
        parent.append(data.morehtml);
      }
      if(data.nexturl) {
        elem.data("url",data.nexturl);
      } else {
        elem.remove();
      }
    }
    elem.removeClass("lnd-expandable-loading");
  });
	
  lindab.ajax.events.set('productcategory-home-tabs-precall', function(options) {
    var elem = $(this);
    if(!elem.parent().is(".active")) {
      if(!elem.is(".lnd-tabcontents-loaded")) {
        var $parent = $("#lnd-tabs-body");
        var $loader = $('<div class="lnd-contentsloader"><span>'+lindab.ui.translation.getTranslation("loading")+'...</span></div>');
        $parent.find(".lnd-tabcontents").addClass("lnd-loading");
        $parent.prepend($loader);
        // perform the ajax-request
        lindab.ajax.request(options);
      } else {
        var $parent = $("#lnd-tabs-body");
        $parent.find(".lnd-tabcontents").hide();
        var target = $parent.find("." + options.tab);
        if(target.is(".lnd-tabcontents-guides")) {
          $(".lnd-column-right").hide();
          $(".lnd-maincontents-home .lnd-row-4col").removeClass("lnd-row-hide"); 
        } else {
          $(".lnd-column-right").show();
          $(".lnd-maincontents-home .lnd-row-4col").addClass("lnd-row-hide");
        }
        target.show();
      }
    }
      
  });
  
  lindab.ajax.events.set('productcategory-home-tabs-callback', function(options,data) {
    var elem = options.element;
    elem.addClass("lnd-tabcontents-loaded");
    if(elem.is(".lnd-link-guides")) {
      var $html = $('<div class="lnd-tabcontents lnd-tabcontents-guides"></div>');
    } else {
      var $html = $('<div class="lnd-tabcontents"></div>');
    }
    $html.html(data.tabshtml).addClass(options.tab);
    var $parent = $("#lnd-tabs-body");
    $parent.append($html);
    $loader = $parent.find(".lnd-contentsloader");
    $loader.fadeOut(250,function() {
      $loader.remove();
      $parent.find(".lnd-tabcontents").removeClass("lnd-loading").hide();
      var target = $parent.find("." + options.tab);
      if(target.is(".lnd-tabcontents-guides")) {
        $(".lnd-column-right").hide();
        $(".lnd-maincontents-home .lnd-row-4col").removeClass("lnd-row-hide"); 
      } else {
        $(".lnd-column-right").show();
        $(".lnd-maincontents-home .lnd-row-4col").addClass("lnd-row-hide");
      }
      //$(".lnd-image-rc",$parent).lndRoundedCorners();
      $.bindLindabEvents($parent);
      target.show();
    });
  });
  
  lindab.ajax.events.set('subitem-home-precall', function(options) {
    var elem = $(this);
    if(!elem.parent().is(".active")) {
      if(!elem.is(".lnd-tabcontents-loaded")) {
        var $parent = $("#lnd-tabs-body");
        var $loader = $('<div class="lnd-contentsloader"><span>'+lindab.ui.translation.getTranslation("loading")+'...</span></div>');
        $parent.find(".lnd-tabcontents").addClass("lnd-loading");
        $parent.prepend($loader);
        // perform the ajax-request
        lindab.ajax.request(options);
      } else {
        var $parent = $("#lnd-tabs-body");
        $parent.find(".lnd-tabcontents").hide();
        var target = $parent.find("." + options.tab);
        if(target.is(".lnd-tabcontents-guides")) {
          $(".lnd-column-right").hide();
          $(".lnd-maincontents-home .lnd-row-4col").removeClass("lnd-row-hide"); 
        } else {
          $(".lnd-column-right").show();
          $(".lnd-maincontents-home .lnd-row-4col").addClass("lnd-row-hide");
        }
        target.show();
      }
    }
      
  });
  
  lindab.ajax.events.set('subhome-item-callback', function(options,data) {
    var elem = options.element;
    elem.addClass("lnd-tabcontents-loaded");
    if(elem.is(".lnd-link-guides")) {
      var $html = $('<div class="lnd-tabcontents lnd-tabcontents-guides"></div>');
    } else {
      var $html = $('<div class="lnd-tabcontents"></div>');
    }
    $html.html(data.tabshtml).addClass(options.tab);
    var $parent = $("#lnd-tabs-body");
    $parent.append($html);
    $loader = $parent.find(".lnd-contentsloader");
    $loader.fadeOut(250,function() {
      $loader.remove();
      $parent.find(".lnd-tabcontents").removeClass("lnd-loading").hide();
      var target = $parent.find("." + options.tab);
      if(target.is(".lnd-tabcontents-guides")) {
        $(".lnd-column-right").hide(); 
        $(".lnd-maincontents-home .lnd-row-4col").addClass("lnd-row-hide");
      } else {
        $(".lnd-column-right").show();
        $(".lnd-maincontents-home .lnd-row-4col").addClass("lnd-row-hide");
      }
      //$(".lnd-image-rc",$parent).lndRoundedCorners();
      $.bindLindabEvents($parent);
      target.show();
    });
  });
  
  lindab.states.set('debug',false);
  lindab.states.set('document','loading');

  // Document ready
  $(function()
  {
    
    // Set GUI PATH
    if(typeof(LND_GUIPATH) != "undefined") {
      lindab.vars.set('guipath', LND_GUIPATH);
    } else {
      lindab.vars.set('guipath', '/');
    }

    // If Browser is MSIE, bind specific events
		if($.isBrowserIE() != false) {
		  $.bindMSIEEvents();
		} else {
      lindab.states.set('browser-capable',true);
		}

    // Bind events (those that will need re-binding after AJAX-inserting)
    $.bindLindabEvents();
    
    // Print Handler
    $.setupPrint();
    
    // Search navigation/filtering events
		$("#lnd-searchfilters").searchFilters();
    
		// Trigger Breadcrumb events if it's present in DOM onload
		lindab.ui.navigation.breadcrumb.activate();

		// Bind Guide Tools
		$("#guide-tools a").live("click",function() {
			$.guideToolsLink($(this));
		});
		
    // Bind Topmenu events		
    $("#lnd-topmenu .lnd-list").lndTopMenu();
	
    if ($.isBrowserIE() == "7") {
        // In IE7 remove the ajaxLink class on the drilldown menu and the navigation tabs
        $('#lnd-drilldown a.lnd-ajaxlink').removeClass('lnd-ajaxlink');
        $('ul.lnd-tabs a.lnd-ajaxlink').removeClass('lnd-ajaxlink');
    }

	// General Ajax link handler
	$("a.lnd-ajaxlink").ajaxLink();
		
	// Tabs-handler
	lindab.ui.navigation.tabs($('ul.lnd-tabs'));
		
    // Print handler
    $(".lnd-link-print").live("click",function() {
      window.print();
      return false;
    });
    
    // Top link selector handlers
    $(".lnd-link-topselect").lindabTopSelect();
		
    // Input mem for Search bar
    $(".lnd-formelement-memory, #lnd-quicksearch-field:not('.lnd-input-search-nomem')").inputMemory();
    
    // Search autocomplete handlers
    lindab.autocomplete.init();
    
    // Modal events
    $(".lnd-link-modal").live("click",function() {
      lindab.ui.navigation.modalwindow($(this));
      return false;
    });
    
    // Contact-selector
    $(".lnd-module-box .lnd-contact .lnd-select-contact").live("change",function() {
      var select = $(this);
      var parent = select.parents(".lnd-contact");
      var contacts = parent.metadata().contacts;
      var id = 'contact-area-' + select.val();
      var data = lindab.ui.navigation.contactselect.buildContacts(select,id,contacts[id]);
      parent.find(".lnd-contact-details").html(data.html);
      
      $(".lnd-contact-navigation .lnd-nav-track-current",parent).html("1");
      $(".lnd-contact-navigation .lnd-nav-track-total",parent).html(data.count);
      if(data.count > 1) {
        $(".lnd-contact-navigation",parent).addClass("lnd-contact-navigation-active");
      } else {
        $(".lnd-contact-navigation",parent).removeClass("lnd-contact-navigation-active");
      }
      return false;
    });
    
    // New window handler    
    $('a.lnd-link-external').live("click",function() {
			$(this).attr("target","_blank");
		});
    
    // Video tabs
    lindab.ui.tools.mediatabs($(".lnd-module-mediatabs"));
    
    // Color picker events
    lindab.ui.tools.colorpicker($(".lnd-colorpicker"));
				
    // Area selector handler
    lindab.ui.tools.areaselector($(".lnd-module-areaselector"));
    
    // Lindab Stock info - fetches HTML from backend
    lindab.ui.tools.stockinfo($("#lnd-stockinfo"));
    
    // Lindab Mini-tip - binds events to display minimal tooltip
    $(".lnd-link-minitip").lindabMiniTip();
    
    // Tracking links
    $(".lnd-tracklink").lindabTrackLink();

		// history plugin init - check for hash and load ajax-contents depening on the bookmark
		$.history.init(function(hash){
      if(hash != "") {
        // initialize your app
        lindab.utils.log('jquery.history', 'found hash at load at document load', hash);
        var bookmarkData = $('#lnd-drilldown').metadata().bookmarkData;
        var data = lindab.bookmark.unSerialize(bookmarkData.prefix, hash);
        
				if(!override) {
			  	lindab.ajax.request({
			  		url: bookmarkData.url,
			  		callback: 'drilldown-bookmark',
			  		data: data
			  	});
  		  }
        override = false;
      }
    },
    { unescape: true });
    
    // Init the map
    if ($('#lnd-finddealer').length > 0) {
        lindab.maps.init();
    }

    // Set state to ready - used internally
		lindab.states.set('document','ready');
		
  });
})(jQuery);
