//******************************************************************************************************
//   ATTENTION: THIS FILE HEADER MUST REMAIN INTACT. DO NOT DELETE OR MODIFY THIS FILE HEADER.
//
//   Name: ubr_file_upload.js
//   Revision: 1.5
//   Date: 5/11/2008 10:40:15 AM
//   Link: http://uber-uploader.sourceforge.net
//   Initial Developer: Peter Schmandra  http://www.webdice.org
//
//   Licence:
//   The contents of this file are subject to the Mozilla Public
//   License Version 1.1 (the "License"); you may not use this file
//   except in compliance with the License. You may obtain a copy of
//   the License at http://www.mozilla.org/MPL/
//
//   Software distributed under the License is distributed on an "AS
//   IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
//   implied. See the License for the specific language governing
//   rights and limitations under the License.
//
//***************************************************************************************************************

//***************************************************************************************************************
// * ATTENTION * If you need to debug this file, set the $DEBUG_AJAX = 1 in ubr_ini.php
//               and use the showDebugMessage function. eg. showDebugMessage("Upload ID = $UPLOAD_ID<br>");
//***************************************************************************************************************

var upload_range = 1;
var get_data_loop = false;
var get_status_url;
var seconds = 0;
var minutes = 0;
var hours = 0;
var info_width = 0;
var info_bytes = 0;
var info_time_width = 500;
var info_time_bytes = 15;
var cedric_hold = true;
var total_upload_size = 0;
var total_Kbytes = 0;
var bytesID;
var statusID;
var bStopped;

// Check the file format before uploading
function checkFileNameFormat(){
        if(!check_file_name_format){ return false; }

        
                if(upfileInput.value != ""){
                        var string = upfileInput.value;
                        var num_of_last_slash = string.lastIndexOf("\\");

                        if(num_of_last_slash < 1){ num_of_last_slash = string.lastIndexOf("/"); }

                        var file_name = string.slice(num_of_last_slash + 1, string.length);
                        var re = /^[\w][\w\.\-\s]{1,48}$/i;

                        if(!re.test(file_name)){
                                alert("Leider ist ein Hochladen dieser Datei nicht moeglich. Bitte beachten Sie: \n\n1. Der Name der Datei darf nur max. 48 Zeichen lang sein und darf keine Umlaute und Sonderzeichen enthalten - benennen Sie in diesem Fall die Datei einfach um.\n2. Die Dateiendung muss .pdf sein.\n3. Zulaessige Zeichen im Dateinamen sind 1-9, a-z, A-Z, _, -, Leerzeichen\n");
                                return true;
                        }
                }
        
        return false;
}

// Check for legal file extentions
function checkAllowFileExtensions(allowed_extensions){
        if(!check_allow_extensions_on_client){ return false; }

        
			var value = upfileInput.value;
                if(value != ""){
					if(!value.toLowerCase().match("("+allowed_extensions+")")){
							var string = upfileInput.value;
                            file_extension = getExtension(string);
                            alert('Das Hochladen von Dateien mit des Typs "' + file_extension + '" ist nicht erlaubt.');
                            return true;
                    }
					
                }
        
        return false;
}

// get the file extension
function getExtension(str)
{
	var num_of_last_slash = str.lastIndexOf("\\");
	if(num_of_last_slash < 1){ num_of_last_slash = str.lastIndexOf("/"); }

    var file_name = str.slice(num_of_last_slash + 1, str.length);
    var file_extension = file_name.slice(file_name.indexOf(".")).toLowerCase();
	
	return file_extension;
}

// Check for illegal file extentions
function checkDisallowFileExtensions(){
        if(!check_disallow_extensions_on_client){ return false; }

       
                if(upfileInput.value != ""){
                        if(upfileInput.value.match(disallow_extensions)){
                                var string = upfileInput.value;
                                var num_of_last_slash = string.lastIndexOf("\\");

                                if(num_of_last_slash < 1){ num_of_last_slash = string.lastIndexOf("/"); }

                                var file_name = string.slice(num_of_last_slash + 1, string.length);
                                var file_extension = file_name.slice(file_name.indexOf(".")).toLowerCase();

                                alert('Sorry, uploading a file with the extension "' + file_extension + '" is not allowed.');
                                return true;
                        }
                }
        
        return false;
}

// Make sure the user selected at least one file
function checkNullFileCount(){
        if(!check_null_file_count){ return false; }

        var null_file_count = 0;

        for(var i = 0; i < upload_range; i++){
                if(upfileInput.value == ""){ null_file_count++; }
        }

        if(null_file_count == upload_range){
                alert("Please Choose A File To Upload.");
                return true;
        }
        else{ return false; }
}

// Make sure the user is not uploading duplicate files
function checkDuplicateFileCount(){
        if(!check_duplicate_file_count){ return false; }

        var duplicate_flag = false;
        var file_count = 0;
        var duplicate_msg = "Duplicate Upload Files Detected.\n\n";
        var file_name_array = new Array();

        for(var i = 0; i < upload_range; i++){
                if(upfileInput.value != ""){
                        var string = upfileInput.value;
                        var num_of_last_slash = string.lastIndexOf("\\");

                        if(num_of_last_slash < 1){ num_of_last_slash = string.lastIndexOf("/"); }

                        var file_name = string.slice(num_of_last_slash + 1, string.length);

                        file_name_array[i] = file_name;
                }
        }

        var num_files = file_name_array.length;

        for(var i = 0; i < num_files; i++){
                for(var j = 0; j < num_files; j++){
                        if(file_name_array[i] == file_name_array[j] && file_name_array[i] != null){ file_count++; }
                }
                if(file_count > 1){
                        duplicate_msg += 'Duplicate file "' + file_name_array[i] + '" detected in slot ' + (i + 1) + ".\n";
                        duplicate_flag = true;
                }
                file_count = 0;
        }

        if(duplicate_flag){
                alert(duplicate_msg);
                return true;
        }
        else{ return false; }
}


function resetForm(){ location.href = self.location; }
function hideProgressBar()
{
		progressBar.style.display = "none";
        upfileInput.disabled = false;
        bUploadInProgress = false;

        if(!bStopped)
                if(typeof uploadFinishedFunc == 'function'){ uploadFinishedFunc(); }
}
function showDebugMessage(message){ document.getElementById('ubr_debug').innerHTML += message + '<br>'; }
function clearDebugMessage(){ document.getElementById('ubr_debug').innerHTML = ''; }
function showAlertMessage(message){ /*document.getElementById('ubr_alert').innerHTML = message; */}
function clearAlertMessage(){ document.getElementById('ubr_alert').innerHTML = ''; }
function stopDataLoop(){ get_data_loop = false; }

// Initialize the file upload page
function iniFilePage(){
        resetProgressBar();
        clearAlertMessage();

        
        	upfileInput.disabled = false;
        	upfileInput.value = "";
        

        //document.getElementById('upload_button').disabled = false;
        //document.getElementById('progress_bar').style.display = "none";
        uploadForm.reset();
}

// Reset the progress bar
function resetProgressBar(){
        get_data_loop = false;
        seconds = 0;
        minutes = 0;
        hours = 0;
        info_width = 0;
        info_bytes = 0;
        cedric_hold = true;
        total_upload_size = 0;
        total_Kbytes = 0;

        uploadStatus.style.width = '0px';

        if(show_percent_complete){ document.getElementById('percent').innerHTML = '0%'; }
        if(show_files_uploaded){ document.getElementById('uploaded_files').innerHTML = 0; }
        if(show_files_uploaded){ document.getElementById('total_uploads').innerHTML = ''; }
        if(show_current_position){ document.getElementById('current').innerHTML = 0; }
        if(show_current_position){ document.getElementById('total_kbytes').innerHTML = ''; }
        if(show_elapsed_time){ document.getElementById('time').innerHTML = 0; }
        if(show_est_time_left){ document.getElementById('remain').innerHTML = 0; }
        if(show_est_speed){ document.getElementById('speed').innerHTML = 0; }
}

// Handle user pressing 'Enter' in the upload slots
function handleKey(event){
        if(document.all){ if(window.event.keyCode == 13){ return false; } }
        else{ if(event && event.which == 13){ return false; } }
}

// Link the upload
var bUploadInProgress = false;

var uploadForm;
var upfileInput;
var uploadStatus;
var progressBar;
var uploadFinishedFunc;

function linkUpload(doRedirect, uploadDir, uploadFileName, allowed_extensions, form, fileupload_element, progress_bar, upload_status, upload_finished){

		uploadForm = form;
		upfileInput = fileupload_element;
		uploadStatus = upload_status;
		progressBar = progress_bar;
		uploadFinishedFunc = upload_finished;
		
bStopped = false;
        if(checkFileNameFormat()){ return false; }
        if(checkAllowFileExtensions(allowed_extensions)){ return false; }
        if(checkDisallowFileExtensions()){ return false; }
        if(checkNullFileCount()){ return false; }
        if(checkDuplicateFileCount()){ return false; }
        if(bUploadInProgress) { return false; }

        bUploadInProgress = true;
        //document.getElementById('progress_bar').style.display = "show";


        var jsel = document.createElement('SCRIPT');
        var day = new Date;
        var dom;

        if(document.getElementById('ajax_div')){ dom = document.getElementById('ajax_div'); }
        else{ dom = document.body; }

        jsel.type = 'text/javascript';
		
        jsel.src = path_to_link_script + '?rnd_id=' + day.getTime()+ (doRedirect? '&doRedirect=true':'')+'&upload_dir='+uploadDir+'&upload_file_name='+uploadFileName;
        //alert(jsel.src);
        dom.appendChild(jsel);

        dom = null;
        jsel = null;
        day = null;
        
       
}

//Submit the upload form
function startUpload(upload_id, debug_upload){

	
        //document.getElementById('upload_button').disabled = true;
        uploadForm.action = path_to_upload_script + '?upload_id=' +  upload_id;
        
        uploadForm.submit();

        upfileInput.disabled = true; 

        if(document.getElementById('upload_div')){ document.getElementById('upload_div').style.display = "none"; }

        if(!debug_upload){ initializeProgressBar(upload_id); }
}

// Initialize progress bar
function initializeProgressBar(upload_id){
        var jsel = document.createElement('SCRIPT');
        var dom;

        if(document.getElementById('ajax_div')){ dom = document.getElementById('ajax_div'); }
        else{ dom = document.body; }

        jsel.type = 'text/javascript';
        jsel.src = path_to_set_progress_script + '?upload_id=' + upload_id;
        dom.appendChild(jsel);

        dom = null;
        jsel = null;
        day = null;
}

// Stop the upload
function stopUpload(){
        bStopped = true;
        try{ window.stop(); }
        catch(e){
                try{ document.execCommand('Stop'); }
                catch(e){}
        }
        progressBar.style.display = "none";
}

//Start the progress bar
function startProgressBar(upload_id, upload_size, start_time){
        total_upload_size = upload_size;
        total_Kbytes = Math.round(total_upload_size / 1024);
        get_status_url = path_to_get_progress_script + '?upload_id=' + upload_id + '&start_time=' + start_time + '&total_upload_size=' + total_upload_size;
        get_data_loop = true;
        progressBar.style.display = "";
        showAlertMessage("Upload In Progress");

        if(show_current_position){ document.getElementById('total_kbytes').innerHTML = total_Kbytes + " "; }
        if(show_elapsed_time){ getElapsedTime(); }

        getProgressStatus();

        if(cedric_progress_bar == 1){
                if(show_current_position){ smoothCedricBytes(); }
                smoothCedricStatus();
        }
}

// Calculate and display upload stats
function setProgressStatus(bytes_read, lapsed_time, uploaded_files){
        var byte_speed = 0;
        var time_remaining = 0;
        var dom;

        if(lapsed_time > 0){ byte_speed = bytes_read / lapsed_time; }
        if(byte_speed > 0){ time_remaining = Math.round((total_upload_size - bytes_read) / byte_speed); }

        if(cedric_progress_bar == 1){
                if(byte_speed != 0){
                        info_time_width = Math.round(total_upload_size * 1000 / (byte_speed * progress_bar_width));
                        info_time_bytes = Math.round(1024000 / byte_speed);
                }
                else{
                        info_time_width = 500;
                        info_time_bytes = 15;
                }
        }

        // Calculate percent finished
        var percent_float = bytes_read / total_upload_size;
        var percent = Math.round(percent_float * 100);
        var progress_bar_status = Math.round(percent_float * progress_bar_width);

        // Calculate time remaining
        var remaining_sec = (time_remaining % 60);
        var remaining_min = (((time_remaining - remaining_sec) % 3600) / 60);
        var remaining_hours = ((((time_remaining - remaining_sec) - (remaining_min * 60)) % 86400) / 3600);

        if(remaining_sec < 10){ remaining_sec = '0' + remaining_sec; }
        if(remaining_min < 10){ remaining_min = '0' + remaining_min; }
        if(remaining_hours < 10){ remaining_hours = '0' + remaining_hours; }

        var time_remaining_f = remaining_hours + ':' + remaining_min + ':' + remaining_sec;
        var Kbyte_speed = Math.round(byte_speed / 1024);
        var Kbytes_read = Math.round(bytes_read / 1024);

        if(cedric_progress_bar == 1){
                if(cedric_hold_to_sync){
                        if(progress_bar_status < info_width){ cedric_hold = true; }
                        else{
                                cedric_hold = false;
                                info_width = progress_bar_status;
                                info_bytes = Kbytes_read;
                        }
                }
                else{
                        cedric_hold = false;
                        info_width = progress_bar_status;
                        info_bytes = Kbytes_read;
                }
        }
        else{
                dom = uploadStatus;
                dom.style.width = percent + '%';

                if(show_current_position){
                        dom = document.getElementById('current');
                        dom.innerHTML = Kbytes_read;
                }
        }

        if(show_percent_complete){
                dom = document.getElementById('percent')
                dom.innerHTML = percent + '%';
        }
        if(show_files_uploaded){
                dom = document.getElementById('uploaded_files');
                dom.innerHTML = uploaded_files;
        }
        if(show_est_time_left){
                dom = document.getElementById('remain');
                dom.innerHTML = time_remaining_f;
        }
        if(show_est_speed){
                dom = document.getElementById('speed');
                dom.innerHTML = Kbyte_speed;
        }

        dom = null;
}

// Get the progress of the upload
function getProgressStatus(){
        var jsel = document.createElement('SCRIPT');
        var day = new Date;
        var dom;

        if(document.getElementById('ajax_div')){
                dom = document.getElementById('ajax_div');
                dom.innerHTML = '';
        }
        else{ dom = document.body; }

        jsel.type = 'text/javascript';
        jsel.src = get_status_url + "&rnd_id=" + day.getTime();

        dom.appendChild(jsel);
        dom = null;
        jsel = null;
        day = null;
}

// Calculate the time spent uploading
function getElapsedTime(){
        seconds++;

        if(seconds == 60){
                seconds = 0;
                minutes++;
        }

        if(minutes == 60){
                minutes = 0;
                hours++;
        }

        var hr = "" + ((hours < 10) ? "0" : "") + hours;
        var min = "" + ((minutes < 10) ? "0" : "") + minutes;
        var sec = "" + ((seconds < 10) ? "0" : "") + seconds;
        var dom = document.getElementById('time')

        dom.innerHTML = hr + ":" + min + ":" + sec;

        dom = null;
        hr = null;
        min = null;
        sec = null;

        if(get_data_loop){ setTimeout("getElapsedTime()", 1000); }
}

// Make the progress bar smooth
function smoothCedricStatus(){

        if(info_width < progress_bar_width && !cedric_hold){
                info_width++;
                var dom = uploadStatus;
                dom.style.width = info_width + 'px';
                dom = null;
        }

        if(get_data_loop){
                clearTimeout(statusID);
                statusID = setTimeout("smoothCedricStatus()", info_time_width);
        }
}

// Make the bytes uploaded smooth
function smoothCedricBytes(){
        if(info_bytes < total_Kbytes && !cedric_hold){
                info_bytes++;
                var dom = document.getElementById('current');
                dom.innerHTML = info_bytes;
                dom = null;
        }

        if(get_data_loop){
                clearTimeout(bytesID);
                bytesID = setTimeout("smoothCedricBytes()", info_time_bytes);
        }
}

// Add one upload slot
function addUploadSlot(num){
        if(upload_range < max_upload_slots){
                if(num == upload_range){
                        var up = document.getElementById('upload_slots');
                        var dv = document.createElement("div");

                        dv.innerHTML = '<input type="file" name="upfile_' + upload_range + '" size="90" onChange="addUploadSlot('+(upload_range + 1)+')" onKeypress="return handleKey(event)">';
                        up.appendChild(dv);
                        upload_range++;
                        up = null;
                        dv = null;
                }
        }
}

