// -*-java-*-
//
// sternenschnee.js
//
// Part of Sternenfall (http://www.sternenfall.de).
//
// Programmiert nach einem Skript das auf webdeveloper.earthweb.com gefunden
// wurde.
//
// Copyright 2006
// 
////////
// Author: Andreas Spindler
// $Writestamp: 2006-05-31 13:29:24 SpindleA$
//

/////////////////////////////////////////////////////////////////////////////
// Konfiguration.
//
var g_ss_gif = "sternenschnee1.gif";
var g_ss_gif_breite = 20;       // Breite eines Sterns.
var g_ss_gif_hoehe = 20;        // Höhe eines Sterns.
var g_ss_gif_phasen = 4; // Anzahl Stationen eines einzelnen Sterns in g_ss_gif

// Aufruf des Threadfunktion alle n Millisekunden; eine Schleife.
var g_ss_intervall = 35;

// Minimale/maximale Sprungdistanz in Pixel eines Sterns pro Schleife.  Die
// eigentliche Distanz wird dann zufällig pro Stern ermittelt.
var g_ss_sprung_min = 1;
var g_ss_sprung_max = 4;

// Minimale/maximale Anzahl der Schleifen pro Stern.  Diese Zahl wird zufällig
// ermittelt.  Die Anzahl der tatsächlich zurückgelegten Pixel pro Stern ist
// gleich dieser Zahl mal der Sprungdistanz.
var g_ss_schleifen_min =  20;
var g_ss_schleifen_max = 150;

// Anzahl sichtbarer Sterne auf dieser Seite
var g_ss_anzahl = zufall( 8, 16 );

/////////////////////////////////////////////////////////////////////////////
// Hauptfunktionen.
//

var g_ss = new Array( g_ss_anzahl );
var g_ss_pseudo_thread = null;
var g_ss_neuer_stern_zaehler = 0;
var g_prev_pos = new Array(2);

var g_ss_ie_layers = (document.all) ? true : false;
var g_ss_ns_layers = (document.layers) ? true : false;

var g_ss_aktiviert = (g_ss_ie_layers || g_ss_ns_layers);

if( g_ss_aktiviert ) {
    for( var i = 0; i < g_ss_anzahl; i++ ) {
        g_ss[i] = new Array( 7 );
        ss_init(i);
        document.writeln
            ( g_ss_ie_layers ?
              '<div id="' + g_ss[i][4] + '" style="position:absolute; width:'
              + g_ss_gif_breite + 'px; height:'
              + g_ss_gif_hoehe + 'px; visibility:hidden;"><img src="'
              + g_ss_gif + '" border=0></div>'
              :
              g_ss_ns_layers ?
              '<layer id="' + g_ss[i][4] + '" position="absolute" width='
              + g_ss_gif_breite + ' height='
              + g_ss_gif_hoehe + ' visible="hide"><img src="'
              + g_ss_gif + '" border=0></layer>'
              :
              "" );
    }
}

function sternenschnee()
{
    // Pseudo-Threadfunktion um die vom Mauszeiger fallenden Sterne zu
    // animieren.
    for( var i = 0; i < g_ss_anzahl; i++ ) {
        if( g_ss[i][2] > 0 ) {  // Schleifenzähler des Sterns
            g_ss[i][1] += g_ss[i][5];
            g_ss[i][2]--;
            g_ss[i][3] =
                Math.ceil(( g_ss[i][2] * g_ss_gif_phasen ) / g_ss[i][6] );
            if( g_ss[i][1] >= window_size()[1] + scrolling_offset()[1] ) {
                ss_loeschen( i ); // Stern fiel unter den unteren Fensterrand
            } else {
                ss_fallen( i ); // Stern weiter fallen lassen.
            }
        } else {
            ss_loeschen( i );   // Schleife des Sterns ist zu Ende
        }
    }

    // Alle n Läufe neuen Stern erzeugen - aber nur wenn die Maus bewegt wurde.
    //
    // Siehe auch http://www.webreference.com/js/tips/991129.html für die
    // Cursor-Namen.
    //
    // TODO: Cursor-Erkennung funktioniert nicht.  Eigentlich sollten nur neue
    // Sterne erzeugt werden wenn diese Cursor nicht aktiv sind!
    //
    var cursor = document.body.style.cursor;
    var is_extra_cursor = (cursor == "text" ||
                           cursor == "move" ||
                           cursor == "crosshair" ||
                           cursor == "wait" ||
                           cursor == "help"); 
    
    if(!is_extra_cursor ) {
        if( Math.abs( g_prev_pos[0] - g_mouse_pos[0] ) >= 4 || 
            Math.abs( g_prev_pos[1] - g_mouse_pos[1] ) >= 4 ) {
            // Am rechten Rand nichts mehr erzeugen.  Die Konstante steht für
            // die Breite der vertikalen Scrollbar.
            if( g_mouse_pos[0] < window_size()[0] + scrolling_offset()[0] - 20 ) {
                if( g_ss_neuer_stern_zaehler++ >= 0 ) {
                    g_ss_neuer_stern_zaehler = 0;
                    ss_neuer_stern();
                }
                g_prev_pos[0] = g_mouse_pos[0];
                g_prev_pos[1] = g_mouse_pos[1];
            }
        }
    }
}

function sternenschnee_beginnen()
{
    if( g_ss_aktiviert ) {
        g_ss_pseudo_thread = setInterval( "sternenschnee()", g_ss_intervall );
        g_prev_pos[0] = 0;
        g_prev_pos[1] = 0;
    }
    // if (g['debug']) print_setup();
}

function sternenschnee_beenden()
{
    if( g_ss_pseudo_thread != null ) {
        clearInterval( g_ss_pseudo_thread );
        g_ss_pseudo_thread = null;
    }
}

/////////////////////////////////////////////////////////////////////////////
// Hilfsfunktionen.
//

function ss_init(i)
{
    g_ss[i][0] = 0;             // x Position
    g_ss[i][1] = 0;             // y Position
    g_ss[i][2] = 0;
    g_ss[i][3] = g_ss_gif_phasen;
    g_ss[i][4] = "sternenschnee_" + i;
    g_ss[i][5] = zufall( g_ss_sprung_min, g_ss_sprung_max );
    g_ss[i][6] = zufall( g_ss_schleifen_min, g_ss_schleifen_max );
}

function ss_neuer_stern()
{
    var temp = g_ss[ g_ss_anzahl - 1 ][4];
    for( var i = g_ss_anzahl - 1; i > 0; i-- ) {
        g_ss[i][0] = g_ss[i-1][0];
        g_ss[i][1] = g_ss[i-1][1];
        g_ss[i][2] = g_ss[i-1][2];
        g_ss[i][3] = g_ss[i-1][3];
        g_ss[i][4] = g_ss[i-1][4];
        g_ss[i][5] = g_ss[i-1][5];
        g_ss[i][6] = g_ss[i-1][6];
    }

    ss_init(0);
    g_ss[0][0] = g_mouse_pos[0] + 2;
    g_ss[0][1] = g_mouse_pos[1] + 4;
    g_ss[0][2] = g_ss[i][6];
    g_ss[0][4] = temp;
}

function ss_fallen( i )
{
    var obj = g_ss[i][4];
    var x = g_ss[i][0], y = g_ss[i][1];
    var phase = g_ss[i][3];
    var gif_top = ( g_ss_gif_phasen - phase ) * g_ss_gif_hoehe;
    if( g_ss_ie_layers ) {
        document.all[obj].style.clip =
            "rect("+gif_top +" "+ g_ss_gif_breite +" "+ (gif_top+g_ss_gif_hoehe)+" 0)";
        document.all[obj].style.left = x;
        document.all[obj].style.top = y - gif_top;
        document.all[obj].style.visibility = "visible";
    } else if( g_ss_ns_layers ) {
        document.layers[obj].clip.top = gif_top;
        document.layers[obj].clip.bottom = gif_top + g_ss_gif_hoehe;
        document.layers[obj].left = x;
        document.layers[obj].top = y - gif_top;
        document.layers[obj].visibility = "show";
    }
}

function ss_loeschen( i )
{
    if( g_ss[i] != -1 ) {       // Schleifenzähler
        var obj = g_ss[i][4];   // Name des Layers
        if( g_ss_ie_layers ) {
            document.all[obj].style.visibility = "hidden";
        } else if( g_ss_ns_layers ) {
            document.layers[obj].visibility = "hide";
        }
        g_ss[i][2] = -1;
    }
}
