var map;
var geocoder;
var circle;
var api;
var myScroll;
var dealer = [];
var dealerDistance = [];
var dealerProducts = [];
var markers = [];
var message;
var messages = [];
var directionDisplay;
var directionsService;

var layoutCheck = false;
var search = false;
var locationSearch = false;
var dealerSearch = false;
var directionSearch = false;
var backSearch = false;
var center = null;
var centerMarker = null;
var selectedDealer = false;
var copiedSearchInput = null;
var panorama = null;
var initialLocation = null;
var markerCluster = null;

var productsFilter = new Array('passenger', 'truckbus', 'offroad', 'motorcycle', 'agri');

var unit = 'km';
var radius = 10;

var bottomOffset = 212;


var isMobile = false;
if ( (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i)) || (navigator.userAgent.match(/Android/i)) || (navigator.userAgent.match(/webOS/i)) ) {
    isMobile = true;
}


function redrawScrollBar() {
    if (isMobile) {
        myScroll.refresh();
    }
    else {
       window.setTimeout(function() {
           api.reinitialise();
       }, 50);
    }
}



function parseXML(xmlfile) {
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    else {
        xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
    }
    xmlhttp.open('GET', xmlfile, false);
    xmlhttp.send();
    xmlDoc = xmlhttp.responseXML;

    return xmlDoc;
}


function resetMap() {
    if(panorama !== null) {
        panorama.setVisible(false);
    }

    for (var i = 0; i < markers.length; i++) {
        markers[i].setMap(null);
    }
    markers.length = 0;

    if(markerCluster !== null) {
        markerCluster.clearMarkers();
    }

    dealer.length = 0;
    dealerDistance.length = 0;
    dealerProducts.length = 0;

    if(message != undefined) {
        message.close();
    }

    messages.length = 0;

    if(typeof circle !== 'undefined') {
        circle.setMap(null);
    }

    directionsDisplay.setMap(null);

    selectedDealer = false;

    clearSidebar();

    $('#openingbox').hide();
    $('h2#dealersfound').show();

    if(locationSearch) {
        showFilters();
        $('#dealername').val('');
    }
    else if(dealerSearch) {
        hideFilters();
        $('#location').val('');
        $('#filters').hide();
        $('#productrange input, #filters .tyrerange input').removeAttr('checked');
    }
    else if(directionSearch) {
        hideFilters();
        $('h2#dealersfound').hide();
        $('h2#drivingdirections').show();
        $('#dealers').addClass('directionslist').find('.jspPane').html('');
        $('.jspPane').append('<a href="#" id="goback">&laquo; ' + $('#goback-text').text() + '</a><span class="clear"></span>');
        $('#dealername, #location').val('');
    }

    addPlaceholders();
}



function clearSidebar() {
    $('#dealers .jspPane').html('').removeClass('directionslist');
    $('h2#drivingdirections, #fuel-info').hide();
    $('#fuel-cost').html('');
}



function showSidebar() {
    $('.sidebarslider.out').hide();
    $('#sidebar, .sidebarslider.in').show(0, redrawScrollBar);
    $('#map').css('left', 370);

    google.maps.event.trigger(map, "resize");
    setCenterOffset(center);

}



function hideSidebar() {
    $('#map').css('left', 0);
    $('#sidebar, .sidebarslider.in').hide();
    $('.sidebarslider.out').show();

    google.maps.event.trigger(map, "resize");
    setCenterOffset(center);
}



function showFilters() {
    $('#filters, #filters div.tyrerange, #filters div.radius').show();
    $('#dealers').css({bottom: bottomOffset});
}


function hideFilters() {
    $('#sidebar #filters').hide();
    $('#dealers').css({bottom: 10});
}






function searchLocations() {
    var url;
    var xmlInput;

    locationSearch = false;
    dealerSearch = false;
    directionSearch = false;

    var address = $('#location').val();
    var dealerName = $('#dealername').val();
    var searchType = $('#searchtype').selectmenu('value');

    if (searchType == 'dealername' && dealerName !== '' && dealerName !== $('#dealername').attr('placeholder')) {
        search = true;
        dealerSearch = true;

        productsFilter.length = 0;
        productsFilter = new Array('passenger', 'truckbus', 'offroad', 'motorcycle', 'agri');

        resetMap();

        url = '/portal/dealerLocatorSearchServlet';
        xmlInput = {dealerSearchName: dealerName};
        generateXML(url, xmlInput);
    }
    else if (searchType == 'location' && address !== '' && address !== $('#location').attr('placeholder')) {
        geocoder.geocode({address: address}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                search = true;
                locationSearch = true;

                resetMap();

                center = results[0].geometry.location;
                centerMarker = new google.maps.Marker({
                    position: center
                });

                url = '/portal/dealerLocatorSearchServlet';
                xmlInput = {lat: center.lat(), lng: center.lng(), radius: radius};
                generateXML(url, xmlInput);
            }
            else if(address.length > 0) {
                showErrorDialog('dialog-notfound');
            }
        });
    }
}



function generateXML(url, xmlInput) {
    /*
    if(locationSearch) {
        loadXML(parseXML('testdata_large.xml'));
    }

    if(dealerSearch) {
        loadXML(parseXML('testdata_small.xml'));
    }
    */

    $.ajax({
        type: 'get',
        url: url,
        data: xmlInput,
        dataType: 'xml',
        success: loadXML
    });
}




function loadXML(xml) {

    var markerNodes = $(xml).find('marker');
    var markerNodeCount = markerNodes.length;

    var maxMarkers;
    if(locationSearch) {
        maxMarkers = 195;
    }
    else if(dealerSearch) {
        maxMarkers = 500;
    }

    if(markerNodeCount > 0) {
        markerNodes.each(function(i) {
            if(i < maxMarkers) {
                var distance = parseFloat($(this).attr('distance'));
                var address = $(this).attr('address');
                var city    = $(this).attr('city');
                var email   = $(this).attr('email');
                var name    = $(this).attr('name');
                var phone   = $(this).attr('phone');
                var website = $(this).attr('website');
                var lat     = parseFloat($(this).attr('lat'));
                var lng     = parseFloat($(this).attr('lng'));
                var latlng  = new google.maps.LatLng(lat, lng);

                var products = [];
                $(this).find('product').each(function(m) {
                    products[m] = $(this).text();
                });

                var services = [];
                $(this).find('service').each(function(n) {
                    services[n] = $(this).text();
                });

                dealer[i] = new Dealer(address, city, email, name, phone, website, products, services, lat, lng, latlng, distance, i);

                dealerDistance[i] = distance;
                dealerProducts[i] = products;
            }

            markerNodeCount--;

            if(markerNodeCount === 0) {
                filterDealers();
            }
        });

        if(locationSearch) {
            drawCircle();
        }

        if(dealerSearch) {
            if(dealer[0].length > 0) {
                center = dealer[0].latlng;

                centerMarker = new google.maps.Marker({
                    position: center
                });
            }
        }

        setCenterOffset(center);
    }
    else {
        $('#dealercount').text(0);

        if(locationSearch) {
            showErrorDialog('dialog-notfound');
        }

        if(dealerSearch) {
            showErrorDialog('dialog-nodealer');
        }

    }
}


function filterDealers() {

    if(search) {
        var dealerCount = 0;
        var passengerCount = 0;
        var truckbusCount = 0;
        var offroadCount = 0;
        var motorcycleCount = 0;
        var agriCount = 0;

        if(message != undefined) {
            message.close();
        }

        $('#dealers').removeClass('directionslist').find('.jspPane').html('');

        for (var i=0; i<dealerDistance.length; i++) {

            var isFiltered = false;

            if(dealerDistance[i] <= radius) {

                for (var j=0; j<dealerProducts[i].length; j++) {

                    var product = dealerProducts[i][j];

                    if(!isFiltered) {
                        if($.inArray(product, productsFilter) >= 0) {
                            isFiltered = true;
                        }
                    }

                    switch (product) {
                        case 'passenger':
                            passengerCount++;
                            break;
                        case 'truckbus':
                            truckbusCount++;
                            break;
                        case 'offroad':
                            offroadCount++;
                            break;
                        case 'motorcycle':
                            motorcycleCount++;
                            break;
                        case 'agri':
                            agriCount++;
                            break;
                    }
                }
            }

            if(selectedDealer !== false) {
                dealer[selectedDealer].selected = false;
                dealer[selectedDealer].highlight(false);
            }

            if(!isFiltered) {
                markers[i].setVisible(false);
            }
            else {
                dealerCount++;

                dealer[i].markerRed = new google.maps.MarkerImage(
                    '/resources/dealerlocator/internet/img/markers/map_marker_red_'+dealerCount+'.png',
                    new google.maps.Size(24, 33),
                    new google.maps.Point(0, 0),
                    new google.maps.Point(0, 33));

                dealer[i].markerBlack = new google.maps.MarkerImage(
                    '/resources/dealerlocator/internet/img/markers/map_marker_black_'+dealerCount+'.png',
                    new google.maps.Size(24, 33),
                    new google.maps.Point(0, 0),
                    new google.maps.Point(0, 33));

                markers[i].setIcon(dealer[i].markerBlack);
                markers[i].setVisible(true);

                dealer[i].setDealerCount(dealerCount);
                dealer[i].appendToList();

                $('#dealer'+i).find('.marker').text(dealerCount);
            }
        }

        if(dealerSearch) {
            map.setZoom(5);
            var markerClusterImage = {width: 24, height: 33, url: '/resources/dealerlocator/internet/img/map_marker_black_plus.png'};
            var mcOptions = {gridSize: 50, maxZoom: 12, styles: [markerClusterImage, markerClusterImage, markerClusterImage, markerClusterImage, markerClusterImage]};
            markerCluster = new MarkerClusterer(map, markers, mcOptions);
        }

        $('#dealercount').text(dealerCount);

        var tyreRangeContainer = $('#sidebar div.tyrerange');
        tyreRangeContainer.find('li.passenger .count').text(passengerCount);
        tyreRangeContainer.find('li.truckbus .count').text(truckbusCount);
        tyreRangeContainer.find('li.offroad .count').text(offroadCount);
        tyreRangeContainer.find('li.motorcycle .count').text(motorcycleCount);
        tyreRangeContainer.find('li.agri .count').text(agriCount);


        showSidebar();
        createTooltips();
        redrawScrollBar();
    }
}



function createTooltips() {
    $('#dealers .tooltip').qtip('destroy');

    var serviceTypes = ['rft', 'firststop', 'firestone', 'truckpoint', 'bikersclub', 'agripoint'];

    for (var i=0; i<serviceTypes.length; i++) {
        $('#dealers .'+serviceTypes[i]).qtip({
            content: {
                text: '<span class="title '+serviceTypes[i]+'"></span>'+$('#'+serviceTypes[i]+'-text').text()
            },
            position: {
                my: 'bottom left',
                at: 'top center'
            },
            show: {
                solo: true,
                delay: (!isMobile) ? 150 : '',
                event: (!isMobile) ? 'mouseenter' : 'click',
                effect: function(offset) {
                    $(this).fadeIn('fast');
                }
            },
            hide: {
              event: 'click mouseleave touchstart touchend touchmove'
            },
            style: {
                classes: 'ui-tooltip-shadow ui-tooltip-light'
            }
        });
    }
}



function drawCircle() {
    if(typeof circle !== 'undefined') {
        circle.setMap(null);
    }

    circle = new google.maps.Circle({
        map: map,
        radius: radius * 1000, //meters
        strokeColor: '#000',
        strokeOpacity: 0.5,
        strokeWeight: 1,
        fillColor: '#fff',
        fillOpacity: 0.15
    });

    circle.bindTo('center', centerMarker, 'position');

    map.fitBounds(circle.getBounds());
}




function setCenterOffset(centerLatLng) {
    map.setCenter(centerLatLng);
    map.panBy(0, -20);
}






function Dealer(address, city, email, name, phone, website, products, services, lat, lng, latlng, distance, i) {
    this.address = address;
    this.city = city;
    this.email = email;
    this.name = name;
    this.phone = phone;
    this.website = website;
    this.products = products;
    this.services = services;
    this.lat = lat;
    this.lng = lng;
    this.position = latlng;
    this.distance = distance;
    this.number = i;
    this.selected = false;
    this.marker = undefined;
    this.listItem = undefined;
    this.markerRed = undefined;
    this.markerBlack = undefined;
    this.markerZIndex = undefined;
    this.listItemContent = false;
    this.dealerCount = null;

    this.setMarker();
    this.createList();
}



Dealer.prototype.setDealerCount = function(dealerCount) {
    this.dealerCount = dealerCount;
}


Dealer.prototype.setMarker = function() {
    if (this.marker === null || this.marker === undefined) {

        var me = this;

        var marker = new google.maps.Marker({
            map: map,
            position: me.position,
            visible: false
        });


        this.marker = marker;
        this.markerZIndex = this.marker.getZIndex();

        google.maps.event.addListener(this.marker, 'click', function() {
            var isSelected = me.selected;

            me.select();

            var currentDealer = $('#dealers .dealer.current');

            if(me.listItem.hasClass('current') === false) {
                currentDealer.find('.details').hide(0, redrawScrollBar);
                currentDealer.find('.showdetails').removeClass('open');
                currentDealer.removeClass('current');
                me.listItem.addClass('current');
            }

            if(isSelected === false) {
                var x = 8;
                var y = $('#dealer'+me.number).position().top - 5;

                if(isMobile) {
                    myScroll.scrollTo(x, -y, 400);
                }
                else {
                    api.scrollTo(x, y, true);
                }
            }
        });

        markers.push(this.marker);
    }
}





Dealer.prototype.createList = function() {

    var me = this;

    var content = '<div id="dealer'+this.number+'" class="dealer">';
            content += '<div class="alwaysvisible cf">';
                content += '<span class="marker"></span>';
                content += '<h3>';
                    content += '<span class="title">'+this.name+'</span>';
                    if(!dealerSearch) { content += '<span class="distance">'+this.distance.toFixed(1)+' '+unit+'</span>'; }
                content += '</h3>';
                content += '<address class="cf">'+this.address+'<br />'+this.city+'</address>';
                content += '<a href="#" class="showdetails"><span class="triangle"></span><span class="text">'+$('#details-text').text()+'</span></a>';
            content += '</div>';

            content += '<div class="details cf">';

                content += '<ul class="contactdetails cf">';
                if(this.phone)   {content += '<li class="phone">'+this.phone+'</li>';}
                if(this.email)   {content += '<li class="mail"><a href="mailto:'+this.email+'">'+this.email+'</a></li>';}
                if(this.website) {content += '<li class="web"><a href="'+this.website+'" target="_blank">'+this.website.replace('http://', '')+'</a></li>';}
                content += '</ul>';


                content += '<h4 id="tyredealer-title">'+$('#tyredealerfor-text').text()+':</h4>';
                content += '<ul class="tyrerange cf">';
                if(this.products.length) {
                    for(var i in this.products) {
                      content += '<li class="'+this.products[i]+'">'+this.products[i]+'</li>';
                    }
                }
                else {
                    content += '<p>'+$('#noproductrange').text()+'</p>';
                }
                content += '</ul>';


                if(this.services.length) {
                    content += '<h4 id="servicepoint-title">'+$('#servicepointfor-text').text()+':</h4>';
                    content += '<ul class="servicepoints cf">';

                    for(var s in this.services) {
                        content += '<li class="'+this.services[s]+' tooltip">'+this.services[s]+'</li>';
                    }
                    content += '</ul>';
                }

                content += '<button type="button" class="directions">'+getDirections+'</button>';
            content += '</div>';
        content += '</div>';

    this.listItemContent = content;
}



Dealer.prototype.appendToList = function() {

    var me = this;

    $('#dealers .jspPane').append(this.listItemContent);

    this.listItem = $('#dealer'+this.number);

    google.maps.event.addDomListener(this.listItem[0], 'mouseover', function() {
        me.highlight(true);
    });

    google.maps.event.addDomListener(this.listItem[0], 'mouseout', function() {
        if(!me.selected) {
            me.highlight(false);
        }
    });

    google.maps.event.addDomListener(this.listItem[0], 'click', function() {
        me.select();
    });

    this.listItem.on('click', 'button.directions', function() {
        me.select();

        window.setTimeout(function () {
            $('#infowindow ul.navigation li:first-child a').removeClass('selected');
            $('#infowindow ul.navigation li:nth-child(2) a').addClass('selected');
            $('#infowindow div#first').hide();
            $('#infowindow div#second').show();
        }, 50);
    });
}



Dealer.prototype.createInfoWindow = function() {
    var me = this;

    if (messages) {
        for (i in messages) {
            messages[i].close();
        }
    }

    var content = '<div id="infowindow">';
            content += '<div class="tabs">';

                content += '<span class="close">close</span>';
                content += '<ul class="navigation">';
                    content += '<li><a id="tablink1" onclick="var obj=this; tabClick(event, obj)" class="selected" href="#first">'+$('#information-text').text()+'</a></li>';
                    content += '<li><a id="tablink2" onclick="var obj=this; tabClick(event, obj)" href="#second">'+$('#getdirections-text').text()+'</a></li>';
                content += '</ul>';

                content += '<div id="first" class="tab">';
                    content += '<div class="innertab">';
                        content += '<h3>'+this.name.substring(0, 64)+'</h3>';
                        content += '<address class="cf"><span>'+this.address+'</span><br /><span>'+this.city+'</span></address>';
                        content += '<ul class="contactdetails cf">';
                            if(this.phone)   { content += '<li class="phone">'+this.phone+'</li>'; }
                            if(this.email)   { content += '<li class="mail"><a href="mailto:'+this.email+'">'+this.email.substring(0, 30)+'</a></li>'; }
                            if(this.website) { content += '<li class="web"><a href="'+this.website+'" target="_blank">'+this.website.replace('http://', '').substring(0, 63)+'</a></li>'; }
                        content += '</ul>';
                    content += '</div>';
                content += '</div>';

                content += '<div id="second" class="tab">';
                    content += '<div class="innertab">';
                        content += '<h3>'+$('#startinglocation-text').text()+'</h3>';
                        content += '<label for="start-address">'+$('#streetaddress-text').text()+'</label>';
                        content += '<input type="text" name="start-address" id="start-address" />';
                        content += '<label for="start-city">'+$('#citypostal-text').text()+'</label>';
                        content += '<input type="text" name="start-city" id="start-city" />';
                        content += '<span id="getdirections" class="button">'+$('#getdirections-text').text()+'</span>';
                    content += '</div>';
                content += '</div>';

            content += '</div>';

            content += '<div class="footer"></div>';

        content += '</div>';

    message = new InfoBox({
                parentObject: me,
                content: content,
                disableAutoPan: false,
                maxWidth: 270,
                pixelOffset: new google.maps.Size(-22, -278),
                zIndex: null,
                boxStyle: null,
                closeBoxMargin: '',
                closeBoxURL: '',
                infoBoxClearance: new google.maps.Size(1, 1),
                isHidden: false,
                pane: 'floatPane',
                enableEventPropagation: false
    });

    message.open(map, me.marker);
    messages.push(message);
}




Dealer.prototype.select = function() {
    var me = this;

    for (var i = 0; i < dealer.length; i++) {
        if(me.number != i && dealer[i].marker != undefined) {
            dealer[i].unselect();
        }
    }

    if (me.selected !== true) {

        if(dealerSearch) {
            map.setZoom(15);
        }

        selectedDealer = me.number;

        me.selected = true;
        me.highlight(true);

        me.createInfoWindow();

        setCenterOffset(this.position);
    }
};




Dealer.prototype.unselect = function() {
    this.selected = false;
    this.highlight(false);
};




Dealer.prototype.highlight = function(highlight) {
    if(highlight) {
        this.marker.setOptions({zIndex: 1000, icon: this.markerRed});
    }
    else {
        this.marker.setOptions({zIndex: this.markerZIndex, icon: this.markerBlack});
    }
}





Dealer.prototype.calcRoute = function() {
    var googleUnit = null;
    var startAddress = document.getElementById('start-address').value ;
    var startCity = document.getElementById('start-city').value;

    var start = startAddress + ' ' + startCity;
    var end = new google.maps.LatLng(this.lat, this.lng);

    if(unit == 'km') {
        googleUnit = google.maps.UnitSystem.METRIC;
    }
    else {
        googleUnit = google.maps.UnitSystem.IMPERIAL;
    }

    var request = {
        origin: start,
        destination: end,
        travelMode: google.maps.DirectionsTravelMode.DRIVING,
        unitSystem: googleUnit  // METRIC (km) or IMPERIAL (miles)
    };

    directionsService.route(request, function(response, status) {

        if (status == google.maps.DirectionsStatus.OK) {

            if(locationSearch) {
                copiedSearchInput = $('#location').val();
                backSearch = 'location';
            }
            else if(dealerSearch) {
                copiedSearchInput = $('#dealername').val();
                backSearch = 'dealername';
            }

            directionSearch = true;
            locationSearch = false;
            dealerSearch = false;

            resetMap();

            directionsDisplay.setMap(map);
            directionsDisplay.setDirections(response);
            directionsDisplay.setPanel($('#dealers .jspPane')[0]);
        }
        else {
            showErrorDialog('dialog-nostarting');
        }
    });


    google.maps.event.addListener(directionsDisplay, 'directions_changed', function() {
        window.setTimeout(adjustDirectionsList, 800);
    });


    function computeTotalDistance(result) {
        var total = 0;
        var myroute = result.routes[0];
        for (i = 0; i < myroute.legs.length; i++) {
            total += myroute.legs[i].distance.value;
        }

        return total;
    }



    function adjustDirectionsList() {
        var fuelCost = calculateFuelCost(computeTotalDistance(directionsDisplay.directions));
        $('#fuel-cost').html(fuelCost+' &euro;');

        var fuelInfo = $('#fuel-info').html();

        $('.jspPane .adp-summary .fuel-info').html('');
        $('.jspPane .adp-summary').append('<div class="fuel-info">'+fuelInfo+'</div>');
        $('.jspPane .adp-summary').appendTo('.jspPane > div');

        redrawScrollBar();
    }
}









function initialize() {

    unit = $('#unit').text();   //'km' or 'miles'
    radius = parseFloat($('#selectradius option:selected').val()); //default radius in km

    geocoder = new google.maps.Geocoder();

    map = new google.maps.Map(document.getElementById('map'),
    {
        zoom: 5,
        tilt: 45,
        center: new google.maps.LatLng(51.72702815704774, 8.7890625),
        mapTypeId: google.maps.MapTypeId.ROADMAP,
        mapTypeControl: true,
        mapTypeControlOptions: {
            style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
            position: google.maps.ControlPosition.TOP_RIGHT
        },
        panControl: false,
        zoomControl: true,
        zoomControlOptions: {
            style: google.maps.ZoomControlStyle.LARGE,
            position: google.maps.ControlPosition.RIGHT_TOP
        },
        streetViewControl: true,
        streetViewControlOptions: {
            position: google.maps.ControlPosition.RIGHT_TOP
        }
    });




    $('#header .searchinput').keypress(function(e){
        if(e.which === 13){
            searchLocations();
        }
    });

    google.maps.event.addDomListener(document.getElementById('startsearch'), 'click', function() {
        searchLocations();
    });





    var input = document.getElementById('location');
    var autocomplete = new google.maps.places.Autocomplete(input);

    autocomplete.bindTo('bounds', map);

    google.maps.event.addListener(autocomplete, 'place_changed', function() {
        searchLocations();
    });


    google.maps.event.addListenerOnce(map, 'idle', function() {
        window.setTimeout(function() {
            var urlSearchValue = getParameterByName('searchValue');
            var urlSearchType = getParameterByName('searchType');

            if(urlSearchValue != false && urlSearchValue != '' && urlSearchType != false && urlSearchType != '') {
                searchUrl(urlSearchValue, urlSearchType);
            }
            else if(isMobile) {
                findUserLocation();
            }
        }, 200);
    });


    directionsDisplay = new google.maps.DirectionsRenderer({draggable: true});
    directionsService = new google.maps.DirectionsService();
}






$(document).ready(function() {

    if(isMobile) {
        $('#dealers').append('<div class="jspPane"></div>');
        myScroll = new iScroll('dealers', {scrollbarClass: 'myScrollbar', hideScrollbar: false});
        document.addEventListener('touchmove', function (e) {e.preventDefault();}, false);
        document.addEventListener('touchstart', function () {$('.qtip.ui-tooltip').qtip('hide');}, false);
        document.addEventListener('DOMContentLoaded', initialize, false);
    }
    else {
        $('#dealers').jScrollPane({mouseWheelSpeed: 50});
        api = $('#dealers').data('jsp');
    }


    $('#dealers').on('click', '.dealer', function() {
        if($(this).hasClass('current') === false) {
            $('.dealer.current').find('.details').hide(0, redrawScrollBar);
            $('.dealer.current').find('.showdetails').removeClass('open');
            $('.dealer.current').removeClass('current');
            $(this).addClass('current');
        }
    });


    $('#dealers').on('click', '.showdetails', function() {
        if($(this).hasClass('open')) {
            $(this).removeClass('open');
        }
        else {
            $(this).addClass('open');
        }

        if($(this).closest('.dealer').hasClass('current') === false) {
            $('#dealers .dealer.current').find('.details').hide();
            $('#dealers .dealer.current').find('.showdetails').removeClass('open');
            $('#dealers .dealer.current').removeClass('current');
            $(this).closest('.dealer').addClass('current');
        }

        $(this).closest('.dealer').find('.details').toggle(0, redrawScrollBar);

        return false;
    });




    $('#filters h3 .text').click(function() {
        var newBottomOffset;
        var newDealerHeight;

        var box = $('div.' + $(this).closest('h3').attr('class').split(' ')[0]);
        var boxTitle = $(this).closest('h3');
        var boxHeight = box.height();

        var dealerBottomOffset = parseInt($('#dealers').css('bottom').replace('px', ''));
        var dealerHeight = $('.jspContainer').height();

        if(boxTitle.hasClass('closed')) {
            boxTitle.removeClass('closed');
            newBottomOffset = dealerBottomOffset + boxHeight;
            newDealerHeight = dealerHeight - boxHeight;
        }
        else {
            boxTitle.addClass('closed');
            newBottomOffset = dealerBottomOffset - boxHeight;
            newDealerHeight = dealerHeight + boxHeight;
        }

        box.toggle();

        $('#dealers').css({bottom: newBottomOffset});
        $('.jspContainer').height(newDealerHeight);

        redrawScrollBar();
    });








    var heighestLenght = 0;
    $('#searchtype option').each(function() {
        var currentLength = $(this).text().length;
        if(currentLength > heighestLenght) {
            heighestLenght = currentLength;
        }
    });


    var searchTypeWidth = 88;
    if(heighestLenght > 9) {
        searchTypeWidth = heighestLenght * 10;
        var padding = searchTypeWidth + 10;
        $('#header input.text').width(443 - padding).css('padding-right', padding);
    }

    $('#searchtype').selectmenu({
        width: searchTypeWidth,
        change: function(e, object) {
            setSearchType(object.value);
        }
    });


    $('#searchradius').selectmenu({
        width: 360,
        change: function(e, object) {
            $('select.radius').selectmenu('value', object.value);
            radius = object.value;
            if(locationSearch) {
                drawCircle();
                filterDealers();
            }
        }
    });


    $('#selectradius').selectmenu({
        width: 100,
        change: function(e, object) {
            $('select.radius').selectmenu('value', object.value);
            radius = object.value;
            if(locationSearch) {
                drawCircle();
                filterDealers();
            }
        }
    });






    $('#advancedsearch-slider').click(function() {

        $('#advancedsearch-wrap').toggle(0, headerHeightAdjust);

        if(!$(this).hasClass('down')) {
            $(this).addClass('down');
            $('#header .inputlabel').show();
        }
        else {
            $(this).removeClass('down');
            $('#header .inputlabel').hide();
        }

        return false;
    });






    $('#filters input:checkbox').click(function() {
        var productCount = 0;
        productsFilter.length = 0;

        $('#filters input:checkbox').each(function () {

            var checkedProduct = $(this).val();
            var checkedProductElement = 'li.'+checkedProduct+' input:checkbox';

            if($(this).is(':checked')) {
                productsFilter.push(checkedProduct);
                productCount++;

                $('#header #productrange').find(checkedProductElement).prop('checked', true);
            }
            else {
                $('#header #productrange').find(checkedProductElement).prop('checked', false);
            }
        });

        if(productCount === 0) {
            productsFilter = new Array('passenger', 'truckbus', 'offroad', 'motorcycle', 'agri');
        }

        filterDealers();
    });



    $('#productrange input:checkbox').click(function() {
        var productCount = 0;
        productsFilter.length = 0;

        $('#productrange input:checkbox').each(function () {

            var checkedProduct = $(this).val();
            var checkedProductElement = 'li.'+checkedProduct+' input:checkbox';

            if($(this).is(':checked')) {
                productsFilter.push(checkedProduct);
                productCount++;

                $('#filters').find(checkedProductElement).prop('checked', true);
            }
            else {
                $('#filters').find(checkedProductElement).prop('checked', false);
            }
        });

        if(productCount === 0) {
            productsFilter = new Array('passenger', 'truckbus', 'offroad', 'motorcycle', 'agri');
        }

        filterDealers();
    });



    $('.sidebarslider').click(function() {

        if($(this).hasClass('in')) {
            hideSidebar();
        }
        else {
            showSidebar();
        }

        return false;
    });


    $('#header #print').click(function() {
        window.print();
        return false;
    });


    $('#dealers').on('click', '#goback', function() {
        if(backSearch === 'location') {
            $('#location').val(copiedSearchInput);
        }
        else if(backSearch === 'dealername') {
            $('#dealername').val(copiedSearchInput);
        }

        backSearch = false;

        searchLocations();

        return false;
    });





    // open modal
    $('#header .button#mail').click(function() {
        $('#email p.error, #email p.success').remove();
        $('#email input.text').val('').removeClass('error');

        $('#mask').show().fadeTo('fast', 0.6);
        $('#email').fadeIn('fast');

        return false;
    });


    // close modal
    $('.modal .close, #mask').click(function() {
        $('.modal, #mask').stop(true, true).fadeOut('slow');
    });


    // validate and send
    $('#email input#mailsubmit').click(function() {

        $('#email p.error, #email p.success').remove();
        $('#email input.text').removeClass('error');

        var error_count = 0;
        var error_messages = [];
        var error_selector = [];

        error_messages.length = 0;
        error_selector.length = 0;

        var toName = $('#to-name').val();
        var toMail = $('#to-mail').val();

        var email_regex = /^[0-9A-Za-z._%+-]+@[0-9A-Za-z.-]+\.[A-Za-z]{2,6}$/;

        if(toName === '') {
            error_messages.push($('#no-name').text());
            error_selector.push('#to-name');
            error_count++;
        }

        if(email_regex.test(toMail) === false) {
            error_messages.push($('#no-valid-mail').text());
            error_selector.push('#to-mail');
            error_count++;
        }

        if(error_count === 0) {

            var searchValue = false;
            var searchType = false;

            if(locationSearch) {
                searchValue = $('#location').val();
                searchType = 'location';
            }
            else if(dealerSearch) {
                searchValue = $('#dealername').val();
                searchType = 'dealername';
            }

            $.ajax({
                type: 'get',
                url: '/portal/dealerLocatorSendEmailServlet',
                data: 'toName=' + toName + '&toMail=' + toMail + '&searchValue=' + searchValue + '&searchType=' + searchType + '&locale=' + localeCode,
                error: function() {
                    $('#mailsubmit').before($('<p class="error">An error has occurred. Please try again.</p>').hide().fadeIn('slow'));
                },
                success: function () {
                    $('#mailsubmit').before($('<p class="success">'+emailSuccessfullySent+'</p>').hide().fadeIn('slow'));
                }
            });
        }
        else {
            for(var i = 0; i < error_messages.length; i++) {
                $(error_selector[i]).addClass('error');
                $(error_selector[i]).after($('<p class="error">'+error_messages[i]+'</p>').hide().fadeIn('slow'));
            }
        }

        return false;
    });



    setSearchBoxMargin();
    addPlaceholders();
    adjustFilterLayout();


    $(window).resize(function () {
        setSearchBoxMargin();
        redrawScrollBar();
    });
});





function setSearchBoxMargin() {
    var width = $(window).width()/2 - 260;

    if((width < 200) && !($.browser.msie && $.browser.version=="7.0") && isMobile !== true) {
        $('#header #search').css({'margin-left': 200});
    }
    else {
        $('#header #search').css({'margin-left': 'auto', 'margin-right': 'auto'});
    }
}





function headerHeightAdjust() {
    var headerHeight = $('#header').height();

    $('#sidebar, #map, .sidebarslider.out').css({top: headerHeight+1});
    $('#openingbox').css({top: headerHeight+11});

    google.maps.event.trigger(map, "resize");
    redrawScrollBar();
}





function addPlaceholders() {
    var locationPlaceholder = $('#location-placeholder').text();
    var dealernamePlaceholder = $('#dealername-placeholder').text();

    $('#location').attr('placeholder', locationPlaceholder);
    $('#dealername').attr('placeholder', dealernamePlaceholder);
    $('#location, #dealername').placeholder();
}





function adjustFilterLayout() {
    if(layoutCheck !== true) {
        var maxCharCount = 0;
        var filters = $('#filters div.tyrerange ul li');

        filters.each(function() {
            var currentCharCount = $(this).find('span.text').text().length;

            if(currentCharCount > maxCharCount) {
                maxCharCount = currentCharCount;
            }
        });

        if(maxCharCount > 14) {
            filters.width(340).css('font-size', 12);

            bottomOffset = 266;
            $('#dealers').css({bottom: bottomOffset});
        }
    }

    layoutCheck = true;
}





function tabClick(event, obj) {
    $('#infowindow .tab').hide();
    $('#infowindow').find(obj.hash).show();
    $('#infowindow ul.navigation a').removeClass('selected');
    $(obj).addClass('selected');

    if (!event) {
        event = window.event;
    }

    if(event.preventDefault) {
        event.preventDefault();
    }
    else {
        event.returnValue = false;
    }

    if (event.stopPropagation) {
        event.stopPropagation();
    }
    else {
        event.cancelBubble = true;
    }
}




function calculateFuelCost(distance) {
    var drivingDistance = Math.round(distance/1000);

    var consumption = 8;
    var cost_per_litre = 2;

    var cost = (consumption/(100/drivingDistance)) * cost_per_litre;

    return cost.toFixed(1);
}





function setSearchType(searchtype) {
    if(searchtype == 'location') {
        $('#dealername').hide();
        $('#location').show();
        $('#advancedsearch-slider').show();
    }
    else if(searchtype == 'dealername') {
        $('#location').hide();
        $('#dealername').show();
        $('#advancedsearch-slider').hide();

        if($('#advancedsearch-slider').hasClass('down')) {
            $('#advancedsearch-slider').removeClass('down');
            $('#advancedsearch-wrap').hide(0, headerHeightAdjust);
        }
    }
}





function searchUrl(urlSearchValue, urlSearchType) {
    if(urlSearchType == 'location') {
        $('#location').val(urlSearchValue);
        $('#searchtype').selectmenu('value', 'location');
        setSearchType('location');
        searchLocations();
    }
    else if(urlSearchType == 'dealername') {
        $('#dealername').val(urlSearchValue);
        $('#searchtype').selectmenu('value', 'dealername');
        setSearchType('dealername');
        searchLocations();
    }
}





function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
    var regexS = "[\\?&]" + name + "=([^&#]*)";
    var regex = new RegExp(regexS);
    var results = regex.exec(window.location.href);

    if(results == null) {
        return '';
    }
    else {
        return decodeURIComponent(results[1].replace(/\+/g, " "));
    }
}




function showErrorDialog(dialogID) {
    $('#dialog:ui-dialog').dialog('destroy');
    $('#'+dialogID).dialog({
        modal: true,
        show: 'fade',
        hide: 'fade',
        buttons: {
            Ok: function() {
                $(this).dialog('close');
            }
        }
    });
}





function findUserLocation() {
    if(navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
            initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);

            geocoder.geocode({'latLng': initialLocation}, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    if (results) {
                        $('#searchtype').selectmenu('value', $('#searchtype').children(':first').val());
                        $('#advancedsearch-slider').show();

                        $('#dealername').hide();
                        $('#location').show();
                        $('#location').val(results[2].formatted_address);
                        searchLocations();
                    }
                }
            });
        });
    }
}
