var STATE_SELECT_FILE       = 0;
var STATE_WAITING_RECIPIENT = 1;
var STATE_PROGRESS          = 2;
var STATE_CANCELING         = 3;
var STATE_COMPLETE          = 4;
var STATE_ERROR             = 5;

// time allowed to wait for key, ms
var KEY_WAITING_TIME        = 20000;

//ugly hack to fix iframe problem.
// FF adds <pre></pre> tags to any text within iframe!
function stripJSONFromIframe(text)
{
    var start = text.indexOf('{');
    var end   = text.lastIndexOf('}');
    return text.substring(start, end + 1);
}

var key      = null;
var uploadTx = null;
var fileName = null;
var currentState = STATE_SELECT_FILE;

var startTime = 0;
var getKeyStartTime = 0;

var numRetries = 0;

function uploadFile(formId)
{
    if(key == null)
        return; 

    if (uploadTx)
    {
        try
        {
            YAHOO.util.Connect.abort(uploadTx);
        }
        catch (e)
        {
        }
    }
    startTime = 0;

    YAHOO.util.Connect.setForm($(formId), true); 

    var callback = 
    {
        handle : window,

        upload: 
            function(o) 
            { 
                if(o.responseText == undefined)
                {
                    this.handle.onUploadError(o);
                }
                else
                {
                    try
                    {
                        var s = stripJSONFromIframe(o.responseText);
                        var status = eval('(' + s + ')');
                        this.handle.onUploadComplete(status);
                    }
                    catch(e)
                    {
                        if (this.handle.onUploadException(o, e))
                            return;
                    }
                }

                this.handle.transactionEnded();
            }
    };

    uploadTx = YAHOO.util.Connect.asyncRequest('POST', '/put.py?key=' + key + '&r=' + Math.random(), callback); 
    // start wating for other party
    if (numRetries == 0)
        setTimeout("getStatus()", 1000);
}


function cancelUpload(canceledByOther)
{
    onCancel(canceledByOther);

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

function transactionEnded()
{
    key      = null;
    uploadTx = null;
    onTransactionEnded();
}



function continueUpload()
{

    fileName = null;

    try
    {
        uploadFile('file_upload_form');
    }
    catch(e)
    {
        onUploadCriticalException(e, o);
        return;
    }

}


function startUpload()
{
    key = null;
    fileName = null;

    if (!onBeforeUpload())
        return;

    var callback = 
    {
        success:
        function(o) 
        {
            if(o.responseText === undefined || o.status != 200)
            {
                onUploadError(o);
                return;
            }
            else  continueUpload();
        },
        
        failure:
        function(o)
        {
            onUploadError(o);
        }
    }

    YAHOO.util.Connect.asyncRequest('POST', '/setmessage.php?r=' + Math.random() + '&key=' + key, callback, 'message=' + encodeURIComponent(getMessage()));
}

function checkKey()
{
    if (key && fileName)
        return;
    if ((new Date()).getTime() - getKeyStartTime > KEY_WAITING_TIME)
    {
        transactionEnded();
        onTimeout();
        return;
    }
    setTimeout("checkKey()", 1000);
}

function getStatus()
{
    var callback = 
    {
        success:
        function(o) 
        {
            if(uploadTx == null)
                return;

            if(o.responseText === undefined || o.status != 200)
            {
                transactionEnded();
                onStatusError(o);
                return;
            }

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



            try
            {
                if (onStatusUpdate(status))
                    return;
                
                setTimeout("getStatus()", 1000);
            }
            catch(e)
            {
                onStatusException(e);
                transactionEnded();
            }
        },
        
        failure:
        function(o)
        {
            onStatusError(o);
            transactionEnded();
        }
    }

    if(uploadTx != null && key != null)
        YAHOO.util.Connect.asyncRequest('GET', '/status.py?key=' + key +'&touch=yes&r=' + Math.random(), callback);
}

window.onunload = function() {set_cookie('PBUPLOADID', 'deleted', -1);}
