/*  Media Converter - Firefox Extension Wizard
 *  (c) 2009 Pascal Beyeler
 *--------------------------------------------------------------------------*/

/**
*
* view loader
*
**/

function wizardLoadView(view) {

	//get the content and display the window
	new Ajax.Request('/firefox/' + view + '/' + Math.random(), {
		method: 'get',
		contentType: 'text/html' ,
		onSuccess: function(transport) {

			setTimeout(function() {

				new Effect.Opacity($('content'), { from: 1, to: 0, duration: 0.1, afterFinish: function() {
					var content = transport.responseText;
					$('content').innerHTML = content;

					//show the conversion limit
					$('status_message').style.display = 'block';

					//show or hide the buttons
					if(queue.step === 0) {
						//format selection
						$('button_left').style.display = 'none';
						$('button_right').style.display = 'none';

						//set the onclick event for the next button
						$('next_step').onclick = setOutputFormat;
					} else if(queue.step === 1) {
						//advanced settings
						$('button_left').style.display = 'block';
						$('button_right').style.display = 'block';

						//set the onclick event for the next button
						$('next_step').onclick = setAdvancedOptions;

					} else {
						//last two steps
						$('button_left').style.display = 'none';
						$('button_right').style.display = 'none';
					}

					new Effect.Opacity($('content'), { from: 0, to: 1, duration: 0.1});

					content.evalScripts();

				}});
			}.bind(this),0);

		}
	});

}

function prevStep() {

	wizardLoadView(queue.steps[--queue.step]);

}

function showNextButton(format) {

	if(format != '') {
		$('button_right').style.display = 'block';
	} else {
		$('button_right').style.display = 'none';
	}

}

function setOutputFormat() {

	if($F('wizard_filetype') != '') {
		//push the format to the settings array
		queue.settings['output'] = $F('wizard_filetype');

		//remember the choice
		Cookie.set('wizard_filetype',$F('wizard_filetype'),604800);

		//redirect
		if(!$('wizard_advanced').checked) {
			//remember the choice
			Cookie.unset('wizard_advanced');

			//start the conversion
			queue.step = queue.step + 2;
			wizardLoadView(queue.steps[queue.step]);
		} else {
			//remember the choice
			Cookie.set('wizard_advanced','true',604800);

			//go to the advanced settings
			wizardLoadView(queue.steps[++queue.step]);
		}
	}

}


function setAdvancedOptions() {

	//audio codec
	if($('wizard_audiocodec').value != '') {
		//remember the choice
		Cookie.set('wizard_audiocodec',$('wizard_audiocodec').value,604800);
		queue.settings['acodec'] = $('wizard_audiocodec').value;
	} else {
		Cookie.unset('wizard_audiocodec');
		delete(queue.settings['acodec']);
	}

	//audio bitrate
	if($('wizard_audiobitrate').value != '') {
		//remember the choice
		Cookie.set('wizard_audiobitrate',$('wizard_audiobitrate').value,604800);
		queue.settings['ab'] = $('wizard_audiobitrate').value;
	} else {
		Cookie.unset('wizard_audiobitrate');
		delete(queue.settings['ab']);
	}

	//video codec
	if($('wizard_videocodec')) {
		if($('wizard_videocodec').value != '') {
			//remember the choice
			Cookie.set('wizard_videocodec',$('wizard_videocodec').value,604800);
			queue.settings['vcodec'] = $('wizard_videocodec').value;
		} else {
			Cookie.unset('wizard_videocodec');
			delete(queue.settings['vcodec']);
		}
	}

	//video bitrate
	if($('wizard_videobitrate')) {
		if($('wizard_videobitrate').value != '') {
			//remember the choice
			Cookie.set('wizard_videobitrate',$('wizard_videobitrate').value,604800);
			queue.settings['b'] = $('wizard_videobitrate').value;
		} else {
			Cookie.unset('wizard_videobitrate');
			delete(queue.settings['b']);
		}
	}

	//offset
	if($('wizard_offset').value != '') {
		//remember the choice
		Cookie.set('wizard_offset',$('wizard_offset').value,604800);
		queue.settings['ss'] = $('wizard_offset').value;
	} else {
		Cookie.unset('wizard_offset');
		delete(queue.settings['ss']);
	}

	//duration
	if($('wizard_duration').value != '') {
		//remember the choice
		Cookie.set('wizard_duration',$('wizard_duration').value,604800);
		queue.settings['t'] = $('wizard_duration').value;
	} else {
		Cookie.unset('wizard_duration');
		delete(queue.settings['t']);
	}

	//resolution
	if($('wizard_resolution')) {
		if($('wizard_resolution').value != '') {
			//remember the choice
			Cookie.set('wizard_resolution',$('wizard_resolution').value,604800);
			queue.settings['s'] = $('wizard_resolution').value;
		} else {
			Cookie.unset('wizard_resolution');
			delete(queue.settings['s']);
		}
	}

	//start the conversion
	wizardLoadView(queue.steps[++queue.step]);

}

/**
*
* the queue manager class
*
**/

var queueManager = Class.create({

	initialize: function() {
		//set up the cross domain flash
		f4a_setup();

		//if no ad is displayed the user is logged in
		this.loggedin = $F('is_premium') == 'false' ? false : true;
		this.settings = new Object();
		this.steps = new Array('format','advancedsettings','conversion','finish');
		this.step = 0;
		this.jobs = new Array();

		if(this.loggedin) {
			$('status_message').update('');
			this.jobsleft = 5;
			wizardLoadView(this.steps[0]);
		} else {
			this.jobsleft = 0;
			this.getJobsLeft();

		}

	},

	getJobsLeft: function() {

		var postBody = escape('loggedin=' + this.loggedin);
		new f4a.Request('http://db.mediaconverter.org/wizard/jobsleft/' + Math.random(), {
			method: 'post',
			postBody: postBody,
			contentType: 'application/x-www-form-urlencoded',
			onSuccess : function(transport) {

				setTimeout(function() {
					var response = str2xml(transport);
					var root_node = response.getElementsByTagName('root')[0];
					var count = root_node.getElementsByTagName('count')[0].firstChild.nodeValue;

					$('conversionsleft').innerHTML = count;
					this.jobsleft = count;

					if(count == '0') {
						wizardLoadView('limitreached');
					} else {
						wizardLoadView(this.steps[0]);
					}
				}.bind(this),0);

			}.bind(this)
		});

	},

	add: function(id,source,server) {

		//decrease the conversion limit
		this.jobsleft -= 1;
		$('conversionsleft').innerHTML = queue.jobsleft;

		this.jobs.push(new queueObject(id,source,server));

	},

	invoke: function() {

		//set the onclose event to make sure the user doesn't leave the website during the conversion
		window.onbeforeunload = function() {
				return translation.get('onclose');
		}

		for(var i = 0; i < this.jobs.length; i++) {

			var job = this.jobs[i];
			var postBody = 's=' + escape(job.source) + '&id=' + escape(job.id) + '&jobid=' + i;
			new f4a.Request('http://' + this.jobs[i].server + '.mediaconverter.org/wizard/download/' + Math.random(), {
				method: 'post',
				postBody: postBody,
				contentType: 'application/x-www-form-urlencoded',
				onSuccess : function(transport) {

					var response = str2xml(transport);
					var root_node = response.getElementsByTagName('root')[0];
					var status = root_node.getElementsByTagName("status")[0].firstChild.nodeValue;
					var message = root_node.getElementsByTagName("message")[0].firstChild.nodeValue;
					var jobid = root_node.getElementsByTagName("jobid")[0].firstChild.nodeValue;
					var id = root_node.getElementsByTagName("id")[0].firstChild.nodeValue;

					if(status == '0') {
						this.jobs[jobid].title = message;
						this.jobs[jobid].interval = window.setInterval("queue.progress('download','" + id + "','" + jobid + "')",4000);
					} else {
						this.finalize(jobid,2,message);
					}

				}.bind(this)
			});

		}

	},

	progress: function(type,id,jobid) {

		var status = '';

		new f4a.Request('http://' + this.jobs[jobid].server + '.mediaconverter.org/progress/' + type + '/' + id + '/' + Math.random(), {
			method: 'get',
			onSuccess : function(transport) {
				setTimeout(function() {

					var response = str2xml(transport);
					var root_node = response.getElementsByTagName('root')[0];
					var status = root_node.getElementsByTagName("status")[0].firstChild.nodeValue;
					var percentage = root_node.getElementsByTagName("percentage")[0].firstChild.nodeValue;

					if(status == '0' || status == '1' || status == '2') {
						window.clearInterval(queue.jobs[jobid].interval);

						if(status == '0') {
							percentage = 100;

							if(type == 'download') {
								//start the conversion
								this.convert(jobid);
							}else if(type == 'conversion') {
								//create the download link
								this.finalize(jobid,1,translation.get('done'));
								return;
							}

						} else if(status == '2') {
							this.finalize(jobid,2,translation.get('toolarge'));
							return;
						} else {
							this.finalize(jobid,2,translation.get('failed'));
							return;
						}
					}
					this.showProgress(type,id,percentage);
				}.bind(this),0);
			}.bind(this)
		});

	},

	showProgress: function(type,id,percentage) {

		var bar = $$('.progressbar')[0].select('div');
		var nr = type == 'download' ? 1 : 2;
		var startfrom = bar[nr].getWidth();
		new Effect.Scale(bar[nr],percentage,{
				scaleX: true,
				scaleY: false,
				scaleMode: {originalWidth: 100},
				scaleFrom: startfrom,
				duration: 0.5
			}
		);

	},

	convert: function(jobid) {

		var postBody = '';

		//put all settings together
		for(var index in this.settings) {
			var value = this.settings[index];
			postBody += index + '=' + escape(value) + '&';
		};

		//ids
		postBody += 'id=' + escape(this.jobs[jobid].id) + '&jobid=' + escape(jobid);

		new f4a.Request('http://' + this.jobs[jobid].server + '.mediaconverter.org/wizard/convert/' + Math.random(), {
			method: 'post',
			postBody: postBody,
			contentType: 'application/x-www-form-urlencoded',
			onSuccess : function(transport) {

				setTimeout(function() {

					var response = str2xml(transport);
					var root_node = response.getElementsByTagName('root')[0];
					var status = root_node.getElementsByTagName("status")[0].firstChild.nodeValue;
					var message = root_node.getElementsByTagName("message")[0].firstChild.nodeValue;
					var jobid = root_node.getElementsByTagName("jobid")[0].firstChild.nodeValue;
					var id = root_node.getElementsByTagName("id")[0].firstChild.nodeValue;

					if(status == '0') {
						this.jobs[jobid].interval = window.setInterval("queue.progress('conversion','" + id + "','" + jobid + "')",4000);
					} else {
						this.finalize(jobid,2,message);
					}

				}.bind(this),0);

			}.bind(this)
		});

	},

	finalize: function(jobid,status,message) {

		//the conversion finished successfully
		if(status === 1) {

			wizardLoadView('finish');

		//the conversion failed
		} else if (status === 2) {
			$('status_message').innerHTML = message;
			$('status_message').style.color = '#FF0000';
			this.jobs[jobid].status = 2;
		}

		//remove the onbeforeunload event
		window.onbeforeunload = null;

	}

});



var queueObject = Class.create({

	initialize: function(id,source,server) {

		this.source = source; //url or file name
		this.id = id;
		this.status = 0; //0 = ready; 1 = done; 2 = failed
		this.interval = false;
		this.title = false;
		this.server = server;

	}

});



/**
*
* youtube browser
*
**/


function browseYoutube(term,page) {

	$('browseyoutube_content').innerHTML = '';
	var newimg = document.createElement('img');
	newimg.setAttribute('src','/assets/public/images/ajax-loader.gif');
	$('browseyoutube_content').appendChild(newimg);
	var postBody = 'q=' + escape(term) + '&p=' + page;

	if($('browseyoutube_showthumbnails').checked) {
		postBody += '&t=true';
		Cookie.set('browseyoutube_showthumbnails','true',604800);
	} else {
		postBody += '&t=false';
		Cookie.set('browseyoutube_showthumbnails','false',604800);
	}

	new Ajax.Request('/wizard/youtuberesults/' + Math.random(), {
		method: 'post',
		postBody: postBody,
		contentType: 'application/x-www-form-urlencoded' ,
		onSuccess: function(transport) {

			new Effect.Opacity($('browseyoutube_content'), { from: 1, to: 0, duration: 0.1, afterFinish: function() { $('browseyoutube_content').innerHTML = transport.responseText; new Effect.Opacity($('browseyoutube_content'), { from: 0, to: 1, duration: 0.1});}});

		}
	});

}

function addYoutubeVideo(id,source,server) {

	if(queue.jobsleft > 0) {
		queue.add('link',id,source,server,0);
		$('browseyoutube_result' + id).innerHTML = '<b>' + translation.get('added') + '</b>';
	} else {
		alert(translation.get('limit_reached'));
	}

}

/**
*
* helper functions
*
**/

function str2xml(str) {

	// IE
	if(document.all) {
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(str);

	// other browsers
	} else {
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(str,"text/xml");
	}

	return xmlDoc;

}
