var slider = {
    currentPosition: 0,
    
    init: function() {
        slider.handle   = $("#handle");
        slider.handleBg = $("div.handle-background");
        
        if ($("#slider").length) {
            $("#handle").draggable({
                drag: function() {
                    slider.onDrag(); 
                },
                stop: function() {
                    slider.onStop();
                },
                axis: "x",
                containment: "#slider"                
            });
        }
        if (window.location.hash.length) {
            switch(window.location.hash) {
                case "#engine":
                    slider.slideTo(1);
                    break;
                case "#eco":
                    slider.slideTo(2);
                    break;
            }
        }
    },
    
    onDrag: function() {
        slider.handleBg.css("left", slider.handle.css("left"))
    },
    
    onStop: function() {
        var left = parseInt(slider.handle.css("left") + 152);
        
        if (left < 163) {
            slider.slideTo(0);
        } else if (left > 152 && left < 490 && left ) {
            slider.slideTo(1);
        } else {
            slider.slideTo(2);
        }
    },
    
    slideTo: function(position, callback) {
        position = parseInt(position, 10);
        if (position < 0 && position > 2) {
            return false;
        }
        
        var animateTo   = [0, 327, 677];
        var container   = $('#content');
        var contentLoad = (slider.currentPosition != position);
        var url         = null;
        
        slider.handle.css("left", animateTo[position] + "px");
        slider.handleBg.animate({
            left: animateTo[position]
        }, 100);
        
        if (contentLoad) {
            flowplayer("player").pause();
            container.slideUp(200);
            url = "/mainpage/" + (position + 1);
            switch (position) {
                case 0:
                    window.location.hash = "sure";
                    break;
                case 1:
                    window.location.hash = "engine";
                    break;
                case 2:
                    window.location.hash = "eco";
                    break;
                default:
                    window.location.hash = "";
            }
            container.load(url, function() {
                init();
                swfobject.embedSWF("/sites/default/themes/tnkpulsar/img/flash/" + (position + 1) + ".swf", "flash", "481", "290", "10.0.0",
                       "./img/flash/expressInstall.swf", {}, {"wmode": "transparent"});
                container.slideDown(200, function() {
                    if (typeof callback != "undefined") {
                        callback();
                    }
                });
            });
        }
        slider.currentPosition = position;
        return true;
    }
}

var mainpage = {
    init: function() {
        flowplayer("player", "/sites/default/themes/tnkpulsar/img/flash/flowplayer/flowplayer-3.2.5.swf");
        $('a.movie-link').click(function(event) {
            var elem = $(this);
            var movieElem = $('div.movie');
            if (elem.attr('class') == 'movie-link-active') {
                movieElem.slideUp(300);
                elem.attr('class', 'movie-link');
                flowplayer("player").pause();
            } else {
                movieElem.slideDown(300);
                elem.attr('class', 'movie-link-active');
                flowplayer("player").resume();
            }
        });
        
        $('#advantage td').click(function(event) {
            var elem = $(this);
            var currentClassName = elem.attr('class');
            
            if (currentClassName.indexOf('-active') > 0) {
                elem.children('p.more').slideUp(100, function() {
                    elem.children('p.intro').slideDown(100);   
                });
                elem.attr('class', currentClassName.replace('-active', '')).animate({
                    width: 160
                }, 200);
            } else {
                // Ищем открытые элементы и закрываем их
                $('#advantage td').each(function() {
                    if ($(this).attr('class').indexOf('-active') > 0) {
                        $(this).click();
                    }
                });
                elem.children('p.intro').slideUp(100, function() {
                    elem.children('p.more').slideDown(100);   
                });                
                elem.attr('class', currentClassName + '-active').animate({
                    width: 376
                }, 200);
            }
        });
        
        $('#engine-research-link').click(function() {
            slider.slideTo(1, function() {
                $('div.research a.toggle-link').click();
                window.scrollTo(0, 889);
            });
        });
        
        $("#eco-aroma-link").click(function() {
            slider.slideTo(2, function() {
                window.scrollTo(0, 1088);
            });
        });
    }
}
var map, objManager, style, pulsarStyle;
var yMap = {
    init: function() {
        if ($("#map").length) {
            map = new YMaps.Map($("#map"));
            map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 10);
            map.disableDblClickZoom();
            map.enableScrollZoom();
            map.enableHotKeys();
            map.addControl(new YMaps.Zoom({ noTips: true }), new YMaps.ControlPosition(YMaps.ControlPosition.TOP_RIGHT, new YMaps.Point(10, 50)));
            
            // Добавляем контрол определения местоположения
            if (navigator.geolocation) {
                map.addControl(new locationControl(map));
            }
            map.addControl(new filterControl(map));
            
            // Определяем стили для меток
            style = new YMaps.Style();
            style.iconStyle = new YMaps.IconStyle();
            style.iconStyle.href = "/sites/default/themes/tnkpulsar/img/map-icon.png";
            style.iconStyle.size = new YMaps.Point(33, 40);
            style.iconStyle.offset = new YMaps.Point(-33, -20);
            style.iconStyle.shadow = new YMaps.IconShadowStyle();
            style.iconStyle.shadow.href = "/sites/default/themes/tnkpulsar/img/map-icon-shadow.png";
            style.iconStyle.shadow.size = new YMaps.Point(44, 21);
            style.iconStyle.shadow.offset = new YMaps.Point(-50, 0);
            
            pulsarStyle = new YMaps.Style();
            pulsarStyle.iconStyle = new YMaps.IconStyle();
            pulsarStyle.iconStyle.href = "/sites/default/themes/tnkpulsar/img/map-pulsar-icon.png";
            pulsarStyle.iconStyle.size = new YMaps.Point(33, 40);
            pulsarStyle.iconStyle.offset = new YMaps.Point(-33, -20);
            pulsarStyle.iconStyle.shadow = new YMaps.IconShadowStyle();
            pulsarStyle.iconStyle.shadow.href = "/sites/default/themes/tnkpulsar/img/map-icon-shadow.png";
            pulsarStyle.iconStyle.shadow.size = new YMaps.Point(44, 21);
            pulsarStyle.iconStyle.shadow.offset = new YMaps.Point(-50, 0);
            
            objManager = new YMaps.ObjectManager();
            map.addOverlay(objManager);
            var hash = {};
            hash.markers = data;
            hash.obj_manager = objManager;
            hash.min_distance_between_markers_px = 20;
            hash.marker_style = [style, pulsarStyle];
            yMap.placeMarkers(hash);
            
            
            // Обработка поиска по адресу
            $("#search-address").submit(function() {
                var address = $("#address").val();
                if (address != "") {
                    yMap.searchAddress(address);
                }
                return false;
            });
            
            // Обработка формы поиска маршрута
            $("#search-path").submit(function(event) {
                var from = $("#from").val();
                var to = $("#to").val();
                if (from != "" || to != "") {
                    var router = new YMaps.Router([from, to], [1]);
                    map.addOverlay(router);
                }
                return false;
            });
            
            // Переключение форм
            $("a.toggle-form").click(function(event) {
                if ($("#search-address").css("display") == "block") {
                    $(this).css("background-position", "0 -20px").children("span").text("Искать по адресу");                    
                } else {
                    $(this).css("background-position", "0 0").children("span").text("Искать по маршруту");
                }
                $("#search-address").toggle();
                $("#search-path").toggle();
                    
            });
            
            // Переключение фильтра
            $("#filter div").hide();
            $("#filter a.toggle").click(function() {
                $("#filter div").toggle();
            }); 
            
            $("#filter div a").click(function() {
                $(this).toggleClass('active');
                objManager.removeAll();
                var markers = new Array();
                var filters = new Array();
                $("#filter div a.active").each(function() {
                    var className = $(this).attr("class").replace(" active", "").replace("-", "_");
                    filters.push(className);
                });
                if (filters.length) {
                    for (var i = 0; i < data.length; i++) {
                        var isValid = true;
                        for (var j = 0; j < filters.length; j++) {
                            property = filters[j].toString();
                            if (data[i].hasOwnProperty(filters[j]) === false
                                || data[i][property] == "no") {
                                isValid = false;
                            }
                        }
                        if (isValid) {
                            markers.push(data[i]);
                        }
                    }
                } else {
                    markers = data;
                }
                var hash = {};
                hash.markers = markers;
                hash.obj_manager = objManager;
                hash.min_distance_between_markers_px = 20;
                hash.marker_style = [style, pulsarStyle];
                yMap.placeMarkers(hash);
            });
        }        
    },
    
    searchAddress: function(value) {
        var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy: map.getBounds()});
        YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
            if (this.length()) {
                var result = this.get(0);
                map.panTo(result._point, {flying: true});
            }else {
                alert("Ничего не найдено")
            }
        });
    },
    
    /**
     * Отображение объектов на карте в зависимости от текуего зума.
     * Взято отсюда http://clubs.ya.ru/mapsapi/replies.xml?item_no=14778
     *
     * @param {object} hash Объект с данными.
     * hash.markers - данные по маркерам (координаты и прочая информация)
     * hash.min_distance - минимальное расстояние между маркерами
     * hash.obj_manager - экземпляр YMaps.ObjectManager
     * hash.marker_style - стиля для маркеров
     */
    placeMarkers: function(hash) {
        // проходим по массиву маркеров
        var services = ["cafe", "pulsar95", "pulsar92", "tire_inflation", "bankomat", "pay_terminal", "car_wash"];
        var servicesTitle = ["Кафе", "Pulsar 95", "Pulsar 92", "Подкачка шин", "Банкомат", "Платежный терминал", "Мойка"];
        for (var i = 0; i < hash.markers.length; i++){
            // На карте есть несколько стилей для маркеров
            var style = (hash.markers[i].pulsar95 == 'yes' || hash.markers[i].pulsar92 == 'yes') ? hash.marker_style[1] : hash.marker_style[0];
            var placemark = new YMaps.Placemark(new YMaps.GeoPoint(hash.markers[i].lng, hash.markers[i].lat), {style: style});
            placemark.name = hash.markers[i].address;
            var description = '<div class="map-icons">';
            for (var k = 0; k < services.length; k++) {
                if (hash.markers[i].hasOwnProperty(services[k]) &&
                    hash.markers[i][services[k]] == "yes") {
                    description += '<span class="' + services[k] + '" title="' + servicesTitle[k] + '"></span>';
                }
            }
            description += "</div>";
            placemark.description = description;
            // предполагаем, что мы будем показывать маркер при любом зуме
            var min_zoom = 0;
            
            // первый маркер располагаем без каких либо проверок
            if (i > 0){
                // начиная со второго маркера определяем на каком зуме его следует начинать показывать
                // среди всех предыдущих маркеров отыскивам ближайший к текущему
                // для этого определяем переменную min_distance, как расстояние между текущим маркером и любым другим
                // затем перебираем маркеры и обновляем min_distance при нахождении меньшего расстояния
                var min_distance = null;
                for (var j = 0; j < i; j++) {
                    var distance = placemark.getGeoPoint().distance(new YMaps.GeoPoint(hash.markers[j].lng, hash.markers[j].lat));
                    if (!min_distance) {
                        min_distance = distance;
                    } else {
                        min_distance = Math.min(min_distance, distance);
                    }
                }
                // теперь зная расстояние до ближайшего маркера мы можем определить,
                // на каком зуме следует начинать показывать этот маркер, чтобы расстояние
                // между двумя маркерами не было меньше заданного минимума
                for(var zoom = 17; zoom >= 0; zoom--){
                    var min_distance_between_markers_m = Math.pow(2,(17-zoom)) * hash.min_distance_between_markers_px * (2/3);
                    if(min_distance_between_markers_m > min_distance){
                        var min_zoom = zoom+1;
                        break;
                    }
                }
            }
            // добавляем маркер с заданным минимальным зумом на карту
            hash.obj_manager.add(placemark, min_zoom);
        }
    }
}

function locationControl() {
    this.onAddToMap = function(map, position) {
        this.container = $("#get-location");
        this.position = position || new YMaps.ControlPosition(YMaps.ControlPosition.TOP_RIGHT, new YMaps.Size(10, 10));
        this.map = map;
        
        this.container.css({zIndex: YMaps.ZIndex.CONTROL});
        this.position.apply(this.container);
        this.container.appendTo(this.map.getContainer());
        
        this.container.children("a").click(function(event) {
            var elem = $(this);
            elem.text("Определение...");
            navigator.geolocation.getCurrentPosition(
                function(position) {
                    var coords = position.coords;
                    map.panTo(new YMaps.GeoPoint(coords.longitude, coords.latitude),
                              {flying: true,
                              callback: function() {
                                elem.text("Определить местоположение");
                            }});                    
                },
                function(error) {
                    elem.text("Определить местоположение");
                },
                {timeout: 5000}
            );
        });
    }
}

function filterControl() {
    this.onAddToMap = function(map, position) {
        this.container = $("#filter");
        this.position = position || new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Size(10, 10));
        this.map = map;
        
        this.container.css({zIndex: YMaps.ZIndex.CONTROL});
        this.position.apply(this.container);
        this.container.appendTo(this.map.getContainer());
    }
}

function init() {
    if ($('#mainpage').length) {
        mainpage.init();
    }
    
    if ($('.gallery').length) {
        $(".gallery").easySlider({
            auto: true,
            speed: 800,
            pause: 3000,
            nextText: '',
            prevText: '',
            continuous: true
        });
    }
    
    if ($('.ggallery').length) {
        $(".ggallery").easySlider({
            auto: true,
            speed: 800,
            pause: 3000,
            nextText: '',
            prevText: '',
            prevId: 'gprevBtn',
            nextId: 'gnextBtn',
            continuous: true
        });
    }
    
    if ($('.research').length) {
        $('.research-content').hide();
        $('.toggle-link').click(function() {
            if ($('.research-content').css('display') == 'block') {
                if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                    $('.research-content').hide(200);
                } else {
                    $('.research-content').slideUp(200);
                }
            } else {
                if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                    $('.research-content').show(200);
                } else {
                    $('.research-content').slideDown(200);
                }                
            }
        });
    }
    
    if ($('.research-widget').length) {
        $('.research-widget li>a').each(function() {
            $(this).click(function() {
                $(this).parent('li').children('div').toggle();
            });
        });
    }
    
    if ($('.research-results').length) {
        $('.research-results div.details').hide();
        $('.research-results div.more a').click(function() {
            var link = $(this);
            var details = $(this).parent('div').parent('div').children('div.details');
            if (details.css('display') == 'block') {
                link.text('Убедите меня').removeClass('up');
                if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                    details.hide(200);
                } else {
                    details.slideUp(200);
                }
                
            } else {
                link.text('Спасибо, убедили').addClass('up');
                if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                    details.show(200);
                } else {
                    details.slideDown(200);
                }                
            }
        });
    }
    
if ($('.country').length) {
        $('div.germany').hide();
        $("div.mercedes").hide();
        $('.country .russia').addClass('active');
        $(".engine-toggle a.vaz").addClass("active");
        $('.country a').click(function(event) {
            var link = $(event.target);
            if (link.hasClass('active')) {
                return false;
            } else {
                var country = link.attr('class');
                link.addClass('active');
                if (country == 'russia') {
                    $('.country .germany').removeClass('active');
                    $('div.germany').fadeOut(200, function() {
                        $('div.russia').fadeIn(200);
                    });
                } else {
                    $('.country .russia').removeClass('active');
                    $('div.russia').fadeOut(200, function() {
                        $('div.germany').fadeIn(200);
                    });
                }
            }
            return true;
        });
        $(".engine-toggle a").click(function(event) {
            var link = $(event.target);
            if (link.hasClass("active")) {
                return false;
            } else {
                var engine = link.attr("class");
                link.addClass("active");
                if (engine == "vaz") {
                    $(".engine-toggle a.mercedes").removeClass("active");
                    $("div.mercedes").fadeOut(200, function() {
                        $("div.vaz").fadeIn(200);
                    });
                } else {
                    $(".engine-toggle a.vaz").removeClass("active");
                    $("div.vaz").fadeOut(200, function() {
                        $("div.mercedes").fadeIn(200);
                    });
                }
            }
        });
    }
    
    
    if ($("a.helper-open").length) {
        $("a.helper-open").click(function() {
            $("div.hidden").show();
            $("div.research").css("z-index", 0);
            if ($.browser.msie && $.browser.version == '7.0') {
                $("div.research").hide();
            }
        });
        $("a.helper-close").click(function() {
            $("div.hidden").hide();
            $("div.research").css("z-index", 3);
            if ($.browser.msie && $.browser.version == '7.0') {
                $("div.research").show();
            }
        });
    }
    
    if ($("div.accordion").length) {        
        $("div.accordion div.link a").click(function(event) {
            var cut = $(this).parent("div.link").parent("li").children("div.cut");
            if (cut.css('display') == 'block') {
                $(this).removeClass("active");
                cut.slideUp(200);
            } else {
                $("div.accordion div.link a.active").removeClass("active");
                $(this).addClass("active");
                $("div.accordion div.cut").slideUp(200);
                cut.slideDown(200);
            }
        });
    }
    
    if ($("div.rightside").length) {
        $("div.rightside a").click(function() {
            if ($(this).hasClass("active")) {
                $("div.rightside").animate({
                    left: 35
                }, 200);
                $(this).removeClass("active");
            } else {
                $("div.rightside").animate({
                    left: 346
                });
                $(this).addClass("active");
            }
        });
    }
    
    $("div.faq-item>a").click(function(event) {
        var container = $(this).parent("div.faq-item");
        var answer = container.children("div.answer");
        if (answer.css("display") == 'none') {
            if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                answer.show(200);
            } else {
                answer.slideDown(200);
            }       
        } else {
            if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                answer.hide(200);
            } else {
                answer.slideUp(200);
            }
        }
    });
    
    if ($(".tgallery").length) {
        $('.tgallery a').click(function(event) {
            if ($(this).hasClass('selected')) {
                return false;
            }
            $('.tgallery a').removeClass('selected');
            $(this).addClass('selected');
            var src = $(this).attr("href");
            $("img.testimonial-photo").attr("src", src);
            return false;
        });
    }
}
$(document).ready(function() {
    init();
    slider.init();
    yMap.init();
    
    // Баннер для акции "Гонка за призами"
    swfobject.embedSWF("/sites/default/themes/tnkpulsar/img/flash/banner_racing.swf", "flash_banner_racing", "162", "135", "10.0.0",
                       "./img/flash/expressInstall.swf", {}, {"wmode": "transparent"});
});
