var SWFUpload = function(settings)
{
	try{document.execCommand('BackgroundImageCache',false,true);}catch(e){};
	
	this.movieName="SWFUpload_"+SWFUpload.movieCount++;
	this.init_settings(settings);
	SWFUpload.flash_callers.push(this);
};

SWFUpload.movieCount=0;						//сквозной счетчик уникальных аплоадеров
SWFUpload.flash_callers=[];					//коллекция загружаемых объектов
SWFUpload.called_flash=null;				//вызванный "обзор файлов" объекта SWFUpload

SWFUpload.SetIndex=function(index)
{
	if (typeof SWFUpload.flash_callers[index] == 'undefined') return;
	
	SWFUpload.called_flash = SWFUpload.flash_callers[index];
	
	return (typeof SWFUpload.called_flash.reinit_settings=='function' ? SWFUpload.called_flash.reinit_settings() : true);
}

SWFUpload.check_index=function(index)
{
	if (typeof SWFUpload.flash_callers[index] == 'undefined') return;
	
	return true;
}

SWFUpload.prototype.init_settings=function(settings)
{
	// UI setting
	this.settings=
	{
		'browse_target'					: "",						//Объект или идентификатор объекта, на который срабатывает ОБЗОР
		'upload_target'					: "",						//Объект или идентиф объекта, кликом на который начинается загрузка файлов
		'upload_backend'				: '',						//Адрес куда загружать файлы
		'upload_script'					: '',						//
		'response_script'				: "",						//Адрес с которого спрашивается состояние о загруженном файле
		'upload_ready_callback'			: function(index)
		{
			if(!SWFUpload.check_index(index)) return;
			
			SWFUpload.flash_callers[index].flashLoaded();
		},						//Функция к которой мы обращаемся после того как флешь подгрузился,
		'upload_start_callback'			: null,						//Функция вызываемая при старте закачки любого файла
		'upload_complete_callback'		: null,						//Функция вызываемая при завершении закачки
		'upload_progress_callback'		: null,						//Функция вызываемая в процессе закачки
		'upload_dialog_cancel_callback'	: null,						//Если мы хотим остановить загрузку stopUpload,cancelUpload,cancelQueue
		'upload_error_callback'			: null,						//Ошибки при закачке
		'upload_queue_complete_callback': null,						//Функция вызываемая при полном завершении очереди закачек
		'upload_cancel_callback'		: null,						//Функция вызываемая при отмене полной закачки, вызывается сразу после "upload_dialog_cancel_callback"
		'begin_uploads_immediately'		: true,						//Закачка стартует немедленно после выбора файлов, но только если не выбран upload_target
		'allowed_filetypes'				: '*.*',					//Типы файлов, которые можно выбрать внутри флешь обзора
		//'allowed_filesize'			: 1000,						//Максимальный размер файла
		//'upload_limit'				: 0,						//количество файлов для загрузки
		'flash_path'					: '/@/file/upload.swf',		//путь к флешь загрузчику
		'flash_target'					: '',						//
		//'flash_width'					: '1px',					//ширина флешь movie
		//'flash_height'				: '1px',					//высота флешь movie
		//'flash_color'					: '#000000',				//цвет фона под флешем
		'debug'							: false,					//отладка
		'debug_callback'				: null,						//функция обратной связи при дебаггинге
		'index_store'					: SWFUpload.flash_callers.length
	};
	
	if(!settings['response_script']) settings['response_script'] = settings['upload_script'];
	if(settings['upload_target'] && !$(settings['upload_target'])) settings["begin_uploads_immediately"] = true;
	
	var tmp={};
	
	for(var k in this.settings)
	{
		if(typeof(settings[k]) == "undefined" && settings[k] !== null)
		{
			if(this.settings[k]==='') continue;
			
			if(this.settings[k]===null)
			settings[k] = k;
			else
			settings[k] = this.settings[k];
		}
		
		if(k == 'upload_backend')
		settings[k] = encodeURIComponent(settings[k]);
		else if(typeof(settings[k]) == 'string' && k.substring(k.length-9) == '_callback' && !/\./.test(settings[k]))
		settings[k] = 'SWFUpload.called_flash.'+settings[k];
			
		tmp[k]=settings[k];
	}
	
	this.settings={};
	
	for(var k in tmp)
	{
		this.settings[k]=tmp[k];
	}
	
	tmp=null;
	
	// Debug Settings
	if (this.settings["debug"])
	this.settings["debug_callback"] = "console.log";
	
	this.debug=this.settings["debug"];
	
};

SWFUpload.prototype.loadFlash=function()
{
	var content;
	var get = this.settings;
	get['flash_width']=get['flash_height']='100%';
	
	var flash_vars = this._getFlashVars();
	
	var name = this.movieName;
	
	
	
	if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length)
	{
		var html = '';
		html +='<embed src="'+get['flash_path']+'" id="'+name+'" name="'+name+'" quality="high" menu="true" type="application/x-shockwave-flash" ';
		html +='style="display:block;height:100%;width:100%;position:absolute" flashvars="'+flash_vars+'" width="'+get['flash_width'];
		html +='" height="'+get['flash_height']+'" wmode="transparent"/>';
	}
	else
	{
		window.onbeforeunload = function()
		{
			if (document.all) window.onunload = null;
		}
		
		var html = '';
		html += '<object id="'+name+'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+get['flash_width']+'" height="'+get['flash_height']+'" style="display:block;position:absolute;">'+"\r\n";
		html += '<param name="movie" value="'+get['flash_path']+'" />'+"\r\n";
		//html += '<param name="bgcolor" value="'+get['flash_color']+'" />'+"\r\n";
		html += '<param name="quality" value="high" />'+"\r\n";
		html += '<param name="wmode" value="transparent" />'+"\r\n";
		html += '<param name="menu" value="false" />'+"\r\n";
		html += '<param name="flashvars" value="'+flash_vars+'" />'+"\r\n";
		html += '</object>';
	};
	
	var container=$e("span",{style:{width:'100%',height:'100%',display:'block',position:'absolute',top:'0',left:'0',zIndex:'10'}});
	var child=$(this.settings.browse_target);
	child.style.position='relative';
	child.style.overflow='hidden';
	
    child.appendChild(container);
    
    container.innerHTML=html;
    
	this.movieElement=$(name);
	
	if (typeof(window[this.movieName]) == "undefined" || window[this.moveName] != this.movieElement) {
		window[this.movieName] = this.movieElement;
	}
	
	if(this.debug) this.debugSettings();
};

SWFUpload.prototype._getFlashVars=function()
{
	var get = this.settings;
	var flash_set = 
	[
		'upload_backend','upload_ready_callback','upload_start_callback','upload_progress_callback',
		'upload_complete_callback','upload_dialog_cancel_callback','upload_error_callback',
		'upload_cancel_callback','upload_queue_complete_callback',
		'debug_callback','begin_uploads_immediately','allowed_filetypes',
		'allowed_filesize','upload_limit','index_store'
	];
	
	var text='';
	for(var i=0; i<flash_set.length; i++)
	{
		var k=flash_set[i];
		
		if(typeof get[k] == 'undefined' || get[k]===null) continue;
		
		if(text) text +='&';
		
		text += k.replace(/_(\w)/g, function ($0, $1) {return $1.toUpperCase()})+'='+get[k];
	}
	
	return text;
};

SWFUpload.prototype.flashLoaded=function()
{
	this.loadUI();
	if(this.debug) SWFUpload.debug("Flash called home and is ready.");
};

SWFUpload.prototype.loadUI=function()
{
	var self=this;
	
	this.settings.browse_target=$(this.settings.browse_target);
	
	if(!this.settings.browse_target)
	{
		alert('Неправильно определен упраляющий элемент')
		return;
	};
	
	(function(ev)
	{
		ev.preventDefault();
		
		SWFUpload.SetIndex(self.index_store);
		
		self.browse();
		
	}).attach('click', this.settings.browse_target);
	
	if(this.settings.begin_uploads_immediately != false)
	return;
	
	this.settings.upload_target=$(this.settings.upload_target)
	
	(function(ev)
	{
		ev.preventDefault();
		self.upload();
	}).attach('click', this.settings.upload_target);
};

SWFUpload.debug=function(value){if(window.console)console.log(value);else alert(value);};
SWFUpload.prototype.browse=function(){this.movieElement.uploadFile();};
SWFUpload.prototype.upload=function(){this.movieElement.startUpload();};
SWFUpload.prototype.stopUpload=function(){this.movieElement.stopUpload();};
SWFUpload.prototype.cancelUpload=function(file_id){this.movieElement.cancelUpload(file_id);};
SWFUpload.prototype.cancelQueue=function(){this.movieElement.cancelQueue();};
SWFUpload.prototype.setPost=function(obj){if(typeof obj != 'object') obj={}; this.movieElement.setPostData(obj);};
SWFUpload.prototype.setUri=function(uri){if(typeof uri != 'string') return; try{this.movieElement.setDestination(uri);}catch(e){}};

SWFUpload.prototype.init_callback=function(settings)
{	
	var self=this;
	
	this.file_progress_bar=$e('li',{className:'upload_files'},
	[
		$e('div',{className:'upload_files'},
		[
			$e('div',{className:"upload_files_file_name"}),
			$e('div',{className:"right"},'X'),
			$e('div',{className:'both'})
		]),
		$e('div',{className:'upload_file'},
		[
			$e('div',{className:'upload_file_line'},$e('span','0%')),
			$e('div',{className:'upload_file_state'},'0%')
		])
	]);
	
	this.max_height=202;
	this.total_size = 0;
	this.upload_status = {};
	this.files={};
	this.time=null;
	
	this.progress		= $(settings['progress']);
	this.progress_line	= $(settings['progress_line']);
	this.progress_files	= $(settings['progress_files']);
	
	this.reinit_settings = function (){return true};
	
	this.upload_start_callback = function (data)
	{
		if(this.time) clearTimeout(this.time);
		
		var tag = this.file_progress_bar.cloneNode(true);
		var divs = tag.getElementsByTagName('div');
		
		$e(divs[1],data.name);
		divs[1].title=divs[2].title=data.name;
		
		(function()
		{
			U_file_operate.reason(this);
			
		}).attach('click',divs[2]);
		
		var childs = this.progress_files.childNodes;
		childs[0].parentNode.insertBefore(tag,childs[0]);
		
		tag=divs[4];
		
		this.total_size += data.size;
		
		this.upload_status[data.id] = {'uploaded':0,'tag':tag};
		
		if(!this.progress_line) return;
		
		this.progress_line.style.height = this.max_height+'px';
		this.progress.style.display = '';
	};
	
	this.upload_complete_callback = function (data)
	{
		this.upload_progress_draw(data,data.size);
		
		return;
	};
	
	this.upload_progress_draw=function(data,upload)
	{
		if(this.time) clearTimeout(this.time);
		
		if(!this.total_size) return;
		
		this.upload_status[data.id]['uploaded'] = upload;
		
		var tag = this.upload_status[data.id]['tag'].getElementsByTagName('div');
		var loaded=Math.round((upload/data.size)*100)+'%';
		
		if(loaded=='100%')
		tag[0].style.backgroundColor='gray';
		
		tag[0].style.width	= loaded;
		tag[1].innerHTML	= loaded;
		tag[0].getElementsByTagName('span')[0].innerHTML = loaded;
		
		if(!this.progress_line) return;
		
		var uploaded = 0;
		
		for (var k in this.upload_status)
		uploaded += this.upload_status[k]['uploaded'];
		
		this.progress_line.style.visibility='hidden';
		this.progress_line.style.height = Math.round((1-(uploaded / this.total_size)) * this.max_height)+'px';
		this.progress_line.style.visibility='visible';
	}
	
	this.upload_progress_callback = function (data, upload, total)
	{
		//console.log(4);
		this.upload_progress_draw(data,upload);
	};
	
	this.upload_queue_complete_callback = function ()
	{		
		//console.log(5);
		//console.log(arguments);
		this.time=setTimeout(function()
		{
			for(var k in self.upload_status)
			{
				var div=self.upload_status[k]['tag'];
				div.parentNode.removeChild(div);
			}
			
			self.upload_status	= {};
			self.total_size		= 0;
			
			if(!self.progress_line) return;
			
			self.progress_line.style.height=self.max_height+'px';
			
		}, 4000);
	};
	
	this.upload_cancel_callback = function()
	{
		//console.log(6);
		//console.log([arguments,0]);
	};
	
	this.upload_dialog_cancel_callback = function()
	{
		//console.log(7);
		//console.log([arguments,1]);
	};
	
	this.upload_error_callback = function (code,data,errcode)
	{
		switch(code)
		{
			case-10:alert("Ошибка заливки файла: "+data.name+", HTTP Error "+errcode);break;
			case-20:alert("Error Code: No upload script, File name: "+data.name+", Message: "+errcode);break;
			case-30:alert("Error Code: IO Error, File name: "+data.name);break;
			case-40:alert("Error Code: Security Error, File name: "+data.name+", Message: "+errcode);break;
			case-50:alert("Filesize exceeds limit ("+this.settings['allowed_filesize']+' bytes), File "'+data.name+'" size: '+data.size);break;
			case-50:alert("Error Code: File too big, File name: " + data.name + ", File size: " + data.size + ", Message: " + msg);break;
			case-60:alert("Error Code: Upload limit reached, File name: " + data.name + ", File size: " + data.size + ", Message: " + msg);break;
			case-70:alert("Error Code: Upload Initialization exception, File name: " + data.name + ", File size: " + data.size + ", Message: " + msg);break;
			default:alert(code);
		}
	}
};

SWFUpload.prototype.debugSettings=function()
{
	var text = '';
	
	text += "----- DEBUG SETTINGS START ----\n";
	text +="ID: "+this.movieElement.id+"\n";
	
	for(var key in this.settings)
	text += key+": "+this.settings[key]+"\n";
	
	text +="----- DEBUG SETTINGS END ----\n\n";
	
	SWFUpload.debug(text);
};