function getKey()
{
    return $('key').value;
}

function goState(state)
{
    currentState = state;
    setError('');
    setStatus('');
    setInfo('');
    switch (state)
    {
        case STATE_KEY:
            setVisible('key_form_div',      true);
            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',         false);
            setVisible('status_div',        false);
            setVisible('videoads_div',      false);
            setVisible('fileinfo_div',      false);
            setVisible('custom_message_div',false);
            setVisible('error_message_div', true);
            setVisible('explanation_div',   false);
            setVisible('ads_div',           true);
            setVisible('bar_div',           false);
            setVisible('speed',             false);
            setVisible('banner_content',    false);
            break;
        case STATE_VALIDATION:
            setVisible('key_form_div',      false);
            setVisible('download_form_div', true);
            setVisible('cancel_form_div',   false);
            setVisible('progress_div',      false);
            setVisible('pipe_div',          false);
            setVisible('action_div',        false);
            setVisible('info_div',          false);
            setVisible('error_div',         false);
            setVisible('status_div',        false);
            setVisible('videoads_div',      false);
            setVisible('fileinfo_div',      true);
            setVisible('custom_message_div',true);
            setVisible('error_message_div', false);
            setVisible('explanation_div',   true);
            setVisible('ads_div',           true);
            setVisible('bar_div',           false);
            setVisible('speed',             false);
            setVisible('banner_content',    false);
            break;
        case STATE_WAITING_SENDER:
           setVisible('key_form_div',       false);
            setVisible('download_form_div', false);
            setVisible('cancel_form_div',   true);
            setVisible('progress_div',      false);
            setVisible('pipe_div',          false);
            setVisible('action_div',        false);
            setVisible('info_div',          false);
            setVisible('error_div',         false);
            setVisible('status_div',        true);
            setVisible('videoads_div',      false);
            setVisible('fileinfo_div',      true);
            setVisible('custom_message_div',false);
            setVisible('error_message_div', false);
            setVisible('explanation_div',   false);
            setVisible('ads_div',           false);
            setVisible('bar_div',           false);
            setVisible('speed',             true);
            break;
        case STATE_PROGRESS:
           setVisible('key_form_div',       false);
            setVisible('download_form_div', false);            
            setVisible('cancel_form_div',   true);
            setVisible('progress_div',      true);
            setVisible('pipe_div',          true);
            setVisible('action_div',        false);
            setVisible('info_div',          false);
            setVisible('error_div',         false);
            setVisible('status_div',        false);
            setVisible('videoads_div',      true);
            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',           true);
            setVisible('speed',             true);
            setVisible('top_text',          false);

//          window.onbeforeunload = confirmExit;
            break;
        case STATE_CANCELING:
           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',         false);
            setVisible('status_div',        true);
            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);
            window.onbeforeunload = null;
            break;
        case STATE_COMPLETE:
            setVisible('key_form_div',     false);
            setVisible('download_form_div', false);
            setVisible('cancel_form_div',   false);
            setVisible('progress_div',      false);
            setVisible('pipe_div',          true);
            setVisible('action_div',        true);
            setVisible('info_div',          true);
            setVisible('error_div',         false);
            setVisible('status_div',        false);
            setVisible('videoads_div',      true);
            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 = '422px';
            $('download_box_div').style.width = '42em';
            setClass('download_box_div','rounded_box  banner_width');
            window.onbeforeunload = null;
            break;
        case STATE_ERROR:
            setVisible('key_form_div',      false);
            setVisible('download_form_div', false);
            setVisible('cancel_form_div',   false);
            setVisible('progress_div',      false);
            setVisible('pipe_div',          true);
            setVisible('action_div',        true);
            setVisible('info_div',          false);
            setVisible('error_div',         true);
            setVisible('status_div',        false);
            setVisible('videoads_div',      true);
            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);
            setClass('download_box_div','rounded_box banner_width');
            $('progress').style.width = '0px';
            window.onbeforeunload = null;
            break;
        case STATE_XHR_DISABLED:
            setError('<br/><br/><br/><br/><br/>In order to use PipeBytes please enable ActiveX support');
            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);
            window.onbeforeunload = null;
            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_SENDER ||
        currentState == STATE_PROGRESS)
    {
        o.target =  '_blank';
        return true;
    }
    else
    {
        o.target =  '_self';
        return true;
    }
}

function check_code(value)
{
    showText('error_message_div', '');
    var pattern = /^\d{4,}$/;
    if (!pattern.test(value))
    {
        showText('error_message_div', 'Invalid pick-up code entered');
        var o = $('key');
        if (o)
            o.focus();
        return false;
    }
    return true;
}

function onBeforeDownload()
{
    goState(STATE_WAITING_SENDER);
    setStatus('Waiting for sender..');
}

function onDownloadError(o)
{
    goState(STATE_ERROR);
    if (window.console && window.console.log)
    {
        window.console.log('STATUS:' + o.status);
        window.console.log('RESPONSE:' + o.responseText);
    }
    if (o.responseText === undefined)
        setError('Unexpected error: Server returned no response');
    else
        setError('Unexpected error: Server returned status ' + o.status);
}

function onDownloadException(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, fromStatusCallback)
{
    if (status['canceled'])
    {
        if (status['canceled'] == 'recipient')
        {
            cancelDownload(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'] == 'sender')
        {
            cancelDownload(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'])
    {
        cancelDownload(true);
        goState(STATE_ERROR);
        setError(status['downloadError']);
        return true;
    }
    else
    if (status['uploadError'])
    {
        cancelDownload(true);
        goState(STATE_ERROR);
        setError(status['uploadError']);
        return true;
    }


    if(!fromStatusCallback && status['name'] != null)
    {
        fileName = status['name'];
        goState(STATE_PROGRESS);
        return true;
    }

    if (fromStatusCallback)
    {
        var total = status['length'];
        var uploaded = status['uploaded'];

        if (total > 0)
            show_speed_info(status['paid_by'], currentState == STATE_PROGRESS, status['limited'], status['speed'], uploaded, total, false);

        if(total > 0)
            setProgress('<span class="green bold"><b>%p</b></span> of <span class="orange">' + short_file_name(status['name'], 15) + '</span> <span class="green bold">(<b>%u of %t</b>)</span> ', uploaded, total, 422);

        if(uploaded >= total && uploaded > 0)
        {
            goState(STATE_COMPLETE);
            setInfo('File <span class="orange">' + status['name'] + '</span> has been received');
            transactionEnded(true);
            return true;
        }
    }

    return false;

}

function onDownloadFailure(o)
{

    // canceled by user
    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 (window.console && window.console.log)
            window.console.log('GOT STATUS:' + o.status);
        setError('Unexpected error, server returned status ' + o.status);
    }
}

function onCancel(canceledByOther)
{
    if (!canceledByOther)
    {
        goState(STATE_CANCELING);
        setStatus('Canceling..');
        var callback = 
        {
            success: function(o) {},
            failure: function(o) {}
        };

        var k = getKey();
        if (k)
            YAHOO.util.Connect.asyncRequest('GET', 'cancel.py?key=' + k + '&cancel=recipient&r=' + Math.random(), callback);
    }
    goState(STATE_COMPLETE);
    setVisible('pipe_div',false);
    setInfo('Transfer of file <span class="orange">' + getFileName() + '</span> was canceled');
}

function getFileName()
{
    if (fileName)
        return fileName;
    var o = $('saved_fname');
    if (o)
        return o.innerHTML;
    return '';
}


function confirmExit()
{
    return "Upload would terminate if you will leave. Please confirm your decision";
}

