var col_filled = '#CD7F32';
var col_empty  = '#D2D1D7';
var col_voted  = '#ff9933';
var items_voted = new Object();
var html_googlemaps_initialize;

var msecs_p_day = 1000 * 60 *60 * 24;
var cv_slash_datefmt = '%m/%d/%Y';
var prev_checkin_date, prev_checkout_date;

var footer_y_offset;
var search_in_prog;
var has_fb_permissions, denied_fb_permissions;

// todo neaten later
var old_response_message_width;

// override autocompleteDB function for improved performance
AutoCompleteDB.prototype.getCount = function(str, bExact, prefix) {
    // if end of search string, return number
    // if ( str == "" )
    
    if (prefix == '')
        str = str.replace(/^\s+/, '');
    
    if (str.length < 2)
        if ( this.bEnd && bExact && (this.nCount == 1) ) return 0;
        else return this.nCount;        
    
    // otherwise, pull the first letter off the string
    var letter = str.substring(0,1);
    var rest   = str.substring(1,str.length);
    prefix += letter;

    // and look for case-insensitive matches
    var nCount = 0;
    var lLetter = letter.toLowerCase();
    var uLetter = letter.toUpperCase();
    var lL2 = str.substring(1,1).toLowerCase();
    var uL2 = lL2.toUpperCase();

    if (    !(  (   this.aObj[lLetter] && (
                        this.aObj[lLetter][lL2] ||
                        this.aObj[lLetter][uL2]
                    ) &&
                    this.aObj[uLetter] && (
                        this.aObj[uLetter][lL2] ||
                        this.aObj[uLetter][uL2]
                    )
                )
            ) &&
            ( prefix == letter )
    ) {
        // not quite sure why the two lines below best clear the memory but ...
        this.processStringCount(0, uLetter);
        this.processStringCount(0, lLetter);
        var list = load_location_list(str.substring(0,2), this,
            function () {this.getCount(str, bExact, prefix)}
        );
    }
    
    if ( this.aObj[lLetter] ) {
        nCount += this.aObj[lLetter].getCount(rest,bExact && (letter == lLetter),prefix);
    }

    // In case this is a space or some char that doesn't have up/low case we
    //  drop out here...
    if ( lLetter == uLetter && lLetter != "'") return nCount;
    if ( this.aObj[uLetter] )
        nCount += this.aObj[uLetter].getCount(rest, bExact && (letter == uLetter),prefix);
    
    return nCount;
}

// monkey patch to run onsubmit if there is one
AutoComplete.prototype.submit = function() {
    if (!this.oForm.onsubmit || this.oForm.onsubmit()) {
        init_page_load();
        this.oForm.submit();
    }
}

function show_message(message) {
    var respDiv = $('response_message');
    var msgDiv  = $('message');
    
    msgDiv.innerHTML = message;
    respDiv.style.display = 'block';
}

    function internalError(transport) {
        show_progress_bar(0);
        var message = ( transport.responseText )
            ? "Sorry, there was an error: " + transport.responseText
            : transport;
        show_message( message );
    }

    function set_display_none(id) {
        var element = $(id);
        
        if (id == 'response_message' && old_response_message_width) {
            element.style.width = old_response_message_width;
            old_response_message_width = undefined;
        }

        if ( element ) {
            element.style.display = 'none';
        }
    }

    function set_display_block(id) {
        var element = $(id);

        if ( element ) {
            element.style.display = 'block';
        }
    }

    function toggle_div(id_prefix) {
        $(id_prefix + '_open').toggle();
        $(id_prefix + '_closed').toggle();
    }

    function init_page_load () {
        show_progress_bar(1);
        return 1;
    }
    
    function show_progress_bar( show , text_id ) {
        var load_node = $('load_progress_id');
        if ( !load_node ) {
            alert('error loading progess div');
            return;
        }
        
        if ( !show ) {
            load_node.style.display = 'none';
            return 1;
        }
        
        $('progress_text').innerHTML = $(text_id || 'std_progress_text').innerHTML;
        load_node.style.display = 'block';
        return 1;
    }
    
// AJAX call to load initial location data for the search box

function initiate_auto_complete_query ( ) {
    //load_location_list();
    createAutoComplete('location_query_box','location_query_auto','fs_search_form');
}


    function load_location_list ( prefix, autoCompleteObj, completion_cb ) {
    var params              = new Object();
    params['search_prefix'] = prefix || null;
    
    if (prefix && prefix == search_in_prog)
        return
    else
        search_in_prog = prefix;

    var list;
    new Ajax.Request('/search/get_location_list', {
        method: "post",
         parameters: params,
        onSuccess: function (transport) {
            list = transport.responseText.evalJSON();
            if ( list.length ) {
                autoCompleteObj.processStrings(list);
                completion_cb();
                search_in_prog = undefined;
            }
        },
        onFailure: function(transport) {
            internalError();
        }
    });
}

// Voting Code

    function submit_vote (item_id, response) {
        show_progress_bar(1);

        fill_stars(item_id, response, 1);

        var params = new Object();
        params['shared_page']       = $('shared_page_id').value;
        params['voter']             = $('v_user').value;
        params['social_network']    = $('social_network').value;
        params['item']              = item_id;
        params['response']          = response;
        
        new Ajax.Request('/voting/submit_vote', {
            method: "post",
            parameters: params,
            onSuccess: function (transport) {
                show_progress_bar(0);
                var responseJSON = transport.responseText.evalJSON();
                if ( responseJSON['error'] ) {
                    internalError(responseJSON['error']);
                }
                else {
                    var average_rating = responseJSON['average_rating'];
                    var vote_count     = responseJSON['vote_count'];
                    var result_message = responseJSON['result_message'];
                    update_vote_results(average_rating, vote_count, result_message, item_id);
                }
            },
            onFailure: function (transport) {
                show_progress_bar(0);
                internalError(transport);
            }
        });
    }

    function filter_ratings () {
        show_progress_bar(1);

        var params = new Object();
        params['restrict_friends']       = $('restrict_friends_id').checked;
        
        new Ajax.Request('/search/set_friends_filter', {
            method: "post",
            parameters: params,
            onSuccess: function (transport) {
                show_progress_bar(0);
                var responseJSON = transport.responseText.evalJSON();
                if ( responseJSON['error'] ) {
                    internalError(responseJSON['error']);
                }
                else {
                    var result_message = responseJSON['result_message'];
                    if (result_message == "OK")
                        location.reload(true);
                    else
                        internalError(result_message);
                }
            },
            onFailure: function (transport) {
                show_progress_bar(0);
                internalError(transport);
            }
        });
    }

    // todo fix case where no vote count yet
    var voter_already_thanked;
    function update_vote_results (average_rating, vote_count, result_message, item_id) {
        if (result_message.match('appreciated')) {
            var uarID = $('user_average_rating_' + item_id);
            var uvcID = $('user_vote_count_' + item_id);
    
            uarID.innerHTML = average_rating;
            uvcID.innerHTML = vote_count;
            
            if (! voter_already_thanked) {
                show_message(result_message);
                voter_already_thanked = 1;
            }
        }
        else {
            old_response_message_width = $('response_message').style.width;
            $('response_message').style.width = '320px';
            show_message(result_message);
        }
    }

    function fill_stars(item_id, response, vote) {
        var stars = $$('#star_group_' + item_id + ' .voting_star');

        var col_on  = vote ? col_voted : col_filled;
        var col_off = col_empty;

        if ( vote == 1 )
            items_voted[item_id] = response;
        
        var x=1; // star iterator
        stars.each(function(star) {
            if ( x <= response ) {
                star.style.background = col_on;
            }
            else {
                if ( items_voted[item_id] >= x )
                    star.style.background = col_voted;
                else
                    star.style.background = col_off;
            }
            x++;
        });
    }

    function hover_star (e) {
        var id_string = this.id.split(/_/);
        var item_id = id_string[2];
        var response = id_string[3];
        fill_stars(item_id, response, 0);
    }

    function leave_star (e) {
        var id_string = this.id.split(/_/);
        var item_id = id_string[2];
        var response = id_string[3];
        fill_stars(item_id, 0, 0);
    }

    function clear_default_text (e) {
        this.value = '';
        this.style.color = 'black';
        this.focus();
        Event.stopObserving(this, 'mousedown', clear_default_text);
    }

    function add_check_in_check_out () {
        
    }
    
    function get_search_params () {
        var params = new Object();
        if ( $('page_location') ) {
            // This is for when an existing items page.
            params['search_location'] = $('page_location').innerHTML;
            params['item_type']       = 1; // HACK! should actually get this...
            params['items_page']      = 1;
            params = set_existing_attr_params(params);
        }
        else {
            // This is the regular search form
            params = $('fs_search_form').serialize(true);
            params['search_location']  = $('location_query_box').value;
            params['item_type']        = $('item_type_select').value;
        }

        return params;
    }
    
    function get_socialize_query () {
        var params = get_search_params();
        if (denied_fb_permissions) params['no_fb_perm'] = denied_fb_permissions;
        
        new Ajax.Request('/search/get_socialize_query', {
            method: "post",
            parameters: params,
            onSuccess: function (transport) {
                var responseJSON = transport.responseText.evalJSON();
                if ( responseJSON['error'] ) {
                    internalError(responseJSON['error']);
                }
                else {
                    launch_modal_div(responseJSON['html']);
                }
            },
            onFailure: function (transport) {
                internalError(transport);
            }
        });
    }

    function get_socialize_manage_conn () {
        var params = new Object();
        params[ 'home_page' ] = $('home_page') ? 1 : 0;
        
        new Ajax.Request('/search/get_socialize_manage_conn', {
            method: "post",
            parameters: params,
            onSuccess: function (transport) {
                var responseJSON = transport.responseText.evalJSON();
                if ( responseJSON['error'] ) {
                    internalError(responseJSON['error']);
                }
                else {
                    launch_modal_div(responseJSON['html']);
                    $('login_to_personalize').focus();
                    Event.observe(
                        'socialize_manage_conn', 'keypress',
                        function(event){
                            if(event.keyCode == Event.KEY_RETURN)
                                $('login_to_personalize').click()
                        }
                    );
                }
            },
            onFailure: function (transport) {
                internalError(transport);
            }
        });
    }

    function home_page_search() {
        if (validate_search_form()) {
            // todo exception handling for evalJSON
            var included_sn = (readCookie('included_sn') || '{}').replace('#', ',').evalJSON();
            if (
                (   included_sn['facebook'] == null &&
                    included_sn['twitter'] == null
                ) ||
                (   included_sn['facebook'] &&
                    $('is_auth_facebook').innerHTML == ""
                ) ||
                (   included_sn['twitter'] &&
                    $('is_auth_twitter').innerHTML == ""
                )                
            ) {
                get_socialize_manage_conn();
                return false;
            }
            else {
                show_progress_bar(1);
                return true;
            }
        }
        else {
            show_message('You must choose a location prior to Searching with a valid choice from the drop down.');
            return false;
        }        
    }
    
    function enforce_search_validation(e) {
        if ( validate_search_form() ) {
            show_progress_bar(1);
            return true;
        }
        else {
            show_message('You must choose a location prior to Searching with a valid choice from the drop down.');
            return false;
        }
    }
    
    function validate_search_form_l(location) {
        var regexp = /^(?:['\w(]+\s+)*['\w(]+\)?,\s\w+$/;
        return (location.match(regexp) != null);
    }

    function validate_search_form() {
        return validate_search_form_l($('location_query_box').value)
    }
    
    function submit_search_form () {
        close_modal_div();
        show_progress_bar(1);
        var form = $('fs_search_form');
        form.submit();
    }
    
    function launch_modal_div (modal_div_html) {
        var div_element     = $('modal_div'); 
        var content_element = $('modal_div_content');

        content_element.innerHTML = modal_div_html;

        div_element.style.display = 'block';
    }

    function close_modal_div () {
        var div_element     = $('modal_div'); 

        div_element.style.display = 'none';
    }

    // todo - lots of work here - at the least need to refresh results page
    function logout () {
//        FB.Connect.logout(function () {}); // hack - should check that we're logged in
        new Ajax.Request('/login/logout', {
            method: "post",
            onSuccess: function (transport) {
                show_progress_bar(0);
                var responseJSON = transport.responseText.evalJSON();
                if ( responseJSON['error'] ) {
                    internalError(responseJSON['error']);
                }
                else {
                    var login_status_html = responseJSON['html'];
                                                    // home page ?
                    $('login_status').innerHTML = $('save_location_query') ? 
                        '' : login_status_html;                    
                    show_message(responseJSON['response_text']);
                    var fb_auth = $('is_auth_facebook');
                    if (fb_auth) {
                        fb_auth.innerHTML = '';
                    }
                }
            },
            onFailure: function (transport) {
                show_progress_bar(0);
                internalError(transport);
            }
        });
    }
    
    // todo migrate to http://www.lalit.org/wordpress/wp-content/uploads/2008/06/cookiejar.js
    function set_included_sn_cookie () {
        document.cookie = 'included_sn={"facebook":' +
            ($('socialize_facebook').checked ? '1' : '0') +
            '#"twitter":' + ($('socialize_twitter').checked ? '1' : '0') + '}' +
            ';expires=Thu, 2 Aug 2099 20:47:12 UTC; path=/';        
    }

    function search_submit_fn() {
        show_progress_bar(1);
        $('fs_search_form').submit();        
    }
    
    function manage_connections(is_for_search) {
        if ($('socialize_facebook').checked || $('socialize_twitter').checked)
            set_included_sn_cookie();
        close_modal_div();
        var need_twitter_login = $('socialize_twitter').checked &&
            $('is_auth_twitter').innerHTML == "";
        if ($('socialize_facebook').checked && $('is_auth_facebook').innerHTML == "")
            logon_facebook(is_for_search, need_twitter_login);
        else if (need_twitter_login)
            logon_twitter(is_for_search);
        else {
            search_submit_fn();
        }
    }

    function insist_fb_permission(permission, cb_ok, cb_fail) {
        FB.Facebook.apiClient.users_hasAppPermission(permission,function(has) {
                if (has)
                    cb_ok();
                else 
                    FB.Connect.showPermissionDialog(permission, function(granted){
                        if (granted == permission) cb_ok(); else cb_fail();
                    });
        });
    }

    function confirm_socialize () {
        if (! $('edit_socialize_text').value.match(/\w+\s+\w+\s+\w+/)) {
            $('need_socialize_msg').style.display = 'block';
            return;
        }

        set_included_sn_cookie();        
        close_modal_div();

        var need_twitter_login = $('socialize_twitter').checked &&
            $('is_auth_twitter').innerHTML != "2";
        if ($('socialize_facebook').checked && $('is_auth_facebook').innerHTML != "2")
            logon_facebook(1, (need_twitter_login ? 'upd_chain' : undefined) );
        else if (need_twitter_login)
            logon_twitter(1);
        else {
            if ($('socialize_facebook').checked  && ! has_fb_permissions) {
                insist_fb_permission(
                    'publish_stream',
                    function () {
                        has_fb_permissions = true;
                        denied_fb_permissions = false;
                        create_shared_page_now();
                    },
                    function () {
                        denied_fb_permissions = true;
                        get_socialize_query();                        
                    }
                );
            }
            else {
                create_shared_page_now();
            }
            
        }
    }

    function logon_twitter(is_for_search) {
        $('new_login_for_search_id').value = is_for_search;
        if ($('socialize_form'))
            $('socialize_form').submit();
        else { // home page
            $('fs_search_form').action = '/login/oauth_twitter_user';
            $('fs_search_form').submit();
        }
    }
    
    // todo remove need_twitter_login
    function logon_facebook(is_for_search, need_twitter_login) {
        var search_params = '&o=' + escape(window.location);
        if ($('home_page'))
            search_params += '&' + $('fs_search_form').serialize(false);

        FB.Connect.requireSession(
            function () {fb_redir(search_params, is_for_search, need_twitter_login)},
            function(){show_message(
                    'Facebook login failed!<br><br>' +
                    'Facebook login requires both Publishing permission to get input from friends '+
                    'and Constant Authorization for offline communications.'
                );
            }
        );
    }

    function set_existing_attr_params(params) {
        var attr_str = $('page_attributes').innerHTML;
        var attr_arr = attr_str.split(",");
        attr_arr.each(function(attr) {
            params[attr] = "on";
        });
        return params;
    }
    
    function get_create_shared_page_params () {
        var params = new Object();

        params['search_location'] = $('page_location').innerHTML;
        params['area_key'] = $('area_key').innerHTML;
        params['distance'] = $('distance').innerHTML;
        params['socialize_twitter'] = $('socialize_twitter').checked ? 1 : 0;
        params['socialize_facebook'] = $('socialize_facebook').checked ? 1 : 0;
        params['edit_socialize_text'] = $('edit_socialize_text').value;
        params = set_existing_attr_params(params); // set attribute params

        return params;
    }
    
    function create_shared_page_now () {
        show_progress_bar(1, 'socialize_share_page_text');
        var params = get_create_shared_page_params();

        new Ajax.Request('/sharedpages/create_shared_page', {
            method: "post",
            parameters: params,
            onSuccess: function (transport) {
                show_progress_bar(0);
                var responseJSON = transport.responseText.evalJSON();
                if ( responseJSON['error'] ) {
                    internalError(responseJSON['error']);
                }
                else {
                    show_message(responseJSON['response_text']);
                }
            },
            onFailure: function (transport) {
                show_progress_bar(0);
                internalError(transport);
            }
        });
    }

    /*  There may be a better way to set dates like below at some point
        newDate.setDate(newDate.getDate()+offset);      */
    function show_get_reservation_dates (that, altpos) {
        var params = new Object();

        if (altpos) {
            var div_element     = $('modal_div'); 
            div_element.style.left = '10%';
            div_element.style.top = '40%';
        }
        
        params['template'] = 'reservation_dates_page.tt2';
        show_modal_login(
            params,
            function () {
                var t = new Date().getTime();
                $('check_in').value = prev_checkin_date ||
                    new Date(t + msecs_p_day).print(cv_slash_datefmt);
                $('check_out').value = prev_checkout_date ||
                    new Date(t + 3 * msecs_p_day).print(cv_slash_datefmt);
                $('reservation_date_fwd').href = that.href;
                Calendar.setup({ /* worry about memory leak here ... */
                    dateField: 'check_in',
                    triggerElement: 'check_in_cal_img',
                    dateFormat: cv_slash_datefmt,
                    altClass: (altpos ? 'popup2' : undefined)
                });
                Calendar.setup({
                    dateField: 'check_out',
                    triggerElement: 'check_out_cal_img',
                    dateFormat: cv_slash_datefmt,
                    marginTop: '-20px',
                    altClass: (altpos ? 'popup2' : undefined)
                });
            }
        );
    }

    function date_yyyy_mm_dd(d) {
        return  d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate();
    }

    function update_reservation_date (is_upd_check_in) {
        var check_in_time = Date.parse($('check_in').value);
        var check_out_time = Date.parse($('check_out').value);
        if (is_upd_check_in) {
            if (    (! isNaN(check_in_time)) &&
                    (   isNaN(check_out_time)   ||
                        check_out_time < check_in_time + 2 * msecs_p_day
                    )
            ) {
               $('check_out').value =  new Date(
                    check_in_time + 2 * msecs_p_day
                ).print(cv_slash_datefmt);
            }
        }
        else {
            if (    (! isNaN(check_out_time)) &&
                    (   isNaN(check_in_time)   ||
                        check_out_time < check_in_time
                    )
            ) {
               $('check_in').value =  new Date(
                    check_out_time - msecs_p_day
                ).print(cv_slash_datefmt);                
            }
        }

    }
    
    function process_dated_rate_check (that) {
        var check_in_time = Date.parse($('check_in').value);
        var check_out_time = Date.parse($('check_out').value);
        
        if (    isNaN(check_in_time)            ||
                isNaN(check_out_time)           ||
                check_in_time > check_out_time
        ) {
            show_message('Please provide two valid dates with the check in date no later than the check out date.')
            return false;            
        }
        else {
            prev_checkin_date = $('check_in').value;
            prev_checkout_date = $('check_out').value;
            that.href +=
                '&checkIn=' + date_yyyy_mm_dd(new Date(check_in_time)) +
                '&checkOut=' + date_yyyy_mm_dd(new Date(check_out_time));
            setTimeout('close_modal_div()', 500);
            return true;
        }
    }

    function net_left_offset(obj) {
        var x = obj.offsetLeft
        while (obj = obj.offsetParent) x += obj.offsetLeft
        return x
    }

    function complete_partner_login() {
      var for_search = (
            $('new_login_for_search_id') && $('new_login_for_search_id').value
      ) || '';
      var login_result = ($('login_result') && $('login_result').innerHTML) || '';
      
      if ( for_search.match('^shared_page') != null ||
           login_result.match('^invalid_fb_sess') != null
      ){
        setTimeout(
            function () {
                if (for_search.match('lofb') != null ) {
                    FB.Connect.logout(function () {});
                    setTimeout(function (){logon_facebook(0, 0)}, 3000);
                }
                else if (login_result.match('^invalid_fb_sess')) {
                    var need_twitter = login_result.match('chain_twitter') ? 1 : 0;
                    FB.Connect.logout(function () {});
                    setTimeout(function (){logon_facebook(for_search, need_twitter)}, 3000);                    
                }
                else
                    logon_facebook(0, 0)
            },
            500
        );
        return;
      }
      
        if ($('save_location_query')) { // from home page ?
            var saved_query = $('save_location_query').innerHTML;
            if (saved_query) {
                var check_for_attrs = saved_query.match(/, \w{2}:(.+)/);
                if (check_for_attrs != null) {
                    var attrs = check_for_attrs[1].split(':');
                    saved_query = saved_query.replace(/, (\w{2}):.+/, ', $1');
                    for (var i = 0; i < attrs.length; i++) {
                        $('fs_search_form')[attrs[i]].setValue('on');
                    }
                }
                if (validate_search_form_l(saved_query))
                    $('location_query_box').value = saved_query;
            }
        }
      
      if (login_result) {
        if (login_result.match('accepted')) { // might have to check for second login right away
            // todo exception handling for evalJSON
            var included_sn = (readCookie('included_sn') || '{}').replace('#', ',').evalJSON();
            if (included_sn['facebook'] && $('is_auth_facebook').innerHTML == "") {
                logon_facebook(for_search);
                return;
            }
            else if (   included_sn['twitter'] &&
                        (   $('is_auth_twitter').innerHTML == "" || (
                                $('is_auth_twitter').innerHTML == "1" &&
                                $('need_authorization').innerHTML != ""
                            )
                        )
            ) {
                show_progress_bar(1, 'twitter_login_text');
                logon_twitter(for_search);
                return;
            }

            if (for_search == 'hp_search') {
                search_submit_fn()
            }
            else if (for_search != 'just_login') {
                get_socialize_query(); // facebook rename
            }
        }
        else if (login_search == 'denied-twitter')
            show_message('Sorry, we were unable to verify your Twitter Credentials. Please try again.');
      }
      
        if ($('is_auth_facebook') && $('is_auth_facebook').innerHTML != "") {
            setTimeout(
                function () {
                    FB.Facebook.apiClient.users_hasAppPermission(
                        'publish_stream', function(has) {
                            if (has) FB.Facebook.apiClient.users_hasAppPermission(
                                'offline_access',function(has) {has_fb_permissions = has }
                            );
                        }
                    );                    
                }, 1000
            )
        }
      
    }

  // Setup event handlers.

  Event.observe(window, 'load', function() {
      FB.init(fb_api_key, "/xd_receiver.htm");
      initiate_auto_complete_query();
      setup_star_observation();
      Event.observe('location_query_box', 'mousedown', clear_default_text);
      init_google_maps();
      complete_partner_login();
  });

  var sav_map_list_open_top;

  // Prevent the map from scrolling down over the footer.
  // much complexity here to adapt to Safari including timout and redraw
  function keep_map_off_footer () {
    var top = document.documentElement.scrollTop || document.body.scrollTop;
    var should_bump = (top + screen.height) > footer_y_offset;

    if (should_bump && ! sav_map_list_open_top) {
        sav_map_list_open_top = $('map_listing_open').getStyle('top');
        $('map_listing_open').style.display = 'none';
        setTimeout( function () {
                $('map_listing_closed').style.top =
                    $('map_listing_open').style.top = '20px';
                $('map_listing_open').style.display = 'inline';
            }, 30
        )
    }
    else if (sav_map_list_open_top && ! should_bump) {
        var new_top = sav_map_list_open_top;
        sav_map_list_open_top = undefined;
        $('map_listing_open').style.display = 'none';
        setTimeout( function () {
                $('map_listing_closed').style.top =
                    $('map_listing_open').style.top = new_top;
                $('map_listing_open').style.display = 'inline';
            }, 30
        )
    }
  }

    function window_unload () {
        show_progress_bar(0);
    }
    
    Event.observe(window, 'unload', window_unload);

  Event.observe(window, 'resize', set_map_col);

  function setup_star_observation () {
      var voting_links = $$('.voting_link');
      
      voting_links.each(function(voting_link) {
          Event.observe(voting_link, 'mouseover', hover_star);
          Event.observe(voting_link, 'mouseout', leave_star);
      });
  }

    function net_left_offset(obj) {
        var x = obj.offsetLeft
        while (obj = obj.offsetParent) x += obj.offsetLeft
        return x
    }

  function set_map_col ()  {
    var left_off = net_left_offset($('secondary_col')) + 'px';
    $('map_listing_open').style.left = left_off;
    $('map_listing_closed').style.left = left_off;    
  }

  function init_google_maps () {
      if ( $('map') ) {
        footer_y_offset = $('footer').cumulativeOffset()[ 1 ];
        Event.observe(window, 'scroll', keep_map_off_footer);
      }
      if ( $('map_listing_open') ) {
          set_map_col();
          $('map_listing_closed').style.width = $('map_listing_open').offsetWidth + 'px';
          $('map_listing_open_initial').style.visibility = 'hidden';
        
          $('map_listing_open').style.top =
              $('map_listing_open_initial').cumulativeOffset()[ 1 ] + 'px';

          $('map_listing_open').style.visibility = 'visible';
          html_googlemaps_initialize();
          return 1;
      }
      if ( $('map') ) html_googlemaps_initialize();
  }
  
  function setDefaultAreaDistance(t) {
      var d;
      
      if (t.value.indexOf("/") > -1) {
        d = "2"
      }
      else {
        var st_city = t.value.split(", ");
        if (st_city.length == 2 && fs_default_city_radius[st_city[1]])
            d = fs_default_city_radius[st_city[1]][st_city[0]]
      }
      Form.Element.setValue("distance_select", d || "5")
  }

    // note that facebook login comes first so chaining may be passed along ...
    function fb_redir (search_params, is_for_search, need_twitter_login) {
        var chain = need_twitter_login ?
            (need_twitter_login == 'upd_chain' ? '&c=u' : '&c=t') : '';
        if (need_twitter_login) {
            show_progress_bar(1, 'twitter_login_text');
            Event.stopObserving(window, 'unload', window_unload);
        }
        session = FB.Facebook.apiClient.get_session();
        window.location = 'http://' + window.location.host +
            '/login/facebook_cb/' +
            '?u=' + session.uid +
            '&k=' + session.session_key +
            '&e=' + session.expires +
            '&s=' + is_for_search +
            chain +
            search_params;
    }
