
/* Making it possible to style <abbr> in IE6.
 *
 * My theory is that it have a list of elements that it apply styles to, some
 * elements is for some reason not included on this list; but I think it will
 * add to the list when running a createElement on the DOM--notice that it does
 * not need to be applied as a child to anything--so this is a very harmless
 * fix; because the code is totally valid!
 */
document.createElement('abbr');

var $Y = (function(){
    return {
        'SELECT' : YAHOO.util.Selector.query,
        'EVENT' : YAHOO.util.Event,
        'DOM' : YAHOO.util.Dom
    };
}());


/* =========================================================================
 * =                                                                       =
 * ========================================================================= */
 var progress = function(){
     /* Private variables ******************************************/

     var settings = {
           /* It will not advance if this is set to 0 (zero) 
            * time is set in milliseconds, remember 60000 is 1 min */
             resetTimer : (60000 * 0.25) 
         },

         /* storage of the meter objects */
         meters = [],
         
         /* remember when to fire next and the current timeout id */
         timer = { set: null, uid: null },


     /* Private methods ********************************************/
     
     /** 
      * getDate 
      *
      * Convert the ISO 8601-date to an javascript date object,
      * and then return the unix-time. The input shall be a dom-node
      * with mark-up using microformat datetime-design-pattern
      * http://microformats.org/wiki/datetime-design-pattern
      *
      * @param  node   dom node containing a microformat date
      * @return number time, represented in unix-time
      */
     getDate = function( node ){
         if(typeof node === 'undefined'){ return false; };

         var d = node.getAttribute('title').replace(/\D/g,' ').split(' ');

         return new Date(d[0], (d[1]-1), d[2], d[3], d[4], d[5]).getTime();
     },

     /** 
      * resetTimer
      *
      * Wrapper for the javascript setTimeout method, this removes
      * no longer needed timers, and call the advance-method whenever
      * it is suitable
      *
      * @return null
      */
     resetTimer = function(){
         if( typeof timer.set === 'number' && meters.length > 0){ 
             if (typeof timer.uid == 'number'){ 
                 window.clearTimeout( timer.uid ); 
             }
             timer.uid = setTimeout('progress.advance()', timer.set);
         }
     },
     
     setPosition = function( node, position ){
         YAHOO.util.Dom.setStyle(
             node,
             'background-position',
             100-position+'% 0'
         );                    
     },
     
     /** 
      * advance
      *
      * Moves the background image of a dom element, visualising the
      * the duration of en event; progressbar-style.
      *
      * @param n if input is an int, it will only touch that element
      *          (in that case n is the index of an element in the 
      *          meters array) otherwise it will advance all the 
      *          meters in the poll
      * @return  null
      */
     advance = function( n ){

         var now = new Date().getTime(),
             resetTime = null,
             el = ( typeof n === 'number' );

         for(var i = (el ? n : 0), l = meters.length; i < l; i++){

             if( now < meters[i].e && now > meters[i].s ){
                 /* the event is on right now */
                 setPosition(
                     meters[i].dom,
                     (now - meters[i].s) / (meters[i].e - meters[i].s) * 100
                 );

                 var temp = now + settings.resetTimer;

                 if( timer.set > meters[i].e - temp && meters[i].e - temp <= 0 ){
                     resetTime = meters[i].e - now;
                 }
             } 
             else if ( meters[i].s < now ) {
                 /* The event is over, find next in list! */
                 var oldEl = meters[i].dom;
                 var newEl = YAHOO.util.Dom.getNextSibling(meters[i].dom);

                 if( newEl !== null ){
                     /* found a event */
                     YAHOO.util.Dom.removeClass(oldEl, 'current');
                     YAHOO.util.Dom.addClass(newEl, 'current');

                     var data = fetch( newEl );

                     if( data && typeof data.s === 'number' && typeof data.e === 'number' ){
                         meters[i] = data;
                     }
                 }
                 else { 
                     /* no event found! */
                     setPosition( oldEl, 100 );
                     oldEl.innerHTML = 'slut!';
                     meters[i] = undefined; /* set for deletion */
                 }
             } else {
                 /* event is first in line, but is not started yet
                  * setting the timer to fire when the event start
                  */
                 if(meters[i].s - temp < timer.set){
                     timer.set = meters[i].s - temp;
                 }
             }
             
             if( el ) break;
         }

         /* prepare for next advance, if it is set for repeating */
         if( settings.resetTimer !== 0 ) { 
             /* find the next reset time, */
             timer.set = typeof resetTime === 'number' 
                 ? resetTime 
                 : settings.resetTimer;

             /* remove elements set for deletion */
             var temp = [];
             for(i = 0, l = meters.length; i <= l; i++){
                 if(typeof meters[i] === 'object') temp.push(meters[i]);
             }
             meters = temp;
         
             /* set timer */
             resetTimer(); 
         }
     },

     /**
     * Fetch
     *
     * Get the event data from the mark-up. The mark-up should follow
     * the hCalendar microformat, using at least the dtstart-, dtend-
     * and summary-classes. Read more about hCalendar here
     * http://microformats.org/wiki/hcalendar
     *
     * @param  node   DOM node, containing an microformated vevent
     * @return object ( 
     *     dom : dom-node, 
     *     s : start time of the event (unixtime) 
     *     e : end time of the event (unixtime)
     *   )
     */
     fetch = function( node ){
         // return if no valid data
         if( !YAHOO.util.Dom.hasClass(node, 'vevent') ){ return; }
         // start time
         var s = getDate(YAHOO.util.Dom.getElementsByClassName(
                     'dtstart', 
                     'abbr', 
                     node)[0]
                 );
         // end time
         var e = getDate(YAHOO.util.Dom.getElementsByClassName(
                     'dtend', 
                     'abbr', 
                     node)[0]
                 );

         return { 'dom' : node, 's' : s, 'e' : e };
     };


     /* Public variables *******************************************/
     return {
         /**
         * add
         *
         * add a progress bar to the poll
         
         * @param   node  
         * @return  boolean
         */
         add : function( node ){ 

             var data = fetch( node );
             
             if( typeof data.s === 'number' && typeof data.e === 'number' ){ 
                 meters.push( data );
                 // advance the meter we just added
                 advance( meters.length - 1 );

                 return true;
             }

             return false;
         },
         advance : advance
     };
 }();



 /* ======================================================================
  * = Image galleries                                                    =
  * ======================================================================*/
var imageGalleryLauncher = function(node){
    this.node = node;
    this.addClickHandlers();
};

imageGalleryLauncher.prototype.openGallery = function(e){
    YAHOO.util.Event.preventDefault(e);

    var target = YAHOO.util.Event.getTarget(e),
        galleryLink = target.tagName.toUpperCase() !== 'A'
            ? $Y.DOM.getAncestorByTagName(target,'a')
            : target;

    window.open(''+galleryLink.href,'gallery','width=1018,height=940,location=no, menubar=no, resizable=no, titlebar=yes, toolbar=no, status=no, directories=no, channelmode=no, scrollbars=no');

    return false;
};

imageGalleryLauncher.prototype.addClickHandlers = function(){

    $Y.EVENT.addListener(
        $Y.SELECT('.title a', this.node),
        'click', 
        this.openGallery
    );
      
};



YAHOO.util.Event.onDOMReady(function(){

    var tabbox = new xoxoTabBox(document.getElementById('content-statistics'));

    YAHOO.util.Dom.getElementsByClassName(
        'current', 
        'li', 
        'content-tvtid-onair',
        progress.add
    );

    var imageGallery = new imageGalleryLauncher('content-images');
});


