function new_xhr() {

    var req = false; 
    
    if ( window.XMLHttpRequest ) {
        // This is for good browsers
        req = new XMLHttpRequest();
    } else if ( window.ActiveXObject ) {
        // MS type 1
        req = new ActiveXObject("Msxml2.XMLHTTP");
        if ( ! req ) {
            // MS type two
            req = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
 
    this.req = req;
    this.callback = function() {};
    this.status = function() { return this.req.status; }
}


function data_grabber( x ) {
    if ( x.req.readyState == 4 ) {
        switch ( x.req.status ) {

            case 200:
                document.getElementById('fb').innerHTML = '';
                x.callback( x.req.responseText );
                break;

            case 404:
                document.getElementById('fb').innerHTML = 'Server resource not found!\n';
                break;

            case 500:
                document.getElementById('fb').innerHTML = 'Server error!\n';
                break;

            default:
                document.getElementById('fb').innerHTML = 'server status: ' + x.req.status + '\n' + 'reason: ' + x.responseText;
                break;

        }
    }
}


function in_array( array, candidate ) {
    var at = -1;

    for ( i = 0; i < array.length; i++ ) {
        if ( array[i] == candidate ) {
            at = i;
            break;
        }
    }

    return at;
}


function basename( filename ) {
    var re = new RegExp( /^.*\\|^.*\// );
    var result = filename.replace( re, '' );
    return result;
}


function update_uploaded_list( session ) {
        var uploaded_str = '';
        for ( i = 0; i < files.length; i++ ) {
            uploaded_str +=
                '<a href="#" onclick="delete_file( \''
                + files[i]
                + '\', \'' + session
                + '\' );">Delete</a>&nbsp;&nbsp;'
                + files[i]
                + '<br />\n';
        }

        document.getElementById('uploaded').innerHTML = uploaded_str;
}


function when_ready( s ) {

    if ( document.getElementById('ready').value == 1 ) {
        var fn = document.getElementById('current').value;
        var index = in_array( files, fn );
    
        if ( index == -1 ) {
            files.push( fn );
        }

        update_uploaded_list( s );
        document.getElementById('pct').innerHTML = 'Ready.\n';

    } else {
        setTimeout( function() { when_ready( s ) }, 1000 );    
    }

}


function get_status( s ) {
    var xhr = new new_xhr();
    xhr.req.open( "GET", "lib/status.pl?" + s, true );

    xhr.callback = function( x ) {
        if ( x == '' || x.substring( 0, 5 ) == 'Error' ) {
            setTimeout( 'get_status( document.getElementById(\'form0\').session.value  )', 4000 );
	    } else {
		
	        var info = x.split( '\n' );
            var sTime = info[0];
            var cTime = info[1];
            var tBytes = info[2];
            var cBytes = info[3];
            var cPct = info[4];
		    
            if ( tBytes == cBytes ) {
                document.getElementById('pct').innerHTML = 'Processing...';
	            document.getElementById('meter').style.width = '0px';
                document.getElementById('meter_box').style.display = 'none';

                when_ready( s );    
                delete_session( s );

            } else {
                document.getElementById('pct').innerHTML = cPct;
                document.getElementById('meter').style.width = Math.floor( cPct ) * 2 + 'px';
                document.getElementById('meter_box').style.display = 'block';
                setTimeout( 'get_status( document.getElementById(\'form0\').session.value )', 4000 );
            }
        }
    }

    xhr.req.onreadystatechange = function() { data_grabber(xhr); } 
    xhr.req.send();
}



function delete_file ( f, s ) {
    var xhr = new new_xhr();
    xhr.req.open( "GET", "lib/delete_file.pl?f=" + f + '&amp;s=' + s, true );
    xhr.callback = function( x ) {
        if ( x == '1' ) {
            var index = in_array( files, f );
            files.splice( index, 1 );
            update_uploaded_list( s );            
        } else {
            document.getElementById('fb').innerHTML = 'Could not delete file.';
        }
    }
    xhr.req.onreadystatechange = function() { data_grabber( xhr ); }
    xhr.req.send();

    return false;
}


function delete_session( s ) {
    var xhr = new new_xhr();
    xhr.req.open( "GET", "lib/del_session.pl?" + s, true );
    xhr.callback = function() {}
    xhr.req.onreadystatechange = function() { data_grabber( xhr ); } 
    xhr.req.send();
}

function do_submit() {

    var s = document.getElementById('form0').session.value;
    var f = basename( document.getElementById('frame0').contentWindow.document.getElementById('form1').file.value ); 
    
    if ( f != '' ) {

        var index = in_array( files, f );
        if ( index > -1 ) {
            alert( 'You have already uploaded this file.\nYou must delete it before uploading a newer version of it.' );
            
        } else {
        
            document.getElementById('ready').value = 0;
            document.getElementById('current').value = '';
            document.getElementById('frame0').contentWindow.document.getElementById('form1').action = 'lib/ul.pl?' + s;
            document.getElementById('frame0').contentWindow.document.getElementById('form1').session.value = s;
            document.getElementById('frame0').contentWindow.document.getElementById('form1').submit();
            get_status( s );

        }
    }

    return false;
}


function get_session() {

    var xhr = new new_xhr();
    xhr.req.open( "GET", "lib/get_session.pl", true );
    xhr.callback = function( x ) { document.getElementById('form0').session.value = x; }
    xhr.req.onreadystatechange = function() { data_grabber( xhr ); }
    xhr.req.send();

}

var session = new String();
var files = new Array();
