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 = '
'+json.date + ' ' + json.series_type + ' by ' + json.geom_type_title + ' (' + json.units + ')
'; } select_layer_checkbox(json.check_layer_box,true); if(initial_map) $('initial_scale').value = json.scale; if(initial_map) drawSlider(json.scale_pos); if(reset_zoom_slider) { drawSlider(json.scale_pos); $('zoom_level').value=json.scale_pos}; toggle_next_prev_links(); build_links(); $('old_geom_type').value = $F('new_geom_type'); $('new_geom_type').value = $F('geom_type'); } function select_layer_checkbox(layer,deselect_old) { if(layer) { $(layer).checked = true; $(layer+'_lbl').checked = true; if(deselect_old && $F('old_geom_type') && $F('old_geom_type') != 'state' && $F('old_geom_type') != layer && $($F('old_geom_type'))) { $($F('old_geom_type')).checked = false; $($F('old_geom_type')+'_lbl').checked = false; } } } function zoom(direction) { if(direction == 'in') { zoom_slider_direction = 'in'; zoom_slider.setValueBy(1); } else { zoom_slider_direction = 'out'; zoom_slider.setValueBy(-1); } } function pan(direction) { if(direction == 'west' || direction == 'north' || direction == 'south' || direction == 'east') { zoom_slider_direction = direction; get_map(false); } } function default_zoom() { $('featureinfo').hide(); get_map(false,false,false,true); } function zoom_to_point() { $('featureinfo').hide(); img_x = tempX - 22; img_y = tempY - $('banner').getHeight() - $('toolbar').getHeight(); switch($F('zoom_dir')) { case 'query': get_feature_info(tempX,tempY); return false; case 'in': zoom_slider.setValueBy(1); break; case 'out': zoom_slider.setValueBy(-1); break; case 'center': get_map(true); break; } img_x = ''; img_y = ''; } function clear_data_selects(parent) { $('data_select_msg').toggle(); if(parent == 'units' || parent == 'series_attribute' || parent == 'frequency' || parent == 'tag' || parent == 'geom_type' || parent == 'series_type') { $('dates').update(); } if(parent == 'frequency' || parent == 'series_attribute' || parent == 'series_type' || parent == 'tag' || parent == 'geom_type') { $('units').update(); } if(parent == 'series_attribute' || parent == 'series_type' || parent == 'tag' || parent == 'geom_type') { $('frequency').update(); } if( parent == 'series_type' || parent == 'tag' || parent == 'geom_type') { $('series_attribute_div').update(); } if(parent == 'tag' || parent == 'geom_type') { $('series_type').update(); } if(parent == 'geom_type') { $('tag').update(); } $('geom_type' , 'tag', 'series_type' , $('mapserv').getInputs('radio','sa') , 'frequency' , 'units', 'dates').flatten().invoke('disable'); } function populate_tags(default_tag) { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['action'] = 'tag'; new Ajax.Request(public_web_dir+'populate_data_selects.php', { method:'get', parameters: parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'tag'); populate_series_types(); }, onFailure: handle_error }); } function populate_series_types(default_series_type) { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['action'] = 'series'; new Ajax.Request(public_web_dir+'populate_data_selects.php', { method:'get', parameters: parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'series_type'); populate_series_attributes(); }, onFailure: handle_error }); } function populate_series_attributes() { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['st'] = $('series_type').value; parameters['action'] = 'series_attributes'; new Ajax.Request(public_web_dir+'populate_data_selects.php' , { method:'get', parameters: parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); var html = ''; for(var i=0 ; i < json.length ; i++) { html = html+''; html = html+''; } html = html+'
' $('series_attribute_div').update(html); populate_frequency(); }, onFailure: handle_error }); } function populate_units() { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['st'] = $('series_type').value; parameters['fq'] = $('frequency').value; parameters['action'] = 'units'; var elems = $('mapserv').getInputs('radio' , 'sa'); for(var i = 0 ; i < elems.length ; i++) { if(elems[i].checked == true) { parameters['sa'] = elems[i].value;} } new Ajax.Request(public_web_dir+'populate_data_selects.php' , { method:'get', parameters:parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'units'); populate_dates(); }, onFailure: handle_error }); } function populate_frequency() { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['st'] = $('series_type').value; var elems = $('mapserv').getInputs('radio' , 'sa'); for(var i = 0 ; i < elems.length ; i++) { if(elems[i].checked == true) { parameters['sa'] = elems[i].value;} } parameters['action'] = 'frequency'; new Ajax.Request(public_web_dir+'populate_data_selects.php' , { method:'get', parameters:parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'frequency'); populate_units(); }, onFailure: handle_error }); } function populate_dates() { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['st'] = $('series_type').value; parameters['dtn'] = $('units').value; parameters['fq'] = $('frequency').value; var elems = $('mapserv').getInputs('radio' , 'sa'); for(var i = 0 ; i < elems.length ; i++) { if(elems[i].checked == true) { parameters['sa'] = elems[i].value;} } parameters['action'] = 'dates'; new Ajax.Request(public_web_dir+'populate_data_selects.php' , { method:'get', parameters: parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'dates'); $('data_select_msg').toggle(); $('geom_type' , 'tag', 'series_type' , $('mapserv').getInputs('radio','sa') , 'units', 'frequency' , 'dates').flatten().invoke('enable'); }, onFailure: handle_error }); } function populate_pdf_dates() { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['st'] = $('series_type').value; parameters['dtn'] = $('units').value; parameters['fq'] = $('frequency').value; var elems = $('mapserv').getInputs('radio' , 'sa'); for(var i = 0 ; i < elems.length ; i++) { if(elems[i].checked == true) { parameters['sa'] = elems[i].value;} } parameters['action'] = 'dates'; new Ajax.Request(public_web_dir+'populate_data_selects.php' , { method:'get', parameters: parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'pdf_start_date'); populate_select_menu(json , 'pdf_end_date'); }, onFailure: handle_error }); } function populate_data_dates() { parameters = new Object; parameters['geom'] = $('geom_type').value; parameters['tag'] = $('tag').value; parameters['st'] = $('series_type').value; parameters['dtn'] = $('units').value; parameters['fq'] = $('frequency').value; var elems = $('mapserv').getInputs('radio' , 'sa'); for(var i = 0 ; i < elems.length ; i++) { if(elems[i].checked == true) { parameters['sa'] = elems[i].value;} } parameters['action'] = 'dates'; new Ajax.Request(public_web_dir+'populate_data_selects.php' , { method:'get', parameters: parameters, onSuccess: function(transport) { var json = transport.responseText.evalJSON(true); populate_select_menu(json , 'data_start_date'); populate_select_menu(json , 'data_end_date'); }, onFailure: handle_error }); } function search_locations() { new Ajax.Request(public_web_dir+'search_locations.php' , { method:'get', parameters: { location:$('location').value }, onSuccess:function(transport) { $('location_list').update(transport.responseText); }, onFailure: handle_error }); } function populate_select_menu(data,selectId) { var idx; var selectMnu = $(selectId); var setSelected; selectMnu.options.length = 0; for (var i = 0 ; i < data.length ; i++) { idx = i+1; selectMnu.options[i] = new Option(data[i],data[i]); if(selectId == 'pdf_start_date' || selectId == 'pdf_end_date' || selectId == 'data_start_date' || selectId == 'data_end_date') { if($('dates').value == data[i]) { setSelected = i; } } } if(setSelected >= 0) { $(selectId).selectedIndex = setSelected; } } function get_map_next_date() { var dates = $('dates'); if(dates.selectedIndex - 1 >= 0) { dates.selectedIndex = dates.selectedIndex - 1; get_map(false,false,false); } } function get_map_prev_date() { var dates = $('dates'); if(dates.selectedIndex + 1 <= dates.length - 1) { dates.selectedIndex = dates.selectedIndex + 1; get_map(false,false,false); } } function get_map_last_date() { var dates = $('dates'); if(dates.selectedIndex - 1 >= 0) { dates.selectedIndex = dates[0]; get_map(false,false,false); } } function get_map_first_date() { var dates = $('dates'); if(dates.selectedIndex + 1 <= dates.length - 1) { dates.selectedIndex = dates.length -1; get_map(false,false,false); } } function toggle_next_prev_links() { var dates = $('dates'); if(dates.length > 1) { $('next_link').className = (dates.selectedIndex == 0) ? 'disabled_link' : 'link'; $('last_link').className = (dates.selectedIndex == 0) ? 'disabled_link' : 'link'; $('prev_link').className = (dates.selectedIndex == dates.length-1) ? 'disabled_link' : 'link'; $('first_link').className = (dates.selectedIndex == dates.length-1) ? 'disabled_link' : 'link'; } } function set_chart_range(range,chartkey) { var src = $('chart'+chartkey).src; src = src.replace(/\[range\]=Max/i,'[range]='+range); src = src.replace(/\[range\]=5yrs/i,'[range]='+range); src = src.replace(/\[range\]=10yrs/i,'[range]='+range); $('chart'+chartkey).src=src; $('chart5yrslink'+chartkey).className='link'; $('chart10yrslink'+chartkey).className='link'; $('chartMaxlink'+chartkey).className='link'; $('chart'+range+'link'+chartkey).className='selected'; } function set_location(code,type) { $('search_location').hide(); select_layer_checkbox(type,false); $('code').value=code; $('type').value=type; get_map(false,false,false,true); //$('code').value=''; //$('type').value=''; } function stop_loading() { $('glass').hide(); if(get_map_req) get_map_req.transport.abort(); if(feature_info_req) feature_info_req.transport.abort(); } function zoom_to_state() { $('code').value=$F('zoom_to_state_list'); $('type').value='state'; get_map(false,false,false,true); //$('code').value=''; //$('type').value=''; } function write_custom_classes() { if($F('class_method') == 'user') { $('hide_for_custom').hide(); var html = 'Define classes. Values range from '+$F('class_min')+' to '+$F('class_max')+'
'; for(var i = 1 ; i <= $F('num_of_breaks') ; i++) { html += '
'+i+' '; if(i == 1) { //html += ''; html += ''; } else { html += ''; } if(i == $F('num_of_breaks')) { //html += ''; html += ''; } else { html += ''; } } $('custom_classes').innerHTML = html; $('custom_classes').show(); } else { $('custom_classes').hide(); $('hide_for_custom').show(); } } function check_custom_class(classObj) { if(isNaN(parseFloat(classObj.value)) || !isNumeric(classObj.value)) { classObj.value = ''; alert('Class values must be numeric'); return false; } var val = parseFloat(classObj.value); if(val < $F('class_min') || val > $F('class_max')) { classObj.value = ''; alert('Class values must be between '+$F('class_min')+' and '+$F('class_max')); return false; } return true; } function update_next_class(classObj , nextClassObj) { if(isNaN(parseFloat(classObj.value))) return false; val = classObj.value; if(val.indexOf('.') == -1) { nextClassObj.value = parseFloat(val) + 1; } else { var add = '0.'; var index = val.indexOf('.'); var zeros = val.substring(index+1); for(var i = 1;i