var map;

var placemarks = [];

var calculatedLink = '';

var selectedGroupOnInit  = 0;

var selectedObjectOnInit = 0;

YMaps.jQuery(function (){
    initMap();            
    initGroups();
    initObjects();
    
    $('#groups').change(function(){
        var groupID = $("#groups").val();
        selectGroup(groupID);            
    });

    $('#objects').change(function(){
        var objectID = $("#objects").val();
        selectObject(objectID);                
    });     

	selectGroup(selectedGroupOnInit);
    selectObject(selectedObjectOnInit);    

    if(1 == editable){
        $('div#map-container').css('border', '1px solid red');    
    }

	setInterval(calculateLink, 500);	
});

function initMap()
{
    var lng = 38.079441;
    var lat = 44.571216;
    var zoom = 13;
    
    if(-1 != document.location.href.indexOf('#')){
        var p = document.location.href.split(/#/);
        var cl = p[1].split(/;/);
        lng = cl[0]; 
        lat = cl[1]; 
        zoom = cl[2]; 
        selectedGroupOnInit = cl[3];
        selectedObjectOnInit = cl[4];
    }

    
    map = new YMaps.Map(document.getElementById("YMapsID"));
    map.setCenter(new YMaps.GeoPoint(lng, lat), zoom, YMaps.MapType.MAP);
    
    map.addControl(new YMaps.TypeControl());
    //map.addControl(new YMaps.ToolBar());
    map.addControl(new YMaps.Zoom());
    //map.addControl(new YMaps.MiniMap());
    map.addControl(new YMaps.ScaleLine());
    map.enableScrollZoom();                                  
}

function initGroups()
{ 
    $('#groups').empty();
    $('#groups').append('<option value="0">Все</option>');
    for(i=0; i<geoobjects.length; ++i){
        $('#groups').append('<option value="'+geoobjects[i].id+'">'+geoobjects[i].name+'</option>');
    }          
}
       
function initObjects()
{
    var groupID = $("#groups").val(); 
    var objects = getObjectsByGroupID(groupID);
    
    $('#objects').empty();
    $('#objects').append('<option value="0" selected="true">Выберите объект для отображения</option>');
    for(i=0; i<objects.length; ++i){
        if(!editable && isObjectMapFree(objects[i])) continue;                
        var c = isObjectMapFree(objects[i]) ? '*':'';
        $('#objects').append('<option value="'+objects[i].id+'">'+c+objects[i].name+'</option>');
    }
}

function selectGroup(groupID)
{
	$("#groups option").each(function() { 
		this.selected = (this.value == groupID); 
	});
    initObjects();
    showPlacemarks();        
}

function selectObject(objectID)
{
	$("#objects option").each(function() { 
		this.selected = (this.value == objectID); 
	});
		
    var object = getObjectByID(objectID);
    if(null == object){
        map.closeBalloon();
        return;
    } 
    if(isObjectMapFree(object)){
        startNewPlacemarkState();    
    }else{
        endNewPlacemarkState();
        showBalloon();
    }        
}
        
function showPlacemarks()
{
    var groupID = $("#groups").val(); 
    var objects = getObjectsByGroupID(groupID);
    
    map.removeAllOverlays();
    placemarks = [];
    
    for(i=0; i<objects.length; ++i){
        if(!isObjectMapFree(objects[i])){
            createPlacemarkFromObject(objects[i]);
        }                    
    }            
}

function showBalloon()
{
    var objectID = $("#objects").val();
    var placemark = getPlacemarkByObjectID(objectID);
    if(null != placemark){
        placemark.openBalloon();
    }
}

function getObjectsByGroupID(groupID)
{
    var objects = [];
    
    for(i=0; i<geoobjects.length; ++i){
        if(0 == groupID || geoobjects[i].id == groupID){
            for(j=0; j<geoobjects[i].objects.length; ++j){
                objects.push(geoobjects[i].objects[j]);
            }    
        } 
    }
    
    return objects;    
}

function getObjectByID(objectID)
{
    for(i=0; i<geoobjects.length; ++i){
        for(j=0; j<geoobjects[i].objects.length; ++j){
            if(objectID == geoobjects[i].objects[j].id) 
                return geoobjects[i].objects[j]; 
        }
    } 
    
    return null;       
}
        
function isObjectMapFree(object)
{
    return (0 == object.lng && 0 == object.lat);
}

function getPlacemarkByObjectID(objectID)
{
    for(var i=0; i < placemarks.length; ++i)
    {
        if(placemarks[i].id == objectID){
            return placemarks[i]; 
        }
    }
    
    return null;
}

function getPlacemarkStyleByObject(object)
{
    for(var i=0; i < geoobjects.length; ++i)
    {
        if(geoobjects[i].id == object.groupID)
            return geoobjects[i].style;
    }
    
    return 'default#whitePoint';
}

function createPlacemarkFromObject(obj)
{
    var point = new YMaps.GeoPoint(obj.lng, obj.lat);
    var placemark = new YMaps.Placemark(point, {draggable: (editable?1:0), style: getPlacemarkStyleByObject(obj)});
    placemark.id = obj.id;
    placemark.name = obj.name;
    placemark.description = obj.description; 
    placemark.setBalloonOptions({maxWidth: 300});          
    //placemark.setIconContent(obj.id);

    if(1 == editable){
        YMaps.Events.observe(placemark, placemark.Events.DragEnd, function (obj) {
            $('#message').html('<img src="/pic/ajax-loader.gif" />');
            _obj = {};
            _obj.id = obj.id;
            _obj.lat = obj.getGeoPoint().getLat();
            _obj.lng = obj.getGeoPoint().getLng();
            $.post(gateway, _obj, function(data){
                $('#message').empty();                                      
            });
        });                                    
    }

    YMaps.Events.observe(placemark, placemark.Events.BalloonOpen, function (obj) {
        $('#objects').val(obj.id);
            	
    	var o = getObjectByID(obj.id);
    	var c = createBalloonContent(o); 
    	obj.getBalloon().setContent(c);
    	
    	$("a.group").fancybox({
    		'hideOnContentClick': false
    	});    	
    });
      
    YMaps.Events.observe(placemark, placemark.Events.BalloonClose, function (obj) {
        $('#objects').val(0);
    });
                        
    map.addOverlay(placemark);
    placemarks.push(placemark);        
}

function createBalloonContent(obj)
{
    var pc = '<div class="balloon-content">';
    pc += '<div class="name">'+obj.name+'</div>';
    
    if(undefined != obj.description)
        pc += '<div class="description">'+obj.description+'</div>';
    
    if(undefined != obj.images && '' != obj.images){
        var imgs = obj.images.split(/,/);
        var imgsh = obj.imagesh.split(/\|/);
        
        pc += '<div class="images">';
        for(var i=0; i < imgs.length ; ++i){
            title = (''!=imgsh[i] ? imgsh[i] : obj.name);        
            pc += '<div class="img"><a href="' + imgs[i].replace(/_thumbnail/, '') + '" class="group" rel="group" title="'+title+'"><img alt="'+title+'" src="' + imgs[i] + '" /></a></div>';
        }
        pc += '</div>';
    }
    pc += '</div>';     
    return pc;        
}
                        
function startNewPlacemarkState()
{
    var ym = $('#YMapsID');
    var l = parseInt(-7 + ym.offset().left + ym.width() / 2) + 'px';
    var t = parseInt(-7 + ym.offset().top + ym.height() / 2) + 'px';
    $('#centercross').css('display', 'block').css('left', l).css('top', t);
    $('#message').html('<button id="btn-add">[+]</button>');
    $('#btn-add').click(function(){
        var objectID = $("#objects").val();
        var object = getObjectByID(objectID);
        object.lng = map.getCenter().getLng();
        object.lat = map.getCenter().getLat(); 
        createPlacemarkFromObject(object);
        endNewPlacemarkState();
        $('#message').html('<img src="/modules/ymaps/images/ajax-loader.gif" />');
        $.post(gateway, object,
        function(data){
            //alert("Data Loaded: " + data);
            $('#message').empty();
            initObjects();
            $('#objects').val(object.id);                                       
        });              
    });       
}

function endNewPlacemarkState()
{
    $('#centercross').css('display', 'none');
    $('#message').empty();         
}

function truncateCoord(coord)
{
    return parseInt(coord*1000000)/1000000;
}

function calculateLink()
{
    var p = [ truncateCoord(map.getCenter().getLng()), truncateCoord(map.getCenter().getLat()), map.getZoom(), $('#groups').val(), $('#objects').val()];
    var link = p.join(';');
    
    if(link != calculatedLink){
        p = document.location.href.split(/#/);
        document.location.href = p[0] + '#' + link;    
    }
        
    calculatedLink = link;
}
