var map, zoomControl, geoResult;
var reqUrl = "/find/request.php";
var exml;
var MY_MARKER;
//corner of map
var y_min, y_max, x_min, x_max;
var act = '';
var el = YMaps.Events.observe;
var content = [];
var titles = [];
var i = 0;
var custommap;


var domIcon = new YMaps.Style();
domIcon.iconStyle = new YMaps.IconStyle("example#customPointIcon");
domIcon.iconStyle.offset = new YMaps.Point(0, 0);
domIcon.iconStyle.href = "/includes/ymaps/images/dom.png";
domIcon.iconStyle.size = new YMaps.Point(18, 18);
YMaps.Styles.add("example#customPoint", domIcon);



var domIconTemplate = new YMaps.Template(
"<div><img style=\"height:$[style.iconStyle.size.y];width:$[style.iconStyle.size.x];\" src=\"$[style.iconStyle.href]\"\/><div class=\"CustomPointName\">$[name|0]</div></div>");

YMaps.Templates.add("example#customPointIcon", domIconTemplate);



var searchBounds = {
    x_min: '',
    y_min: '',
    x_max: '',
    y_max: '',
    zoom: ''
};

/*
var placemark = new YMaps.Placemark(new YMaps.GeoPoint(
	30.202752, 50.605088), {style: "example#customPoint", hasHint: true});
           placemark.name = 'test';
		   var isShowOne = true;
           el(placemark, placemark.Events.BalloonOpen, function(mEvent) {
           flag_user_move = false;
           });
           if(isShowOne) {
            placemark.description = "bla bla bla"; 
            map.addOverlay(placemark); 
           }
*/

var flag_user_move = false;
//верхний левый угол. отсчитывем смещение при перемещении
var leftTop = YMaps.GeoPoint.fromString("30.202752,50.605088");

var arFilterObject = {};
var om;



$.ajaxSetup({
    url: reqUrl,
    timeout: 3500,
    type: "POST"
});


function addCustomMapType(mName,layers,minRes, maxRes) {
    custommap = new GMapType(layers, projectArr.normalProj, mName, {maxResolution:maxRes, minResolution:minRes, errorMessage:"Error map type!"}); 
    map.addMapType(custommap);

}

//Киев
var defPoint = {
    geoX : 30.546079,
    geoY : 50.408036,
    zoom : 10
};
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);
            var point = geoResult.getGeoPoint();
            map.panTo(point);

            map.setBounds(geoResult.boundedBy);
            var opt;
            //var gr = new YMaps.GeocoderResult(point);
            o2 = this.get(1);

            var kindObject = geoResult.kind;
            var country = geoResult.AddressDetails.Country.CountryName;

        } else {
            alert("Ничего не найдено");
        }
    });
}

//тайлы

var mapTypes = {
    "sattelite": "Спутник",
    "normal": "Карта"
};

 
function createMarker(point, html) {

    var placemark = new YMaps.Placemark(new YMaps.GeoPoint(31.64, 50.55));
    placemark.description = "<strong>!!!</strong><br/><span style=\'color:red\'>Это вам что ?</span>";
    map.addOverlay(placemark);
    placemark.openBalloon();

    var marker = new GMarker(point); //{title: 'Москва'}
    el(marker, "click",
    function() {
        marker.openInfoWindowHtml(html);
    });
    return marker;
}

function clearAll() {
	  
	 try{
		map.removeAllOverlays();
	  } catch(e) {
		//print_r(e,true);
	  }    
		
		
	
	$('#legend').html('');
    //$('#side_bar').html('');

    return;
}

function clearById(id) {
    map.removeOverlay(id);
    return;
}

function clearExml(remove) {
    remove = (remove) ? true: false;
    if (exml) {
        if (remove) {
			exml.removeOverlay();
		}
		else {
			exml.hide();
		}
    }
    $('#legend').html('');
    $('#side_bar').html('');

    return;
}

function createTextMarker(point, text) {
    var MY_MARKER = new GIcon(G_DEFAULT_ICON);
    MY_MARKER.shadow = "";
    //        MY_MARKER.image = "images/1x1.png";
    MY_MARKER.iconSize = new GSize(1, 1);
    MY_MARKER.iconAnchor = new GPoint(1, 1);
    MY_MARKER.infoWindowAnchor = new GPoint(1, 1);
    opts = {
        "icon": MY_MARKER,
        "clickable": true,
        "labelText": "<table border='0' height='20' cellpadding='0' cellspacing='0'><tr><td><img src='/maps/images/p_left.png' border='0' width='17' height='20'></td><td  valign='center'    background='images/p_bg.png'); class='iePNG'>" + text + "</td><td><img src='/maps/images/p_right.png' border='0' width='18' height='20'></td></tr></table>",
        "labelOffset": new GSize(0, -20)
    };
    var marker = new LabeledMarker(point, opts);
    map.addOverlay(marker);
    return;

}


function createObjects(marker, html) {
    el(marker, "click",
    function() {
       
        marker.openInfoWindowHtml(html);

    });
    return marker;
}


function getZoom() {
    return map.getZoom();
}


function showCurrentZoom() {
    var zoom = getZoom();
    
    $("#mapZoom span").html(zoom);
    return;
}

//увеличение карты       
function zoomAt(lat, lng, z) {
    map.setCenter(new YMaps.GeoPoint(lng, lat), z);

}


function getCoord() {
    var bounds = map.getBounds();

    var southWest = bounds.getLeftBottom();
    var northEast = bounds.getRightTop();

    y_min = southWest.getLat();
    y_max = northEast.getLat();
    x_min = southWest.getLng();
    x_max = northEast.getLng();
    return true;
}

//получаем тип карты (отображаемое имя)
function getMapType() {
    var mt = map.getCurrentMapType();
    return mt.getName();
}

//проверка заданного региона карты
function checkBounds() {

    if (allowedBounds.contains(map.getCenter())) {
        return;
    }
    var C = map.getCenter();
    var X = C.lng();
    var Y = C.lat();

    var AmaxX = allowedBounds.getNorthEast().lng();
    var AmaxY = allowedBounds.getNorthEast().lat();
    var AminX = allowedBounds.getSouthWest().lng();
    var AminY = allowedBounds.getSouthWest().lat();

    if (X < AminX) {
        X = AminX;
    }
    if (X > AmaxX) {
        X = AmaxX;
    }
    if (Y < AminY) {
        Y = AminY;
    }
    if (Y > AmaxY) {
        Y = AmaxY;
    }

    map.setCenter(new GLatLng(Y, X));

}


function getSearchParams(act, inJSON) {
    var zoom = getZoom();
	var params;
    if (!inJSON) {
        getCoord();
	params= "?act=" + act + "&y_max=" + y_max + "&y_min=" + y_min + "&x_max=" + x_max + "&x_min=" + x_min + '&z=' + zoom;
    }
    else {

	params = {
            act: act,
            y_max: searchBounds.y_max,
            y_min: searchBounds.y_min,
            x_max: searchBounds.x_max,
            x_min: searchBounds.x_min,
            z: searchBounds.zoom
        };
    }

    return params;
}


//отображение объектов на карте          
function showObjectsBy(type, lat, lng, z, name, filter) {
    
	add = '';
    var params;

    var pars;
    switch (type) {
    case 'city':
        
		getCoord();
        var zoom = getZoom();
        searchBounds = {
            "x_min": x_min,
            "y_min": y_min,
            "x_max": x_max,
            "y_max": y_max,
            "zoom": zoom
        };
        params = getSearchParams('objects', 1);

       break;
    case 'area':
    var zoom = (z) ? z : 12;
    zoomAt(lat, lng, z);
    return ;
     
    case 'house':
        clearAll();
        act = 'house';
        zoomAt(lat, lng, z);
        params = {
            act: 'objects',
            oId: name,
            lat: lat,
            lng: lng,
            zoom:z
        }
        break;

    }

    params.type = type;
    //om = new OverlayMessage(document.getElementById('map'));
    //om.Set('<b>Загружаю...</b>');
	
	
	//var map_status = $('#map_status');
	//map_status.html('<b>Загружаю...</b>');
	
	if(filter) {
		params.filter = filter;
	}
    $.get(reqUrl, params,
    function(req) {

        if (!req.Value) {
            $("#legend").html("<div>Простите, ничего не найдено. Попробуйте расширить параметры поиска.</div>");
        }
      //  om.Clear();
	  //map_status.html('');
        
		eval(req);
        act = '';
    });

}

function showMapObjects(filter) {
    
	var zoom = getZoom();
	//showCurrentZoom();
    if (zoom < 4) {
        clearAll();
    }
    else {

        clearAll();
		showObjectsBy('city', false, false , false,false, filter);
/*
        if (om) {
            om.Clear();
        }
*/
    }

    return;
}

//объекты в окошке
function showObjects(grp_lat, grp_lng, p) {
    var add = '';
    var obId = "object" + grp_lat + "_" + grp_lng;
    var params = getSearchParams('showObject', 1);
    params.grp_lat = grp_lat;
    params.grp_lng = grp_lng;
    params.p = p;
    $.get(reqUrl, params,
    function(data) {
        $("#" + obId).html(data);
    });

    return;
}


var searchMarker = null;
function showInMap() {
    $('#searchDescr').show();
    el(map, "click",
    function(overlay, latlng) {
        if (latlng) {
            var html = "<div style='width:280px; height:120px;'><form name = 'searchOb'><table>" + "<tr><td colspan=2>Выберете объект и область для поиска</td> </tr>" + "<tr><td>Объект:</td> <td><select name='type'>" + "<option value='flats' SELECTED>Квартиры</option>" + "<option value='house'>Дома</option>" + "</sekect> </td></tr>" + "<tr><td>Радиус поиска:</td> <td><select name='distance'>" + "<option value='0.3' SELECTED>300 метров</option>" + "<option value='0.5'>500 метров</option>" + "<option value='1'>1 километр</option>" + "<option value='2'>2 километра</option>" + "<option value='3'>3 километра</option>" + "<option value='4'>4 километра</option>" + "<option value='5'>5 километров</option>" +
            //     "<option value='district'>в районе</option>" +
            "</sekect> </td></tr>" + "<tr><td></td><td><input type='button' value='Искать' onclick='searchObjects(this.form)'/></form></td></tr></table>" + "<div id='searchError' style='color:red'></div></div>";

            if (searchMarker) {
                searchMarker.setLatLng(latlng);
                searchMarker.openInfoWindow(html);
            }
            else {
                searchMarker = new GMarker(latlng, {
                    draggable: true
                });
                map.addOverlay(searchMarker);
                searchMarker.openInfoWindow(html);
                el(searchMarker, "click",
                function() {
                    map.removeOverlay(searchMarker);
                    searchMarker = null;
                });

                el(searchMarker, "dragend",
                function() {
                    searchMarker.openInfoWindow(html);
                });
            }

        }
    });
    return;
}

//посик домов на карте (в радиусе указанной точке)
function searchObjects(f) {
    var type = f.type.value;
    var distance = f.distance.value;
    var latlng = searchMarker.getLatLng();
    var lat = latlng.lat();
    var lng = latlng.lng();
     $.post(reqUrl, {act:'objects', type:'search', searchIn:type, distance:distance, lat:lat, lng:lng}, function(req){
        if (!req) {
            $('#searchError').html('К сожалению ничего не найдено, попробуйте поисктаь в другом месте');
        } else {

            clearAll();
            eval(req);

            searchMarker.closeInfoWindow();
            searchMarker.hide();
        }
    });

    return;
}


//отображение улиц  на карте
function showStreets(x, y, z) {

    //отображение улииц в заданно точке
    if (x && y && z) {
        map.setCenter(new GLatLng(x, y), z);
    }

    var zoom = map.getZoom();
    if (zoom < 13) return;
    //var om = new OverlayMessage(document.getElementById('map'));
    //om.Set('<b>Загружаю...</b>');

    getCoord();
    var url = reqUrl + "?act=zoom&y_max=" + y_max + "&y_min=" + y_min + "&x_max=" + x_max + "&x_min=" + x_min + '&z=' + zoom;

    var request = GXmlHttp.create();
    request.open("GET", url, true);

    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            $('#legend').empty();
            eval(request.responseText);
            //om.Clear(); // Clear the loading message 
        }
    }
    request.send(null);

    return;
}

function streetTest(z) {
    z = 18;
    map.setZoom(z);
    getCoord();

    var url = reqUrl + "?act=zoom&z=" + z + "&y_max=" + y_max + "&y_min=" + y_min + "&x_max=" + x_max + "&x_min=" + x_min;

    var request = GXmlHttp.create();
    request.open("GET", url, true);

    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            $('#legend').html('');
            eval(request.responseText);

        }
    }
    request.send(null);
	alert('streetTest');
    map.clearOverlays();

}

function getRandomHex(i) {
    var array = new Array("#ffa500", "ffff00", "ff4500", "#0000ff", "#ff0000", "#00ff00", "#00a5ff", "00ffff", "ff0760", "#aa00ff", "#ff0055", "#ffffff", "#B8860B", "#F0FFFF", "#5F9EA0");
    if (i >= 0) return array[i];
    //alert(222);
    l = array.lbength - 1;
    return array[Math.floor(Math.random() * l)];

}

function getRandomRGB() {
    var rnd_r = String(Math.floor(Math.random() * 255));
    var rnd_g = String(Math.floor(Math.random() * 255));
    var rnd_b = String(Math.floor(Math.random() * 255));
    return rnd_rgb = 'rgb(' + rnd_r + ', ' + rnd_g + ', ' + +rnd_b + ')';

}

function setAddressInMap(street, numHouse) { //mdId - миркорайон ИД
    var zoom = getZoom();
    if (zoom < 16) {
        alert('Вы должны увеличить масштаб карты, чтобы указать дом');
        return;
    }
    $('#setAddressTitle').hide();
    $('#searchDescr').show();
    el(map, map.Events.Click,
    function(mEvent) {

        var point = mEvent.getGeoPoint();

        var lat = point.getLat();
        var lng = point.getLng();

        if (lat && lng) {
            //     addressMarker = new GMarker(latlng, {draggable:true, dragCrossMove:true});
            addressMarker = new YMaps.Placemark(point);

            //1 случай. Нет улицы 
            if (!street) {
                var html = "<div style='width:280px; height:150px'><form name='address'><table>" + "<input type='hidden' name='save' value='1'>" + "<tr><td colspan=2>Укажите улицу и номер дома на карте</td> </tr>" + "<tr><td>Улица:</td> <td><input type='text' name='street'></td></tr>" + "<tr><td>Номер дома:</td> <td><input type='text' name='num'></td></tr>" + "<tr><td></td><td><input type='button' value='Добавить' onclick='saveAddress(this.form)'/></form></td></tr></table>" + "<div id='setAddressError' style='color:red; font-size:11px'></div></div>";
            }
            //2 случай. нет номера дома
            else {
                var html = "<div style='width:180px; height:100px' ><form name='address'><table>" + "<input type='hidden' name='save' value='2'>" + "<input type='hidden' name='street' value='" + street + "'>" + "<tr><td colspan=2>Поставьте маркер на номер по адресу " + street + ", " + numHouse + "</td> </tr>" + "<tr><td></td><td><input type='button' value='Сохранить' onclick='saveAddress(this.form)'/></form></td></tr></table>" + "<div id='setAddressError' style='color:red; font-size:11px'></div></div>";

            }

            addressMarker.description = html;
            map.addOverlay(addressMarker);
            el(map, map.Events.Click,
            function(mEvent) {
                addressMarker.openBalloon();
                //map.removeOverlay(addressMarker);
            });
        }
    });
    return;
}

function saveAddress(f) {
    var save = f.save.value; //случай сохранения (1 //  2 )
    var point = addressMarker.getGeoPoint();

    var lat = point.getLat();
    var lng = point.getLng();
    opener.document.iblock_add.object_lat.value = lat;
    opener.document.iblock_add.object_lng.value = lng;
    self.close();
    return false;

}
