(function($){
    var readMarkup = function( method ) {
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.readMarkup' );
        }    
    };
    var markups =  ['data-markup'];    
    var methods = {
        init: function(options){
            return this.each(function(){
                var $this = $(this);
                $.each( $.fn.readMarkup.markups, function( index, markupName ){
                    try{
                        if( typeof $this.attr(markupName) == 'undefined' )  throw markupName+" not exist";
                        var original = $this.readMarkup( 'read', markupName );
                        var parsed  = $this.readMarkup( 'parse', original );
                        var values = { parsed : parsed, original : original};
                        $this.trigger(markupName+'.filter.readMarkup', [ values ] );
                        $this.trigger('filter.readMarkup', [ markupName, values ] );
                        $this.trigger(markupName+'.read.readMarkup', [ values.parsed, values.original ] );
                        $this.trigger('read.readMarkup', [ markupName, values.parsed, values.original ] );
                    }
                    catch(e){
                        $this.trigger(markupName+'.error.readMarkup', [ e ] );
                        $this.trigger('error.readMarkup', [ e, markupName ] );
                    } 
                });
            });
        },

        read: function( markupName ){return $(this).attr( markupName )},
        
        parse: function( value ){return ( new Function( "return " + value ))()},
        
        add: function( markupName ){
            methods.remove( markupName );
            markups.push( markupName );
        },
        
        remove: function( markupName ){
            for( var index = 0; index < markups.length; index++ ){
                if( markups[index] == markupName ){
                   markups.splice( index, 1 );
                }
            }
        },
        defaults: function(){
            return {
                triggers: {
                    'filter' : 'filter.readMarkup',
                    'read': 'read.readMarkup',
                    'error': 'error.readMarkup'
                }
            }
        }
    }
    readMarkup.methods = methods;
    readMarkup.markups =  markups;    
    $.readMarkup = $.fn.readMarkup = readMarkup;
})(jQuery);
