Index: audio_attach.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/audio/contrib/attach/audio_attach.info,v
retrieving revision 1.4
diff -u -p -r1.4 audio_attach.info
--- audio_attach.info 2 Oct 2008 07:12:34 -0000 1.4
+++ audio_attach.info 25 Nov 2008 18:44:35 -0000
@@ -2,5 +2,8 @@
name = Audio Attach
description = Allows audio files to be attached to any node type.
package = "Audio"
-;WAITING ON UPDATE: core = 6.x
+;WAITING ON UPDATE:
+core = 6.x
dependencies[] = audio
+dependencies[] = content
+dependencies[] = nodereference
Index: audio_attach.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/audio/contrib/attach/audio_attach.install,v
retrieving revision 1.4
diff -u -p -r1.4 audio_attach.install
--- audio_attach.install 25 May 2008 17:21:27 -0000 1.4
+++ audio_attach.install 25 Nov 2008 18:44:36 -0000
@@ -5,43 +5,32 @@
* Implementation of hook_install().
*/
function audio_attach_install() {
- drupal_install_schema('audio_attach');
+ drupal_load('module', 'content');
+ content_notify('install', 'audio_attach');
}
/**
* Implementation of hook_uninstall().
*/
function audio_attach_uninstall() {
- drupal_uninstall_schema('audio_attach');
+ drupal_load('module', 'content');
+ content_notify('uninstall', 'audio_attach');
}
/**
- * Implementation of hook_schema().
+ * Implementation of hook_enable().
*/
-function audio_attach_schema() {
- $schema['audio_attach'] = array(
- 'description' => t('Attaches an audio node to another node.'),
- 'fields' => array(
- 'nid' => array(
- 'type' => 'int',
- 'size' => 'medium',
- 'not null' => TRUE,
- ),
- 'aid' => array(
- 'type' => 'int',
- 'size' => 'medium',
- 'not null' => TRUE,
- ),
- 'weight' => array(
- 'type' => 'int',
- 'size' => 'medium',
- 'not null' => TRUE,
- 'default' => 0,
- ),
- ),
- 'primary key' => array('nid', 'aid', 'weight'),
- );
- return $schema;
+function audio_attach_enable() {
+ drupal_load('module', 'content');
+ content_notify('enable', 'audio_attach');
+}
+
+/**
+ * Implementation of hook_disable().
+ */
+function audio_attach_disable() {
+ drupal_load('module', 'content');
+ content_notify('disable', 'audio_attach');
}
/**
@@ -61,3 +50,134 @@ function audio_attach_update_1() {
db_add_primary_key($ret, 'audio_attach', array('nid', 'aid', 'weight'));
return $ret;
}
+
+/**
+ * Create a CCK nodereference field and migrate the data to it.
+ */
+function audio_attach_update_6000() {
+ // Make sure they've enabled CCK
+ if (!drupal_load('module', 'content') || !drupal_load('module', 'nodereference') || !function_exists('content_check_update')) {
+ $ret['#abort'] = array('success' => FALSE, 'query' => t('Audio Attach now requires CCK be installed. Some updates are still pending.
Please re-run the update script.'));
+ }
+ if ($abort = content_check_update('fieldgroup')) {
+ return $abort;
+ }
+
+ // Need to load the CCK include file where content_field_instance_create()
+ // is defined.
+ module_load_include('inc', 'content', 'includes/content.crud');
+
+ // var_export(content_fields('field_audio_attach', 'story'));
+ $field = array (
+ 'field_name' => 'field_audio_attach',
+ 'display_settings' =>
+ array (
+ 'weight' => '31',
+ 'parent' => '',
+ 'label' =>
+ array (
+ 'format' => 'above',
+ ),
+ 'teaser' =>
+ array (
+ 'format' => 'audio_attach',
+ 'exclude' => 0,
+ ),
+ 'full' =>
+ array (
+ 'format' => 'audio_attach',
+ 'exclude' => 0,
+ ),
+ 4 =>
+ array (
+ 'format' => 'default',
+ 'exclude' => 0,
+ ),
+ 2 =>
+ array (
+ 'format' => 'default',
+ 'exclude' => 0,
+ ),
+ 3 =>
+ array (
+ 'format' => 'default',
+ 'exclude' => 0,
+ ),
+ 'token' =>
+ array (
+ 'format' => 'default',
+ 'exclude' => 0,
+ ),
+ ),
+ 'widget_active' => '1',
+ 'type' => 'nodereference',
+ 'required' => '0',
+ 'multiple' => '1',
+ 'db_storage' => '0',
+ 'module' => 'nodereference',
+ 'active' => '1',
+ 'locked' => '0',
+ 'columns' =>
+ array (
+ 'nid' =>
+ array (
+ 'type' => 'int',
+ 'unsigned' => true,
+ 'not null' => false,
+ ),
+ ),
+ 'referenceable_types' =>
+ array (
+ 'audio' => 'audio',
+ ),
+ 'advanced_view' => '--',
+ 'advanced_view_args' => '',
+ 'widget' =>
+ array (
+ 'autocomplete_match' => 'contains',
+ 'default_value' =>
+ array (
+ 0 =>
+ array (
+ 'nid' => NULL,
+ '_error_element' => 'default_value_widget][field_audio_attach][0][nid][nid',
+ ),
+ ),
+ 'default_value_php' => NULL,
+ 'label' => 'Attached audio files',
+ 'weight' => '31',
+ 'description' => '',
+ 'type' => 'nodereference_autocomplete',
+ 'module' => 'nodereference',
+ ),
+ );
+
+ // Now create the fields for each node type that audio_attach is enabled on.
+ foreach (node_get_types() as $type) {
+ if (variable_get('audio_attach_'. $type, 0)) {
+ $field['type_name'] = $type->type;
+ content_field_instance_create($field);
+ }
+ }
+
+ // Now the tricky part is to migrate the data...
+ // GREAT BIG ASSUMPTION: We created the field to accept unlimited values so
+ // it should have $field['db_storage'] == CONTENT_DB_STORAGE_PER_FIELD for
+ // all instances of the field. If not this code will probably not work right.
+ $db_info = content_database_info($field);
+ $table = $db_info['table'];
+ $column = $db_info['columns']['nid']['column'];
+
+ $ret[] = update_sql("INSERT INTO {$table} (nid, vid, delta, $column) SELECT n.nid, n.vid, a.weight, a.aid FROM {audio_attach} a INNER JOIN {node} n ON a.nid = n.nid");
+
+
+ // Remove the old variables.
+# foreach (node_get_types() as $type) {
+# variable_del('audio_attach_'. $type);
+# }
+
+ // And drop the old table.
+# db_drop_table($ret, 'audio_attach');
+
+ return $ret;
+}
Index: audio_attach.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/audio/contrib/attach/audio_attach.module,v
retrieving revision 1.9
diff -u -p -r1.9 audio_attach.module
--- audio_attach.module 25 May 2008 17:21:27 -0000 1.9
+++ audio_attach.module 25 Nov 2008 18:44:37 -0000
@@ -18,30 +18,43 @@ function audio_attach_help($section, $ar
}
}
+///**
+// * Implementation of hook_menu
+// */
+//function audio_attach_menu() {
+// $items = array();
+//
+// // For example: audio_attach/remove/314/1
+// $items['audio_attach/%op/%node/%index'] = array(
+// 'page callback' => '_audio_attach_action',
+// 'page arguments' => array(1, 2, 3),
+// 'access callback' => 'node_access',
+// 'access arguments' => array('update', 2),
+// 'type' => MENU_CALLBACK,
+// );
+//
+// return $items;
+//}
+
/**
- * Implementation of hook_menu
+ * Implementation of hook_perm
*/
-function audio_attach_menu() {
- $items = array();
-
- // For example: audio_attach/remove/314/1
- $items['audio_attach/%op/%node/%index'] = array(
- 'page callback' => '_audio_attach_action',
- 'page arguments' => array(1, 2, 3),
- 'access callback' => 'node_access',
- 'access arguments' => array('update', 2),
- 'type' => MENU_CALLBACK,
+function audio_attach_perm() {
+ return array(
+ 'attach any existing audio file'
);
-
- return $items;
}
/**
- * Implementation of hook_perm
+ * Implementation of hook_field_formatter_info().
*/
-function audio_attach_perm() {
+function audio_attach_field_formatter_info() {
return array(
- 'attach any existing audio file'
+ 'audio_attach' => array(
+ 'label' => t('Attached audio'),
+ 'field types' => array('nodereference'),
+ 'multiple values' => CONTENT_HANDLE_MODULE,
+ ),
);
}
@@ -50,35 +63,64 @@ function audio_attach_perm() {
*/
function audio_attach_theme() {
return array(
- 'audio_attach_list' => array(
- 'arguments' => array('nids', 'teaser' => FALSE),
+ 'audio_attach_formatter_audio_attach' => array(
+ 'arguments' => array('element' => NULL, 'teaser' => FALSE),
),
+// 'audio_attach_list' => array(
+// 'arguments' => array('nids', 'teaser' => FALSE),
+// ),
);
}
+
+/**
+ * Theme function for 'attached_audio' nodereference field formatter.
+ */
+function theme_audio_attach_formatter_audio_attach($element, $teaser = FALSE) {
+ $items = array();
+
+ foreach (element_children($element) as $item) {
+ if (!empty($element[$item]['#item']['nid'])) {
+ $audio = node_load($element[$item]['#item']['nid']);
+ if ($audio->nid) {
+ $audio = node_prepare($audio, $teaser);
+ $title = $audio->status ? l($audio->title, 'node/'. $audio->nid, array('html' => TRUE)) : check_plain($audio->title);
+ $items[] = '
'. $title .'
'. theme('audio_teaser', $audio);
+ }
+ }
+ }
+
+ if (count($items)) {
+ drupal_add_css(drupal_get_path('module', 'audio_attach') .'/audio_attach.css');
+ return theme('item_list', $items, null, 'ol', array('class' => 'audio-attach-list'));
+ }
+
+ return '';
+}
+
/**
* Implementation of hook_form_alter()
*/
function audio_attach_form_alter(&$form, &$form_state, $form_id) {
switch ($form_id) {
- // checkbox in the node's content type configuration page.
- case 'node_type_form':
- if (isset($form['identity']['type'])) {
- $form['workflow']['audio_attach'] = array(
- '#type' => 'radios',
- '#title' => t('Attach audio files'),
- '#default_value' => variable_get('audio_attach_'. $form['#node_type']->type, 0),
- '#options' => array(t('Disabled'), t('Enabled')),
- '#description' => t('Should this node allows users to attach audio files?')
- );
- }
- break;
+// // checkbox in the node's content type configuration page.
+// case 'node_type_form':
+// if (isset($form['identity']['type'])) {
+// $form['workflow']['audio_attach'] = array(
+// '#type' => 'radios',
+// '#title' => t('Attach audio files'),
+// '#default_value' => variable_get('audio_attach_'. $form['#node_type']->type, 0),
+// '#options' => array(t('Disabled'), t('Enabled')),
+// '#description' => t('Should this node allows users to attach audio files?')
+// );
+// }
+// break;
// FIXME: This is broken; I'm not sure what $form['type']['#value'] is
// expected to be, but it certainly doesn't always exist.
// if enabled adjust the form
//case $form['type']['#value'] .'_node_form':
- case 'FIXME_node_form':
+ case 'TYPE_node_form':
if (variable_get('audio_attach_'. $form['type']['#value'], 0)) {
$node = $form['#node'];
$form['#attributes'] = array("enctype" => "multipart/form-data");
@@ -135,16 +177,18 @@ function audio_attach_form_alter(&$form,
*/
function audio_attach_nodeapi(&$node, $op, $teaser, $page) {
global $user;
- // delete all references from other nodes if audio node is deleted 24/08/2006 sun
- if ($node->type == 'audio' && $op == 'delete') {
- db_query("DELETE FROM {audio_attach} WHERE aid = %d", $node->nid);
- return;
- }
+
+// // delete all references from other nodes if audio node is deleted 24/08/2006 sun
+// if ($node->type == 'audio' && $op == 'delete') {
+// db_query("DELETE FROM {audio_attach} WHERE aid = %d", $node->nid);
+// return;
+// }
if ($node->type == 'audio' || !variable_get("audio_attach_$node->type", 0)) {
return;
}
switch ($op) {
case 'prepare':
+ break;
$audio->title_format = check_plain($_POST['audio_title']);
$audio->status = check_plain($_POST['audio_publish']) ? 1 : 0;
$audio->uid = $user->uid;
@@ -162,226 +206,226 @@ function audio_attach_nodeapi(&$node, $o
}
break;
- case 'insert':
- case 'update':
- if ($node->audio_aid) {
- audio_attach_add_child($node->nid, $node->audio_aid);
- }
- if ($node->audio_existing_aid) {
- audio_attach_add_child($node->nid, $node->audio_existing_aid);
- }
- break;
-
- case 'delete':
- audio_attach_remove($node->nid);
- break;
-
- case 'load':
- $audio_attach = audio_attach_get_children($node->nid);
- return array('audio_attach' => $audio_attach);
-
- case 'view':
- if (is_array($node->audio_attach) && count($node->audio_attach) > 0) {
- $node->content['attach_audio'] = array(
- '#value' => theme('audio_attach_list', $node->audio_attach, $teaser),
- '#weight' => 10,
- );
- }
- break;
- }
-}
-
-/**
- * Menu callback, perform an action on attachments.
- */
-function _audio_attach_action($op, $nid, $index) {
-
- switch ($op) {
- case 'remove':
- // remove the element index b from the array. rebuild the array, and save.
- $children = audio_attach_get_children($nid);
- $items = array();
- foreach ($children as $weight => $aid) {
- if ($weight != $index) {
- $items[] = $aid;
- }
- }
- _audio_attach_save_order($nid, $items);
- break;
- case 'up':
- // take the element and move it up if possible in the array.
- $items = audio_attach_get_children($nid);
- if (isset($items[$index - 1])) {
- $temp = $items[$index];
- $temp2 = $items[$index - 1];
- $items[$index] = $temp2;
- $items[$index - 1] = $temp;
- }
- _audio_attach_save_order($nid, $items);
- break;
- case 'down':
- // take the element and move it down if possible in the array.
- $items = audio_attach_get_children($nid);
-
- if (isset($items[$index + 1])) {
- $temp = $items[$index];
- $temp2 = $items[$index + 1];
- $items[$index] = $temp2;
- $items[$index + 1] = $temp;
- }
- _audio_attach_save_order($nid, $items);
- break;
- }
-
- // Clear the node cache to get the updated audio_attach list
- $update_node = node_load($nid, NULL, TRUE);
-
- _audio_attach_ahah_update($nid);
-
-}
-
-/**
- * Input a parent node id, and return an array of children id's ordered by their weight.
- */
-function audio_attach_get_children($nid) {
- $children = array();
- $result = db_query("SELECT aid, weight FROM {audio_attach} WHERE nid = %d ORDER BY weight ASC", $nid);
- while ($row = db_fetch_object($result)) {
- $children[$row->weight] = $row->aid;
+// case 'insert':
+// case 'update':
+// if ($node->audio_aid) {
+// audio_attach_add_child($node->nid, $node->audio_aid);
+// }
+// if ($node->audio_existing_aid) {
+// audio_attach_add_child($node->nid, $node->audio_existing_aid);
+// }
+// break;
+//
+// case 'delete':
+// audio_attach_remove($node->nid);
+// break;
+//
+// case 'load':
+// $audio_attach = audio_attach_get_children($node->nid);
+// return array('audio_attach' => $audio_attach);
+//
+// case 'view':
+// if (is_array($node->audio_attach) && count($node->audio_attach) > 0) {
+// $node->content['attach_audio'] = array(
+// '#value' => theme('audio_attach_list', $node->audio_attach, $teaser),
+// '#weight' => 10,
+// );
+// }
+// break;
}
- return $children;
}
-/**
- * Add a new child to a parent node
- */
-function audio_attach_add_child($nid, $aid, $stack_bottom = TRUE) {
- $weight = audio_attach_get_next_weight($nid);
- $result = db_query("INSERT INTO {audio_attach} (nid, aid, weight) VALUES (%d, %d, %d)", $nid, $aid, $weight);
-}
-
-/**
- * Delete a child node from a given parent node. If no parent node is
- * specified, it deletes the child from all parent nodes. Returns true if
- * successful.
- */
-function audio_attach_remove_child($aid, $nid, $weight) {
- $result = db_query("DELETE FROM {audio_attach} WHERE nid = %d AND aid = %d AND weight = %d", $nid, $aid, $weight);
- return db_affected_rows($result);
-}
-
-/**
- * Delete a parent node. Returns true if successful.
- */
-function audio_attach_remove($nid) {
- $result = db_query("DELETE FROM {audio_attach} WHERE nid = %d", $nid);
- return db_affected_rows($result);
-}
-
-/**
- * Get next weight in a given list.
- */
-function audio_attach_get_next_weight($nid) {
- $max = db_result(db_query("SELECT MAX(weight) FROM {audio_attach} WHERE nid = %d", $nid));
- return (is_null($max)) ? 0 : ++$max;
-}
-
-/**
- * Save a new order
- * $nid = node we are attaching files to
- * $order = a list of audio nids
- * return true if successful.
- */
-function _audio_attach_save_order($nid, $items) {
- // clear out old entries for this nid.
- if (is_array($items)) {
- $cleared = audio_attach_remove($nid);
- foreach ($items as $aid) {
- audio_attach_add_child($nid, $aid);
- }
- return TRUE;
- }
-}
-
-/**
- * Theme used if multiple files are attached
- */
-function theme_audio_attach_list($nids, $teaser = FALSE) {
- drupal_add_css(AUDIO_ATTACH_PATH .'/audio_attach.css');
- foreach ($nids as $aid) {
- $audio = node_load($aid);
- $audio = node_prepare($audio, $teaser);
- $title = $audio->status ? l($audio->title, 'node/'. $audio->nid, array('html' => TRUE)) : check_plain($audio->title);
- $items[] = ''. $title .'
'. theme('audio_teaser', $audio);
- }
- return theme('item_list', $items, null, 'ol', array('class' => 'audio-attach-list'));
-}
-
-
-/**
- * Fetch an array of all candidate referenced nodes, for use in presenting the selection form to the user.
- */
-function audio_attach_get_audio_nodes() {
- global $user;
- $rows = array(0 => '');
- $sql = "SELECT n.nid, n.title FROM {node} n WHERE n.status=1 AND type='audio' ";
- $sql .= !user_access("attach any existing audio file") ? "AND n.uid = $user->uid " : "";
- $sql .= "ORDER BY n.sticky DESC, n.title ASC";
- $result = db_query(db_rewrite_sql($sql));
- while ($node = db_fetch_object($result)) {
- $rows[$node->nid] = $node->title;
- }
- return $rows;
-}
-
-/**
- * Return a list of currently attached audio files for a node. Used in edit form.
- * TODO: This is clunky. Needs to be leaner.
- */
-function _audio_attach_current_list($nid) {
- drupal_add_css(AUDIO_ATTACH_PATH .'/audio_attach.css');
- drupal_add_js(AUDIO_ATTACH_PATH .'/audio_attach.js');
- $node = node_load($nid);
- $items = array();
- $i = 0;
- if (is_array($node->audio_attach) && count($node->audio_attach) > 0) {
- foreach ($node->audio_attach as $weight => $aid) {
- $audio = node_load($aid);
- $drag = theme('image', AUDIO_ATTACH_PATH .'/images/drag_me.gif');
- $link = l($audio->title, 'node/'. $audio->nid, array('html' => TRUE));
- $trashcan = l(theme('image', AUDIO_ATTACH_PATH .'/images/user-trash.png'),
- "audio_attach/remove/$node->nid/$i", array(
- 'attributes' => array('class' => 'audio-attach-quick-link'),
- 'query' => drupal_get_destination(),
- 'absolute' => true,
- )
- );
- $up = $i > 0 ? l(theme('image', AUDIO_ATTACH_PATH .'/images/go-up.png'),
- "audio_attach/up/$node->nid/$i", array(
- 'attributes' => array('class' => 'audio-attach-quick-link'),
- 'query' => drupal_get_destination(),
- 'absolute' => true,
- )
- ) : '' ;
- $down = $i < count($node->audio_attach) - 1 ? l(theme('image', AUDIO_ATTACH_PATH .'/images/go-down.png'),
- "audio_attach/down/$node->nid/$i", array(
- 'attributes' => array('class' => 'audio-attach-quick-link'),
- 'query' => drupal_get_destination(),
- 'absolute' => true,
- )
- ) : '';
- $items[] = array($i + 1, $link, $down, $up, $trashcan);
- $i++;
- }
- $output = theme('table', array('#', 'Title', array('data' => 'Actions', 'colspan' => 3)), $items, array('id' => 'audio-attach-items-table'));
- }
- return $output;
-}
-
-/**
- * Ajax/Ahah callback to update the attached list table
- */
-function _audio_attach_ahah_update($nid) {
- print _audio_attach_current_list($nid);
- exit();
-}
+///**
+// * Menu callback, perform an action on attachments.
+// */
+//function _audio_attach_action($op, $nid, $index) {
+//
+// switch ($op) {
+// case 'remove':
+// // remove the element index b from the array. rebuild the array, and save.
+// $children = audio_attach_get_children($nid);
+// $items = array();
+// foreach ($children as $weight => $aid) {
+// if ($weight != $index) {
+// $items[] = $aid;
+// }
+// }
+// _audio_attach_save_order($nid, $items);
+// break;
+// case 'up':
+// // take the element and move it up if possible in the array.
+// $items = audio_attach_get_children($nid);
+// if (isset($items[$index - 1])) {
+// $temp = $items[$index];
+// $temp2 = $items[$index - 1];
+// $items[$index] = $temp2;
+// $items[$index - 1] = $temp;
+// }
+// _audio_attach_save_order($nid, $items);
+// break;
+// case 'down':
+// // take the element and move it down if possible in the array.
+// $items = audio_attach_get_children($nid);
+//
+// if (isset($items[$index + 1])) {
+// $temp = $items[$index];
+// $temp2 = $items[$index + 1];
+// $items[$index] = $temp2;
+// $items[$index + 1] = $temp;
+// }
+// _audio_attach_save_order($nid, $items);
+// break;
+// }
+//
+// // Clear the node cache to get the updated audio_attach list
+// $update_node = node_load($nid, NULL, TRUE);
+//
+// _audio_attach_ahah_update($nid);
+//
+//}
+//
+///**
+// * Input a parent node id, and return an array of children id's ordered by their weight.
+// */
+//function audio_attach_get_children($nid) {
+// $children = array();
+// $result = db_query("SELECT aid, weight FROM {audio_attach} WHERE nid = %d ORDER BY weight ASC", $nid);
+// while ($row = db_fetch_object($result)) {
+// $children[$row->weight] = $row->aid;
+// }
+// return $children;
+//}
+//
+///**
+// * Add a new child to a parent node
+// */
+//function audio_attach_add_child($nid, $aid, $stack_bottom = TRUE) {
+// $weight = audio_attach_get_next_weight($nid);
+// $result = db_query("INSERT INTO {audio_attach} (nid, aid, weight) VALUES (%d, %d, %d)", $nid, $aid, $weight);
+//}
+//
+///**
+// * Delete a child node from a given parent node. If no parent node is
+// * specified, it deletes the child from all parent nodes. Returns true if
+// * successful.
+// */
+//function audio_attach_remove_child($aid, $nid, $weight) {
+// $result = db_query("DELETE FROM {audio_attach} WHERE nid = %d AND aid = %d AND weight = %d", $nid, $aid, $weight);
+// return db_affected_rows($result);
+//}
+//
+///**
+// * Delete a parent node. Returns true if successful.
+// */
+//function audio_attach_remove($nid) {
+// $result = db_query("DELETE FROM {audio_attach} WHERE nid = %d", $nid);
+// return db_affected_rows($result);
+//}
+//
+///**
+// * Get next weight in a given list.
+// */
+//function audio_attach_get_next_weight($nid) {
+// $max = db_result(db_query("SELECT MAX(weight) FROM {audio_attach} WHERE nid = %d", $nid));
+// return (is_null($max)) ? 0 : ++$max;
+//}
+//
+///**
+// * Save a new order
+// * $nid = node we are attaching files to
+// * $order = a list of audio nids
+// * return true if successful.
+// */
+//function _audio_attach_save_order($nid, $items) {
+// // clear out old entries for this nid.
+// if (is_array($items)) {
+// $cleared = audio_attach_remove($nid);
+// foreach ($items as $aid) {
+// audio_attach_add_child($nid, $aid);
+// }
+// return TRUE;
+// }
+//}
+//
+///**
+// * Theme used if multiple files are attached
+// */
+//function theme_audio_attach_list($nids, $teaser = FALSE) {
+// drupal_add_css(AUDIO_ATTACH_PATH .'/audio_attach.css');
+// foreach ($nids as $aid) {
+// $audio = node_load($aid);
+// $audio = node_prepare($audio, $teaser);
+// $title = $audio->status ? l($audio->title, 'node/'. $audio->nid, array('html' => TRUE)) : check_plain($audio->title);
+// $items[] = ''. $title .'
'. theme('audio_teaser', $audio);
+// }
+// return theme('item_list', $items, null, 'ol', array('class' => 'audio-attach-list'));
+//}
+//
+//
+///**
+// * Fetch an array of all candidate referenced nodes, for use in presenting the selection form to the user.
+// */
+//function audio_attach_get_audio_nodes() {
+// global $user;
+// $rows = array(0 => '');
+// $sql = "SELECT n.nid, n.title FROM {node} n WHERE n.status=1 AND type='audio' ";
+// $sql .= !user_access("attach any existing audio file") ? "AND n.uid = $user->uid " : "";
+// $sql .= "ORDER BY n.sticky DESC, n.title ASC";
+// $result = db_query(db_rewrite_sql($sql));
+// while ($node = db_fetch_object($result)) {
+// $rows[$node->nid] = $node->title;
+// }
+// return $rows;
+//}
+//
+///**
+// * Return a list of currently attached audio files for a node. Used in edit form.
+// * TODO: This is clunky. Needs to be leaner.
+// */
+//function _audio_attach_current_list($nid) {
+// drupal_add_css(AUDIO_ATTACH_PATH .'/audio_attach.css');
+// drupal_add_js(AUDIO_ATTACH_PATH .'/audio_attach.js');
+// $node = node_load($nid);
+// $items = array();
+// $i = 0;
+// if (is_array($node->audio_attach) && count($node->audio_attach) > 0) {
+// foreach ($node->audio_attach as $weight => $aid) {
+// $audio = node_load($aid);
+// $drag = theme('image', AUDIO_ATTACH_PATH .'/images/drag_me.gif');
+// $link = l($audio->title, 'node/'. $audio->nid, array('html' => TRUE));
+// $trashcan = l(theme('image', AUDIO_ATTACH_PATH .'/images/user-trash.png'),
+// "audio_attach/remove/$node->nid/$i", array(
+// 'attributes' => array('class' => 'audio-attach-quick-link'),
+// 'query' => drupal_get_destination(),
+// 'absolute' => true,
+// )
+// );
+// $up = $i > 0 ? l(theme('image', AUDIO_ATTACH_PATH .'/images/go-up.png'),
+// "audio_attach/up/$node->nid/$i", array(
+// 'attributes' => array('class' => 'audio-attach-quick-link'),
+// 'query' => drupal_get_destination(),
+// 'absolute' => true,
+// )
+// ) : '' ;
+// $down = $i < count($node->audio_attach) - 1 ? l(theme('image', AUDIO_ATTACH_PATH .'/images/go-down.png'),
+// "audio_attach/down/$node->nid/$i", array(
+// 'attributes' => array('class' => 'audio-attach-quick-link'),
+// 'query' => drupal_get_destination(),
+// 'absolute' => true,
+// )
+// ) : '';
+// $items[] = array($i + 1, $link, $down, $up, $trashcan);
+// $i++;
+// }
+// $output = theme('table', array('#', 'Title', array('data' => 'Actions', 'colspan' => 3)), $items, array('id' => 'audio-attach-items-table'));
+// }
+// return $output;
+//}
+//
+///**
+// * Ajax/Ahah callback to update the attached list table
+// */
+//function _audio_attach_ahah_update($nid) {
+// print _audio_attach_current_list($nid);
+// exit();
+//}