dojo.require("dojox.widget.Toaster");
dojo.require("dojo.parser");
//dojo.require("dojox.fx.easing"); 
//dojo.require("dojox.fx.scroll");
dojo.require("dijit.Dialog");

/* Wizard boxes opening/closing */

function bantora_wizard_init_section_toggles() {
    dojo.query(".function-wizard-section-header").forEach( function( node ) {
        dojo.connect(node, 'onclick', function( evt ) {
            evt.preventDefault();
            if ( dojo.hasClass( node, 'wizard-open') && dojo.hasClass( node, 'wizard-stays-open') && dojo.hasClass( node, 'wizard-active')) {
                dojo.removeClass( node, 'wizard-stays-open' );
                dojo.removeClass( node, 'wizard-active' );
                bantora_wizard_close_section( node );
            }
            else {
                if ( dojo.hasClass( node, 'wizard-open') ) {
                    dojo.addClass( node, 'wizard-stays-open' );
                }
                dojo.publish( 'wizard-section-selected', [ node.id ] );
            }
        } );

        dojo.subscribe( 'wizard-section-selected', null, function( section_toggle_id ) {
            if ( node.id == section_toggle_id ) {
                dojo.addClass( node, 'wizard-active' );
                bantora_wizard_open_section( node );
            }
            else {
                dojo.removeClass( node, 'wizard-active' );
                if ( ! dojo.hasClass( node, 'wizard-stays-open' ) ) {
                    bantora_wizard_close_section( node );
                }
            }
        } );

        dojo.subscribe( 'wizard-open-all-sections', null, function() {
            dojo.query(".function-wizard-section-header").forEach( function( node ) {
                dojo.addClass( node, 'wizard-stays-open' );
                bantora_wizard_open_section( node );
            } );
        } );
    } );
    
    dojo.query(".function-wizard-open-all").forEach( function( node ) {
        dojo.connect(node, 'onclick', function( evt ) {
            evt.preventDefault();
            dojo.publish( 'wizard-open-all-sections', [] );
        } );
    } );
    
    dojo.publish( 'wizard-section-selected', [ null ] );
}

function bantora_wizard_open_section( node ) {
    var container_node = dojo.byId( node.id.replace(/toggle-/, "") );
    dojo.addClass(node, "wizard-open");
    dojo.removeClass(node, "wizard-closed");
    if ( container_node ) dojo.removeClass(container_node, "wizard-container-closed");
}

function bantora_wizard_close_section( node ) {
    var container_node = dojo.byId( node.id.replace(/toggle-/, "") );
    dojo.removeClass(node, "wizard-open");
    dojo.addClass(node, "wizard-closed");
    if ( container_node ) dojo.addClass(container_node, "wizard-container-closed");
}

function bantora_wizard_init_event_types() {
    var type_input = dojo.byId('event_type_input');
    if ( ! type_input) return;

    dojo.query(".function-wizard-event-type").forEach( function( node ) {
        dojo.connect( node, 'onclick', function( evt ) {
            evt.preventDefault();
            if ( node.id.match(/^wizard_event_type_\w+$/) ) {
                var type_value = node.id.replace(/wizard_event_type_/, "");
                dojo.publish('wizard-event-type-clicked', [ type_value ] );
            }
            else {
                dojo.publish('wizard-event-type-clicked', [ 'custom' ] );
            }
        } );
        dojo.subscribe('wizard-event-type-clicked', null, function( new_type_value ) {
            if ( node.id == 'wizard_event_type_' + new_type_value ) {
                dojo.addClass( node, 'active-type' );
                type_input.value = new_type_value;
            }
            else {
                dojo.removeClass( node, 'active-type' );
            }
        } );
    } );

    dojo.subscribe( 'wizard-event-type-clicked', null, function( new_type_value ) {
        var false_elem = dojo.byId('virtual-location-container-false');
        var true_elem = dojo.byId('virtual-location-container-true');
        if ( new_type_value == 'virtual' ) {
            if ( false_elem ) false_elem.style.display = 'none';
            if ( true_elem ) true_elem.style.display = 'block';
        }
        else {
            if ( false_elem ) false_elem.style.display = 'block';
            if ( true_elem ) true_elem.style.display = 'none';
        }
    } );

    dojo.publish('wizard-event-type-clicked', [ type_input.value == "" ? 'custom' : type_input.value ] );
}

function bantora_invite_init() {
    if ( dijit.byId('invite_accept_dialog') ) dijit.byId('invite_accept_dialog').show();

    dojo.query(".function-invite-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if( dijit.byId('invite_dialog') ) dijit.byId('invite_dialog').show();
        } );
    } );

    dojo.query(".function-invite-close").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if( dijit.byId('invite_dialog') ) dijit.byId('invite_dialog').hide();
        } );
    } );
    
    dojo.query(".function-login-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('invite_accept_dialog') ) dijit.byId('invite_accept_dialog').hide();
        } );
    } );

    dojo.query(".function-invite-accept-close").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('invite_accept_dialog') ) dijit.byId('invite_accept_dialog').hide();
        } );
    } );
}

function bantora_attend_init() {
    if ( dijit.byId('attend_dialog') && dojo.hasClass( dojo.byId('attend_dialog'), 'initially_open' ) ) {
        dijit.byId('attend_dialog').show();
    }

    dojo.query(".function-attend-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if( dijit.byId('attend_dialog') ) dijit.byId('attend_dialog').show();
        } );
    } );
    
    dojo.query(".function-attend-close-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('attend_dialog') ) dijit.byId('attend_dialog').hide();
        } );
    } );

    if ( dijit.byId('attend_register_dialog') && dojo.hasClass( dojo.byId('attend_register_dialog'), 'initially_open' ) ) {
        dijit.byId('attend_register_dialog').show();
    }

    dojo.query(".function-attend-register-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if( dijit.byId('attend_register_dialog') ) dijit.byId('attend_register_dialog').show();
        } );
    } );
    
    dojo.query(".function-attend-register-close-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('attend_register_dialog') ) dijit.byId('attend_register_dialog').hide();
        } );
    } );

    dojo.query(".function-login-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('attend_register_dialog') ) dijit.byId('attend_register_dialog').hide();
        } );
    } );
}

function bantora_event_mailto_init() {
    dojo.query(".function-event-mailto-open").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            var id = node.id + '_dialog';
            if ( dijit.byId(id) ) {
                dijit.byId(id).show();
                dojo.subscribe( 'event-mailto-closed', null, function() {
                    dijit.byId(id).hide();
                } );
            }
        } );
    } );

    dojo.query(".function-event-mailto-close").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            dojo.publish( 'event-mailto-closed', [] );
        } );
    } );

    dojo.query(".function-event-mailto-dijit-dialog").forEach( function( node ) {
        var id = node.id;
        
        var submitnode = dojo.byId( id + '_submit');
        var errornode = dojo.byId( id + '_error');
        var formnode = dojo.byId( id + '_form');
        var emailnode = dojo.byId( id + '_email');
    
        if ( submitnode && formnode ) dojo.connect( submitnode, 'onclick', function( evt ) {
            evt.preventDefault();
            if ( errornode && emailnode ) {
                var v = emailnode.value;
                if ( ! v || v.indexOf('@') == -1 ) {
                    errornode.style.display = 'block';
                    return false;
                }
            }
            formnode.submit();
        } );
    } );
}

function bantora_about_init() {
    dojo.query(".function-about-dialog-open").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dojo.byId('hacked_video_container_container') ) {
                swfobject.embedSWF(
                    '/images/bantora/bantora_events.swf', 'hacked_video_container_container', 630, 450, '9.0.0', '',
                    { }, { base: '/images/bantora/', allowScriptAccess: 'sameDomain' }, { }
//                    flashvars, params, attributes
                );
            }
            if( dijit.byId('about_video_dialog') ) dijit.byId('about_video_dialog').show();
        } );
    } );
    
    dojo.query(".function-about-dialog-close").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('about_video_dialog') ) dijit.byId('about_video_dialog').hide();
            if ( dojo.byId('hacked_video_container') ) {
                 dojo.byId('hacked_video_container').innerHTML = '<div id="hacked_video_container_container"></div>';
            }
        } );
    } );
}

function bantora_show_event_showmore() {
	var visible = 0;	
	
    dojo.query(".showmore-link").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();   
            visible = visible ? 0 : 1;
			if ( ! visible ) {
				dojo.query(".showmore").style({ display: "none"});
                dojo.query(".showmore-short").style({ display: ""});
			}
            else {
				dojo.query(".showmore").style({ display: ""});
                dojo.query(".showmore-short").style({ display: "none"});
			}
        } );
    } );
}

function bantora_login_init() {
    var lightb = dojo.byId('navi_login_link');
    if ( lightb ) dojo.connect( lightb, 'onclick', 'bantora_show_login' );
    var partb = dojo.byId('navi_participate_link');
    if ( partb ) dojo.connect( partb, 'onclick', 'bantora_show_login' );

    dojo.query('.function-login-link').forEach( function (node) {
        dojo.connect( node, 'onclick', 'bantora_show_login' );
    } );

    if ( dojo.byId('light_login_button') ) dojo.connect( dojo.byId('light_login_button'), 'onclick', 'bantora_login_submit' );
    if ( dojo.byId('login_login_name_field') )  dojo.connect( dojo.byId('login_login_name_field'), 'onkeypress', function( event ) {
        if( event.keyCode=='13' ) {
            event.preventDefault();
            if ( dojo.byId('login_password_field') ) {
                // Might throw a security error. Just ignore it.
                try { dojo.byId('login_password_field').focus(); }
                catch (e) {}
            }
        }
    } );
    if ( dojo.byId('login_password_field') ) dojo.connect( dojo.byId('login_password_field'), 'onkeypress', function( event ) {
        if( event.keyCode=='13' ) {
            event.preventDefault();
            bantora_login_submit( event );
         }
    } );
    if ( dojo.byId('light_login_close_link') ) dojo.connect( dojo.byId('light_login_close_link'), 'onclick', function( event ){
        event.preventDefault();
        if( dijit.byId('login_dialog') ) dijit.byId('login_dialog').hide();
    } );

    if ( bantora_init_open_login ) {
        if ( dijit.byId('login_dialog') ) dijit.byId('login_dialog').show();
    }
}

function bantora_show_login( event ) {
    event.preventDefault();
    if( dijit.byId('login_dialog') ) dijit.byId('login_dialog').show();
}

function bantora_login_submit( event ) {
    var container = dojo.byId('login_return_message_container');
    if ( container ) {
        container.innerHTML = '';
        container.style.display = 'none';
    }
    event.preventDefault();
    dojo.xhrPost({
        method: 'post',
        encoding: 'utf-8',
        url: '/rpc_login/',
        form: "loginForm",
        handleAs: "json",
        load: function( data ){
            if ( data.success ) {
                window.location = data.location;
            }
            else {
                var container = dojo.byId('login_return_message_container');
                if ( container ) {
                    container.style.display = 'block';
                    container.innerHTML = data.reason;
                }
                var pass = dojo.byId('login_password');
                if ( pass ) pass.value = '';
            }
        },
        error: function( data ) {
            var container = dojo.byId('login_return_message_container');
            if ( container ) {
                container.style.display = 'block';
                container.innerHTML = "There was an error connecting to the server. Please try again.";
            }
        }
    });
}

function bantora_init_avatar_names() {
    dojo.query("div.avatar").forEach( function( node ) {
        if ( dojo.hasClass( node, 'dojo_processed' ) ) return;
        dojo.addClass( node, 'dojo_processed' );
        dojo.query("img", node ).forEach( function( avatar ) {
            dojo.connect( avatar, 'onmouseover', function() {
                dojo.query("span", node ).style({ display: ""});
            } );
            dojo.connect( avatar, 'onmouseout', function() {
                dojo.query("span", node ).style({ display: "none"})
            } );
        } );
    } );
    
}

function bantora_init_button_pages() {
    dojo.query(".function-button-page-list-list").forEach( function( list_node ) {
//        alert( "list-node " + list_node );
        dojo.query(".function-button-page-list-page", list_node ).forEach( function( page_node ) {
//            alert( "page-node " + page_node );
            dojo.query(".function-button-page-list-button", page_node ).forEach( function( button_node ) {
//                alert( "button-node " + button_node );
                dojo.connect( button_node, 'onclick', function( evt ) {
                    evt.preventDefault();
                    dojo.publish('button-page-list-switch', [
                        list_node, button_page_extract_page_number( button_node )
                    ]);
                } );
            } );
            dojo.subscribe('button-page-list-switch', null, function( this_list_node, button_page_number ) {
                if ( this_list_node != list_node ) return;
                if ( button_page_extract_page_number( page_node ) == button_page_number ) {
                    page_node.style.display = 'block';
                }
                else {
                    page_node.style.display = 'none';
                }
            } );
        } );
        dojo.publish('button-page-list-switch', [ list_node, 0 ] );
    } );
}

function button_page_extract_page_number( node ) {
    var cls = dojo.attr( node, 'class' );
//    alert( cls );
    var result = /function\-button\-page\-list\-number\-(\d+)/.exec( cls );
    return ( result && result[1] ) ? result[1] : alert("no!");
}

function bantora_people_more_buttons() {
    dojo.query(".function-morelist-button").forEach( function( button_node ) {
         dojo.connect( button_node, 'onclick', function( evt ) {
            evt.preventDefault();
            dojo.xhrPost({
                url: button_node.href,
                handleAs: "json",
                content : {
                    shown_morelist_ids : gather_shown_morelist_ids_json()
                },
                load: function( data ) {
                    var container;
                    dojo.query(".function-morelist-more-container").forEach( function( more_div ) {
                        container = more_div;
                    } );
                    if ( ! container ) return;
                    container.innerHTML = data.messages_html;
                    bantora_init_avatar_names();
                    if ( data.hide_buttons ) {
                        dojo.query(".function-morelist-button").forEach( function( hide_button ) {
                            hide_button.style.display = 'none';
                        } );
                    }
                },
                error: function( error ) {
                    alert('Could not fetch more people. Please try again.');
                }
            });
        } );
    } );
}

function gather_shown_morelist_ids_json() {
    var ids = [];
    dojo.query(".function-morelist-item-container").forEach( function( post ) {
        var parts = post.getAttribute('id').match(/^morelist_item_container_(\d+)$/);
        if ( ! parts || ! parts[1] ) return;
        ids.push( parts[1] );
    } );
    return dojo.toJson( ids );
}

function bantora_init_contact_buttons() {
    dojo.query(".function-add-remove-contact-button").forEach( function( button_node ) {
         dojo.connect( button_node, 'onclick', function( evt ) {
            evt.preventDefault();
            dojo.xhrPost({
                url: button_node.href,
                handleAs: "json",
                load: function( data ) {
                    var elems = [
                        'contact_was_removed_text',
                        'contact_was_added_text',
                        'contact_remove_link',
                        'contact_add_link'
                    ];
                    var visis = data.is_contact ? [ 0, 1, 1, 0 ] : [ 1, 0, 0, 1 ];

                    for ( var i=0; i<4; i++ ) {
                        if ( dojo.byId(elems[i]) ) dojo.byId(elems[i]).style.display = visis[i] ? '' : 'none';
                    }
                },
                error: function( error ) {
                    alert('Could not alter contact status. Please try again later.');
                }
            });
        } );
    } );
}

var bantora_gmaps = {};

function bantora_init_gmaps_input() {
    dojo.query(".function-gmaps-location-input").forEach( function( input_node ) {
        var input_id = input_node.id;

        if ( ! GBrowserIsCompatible() ) return;
        dojo.addOnUnload( "GUnload" );

        bantora_gmaps[ input_id ] = {};
        if ( dojo.byId( input_id + "_canvas") ) {
            bantora_gmaps[ input_id ][ 'map' ] = new GMap2(
                dojo.byId( input_id + "_canvas"),
                { size: new GSize(600,300) }
            );
            bantora_gmaps[ input_id ][ 'map' ].disableDragging();
            bantora_gmaps[ input_id ][ 'map' ].disableDoubleClickZoom();
            bantora_gmaps[ input_id ][ 'map' ].disablePinchToZoom();
        }
//        bantora_gmaps[ input_id ][ 'map' ].addControl(new GLargeMapControl());
        bantora_gmaps[ input_id ][ 'geocoder' ] = new GClientGeocoder();

        dojo.connect( input_node, 'onkeypress', function( evt ) {
            if ( evt.keyCode != 13 ) return;
            evt.preventDefault();
            bantora_gmaps_input_update( input_node );
        } );
        if ( dojo.byId( input_id + '_check') ) {
            dojo.connect( dojo.byId( input_id + '_check'), 'onclick', function( evt ) {
                evt.preventDefault();
                bantora_gmaps_input_update( input_node );
            } );
        }

        bantora_gmaps_input_loop( input_node );
    } );
}

function bantora_gmaps_input_value( input_node ) {
    if ( ! input_node ) return '';

    if ( dojo.hasClass( input_node, 'virtual' ) ) {
        var parts = [];
        if ( dojo.byId( 'city' ) && dojo.byId( 'city' ).value ) parts.push( dojo.byId( 'city' ).value );
        if ( dojo.byId( 'country' ) && dojo.byId( 'country' ).value ) parts.push( dojo.byId( 'country' ).value );
        input_node.value = parts.join( ", " );
    }

    return input_node.value;
}

function bantora_gmaps_input_loop( input_node ) {
    if ( ! input_node ) return;
    var input_id = input_node.id;

    var input_value = bantora_gmaps_input_value( input_node );

    if ( ! bantora_gmaps[ input_id ]['counter'] ) {
        bantora_gmaps_input_update( input_node );
        bantora_gmaps[ input_id ]['counter'] = { count : 100, val : input_value };
    }

    if ( input_value == bantora_gmaps[ input_id ]['counter']['val'] ) {
        bantora_gmaps[ input_id ]['counter']['count']++;
        if ( bantora_gmaps[ input_id ]['counter']['count'] == 3 ) {
            bantora_gmaps_input_update( input_node );
        }
    }
    else {
        bantora_gmaps[ input_id ]['counter']['count'] = 1;
        bantora_gmaps[ input_id ]['counter']['val'] = input_value;
    }

    setTimeout( dojo.hitch( this, bantora_gmaps_input_loop, input_node ), 500);
}

function bantora_gmaps_input_update( input_node ) {
    var input_id = input_node.id;

    var input_value = bantora_gmaps_input_value( input_node );

    if ( ! input_value || input_value == '' ) {
        bantora_gmaps_decoding_status( input_node );
        bantora_gmaps_clear( input_node, 'Type the location in the box above!<br />This map will show the location you type<br />and you can make sure we hit the right spot!' );
        return;
    };

    bantora_gmaps[ input_id ][ 'geocoder' ].getLatLng(
        input_value,
        function( point ) {
            if ( ! point ) {
                bantora_gmaps_decoding_status( input_node, 'failed');
                bantora_gmaps_clear( input_node, 'We could not locate the given address.<br/>Please check the spelling or try with an address nearby!' );
            }
            else {
                if ( bantora_gmaps[ input_id ][ 'map' ] ) {
                    bantora_gmaps[ input_id ][ 'map' ].closeInfoWindow();
                    bantora_gmaps_clear_marker( input_node );
        
                    bantora_gmaps[ input_id ][ 'map' ].setCenter(point, 13);
                    bantora_gmaps[ input_id ][ 'map' ].openInfoWindowHtml(
                        point, 'Please try adding more details if this<br /> is not the location you were looking for.<br />Otherwise we are set!', { noCloseOnClick : true }
                    );
        
                    var marker = new GMarker(point);
                    bantora_gmaps[ input_id ][ 'map' ].addOverlay(marker);
                    bantora_gmaps[ input_id ][ 'previous_marker' ] = marker;
                }

//                 bantora_gmaps[ input_id ][ 'geocoder' ].getLocations(
//                     point,
//                     function( response ) {
//                         if (!response || response.Status.code != 200) {
//                             bantora_gmaps_clear( input_node, 'Could not find anything :(' );
//                         }
//                         else {
//                             place = response.Placemark[0];
//                             point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);
//                             input_node.value = 
//                                 place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName +
//                                 ', ' + place.AddressDetails.Country.CountryName;
//                             bantora_gmaps_set_latlng( input_node, point.lat(), point.lng() );
//                             dojo.byId( input_id + "_canvas").innerHTML = '';
//                         }
//                     }
//                 );


                bantora_gmaps_set_latlng( input_node, point.lat(), point.lng() );
                bantora_gmaps_decoding_status( input_node, 'ok');
            }
        }
    );
}

function bantora_gmaps_decoding_status( input_node, show ) {
    var input_id = input_node.id;
    if ( dojo.byId( input_id + '_decoding_ok' ) ) dojo.byId( input_id + '_decoding_ok' ).style.display = 'none';
    if ( dojo.byId( input_id + '_decoding_failed' ) ) dojo.byId( input_id + '_decoding_failed' ).style.display = 'none';
    if ( show ) {
        var node = dojo.byId( input_id + '_decoding_' + show );
        if ( node ) node.style.display = 'inline';
    }
}

function bantora_gmaps_set_latlng( input_node, lat, lng ) {
    var input_id = input_node.id;
    if ( dojo.byId( input_id + '_lat' ) ) dojo.byId( input_id + '_lat' ).value = lat;
    if ( dojo.byId( input_id + '_lng' ) ) dojo.byId( input_id + '_lng' ).value = lng;
}

function bantora_gmaps_clear_marker( input_node ) {
    var input_id = input_node.id;
    if ( bantora_gmaps[ input_id ][ 'map' ] && bantora_gmaps[ input_id ][ 'previous_marker' ] ) {
        bantora_gmaps[ input_id ][ 'map' ].removeOverlay(
            bantora_gmaps[ input_id ][ 'previous_marker' ]
        );
    }
}

function bantora_gmaps_clear( input_node, html ) {
    var input_id = input_node.id;
    bantora_gmaps_clear_marker( input_node );
    if ( bantora_gmaps[ input_id ][ 'map' ] ) {
        bantora_gmaps[ input_id ][ 'map' ].setCenter(new GLatLng(0, 0), 1);
        bantora_gmaps_set_latlng( input_node, '', '' );
    //    dojo.byId( input_id + "_canvas").innerHTML = html;
        bantora_gmaps[ input_id ][ 'map' ].openInfoWindowHtml(
            bantora_gmaps[ input_id ][ 'map' ].getCenter(),
            html, { noCloseOnClick : true }
        );
    }
}

var bantora_geolocation_sweep_data = {};

function bantora_missing_geolocation_filler() {
    if ( ! dojo.byId('provided_target_ids') ) return;
    if ( ! GBrowserIsCompatible() ) return;
    dojo.addOnUnload( "GUnload" );

    var gc = new GClientGeocoder();
    bantora_missing_geolocations_sweep( gc, dojo.query(".function-missing-geolocation-container") );
    bantora_missing_geolocations_process( gc, dojo.query(".function-missing-geolocation-container") );
}

function bantora_missing_geolocations_sweep( gc, nodes ) {
    var sweep_data = bantora_geolocation_sweep_data;
    nodes.forEach( function( node ) {
        var locnode = dojo.byId( node.id + '_location' );
        if ( ! locnode ) return;

        var locvalue = locnode.value;
        if ( ! sweep_data[ node.id ] ) {
            sweep_data[ node.id ] = { count : 100, loc : locvalue };
        }

        if ( sweep_data[ node.id ].loc == locvalue ) {
            sweep_data[ node.id ].count++;
            if ( sweep_data[ node.id ].count == 5 ) {
                bantora_missing_geolocations_update( gc, node );
            }
        }
        else {
            sweep_data[ node.id ].count = 1;
            sweep_data[ node.id ].loc = locvalue;
        }
        
    } );
    setTimeout( function() {
        bantora_missing_geolocations_sweep( gc, nodes );
    }, 500 );
}

function bantora_missing_geolocations_process( gc, nodes ) {

    var container_node = nodes.shift();
    if ( ! container_node ) return;

    if ( bantora_missing_geolocations_update( gc, container_node ) ) {
        setTimeout( function() {
            bantora_missing_geolocations_process( gc, nodes );
        }, 500 );
    }
    else {
        bantora_missing_geolocations_process( gc, nodes );
    }
}

function bantora_missing_geolocations_update( gc, node ) {
    if ( ! node ) return false;
    var id = node.id;
    var locnode = dojo.byId( id + '_location' );
    if ( ! locnode ) return false;

    var badlocnode = dojo.byId( id + '_badloc' );

    if ( locnode.value && ( ! badlocnode || locnode.value != badlocnode.value ) ) {
        gc.getLatLng(
            locnode.value,
            function ( point ) {
                if ( point ) {
                    bantora_gmaps_set_latlng( node, point.lat(), point.lng() );
                }
            }
        );
        return true;
    }
    else {
        bantora_gmaps_set_latlng( node, '', '' );
        return false;
    }
}

function bantora_init_tag_suggests() {
    dojo.query(".tag_suggestion").forEach( function( tag_node ) {
        var interests = dojo.byId('interests');
        if ( interests ) {
            dojo.connect( tag_node, 'onclick', function( evt ) {
                evt.preventDefault();
                var tag = tag_node.innerHTML;
                var content = interests.innerHTML;
                if ( content.indexOf( tag ) == -1 ) {
                    interests.innerHTML = tag + ( content ? ', ' + content : '' );
                }
            } );
        }
    } );
}

var bantora_events_map_base_url;
var bantora_events_map_gmap;
var bantora_events_map_geocoder;
var bantora_events_map_sweepcounter;
var bantora_events_map_focuscounter;
var bantora_events_map_markers = [];

function bantora_events_map_init() {
    // init gmap2
    if ( ! dojo.byId('events-map-canvas') ) return;
    if ( ! dojo.byId('events-map-initial-base') ) return;
    if ( ! GBrowserIsCompatible() ) return;
    dojo.addOnUnload( "GUnload" );

    bantora_events_map_geocoder = new GClientGeocoder();
    bantora_events_map_gmap = new GMap2(
        dojo.byId( 'events-map-canvas' ),
        { size: new GSize(736,400) }
    );
    m = bantora_events_map_gmap;
//    m.setCenter(new GLatLng(30, 0), 1);
//    m.addControl(new GSmallZoomControl3D() );
//    m.addControl(new GMapTypeControl() );

    // init first base as current location
    // further bases are defined by tag links
    bantora_events_map_base_url = dojo.byId('events-map-initial-base').href;

    // add submits on controllers
    dojo.query(".function-events-map-controller").forEach( function( node ) {
        dojo.connect( node, 'onchange', function ( evt ) {
            bantora_events_map_set_view();
        } );
    } );

    // init first view
    bantora_events_map_set_view();
    bantora_events_map_refocus_loop();
    bantora_events_map_reset_focus();

    // Delay this because bounds are something weird in the beginning..
//    setTimeout( function() {
//        bantora_events_map_focus_update_loop();
//    }, 1500 );

    // initalize custom map - controls
    dojo.connect( dojo.byId('map-type-map'), 'onclick', function (evt ) {
        evt.preventDefault();
        m.setMapType( G_NORMAL_MAP );
    } );
    
    dojo.connect( dojo.byId('map-type-satellite'), 'onclick', function (evt ) {
        evt.preventDefault();
        m.setMapType( G_SATELLITE_MAP );
    } );
    
    dojo.connect( dojo.byId('zoom-in'), 'onclick', function (evt ) {
        evt.preventDefault();
        m.zoomIn();
    } );
    
    dojo.connect( dojo.byId('zoom-out'), 'onclick', function (evt ) {
        evt.preventDefault();
        m.zoomOut();
    } );

    var locnode = dojo.byId( 'events-map-location-input' );
    if ( locnode ) {
        dojo.connect( locnode, 'onkeypress', function( evt ) {
            if ( evt.keyCode != 13 ) return;
            evt.preventDefault();
            bantora_events_map_refocus( locnode.value );
        } );
    }
} 

function bantora_events_map_set_view() {
    // fetch data and tags html
    dojo.xhrPost({
        encoding: 'utf-8',
        url: bantora_events_map_base_url,
        form: "events-map-form",
        handleAs: "json",
        load: function( data ){
            var container = dojo.byId('events-map-tag-container');
            if ( container ) {
                container.innerHTML = data.tags_html;

                dojo.query("a", container).forEach( function( node ) {
                    dojo.connect( node, 'onclick', function (evt ) {
                        evt.preventDefault();
                        bantora_events_map_base_url = node.href;
                        bantora_events_map_set_view();
                    } );
                } );
            }
            bantora_events_map_update_events( data.events );
        },
        error: function( data ) {
            alert( data );
        }
    });
}

function bantora_events_map_update_events( events ) {
    var m = bantora_events_map_gmap;

    // cluster events :) this just plots new ones and stores them for removal next time
    //while ( bantora_events_map_markers.length > 0 ) {
    //    m.removeOverlay( bantora_events_map_markers.pop() );
    //}

	m.clearOverlays();
	
	var icon = new GIcon();
		icon.iconSize = new GSize(26, 32);
		icon.iconAnchor = new GPoint(13, 32);
		icon.infoWindowAnchor = new GPoint(13, 16);

		var b = {};
		dojo.forEach( events, function( evt) {
		
//			if ( evt.gmaps_lat && evt.gmap_lng) {
				var bucket = evt.gmaps_lat + " " + evt.gmaps_lng;
			 	if ( ! b[bucket] ) b[bucket] = [evt]; 
				else b[bucket].push( evt );
//			}		
		} );
		
		for ( var bucket in b ) {
		 
			var infoHtml = '';
			var evtcount = 0;
			var gmaps_lat = null;
			var gmaps_lng = null;
			
			dojo.forEach( b[bucket], function ( evt ) {
				
				if (evt.event_state == "Past" ) icon.image = "/images/bantora/marker-grey.png";
				else if  ( evt.event_state == "Upcoming" || evt.event_state == "Confirmed" ) icon.image = "/images/bantora/marker-yellow.png";
				else if  ( evt.event_state == "Ongoing" ) icon.image = "/images/bantora/marker-green.png";
				else icon.image = "/images/bantora/marker-grey.png";

				infoHtml += '<div class="clearfix" style="width: 200px;"><strong><a class="cyan" href="' + evt.show_link + '" >' + evt.name + '</a></strong><br/>' + evt.loc_name + '<br/>' + evt.date_string + '</div>';
				evtcount++;
				
				gmaps_lat = evt.gmaps_lat;
				gmaps_lng = evt.gmaps_lng;

			});

			if ( gmaps_lat && gmaps_lng ) {
				//multiple marker
				if ( evtcount > 1) icon.image = "/images/bantora/marker-red.png";
				
				m.addOverlay( createMarker(gmaps_lat,gmaps_lng,icon,infoHtml ) );	
			}
		}

//    bantora_events_map_reset_city();
}

function createMarker (gmaps_lat,gmaps_lng,icon,infoHtml) {
	var overlay = new GMarker( new GLatLng( gmaps_lat, gmaps_lng ), icon );
	  
    GEvent.addListener(overlay, "click", function() {
		overlay.openInfoWindowHtml( infoHtml );
	});

	return overlay;
}

function peopleMarker (gmaps_lat,gmaps_lng,icon){
	var overlay = new GMarker( new GLatLng( gmaps_lat, gmaps_lng ), icon , true);
	
	return overlay;
}

function bantora_events_map_reset_focus() {
    bantora_events_map_gmap.setCenter(new GLatLng(30, 0), 1);
}

function bantora_events_map_reset_city() {
    bantora_events_map_reset_focus();
    var locnode = dojo.byId( 'events-map-location-input' );
    if ( ! locnode ) return;
    locnode.value = '';
}

function bantora_events_map_refocus( locvalue ) {
    if ( locvalue ) {
        var tuned_accuracy = [ 1,3,6,10,12,13,16,16,17 ];
        bantora_events_map_geocoder.getLocations(
            locvalue,
            function ( response ) {
                if( response.Status.code == 200) {
                    var result = response.Placemark[0];
                    if ( result ) {
                        bantora_events_map_gmap.setCenter(
                            new GLatLng(result.Point.coordinates[1], result.Point.coordinates[0]),
                            tuned_accuracy[ result.AddressDetails.Accuracy ]
                        );
                    }
                }
                else {
                    bantora_events_map_reset_focus();
                }
            }
        );
    }
    else {
        bantora_events_map_reset_focus();
    }

}

function bantora_events_map_refocus_loop() {
    var locnode = dojo.byId( 'events-map-location-input' );
    if ( ! locnode ) return;

    var locvalue = locnode.value;
    if ( ! bantora_events_map_sweepcounter ) {
        bantora_events_map_sweepcounter = { count : 100, loc : locvalue };
    }
    if ( bantora_events_map_sweepcounter.loc == locvalue ) {
        bantora_events_map_sweepcounter.count++;
        if ( bantora_events_map_sweepcounter.count == 3 ) {
            bantora_events_map_refocus( locvalue );
        }
    }
    else {
        bantora_events_map_sweepcounter.count = 1;
        bantora_events_map_sweepcounter.loc = locvalue;
    }

    setTimeout( function() {
        bantora_events_map_refocus_loop();
    }, 500 );
}

function bantora_events_map_focus_update( bounds ) {

}

function bantora_events_map_focus_update_loop() {
    var b = bantora_events_map_gmap.getBounds();

    var start_lat = b.getSouthWest().lat();
    var start_lng = b.getSouthWest().lng();
    var end_lat = b.getNorthEast().lat();
    var end_lng = b.getNorthEast().lng();
    var ba = [ start_lat, start_lng, end_lat, end_lng ];

    alert( ba.join(", ") );
    
    if ( ! bantora_events_map_focuscounter ) {
        bantora_events_map_focuscounter = { coords : ba, count : 100 };
    }
    var la = bantora_events_map_focuscounter.coords;
    if ( la[0] == ba[0] && la[1] == ba[1] && la[2] == ba[2] && la[3] == ba[3] ) {
        bantora_events_map_focuscounter.count++;
        if ( bantora_events_map_focuscounter.count == 3 ) {
            bantora_events_map_focus_update( ba );
        }
    }
    else {
        bantora_events_map_focuscounter.count = 1;
        bantora_events_map_focuscounter.coords = ba;
    }
    
    setTimeout( function() {
        bantora_events_map_focus_update_loop();
    }, 500 );
}

function bantora_people_map_init() {
    dojo.query(".function-people-map-launcher").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('people_map_dialog') && bantora_people_map_populate( node.href ) ) {
                dijit.byId('people_map_dialog').show();
            }
        } );
    } );
    dojo.query(".function-people-map-close").forEach( function( node ) {
        dojo.connect( node, 'onclick', function (evt) {
            evt.preventDefault();
            if ( dijit.byId('people_map_dialog') ) dijit.byId('people_map_dialog').hide();
        } );
    } );
    
}

function bantora_people_map_populate( base_url ) {
    if ( ! dojo.byId('people-map-canvas') ) return false;
    if ( ! GBrowserIsCompatible() ) return false;
    dojo.addOnUnload( "GUnload" );

    var m = new GMap2(
        dojo.byId( 'people-map-canvas' ),
        { size: new GSize(600,400) }
    );
    m.setCenter(new GLatLng(30, 0), 1);
    //m.addControl(new GLargeMapControl());
    
   	var icon = new GIcon();
		icon.iconSize = new GSize(15, 16);
		icon.iconAnchor = new GPoint(7, 8);
		icon.image = "/images/bantora/Bantora_people_placemarks_1.png";

    dojo.xhrGet({
        encoding: 'utf-8',
        url: base_url,
        handleAs: "json",
        load: function( data ){
            dojo.forEach( data.profiles, function( profile ) {
                var overlay = peopleMarker(profile.gmaps_lat, profile.gmaps_lng, icon );
                m.addOverlay(overlay);
            } );
        },
        error: function( data ) {
            alert( data );
        }
    });
        
    dojo.connect( dojo.byId('zoom-in'), 'onclick', function (evt ) {
        evt.preventDefault();
        m.zoomIn();
    } );
    
    dojo.connect( dojo.byId('zoom-out'), 'onclick', function (evt ) {
        evt.preventDefault();
        m.zoomOut();
    } );

    return true;
}

dojo.addOnLoad( function() {
    dojo.parser.parse( document );
    for (var i in global_return_messages ) {
        dojo.publish("global_return_messages", [ global_return_messages[i] ] );
    }
    bantora_invite_init();
    bantora_attend_init();
    bantora_event_mailto_init()
    bantora_about_init();
    bantora_login_init();
    bantora_init_contact_buttons();
    bantora_init_button_pages();
    bantora_show_event_showmore();
    bantora_init_avatar_names();
    bantora_people_more_buttons();
    bantora_wizard_init_section_toggles();
    bantora_wizard_init_event_types();
    bantora_init_gmaps_input();
    bantora_init_tag_suggests();
    bantora_missing_geolocation_filler();
    bantora_events_map_init();
    bantora_people_map_init();
} );

