? corner.patch
Index: corner.admin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/corner/corner.admin.inc,v
retrieving revision 1.5.2.2
diff -u -p -r1.5.2.2 corner.admin.inc
--- corner.admin.inc	25 May 2009 11:20:45 -0000	1.5.2.2
+++ corner.admin.inc	6 Jun 2009 18:55:15 -0000
@@ -53,7 +53,7 @@ function corner_admin_configure($form_st
   }
 
   $images = corner_get_images();
-  $image_options = array('0' => t('--- select ---'));
+  $image_options = array('' => t('--- select ---'));
   foreach ($images as $filename => $data) {
     $image_options[$data->basename] = $data->basename;
   }
@@ -91,6 +91,7 @@ function corner_admin_configure($form_st
     '#title' => t('Corner details'),
     '#collapsible' => TRUE,
   );
+
   $form['details']['image'] = array(
     '#type' => 'select',
     '#title' => t('Corner image'),
@@ -137,7 +138,7 @@ function corner_admin_configure($form_st
   $form['details']['linking']['image_map_shape'] = array(
     '#type' => 'select',
     '#title' => t('Image map shape'),
-    '#options' => array('' => t('--- none ---'), 'circle' => t('Circle'), 'polygon' => t('Polygon'), 'rectangle' => t('Rectangle')),
+    '#options' => array('' => t('--- none ---'), 'circle' => t('Circle'), 'poly' => t('Polygon'), 'rect' => t('Rectangle')),
     '#default_value' => $corner->image_map_shape,
     '#description' => t('Turn the link into an image map by selecting a shape here and provide the appropritate image map coordates below.'),
   );
@@ -158,15 +159,16 @@ function corner_admin_configure($form_st
   $form['details']['positioning']['location'] = array(
     '#type' => 'select',
     '#title' => t('Corner location'),
-    '#options' => array('0' => t('--- select ---')) + corner_get_options('location'),
+    '#options' => array('' => t('--- select ---')) + corner_get_options('location'),
     '#default_value' => $corner->location,
     '#description' => t('The location of the corner on the page (left/right/top/bottom).'),
     '#required' => TRUE,
   );
+
   $form['details']['positioning']['position'] = array(
     '#type' => 'select',
     '#title' => t('Corner position'),
-    '#options' => array('0' => t('--- select ---')) + corner_get_options('position'),
+    '#options' => array('' => t('--- select ---')) + corner_get_options('position'),
     '#default_value' => $corner->position,
     '#description' => t('The position of the corner, relative to browser (fixed) or absolute (absolute). Usually, images located at the top of a page uses \'absolute\' while images at the bottom of the page uses \'fixed\'.'),
     '#required' => TRUE,
@@ -180,6 +182,7 @@ function corner_admin_configure($form_st
       '#collapsible' => TRUE,
     );
     $language_options = locale_language_list('name');
+
     $form['language_vis_settings']['languages'] = array(
       '#type' => 'checkboxes',
       '#title' => t('Show corner for specific languages'),
@@ -256,7 +259,6 @@ function corner_admin_configure($form_st
     $form['cancel'] = array(
       '#type' => 'submit',
       '#value' => t('Cancel'),
-      '#validate' => array('corner_admin_cancel_validate'),
       '#submit' => array('corner_admin_cancel_submit'),
     );
     $form['delete'] = array(
@@ -276,55 +278,72 @@ function corner_admin_configure($form_st
 }
 
 function corner_admin_configure_validate($form, &$form_state) {
-  if (empty($form_state['values']['image'])) {
-    form_set_error('image', t('!field field is required.', array('!field' => $form['details']['image']['#title'])));
-  }
-  if (empty($form_state['values']['position'])) {
-    form_set_error('position', t('!field field is required.', array('!field' => $form['details']['position']['#title'])));
+  $image_map_coords = trim($form_state['values']['image_map_coords']);
+  $image_map_coords_filtered = array();
+  if(!empty($image_map_coords)) {
+    $image_map_coords_filtered = array_filter(explode(',', $image_map_coords), 'is_numeric');
+  }
+
+  $image_map_shape = $form_state['values']['image_map_shape'];
+  $image_map_coords_title = '<em>' . $form['details']['linking']['image_map_coords']['#title'] . '</em>';
+
+  if (empty($image_map_shape) && !empty($image_map_coords)) {
+    return form_set_error('image_map_coords', t('Please empty the field !field if you do not want to use !field2.', array('!field' => $image_map_coords_title, '!field2' => '<em>' . $form['details']['linking']['image_map_shape']['#title'] . '</em>')));
+  }
+  elseif ($image_map_shape == 'circle' && count($image_map_coords_filtered) != 3) {
+    return form_set_error('image_map_coords', t('!field field is invalid.', array('!field' => $image_map_coords_title)));
+  }
+  elseif ($image_map_shape == 'rect' && count($image_map_coords_filtered) != 4) {
+    return form_set_error('image_map_coords', t('!field field is invalid.', array('!field' => $image_map_coords_title)));
+  }// we must here count the $image_map_coords_filtered and non-filtered $image_map_coords (12[1]!= 12,ad,,,[5]) and the total number of $image_map_coords_filtered must be divisible without remainder
+  elseif ($image_map_shape == 'poly' && (explode(',', $image_map_coords) != $image_map_coords_filtered) || (count($image_map_coords_filtered)%2) != 0) {
+    return form_set_error('image_map_coords', t('!field field is invalid.', array('!field' => $image_map_coords_title)));
+  }
+  $target = trim($form_state['values']['image_link_target']);
+  $valid_target = array('_blank', '_parent', '_self', '_top');
+  if (!empty($target) && !in_array($target, $valid_target)) {
+    return form_set_error('image_link_target', t('!field field is invalid.', array('!field' => '<em>' . $form['details']['linking']['image_link_target']['#title'] . '</em>')));
   }
+
 }
 
 function corner_admin_configure_submit($form, &$form_state) {
-
+  $values = $form_state['values'];
   // Save the edited corner
   if (!form_get_errors() && $form_state['clicked_button']['#value'] == t('Save')) {
-    if (module_exists('locale')) {
-      $languages = implode(',', $form_state['values']['languages']);
-    }
-    else {
-      $languages = '';
-    }
-    $roles = implode(',', $form_state['values']['roles']);
     $options = serialize(array(
-      'location' => $form_state['values']['location'],
-      'position' => $form_state['values']['position'],
-      'image_map_shape' => $form_state['values']['image_map_shape'],
-      'image_map_coords' => $form_state['values']['image_map_coords'],
-      'image_link_rel' => $form_state['values']['image_link_rel'],
-      'image_link_target' => $form_state['values']['image_link_target'],
+      'location' => $values['location'],
+      'position' => $values['position'],
+      'image_map_shape' => $values['image_map_shape'],
+      'image_map_coords' => trim($values['image_map_coords']),
+      'image_link_rel' => trim($values['image_link_rel']),
+      'image_link_target' => trim($values['image_link_target']),
     ));
 
-    $sql = "UPDATE {corners} SET";
-    $sql .= " name = '%s', image = '%s', image_title = '%s', image_uri = '%s',status = '%d', languages = '%s', roles = '%s', visibility = '%d', pages = '%s', options = '%s'";
-    $sql .= " WHERE cid = %d";
-    db_query($sql,
-      $form_state['values']['name'],
-      $form_state['values']['image'],
-      $form_state['values']['image_title'],
-      $form_state['values']['image_uri'],
-      $form_state['values']['status'],
-      $languages,
-      $roles,
-      $form_state['values']['visibility'],
-      $form_state['values']['pages'],
-      $options,
-      $form_state['values']['cid']
-    );
-    drupal_set_message(t('The corner %name has been saved.', array('%name' => $form_state['values']['name'])));
+    $record = new stdClass;
+    $record->cid = $values['cid'];
+    $record->name = $values['name'];
+    $record->image = $values['image'];
+    $record->image_title = trim($values['image_title']);
+    $record->image_uri = trim($values['image_uri']);
+    $record->status = $values['status'];
+    // when nothing selected the value is 0,0 ... with array_filter the value is ''. same with roles
+    // and when locale is not enable the index 'languages' is not set
+    $record->languages = isset($values['languages']) ? implode(',', array_filter($values['languages'])) : '';
+    $record->roles = implode(',', array_filter($values['roles']));
+    $record->visibility = $values['visibility'];
+    $record->pages = $values['pages'];
+    $record->options = $options;
+
+    // update the corner
+    drupal_write_record('corners', $record, 'cid');
+    // show the message
+    drupal_set_message(t('The corner %name has been saved.', array('%name' => $values['name'])));
+    // redirect to the corner overview
     $form_state['redirect'] = 'admin/build/corner';
   }
   else if ($form_state['clicked_button']['#value'] == t('Delete')) {
-    $form_state['redirect'] = 'admin/build/corner/'. $form_state['values']['cid'] .'/delete';
+    $form_state['redirect'] = 'admin/build/corner/'. $values['cid'] .'/delete';
   }
 
   return;
@@ -334,39 +353,35 @@ function corner_admin_configure_submit($
  * Save the new corner.
  */
 function corner_admin_add_submit($form, &$form_state) {
-
-  if (module_exists('locale')) {
-    $languages = implode(',', $form_state['values']['languages']);
-  }
-  else {
-    $languages = '';
-  }
-  $roles = implode(',', $form_state['values']['roles']);
+  $values = $form_state['values'];
+  unset($form_state['values']);
   $options = serialize(array(
-    'location' => $form_state['values']['location'],
-    'position' => $form_state['values']['position'],
-    'image_map_shape' => $form_state['values']['image_map_shape'],
-    'image_map_coords' => $form_state['values']['image_map_coords'],
-    'image_link_rel' => $form_state['values']['image_link_rel'],
-    'image_link_target' => $form_state['values']['image_link_target'],
+    'location' => $values['location'],
+    'position' => $values['position'],
+    'image_map_shape' => $values['image_map_shape'],
+    'image_map_coords' => trim($values['image_map_coords']),
+    'image_link_rel' => trim($values['image_link_rel']),
+    'image_link_target' => trim($values['image_link_target']),
   ));
 
-  $sql = "INSERT INTO {corners} (name, image, image_title, image_uri, status, languages, roles, visibility, pages, options)";
-  $sql .= " VALUES ('%s', '%s', '%s', '%s', %d, '%s', '%s', %d, '%s', '%s')";
-
-  db_query($sql,
-    $form_state['values']['name'],
-    $form_state['values']['image'],
-    $form_state['values']['image_title'],
-    $form_state['values']['image_uri'],
-    $form_state['values']['status'],
-    $languages,
-    $roles,
-    $form_state['values']['visibility'],
-    $form_state['values']['pages'],
-    $options
-  );
-  drupal_set_message(t('The corner %name has been created.', array('%name' => $form_state['values']['name'])));
+  $record = new stdClass;
+  $record->name = $values['name'];
+  $record->image = $values['image'];
+  $record->image_title = trim($values['image_title']);
+  $record->image_uri = trim($values['image_uri']);
+  $record->status = $values['status'];
+  // when nothing is selected the value is 0,0 ... with array_filter the value is ''. same with roles
+  // and when locale is not enable the index 'languages' is not set
+  $record->languages = isset($values['languages']) ? implode(',', array_filter($values['languages'])) : '';
+  $record->roles = implode(',', array_filter($values['roles']));
+  $record->visibility = $values['visibility'];
+  $record->pages = $values['pages'];
+  $record->options = $options;
+  // save the new corner
+  drupal_write_record('corners', $record);
+  // show the message
+  drupal_set_message(t('The corner %name has been created.', array('%name' => $values['name'])));
+  // redirect to the corner overview
   $form_state['redirect'] = 'admin/build/corner';
   return;
 }
@@ -387,9 +402,6 @@ function corner_admin_enable($corner) {
   drupal_goto('admin/build/corner');
 }
 
-function corner_admin_cancel_validate($form, &$form_state) {
-}
-
 function corner_admin_cancel_submit($form, &$form_state) {
   $form_state['redirect'] = 'admin/build/corner';
   return;
@@ -399,9 +411,9 @@ function corner_admin_cancel_submit($for
  * Menu callback; confirm deletion of a corner.
  */
 function corner_admin_delete($form_state, $corner) {
-  $form['corner'] = array('#type' => 'hidden', '#value' => serialize($corner));
+  $form['corner'] = array('#type' => 'value', '#value' => serialize($corner));
   $params = array('%name' => $corner->name);
-  return confirm_form($form, t('Are you sure you want to delete the corner %name?', $params), 'admin/build/corner', '', t('Delete'), t('Cancel'));
+  return confirm_form($form, t('Are you sure you want to delete the corner %name?', $params), 'admin/build/corner');
 }
 
 function corner_admin_delete_submit($form, &$form_state) {
Index: corner.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/corner/corner.install,v
retrieving revision 1.4.2.1
diff -u -p -r1.4.2.1 corner.install
--- corner.install	6 May 2009 12:21:29 -0000	1.4.2.1
+++ corner.install	6 Jun 2009 18:55:15 -0000
@@ -15,10 +15,16 @@ function corner_install() {
   // TODO: is this the correct way to check if install is successful?
   if ($result[0]['success']) {
     // Insert an example corner
-    $sql = "INSERT INTO {corners} (name, image, image_title, image_uri, status, roles, visibility, pages, options)";
-    $sql .= " VALUES ('%s', '%s', '%s', '%s', %d, '%s', %d, '%s', '%s')";
-    db_query($sql, 'Drupal love', 'drupal-love-right.png', 'I love Drupal!', 'http://drupal.org', 0, '', 0, '', 'a:4:{s:8:"location";s:9:"top-right";s:8:"position";s:5:"fixed";s:15:"image_map_shape";s:7:"polygon";s:16:"image_map_coords";s:23:"0,0,150,150,150,95,55,0";}');
-  }
+    $example = new stdClass;
+    $example->name = 'Drupal love';
+    $example->image = 'drupal-love-right.png';
+    $example->image_title = 'I love Drupal!';
+    $example->image_uri = 'http://drupal.org';
+    $example->options =  serialize(array('location' => 'top-right', 'position' => 'fixed', 'image_map_shape' => 'poly', 'image_map_coords' => '0,0,150,150,150,95,55,0', 'image_link_rel' => '', 'image_link_target' => ''));
+    $sql = "INSERT INTO {corners} (name, image, image_title, image_uri, options)";
+    $sql .= " VALUES ('%s', '%s', '%s', '%s', '%s')";
+    db_query($sql, $example->name, $example->image, $example->image_title, $example->image_uri, $example->options);
+   }
 }
 
 /**
Index: corner.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/corner/corner.module,v
retrieving revision 1.5.2.1
diff -u -p -r1.5.2.1 corner.module
--- corner.module	12 May 2009 09:39:14 -0000	1.5.2.1
+++ corner.module	6 Jun 2009 18:55:16 -0000
@@ -153,7 +153,6 @@ function corner_footer($main = 0) {
   global $language ;
   $rids = array_keys($user->roles);
   $lang_name = $language->language;
-
   $output = '';
 
   // Output all the corners for the current path/role
@@ -231,13 +230,14 @@ function corner_prepare($corner) {
   // Better to do check_plain here before sending to theme functions
   $corner->image = check_plain($corner->image);
   $corner->image_title = check_plain($corner->image_title);
-  $corner->image_uri = check_url($corner->image_uri);
-  $corner->image_map_shape = check_plain($corner->image_map_shape);
-  $corner->image_map_coords = check_plain($corner->image_map_coords);
+  $corner->image_uri = isset($corner->image_uri) ? check_url($corner->image_uri) : '';
 
   // Load options
   $corner = corner_load_options($corner);
-
+  $corner->image_map_shape = isset($corner->image_map_shape) ? check_plain($corner->image_map_shape) : '';
+  $corner->image_map_coords = isset($corner->image_map_coords) ? check_plain($corner->image_map_coords) : '';
+  $corner->image_link_rel = isset($corner->image_link_rel) ? check_plain($corner->image_link_rel) : '';
+  $corner->image_link_target = isset($corner->image_link_target) ? check_plain($corner->image_link_target) : '';
   // Construct the image path
   $corner->image_path = drupal_get_path('module', 'corner') .'/'. CORNER_PATH_IMAGES .'/'. $corner->image;
 
@@ -268,7 +268,7 @@ function theme_corner_image($corner) {
     $attributes = '';
     if (!empty($corner->image_title)) $attributes .= 'title="'. $corner->image_title .'" ';
     // IE7 will show 'alt' as the title on mouse hover, we'll therefore use the title for 'alt'
-    //if (!empty($corner->image)) $attributes .= 'alt="'. $corner->image .'" ';
+
     if (!empty($corner->image_title)) $attributes .= 'alt="'. $corner->image_title .'" ';
     if (!empty($corner->image_link_rel)) $attributes .= 'rel="'. $corner->image_link_rel .'" ';
     if (!empty($corner->image_link_target)) $attributes .= 'target="'. $corner->image_link_target .'"';
@@ -280,7 +280,7 @@ function theme_corner_image($corner) {
   }
 
   // Theme the image
-  $image = theme('image', $corner->image_path, $corner->image, $image_title, $image_args, TRUE);
+  $image = theme('image', $corner->image_path, $corner->image, $image_title, $image_args);
 
   // If a URI is specified, make the corner into a link, else keep as is (unless a URI and image map is specified, in which case map code has already been added)
   if (empty($corner->image_uri) || (!empty($corner->image_uri) && !empty($corner->image_map_shape) && !empty($corner->image_map_coords))) {
@@ -298,20 +298,6 @@ function theme_corner_image($corner) {
 }
 
 /**
- * Theme the image map output.
-
- * @param $corner A corner array
- * @return A themed corner image
- */
-function theme_corner_image_map($corner) {
-  $html = '';
-  $html .= '<map id="cornermap'. $corner->cid .'" name="cornermap'. $corner->cid .'">'."\n";
-  $html .= '<area shape="'. $corner->image_map_shape .'" coords="'. $corner->image_map_coords .'" alt="'. $corner->image_title .'" href="'. $corner->image_uri .'" />'."\n";
-  $html .= '</map>'."\n";
-  return $html;
-}
-
-/**
  * Get an corner by its id or a combination of other fields.
  *
  * @param $array An associative array of attributes to search for in selecting the corner,
@@ -364,22 +350,24 @@ function corner_load_options($corner) {
  * Get the default values of a new corner
  */
 function corner_get_default() {
-  $default = new stdClass();
+  $default = new stdClass;
   $default->cid = 0;
+  $default->status = 1;
   $default->name = '';
   $default->image = '';
   $default->image_title = '';
   $default->image_uri = '';
   $default->image_link_rel = '';
   $default->image_link_target = '';
-  $default->status = 1;
+  $default->image_map_shape = '';
+  $default->image_map_coords = '';
   $default->languages = '';
   $default->roles = '';
   $default->visibility = 0;
   $default->pages = '';
-  $default->location = 0;
-  $default->position = 0;
-  return (object) $default;
+  $default->location = '';
+  $default->position = '';
+  return $default;
 }
 
 /**
Index: tests/corner.test
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/corner/tests/corner.test,v
retrieving revision 1.2
diff -u -p -r1.2 corner.test
--- tests/corner.test	7 Jan 2009 22:26:48 -0000	1.2
+++ tests/corner.test	6 Jun 2009 18:55:16 -0000
@@ -7,7 +7,7 @@
  */
 class CorneraAccessTestCase extends DrupalWebTestCase {
 
-  function getInfo() {
+  public static function getInfo() {
     return array(
       'name' => t('Corner access rules'),
       'desc' => t('Test that all access restrictions are correct.'),
@@ -197,7 +197,7 @@ class CornerFunctionalityTestCase extend
     $this->assertRaw($expectation, t('Verified the title on the delete page'));
 
     // Submit the deletion form
-    $this->drupalPost('admin/build/corner/'. $this->corner->cid .'/delete', array(), t('Delete'));
+    $this->drupalPost('admin/build/corner/'. $this->corner->cid .'/delete', array(), t('Confirm'));
     
     // Verify the delete success message
     $expectation = t('The corner %name has been removed.', array('%name' => $this->corner->name));
