diff -ru archive/fckeditor/fckeditor.install sites/all/modules/fckeditor/fckeditor.install
--- archive/fckeditor/fckeditor.install	Wed Mar 19 14:42:01 2008
+++ sites/all/modules/fckeditor/fckeditor.install	Wed Jun 25 11:11:49 2008
@@ -41,6 +41,12 @@
                 PRIMARY KEY (name)
                ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
 
+      db_query("CREATE TABLE {fckeditor_node_type} (
+                name varchar(128) NOT NULL default '',
+                type varchar(32) NOT NULL default '',
+                PRIMARY KEY (name,type)
+               ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+
       db_query("CREATE TABLE {fckeditor_role} (
                 name varchar(128) NOT NULL default '',
                 rid tinyint(3) unsigned NOT NULL default '0',
@@ -55,6 +61,12 @@
                 PRIMARY KEY (name)
                );");
 
+      db_query("CREATE TABLE {fckeditor_node_type} (
+                name varchar(128) NOT NULL default '',
+                type varchar(32) NOT NULL default '',
+                PRIMARY KEY (name,type)
+               );");
+
       db_query("CREATE TABLE {fckeditor_role} (
                 name varchar(128) NOT NULL default '',
                 rid smallint NOT NULL default '0',
@@ -345,9 +357,40 @@
 }
 
 /**
+ * Update from 5.x-2.1 to 5.x-2.x
+ *
+ */
+function fckeditor_update_4() {
+  $ret = array();
+
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("CREATE TABLE {fckeditor_node_type} (
+                name varchar(128) NOT NULL default '',
+                type varchar(32) NOT NULL default '',
+                PRIMARY KEY (name,type)
+               ) /*!40100 DEFAULT CHARACTER SET utf8 */;");
+      break;
+
+    case 'pgsql':
+      $ret[] = update_sql("CREATE TABLE {fckeditor_node_type} (
+                name varchar(128) NOT NULL default '',
+                type varchar(32) NOT NULL default '',
+                PRIMARY KEY (name,type)
+               );");
+      break;
+  }
+
+  return $ret;
+}
+
+/**
  * Implementation of hook_uninstall()
  */
 function fckeditor_uninstall() {
   db_query('DROP TABLE {fckeditor_settings}');
   db_query('DROP TABLE {fckeditor_role}');
+  db_query('DROP TABLE {fckeditor_node_type}');
 }
+
diff -ru archive/fckeditor/fckeditor.module sites/all/modules/fckeditor/fckeditor.module
--- archive/fckeditor/fckeditor.module	Wed Mar 19 15:25:13 2008
+++ sites/all/modules/fckeditor/fckeditor.module	Fri Jun 27 15:27:19 2008
@@ -453,13 +453,22 @@
  */
 function fckeditor_profile_save($edit) {
   db_query("DELETE FROM {fckeditor_settings} WHERE name = '%s' or name = '%s'", $edit['name'], $edit['old_name']);
-  db_query("DELETE FROM {fckeditor_role} WHERE name = '%s' or name = '%s'", $edit['name'], $edit['old_name']);
   db_query("INSERT INTO {fckeditor_settings} (name, settings) VALUES ('%s', '%s')", $edit['name'], serialize($edit));
+
+  db_query("DELETE FROM {fckeditor_role} WHERE name = '%s' or name = '%s'", $edit['name'], $edit['old_name']);
   if ($edit['rids']) {
     foreach ($edit['rids'] as $rid => $value) {
       db_query("INSERT INTO {fckeditor_role} (name, rid) VALUES ('%s', %d)", $edit['name'], $rid);
     }
   }
+
+  db_query("DELETE FROM {fckeditor_node_type} WHERE name = '%s' or name = '%s'", $edit['name'], $edit['old_name']);
+  if ($edit['types']) {
+    foreach ($edit['types'] as $type => $value) {
+      db_query("INSERT INTO {fckeditor_node_type} (name, type) VALUES ('%s', '%s')", $edit['name'], $type);
+    }
+  }
+
   // if users can't set their own defaults, make sure to remove $user->fckeditor_status so their default doesn't override the main default
   if ($edit['user_choose'] == 'false') {
     global $user;
@@ -520,9 +529,12 @@
 
   if (!$profiles) {
     $roles = user_roles();
+    $types = node_get_types('names');
     $result = db_query('SELECT * FROM {fckeditor_settings}');
     while ($data = db_fetch_object($result)) {
       $data->settings = unserialize($data->settings);
+
+      // get fskeditor roles
       $result2 = db_query("SELECT rid FROM {fckeditor_role} WHERE name = '%s'", $data->name);
       $role = array();
       while ($r = db_fetch_object($result2)) {
@@ -530,6 +542,14 @@
       }
       $data->rids = $role;
 
+      // get fskeditor node types
+      $result3 = db_query("SELECT type FROM {fckeditor_node_type} WHERE name = '%s'", $data->name);
+      $type = array();
+      while ($r = db_fetch_object($result3)) {
+        $type[$r->type] = $types[$r->type];
+      }
+      $data->types = $type;
+
       $profiles[$data->name] = $data;
     }
   }
@@ -596,6 +616,7 @@
 
   $conf = array();
   $conf = $profile->settings;
+  drupal_set_message('FCKProfile Conf: <pre>'.print_r($conf, true).'</pre>');
 
   if ($conf['allow_user_conf']=='t') {
     foreach (array('default', 'show_toggle', 'popup', 'skin', 'toolbar', 'expand', 'width', 'lang', 'auto_lang') as $setting) {
@@ -1266,6 +1287,8 @@
   // profile per role.
   $orig_roles = user_roles(FALSE, 'access fckeditor');
   $roles = $orig_roles;
+
+  $types = node_get_types('names');
   
   if ($edit->rids && !user_roles(false, 'access fckeditor')) {
     drupal_set_message(t('You haven\'t assigned <code>!access1</code> !permissions yet.<br/>It is recommended to assign the <code>!access1</code> !permissions before updating FCKeditor profiles.', 
@@ -1322,6 +1345,15 @@
   '#required' => TRUE
   );
 
+  $form['basic']['types'] = array(
+  '#type' => 'checkboxes',
+  '#title' => t('Content types that can use this profile'),
+  '#default_value' => array_keys((array) $edit->types),
+  '#options' => $types,
+#  '#description' =>  t(''),
+  '#required' => TRUE
+  );
+
   $form['basic']['allow_user_conf'] = array(
   '#type' => 'select',
   '#title' => t('Allow users to customize FCKeditor appearance'),
@@ -1756,28 +1788,68 @@
 function fckeditor_user_get_profile($user) {
   static $profile_name;
 
+  $page_node_type = null;
+  if ('node' == arg(0)) {
+    if ('add' == arg(1)) {
+      $page_node_type = arg(2);
+    } // end if add
+    else if ('edit' == arg(2)) {
+      $nid = arg(1);
+      $node = node_load($nid);
+      $page_node_type = $node->type;
+    } // end if edit
+  } // end if node
+
   // Since fckeditor_profile_load() makes a db hit, only call it when we're pretty sure
   // we're gonna render fckeditor.
-  if (!isset($profile_name[$user->uid])) {
+  if (!isset($profile_name[$page_node_type][$user->uid])) {
     $sorted_roles = fckeditor_sorted_roles();
-    foreach ($sorted_roles as $rid => $name) {
-      if (isset($user->roles[$rid])) {
-        break;
-      }
-    }
 
-    if (isset($user->roles[$rid])) {
-      $profile_name[$user->uid] = db_result(db_query("SELECT s.name FROM {fckeditor_settings} s INNER JOIN {fckeditor_role} r ON r.name = s.name WHERE r.rid='%s'", $rid));
-    }
-    else if ($user->uid == "1") {
-      $profile_name[$user->uid] = db_result(db_query_range("SELECT s.name FROM {fckeditor_settings} s INNER JOIN {fckeditor_role} r ON r.name = s.name ORDER BY r.rid DESC", 1));
-    }
-  }
+    if (!empty($sorted_roles)) {
+      $sql = "SELECT r.rid, " .
+        (isset($page_node_type) ? "nt.type, " : '') .
+        "s.name FROM {fckeditor_settings} s " .
+        "INNER JOIN {fckeditor_role} r ON r.name = s.name " .
+        (isset($page_node_type)
+          ? "INNER JOIN {fckeditor_node_type} nt ON nt.name = s.name " : '') .
+        "WHERE r.rid IN (%s) " .
+        (isset($page_node_type) ? "AND nt.type = '%s' " : '' );
+      $res = db_query($sql, implode(",", array_keys($sorted_roles)),
+        $page_node_type);
+
+      $profiles = array();
+      while ($row = db_fetch_array($res)) {
+        $profiles[] = $row;
+      } // end while rows
+
+      $sorted_profiles = array();
+      foreach ($sorted_roles as $rid => $name) {
+        foreach ($profiles as $key => $row) {
+          if ($rid == $row['rid']) {
+            $sorted_profiles[] = $row;
+            unset($profiles[$key]);
+            break;
+          } // end if found rid
+        } // end foreach $row
+      } // end foreach $rid
+
+      $preferred_profile = current($sorted_profiles);
+      $profile_name[$page_node_type][$user->uid] = $preferred_profile['name'];
+    } // end if $sorted_roles
+  } // end if no profile
   
-  if (isset($profile_name[$user->uid]) && $profile_name[$user->uid]) {
-    $profile = fckeditor_profile_load($profile_name[$user->uid]);
-    return $profile;
-  }
+  if (isset($profile_name[$page_node_type][$user->uid])
+    && $profile_name[$page_node_type][$user->uid]) {
+    $profile = fckeditor_profile_load($profile_name[$page_node_type][$user->uid]);
+    if (!isset($page_node_type)
+      || in_array($page_node_type, array_keys($profile->types)))
+    {
+      return $profile;
+    } // end if no page node type or valid node type
+  } // end if valid profile name for user
   
   return false;
-}
\ No newline at end of file
+}
+
+// vim:fenc=utf-8:ft=php:ai:si:ts=2:sw=2:et:
+
