var map, geoManager;

function createMap()
{

    loadStreets();

    map = new YMaps.Map($("#YMapsID")[0]),
    geoManager = new GeocoderManager(map);

    map.setCenter(new YMaps.GeoPoint(34.366455, 61.785698), 13);

    var typeControl = new YMaps.TypeControl();
    typeControl.removeType(YMaps.MapType.MAP);
    //typeControl.removeType(YMaps.MapType.SATELLITE);
    //typeControl.removeType(YMaps.MapType.HYBRID);
    var myMap = new YMaps.MapType(YMaps.MapType.MAP.getLayers(), 'Карта');
    //var myHyb = new YMaps.MapType(YMaps.MapType.HYBRID.getLayers(), 'Спутник', {minZoom:9,maxZoom:14});
    typeControl.addType(myMap);
    //typeControl.addType(myHyb);
    map.setType(myMap);
    map.setMinZoom(11);

    // настраиваем расположение навигации на карте
    map.addControl(typeControl, new YMaps.ControlPosition(YMaps.ControlPosition.BOTTOM_LEFT, new YMaps.Size(2, 5)));
    map.addControl(new YMaps.Zoom({noTips:true}), new YMaps.ControlPosition(YMaps.ControlPosition.TOP_RIGHT, new YMaps.Size(5, 5)));
    map.addControl(new YMaps.ToolBar(), new YMaps.ControlPosition(YMaps.ControlPosition.TOP_LEFT, new YMaps.Size(5, 5)));
    map.addControl(new YMaps.ScaleLine(), new YMaps.ControlPosition(YMaps.ControlPosition.TOP_RIGHT, new YMaps.Size(50, 15)));

    //map.addControl(new YMaps.SmallZoom());
    //map.addControl(new YMaps.MiniMap());
    //map.addControl(new YMaps.ToolBar());
    //map.addControl(new YMaps.TypeControl());
    //map.addControl(new YMaps.SearchControl());

    map.enableRightButtonMagnifier();
    map.enableScrollZoom();


            YMaps.jQuery("#YMapsLinkInput").attr("value", window.location.href );

            // Получаем параметры из URL'а
            var params = {
                ll : getParam("ll"),          // Центр карты
                zoom : getParam("zm"),        // Масштаб
                layers : getParam("layers")   // Слои
            };

            var layersArray = new Array();
            layersArray = params.layers.split(',');

            // Если в урле заданы необходимые параметры центрируем карту в нужном месте
            if (params.ll && params.zoom) {
                map.setCenter(new YMaps.GeoPoint.fromString(params.ll), params.zoom);
            }

            if (params.layers) {
                for (var i=0;i<layersArray.length;i++)
                   {
                     var theLayer = '#layer_' + layersArray[i];
//                     map.addOverlay(layer+layersArray[i]);
                     YMaps.jQuery(theLayer).attr("checked", 1);
                   }
            }

            updateMapLinks();

            // Динамически формируем URL
            YMaps.Events.observe(map, [map.Events.BoundsChange, map.Events.Update],  function () {

               updateMapLinks();

            });

            // Получение параметра из URL'а
            function getParam (name, location) {
                location = location || window.location.search;
                var res = location.match(new RegExp('[?&]' + name + '=([^&]*)', 'i'));
                return (res && res[1] ? res[1] : '');
            }



    YMaps.Events.observe(map, map.Events.BalloonOpen, function (map) {
        balloon = map.getBalloon();
        $('#baloonOpenedId').text($('.objId').text());
        //map.update();
        $('.map_flash_container:visible').each(function() {
            var swf = $(this).attr('swf');
            if (swf)
            {
                $(this).attr('id', $(this).attr('flashid'));
                var so = new SWFObject(swf, $(this).attr('id'), "440", "330", "9.0.0", "#CCCCCC");
                so.addParam("quality", "high");
                so.write($(this).attr('id'));
                balloon.update();
            }
        });
    });

    YMaps.Events.observe(map, map.Events.BalloonClose, function (map) {
        $('#baloonOpenedId').text('');
        //map.update();
    });

}


function updateMapLinks()
{
                YMaps.jQuery("#YMapsLinkInput")
                    .attr("value", "http://www.ptzmap.ru/?ll=" + map.getCenter().toString() +
                                  "&zm=" + map.getZoom() +
                                  "&layers=" + YMaps.jQuery("#layersActiveList").text() +
                                  "&bln=" + YMaps.jQuery("#baloonOpenedId").text()
                    );

                //URL для ссылки "версия для печати"
                YMaps.jQuery("#YMapsLinkPrint")
                    .attr("href", "http://www.ptzmap.ru/map/?ll=" + map.getCenter().toString() +
                                  "&zm=" + map.getZoom() +
                                  "&layers=" + YMaps.jQuery("#layersActiveList").text() +
                                  "&bln=" + YMaps.jQuery("#baloonOpenedId").text()
                    );
}

/*
 function showAddress (value) {
     map.removeOverlay(geoResult);
     var geocoder = new YMaps.Geocoder(value, {results: 1, boundedBy: map.getBounds()});

     YMaps.Events.observe(geocoder, geocoder.Events.Load, function () {
         if (this.length()) {
             geoResult = this.get(0);
             map.addOverlay(geoResult);
             map.setBounds(geoResult.getBounds());
         }else {
             alert("Ничего не найдено")
         }
     });
 }
 */

function GeocoderManager (map)
{
    var _this = this;

    /*
     $('#SearchMap').bind('keyup', function (e) {
         if (e.keyCode == 13) {
             _this.search();
         }
     });
     */

    $('#SearchMapButton').bind('click', function () {
        if ($('#SearchMap').attr('value') != '-'){
            $('#SearchMapResultsKW').html('<img src="/img/loading.gif" width="16" height="16" alt="" class="loading">');
            _this.search();
        } else {
            alert ("Поиск невозможен - сначала выберите улицу!")
        }
    });

    this.search = function () {
        var searchString = "Петрозаводск, " + $('#SearchMap').attr('value');

        if ($('#SearchMapHouse').attr('value')) {
            searchString = searchString + ", " + $('#SearchMapHouse').attr('value');
        }
        if ($('#SearchMapBlock').attr('value')) {
            searchString = searchString + "К" + $('#SearchMapBlock').attr('value');
        }
        //        alert (searchString);
        geocoder = new YMaps.Geocoder(searchString);
        YMaps.Events.observe(geocoder, geocoder.Events.Load, _this.geocodeLoad, this);
    };

    this.geocodeLoad = function (geo) {
        var searchMapResults = $('#SearchMapResultsKW').html('');

        if (geo.suggest) {
            $('<div class="suggest">Быть может, Вы искали «<a id="geocoder-suggest" href="#">' + geo.suggest + '</a>»</div>')
            .find('#wizard-geocoder-suggest')
            .bind('click', function () {
                $('#SearchMap').attr('value', $(this).text());
                _this.search();
                return false;
            }).end()
            .appendTo(searchMapResults);
        }

        if (geo.length()) {
            searchMapResults
            .append('<h2>Результаты поиска:</h2><ul id="SearchMapResultsList"></ul>')
            .append($('<a class="b-pseudo-link clear2" href="#">Очистить результаты поиска</a>')
            .bind('click', function () {
                $('#SearchMapResultsKW').html('');
                return false;
            }));

            searchMapResults.wrapInner('<div class="content"></div>');

            for (var i = 0, l = geo.length(); i < l; i++) {

                var objjj = geo.get(i);
                if (objjj.precision != 'other')
                {
                    objjj.text = objjj.text.replace(/^Россия, республика Карелия, (.*)$/, "$1");
                }
                $("#SearchMapResultsList").append(this.createLi(objjj));


                if (geo.length() == 1) {
                    $('#SearchMapResultsList li').click();
                }

            }
            }else {
                searchMapResults.html('<span class="error">Искомая комбинация на карте Петрозаводска не встречается</span>');
            }
        }

        this.createLi = function (obj) {
            return $('<li><span>' + obj.text + '</span></li>')
            .bind('click', function () {
                $('#SearchMapResultsList li').removeClass('current');
                $(this).addClass('current');

                map.setBounds(obj.getBounds());
//                map.removeAllOverlays();
                map.addOverlay(obj);
                return false;
            })
        }
    }

