Commit 4193a0f9 authored by Jon Stacey's avatar Jon Stacey

Some untested rough sync up with the D6 branch

parent 5755a8cb
......@@ -2,4 +2,4 @@
July 2009
---------
* Clone D6 branch (jmstacey).
\ No newline at end of file
* Untested rough sync up with D6 branch (jmstacey).
\ No newline at end of file
/**
* jQuery MD5 hash algorithm function
*
* <code>
* Calculate the md5 hash of a String
* String $.md5 ( String str )
* </code>
*
* Calculates the MD5 hash of str using the » RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash.
* MD5 (Message-Digest algorithm 5) is a widely-used cryptographic hash function with a 128-bit hash value. MD5 has been employed in a wide variety of security applications, and is also commonly used to check the integrity of data. The generated hash is also non-reversable. Data cannot be retrieved from the message digest, the digest uniquely identifies the data.
* MD5 was developed by Professor Ronald L. Rivest in 1994. Its 128 bit (16 byte) message digest makes it a faster implementation than SHA-1.
* This script is used to process a variable length message into a fixed-length output of 128 bits using the MD5 algorithm. It is fully compatible with UTF-8 encoding. It is very useful when u want to transfer encrypted passwords over the internet. If you plan using UTF-8 encoding in your project don't forget to set the page encoding to UTF-8 (Content-Type meta tag).
* This function orginally get from the WebToolkit and rewrite for using as the jQuery plugin.
*
* Example
* Code
* <code>
* $.md5("I'm Persian.");
* </code>
* Result
* <code>
* "b8c901d0f02223f9761016cfff9d68df"
* </code>
*
* @alias Muhammad Hussein Fattahizadeh < muhammad [AT] semnanweb [DOT] com >
* @link http://www.semnanweb.com/jquery-plugin/md5.html
* @see http://www.webtoolkit.info/
* @license http://www.gnu.org/licenses/gpl.html [GNU General Public License]
* @param {jQuery} {md5:function(string))
* @return string
*/
(function($){
var rotateLeft = function(lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
var addUnsigned = function(lX, lY) {
var lX4, lY4, lX8, lY8, lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
if (lX4 | lY4) {
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
} else {
return (lResult ^ lX8 ^ lY8);
}
}
var F = function(x, y, z) {
return (x & y) | ((~ x) & z);
}
var G = function(x, y, z) {
return (x & z) | (y & (~ z));
}
var H = function(x, y, z) {
return (x ^ y ^ z);
}
var I = function(x, y, z) {
return (y ^ (x | (~ z)));
}
var FF = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(F(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var GG = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(G(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var HH = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(H(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var II = function(a, b, c, d, x, s, ac) {
a = addUnsigned(a, addUnsigned(addUnsigned(I(b, c, d), x), ac));
return addUnsigned(rotateLeft(a, s), b);
};
var convertToWordArray = function(string) {
var lWordCount;
var lMessageLength = string.length;
var lNumberOfWordsTempOne = lMessageLength + 8;
var lNumberOfWordsTempTwo = (lNumberOfWordsTempOne - (lNumberOfWordsTempOne % 64)) / 64;
var lNumberOfWords = (lNumberOfWordsTempTwo + 1) * 16;
var lWordArray = Array(lNumberOfWords - 1);
var lBytePosition = 0;
var lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
return lWordArray;
};
var wordToHex = function(lValue) {
var WordToHexValue = "", WordToHexValueTemp = "", lByte, lCount;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
WordToHexValueTemp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValueTemp.substr(WordToHexValueTemp.length - 2, 2);
}
return WordToHexValue;
};
var uTF8Encode = function(string) {
string = string.replace(/\x0d\x0a/g, "\x0a");
var output = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
output += String.fromCharCode(c);
} else if ((c > 127) && (c < 2048)) {
output += String.fromCharCode((c >> 6) | 192);
output += String.fromCharCode((c & 63) | 128);
} else {
output += String.fromCharCode((c >> 12) | 224);
output += String.fromCharCode(((c >> 6) & 63) | 128);
output += String.fromCharCode((c & 63) | 128);
}
}
return output;
};
$.extend({
md5: function(string) {
var x = Array();
var k, AA, BB, CC, DD, a, b, c, d;
var S11=7, S12=12, S13=17, S14=22;
var S21=5, S22=9 , S23=14, S24=20;
var S31=4, S32=11, S33=16, S34=23;
var S41=6, S42=10, S43=15, S44=21;
string = uTF8Encode(string);
x = convertToWordArray(string);
a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;
for (k = 0; k < x.length; k += 16) {
AA = a; BB = b; CC = c; DD = d;
a = FF(a, b, c, d, x[k+0], S11, 0xD76AA478);
d = FF(d, a, b, c, x[k+1], S12, 0xE8C7B756);
c = FF(c, d, a, b, x[k+2], S13, 0x242070DB);
b = FF(b, c, d, a, x[k+3], S14, 0xC1BDCEEE);
a = FF(a, b, c, d, x[k+4], S11, 0xF57C0FAF);
d = FF(d, a, b, c, x[k+5], S12, 0x4787C62A);
c = FF(c, d, a, b, x[k+6], S13, 0xA8304613);
b = FF(b, c, d, a, x[k+7], S14, 0xFD469501);
a = FF(a, b, c, d, x[k+8], S11, 0x698098D8);
d = FF(d, a, b, c, x[k+9], S12, 0x8B44F7AF);
c = FF(c, d, a, b, x[k+10], S13, 0xFFFF5BB1);
b = FF(b, c, d, a, x[k+11], S14, 0x895CD7BE);
a = FF(a, b, c, d, x[k+12], S11, 0x6B901122);
d = FF(d, a, b, c, x[k+13], S12, 0xFD987193);
c = FF(c, d, a, b, x[k+14], S13, 0xA679438E);
b = FF(b, c, d, a, x[k+15], S14, 0x49B40821);
a = GG(a, b, c, d, x[k+1], S21, 0xF61E2562);
d = GG(d, a, b, c, x[k+6], S22, 0xC040B340);
c = GG(c, d, a, b, x[k+11], S23, 0x265E5A51);
b = GG(b, c, d, a, x[k+0], S24, 0xE9B6C7AA);
a = GG(a, b, c, d, x[k+5], S21, 0xD62F105D);
d = GG(d, a, b, c, x[k+10], S22, 0x2441453);
c = GG(c, d, a, b, x[k+15], S23, 0xD8A1E681);
b = GG(b, c, d, a, x[k+4], S24, 0xE7D3FBC8);
a = GG(a, b, c, d, x[k+9], S21, 0x21E1CDE6);
d = GG(d, a, b, c, x[k+14], S22, 0xC33707D6);
c = GG(c, d, a, b, x[k+3], S23, 0xF4D50D87);
b = GG(b, c, d, a, x[k+8], S24, 0x455A14ED);
a = GG(a, b, c, d, x[k+13], S21, 0xA9E3E905);
d = GG(d, a, b, c, x[k+2], S22, 0xFCEFA3F8);
c = GG(c, d, a, b, x[k+7], S23, 0x676F02D9);
b = GG(b, c, d, a, x[k+12], S24, 0x8D2A4C8A);
a = HH(a, b, c, d, x[k+5], S31, 0xFFFA3942);
d = HH(d, a, b, c, x[k+8], S32, 0x8771F681);
c = HH(c, d, a, b, x[k+11], S33, 0x6D9D6122);
b = HH(b, c, d, a, x[k+14], S34, 0xFDE5380C);
a = HH(a, b, c, d, x[k+1], S31, 0xA4BEEA44);
d = HH(d, a, b, c, x[k+4], S32, 0x4BDECFA9);
c = HH(c, d, a, b, x[k+7], S33, 0xF6BB4B60);
b = HH(b, c, d, a, x[k+10], S34, 0xBEBFBC70);
a = HH(a, b, c, d, x[k+13], S31, 0x289B7EC6);
d = HH(d, a, b, c, x[k+0], S32, 0xEAA127FA);
c = HH(c, d, a, b, x[k+3], S33, 0xD4EF3085);
b = HH(b, c, d, a, x[k+6], S34, 0x4881D05);
a = HH(a, b, c, d, x[k+9], S31, 0xD9D4D039);
d = HH(d, a, b, c, x[k+12], S32, 0xE6DB99E5);
c = HH(c, d, a, b, x[k+15], S33, 0x1FA27CF8);
b = HH(b, c, d, a, x[k+2], S34, 0xC4AC5665);
a = II(a, b, c, d, x[k+0], S41, 0xF4292244);
d = II(d, a, b, c, x[k+7], S42, 0x432AFF97);
c = II(c, d, a, b, x[k+14], S43, 0xAB9423A7);
b = II(b, c, d, a, x[k+5], S44, 0xFC93A039);
a = II(a, b, c, d, x[k+12], S41, 0x655B59C3);
d = II(d, a, b, c, x[k+3], S42, 0x8F0CCC92);
c = II(c, d, a, b, x[k+10], S43, 0xFFEFF47D);
b = II(b, c, d, a, x[k+1], S44, 0x85845DD1);
a = II(a, b, c, d, x[k+8], S41, 0x6FA87E4F);
d = II(d, a, b, c, x[k+15], S42, 0xFE2CE6E0);
c = II(c, d, a, b, x[k+6], S43, 0xA3014314);
b = II(b, c, d, a, x[k+13], S44, 0x4E0811A1);
a = II(a, b, c, d, x[k+4], S41, 0xF7537E82);
d = II(d, a, b, c, x[k+11], S42, 0xBD3AF235);
c = II(c, d, a, b, x[k+2], S43, 0x2AD7D2BB);
b = II(b, c, d, a, x[k+9], S44, 0xEB86D391);
a = addUnsigned(a, AA);
b = addUnsigned(b, BB);
c = addUnsigned(c, CC);
d = addUnsigned(d, DD);
}
var tempValue = wordToHex(a) + wordToHex(b) + wordToHex(c) + wordToHex(d);
return tempValue.toLowerCase();
}
});
})(jQuery);
\ No newline at end of file
// $Id$
/**
* @file
* This file handles the JS for Media Module functions
*/
/**
* This handles the display, activation and
* hiding of drawers on the media browser form.
*/
Drupal.behaviors.mediaDrawers = function (context) {
// hide all the drawer display items on page load
$('.media.browser .ui-tabs-panel .drawer.display:not(.mediaDrawers-processed)', context).addClass('mediaDrawers-processed').each(function() {
$(this).hide();
});
// activate all the drawer data display that needs to be show when
// the page is loaded
$('.media.browser .ui-tabs-panel .drawer.display.active:not(.mediaDrawers-processed)', context).addClass('mediaDrawers-processed').each(function() {
$(this).show();
});
// --------------------------------------
// click actions
// now we need to bind click functionality on drawers to display
$('.media.browser .drawers .item-list ul li:not(.mediaDrawers-processed), .drawers li a:not(.mediaDrawers-processed)', context).addClass('mediaDrawers-processed').bind('click', function () {
// get the href id that we want to display
var display_id = $(this).attr('href');
// this handles the LI click
if (display_id == undefined) {
var display_id = $(this).children('a').attr('href');
}
// we need to get the tab page that this drawer is in
var parent = $(this).parents('.ui-tabs-panel').attr('id');
// hide current active drawer display
$('#'+parent+' .drawer.display.active').removeClass('active').hide();
// set any drawers to not active
$('#'+parent+' .drawers li.active').removeClass('active');
// make this drawer active
$(this).addClass('active');
// make the requested drawer display active
$(display_id).addClass('active').show();
});
};
/**
* We need to hide any form elements that were replaced by the media browser
* form, activate the add button, and hide the browser.
*/
Drupal.behaviors.mediaBrowserHide = function (context) {
// Hide our file progress indicators.
$('.media-browser-file-progress:not(.mediaBrowserHide-processed)', context).addClass('mediaBrowserHide-processed').attr('style', 'display:none');
$('.media-browser-metadata-wrapper:not(.mediaBrowserHide-processed)', context).addClass('mediaBroswerHide-processed').hide();
$('.media-browser-drawer-select:not(.mediaBrowserHide-processed)', context).addClass('mediaBroswerHide-processed').attr('style', 'display:none');
$('.media-browser-metadata-submit:not(.mediaBrowserHide-processed)', context).addClass('mediaBroswerHide-processed').attr('style', 'display:none').each(function() {
$(this).click(function() {
$(this).hide().siblings('.media-browser-metadata-wrapper').slideUp();
});
});
// Add behavior to our big red activation button.
$('.media.browser.activation:not(.mediaBrowserHide-processed)', context).addClass('mediaBrowserHide-processed').each(function () {
// Hide the browser associated with this button.
$(this).next('.media.browser').hide();
$(this).click(function () {
// When clicking, show the browser and hide this button.
$(this).next('.media.browser').slideDown('slow');
$(this).slideUp();
});
});
};
/**
* Generate a MD5 hash of the file being uploaded
*/
Drupal.behaviors.mediaGenerateMD5 = function (context) {
// Get the value from the file field.
$('#edit-field-file-media-media-tabs-tab-Addfiles-media-upload-resource-Newfile-resource-form-media-upload-upload:not(.mediaGenerateMD5-processed)', context).addClass('mediaGenerateMD5-processed').change(function () {
// Add the MD5 hash from the file name to the upload URL.
Drupal.settings['ahah']['edit-attach']['url'] += '/'+$.md5($(this).val());
// @TODO: Now add the MD5 value to the meta data form.
alert(Drupal.settings['ahah']['edit-attach']['url']);
});
};
Drupal.behaviors.mediaAhahHideBrowser = function (context) {
$('.media-browser-submit:not(.mediaAhahHideBrowser-processed)', context).addClass('mediaAhahHideBrowser-processed').each(function() {
$(this).bind('click', function() {
$(this).hide().siblings('.ui-tabs-panel, ul').slideUp();
$(this).siblings('.media-browser-file-progress').show();
$(this).siblings('.media-browser-metadata-wrapper').show();
$(this).siblings('.media-browser-metadata-submit').show();
});
});
};
/* $Id$ */
/**
* @file
* This provides the basic styling for the media browser elements
*/
/* Style the show media browser link */
.media.browser.activation{
width: 112px;
border: 1px solid #999999;
padding: 5px 10px;
background-color: #cc3355;
color: #ffffff;
cursor: pointer;
}
.media.browser,
.media-browser-metadata-wrapper {
border: 1px solid #999999;
padding: 5px;
}
/* push the tabs further right */
.media.browser ul.tabs {
margin: 0px 0px -8px 120px;
}
/* style the pane which contains the drawers and drawer data */
.media.browser .drawer.display{
min-height: 300px;
}
/* style the left hand drawers */
.media.browser .browser.drawers ul.drawers {
margin: 0;
}
.media.browser .browser.drawers ul.drawers li{
background-color: #999999;
background-image: none;
border: 1px solid #999999;
clear: left;
float: left;
height: 30px;
list-style: none;
margin: 5px 0px 3px;
padding: 5px 10px 5px 10px;
width: 90px;
line-height: 1.2;
}
.media.browser .ui-tabs-panel .item-list ul li a {
color: #ffffff;
}
/* push the drawers down */
.media.browser .ui-tabs-panel .item-list ul li.first{
margin-top: 20px;
}
/* style the active drawer */
.media.browser .browser.drawers ul.drawers li.active{
background-color: #ffffff;
border-right: none;
width: 91px;
}
.media.browser .ui-tabs-panel .item-list ul li.active a {
color: #000000;
}
/* style the display of the drawer */
.media.browser .drawer.display {
border: 1px solid #999999;
margin-left: 111px;
padding: 0px 10px 10px 20px
}
.media-browser-file-progress {
clear: both;
}
\ No newline at end of file
<?php
// $Id$
/**
* @file
*
* Install, update and uninstall functions for the Media module.
*/
\ No newline at end of file
......@@ -6,10 +6,69 @@
*/
/**
* This handles the activation of drawers on the media browser form
* @TODO make this a drupal behavior
*/
$(document).ready( function () {
// get the list of form elements that need to be hidden
// hide the display information on page load
$('.media.browser.display').each(function() {
$(this).hide();
});
// Activate drawers when the page loads
$('.media.browser .ui-tabs-panel .drawers .item-list li.first').addClass('active');
// Activate displays when the page loads
$('.media.browser .ui-tabs-panel .display.first').addClass('active').show();
// now we need to bind click functionality on drawers to display
$('.media.browser .ui-tabs-panel .drawers .item-list ul li, .drawers li a').bind('click', function () {
// get the href id that we want to display
// is this an a element?
var display_id = $(this).attr('href');
if (display_id == undefined) {
var display_id = $(this).children('a').attr('href');
}
// we need to get the container that this drawer is in
var parent = $(this).parents('.ui-tabs-panel').attr('id');
// hide current active display
$('#'+parent+' .display.active').removeClass('active').hide();
// set any drawers to not active
$('#'+parent+' .drawers li.active').removeClass('active');
// make this drawer active
$(this).addClass('active');
// make the correct display active
$(display_id).addClass('active').show();
});
});
/**
* we need to hide any form elements that were replaced by the media browser form
* activate the add button, and hide the browser
*/
$(document).ready(function () {
$('.media.replace').hide();
$('.media.browser.activation').each(function () {
$(this).next('.media.browser').hide();
$(this).click(function () {
$(this).next('.media.browser').slideDown('slow');
$(this).slideUp();
});
});
});
\ No newline at end of file
/**
* This handles passing the current file data from the media browser
* to the formater function and returns the correct form elements
*/
$(document).ready(function () {
});
\ No newline at end of file
This diff is collapsed.
<?php
// $Id$
/**
* @file
* Media AHAH
*
* AHAH functions for the Media module.
*/
/**
* This function builds the form elements for the file formater based
* on the node type and field for settings and the file extension to get the
* formatters.
*
* @param string $registration_id
* The id of the registration creating this formatter.
* @param string $node_type
* The kind of node.
* @param string $field
* The machine name of the field being operated on.
* @param string $uri
* (optional) The uri to the item, or file://path if it is being uploaded.
* @param string $file_extension
* (optional) The kind of file that will be operated on.
*/
function media_ahah_formatter_load() { //$registration_id, $node_type, $field, $uri = NULL, $file_extension = NULL) {
// The form is generated in an include file which we need to include manually.
include_once 'modules/node/node.pages.inc';
// We're starting in step #3, preparing for #4.
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
// Step #4.
$form = form_get_cache($form_build_id, $form_state);
// Preparing for #5.
$args = $form['#parameters'];
$form_id = array_shift($args);
$form_state['post'] = $form['#post'] = $_POST;
$form['#programmed'] = $form['#redirect'] = FALSE;
// Step #5.
drupal_process_form($form_id, $form, $form_state);
// Step #6 and #7 and #8.
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
// Do whatever we need here for Step #9.
// ...
drupal_set_message('media_ahah_formatter_load can add anything here (if necessary).');
// Step #10: Output any drupal messages and the new form.
$media_tabs = $form[$field]['media']['media_tabs'];
$output = theme('status_messages') . drupal_render($media_tabs);
// Ensure any changes to Drupal.settings js are preserved.
$javascript = drupal_add_js(NULL, NULL, 'header');
// Final rendering callback.
drupal_json(array(
'status' => TRUE,
'data' => $output,
'settings' => call_user_func_array('array_merge_recursive', $javascript['setting']),
));
}
/**
* TODO: Document
*/
function media_ahah_metadata_ahah() {
// The form is generated in an include file which we need to include manually.
include_once 'modules/node/node.pages.inc';
// We're starting in step #3, preparing for #4.
$form_state = array('storage' => NULL, 'submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
// Step #4.
$form = form_get_cache($form_build_id, $form_state);
// Preparing for #5.
$args = $form['#parameters'];
$form_id = array_shift($args);
$form_state['post'] = $form['#post'] = $_POST;
$form['#programmed'] = $form['#redirect'] = FALSE;
// Step #5.
drupal_process_form($form_id, $form, $form_state);
// Step #6 and #7 and #8.
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
// Do whatever we need here for Step #9.
// ...
drupal_set_message('final submission: media_ahah_metadata_ahah can do something here, maybe display a new add file form?');
// Step #10: Output any drupal messages and the new form.
$media_tabs = $form[$field]['media']['media_tabs'];
$output = theme('status_messages') . drupal_render($media_tabs);
// Ensure any changes to Drupal.settings js are preserved.
$javascript = drupal_add_js(NULL, NULL, 'header');
// Final rendering callback.
drupal_json(array(
'status' => TRUE,
'data' => $output,
'settings' => call_user_func_array('array_merge_recursive', $javascript['setting']),
));
}
\ No newline at end of file
<?php
// $Id$
/**
* This function builds the form elements for the file formater based
* on the node type and field for settings and the file extension to get the formaters
* @param string $node_type
* the kind of node
* @param string $field
* the machine name of the field being operated on
* @param string $uri
* the uri to the item, or file://path if it is being uploaded
* @param string $file_extension
* the kind of file that will be operated on
*/
function media_ajax_formater_load($node_type, $field, $uri = 'file://', $file_extension) {
// we need to check the adminstrative settings for this
// node tyi
}
<?php
// $Id$
/**
* TODO: Unit tests
*/
\ No newline at end of file
<?php
// $Id$
/**
* @file
* This file contains the admin functions for the Media module.
*/
/**
* Provide per content type settings.
*
* @param array &form
* A form structured array.
* @param string $type_name
* A string representing the content type.
* @return
* Nothing is returned.
*/
function media_settings_content_type(&$form, $type_name = NULL) {
$form['media'] = array(
'#type' => 'fieldset',
'#title' => t('Media settings'),
'#collapsible' => 'true',
'#collapsed' => 'true',
);
$type = _media_content_field_types($type_name);
// Master settings override.
$form['media']['media_'. $type_name .'_override'] = array(
'#title' => t($type["name"] .' overrides default values'),
'#type' => 'checkbox',
'#description' => t('Override the default settings for this content type. The options below will only be used if this box is checked.'),
'#default_value' => variable_get('media_'. $type_name .'_override', NULL),
);
$form['media']['media_'. $type_name .'_enabled'] = array(
'#title' => t('Enable Media resource browser'),
'#type' => 'checkbox',
'#description' => t('Enable the Media resource browser for this node type.'),
'#default_value' => variable_get('media_'. $type_name .'_enabled', NULL),
);
// Extract the fields for this node type
foreach ((array)$type['fields'] as $field_name => $field) {
// Create the field identifier
$form['media'][$field['field_name']] = array(
'#type' => 'fieldset',
'#title' => t('Field name: !name', array('!name' => $field['widget']['label'])),
'#collapsible' => 'true',
);
// Build a form for each type of module that we have
foreach (media_registration_kinds() as $kind) {
// Get all the kinds that match this field
if ($registrations = media_get_fields($field['type'], $kind)) {
$options = array();