var infoDisplayed = false;
var keyGenerated = false;

function onUploadError(o)
{
    if (window.console && window.console.log)
    {
        window.console.log('STATUS:' + o.status);
        window.console.log('RESPONSE:' + o.responseText);
    }

    if(o.status == 0)
    {
        goState(STATE_COMPLETE);
        setVisible('pipe_div',false);
        setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled');
    }
    else
    {
        goState(STATE_ERROR);
        if (o.responseText === undefined)
            setError('Error uploading file: Server returned no response');
        else
           setError('Error uploading file: Server returned status ' + o.status);
    }
}

function onUploadComplete(status)
{
    goState(STATE_COMPLETE);
    setInfo('File <span class="orange">' + status['name'] + '</span> has been sent');
}

function onUploadException(e, o)
{
    if (currentState == STATE_WAITING_RECIPIENT)
    {
        if (window.console && window.console.log)
        {
            window.console.log(e);
            window.console.log(o);
        }
        numRetries++;
        setTimeout("uploadFile('file_upload_form')", 1000);
        return true;
    }
    else
    {
        goState(STATE_ERROR);
        setError('Internal Server Error. Please try again later');
        if (window.console && window.console.log)
            window.console.log(e);
    }
    return false;
}

function onUploadCriticalException(e, o)
{
    goState(STATE_ERROR);
    setError('Internal Server Error. Please try again later');
    if (window.console && window.console.log)
        window.console.log(e);
}


function onTransactionEnded()
{
    infoDisplayed = false;
    try
    {
        $('file').value = '';
    }
    catch(e) {}
}

function onTimeout()
{
    goState(STATE_ERROR);
    setError('Cannot start file transfer (timeout). Please try again later');
}

function onStatusError(o)
{
    if (window.console && window.console.log)
    {
        window.console.log('STATUS:' + o.status);
        window.console.log('RESPONSE:' + o.responseText);
    }
    if (o.status == 0)
    {
        goState(STATE_COMPLETE);
        setVisible('pipe_div',false);
        setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled by other party');
    }
    else
    {
        goState(STATE_ERROR);
        if (o.responseText === undefined)
            setError('Unexpected error: Server returned no response');
        else
            setError('Unexpected error: Server returned status ' + o.status);
    }
}

function onStatusException(e)
{
    goState(STATE_ERROR);
    if (window.console && window.console.log)
        window.console.log(e);
    setError('Internal Server Error. Please try again later');
}

function onStatusUpdate(status)
{
    var total = status['length'];
    var uploaded = status['uploaded'];


    if(status['reader'])
    {
        if (currentState != STATE_PROGRESS)
        {
            startTime = (new Date()).getTime();
            goState(STATE_PROGRESS);
        }
    }

    if (status['canceled'])
    {
        if (status['canceled'] == 'sender')
        {
            cancelUpload(true);
            goState(STATE_COMPLETE);
            setVisible('pipe_div',false);
            setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled');
            return true;
        }
        else
        if (status['canceled'] == 'recipient')
        {
            cancelUpload(true);
            goState(STATE_COMPLETE);
            setVisible('pipe_div',false);
            setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled by other party');
            return true;
        }
    }
    else
    if (status['downloadError'])
    {
        cancelUpload(true);
        goState(STATE_ERROR);
        setError(status['downloadError']);
        return true;
    }
    else
    if (status['uploadError'])
    {
        cancelUpload(true);
        goState(STATE_ERROR);
        setError(status['uploadError']);
        return true;
    }

    if(fileName == null && status['name'] != null)
    {
        showTxInfo();
        fileName = status['name'];
    }

    if (total > 0)
        show_speed_info(status['paid_by'], currentState == STATE_PROGRESS, status['limited'], status['speed'], uploaded, total, true);


    if(total > 0 && uploaded > 0)
    {
        setProgress('<span class="green"><b>%p</b></span> of <span class="orange">' + short_file_name(getFileName(), 15) + '</span> <span class="green">(<b>%u of %t</b>)</span> ', uploaded, total, 422);
    }

    if(uploaded >= total && uploaded > 0 && getFileName() != null)
    {
        goState(STATE_COMPLETE);
        setInfo('File <span class="orange">' + getFileName() + '</span> has been sent');
        transactionEnded(true);
        return true;
    }
    return false;
}

function onCancel(canceledByOther)
{
    goState(STATE_CANCELING);
    setStatus('Canceling..');
    var callback = 
    {
        success: function(o) {},
        failure: function(o) {}
    };


    var canceler = canceledByOther ? 'recipient' : 'sender';
    var k = key;
    if (k)
        YAHOO.util.Connect.asyncRequest('GET', 'cancel.py?key=' + key + '&cancel=' + canceler + '&r=' + Math.random(), callback);

    goState(STATE_COMPLETE);
    setVisible('pipe_div',false);
    if (canceledByOther)
        setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled by other party');
    else
        setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled');
}

function onBeforeUpload()
{

    var fname = $('file').value;
    if (!fname || fname == '')
    {
        setVisible('upload_error_message_div', true);
        return false;
    }

    key = $('auto_generated_key').value;
    goState(STATE_WAITING_RECIPIENT);
    setStatus('Waiting for recipient..');
    return true;
}

function goState(state)
{
    window.onbeforeunload = null;
    currentState = state;
    setError('');
    setStatus('');
    setInfo('');
    switch (state)
    {
        case STATE_SELECT_FILE:
            setVisible('upload_form_div', true);
            setVisible('cancel_form_div', false);
            setVisible('pipe_div',        false);
            setVisible('action_div',      false);
            setVisible('linkinfo_div',    false);
            setVisible('info_div',        false);
            setVisible('error_div',       false);
            setVisible('status_div',      false);
            setVisible('ads_div',         true);
            setVisible('videoads_div',    false);
            setVisible('bar_div',         false);
            setVisible('speed',           false);
            setVisible('banner_content',  false);
            break;
        case STATE_WAITING_RECIPIENT:

            setVisible('hide1', false);
            setVisible('hide2', false);
            setVisible('hide3', false);
            setVisible('hide4', false);
            setClass('inputs_div','only');
            setVisible('cancel_form_div', true);
            setVisible('pipe_div',        false);
            setVisible('action_div',      false);
            setVisible('info_div',        false);
            setVisible('error_div',       false);
            setVisible('status_div',      true);
            setVisible('ads_div',         false);
            setVisible('videoads_div',    false);
            setVisible('bar_div',         false);
            setVisible('receive_div',     false);
            setVisible('top_text',        false);
            setClass('upload_box_div','rounded_box fix_width');
            setClass('upload_content_div','box_content fix_width');
            setClass('menu_home','');


            sel_by_state();


            break;
        case STATE_PROGRESS:
            setVisible('upload_form_div', false);            
            setVisible('cancel_form_div', true);
            setVisible('pipe_div',        true);
            setVisible('action_div',      false);
            setVisible('linkinfo_div',    false);
            setVisible('info_div',        false);
            setVisible('error_div',       false);
            setVisible('status_div',      false);
            setVisible('ads_div',         false);
            setVisible('videoads_div',    true);
            setVisible('bar_div',         true);
            setVisible('speed',           true);
            setVisible('top_text',     false);
            $('upload_content_div').style.width = $('i_pipe').offsetWidth;
            $('upload_box_div').style.width     = $('i_pipe').offsetWidth;
            window.onbeforeunload = confirmExit;
            break;
        case STATE_CANCELING:
            setVisible('upload_form_div', false);
            setVisible('cancel_form_div', false);
            setVisible('pipe_div',        false);
            setVisible('action_div',      false);
            setVisible('linkinfo_div',    false);
            setVisible('info_div',        false);
            setVisible('error_div',       false);
            setVisible('status_div',      true);
            setVisible('ads_div',         false);
            setVisible('videoads_div',    false);
            setVisible('bar_div',         false);
            setVisible('speed',           false);
            setVisible('top_text',        false);
            setVisible('banner_content',  false);
            $('progress').style.width = '0px';
            break;
        case STATE_COMPLETE:
            set_cookie('PBUPLOADID', 'deleted', -1);
            setVisible('upload_form_div', false);
            setVisible('cancel_form_div', false);
            setVisible('pipe_div',        true);
            setVisible('action_div',      true);
            setVisible('linkinfo_div',    false);
            setVisible('info_div',        true);
            setVisible('error_div',       false);
            setVisible('status_div',      false);
            setVisible('ads_div',         false);
            setVisible('videoads_div',    true);
            setVisible('bar_div',         false);
            setVisible('speed',           false);
            setVisible('top_text',        false);
            setVisible('banner_content',  false);
            setClass('upload_box_div','rounded_box banner_width');
            setClass('upload_content_div','box_content banner_width');
            $('progress').style.width =   '422px';
            break;
        case STATE_ERROR:
            set_cookie('PBUPLOADID', 'deleted', -1);
            setVisible('upload_form_div', false);
            setVisible('cancel_form_div', false);
            setVisible('pipe_div',        true);
            setVisible('action_div',      true);
            setVisible('linkinfo_div',    false);
            setVisible('info_div',        false);
            setVisible('error_div',       true);
            setVisible('status_div',      false);
            setVisible('ads_div',         false);
            setVisible('videoads_div',    true);
            setVisible('bar_div',         false);
            setVisible('speed',           false);
            setVisible('top_text',        false);
            setVisible('banner_content',  false);
            setClass('upload_box_div','rounded_box banner_width');
            setClass('upload_content_div','box_content banner_width');

            $('progress').style.width = '0px';
            break;
        case STATE_XHR_DISABLED:
            setError('<br/><br/><br/><br/><br/>In order to use PipeBytes please enable ActiveX support');
            setVisible('upload_form_div',   false);
            setVisible('key_form_div',      false);
            setVisible('download_form_div', false);
            setVisible('cancel_form_div',   false);
            setVisible('progress_div',      false);
            setVisible('pipe_div',          false);
            setVisible('action_div',        false);
            setVisible('info_div',          false);
            setVisible('error_div',         true);
            setVisible('status_div',        false);
            setVisible('videoads_div',      false);
            setVisible('fileinfo_div',      false);
            setVisible('custom_message_div',false);
            setVisible('error_message_div', false);
            setVisible('explanation_div',   false);
            setVisible('ads_div',           false);
            setVisible('bar_div',           false);
            setVisible('speed',             false);
            setVisible('top_text',          false);
            setVisible('banner_content',    false);
            $('progress').style.width = '0px';
            break;
    }
}

function setError(s)
{
    showText('error_div', s);
}

function setInfo(s)
{
    showText('info_div', s);
}

function setStatus(s)
{
    showText('status_span', s);
}

function openLink(o)
{
    if (currentState == STATE_WAITING_RECIPIENT ||
        currentState == STATE_PROGRESS)
    {
        o.target =  '_blank';
        return true;
    }
    else
    {
        o.target =  '_self';
        return true;
    }
}

function confirmExit()
{
    return "Upload would terminate if you will leave. Please confirm your decision";
}

function showTxInfo()
{
    if(!uploadTx)
        return;

    if (!infoDisplayed)
    {
        if (numRetries == 0)
            setStatus('Waiting for recipient..');
        else
            setStatus('Waiting for recipient (' + numRetries + ')..');

        infoDisplayed = true;
    }
}

function getMessage()
{
    return $('message').value;
}

function getFileName()
{
    if (fileName)
        return fileName;
    return $('file').value.match(/[^\/\\]+$/) || '';
}

function generateKey()
{
    if (!keyGenerated)
    {
        var callback = 
        {
            success: function(o) 
            {
                $('file').readonly = false;
                $('file').disabled = false;
                keyGenerated = true;
                setClass('upload', 'button');
                $('auto_generated_key').value = o.responseText;
                $('input_URL').value = 'http://host' + o.responseText.substring(1,3) + '.pipebytes.com/get.php?key=' + o.responseText; 
                $('input_code').value = o.responseText;
                select($('input_URL'));
            },
            failure: function(o) 
            {
                $('file').readonly = false;
                $('file').disabled = false;
            }
        };
        $('file').readonly = true;
        $('file').disabled = true;
        YAHOO.util.Connect.asyncRequest('GET', 'getkey.php?r=' + Math.random(), callback);
    }

}


