 js.php | 46 +++++++++++++++++++---------------------------
 1 file changed, 19 insertions(+), 27 deletions(-)

diff --git a/js.php b/js.php
index 632e463..034ffc5 100644
--- a/js.php
+++ b/js.php
@@ -10,17 +10,6 @@
 define('DRUPAL_ROOT', getcwd());
 
 /**
- * @name Return constants, copies from menu.inc.
- * @{
- * The constants are copied to be able to drop the menu.inc depdendency
- */
-define('JS_MENU_NOT_FOUND', 2);
-define('JS_MENU_ACCESS_DENIED', 3);
-/**
- * @} End of "Required core files".
- */
-
-/**
  * @name Required core files
  * @{
  * The minimal core files required to be able to run a js request
@@ -30,6 +19,7 @@ require_once DRUPAL_ROOT . '/includes/common.inc';
 require_once DRUPAL_ROOT . '/includes/module.inc';
 require_once DRUPAL_ROOT . '/includes/unicode.inc';
 require_once DRUPAL_ROOT . '/includes/file.inc';
+require_once DRUPAL_ROOT . '/includes/menu.inc';
 /**
  * @} End of "Required core files".
  */
@@ -71,34 +61,30 @@ function js_execute_callback() {
   // Determine module to load.
   $module = check_plain(array_shift($args));
   if (!$module || !drupal_load('module', $module)) {
-    return JS_MENU_ACCESS_DENIED;
+    return MENU_ACCESS_DENIED;
   }
 
   // Get info hook function name.
   $function = $module . '_js';
   if (!function_exists($function)) {
-    return JS_MENU_NOT_FOUND;
+    return MENU_NOT_FOUND;
   }
 
   // Get valid callbacks.
   $valid_callbacks = $function();
+
   //Validate the availability of the callback
-  $callback_args = $args;
-  $callback_valid = FALSE;
-  while (!empty($callback_args)) {
-    $callback = check_plain(implode('/', $callback_args));
-    if (isset($valid_callbacks[$callback])) {
+  $ancestors = menu_get_ancestors($args);
+  foreach($ancestors AS $path) {
+    if(isset($valid_callbacks[$path])) {
+      $callback = $path;
       break;
     }
-    else {
-      // pop another parameter off the incoming args and check again
-      array_pop($callback_args);
-    }
   }
 
   //Validate the callback
-  if (!isset($valid_callbacks[$callback])) {
-    return JS_MENU_NOT_FOUND;
+  if (!isset($callback)) {
+    return MENU_NOT_FOUND;
   }
 
   // If the callback function is located in another file, load that file now.
@@ -108,7 +94,7 @@ function js_execute_callback() {
 
   // Validate the existance of the defined callback
   if (!function_exists($valid_callbacks[$callback]['callback'])) {
-    return JS_MENU_NOT_FOUND;
+    return MENU_NOT_FOUND;
   }
 
   // Bootstrap to required level.
@@ -170,7 +156,7 @@ function js_execute_callback() {
       }
 
       if(!call_user_func_array($valid_callbacks[$callback]['access callback'], $valid_callbacks[$callback]['access arguments'])) {
-        return JS_MENU_ACCESS_DENIED;
+        return MENU_ACCESS_DENIED;
       }
     }
     
@@ -178,6 +164,12 @@ function js_execute_callback() {
     module_invoke_all('init');
   }
 
+  // If there are page arguments defined add them to the callback call.
+  $callback_args = array();
+  if(isset($valid_callbacks[$callback]['page arguments'])) {
+    $callback_args = array_intersect_key($args, array_flip($valid_callbacks[$callback]['page arguments']));
+  }
+
   // Invoke callback function.
-  return call_user_func_array($valid_callbacks[$callback]['callback'], $args);
+  return call_user_func_array($valid_callbacks[$callback]['callback'], $callback_args);
 }
