var EliGoogleMap = Class.create();

/**
 * default location is moscow
 */
EliGoogleMap.defaultLocation  = new google.maps.LatLng(55.75222, 37.61556);

/**
 * Asset types
 *
 */
EliGoogleMap.GROUP = "groups";
EliGoogleMap.FAMILY = "family";

EliGoogleMap.prototype = {

    initialize: function(options) {

        /**
     *
     * Set default options and override them
     */
    
        this.options = $H({
            div : "google_map_canvas",
            inputfieldLng : "family_google_maps_lng",
            inputfieldLat : "family_google_maps_lat",
            addEvents : true, // should we track coordinates in input fields?
            addHomeMarker : true,
            iconURL : null,
            geolocationtimeout : 10000,
            defaultlocation : EliGoogleMap.defaultLocation,
            zoom: 12,
            draggable: true,
            debug: false,
            useCookie:false
        })

        this.options.merge(options);

        var googlemapoptions = {
            zoom: 12,
            center: new google.maps.LatLng(55.75222, 37.61556),
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };

        this.map = new google.maps.Map($("google_map_canvas"), googlemapoptions);
        this.homemarker = null;
        this.markers = $H({});
    },

    /*
   * Set home to specified coordinates
   */
    _addHomeMarker: function(){

        this.homemarker = new google.maps.Marker({
            position: this.options.defaultlocation,
            map: this.map,
            draggable: this.options.draggable,
            title:"My home"
        });

        if(this.options.iconURL !== null)
            this.homemarker.setIcon(iconURL);

        var elimap = this;

        if(this.options.addEvents == true){
            google.maps.event.clearListeners(this.homemarker,'mouseup');

            google.maps.event.addListener(this.homemarker, 'mouseup', function() {
                var longitude = $(elimap.options.inputfieldLng);
                var latitude  = $(elimap.options.inputfieldLat);

                latitude.value = elimap.homemarker.position.lat();
                longitude.value  = elimap.homemarker.position.lng();
            });
        }
    },

    setLocation: function(latLng) {
        this.map.setCenter(latLng);
        if(this.options.useCookie == true){
            document.cookie="position="+latLng.toUrlValue()+";";
        }
        
        if(this.options.addHomeMarker == false)
            return;

        if(this.homemarker instanceof google.maps.Marker){
            this.homemarker.setPosition(latLng);
        }else{
            this._addHomeMarker();
            this.homemarker.setPosition(latLng);
            if(this.options.addEvents == true){
                var longitude = $(this.options.inputfieldLng);
                var latitude  = $(this.options.inputfieldLat);
                longitude.value = latLng.lng();
                latitude.value  = latLng.lat();
            }
        }
    },

    geolocate: function() {
        var positionoptions = {};
        positionoptions.timeout = this.options.geolocationtimeout;

        var elimap = this;

        // Try cookie location setting
        if(this.options.useCookie == true &&
            document.cookie.match(/^.*position=([0-9\.,]+.*$)/) !== null){
            var position = document.cookie.replace(/^.*position=([0-9\.,]+).*$/,"$1");
            var lat = parseFloat(position.split(',')[0]);
            var lng = parseFloat(position.split(',')[1]);
            var mylocation = new google.maps.LatLng(lat,lng);
            this.setLocation(mylocation);
            return;
        }

        // Try W3C Geolocation
        if(navigator.geolocation) {
            browserSupportFlag = true;
            navigator.geolocation.getCurrentPosition(function(position) {
                coordinates = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
                elimap.setLocation(coordinates);
            }, function() {
                elimap.setLocation(EliGoogleMap.defaultLocation);
            },positionoptions);
        } else {
            elimap.setLocation(EliGoogleMap.defaultLocation);
        }
    },
    /**
     * @param family array in json form
     *
     */
    _addFamily: function(family){
        var infowindow=null;
        
        if(typeof family.latitude == 'undefined'||
            typeof family.longitude == 'undefined'
            ){
            return false;
        }
        /**
         * If it is already there then skip this.
         */
        if(typeof this.markers[family.asset_id] != 'undefined' )
            return true;

        var familymarker = new google.maps.Marker({
            position: new google.maps.LatLng(family.latitude, family.longitude),
            map: this.map
        });

        if(typeof family.title != 'undefined' && family.title != ''){
            familymarker.setTitle(family.title);
            var image = new google.maps.MarkerImage('/families/'+family.title+'/avatar/thumb');
            familymarker.setIcon(image);
            infowindow = new google.maps.InfoWindow({
                content: '<div class="infoWindow">'+
                '<a target="_blank" href="/families/'+family.title+'">'+
                '<span style="font-weight: bold; font-size: 16px;">'+family.title+'</span>'+
                '</a></div>'+
                '<br />'+
                '<a target="_blank" href="/families/'+family.title+'">'+
                '<img alt="'+family.title+'" src="/families/'+family.title+
                '/avatar/thumb" /></a></div>'
            });

        } else{
            familymarker.setTitle('family'+family.asset_id);
            infowindow = new google.maps.InfoWindow({
                content: '<div class="infoWindow">'+
                '<span style="font-weight: bold; font-size: 16px;">family'+family.asset_id+'</span>'+
                '<br />'+
                'Profile is visible only for registered users'+
                '</div>'
            });
        }

        this.markers[family.asset_id] = familymarker;
        var elimap = this;
        google.maps.event.addListener(familymarker, 'click', function() {
            infowindow.open(elimap.map,familymarker);
        });


        return true;
    },
    
    addFamilies: function(){
        var url = '/family/getFamilies'
        var elimap = this;
        new Ajax.Request(url , {
            method: 'get',
            onSuccess: function(transport) {
                var families = eval(transport.responseText);
                for(i=0;i<families.length;i++){
                    elimap._addFamily(families[i]);
                }        
            }
        });
    },

    /**
     * @param group array in json form
     *
     */
    _addGroup: function(group){
        if(typeof group.latitude == 'undefined'||
            typeof group.longitude == 'undefined' ||
            typeof group.title == 'undefined'
            // || typeof family.asset_id == 'undefined'
            ){
            return false;
        }
        /**
         * If it is already there then skip this.
         */
        if(typeof this.markers[group.asset_id] != 'undefined' )
            return true;
        var groupmarker = new google.maps.Marker({
            position: new google.maps.LatLng(group.latitude, group.longitude),
            map: this.map,
            title: group.title
        });
        this.markers[group.asset_id] = groupmarker;

        var image = new google.maps.MarkerImage(group.image);
        groupmarker.setIcon(image);

        var infowindow = new google.maps.InfoWindow({
            content: '<div class="infoWindow">'+
            '<span style="font-weight: bold; font-size: 16px;">'+group.title+'</span>'+
            '<br /><br />'+
            '<a target="_blank" href="/groups/show/'+group.link+'">'
            +group.description+'</a></div>'
        });
        var elimap = this;
        google.maps.event.addListener(groupmarker, 'click', function() {
            infowindow.open(elimap.map,groupmarker);
        });

        return true;
    },

    addGroups: function(){
        var url = '/group/getGroups'
        var elimap = this;
        new Ajax.Request(url , {
            method: 'get',
            onSuccess: function(transport) {
                var groups = eval(transport.responseText);
                for(i=0;i<groups.length;i++){
                    elimap._addGroup(groups[i]);
                }
            }
        });
    },

    displayOnly: function(assets){
        //  if(! assets instanceof Array ) return;
        //  if( assets.length < 1) return;
        this.markers.each(function(obj){
            if(assets[obj.key] == 0)
                obj.value.setVisible(true);
            else
                obj.value.setVisible(false);
        });
    },
    
    displayAll: function() {
        this.markers.each(function(obj){
            obj.value.setVisible(true);
        });
    }

    
};
