'1')); } return $element; } /** * Implements hook_form_FORM_ID_alter(). * * Adds a new fieldset to the gmap settings form so we can enable and save * custom popup bubble styles. */ function gmap_style_bubbles_form_gmap_admin_settings_alter(&$form, &$form_state, $form_id) { $bubble_styles = variable_get('gmap_bubble_styles', array()); $disable_infobubble = FALSE; $infobubble_library = libraries_detect('infobubble'); $form['gmap_bubble_styles'] = array( '#type' => 'fieldset', '#title' => t('Bubble styles'), '#tree' => TRUE, ); if (!$infobubble_library['installed']) { $form['gmap_bubble_styles']['error'] = array( '#type' => 'markup', '#markup' => '
' . _gmap_style_bubbles_format_error($infobubble_library) . '
', ); $disable_infobubble = TRUE; } $form['gmap_bubble_styles']['enable_bubble_style'] = array( '#type' => 'checkbox', '#title' => t('Use custom bubble?'), '#description' => t('If you don\'t intend to style your popup bubble, leave this unchecked.'), '#default_value' => isset($bubble_styles['enable_bubble_style']) ? $bubble_styles['enable_bubble_style'] : 0, '#disabled' => $disable_infobubble, ); $form['gmap_bubble_styles']['style_bubble_options'] = array( '#type' => 'textarea', '#title' => t('Bubble styles to apply'), '#description' => t('Styles to apply to your popup bubble. One style per line with a colon between the style and value.
Example:
shadowStyle:1
arrowPosition : 25'), '#default_value' => isset($bubble_styles['style_bubble_options']) ? $bubble_styles['style_bubble_options'] : '', '#disabled' => $disable_infobubble, ); $form['gmap_bubble_styles']['help_text'] = array( '#collapsed' => TRUE, '#collapsible' => TRUE, '#type' => 'fieldset', '#title' => t('Bubble styles help'), '#value' => _gmap_style_bubbles_help_text(), ); } /** * Enables hook_gmap(). * * Adds the bubble styles to the drupal map settings json at the top of the * rendered map page. */ function gmap_style_bubbles_gmap($op, &$map) { if ($op == 'pre_theme_map') { $bubble_styles_old = variable_get('gmap_bubble_styles'); $bubble_styles['enableBubbleStyle'] = $bubble_styles_old['enable_bubble_style']; $bubble_styles['styleBubbleOptions'] = _gmap_style_bubbles_validate_for_json($bubble_styles_old['style_bubble_options']); $map['styleBubble'] = $bubble_styles; } } /** * A helper function that breaks a string up into an array based on line breaks. * * Anything before the first colon in each line is considered an array key, and * anything following the first colon is that key's value. * * An example string would be: * Color : #cccccc * minWidth: '250', * * This function would output the following: * array ( "Color" => "#cccccc", "minWidth" => "250" ) * * Trims whitespace, single and double quotes, semicolons and commas. */ function _gmap_style_bubbles_validate_for_json($string) { $string_lines = explode("\n", $string); $clean_lines = array(); foreach ($string_lines as $setting) { $this_line = explode(':', $setting, 2); if (isset($this_line[1])) { $clean_lines[trim($this_line[0])] = trim($this_line[1], "'\",; \r\n\t"); } } return $clean_lines; } /** * Implements hook_libraries_info(). * * Information for the infobubble plugin provided as part of the google maps * contributed utility libraries. */ function gmap_style_bubbles_libraries_info() { $libraries['infobubble'] = array( 'name' => 'Infobubble plugin', 'vendor url' => 'http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobubble/', 'download url' => 'http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobubble/', 'version' => '.8', 'files' => array( 'src' => array( 'infobubble-compiled.js', ), ), 'variants' => array( 'minified' => array( 'files' => array( 'src' => array( 'infobubble-compiled.js', ), ), ), 'source' => array( 'files' => array( 'js' => array( 'infobubble.js', ), ), ), ), ); return $libraries; } /** * Implements hook_element_info_alter(). * * Adds a second pre_render function to add the infobubble javascript to the * page. */ function gmap_style_bubbles_element_info_alter(&$type) { if (isset($type['gmap']) && is_array($type['gmap']['#pre_render'])) { $type['gmap']['#pre_render'][] = '_gmap_style_bubbles_gmap_pre_render_map'; } } /** * A helper function to format the missing library error message. * * This message is called during install and when loading the gmap configurarion * page in the case that the infobubble/src/infobubble-compiled.js file isn't * found. */ function _gmap_style_bubbles_format_error($library) { $t = get_t(); return $t( 'You need to download the !infobubble and extract the entire contents of the archive into the %path directory on your server. Only the src folder is required. Final path should be %path/infobubble/src/infobubble-compiled.js', array( '!infobubble' => l($t('infobubble plugin'), $library['download url']), '%path' => 'sites/all/libraries', ) ); } /** * A helper function to display help text. * * Provides more detailed instructions on the "Bubble styles to apply" textarea. */ function _gmap_style_bubbles_help_text() { $text = t( 'See !link for examples.', array('!link' => l(t('the infobubble documentation'), 'http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobubble/')) ); $options = array( "shadowStyle" => t('Options: 0 (no shadow), 1 (default shadow), 2 (sharp shadow)'), "padding" => t('Like the css property, the padding of the bubble.'), "borderRadius" => t('Like the css property, the radius of the bubble\'s corners.'), "borderWidth" => t('Like the css property, the width in pixels of the border.'), "borderColor" => t('Like the css property, the hex or rgb color of the border.'), "backgroundColor" => t('This is the background of the content of the bubble, but NOT the entire bubble itself.'), "bubbleBackgroundClassName" => t('A css class for the entire bubble.'), "minWidth" => t('Like the css property, the minimum width of the bubble.'), "maxWidth" => t('Like the css property, the maximum width of the bubble.'), "minHeight" => t('Like the css property, the maximum height of the bubble.'), "arrowSize" => t('The width of the pointer arrow. NOTE: if you choose an arrow style that only uses half of the arrow, this number will be twice as wide as your arrow at its widest point.'), "arrowPosition" => t('The percent from the left of the bubble where the arrow will appear.'), "arrowStyle" => t('Options: 0 (full triangle), 1 (half triangle leaning left), 2 (half triangle leaning right)'), "closeImage" => t('The url of the image to use as the close button for the bubble'), "closeCursor" => t('Like the css property, the style of the cursor as it hovers over your close image. Default is pointer.'), "closeZIndex" => t('Like the css property, the z-index of the close image. Default is 0.'), "closeBorder" => t('Like the css property, the border style of the close image. Default is none.'), "closeHeight" => t('The height of the close image. Default is 12px.'), "closeWidth" => t('The width of the close image. Default is 12px.'), "closePosition" => t("Like the css property, the position the close image. Default is absolute."), ); foreach ($options as $title => $info) { $text .= "
$title - $info"; } return $text; } /** * @} End of "defgroup gmap_style_bubbles". */