
  /**
   *
   */

    var Archive = new Class( {
        Implements: Options,

        options : {
            days   : ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
            months : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
            offset : 0,
            target : null
        },

        calendar : null,
        date     : null,
        original : null,

        initialize: function( options ) {
            this.setOptions( options );

            if ( this.options.target && $defined( this.options.target ) ) {
                var date = $( this.options.target ).get( 'dir' ) || null;

                if ( date && /(19|20)[0-9]{2}[-\/.](0[1-9]|1[012])[-\/.](0[1-9]|[12][0-9]|3[01])/.test( date ) ) {
                    this.original = date.replace( /[-]/g, '/' );
                }
            }

            this.navigate( );
        },

        caption : function ( date ) {
            var caption = new Element ( 'caption' );
            var prev = new Element ( 'a' ).addClass( 'prev' ).adopt( new Element ( 'img', { src : icons + 'left.gif' } ) ); // <<
            var next = new Element ( 'a' ).addClass( 'next' ).adopt( new Element ( 'img', { src : icons + 'right.gif' } ) ); // >>

            prev.addEvent( 'click', function ( ) {
                $( this.options.target ).set( 'lang', date.getPrev( ) );
                this.navigate( );
            }.pass( date, this ) ).injectInside( caption );

            caption.adopt( new Element( 'span' ).addClass( 'month' ).appendText( this.options.months[ date.month ] ) );
            caption.adopt( new Element( 'span' ).addClass( 'year' ).appendText( date.year ) );

            next.addEvent( 'click', function ( ) {
                $( this.options.target ).set( 'lang', date.getNext( ) );
                this.navigate( );
            }.pass( date, this ) ).injectInside( caption );

            return caption;
        },

        display : function ( ) {
            // --- Variables ---------------------------------------------------
            var link      = '{domain}hemeroteca/{date}/{url}.htm';
            var published = [ ];
            var week      = 7;
            var dayName   = this.options.days;
            var dayStart  = this.options.offset;
            var date = {
                year     : this.date.getFullYear( ),
                month    : this.date.getMonth( ),
                day      : this.date.getDate( ),
                original : this.original,
                getDate  : function ( separator ) {
                    var month     = ( this.month + 1 );

                    separator = separator || '-';

                    return this.year + separator +
                    ( month < 10 ? '0' + month : month ) + separator +
                    ( this.day < 10 ? '0' + this.day : this.day );
                },
                getNext  : function ( ) {
                    var next  = new Date( this.year, ( this.month + 1 ), 1 );
                    var month = next.getMonth( ) + 1;
                    var day   = next.getDate( );

                    return next.getFullYear( ) + '-' +
                    ( month < 10 ? '0' + month : month ) + '-' +
                    ( day < 10 ? '0' + day : day );
                },
                getPrev  : function ( ) {
                    var prev  = new Date( this.year, this.month, 0 );
                    var month = prev.getMonth( ) + 1;
                    var day   = prev.getDate( );

                    return prev.getFullYear( ) + '-' +
                    ( month < 10 ? '0' + month : month ) + '-' +
                    ( day < 10 ? '0' + day : day );
                }
            }

            this.calendar.empty( );

            // --- Table -------------------------------------------------------
            var table = new Element ( 'table' ).inject( this.calendar ).adopt( this.caption( date ) );
            var thead = new Element ( 'thead' ).injectInside( table );
            var tr    = new Element ( 'tr' ).injectInside( thead );

            // --- Header ------------------------------------------------------
            [ 0, 1, 2, 3, 4, 5, 6 ].each( function ( day ) {
                var text = dayName[ ( day + dayStart ) % 7 ];

                tr.adopt( new Element( 'th', { 'title' : text } ).appendText( text.substr( 0, 1 ) ) );
            } );

            // --- Calendar ----------------------------------------------------
            var tbody = new Element ( 'tbody' ).injectInside( table );

            var first = new Date( date.year, date.month, 1 );
            var last  = new Date( date.year, ++date.month, 0 ).getDate( );
            var prev  = new Date( date.year, --date.month, 0 ).getDate( );
            var start = ( ( ( first.getDay( ) - dayStart ) + week ) % week );
            var days  = ( Math.ceil( ( start + last ) / week ) * week );

            // --- Publish -----------------------------------------------------
            new Request.JSON( {
                url : domain + 'json/archive-calendar',
		method : 'post',

                onSuccess : function ( transport ) {
                    if ( transport ) {
                        published = transport;
                    }

                    for( var day = 1; day <= days; day++ ) {
                        if ( ( ( day - 1 ) % week ) === 0 ) {
                            tr = new Element( 'tr' ).injectInside( tbody );
                        }

                        var current = ( day - start );
                        var td = new Element( 'td' ).injectInside( tr );

                        if ( current < 1 ) {
                            td.set( 'text', ( prev + current ) );
                        } else if ( current > last ) {
                            td.set( 'text', ( current - last ) );
                        } else {
                            td.addClass( ( ( published[ current ].Date === date.original ) ? 'current' : 'day' ) );

                            if( $defined( published[ current ].Day ) && published[ current ] ) {
                                new Element( 'a', {
                                    href : link.substitute( {
                                        'domain' : domain,
                                        'date'   : published[ current ].Date,
                                        'url'    : published[ current ].URL
                                    } ),
                                    title : published[ current ].News + ' noticias',
                                    text : current
                                } ).inject( td );
                            } else {
                                td.set( 'text', current );
                            }
                        }
                    }
                }
            } ).post( { 'date' : date.getDate( ) } );
        },

        navigate : function ( ) {
            if ( this.options.target && $defined( this.options.target ) ) {
                this.calendar = $( this.options.target );

                var date = this.calendar.get( 'lang' ) || null;

                if ( date && /(19|20)[0-9]{2}[-\/.](0[1-9]|1[012])[-\/.](0[1-9]|[12][0-9]|3[01])/.test( date ) ) {
                    date = date.split( /[-\/.]/ );

                    this.date = new Date ( date[ 0 ], --date[ 1 ], date[ 2 ] );
                }
            }

            if ( this.date && this.calendar ) {
                this.display( );
            }
        }
    } );

    window.addEvent( 'domready', function ( ){
        new Archive ( {
            target : 'Archive',
            days   : [ 'Domingo', 'Lunes', 'Martes', 'Miercoles', 'Jueves', 'Viernes', 'Sabado' ],
            months : [ 'Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre' ],
            offset : 1
        } );
    } )

