Registry = {
	mode:'single',
	taskIndex:0,
	taskErr:[],
	show_stat:function() {
		alert('stat');
	},
	write_err:function(msg) {
		this.taskErr[this.taskIndex].push(msg);
	}
};
var taskList = [];
var readyFiles = [];
var taskDone = 0;

$(document).ready(function(){
	$("#uploadprogressbar").progressBar();
	$("#convertprogressbar").progressBar();
	$("#slider .inner").html('<br /><label for="rtype"><b>Convert to: </b></label><select name="rtype" id="rtype" class="required"><option value="">Choose a Format</option><option value="flv">FLV</option><option value="avi">AVI</option><option value="mp3">MP3</option><option value="wmv">WMV</option><option value="mov">MOV</option><option value="mp4">MP4</option></select><br /><br /><span class="notice">After selecting, press the GO button again</span><label class="error" id="rtype_err"></label>');
	$("input#button").unbind('click').click(function(e) {
		//e.preventDefault();
		this.blur();
		var action = $(this).attr('rel');
		if (action == 'slide') {
			slider('out', 118);
			$(this).attr('rel','in');
		}
		if (action == 'in') {
			formstart();
			$(this).attr('rel','null');
		}
	});
	//multi
	$("#multi").live('click', function(e){
		var sliderHeight = $('#slider').height();
		e.preventDefault();
		$(this).hide();
		$("#hidemulti").show();
		$("#url_mode").val('multi');
		$('#url').hide();
		$('#urls').show();
		$("#slider").animate({paddingTop:'78px'}, 250);
		////
		$("#advert").animate({marginTop:140+sliderHeight+"px"},250);
		$("#glow").animate({top:425+sliderHeight+"px"},250);
		$("#shadow").animate({top:194+sliderHeight+"px",opacity:"0.2"},250);
		$("#shadow2").animate({top:194+sliderHeight+"px"},250);
		////
		Registry.mode = 'multi';
		$.cookie('mode', 'multi');
	});
	//multi
	$("#hidemulti").live('click', function(e){
		e.preventDefault();
		var sliderHeight = $('#slider').height();
		$(this).hide();
		$("#multi").show();
		$("#url_mode").val('single');
		$('#url').show();
		$('#urls').hide();
		$("#slider").animate({paddingTop:'0px'}, 250);
		$("#advert").animate({marginTop:62+sliderHeight+"px"},250);
		$("#glow").animate({top:347+sliderHeight+"px"},250);
		$("#shadow").animate({top:116+sliderHeight+"px",opacity:"0.2"},250);
		$("#shadow2").animate({top:116+sliderHeight+"px"},250);
		Registry.mode = 'single';
		$.cookie('mode', 'single');
	});
	var mode = $.cookie('mode') ? $.cookie('mode') : 'single';
	if (mode == 'multi') {
		$("#multi").trigger('click');
	} else {
		$("#hidemulti").trigger('click');
	}
});

var slider = function(action, sliderHeight) {
	if (!sliderHeight) {
		sliderHeight = 118;
	}
	if(action == 'out') {
		if (Registry.mode == 'single') {
			$("#slider").animate({height:sliderHeight+8+"px"},250);
			$("#advert").animate({marginTop:62+sliderHeight+"px"},250);
			$("#glow").animate({top:347+sliderHeight+"px"},250);
			$("#shadow").animate({top:116+sliderHeight+"px",opacity:"0.2"},250);
			$("#shadow2").animate({top:116+sliderHeight+"px"},250);
		} else {
			$("#slider").animate({height:sliderHeight+18+"px"},250);
			$("#advert").animate({marginTop:72+sliderHeight+"px"},250);
			$("#glow").animate({top:357+sliderHeight+"px"},250);
			$("#shadow").animate({top:126+sliderHeight+"px",opacity:"0.2"},250);
			$("#shadow2").animate({top:126+sliderHeight+"px"},250);
		}
	} else {
		sliderHeight = 0;
		if (Registry.mode == 'single') {
			$("#slider").animate({height:sliderHeight+"px"},250);
			$("#advert").animate({marginTop:62+sliderHeight+"px"},250);
			$("#glow").animate({top:347+sliderHeight+"px"},250);
			$("#shadow").animate({top:116+sliderHeight+"px",opacity:"1"},250);
			$("#shadow2").animate({top:116+sliderHeight+"px"},250);
		} else {
			$("#slider").animate({height:sliderHeight+"px"},250);
			$("#advert").animate({marginTop:72+sliderHeight+"px"},250);
			$("#glow").animate({top:357+sliderHeight+"px"},250);
			$("#shadow").animate({top:126+sliderHeight+"px",opacity:"1"},250);
			$("#shadow2").animate({top:126+sliderHeight+"px"},250);
		}
	}
}
function beginRemoteUploadBatch(list) {
	taskList = list;
	readyFiles = [];
	Registry.taskIndex = 0;
	for(var i = 0; i < list.length; i++) {
		Registry.taskErr[i] = [];
	}
	taskDone = 0;
	beginRemoteUpload(taskList[Registry.taskIndex]);
}
function nextUpload() {
	Registry.taskIndex++;
	if (taskList.length > 1 && Registry.taskIndex < taskList.length) {
		beginRemoteUpload(taskList[Registry.taskIndex]);
	} else {
		taskDone = 1;
		var msg = "<br /><p>Task done!</p>";
		if (Registry.taskErr.length > 0) {
			msg += '<div style="color:#f00">';
			for (var i in Registry.taskErr) {
				msg += "<p>Errors "+Registry.taskErr[i]+'</p>';
			}
			msg += '<br /><a style="color:#fff" href="javascript:slider(\'in\');">close</a></div>';
		}
		$("#slider .inner").html(msg);
		restoreMainbox();
	}
}
function restoreMainbox() {
	$("#mainbox").html($('.mainbox_template').html());
	if (Registry.mode == 'multi') {
		$("#multi").trigger('click');
	} else {
		$("#hidemulti").trigger('click');
	}
}
function beginRemoteUpload (taskid) {
	
	$("#step2").attr('class','');
	slider('out', 118);
	$("#mainbox").html('<span class="progressbar" id="uploadprogressbar">0%</span>');
	try {
		$("#mainbox div.info").remove();
	} catch (e) {
		
	}
	$("#mainbox").append('<div class="info"></div>');
	/*var errorcheck = taskid.split("|");
	if(errorcheck[0]=="Status") {
		$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">'+errorcheck[1]+'  (Code: AjaxDD-e)</span>');
		return;
	}*/
	var i = setInterval(function(){
	$.getJSON("call.php?action=downloadstatus&id="+taskid, function (data) {
		/*
		* codes
		* 01 video not found in database
		* 02 error in file
		* 03 error in filename or totalsize
		* 04 downloaded
		* 05 in progress
		* 06 wrong neightborhoud
		*/
		switch (data.state) {
			case '01':
			case '02':
			case '03':
				try { clearInterval(i); } catch (e) { }
				$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">'+data.msg+'</span>');
				Registry.write_err(data.msg);
				nextUpload();
				//restoreMainbox();
			break;
			case '04':
				clearInterval(i);
				$.getJSON("call.php?action=status&id="+taskid, function (data) {
					switch (data.state) {
						case '03':
							bridgeProgress(taskid);
						break;
						default:
							clearInterval(i);
							$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">Internal Error: Please try again later  (Code: AjaxDD1)</span>');
							return;
						break;
					}
				});
				$("#uploadprogressbar").progressBar(100);
			break;
			case '05':
				var size = 0;
				var total_size = 1;
				size = Math.ceil(data.current/1024);
				total_size = Math.ceil(data.total/1024);
				var percentage = size*100/total_size;
				$("#slider .inner").html('<br /><label><b>Status: </b></label>Downloading video to server...');
				$("#uploadprogressbar").progressBar(percentage);
				$("#mainbox .info").html(size+' / '+total_size+' KB');
			break;
			case '06':
				clearInterval(i);
				return;
			break;
		}
		
		/*if(data == null) {
			clearInterval(i);
			return;
		}
		data = data.split("|");
		if(data[0]=="Status") {
			clearInterval(i);
			$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">'+data[1]+'</span>');
		} else if (data[0]=="downloaded") {
			clearInterval(i);
			$.get("call.php?action=status&id="+taskid, function (status) {
				if (status == null || status != 'downloaded') {
					clearInterval(i);
					$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">Internal Error: Please try again later  (Code: AjaxDD1)</span>');
					return;
				} else {
					bridgeProgress(taskid);
				}
			});
		} else {
			var size=0;
			var total_size=1;
			size = Math.ceil(data[0]/1024);
			total_size = Math.ceil(data[1]/1024);
			var percentage = size*100/total_size;
			$("#slider .inner").html('<br /><label><b>Status: </b></label>Downloading video to server...');
			$("#uploadprogressbar").progressBar(percentage);
			$("#mainbox .info").html(size+' / '+total_size+' KB');
		}*/
	});
  }, 2000);
  return true;
}

function bridgeProgress (taskid){
	$.getJSON("call.php?action=startconvert&id="+taskid, function (data) {
		//01 not found in database
		//02 can not update
		//03 ready
		//04 started
	 	switch (data.state) {
			case '01':
			case '02':
				$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">'+data.msg+'</span>');
				return;
			break;
			case '03':
				finished(taskid);
			break;
			case '04':
				beginConvertProgress(taskid);
			break;
			default:
				return;
			break;
		}
	});
}
function beginConvertProgress (taskid) {
	$("#step3").attr('class','');
	$("#mainbox .info").fadeOut();
	$.getJSON("call.php?action=convertstatus&get=totaltime&id="+taskid, function (data) {
		var totaltime = 0;
		var currenttime = 0;
		// 01 file not found
		// 02 total time
		switch (data.state) {
			case '01':
				clearInterval(i);
				$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">Internal Error: Please try again later (Code: AjaxDC1)</span>');
				restoreMainbox();
				return;
			break;
			case '02':
				totaltime = data.totaltime;
				$("#mainbox").html('<span class="progressbar" id="convertprogressbar">0%</span>');
				//$("#convertprogressbar").show();
				$("#slider .inner").html('<br /><label><b>Status: </b></label>Converting video...');
				var i = setInterval(function(){
					$.getJSON("call.php?action=convertstatus&get=currenttime&id="+taskid, function(cdata) {
						switch (cdata.state) {
							//01 conversion fail
							//02 error
							//03 ready
							//04 skip
							//05 normal
							case '01':
								clearInterval(i);
								alert('Error J1 - Convertion failed');
								Registry.taskErr[Registry.taskIndex].push('Error J1 - Convertion failed');
								restoreMainbox();
								return;
							break;
							case '02':
								clearInterval(i);
								$("#slider .inner").html('<br /><span style="color:red;font-weight:bold">'+cdata.msg+'</span>');
								Registry.write_err(cdata.msg);
								nextUpload();
								//restoreMainbox();
								return;
							break;
							case '03':
								clearInterval(i);
								$.getJSON("call.php?action=status&id="+taskid, function(statusData) {
									//01 preparing
									//02 prepared
									//03 downloaded
									//04 converting
									//05 ready
									//06 error
									//07 mysql video not found
									switch (statusData.state) {
										case '05':
											slider('in');
											finished(taskid);
										break;
										default:
											clearInterval(i);
											$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">Internal Error: Please try again later (Code: AjaxDC3)</span>');
											restoreMainbox();
											return;
										break;	
									}
								});
								return;
							break;
							case '05':
								currenttime = cdata.currenttime;
								var percentage = currenttime*100/totaltime;
								$("#convertprogressbar").progressBar(percentage);
							break;
						}
					});
				}, 3000);
			break;
		}
	});
	return true;
}
function finished (taskid) {
	$("#step3").attr('class','');
	$.getJSON("call.php?action=finished&id="+taskid, function (data) {
		//01 not found in database
		//02 ready
		//03 error
		switch (data.state) {
			case '01':
			case '03':
				$("#slider .inner").html('<br /><span style="color:red;font-weight:bold;">'+responsecheck[1]+'</span>');
				return;
			break;
			case '02':
				readyFiles.push(data.file);
				nextUpload();
				if (taskDone) {
					$("#slider .inner").html(data.msg);
					if (taskList.length > 1) {
						walkDownloads();
					}
				}
				$("#convertprogressbar").progressBar(100);
				//$("#slider .inner").html(data.msg);
				$("#mainbox").html($('.mainbox_template').html());
				//'<input type="text" id="url" name="url" class="required url" value="VIDEO URL HERE" onblur="if(this.value==\'\') this.value=\'VIDEO URL HERE\';" onfocus="if(this.value==\'VIDEO URL HERE\') this.value=\'\';" /><input type="submit" rel="slide" id="button" name="button" value="" />');
			break;
		}
		slider('out', 118);
	});
}
function walkDownloads () {
	var text = "<div class='checkmark'></div>Your Videos has been successfully prepared<br />";
	for (var i = 0; i < readyFiles.length; i++) {
		text += '<a href="'+readyFiles[i]+'"><img src="images/download_icon.png" /></a>';
	}
	$("#slider .inner").html(text);
}
var formstart = function() {
	jQuery().ajaxStart(function(){}).ajaxStop(function(){}).ajaxError(function(a,b,e){throw e;});
	var data = {};
	var err = [];
	
	var rules = {
		rtype:{required:true}
	};
	var messages = {
		url: "Please enter a valid Youtube URL e.g: http://www.youtube.com/watch?v=LBTXNPZPfbE",
		urls: "Please enter a valid URL list e.g: http://www.youtube.com/watch?v=LBTXNPZPfbE",
		rtype: "Please choose a format"
	};

	$("#urlform").unbind('submit').submit(function(e){
		var mode = $('#url_mode').val();
		e.preventDefault();
		data = {url_mode:mode, rtype:$("#rtype").val(), url:$("#url").val(), urls:$("#urls").val()};
		if (data.rtype == '') {
			err.push({k:'rtype', msg:messages['rtype']});
		}
		switch(mode) {
			case 'single':
				if (data.url.length == 0 || data.url == 'PUT YOUR VIDEO URL HERE') {
					err.push({k:'url', msg:messages['url']});
				}
			break;
			case 'multi':
				var t = data.urls.match(/[^\s]+/g);
				if (data.urls.length == 0 || data.urls == 'PUT YOUR VIDEO URLS HERE' || t.length == 0) {
					err.push({k:'urls', msg:messages['urls']});
				}
			break;
		}
		$('.error').text('');
		if (err.length > 0) {
			for (var j in err) {
				$('#'+err[j].k+'_err').text(messages[err[j].k]);
			}
		}
		if (err.length == 0) {
			$.post('start.php', data, responseHandler, 'json');
			slider('in');
			$("#slider .inner").html('<br /><label><b>Status: </b></label>Verifying...');
			slider('out', 100);
		}
		err = [];

	});
	var responseHandler = function (data) {
		switch (data.state) {
			case '01':
				alert(data.msg);
				$("#slider .inner").html(data.html);
			break;
			case '02':
			case '03':
				$("#slider .inner").html('<br /><label><strong>Status: </strong></label>Preparing...');
				slider('in');
				beginRemoteUploadBatch(data.task);
			break;
			case '06':
				$("#slider .inner").html('<br /><label><b>Status: </b></label>' + data.msg);
			break;

		}

		/*if (statusText == "success" & responseText != "") {
			$("#slider .inner").html('<br /><label><b>Status: </b></label>Preparing...');
			var taskid = responseText;
			var responsecheck = taskid.split("|");
			if (responsecheck[0]=='Status') {
				alert(responsecheck[1]);
				$("#slider .inner").html('<br /><label for="rtype"><b>Convert to: </b></label><select name="rtype" id="rtype" class="required"><option value="">Choose a Format</option><option value="flv">FLV</option><option value="avi">AVI</option><option value="mp3">MP3</option><option value="wmv">WMV</option><option value="mov">MOV</option><option value="mp4">MP4</option></select><br /><br /><span class="notice">After selecting, press the GO button again</span>');
			} else {
				slider('in');
				beginRemoteUpload(taskid);
			}
		}
		}*/
	}
	/*
	var v = jQuery("#urlform").validate({
				rules: rules,
				errorPlacement:function(error, element){
					error.appendTo(element.parent());
				},
				messages:messages,
				submitHandler:function(form){
					jQuery(form).ajaxSubmit({
						beforeSubmit:function(){
							slider('in');
							$("#slider .inner").html('<br /><label><b>Status: </b></label>Verifying...');
							slider('out',100);
						},
						success:showResponse
					});
				}
			});*/
}
