Index: modules/services/services/menu_service/menu_service.info
===================================================================
RCS file: modules/services/services/menu_service/menu_service.info
diff -N modules/services/services/menu_service/menu_service.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/services/services/menu_service/menu_service.info	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,8 @@
+; $Id: menu_service.info,v 1.0.0.0 2007/01/21 18:17:00 g10 Exp $
+name = Menu Service
+description = Provides a menu service.
+package = Services - services
+dependencies = services menu locale
+version = "5.x-1.x-dev"
+project = "services"
+
Index: modules/services/services/menu_service/menu_service.module
===================================================================
RCS file: modules/services/services/menu_service/menu_service.module
diff -N modules/services/services/menu_service/menu_service.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/services/services/menu_service/menu_service.module	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,281 @@
+<?php
+// $Id: menu_service.module,v 1.0.0.0 2007/01/21 18:18:00 g10 Exp $
+
+/**
+ * Implementation of hook_help().
+ */
+function menu_service_help($section) {
+  switch ($section) {
+    case 'admin/help#services_menu':
+      return t('<p>Provides menu methods to services applications. Requires services.module.</p>');
+    case 'admin/modules#description':
+      return t('Provides menu methods to services applications. Requires services.module.');
+  }
+}
+
+/**
+ * Implementation of hook_service()
+ */
+function menu_service_service() {
+  return array(
+    
+    // menu.load
+    array(
+      '#method'   => 'menu.load',
+      '#callback' => 'menu_service_load',
+      '#args'     => array(
+        array(
+          '#name'         => 'menu_title',
+          '#type'         => 'string',
+          '#description'  => t('A menu title.')),
+        array(
+          '#name'         => 'lang_id',
+          '#type'         => 'string',
+          '#optional'     => TRUE, 
+          '#description'  => t('A language id.'))),
+      '#return'   => 'struct',
+      '#help'     => t('Returns a menu (in a given language if specified).'))
+      
+ 
+  );
+}
+
+/**
+ * Returns a specified menu.
+ */
+function menu_service_load($menu_title = NULL, $lang_id = NULL) {
+	
+  global $locale;
+	
+  $result_menu = array();
+  
+  if(!isset($menu_title))
+  	$menu_title = (isset($lang_id)) ? $lang_id : $locale;
+  
+  	
+  $req_id = _search_menu($menu_title);
+   
+  
+  // root node
+  $result['root'] = menu_get_item($req_id);
+  $result['root']['nid'] = $req_id;
+  
+  // site settings (title, languages)
+  $result['settings'] = array();
+  $result['settings']['site_title'] = variable_get('site_name', 'drupal');  
+  $result['settings']['multi_language'] = (function_exists('i18n_language_list')) ? true : false;
+  
+  $result['settings']['server_time'] = date('H.i.s_d.m.Y_O', time());
+   
+  
+  if($result['settings']['multi_language'])
+  {
+  	
+    $lang_list = i18n_language_list();
+  	
+    foreach($lang_list as $lang => $value)
+    {
+
+      $result['settings']['language_list'][$lang]['id'] = $lang;
+      $result['settings']['language_list'][$lang]['value'] = $value;
+      
+  	  $result['settings']['language_list'][$lang]['frontpage']['id'] = i18n_frontpage($lang);
+  	  $result['settings']['language_list'][$lang]['frontpage']['pathalias'] = _path_load_from_nodepath($result['settings']['language_list'][$lang]['frontpage']['id']);
+    }
+  
+    $result['settings']['language_default'] = i18n_default_language();
+
+    $lang_id = ($lang_id) ? $lang_id : $result['settings']['language_default'];
+  	
+  	$result['locale'] = $locale;
+  	
+ 	$result['menu_language'] = $lang_id;
+  }
+  else
+  {
+ 
+    $result['settings']['language_default'] = $lang_id;
+ 	$result['settings']['frontpage'][$lang_id]['pathalias'] = variable_get('site_frontpage','node');
+	
+ 	$result['menu_language'] = $lang_id;
+ 	 
+  	$lang_id = NULL;
+  }
+  
+  
+  
+  $result_menu += _menu_item_get_children(menu_get_menu(), $req_id, $lang_id);
+  
+  if (!$result_menu)
+    return services_error(t("Could not find the menu."));
+  
+
+  $result['menu'] = $result_menu;
+  
+  
+
+    
+  return $result;
+}
+
+
+
+/**
+ * Get the children of a menu item
+ */
+function _menu_item_get_children($root, $mid, $lang)
+{
+	$children_array = array();
+	
+	$item = menu_get_item($mid);
+	
+	foreach( $item['children'] as $id ) {
+		
+		if( isset( $root['items'][$id] ) ) {
+			
+			$child = array();
+		
+			
+			$child['path'] = $root['items'][$id]['path'];
+			$child['pid'] = $root['items'][$id]['pid'];
+			$child['weight'] = $root['items'][$id]['weight'];
+			$child['children'] = $root['items'][$id]['children'];
+			$child['nid'] = $id;
+			
+			$nid = substr($child['path'], 5);
+			
+			if(isset($lang))
+			{
+				$lang_obj = translation_node_get_translations(array('nid' => $nid));
+			
+				$child['language_nodes'] = array();
+			
+				foreach(element_children($lang_obj) as $value)
+				{
+					$obj = $lang_obj[$value];
+					
+					if($obj->language == $lang)
+						$nid = $obj->nid;
+			
+					$child['language_nodes'][$value] = $obj->nid;
+						
+					$obj = NULL;
+				}
+				
+				
+				
+				
+				$child['title'] = $root['items'][$id]['title'];
+				
+				$newpath = "node/".$nid;
+			}
+			else
+			{
+				$child['title'] = $root['items'][$id]['title'];
+
+				$newpath = $child['path'];
+			}
+			$child['pathalias'] = _path_load_from_nodepath($newpath);
+			
+			
+			
+			
+			$fields = array( 'nid', 'title', 'language', 'field_template', 'field_navigation_type', 'status' );
+			$node = services_node_load(node_load(array('nid' => $nid)), $fields);
+			
+			if($node->status == 0) //node is not published, remove node and menu_item
+			{
+
+				unset($child);
+
+			}
+			else
+			{
+			
+				$child['node'] = array();
+				$child['node']['nid'] = $node->nid;
+				$child['node']['title'] = $node->title;
+				if($node->language)
+					$child['node']['language'] = $node->language;
+				
+				
+				$ft_obj = $node->field_template[0];
+				foreach (element_children($ft_obj) as $value) 
+			    {
+					$obj = $ft_obj[$value];
+					$child['node']['field_template'] = $obj->description;
+					$obj = NULL;
+					break;
+				}
+				
+				$fnt_obj = $node->field_navigation_type[0];
+				foreach (element_children($fnt_obj) as $value) 
+			    {
+					$obj = $fnt_obj[$value];
+					$child['node']['field_navigation_type'] = $obj->name;
+					$obj = NULL;
+					break;
+				}
+
+
+				
+				
+				array_push($children_array, $child);
+			}
+			
+			
+
+			
+		
+			
+			
+
+			
+			if( sizeof( $child['children'] ) > 0 ) {
+
+				//recursive
+				$children = _menu_item_get_children($root, $id, $lang);
+				
+			 	$children_array = array_merge($children_array, $children);
+				
+				
+				//Order by weight
+				$weights = array();
+				foreach( $child['children'] as $cid ) $weights[] = $children[$cid]['weight'];
+				array_multisort( $weights, $child['children'] );
+			}
+			
+			
+		}
+	}
+	
+	
+	return $children_array;
+}
+
+/**
+ * Fetch a specific URL alias from the database.
+ */
+function _path_load_from_nodepath($path) {
+	$path_array = db_fetch_array(db_query("SELECT dst FROM {url_alias} WHERE src = '%s'", $path));
+  	return $path_array['dst']; 
+}
+
+/**
+ * search requested menu
+ * 
+ */
+function _search_menu($menu_title)
+{
+	$root_menus = menu_get_root_menus();	
+  	foreach($root_menus as $mid => $title)
+  	{
+ 		if($title == $menu_title)
+ 		{
+ 			$req_id = $mid;
+ 			break;
+ 		}
+  	}
+  	
+  	return $req_id;
+}
