/**
 * @include "./uploadify/jquery.uploadify.v2.1.0.js"
 */

var singleID = "Single";
var idStr = 'X-Progress-ID';
var http = "http://";
var uploadInfo = 'uploadInfo';
var uploadCheck = 'uploadCheck';
var quick_upload = false;
var submitAdded = false;
var defaultTimeout = 1000;
var start, time, errors, largeFiles;
var uploaderId = "uploader";
var uploaderQueueId = "uploading-page";
var totalSize, uploadedSize, uploadSpeed, uploadPercent, statusWidth, statusTotalWidth;

/**
 * Utils
 */
function logToConsole(str)
{
	if (typeof(console) == "object")
	{
		console.log(str);
	}
}

/**
 * filesize output
 * 
 * @param {}
 *            size
 * @return {}
 */
function fileSizeAsString(size)
{
	var size_obj = Units.getFileSize(size);
	return size_obj.size + " " + locale.upload[size_obj.units];
}

/**
 * time output
 * 
 * @param {}
 *            time
 * @return {}
 */
function timeAsString(time)
{
	var str = "";
	var time_obj = Units.getTimeReadable(time);
	var num = Math.min(time_obj.digits.length, 2);
	for (i = 0; i < num; i++)
	{
		str += time_obj.digits[i] + " " + locale.upload[time_obj.units[i]] + " ";
	}
	return str;
}

/**
 * Форма загрузки на главной странице
 */
function configQuickForm()
{
	$('#uploadForm').submit(function()
	{
		var file = $('input[type=file]', this).val();
		if(file && file.length > 0)
		{
			$('#uploadForm').addClass('hidden');
			$('#uploadProgress').removeClass('hidden');
			upload();
		}
		return false;
	});
}

/**
 * Форма загрузки файла если выбран ли хотя бы 1 файл, построить очередь
 */
function configAltUploadForm()
{	
	// загрузка по 1 файлу через форму
	var fileForm = $('.nonflashupload .uploadForm');
	fileForm.submit(function()
	{
		var form = this;
		var val = $('input[type=file]', form).val();
		if (val != null && val.length > 0)
		{
			readyForUpload();
		}
		return false;
	});
}

function isNumber(x)
{
	return ((typeof x === typeof 1) && (null !== x) && isFinite(x));
}

function readyForUpload()
{
	// $('#select-upload-type-page').addClass('hidden');
	// statusTotalWidth = $('#uploading-indicator-holder').width();
	if (flash)
	{
		$('#uploading-queue').removeClass('hidden');
		$('#uploading-page div.upload-progress').removeClass('hidden');
		$('#' + uploaderId + 'UploaderDiv').css(
			{
				'left' : '-5000px',
				'top' : '-5000px'
			});
	}
	else // загрузка через форму
	{
		$('#uploading-queue').addClass('hidden');
		var full_filename = $("#uploadForm input[type=file]").val();
		var filename = getFileNameFromUrl(full_filename);
		showUploadProgress(filename);
		addFileToQueue(filename);
	}
	startUpload();
}

function getFileNameFromUrl(url)
{
	var parts = url.split(/\\|\//);
	var name = parts[parts.length - 1];
	parts = name.split('?');
	return parts[0];
}

function addFileToQueue(filename)
{
	/*
	 * $('#' +uploaderQueueId).find('ul').append('<li id="' + uploaderId + singleID + '">\
	 * <div id="' + uploaderId + singleID + 'ProgressBar" class="progress-bar"><c:out
	 * value=" " /></div>\ <div class="filename">' + filename + '</div>\ <div
	 * class="filesize">' + '' + '</div>\ <a class="delete-file red" href="'+
	 * urls.indexPage +'" title="'+locale.uploadify.exclude+'">Удалить</a>\
	 * </li>');
	 */
	setFooter(
		{
			'fileCount' : 1,
			'allBytesTotal' : ''
		});

}
/**
 * Starts uploading process; shows upload statistics
 */
function startUpload()
{
	start = new Date().getTime();
	var percent = 0;
	errors = 0;
	$('#uploading-indicator').css('width', 0);
	// $("#uploading-status-text").text(locale.upload.progress); // Если файл
	// один, то поменять на «Идет загрузка файла...»
	$("#uploadify-button").css('opacity', '0.5');
	// Показываем строку со	скоростью загрузки и временем
	$(".upload-status-bar").removeClass('invisible'); 
	// Скрываем кнопку начала загрузки
	$("#uploading-start").addClass('hidden');

	/*
	 * $(".tagBox").fcbkcomplete({ // превращаем select в input с тегами
	 * json_url: urls.listTags, cache: true, filter_case: true, filter_hide:
	 * true, firstselected: true, filter_selected: true, complete_text: 'Введите
	 * имя метки и нажмите Enter или выберите из списка', maxitems: 15, newel:
	 * true });
	 */
	
	if (flash)
	{
		$('#' + uploaderId).uploadifyUpload();
	}
	else
	{
		upload();
	}
	return false;
}

function upload()
{
	var uploadFormAction = document.getElementById('uploadForm').action;
	var uploadInfoAction = uploadFormAction.replace(/uploadFile;jsessionid=(.*)?Upload=Complete&/, uploadInfo + '?');
	var uploadCheckAction = replace(uploadInfoAction, uploadInfo, uploadCheck);
	var ind = uploadInfoAction.indexOf('.');
	if (ind > 0 && uploadInfoAction.indexOf(':', 'http://'.length) < 0)
	{
		var parts = location.href.split('/')[2].split('.');
		var up = uploadInfoAction.substring(http.length, ind);
		uploadInfoAction = replace(uploadInfoAction, http + up + '.', http
			+ (parts.length > 2 ? parts[parts.length - 3] : 'www') + '.');
		uploadCheckAction = replace(uploadInfoAction, uploadInfo, uploadCheck);
		uploadInfoAction = replace(uploadInfoAction, uploadInfo + '?', uploadInfo + '/' + up + '/?');
	}

	$('#uploadForm').ajaxSubmit(
		{
			'type' : 'POST',
			'iframe' : true,
			'success' : function(responseText)
			{
				// window.location.href = responseText;
			}
		});
	updateProgressTimeout(uploadInfoAction, uploadCheckAction, new Date().getTime(), defaultTimeout);
}

function showUploadProgress(filename)
{
	$("#uploading-page div.upload-cancel").addClass("hidden");
	$(".upload-url-start").removeClass("hidden");
	$(".upload-url-start span").html(filename);
	$(".upload-url-end span").html(filename);
	$(".upload-progress").removeClass("hidden");
}

/**
 * @param {String}
 *            uploadInfoAction
 * @param {String}
 *            uploadCheckAction
 * @param {Number}
 *            start
 */
function updateProgress(uploadInfoAction, uploadCheckAction, start)
{
	var count = 0;
	$.ajax({
		url: replace(uploadInfoAction, idStr, '_dc=' + new Date().getTime() + '&' + idStr),
		success: function(data) 
		{
			var percent = 0;
			var result = eval('(' + data + ')');
			if (result.state == 'starting')
			{
				count++;
				if (count > 2)
				{
					checkUploaded(uploadCheckAction);
					count = 0;
				}
			}
			if ((result.received && result.received == result.size) || result.state == 'done')
			{
				percent = 100;
			}
			else if (result.size && result.received && result.size > 0)
			{
				percent = 100 * result.received / result.size;
			}
			percent = Math.round(percent);
			if (percent < 0)
			{
				percent = 0;
			}
			if (percent > 100)
			{
				percent = 100;
			}
			$('#uploading-indicator').css("width", percent + '%');
			$('#uploading-percent').html(percent + '%');
			if (percent == 100)
			{
				waitUntilUploaded(uploadCheckAction, defaultTimeout);
			}
			$('#uploader' + singleID + 'ProgressBar').css('width', percent + '%')
			if (result.received)
			{
				var time = ((new Date().getTime()) - start) / 1000; // sec
				var speed = (result.received / time);
				var estimated_time = 0;
				$('#uploading-speed em').html(fileSizeAsString(speed) + ' /' + locale.upload.s);
				if (result.size && result.size > 0)
				{
					estimated_time = Math.round((result.size - result.received) / speed);
					$('#uploading-estimated em').html(timeAsString(estimated_time));
				}
			}
			if ((result.state == 'starting' && result.received == null) || (result.received != result.size && result.state != 'done'))
			{
				updateProgressTimeout(uploadInfoAction, uploadCheckAction, start, defaultTimeout);
			}
		}
	});
}

/**
 * @param {String}
 *            str
 * @param {String}
 *            sub1
 * @param {String}
 *            sub2
 * @return {String}
 */
function replace(str, sub1, sub2)
{
	if(str)
	{
		return str.split(sub1).join(sub2);
	}
	return "";
}

/**
 * @param {String}
 *            uploadInfoAction
 * @param {String}
 *            uploadCheckAction
 * @param {Number}
 *            start
 * @param {Number}
 *            timeout
 */
function updateProgressTimeout(uploadInfoAction, uploadCheckAction, start, timeout)
{
	setTimeout(function()
	{
		updateProgress(uploadInfoAction, uploadCheckAction, start);
	}, timeout);
}

/**
 * @param {Number}
 *            timeout
 */
function waitUntilUploaded(uploadCheckAction, timeout)
{
	setTimeout(function()
	{
		checkUploaded(uploadCheckAction, defaultTimeout);
	}, timeout);
}

function checkUploaded(uploadCheckAction, timeout)
{
	$.getJSON(replace(uploadCheckAction, idStr, '_dc=' + new Date().getTime() + '&' + idStr), {}, function(data)
	{
		if (data && data.uploaded)
		{
			$("#uploading-page div.upload-progress").addClass("hidden");
			$("#uploading-page div.upload-url-start").addClass("hidden");
			$("#uploading-page div.upload-url-end").removeClass("hidden");
			//if (quick_upload)
			{
				window.location.href = urls.filesOfUser;
			}
		}
		else
		{
			setTimeout(function()
			{
				checkUploaded(uploadCheckAction, timeout);
			}, timeout);
		}
	});
}

/**
 * On page load
 */
$(document).ready(function()
{
	quick_upload = $('#uploadForm').hasClass('quick-upload');
	// главная страница
	if (quick_upload)
	{
		configQuickForm();
		return;
	}
	// страница загрузки
	if (flash == "true" || flash == "false")
	{
		flash = (flash == "true");
	}
	else
	{
		flash = jQuery.browser.flash; // проверяем браузер на наличие флэша
	}

	if (flash)
	{
		$("#content div.flashupload").removeClass("hidden");
		$("#content div.nonflashupload").addClass("hidden");
		configUploader();
	}
	else
	{
		$("#content div.nonflashupload").removeClass("hidden");
		$("#content div.flashupload").addClass("hidden");
		configAltUploadForm();
	}

	new_input = function(obj)
	{
		_input = document.createElement('input');
		_input.type = "file";
		_input.name = "file[]";
		$("#content div.nonflashupload div.upload-file-list").append(_input);
	}

	$("a.append-file").bind("click", function()
	{
		new_input($(this));
		return false;
	});
	$("#clear-uplodify-queue").bind("click", function()
	{
		$("#uploading-page div.upload-progress").addClass("hidden");
		$("#uploading-page div.upload-cancel").removeClass("hidden");
		$("#uploading-page a.upload-cancel-submit").bind("click", function()
		{
			$("#uploader").uploadifyClearQueue();
			$("#uploading-page div.upload-cancel").addClass("hidden");
			$("#uploading-queue").addClass("hidden");
			$("#uploading-page div.upload-url-end").addClass("hidden");
			$('#content div.flashupload div.upload-url').removeClass('hidden');
			$("#uploadify-button").css('opacity', '1');
			return false;
		});
		$("#uploading-page a.upload-continue").bind("click", function()
		{
			$("#uploading-page div.upload-cancel").addClass("hidden");
			$("#uploading-page div.upload-progress").removeClass("hidden");
			return false;
		});
		return false;
	});
	/*
	 * $("#uploading-page div.upload-end form a").click(function() {
	 * $("#to-my-files-after-upload").submit(); return false; });
	 */
	$("#uploading-start").click(function()
	{
		readyForUpload();
		return false;
	});
	$("#upload-always-redirect").attr('checked', $.cookie('upload-always-redirect'));
	$("#upload-always-redirect").change(function()
	{
		$.cookie('upload-always-redirect', this.checked,
		{
			path : '/'
		})
	});
});

function notifyOfLargeFiles()
{
	var error = largeFiles && largeFiles > 0;
	if (error)
	{
		alert("Файлов не загружено: " + largeFiles + ". Ошибка: размер превышает максимально допустимый.");
	}
	return error;
}
