/**
 * Javascript utility class
 * 
 * @version 0.1.0
 * @author gERD Schaufelberger
 * @package Lena
 */
var Ute = new Object();

/**
 * Jump to page
 * 
 * @param object form element or child node
 * @param string value to set
 */
Ute["goto"] = function( form, value ) 
{
    while( typeof form.submit != "function" && form.parentNode ) {
        form    =   form.parentNode;
    }
    if( typeof form.submit != "function" ) {
        return false;
    }
    form["goto"].value = value;
    form.submit();
    return false;
};

/**
 * Participate in II Browserwar
 * 
 * Swap elements containing browser stuff
 *
 * @param object el
 * @return bool always false
 */
Ute.browserWarSwap = function( el )
{
    var other;
    var buffer = '';
    if( el.id == "browserwar0" ) {
        other = $( "browserwar1" );
    } else {
        other = $( "browserwar0" );
    }
    
    buffer = other.innerHTML;
    Element.update( other, el.innerHTML );
    Element.update( el, buffer );
    
    // add mouse over effect
    other.setAttribute( "onMouseOver", el.getAttribute( "onMouseOver" ) );
    el.setAttribute( "onMouseOver", "" );
    return false;
};

/**
 * Focus on link
 *
 * @param object el
 * @return bool always false
 */
Ute.overLink = function( el )
{//
    if( typeof el.linkStat == "undefined" ) {
        el.linkStat = "init";
    }
    
    switch( el.linkStat ) {
        case "hidelater":
            Ute.removeTimeout( el, "linkTimeout" );
            el.linkStat = "visible";
            break;
            
        case "init":
        case "hidden":
            Ute.removeTimeout( el, "linkTimeout" );
            el.linkStat = "appearing";
            
            var o = {
                duration: 0.3,
                afterFinish: Ute.appearCallback.bind( el )
            };
            new Effect.BlindDown( el.firstChild.nextSibling, o );
            new Effect.BlindUp( el.firstChild, { duration: 0.3 } );
            break;
            
        default:
            return false;
            break;
    }
    
    return false;
};

/**
 * unfocus link
 *
 * @param object el
 * @return bool always false
 */
Ute.outLink = function( el )
{//
    if( typeof el.linkStat == "undefined" ) {
        el.linkStat = "init";
    }
    
    switch( el.linkStat ) {
        case "visible":
            Ute.removeTimeout( el, "linkTimeout" );
            el.linkStat = "hidelater"; 
            el.linkTimeout = window.setTimeout( function() { Ute.outLink( el ); }, 250 );
            break;
            
        case "hidelater":
            Ute.removeTimeout( el, "linkTimeout" );
            el.linkStat = "hiding"; 
            
            var o = {
                duration: 1.0,
                afterFinish: Ute.hideCallback.bind( el )
            };
    
            new Effect.BlindDown( el.firstChild, o );
            new Effect.BlindUp( el.firstChild.nextSibling, { duration: 1.0 } );
            break;
            
        case "appearing":
            Ute.removeTimeout( el, "linkTimeout" );
            el.linkTimeout = window.setTimeout( function() { Ute.outLink( el ); }, 1100 );
            break;
            
        default:
            return false;
            break;
    }
    return false;
};

/**
 * remove timeout from object
 *
 * @param object o any object
 * @param string n name of timeout property
 * @return bool true on success
 */
Ute.removeTimeout = function( o, n )
{//
    if( typeof o[n] == "undefined" || !o[n] ) {
        return true;
    }
    window.clearTimeout( o[n] );
    o[n]  =   null;
    return true;
};

/**
 * Things to be done after appear
 * 
 * Just set current link status to "visible"
 *
 * @param object o any object
 */
Ute.appearCallback = function( o )
{//
    this.linkStat = "visible";
};

/**
 * Things to be done after appear
 * 
 * Just set current link status to "hidden"
 *
 * @param object o any object
 */
Ute.hideCallback = function( o )
{//
    this.linkStat = "hidden";
};
