var upuBasePath   = '';
var uploadScriptPath = '';
var processID  = '';
var clientForm = null;
var realAction = "";
var objXMLHttpRequest = null;
var upuStep = 1;
var upuTimer = null;
var upuStartTime = 0;
var srvAddr = '';
var upuFormDate = null;
var objFinalForm = null;
var upuUploading = false;

// init upu
function upuInit(obj)
{
    if (upuUploading)
    {
        return false;
    }
    
    upuUploading = true;

    clientForm = obj;
    realAction = clientForm.action;
	
	//alert(realAction);
	//return false;
	
    // show upload status container
    upuShowContainer();

    upuObj("upu_status").innerHTML = 'Initializing...';
    upuObj("upu_total_size").innerHTML = '';
    
    //return false;
    // init xmlhttp request
    initXMLHttpRequest();
    
    // make process id
    processID = genProcessID();
    
    setUploadServer();
	
	alert(11111111);
    // 
    upuTimer = setInterval("getStatus()", 1000);
    
    return false;
}

function upuPreload()
{
    // get upu script path
    var objScripts = document.getElementsByTagName("script");

    for (var i = 0; i < objScripts.length; i ++)
    {
        if (objScripts[i].src && objScripts[i].src.match("upu.js"))
        {
            upuBasePath = objScripts[i].src.replace("/js/upu.js", '');
            break;
        }
    }

    var head = document.getElementsByTagName("head")[0];
    
    var objStyleSheet = document.createElement("link");
    objStyleSheet.type = "text/css";
    objStyleSheet.rel = "stylesheet";
    objStyleSheet.href = upuBasePath + "/css/upu.css";

    head.appendChild(objStyleSheet);

    var objImgTimer = new Image();
    objImgTimer.src = upuBasePath + '/images/time.gif';

    var objImgProcessBarBackground = new Image();
    objImgProcessBarBackground.src = upuBasePath + 'misc/bar_bg.gif';

    var objImgProcessBar = new Image();
    objImgProcessBar.src = upuBasePath + 'misc/bar_blue.gif';
}


function setUploadServer()
{
	//alert(uploadScriptPath);
    //uploadScript = uploadScriptPath == '' ? upuBasePath + 'upload.php': uploadScriptPath;
   	uploadScript	= 'http://www.live-share.com/upload.php';
   
    upuObj("upu_frame_upload").src = uploadScript + "?processid=" + processID;
}

function upuShowContainer()
{
    if (upuObj("upu_div_mask"))
    {
        upuObj("upu_div_mask").style.display  = 'block';
        upuObj("upu_container").style.display = 'block';
        //upuObj("upu_cancel").style.display = 'none';
        upuObj("upu_div_submit").style.display = 'none';
        upuObj("upu_manual_redirect").style.display = 'none';
        upuObj("upu_status").innerHTML = '';
        upuObj("upu_percent").innerHTML = '';
        upuObj("upu_total_size").innerHTML = '';
        upuObj("upu_speed").innerHTML = '';
        //upuObj("upu_uploaded").innerHTML = '';
        upuObj("upu_remain_time").innerHTML = '';
        upuObj("upu_bar_completed").style.width = 0;

        upuStep = 1;
        upuTimer = null;
        upuStartTime = 0;
        srvAddr = '';
        
        window.status = 'uploading...';
        fixWindow();
        window.onresize = fixWindow;

        return;
    }

    var objDivIframe = document.createElement("div");
    objDivIframe.id  = "upu_div_iframe";
    objDivIframe.style.display = "none";
    document.body.appendChild(objDivIframe);
    
    /*
    var objFrmSocket = document.createElement("iframe");
    objFrmSocket.id = "upu_frame_socket";
    objFrmSocket.src = "about:blank";
    objDivIframe.appendChild(objFrmSocket);
    */

    objDivIframe.innerHTML += '<iframe src="" width="500" height="200" name="upu_frame_upload" id="upu_frame_upload"></iframe>';

    var objDivMask = document.createElement("div");
    objDivMask.id = 'upu_div_mask';
    //objDivMask.style.height = '';

    document.body.appendChild(objDivMask);
    
    var objDivContainer = document.createElement("div");
    objDivContainer.id = 'upu_container';
    document.body.appendChild(objDivContainer);

    var html = '<table width="400" cellpadding = "0" cellspacing="4" border="0" id="upu_tbl_box">' + 
    '<tr>' + 
    '    <td width="300"><span id="upu_status">Initializing...</span></td>' + 
    '    <td align="right"><span id="upu_percent"></span></td>' + 
    '</tr>' + 
    '<tr>' + 
    '    <td colspan="2"><div id="upu_bar"><div id="upu_bar_completed"></div></div></td>' + 
    '</tr>' + 
    '<tr>' + 
    '   <td><span id="upu_total_size"></span> ' + 
    '       <span id="upu_speed"></span> &nbsp;<span id="upu_cancel"><a href="javascript:void(0)" onclick="cancelUpload()">Cancel?</a></span></td><td align="right"><img src="' + upuBasePath + '/images/time.gif" align="absmiddle"/> ' + 
    '       <span id="upu_remain_time"></span></td>' + 
    '</tr>' +  
    '</table>' + 
    '<div id="upu_div_submit"><input type="button" onclick="manualSubmit()" value="Continue"/></div>' + 
    '<div id="upu_manual_redirect">If you are not automatically redirected, click here please.</div>';

    objDivContainer.innerHTML = html;
    
    upuObj("upu_cancel").style.display = 'inline';
    
    window.status = 'uploading...';
    fixWindow();
    window.onresize = fixWindow;
    //alert(objDivContainer.style.clientWidth);
}


function fixWindow()
{
    var screenInfo = getPageSize();
    var scrollInfo = getPageScroll();

    document.body.style.overflow = 'hidden';

    upuObj("upu_div_mask").style.width  = screenInfo[0] + 'px';
    upuObj("upu_div_mask").style.height = screenInfo[1] + 'px';
    
    if (window.navigator.userAgent.indexOf('Firefox') >= 1)
    {
        upuObj("upu_container").style.top  = 100 + 'px';
    }
    else
    {
        upuObj("upu_container").style.top  = scrollInfo[1] + 100 + 'px';
    }
    
    upuObj("upu_container").style.left = (screenInfo[0] - 416) / 2 + 'px'
}

function upuObj(objID)
{
    return document.getElementById(objID);
}

// init xmlhttp request object
function initXMLHttpRequest()
{
    if (window.XMLHttpRequest)
    {
        objXMLHttpRequest = new XMLHttpRequest();

    }
    else
    {
        var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
        for(var n = 0; n < MSXML.length; n ++)
        {
            try
            {
                objXMLHttpRequest = new ActiveXObject(MSXML[n]);
                break;
            }
            catch(e)
            {
            }
        }
     }          

    if (objXMLHttpRequest.readyState == null)
    {
        objXMLHttpRequest.readyState = 0;

        objXMLHttpRequest.addEventListener("load", function ()
            {
                objXMLHttpRequest.readyState = 4;

                if (typeof objXMLHttpRequest.onreadystatechange == "function")
                {
                    objXMLHttpRequest.onreadystatechange();
                }
            },  false);
    }
}

function getStatus()
{
    var url = 'http://www.live-share.com/upu/status.php?processid=' + processID + '&step=' + upuStep + '&randnum=' + Math.random();
	//alert(url);
    with(objXMLHttpRequest)
    {
        try
        {
            open('GET', url, true);

            send(null);
            onreadystatechange = function ()
            {
                if (objXMLHttpRequest.readyState == 4)
                {
                    parseResponse();
                }
            }
        }
        catch(e)
        {
        }
    }
}

function parseResponse()
{
    //alert(objXMLHttpRequest.responseText);
    try
    {
        eval(objXMLHttpRequest.responseText);
    }
    catch (e)
    {
    }
    
    if (upuFormDate != null)
    {
        //alert('xmlhttp');
        clearInterval(upuTimer);

        makeForm();
    }
    else if (typeof(result) != 'undefined')
    {
        if (result.error)
        {
            upuObj("upu_status").innerHTML = 'Error';
            clearInterval(upuTimer);
            alert('Error: ' + result.error);
            return;
        }
        
        if (result.srv)
        {
            srvAddr = result.srv;
            clearInterval(upuTimer);
            upuTimer = setInterval("getStatus()", 2000);
            startUpload();
            upuStep ++;
        }
        else if (result.done)
        {
            updateStatus(result);
            //clearInterval(upuTimer);
            upuObj("upu_cancel").style.display = 'none';
            upuObj("upu_status").innerHTML = 'Upload completed, Redirecting...';
            upuObj("upu_manual_redirect").style.display = 'block';
            upuObj("upu_manual_redirect").innerHTML = '<a href="done.php?processid=' + processID + '">If you are not automatically redirected, click here please.</a>';
            window.location.href = 'done.php?processid=' + processID;
            clearInterval(upuTimer);
            upuUploading = false;
            upuStep ++;
            getStatus();
            //getFormDate();
        }
        else if (result.total)
        {
            updateStatus(result);
        }
    }
}

function startUpload()
{
    //upuObj("upu_frame_upload").src = "about:blank";
    realAction = clientForm.action;
    clientForm.target = "upu_frame_upload"
    clientForm.action = "http://" + srvAddr;

    clientForm.submit();
    
    upuStartTime = new Date();

    upuObj("upu_status").innerHTML = 'Uploading...';
}

function cancelUpload()
{
    upuUploading = false;
    clientForm.action = realAction;
    upuFormDate = null;
    upuObj("upu_frame_upload").src = '';

    upuObj("upu_div_mask").style.display  = 'none';
    upuObj("upu_container").style.display = 'none';

    upuStep = 4;
    getStatus();

    clearInterval(upuTimer);
    window.status = '';
    window.onresize = null;
    document.body.style.overflow = 'auto';
}

// update status
function updateStatus(result)
{
    if (result.total)
    {
        upuObj("upu_total_size").innerHTML = fancySize(result.uploaded) + ' Of ' + fancySize(result.total) + ' ';
    }

    if (result.uploading)
    {
        upuObj("upu_status").innerHTML = 'Uploading: ' + result.uploading;
    }

    if (result.uploaded)
    {
        //upuObj("upu_uploaded").innerHTML = 'Uploaded: ' + fancySize(result.uploaded);

        var percent = result.uploaded * 100 / result.total;
        upuObj("upu_bar_completed").style.width = percent + '%';
        upuObj("upu_percent").innerHTML = Math.round(percent) + '%';

        var timeNow = new Date();
        var pastTime = (timeNow - upuStartTime) / 1000;

        var speed = Math.round(result.uploaded / pastTime);
        upuObj("upu_speed").innerHTML = '(' + fancySize(speed) + '/S)';

        var remainTime = Math.round((result.total - result.uploaded) / speed);
        upuObj("upu_remain_time").innerHTML = fancyTime(remainTime);
    }
}

function getFormDate()
{
    var head = document.getElementsByTagName("head")[0];

    var objScriptData = document.createElement("script");
    objScriptData.type = "text/javascript";
    objScriptData.src  = "http://www.live-share.com/upu/status.php?processid=" + processID + "&step=3&randnum=" + Math.random();

    head.appendChild(objScriptData);
    
    objScriptData.onload = function ()
    {
        makeForm();
    }

    objScriptData.onreadystatechange = function ()
    {
        if (objScriptData.readyState == 'loaded')
        {
            makeForm();
        }
    }
    
    if (window.opera)
    {
        makeForm();
    }

    /*
    if (upuFormDate)
    {
        alert(upuFormDate);
    }
    */
}


function makeForm()
{
    if (!upuFormDate)
    {
        return;
    }
	//alert(realAction);
	//return false;
    objFinalForm = document.createElement("form");
    objFinalForm.id = 'upu_final_form';
    objFinalForm.action = realAction;
    objFinalForm.method = 'post';

    for (var i = 0; i < upuFormDate.length; i ++)
    {
        if (upuFormDate[i].file != 0)
        {
            for (key in upuFormDate[i])
            {
                if (key != 'formname' && key != 'file')
                {
                    makeFormItem(upuFormDate[i].formname + '[' + key + ']', upuFormDate[i][key]);
                }
            }
        }
        else
        {
            makeFormItem(upuFormDate[i].formname, upuFormDate[i].value);
        }
    }

    document.body.appendChild(objFinalForm);
    
    upuObj("upu_div_submit").style.display = 'block';
    //objFinalForm.submit();
}

function manualSubmit()
{
    upuObj("upu_final_form").submit();
}

function makeFormItem(strName, strValue)
{
    var objInputItem = document.createElement("input");
    objInputItem.type = 'hidden';
    objInputItem.name = strName;
    objInputItem.value = strValue;
    
    objFinalForm.appendChild(objInputItem);
}

// .....
function genProcessID()
{
    var p = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];

    var rndstr = "";

    for (var i = 0; i < 32; i ++)
    {
        rndstr += p[Math.round(Math.random() * 15)].toString();
    }
    
    return rndstr;
}

function upuGlobalTimer()
{
    upuPastTime += 0.5;
}

function fancySize(bytes)
{
    var result = 0;
    var unit   = "bytes";
    switch(true)
    {
        case bytes >= 1024 * 1024 * 1024 :
              result = Math.round(bytes / 1024 / 1024 / 1024 * 100) / 100;
              unit   = "GB";
              break;
        case bytes >= 1024 * 1024 :
              result = Math.round(bytes / 1024 / 1024 * 100) / 100;
              unit   = "MB";
              break;
        case bytes >= 1024 :
              result = Math.round(bytes / 1024 * 100) / 100;
              unit   = "KB";
              break;
        default:
              result = bytes;
    }
    
    result += " " + unit;
    return result;
}

function fancyTime(sec)
{
    var result = "";
    switch(true)
    {
        case sec >= 3600 :
              hours    = Math.ceil(sec / 3600);
              hours    = hours < 10 ? "0" + hours + ":": hours + ":";
              minutes  = Math.ceil(sec % 3600 / 60);
              minutes  = minutes < 10 ? "0" + minutes + ":": minutes + ":";
              secs     = Math.ceil(sec % 60);
              secs     = secs < 10 ? "0" + secs : secs;
              result  += hours + minutes + secs;
              break;
        case sec >= 60 :
              minutes  = Math.ceil(sec / 60);
              minutes  = minutes < 10 ? "0" + minutes + ":": minutes + ":";
              secs     = Math.ceil(sec % 60);
              secs     = secs < 10 ? "0" + secs : secs;
              result  += minutes + secs;
              break;
        default:
              sec      = sec < 10 ? "0" + sec : sec;
              result   = "00:" + sec;
    }
    
    return result;
}


function getPageSize()
{ 
    var xScroll, yScroll;

    if (window.innerHeight && window.scrollMaxY)
    { 
        xScroll = document.body.scrollWidth; 
        yScroll = window.innerHeight + window.scrollMaxY; 
    } 
    else if (document.body.scrollHeight > document.body.offsetHeight)
    { 
        // all but Explorer Mac 
        xScroll = document.body.scrollWidth; 
        yScroll = document.body.scrollHeight; 
    } 
    else
    { 
        // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari 
        xScroll = document.body.offsetWidth; 
        yScroll = document.body.offsetHeight; 
    }

    var windowWidth, windowHeight; 

    if (self.innerHeight)
    { 
        // all except Explorer 
        windowWidth = self.innerWidth; 
        windowHeight = self.innerHeight; 
    } 
    else if (document.documentElement && document.documentElement.clientHeight)
    { 
        // Explorer 6 Strict Mode 
        windowWidth = document.documentElement.clientWidth; 
        windowHeight = document.documentElement.clientHeight; 
    } 
    else if (document.body)
    { 
        // other Explorers 
        windowWidth = document.body.clientWidth; 
        windowHeight = document.body.clientHeight; 
    }

    // for small pages with total height less then height of the viewport 
    if(yScroll < windowHeight)
    { 
        pageHeight = windowHeight; 
    } 
    else
    { 
        pageHeight = yScroll; 
    }

    // for small pages with total width less then width of the viewport 
    if(xScroll < windowWidth)
    { 
        pageWidth = windowWidth; 
    } 
    else
    { 
        pageWidth = xScroll; 
    }

    arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);

    return arrayPageSize; 
}

function getPageScroll()
{
    
    var yScroll;
    
    if(self.pageYOffset)
    {
        yScroll = self.pageYOffset;
    }
    else if(document.documentElement && document.documentElement.scrollTop)
    {
        yScroll = document.documentElement.scrollTop;
    }
    else if(document.body)
    {
        yScroll = document.body.scrollTop;
    }
    
    arrayPageScroll = new Array('', yScroll);

    return arrayPageScroll;
}

function addLoadEvent(func)
{
    var oldonload = window.onload;
    if (typeof window.onload != 'function')
    {
        window.onload = func;
    }
    else
    {
        window.onload = function()
        {
            oldonload();
            func();
        }
    }
}

addLoadEvent(upuPreload);