window.onerror = handle_error;
window.onresize = resize_to_window;
var map_height, map_width,
window_height, window_width,
img_x, img_y,
zoom_slider, zoom_slider_direction,
server = 'geofred.stlouisfed.org',
public_web_dir = '/',
public_img_dir = public_web_dir + 'templates/stlouis/images/',
resize_window_timer,
current_map_values = new Array(),
get_map_req,
feature_info_req;
function handle_error()
{
if($('glass')) $('glass').hide();
if($('featureinfo')) $('featureinfo').hide();
alert('An error has occurred. Please refresh the page and try again.');
}
function init(call_set_defaults,reset_zoom_slider)
{
set_window_dimensions();
if(call_set_defaults) set_defaults();
position_loading_box();
get_map(false,true);
if(reset_zoom_slider)
{
$('code').value = '';
$('location').value = '';
}
if($F('class_method') == 'user')
{
$('hide_for_custom').hide();
$('custom_classes').show();
}
}
function set_defaults()
{
var geom_type = $('geom_type');
for(i=0 ; i < geom_type.length ; i++) {
if(geom_type[i].value == 'state') {
geom_type.selectedIndex = i;
}
}
var tag = $('tag');
if(tag)
{
for(i=0 ; i < tag.length ; i++) {
if(tag[i].value == 'All') {
tag.selectedIndex = i;
}
}
}
var series_type = $('series_type');
for(i=0 ; i < series_type.length ; i++) {
if(series_type[i].value == 'Unemployment Rate') {
series_type.selectedIndex = i;
}
}
var series_attribute = document.mapserv.sa;
if(series_attribute && series_attribute.length > 1) {
series_attribute[0].checked = true;
}
else if(series_attribute) {
series_attribute.checked = true;
}
var frequency = $('frequency');
for(i=0 ; i < frequency.length ; i++) {
if(frequency[i].value == 'Monthly') {
frequency.selectedIndex = i;
}
}
$('units').selectedIndex = 0;
$('dates').selectedIndex = 0;
}
function set_window_dimensions()
{
if (self.innerWidth)
{
window_width=self.innerWidth-1;
window_height=self.innerHeight-1;
}
else if (document.documentElement && document.documentElement.clientWidth)
{
window_width=document.documentElement.clientWidth-1;
window_height=document.documentElement.clientHeight-1;
}
else if (document.body.clientWidth)
{
window_width=document.body.clientWidth-1;
window_height=document.body.clientHeight-1;
} else {
window_width=document.body.offsetWidth-1;
window_height=document.body.offsetHeight-1;
}
if(!window_width) window_width=1024;
if(!window_height) window_height=768;
map_width = window_width - 22 - 18;
map_height = window_height - Element.getHeight('banner') - Element.getHeight('toolbar') - 2;
}
function resize_to_window()
{
window.clearTimeout(resize_window_timer);
resize_window_timer=window.setTimeout('resize()',500);
}
function resize() {
set_window_dimensions();
position_loading_box();
get_map(false);
}
function activate_map_options_tab(tab)
{
$('dataoptions_tab').className = 'none';
$('classoptions_tab').className = 'none';
$('layeroptions_tab').className = 'none';
$(tab+'_tab').className='active';
$('dataoptions').hide();
$('classoptions').hide();
$('layeroptions').hide();
$(tab).show();
}
function activate_feature_info_tab(tab)
{
$('databox_tab').className = 'none';
$('chartbox_tab').className = 'none';
$('cross_section_tab').className = 'none';
$(tab+'_tab').className='active';
$('databox').hide();
$('chartbox').hide();
$('cross_section').hide();
$(tab).show();
}
function show_feature_info(x,y)
{
$('featureinfo').setStyle({position: 'absolute'});
var height = $('featureinfo').getHeight();
var width = $('featureinfo').getWidth();
// does box fit bottom
if(y + height < window_height) {
$('featureinfo').setStyle({top: y+'px'});
}
// does box fit top
else if(y - height > 0) {
$('featureinfo').setStyle({top: y - height+'px'});;
}
// put box in middle
else {
$('featureinfo').setStyle({top: ((window_height / 2) - (height/2))+'px'});
}
// does box fit right
if(x + width < window_width) {
$('featureinfo').setStyle({left: x+'px'});
}
// does box fit left
else if(x - width > 0) {
$('featureinfo').setStyle({left: x - width+'px'});
}
// put box in middle
else {
$('featureinfo').setStyle({left: (window_width/2) - (width/2)+'px'});
}
$('featureinfo').setStyle({display: 'block'});
}
function set_zoom_direction(direction , button) {
$('zoom_dir').value = direction;
$('zoomin').src = public_img_dir+'zoomin2.gif';
$('zoomout').src = public_img_dir+'zoomout2.gif';
$('recenter').src = public_img_dir+'recenter2.gif';
$('get_data').src = public_img_dir+'get_data2.gif';
$(button).src = public_img_dir+button+'_on2.gif';
}
function position_loading_box()
{
$('glass').setStyle({
width : map_width + 'px',
top : map_height/2 + 'px'
});
$('mapoptions').style.left = ((window_width / 2) - 300);
$('search_location').style.left = ((window_width / 2) - 300);
$('pdf_download').style.left = ((window_width / 2) - 300);
$('data_download').style.left = ((window_width / 2) - 300);
if($('map_title')) $('map_title').style.width=map_width + 'px';
if($('legend_border')) $('legend').style.top = window_height - $('legend_border').getHeight();
}
function build_links()
{
var parameters = get_map_parameters(null , true);
var parameters_string = '?';
for(var i in parameters)
{
parameters_string = parameters_string + i + '=' + parameters[i] + '&';
}
$('print_link').href = public_web_dir+'print.php'+parameters_string;
$('download_link').href = public_web_dir+'download_data.php'+parameters_string;
$('pdf_link').href = public_web_dir+'download_pdf.php/geofred.pdf'+parameters_string;
$('map_link').href = parameters_string;
if($('map_id').value)
{
$('save_as_new_link').href = 'http://research.stlouisfed.org/useraccount/geofred'+parameters_string+'&action=add_map';
$('save_link').href = 'http://research.stlouisfed.org/useraccount/geofred'+parameters_string+'&action=update_map&map_id='+$('map_id').value+'&category_id='+$('category_id').value;
}
else
{
$('save_link').href = 'http://research.stlouisfed.org/useraccount/geofred'+parameters_string+'&action=add_map';
}
parameters_string = parameters_string.replace(/ /g,'%20');
parameters_string = escape(parameters_string);
$('email_link').href='mailto:?subject=GeoFRED%20Map&body=http://'+server+public_web_dir+parameters_string;
populate_pdf_dates();
populate_data_dates();
}
function get_map_parameters(zoom , build_link , use_current_map_values , reset_zoom_slider)
{
var zoom_direction;
if(zoom || zoom_slider_direction)
{
zoom_direction = zoom_slider_direction ? zoom_slider_direction : $F('zoom_dir');
zoom_slider_direction = '';
}
var parameters = $($('mapserv').getInputs('checkbox','l[]'),$('mapserv').getInputs('radio','sa'));
parameters[2] = $('class_method','extent','num_of_breaks','color_scheme','color_scheme_reverse');
parameters[3] = $('geom_type','tag','series_type','units','dates','frequency');
parameters[4] = $('show_data','entire_time_line','ranges_limit_to_frame','ranges_limit_to_district' , 'basemap_type','basemap_code');
if(!build_link)
{
parameters[5] = $('scale','new_geom_type','old_geom_type','initial_scale','zoom_level','code','type');
}
parameters = Form.serializeElements(parameters.flatten() , true);
if($('class_method').value == 'user')
{
var breaks = '';
for(var i = 1 ; i <= $F('num_of_breaks') ; i++)
{
breaks += $F('custom_break_'+i+'_min');
breaks += ':';
breaks += $F('custom_break_'+i+'_max');
if(i < $F('num_of_breaks')) breaks += ',';
}
parameters['cc'] = breaks;
}
if(!build_link)
{
parameters['js_width'] = map_width;
parameters['js_height'] = map_height;
parameters['img_x'] = img_x;
parameters['img_y'] = img_y;
parameters['zoom_dir'] = zoom_direction;
}
if(use_current_map_values) {
parameters['geom'] = current_map_values['geom_type'];
parameters['tag'] = current_map_values['tag'];
parameters['st'] = current_map_values['series_type'];
parameters['dtn'] = current_map_values['units'];
parameters['sa'] = current_map_values['series_attribute'];
parameters['fq'] = current_map_values['frequency'];
parameters['dt'] = current_map_values['date'];
}
if(reset_zoom_slider) {
parameters['ex'] = '';
parameters['scale'] = '';
parameters['zoom_level'] = '';
}
return parameters;
}
function get_feature_info(x,y)
{
$('glass_text').update('Retrieving Data ...');
$('glass').show();
img_x = tempX - 22;
img_y = tempY - $('banner').getHeight() - $('toolbar').getHeight();
feature_info_req = new Ajax.Request(public_web_dir+'get_feature_info.php', {
method:'get',
parameters: get_map_parameters(false,false,true),
onSuccess: function(transport) {
$('featureinfo').update(transport.responseText);
$('glass').hide();
$('glass_text').update('Loading ...');
show_feature_info(x,y);
},
onFailure: handle_error
});
}
function get_map(zoom,initial_map,use_current_map_values,reset_zoom_slider)
{
var regex = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
var errors = "";
var skip_empty_values = false;
var skip_regex = false;
var skip_limits = false;
if($F('class_method') == 'user')
{
for(var i=1;i<=$F('num_of_breaks');i++)
{
if(!skip_empty_values && (!$F('custom_break_'+i+'_min') || !$F('custom_break_'+i+'_max')))
{
errors += "All values must be filled in\n";
skip_empty_values = true;
}
if(!skip_regex && (!$F('custom_break_'+i+'_min').match(regex) || !$F('custom_break_'+i+'_max').match(regex)))
{
errors += "All values must be numeric\n";
skip_regex = true;
}
/*
val = parseFloat($F('custom_break_'+i+'_min'));
if(!skip_limits && ( val < $F('class_min') || val > $F('class_max')))
{
errors += "All values must be between "+$F('class_min')+" and "+$F('class_max')+"\n";
skip_limits = true;
}
val = parseFloat($F('custom_break_'+i+'_max'));
if(!skip_limits && ( val < $F('class_min') || val > $F('class_max')))
{
errors += "All values must be between "+$F('class_min')+" and "+$F('class_max')+"\n";
skip_limits = true;
}
*/
}
if(errors) {
alert("The following errors were found with user defined data classes.\n\n"+errors+"\nPlease correct the errors or select a different classing method");
return false;
}
}
$('featureinfo').hide();
$('glass').show();
get_map_req = new Ajax.Request(public_web_dir+'map.php', {
method:'get',
parameters: get_map_parameters(zoom,false,use_current_map_values,reset_zoom_slider),
onSuccess: function(transport) {
apply_map_data(transport.responseText.evalJSON(true) , initial_map , reset_zoom_slider);
var parameters = get_map_parameters(zoom,false,use_current_map_values,reset_zoom_slider);
var parameters_string = '?';
for(var i in parameters)
{
parameters_string = parameters_string + i + '=' + parameters[i] + '&';
}
$('mapimg').update('');
$('map').onload=function() {$('glass').hide();}
$('code').value='';
$('type').value='';
},
onFailure: handle_error
});
}
function apply_map_data(json , initial_map , reset_zoom_slider)
{
$('extent').value = json.extent;
$('scale').value = json.scale;
$('legend').update(json.legend);
if($('legend_border')) $('legend').style.top = window_height - $('legend_border').getHeight();
$('class_max').value = json.class_max;
$('class_min').value = json.class_min;
current_map_values['geom_type'] = json.geom_type;
current_map_values['tag'] = json.tag;
current_map_values['series_type'] = json.series_type;
current_map_values['series_attribute'] = json.series_attribute;
current_map_values['frequency'] = json.frequency;
current_map_values['units'] = json.units;
current_map_values['date'] = json.date
if(!initial_map) document.title = 'Map: ' + json.date + ' ' + json.geom_type_title + ' ' + json.series_type + ' (' + json.units + ') (GeoFRED: Geographic Federal Reserve Economic Data)';
if($('map_title')) {
$('map_title').innerHTML = '
| '; html = html+' |