/* Revision: $Id: jquery.metadata.js 4187 2007-12-16 17:15:27Z joern.zaefferer $ */

(function($) {

$.extend({
  metadata : {
    defaults : {
      type: 'class',
      name: 'metadata',
      cre: /({.*})/,
      single: 'metadata'
    },
    setType: function( type, name ){
      this.defaults.type = type;
      this.defaults.name = name;
    },
    get: function( elem, opts ){
      var settings = $.extend({},this.defaults,opts);
      // check for empty string in single property
      if ( !settings.single.length ) settings.single = 'metadata';
      
      var data = $.data(elem, settings.single);
      // returned cached data if it already exists
      if ( data ) return data;
      
      data = "{}";
      
      if ( settings.type == "class" ) {
        var m = settings.cre.exec( elem.className );
        if ( m )
          data = m[1];
      } else if ( settings.type == "elem" ) {
        if( !elem.getElementsByTagName )
          return undefined;
        var e = elem.getElementsByTagName(settings.name);
        if ( e.length )
          data = $.trim(e[0].innerHTML);
      } else if ( elem.getAttribute != undefined ) {
        var attr = elem.getAttribute( settings.name );
        if ( attr )
          data = attr;
      }
      
      if ( data.indexOf( '{' ) <0 )
      data = "{" + data + "}";
      
      data = eval("(" + data + ")");
      
      $.data( elem, settings.single, data );
      return data;
    }
  }
});

$.fn.metadata = function( opts ){
  return $.metadata.get( this[0], opts );
};

})(jQuery);
