var STATE_KEY               = -1;
var STATE_VALIDATION        = 0;
var STATE_WAITING_SENDER    = 1;
var STATE_PROGRESS          = 2;
var STATE_CANCELING         = 3;
var STATE_COMPLETE          = 4;
var STATE_ERROR             = 5;

var downloadTx = null;
var fileName;
var currentState = STATE_KEY;
var startTime = 0;

function doFetch()
{
    startTime = (new Date()).getTime();
    setTimeout("getStatus()", 1000);

    var frm = document.createElement("IFRAME");
    frm.src = '/get.py?key=' + getKey();
    frm.width = 0;
    frm.height = 0;
    frm.style.visibility = 'hidden';
    document.getElementsByTagName("body")[0].appendChild(frm);
}

function download()
{
    startTime = 0;
    fileName = '';

    onBeforeDownload();

    var callback = 
    {
        success:
        function(o) 
        {
            if(o.responseText === undefined || o.status != 200)
            {
                transactionEnded();
                onDownloadError(o);
                return;
            }

            var status;
            try
            {
                status = eval('(' + o.responseText + ')');
            }
            catch(e)
            {
                onDownloadException(e);
                transactionEnded();
                return;
            }


            try
            {

                if (onStatusUpdate(status, false))
                    return;

                setTimeout("download()", 1000);
            }
            catch(e)
            {
                onDownloadException(e);
                transactionEnded();
            }
        },
        
        failure:
        function(o)
        {
            onDownloadFailure(o);
            transactionEnded();
        }
    }

    YAHOO.util.Connect.asyncRequest('GET', '/status.py?key=' + getKey() + '&r=' + Math.random(), callback);

    doFetch();
}

function getStatus()
{
    var callback = 
    {
        success:
        function(o) 
        {
            if(o.responseText === undefined || o.status != 200)
            {
                onDownloadError(o);
                transactionEnded();
                return;
            }

            var status;
            try
            {
                status = eval('(' + o.responseText + ')');
            }
            catch(e)
            {
                onDownloadException(e);
                transactionEnded();
                return;
            }

            try
            {
                if (onStatusUpdate(status, true))
                    return;

                setTimeout("getStatus()", 1000);
            }
            catch(e)
            {
                onDownloadException(e);
                transactionEnded();
            }
        },
        
        failure:
        function(o)
        {
            onDownloadFailure(o);
            transactionEnded();
        }
    }

    YAHOO.util.Connect.asyncRequest('GET', '/status.py?key=' + getKey() + '&r=' + Math.random(), callback);
}


function cancelDownload(canceledByOther)
{
    onCancel(canceledByOther);

    if(downloadTx != null)
        YAHOO.util.Connect.abort(downloadTx);
    transactionEnded();
}

function transactionEnded(success)
{
    downloadTx = null;
}


