From 330a73d962ad11ef6c09b50611f5d757b382822f Mon, 12 Sep 2011 11:28:56 +0200
From: Bram Goffings <bramgoffings@gmail.com>
Date: Mon, 12 Sep 2011 11:28:33 +0200
Subject: [PATCH] rewrite fullcalendar colors api

diff --git a/fullcalendar_colors/fullcalendar_colors.api.php b/fullcalendar_colors/fullcalendar_colors.api.php
index 7f12362..3968e27 100644
--- a/fullcalendar_colors/fullcalendar_colors.api.php
+++ b/fullcalendar_colors/fullcalendar_colors.api.php
@@ -13,13 +13,20 @@
 /**
  * Fetches the needed CSS classes for coloring the FullCalendar.
  *
+ * These classes will NOT be added to the fullcalendar and are ONLY usefull if
+ * there is an existing class you want to color (can be usefull for coloring
+ * gcal calendars). 
+ *
+ * If you want to add classes AND color at the same time you should use
+ * hook_fullcalendar_classes.
+ *
  * @param $entity
  *   Object representing the entity.
  *
  * @return
  *   Array of classes that will be processed by FullCalendar for each entity.
  */
-function hook_fullcalendar_colors_class_names($entity) {
+function hook_fullcalendar_colors_css_classes($entity) {
   $class_names = array();
   $class_names[] = 'my_awesome_class_name';
   $class_names[] = 'another_awesome_class_name';
diff --git a/fullcalendar_colors/fullcalendar_colors.module b/fullcalendar_colors/fullcalendar_colors.module
index f07687d..45f70ce 100644
--- a/fullcalendar_colors/fullcalendar_colors.module
+++ b/fullcalendar_colors/fullcalendar_colors.module
@@ -99,33 +99,34 @@
 }
 
 /**
- * Implements hook_fullcalendar_classes().
+ * Generates css classes for coloring.
+ *
+ * 
  */
-function fullcalendar_colors_fullcalendar_classes($entity) {
-  fullcalendar_colors_include_api();
-  $classes = array();
+function fullcalendar_colors_generate_css($entity, $classes) {
 
-  $hook = 'fullcalendar_colors_class_names';
-  $selectors = array();
+  // Give the colors module the oportunity to add even more classes, these classes will only be used to genereate css
+  $hook = 'fullcalendar_colors_css_classes';
   foreach (module_implements($hook) as $module) {
-    // Initialize selector array.
-    $hook_selectors = array();
-
     // Fetch all the class names.
     $function = $module . '_' . $hook;
     $class_names = $function($entity);
     foreach ($class_names as $class_name) {
-      // Build the classes array.
-      $classes[] = $class_name;
-      // Create a valid FullCalendar selector based on the classname.
-      $hook_selectors[$class_name] =  $class_name;
+      $classes[$module][$class_name] =  $class_name;
     }
-    $selectors[$module] = $hook_selectors;
   }
 
-  fullcalendar_colors_process_selectors($selectors);
+  // Filter out the $classes passed by fullcalendar that don't have color configuration in the database
+  foreach($classes as $module => $classArray) {
+    foreach($classArray as $class) {
+      if(!colors_colors_exist($class)) {
+        unset($classes[$module][$class]);
+      }
+    }
+  }
 
-  return $classes;
+  // All the classes that are left are considered to be valid color selectors
+  fullcalendar_colors_process_selectors($classes);
 }
 
 /**
@@ -166,6 +167,7 @@
         $unique_selectors[] = $selector;
       }
     }
+
     // Tell the colors module which selectors to color.
     colors_insert_css_from_selectors($unique_selectors, 'fullcalendar_colors');
     drupal_static_reset(__FUNCTION__);
diff --git a/fullcalendar_colors/modules/node.fullcalendar_colors.inc b/fullcalendar_colors/modules/node.fullcalendar_colors.inc
index 529a19f..8687991 100644
--- a/fullcalendar_colors/modules/node.fullcalendar_colors.inc
+++ b/fullcalendar_colors/modules/node.fullcalendar_colors.inc
@@ -6,11 +6,11 @@
  */
 
 /**
- * Implements hook_fullcalendar_colors_class_names().
+ * Implements hook_fullcalendar_classes().
  *
  * Provide colors per node type.
  */
-function node_fullcalendar_colors_class_names($entity) {
+function node_fullcalendar_classes($entity) {
   $class_names = array();
   if (variable_get('fullcalendar_colors_node_types_enabled', FALSE)) {
     if ($entity->entity_type == 'node') {
diff --git a/fullcalendar_colors/modules/og.fullcalendar_colors.inc b/fullcalendar_colors/modules/og.fullcalendar_colors.inc
index 626b8c6..dae5e7e 100644
--- a/fullcalendar_colors/modules/og.fullcalendar_colors.inc
+++ b/fullcalendar_colors/modules/og.fullcalendar_colors.inc
@@ -10,7 +10,7 @@
  *
  * Provide colors per og type.
  */
-function og_fullcalendar_colors_class_names($entity) {
+function og_fullcalendar_classes($entity) {
   $class_names = array();
   $gids = og_get_entity_groups($entity->entity_type, $entity);
   foreach($gids as $gid) {
diff --git a/fullcalendar_colors/modules/taxonomy.fullcalendar_colors.inc b/fullcalendar_colors/modules/taxonomy.fullcalendar_colors.inc
index a05f40f..7425bc2 100644
--- a/fullcalendar_colors/modules/taxonomy.fullcalendar_colors.inc
+++ b/fullcalendar_colors/modules/taxonomy.fullcalendar_colors.inc
@@ -6,11 +6,9 @@
  */
 
 /**
- * Implements hook_fullcalendar_colors_class_names().
- *
- * Provide colors per taxonomy term.
+ * Implements hook_fullcalendar_classes()..
  */
-function taxonomy_fullcalendar_colors_class_names($entity) {
+function taxonomy_fullcalendar_classes($entity) {
   $filtered_entity = array_intersect_key((array) $entity, field_info_instances($entity->entity_type, $entity->bundle));
   $tids = _fullcalendar_colors_filter_term_ids($filtered_entity);
   $class_names = array();
diff --git a/fullcalendar_colors/modules/user.fullcalendar_colors.inc b/fullcalendar_colors/modules/user.fullcalendar_colors.inc
index 733b85f..c8765f6 100644
--- a/fullcalendar_colors/modules/user.fullcalendar_colors.inc
+++ b/fullcalendar_colors/modules/user.fullcalendar_colors.inc
@@ -10,7 +10,7 @@
  *
  * Provide colors per user role.
  */
-function user_fullcalendar_colors_class_names($entity) {
+function user_fullcalendar_colors_classes($entity) {
   $class_names = array();
   if (variable_get('fullcalendar_colors_user_roles_enabled', FALSE)) {
     if ($entity->entity_type == 'user') {
diff --git a/theme/theme.inc b/theme/theme.inc
index c3e80bd..642c463 100644
--- a/theme/theme.inc
+++ b/theme/theme.inc
@@ -53,11 +53,41 @@
   // Allow resize/drag/drop of an event if user has proper permissions.
   $entity->editable = _fullcalendar_update_access($entity);
 
+  // Enable fullcalendar colors api if needed
+  if (module_exists('fullcalendar_colors')) {
+    fullcalendar_colors_include_api();
+  }
+
   // Create a string of class names.
-  $classes = module_invoke_all('fullcalendar_classes', $entity);
+  $classes = array();
+  $colorClasses = array();
+  foreach (module_implements('fullcalendar_classes') as $module) {
+    // Fetch all the class names.
+    $function = $module . '_fullcalendar_classes';
+    $class_names = $function($entity);
+
+    // Merge for normal classes 
+    $classes = array_merge($classes, $class_names);
+
+    // Prepare an array for the fullcalendar colors module
+    if (module_exists('fullcalendar_colors')) {
+      foreach ($class_names as $class_name) {
+        $colorClasses[$module][$class_name] = $class_name;
+      }
+    }
+  }
+
+  // Alter the classes array if needed
   drupal_alter('fullcalendar_classes', $classes, $entity);
+
+  // Add classes to the fullcalendar event
   $entity->class = implode(' ', array_unique($classes));
 
+  // Call fullcalendar colors when needed
+  if (module_exists('fullcalendar_colors')) {
+    fullcalendar_colors_generate_css($entity, $colorClasses);
+  }
+
   // Default URL.
   $uri = entity_uri($entity_type, $entity);
   $entity->url = $uri['path'];
