myimage = new Image();     myimage.src = 'http://img.movavi.com/online/pic/percentImage.png'; 
myimage = new Image();     myimage.src = 'http://img.movavi.com/online/pic/percentImage_back.png'; 
myimage = new Image();     myimage.src = 'http://img.movavi.com/online/pic/img-ajax-loader.gif'; 

jQuery.preloadImages = function()
{
  for(var i = 0; i<arguments.length; i++)
  {
    jQuery("<img>").attr("src", arguments[i]);
  }
}

function array2json(arr) {
    var parts = [];
    var is_list = (Object.prototype.toString.apply(arr) === '[object Array]');

    for(var key in arr) {
        var value = arr[key];
        if(typeof value == "object") { //Custom handling for arrays
            if(is_list) parts.push(array2json(value)); /* :RECURSION: */
            else parts[key] = array2json(value); /* :RECURSION: */
        } else {
            var str = "";
            if(!is_list) str = '"' + key + '":';

            //Custom handling for multiple data types
            if(typeof value == "number") str += value; //Numbers
            else if(value === false) str += 'false'; //The booleans
            else if(value === true) str += 'true';
            else str += '"' + value + '"'; //All other things
            // :TODO: Is there any more datatype we should be in the lookout for? (Functions?)

            parts.push(str);
        }
    }
    var json = parts.join(",");
    
    if(is_list) return '[' + json + ']';//Return numerical JSON
    return '{' + json + '}';//Return associative JSON
}


function toOrdinal(_n)
{
var n = _n % 100;
var suff = ["th", "st", "nd", "rd", "th"]; // suff for suffix
var ord= n<21?(n<4 ? suff[n]:suff[0]): (n%10>4 ? suff[0] : suff[n%10]);
return _n + ord;
}


function updateTips(t) {
    tips.text(t).effect("highlight",{},1500);
}

function checkLength(o,n,min,max) {

if ( o.val().length > max || o.val().length < min ) {
    o.addClass('ui-state-error');
    updateTips("Length of " + n + " must be between "+min+" and "+max+".");
    return false;
} else {
    return true;
}

}

function checkRegexp(o,regexp,n) {

    if ( !( regexp.test( o.val() ) ) ) {
        o.addClass('ui-state-error');
        updateTips(n);
        return false;
    } else {
        return true;
    }

}
    
//==================== BODY ONLOAD ============================
$(document).ready(function(){
		$.preloadImages("http://img.movavi.com/online/pic/progress_bar/progressbar.gif", "http://img.movavi.com/online/pic/progress_bar/progressbg_orange.gif",
		"http://img.movavi.com/online/pic/flash.png");

    $("#show_preset_dialog").hover(
            function(){ 
                $(this).addClass("ui-state-hover"); 
            },
            function(){ 
                $(this).removeClass("ui-state-hover"); 
            }
        ).mousedown(function(){
            $(this).addClass("ui-state-active"); 
        }).mouseup(function(){
                $(this).removeClass("ui-state-active");
        });
        

    $("#show_preset_dialog2").hover(
            function(){ 
                $(this).addClass("link-state-hover"); 
            },
            function(){ 
                $(this).removeClass("link-state-hover"); 
            }
        ).mousedown(function(){
            $(this).addClass("link-state-active"); 
        }).mouseup(function(){
                $(this).removeClass("link-state-active");
        });
        
    
    $("#dialog").dialog(
    { 
        beforeclose: function(event, ui) 
            {
                if($("div#dialog_progress_sizerestrict").dialog('isOpen'))
                {
                    return true;
                }
                else
                {
                    var n = Math.floor(Math.random()*100000);
                    //document.location.href="/?version=2&f2=true"; return false;
                    //window.location.replace('/?version=2&f2=true&n='+n);return false;
                    window.location.replace('/');return false;
                }
            },
        modal: true, 
        resizable: false,
        autoOpen: false,
        bgiframe: true
    });
    $('#dialog').dialog('option', 'width', 410);
    $('#dialog').dialog('option', 'height', 410);
    $('#dialog').dialog('option', 'minWidth', 410);
    $('#dialog').dialog('option', 'minHeight', 410);
    $('#dialog').dialog('option','position', ['center', 100]);
    
    /*$('#dialog #user_email_link').resize(onsizedialog);
    $('#dialog #progress_upload_bar').resize(onsizedialog);
    $('#dialog #messages').resize(onsizedialog);
    $('#dialog #ads').resize(onsizedialog);*/

    $("div#dialog_progress_sizerestrict").dialog(
    { 
        bgiframe: true,
        autoOpen: false,
        modal: true,
        
        buttons: { "Try again": function() 
            { 
                $("div#dialog").dialog('close');
                $("div#dialog_progress_sizerestrict").dialog('close');
            }
        },
        resizable: false,
        bgiframe: true
    });
		
		
	$("div#user_email_link a").live("click", function ()
	{
			$('#dialog_email').dialog('open');
			return false;
	});
	
	$("#dialog_email").dialog(
	{ 
			bgiframe: true,
			autoOpen: false,
			//modal: true,
			
			buttons: { "Ok": function() 
					{ 
							var email = $("#email");
							var allFields = email;
							
							var tips = $("#validateTips");

							var bValid = true;
							allFields.removeClass('ui-state-error');
							bValid = bValid && checkLength(email,"email",6,80);
							bValid = bValid && checkRegexp(email,/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i,"eg. ui@jquery.com");
							if (bValid) {
								set_email = email.val();
								$("#dialog_email").dialog('close');
								$("div#dialog div#user_email_link").html("<p>Please wait...</p>").effect("highlight",{},1500);
							}
					},
					"Cancel": function() 
					{ 
							$(this).dialog("close");
					}
			},
			resizable: false,
			bgiframe: true
	});
	//$("#convert_button").block(block_params2);
	$("#show_url").click(function(){
		$("#show_file").removeClass("linkinActive");
		$("#show_url").addClass("linkinActive");

		$("#add_button_style_file").hide();
		$("#add_button_style_url").show();
		//$("#download_only_list_item").attr("disabled", false);
		
		return false;
	});

	$("#show_file").click(function(){
		$("#show_url").removeClass("linkinActive");
		$("#show_file").addClass("linkinActive");

		$("#add_button_style_url").hide();
		$("#add_button_style_file").show();
		

		return false;

	});

	online_rpc = new rpc.ServiceProxy("/api/index.php", {
		asynchronous: true,   //default: true
		sanitize: true,       //default: true
		protocol: 'JSON-RPC', //default: JSON-RPC
		methods: ['acqUploadURL', 'getVideoData', 'getFolders','getRecent', 'getFiles', 'createFolder', 'deleteFiles', 'report']
	}); 

	watch();
	$("#filebut").change(function() {
		if(counter > 4) {alert("Sorry, only 5 files at once allowed.");return false;}
					var new_item = new Array();
					new_item["type"] = "file";
					new_item["data"] = new Array();
					new_item["data"]["title"] = $("#filebut").val().match(/[^\/\\]+$/)[0];
					//new_item["params"] = get_current_params();
					user_tasks[counter] = new_item;
			
					var newel = "<div class='file_list_content' id='"+"file_list_content_"+counter+"'>" + 
					"<div class='filename'>" + new_item["data"]["title"] + "</div>"+
					"<label class='recycle_enabled' id='" +"file_label_"+counter+ "' index='" +counter+ "'></label>"+
					"</div>";		
					$("#filelist").append(newel);

					var new_iframe = "<iframe name='iframe_" + counter + "' id='iframe_" + counter + "'></iframe>";
					$("#upload_forms").append(new_iframe);

					var new_form = "<form method='POST' id='form_" + counter + "' target='iframe_" + counter + "' enctype='multipart/form-data'></form>";
					$("#upload_forms").append(new_form);					
					
					var file = $("#filebut").get(0);
					$("#file_input_container").get(0).removeChild(file)
					file.id="Filedata_" + counter;
					file.name="Filedata";
					file.onchange=null;
					file.style.width=null;
					file.style.height=null;
					$("#form_"+counter).get(0).appendChild(file);
					
					if($("#download_only_list_item").attr("selected"))
					{
						$("#download_only_list_item").attr("selected", false);
						$("#first_list_item").attr("selected", true);
					}
					$("#download_only_list_item").attr("disabled", true); 
					$("#convert_button").unblock();
					counter++;
					$("#file_input_container").append('<input id="filebut" type="file" class="file" />');
//		$(this).val("");
	}); 
	
	$("#urlbut").click(function(){
		add_url(function() {});
	});//url_but click
	
	$("#btn_start").click(function () {

		if((user_tasks.length == 0)  && ($("#url_in").val() != "") && $("#add_button_style_url").is(':visible'))
		{
			//alert("test");
			if($("#needjoin").attr("checked")) {
				add_url(function() {start_join_process();});
				return true;
			}
			else
			{
				add_url(function() {start_process();});
				return true;
			}
		}
		if($("#needjoin").attr("checked")) {
			return start_join_process();
		}	else {
			return start_process();
		}
	});//start click

});


	function add_url(onSuccessCB)
	{
		if(counter > 4) {alert("Sorry, only 5 files at once allowed.");return false;}
		$("#add_button_style_url").block(block_params);
		online_rpc.getVideoData({
			params: {"url":$("#url_in").val()},
			onSuccess:function(video_data){
				if(video_data.success){
					var newel = "<div class='file_list_content' id='"+"file_list_content_"+counter+"'>" + 
					"<div class='filename'>" + video_data.title+"."+video_data.format + "</div>"+
					"<label class='recycle_enabled' id='" +"file_label_"+counter+ "' index='" +counter+ "'></label>"+
					"</div>";
					$("#filelist").append(newel);
					$("#url_in").val("");
					
					new_item = new Array();
					new_item["type"] = "url";
					new_item["data"] = video_data;
					new_item["params"] = get_current_params(counter);
					user_tasks[counter] = new_item;
					//new_item["params"] = get_current_params();
					
					user_tasks[counter] = new_item;
					
					var new_iframe = "<iframe name='iframe_" + counter + "' id='iframe_" + counter + "'></iframe>";
					$("#upload_forms").append(new_iframe);
					
					var new_form = "<form method='POST' id='form_" + counter + "' target='iframe_" + counter + "'></form>";
					$("#upload_forms").append(new_form);
					$("#add_button_style_url").unblock();
					
					counter ++;
					$("#convert_button").unblock();
					if(onSuccessCB != null) onSuccessCB();
				}
				else {
					$("#add_button_style_url").unblock();
					online_rpc.report({params: {message: "getVideoData error: " + $("#url_in").val()}});
					alert($("#url_in").val());
				}
			},//onsuccess
			onException:function(e){
				$("#add_button_style_url").unblock();
				online_rpc.report({params: {message: "getVideoData exception: " + $("#url_in").val() + "\r\n" +  JSON.encode(e)}});
				alert("Can't parse url \r\n\"" +$("#url_in").val() + "\"");
				$("#url_in").val("");
				return true;
			}
		});//getvideo data
	}


	function start_process()
	{
		if(user_tasks.length <= 0) return false;
		var utask_params = get_current_params();
		var c = 1;
		if(utask_params.presetID != -1) {

			var hasReqestedVersion = DetectFlashVer(8, 0, 0);
			if (!hasReqestedVersion) {
			
				$("div#dialog div#user_email_link").hide();
				$("div#messages").append("<p style='margin-top: 50px; padding:15px;' class='ui-state-highlight'>You either have JavaScript turned off or an old version of Adobe's Flash Player. <a href='http://www.adobe.com/go/getflashplayer/'>Get the latest Flash player</a>.</p>");
				$('#dialog').dialog('option', 'title', "Error: Flash is not installed");
				$('#dialog').dialog('open');
				return;
			}
			//$("div#dialog div#user_email_link #mess").html(JS_LANG_CLICK_HERE_TORECEIVE).effect("highlight",{},1500);
		}
		else {
			$("div#dialog div#user_email_link").html(JS_RIGHT_CLICK_TO_DOWNLOAD).effect("highlight",{},1500);
		}
		for (var i in user_tasks) {
			var template = "<div id='file_item_" + i + "' class='file_item' style='white-space: nowrap; overflow: visible;'  nowrap>"+
			"<div class='num' style='float: left;'>"+c+"</div><img class='preview' src='http://img.movavi.com/online/pic/flash.png' height=40 width=50 style='margin-right: 5px;'/>"+
			"<div class='file_item_inner' style='float: right;white-space: nowrap; overflow: visible;display: inline-block;' nowrap><div class=title style='height:14px; overflow:hidden;'><span class='title'>" + 
			user_tasks[i].data.title+"</span></div>"+
			"<div class='progressBar_" + i +"' style='margin-top:2px;float: left;'>0%</div>" +
			"<div style='float: left;'><span class='message'></span></div></div>";
			$("div#messages").append(template + "");
			$("div#messages div.progressBar_" + i).progressBar(0);
			c++;
			if(utask_params.presetID == -1) {
				$("div#dialog div#user_email_link").html(JS_RIGHT_CLICK_TO_DOWNLOAD).effect("highlight",{},1500);

				var cur_item = "div#file_item_"+i;
				$(cur_item + " span.title").text(user_tasks[i].data.title);
				user_tasks[i].complete = true;
				$("div#messages div.progressBar_" + i).hide();
				$(cur_item + " span.message").css("marginTop", "7px").css("height", "60px");
				$(cur_item + " span.title").css("height", "60px");
				var template = "";
				template = "<a target='blank_iframe' href='" + user_tasks[i].data.url + "'>Download</a> ";
				$(cur_item + " span.message").html(template);

				continue;
			}
			else {

				online_rpc.acqUploadURL({
					local_params: {"i" : i},
					params: {"version":api_version},
					onSuccess:function(ret, params){
						var i = params.i;
						var init_params = ret;
						if(!has(server_rpc_array, init_params.api_url))
							server_rpc_array[init_params.api_url] = new rpc.ServiceProxy(init_params.api_url, {
										asynchronous: true,   //default: true
										sanitize: true,       //default: true
										methods: ["getProgress", "delKey", "newTask", "setEmail"],   //default: null (synchronous introspection populates)
										protocol: 'JSON-RPC', //default: JSON-RPC
										crossdomain_xml: init_params.crossdomain,
										use_flXHR: true
						});
				


						user_tasks[i].params = utask_params;
						process_tasks[i] = user_tasks[i];
						process_tasks[i].init_params = init_params;
						process_tasks[i].complete = false;
						process_tasks[i].prev_status = "";

						var _form = $("#form_" + i);
						//alert(user_tasks[i].data.title);
						var filename = user_tasks[i].data.title.replace(/[\|\/:?*<>"'%]/gi, "") + "." + user_tasks[i].data.format;
						if(user_tasks[i].type == "file")
							filename = user_tasks[i].data.title.replace(/[\|\/:?*<>"'%]/gi, "");
						process_tasks[i].convert_params = {
							"username" : "larionov",
							"sid" : init_params.id,
							"key" : init_params.key,
							"params" : {
								"UID"		: init_params.UID,
								"first_time"		: init_params.first_time,
								"formatID"		: utask_params.formatID,
								"presetID"		: utask_params.presetID,
								"presetData"	: utask_params.presetData,
								"join"				: false
							},         
							"loaders" : {
								"INTERNAL" : { 
									"filenames"	: [filename]	
								}
							},
							"savers" : { 
								"INTERNAL" : { 
									"path"			: "c:\\res" 
								},
								"STAT" : { 
									"tmp"			: "tmp" ,
									"stat_report_url"					: init_params.stat_report_url
								},
								"EXTERNAL" : {
									//"registerfiles_url"		: init_params.registerfiles_url,
									"upload_url"					: init_params.s3_upload_url,
									"clean"	: (api_version == 5)?"false":"true"
									//"folder_id"						: user_tasks[i].params.targetFolderId //!!!!!!!!!!!!!!!!!!!!!!1
								}
							}
						};
					
						if(user_tasks[i].type == "url")
						{
							var fname = user_tasks[i].data.title.replace(/[\|\/:?*<>"'%]/gi, "") + "." + user_tasks[i].data.format;
							_form.append("<input type='hidden' name='url' value='" + user_tasks[i].data.url + "'>");
							_form.append("<input type='hidden' name='filename' value='" + fname + "'>");
							_form.append('<input type="hidden" name="callback_url" value="' + init_params.api_url + '"/>');
							_form.append('<input type="hidden" name="callback_method" value="newTask"/>');
							_form.append("<input type='hidden' name='callback_params' value='" + JSON.encode(process_tasks[i].convert_params) + "'/>");
							//alert("<input type='hidden' name='callback_params' value='" + JSON.encode(process_tasks[i].convert_params) + "'/>");
								_form.attr("action", init_params.download_url);
							delete user_tasks[i];
							refresh_event = true;
							_form.submit();
						}else if(user_tasks[i].type == "file")
						{
							var _file = $("#Filedata_" + i).get(0);
							//alert(JSON.encode(process_tasks[i].convert_params));
							_form.get(0).removeChild(_file);
							_form.attr("action", init_params.upload_url);
							_form.append('<input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="' + init_params.id + '"/>');
							_form.get(0).appendChild(_file);
							_form.append("<input type='hidden' name='callback_url' value='" + init_params.api_url + "'/>");
							_form.append('<input type="hidden" name="callback_method" value="newTask"/>');
							_form.append("<input type='hidden' name='callback_params' value='" + JSON.encode(process_tasks[i].convert_params) + "'/>");
							
							delete user_tasks[i];
							refresh_event = true;
							_form.submit();
						}
						//$("#file_list_nofiles").fadeIn(500);
						//task_filter_refresh();
					},
					onException:function(e){
						online_rpc.report({params: {message: JSON.encode(e)}});
						alert("Error: " + e);
						return true;
					}				
				});
			}
		}
		
		$('#dialog').dialog('option', 'title', "Processing files");
    $('#dialog').dialog('open');
	}
	

	
	
function watch()
{

		if(refresh_event){
			var uploads_finished = false;
			var there_are_uploads = false;
			refresh_event = true;
			var _processes = new Array();
			for(var k in process_tasks)
			{
				var _p = process_tasks[k];
				if(!has(_processes, _p.init_params.api_url))
					_processes[_p.init_params.api_url] = new Array();
				_processes[_p.init_params.api_url].push(k);
			}
			var sids = new Array();
			var sids_map = Array();
			for(var _api_url in _processes)
			{
				for(var _k in _processes[_api_url])
				{
					var k = _processes[_api_url][_k];
					try {
					if(process_tasks[k].complete) continue;
					sids_map[process_tasks[k].init_params.id] = k;
					sids.push(process_tasks[k].init_params.id);
					} catch (err) {
						alert(":: " + err.description);
					}
				}
				if(sids.length <=0) continue;
				if(set_email != "")
				{
					server_rpc_array[_api_url].setEmail({
						params: {"sids":sids, "email":set_email},
						onSuccess:function(res){
							$("div#dialog div#user_email_link").html("<p>You may close this window now.</p><p>You'll receive links to your email shortly after process finish.</p>").effect("highlight",{},1500);
							set_email = "";
							refresh_event = true;
						},
						onException: function(e){
							refresh_event = true;
						}
					});
				}
				else
				{
				server_rpc_array[_api_url].getProgress({
					params: {"sid":sids, "key":""},
					onSuccess:function(res){
						var retry = false;
						try {
						for(var __s in res)
						{
							//refresh_event = true;
							var i = sids_map[__s];
							var cur_item = "div#file_item_"+i;
							switch(res[__s].status) {
								case "error":
									var progress = 100;
									retry = false;
									$(cur_item + " span.title").text(process_tasks[sids_map[__s]].data.title);
									$(cur_item + " span.message").text("Error occured: \""+res[__s].message + "\"");
                  $("div#messages div.progressBar_" + i).progressBar(100);
									
									process_tasks[sids_map[__s]].complete = true;
									$("div#messages div.progressBar_" + i).fadeOut();
									$(cur_item + " span.message").css("marginTop", "7px");
									$(cur_item + " span.title").animate({height: "60px"}, 1500, "swing");
									$(cur_item + " span.message").animate({height: "60px"}, 1500, "swing");
									break;
								case "download":
									var progress = Math.ceil((res[__s].current/10)/(res[__s].total/1000));
									retry = true;
									$(cur_item + " span.title").text(process_tasks[sids_map[__s]].data.title);
									$(cur_item + " span.message").text("Downloading (" +progress + "%)");
                  $("div#messages div.progressBar_" + i).progressBar(progress/2);
									break
								case "upload":
									there_are_uploads = true;
									var progress = Math.ceil((res[__s].current/10)/(res[__s].total/1000));
									$(cur_item + " span.title").text(res[__s].file_in);
									$(cur_item + " span.message").text("Uploading" + " (" + Math.ceil((res[__s].current/10)/(res[__s].total/1000)) + "%)");
                  $("div#messages div.progressBar_" + i).progressBar(progress/2);
									retry = true;
									break
								case "queue":
									if(process_tasks[sids_map[__s]].prev_status != "")
									{
										$(cur_item + " span.title").text(res[__s].file_in);
										if(process_tasks[sids_map[__s]].prev_status != res[__s].status)
											$("div#messages div.progressBar_" + i).progressBar(50);
										$(cur_item + " span.message").text("Starting");
									}
									retry = true;
									break
								case "queued":
									if(process_tasks[sids_map[__s]].prev_status != "")
									{
										$(cur_item + " span.title").text(res[__s].file_in);
										if(process_tasks[sids_map[__s]].prev_status != res[__s].status)
											$("div#messages div.progressBar_" + i).progressBar(50);
										$(cur_item + " span.message").text("Starting");
									}
									retry = true;
									break
								case "started":
									$(cur_item + " span.title").text(res[__s].file_in);
									if(process_tasks[sids_map[__s]].prev_status != res[__s].status)
										$("div#messages div.progressBar_" + i).progressBar(50);
									retry = true;
									$(cur_item + " span.message").text("Converting");
									break
								case "progress":
									$(cur_item + " span.title").text(res[__s].file_in);
									var pr = res[__s].result.split(',');
									var time = format_time(pr[2]);
									if(process_tasks[sids_map[__s]].prev_status != res[__s].status)
										$("div#messages div.progressBar_" + i).progressBar(50);
									$("div#messages div.progressBar_" + i).progressBar(50+pr[0]/2);
									retry = true;
									$(cur_item + " span.message").text("Converting, " + time + " left");
									break;
								case "complete":
									$(cur_item + " span.title").text(res[__s].file_in);
									$("div#messages div.progressBar_" + i).progressBar(100);
									retry = true;
									$(cur_item + " span.message").text("Processing");
									break;
								case "finished":
									
									$(cur_item + " span.title").text(res[__s].file_in);
									if(process_tasks[sids_map[__s]].prev_status != res[__s].status)
										$("div#messages div.progressBar_" + i).progressBar(100);
									$(cur_item + " span.message").text("complete " + (res[__s].result==0)?"OK":"ERR");
									process_tasks[sids_map[__s]].complete = true;
									$("div#messages div.progressBar_" + i).fadeOut();
									$(cur_item + " span.message").css("marginTop", "7px");
									$(cur_item + " span.title").animate({height: "60px"}, 1500, "swing");
									$(cur_item + " span.message").animate({height: "60px"}, 1500, "swing");
									var sr = "http://movavi-online-storage.s3.amazonaws.com/guest/";

									if(api_version >= 4) {
										var tmp_f = res[__s].file_out;
										tmp_f = encodeURIComponent(tmp_f).replace(/\+/g, "%2B").replace(/#/g, "%23");
										sr += __s.replace(/_/g, "/") + "/"+tmp_f;
									} else {
										var tmp_f = res[__s].file_in.substring(0, res[__s].file_in.lastIndexOf('.'));
										tmp_f = encodeURIComponent(tmp_f).replace(/\+/g, "%2B").replace(/#/g, "%23");
										tmp_f += "." + process_tasks[sids_map[__s]].params.formatName;
										sr += __s.replace(/_/g, "/") + "/"+tmp_f;
									}
									var template = "";
									if(res[__s].file_out != undefined)
									{
										template = "<a class='download_link' target='blank_iframe' href='" + sr + "'>Download</a> ";
										$(cur_item +" img.preview").attr({'src': "http://img.movavi.com/online/pic/img-ajax-loader.gif"});
										setTimeout("$('"+ cur_item +" img.preview').attr({'src':'" + sr + ".jpg'});", 6000); 
									}
									else template="error";
									$(cur_item + " span.message").html(template);	
									$.each($.browser, function(i, val) {
										if(i=="msie" && ($.browser.version=="7.0" || $.browser.version=="6.0"))
											 $(cur_item + " a.download_link").click(function () { alert("Please, right click on the download link and select 'Save Target As...'"); return false;});
									});
									
									//if(api_version == 2) retry = true;
									break;
								default:
									retry = true;
									break;
							}
							process_tasks[sids_map[__s]].prev_status = res[__s].status;
						}
						if(!uploads_finished && !there_are_uploads)
							uploads_finished = true;
						if(uploads_finished){refresh_event = false;
							$("div#dialog div#user_email_link #mess").show().html(JS_LANG_CLICK_HERE_TORECEIVE).effect("highlight",{},1500);}
						if(retry) refresh_event = true;
						else {$("#user_email_link").hide();}
						
						
						} catch (err) {
						online_rpc.report({params: {message: JSON.encode(err)}});
						alert(":: " + err);
					}
					},
					onException:function(e){
						refresh_event = true;
						return true;
					}			
					});
				}
			}
		}
		reloadsCount++;
		var tOut = 6000;
		tOut += 2000 * (reloadsCount/3);
		if (tOut > 15000) tOut = 15000;
		setTimeout(function(){watch()},tOut); 
	}

	//add_url(null);


    function checkfileext(f)
    {
        var i;
        var ext=new Array(16);

        ext[0]=".avi";
        ext[1]=".mp4";
        ext[2]=".mpg";
        ext[3]=".mpg";
        ext[4]=".3gp";
        ext[5]=".wmv";
        ext[6]=".mov";
    ext[7]=".m4v";
    ext[8]=".dat";
    ext[9]=".vob";
    ext[10]=".mod";
    ext[11]=".flv";
    ext[12]=".wav";
    ext[13]=".wma";
    ext[14]=".mp3";
    ext[15]=".ogg";


        var b=true;

        var val=new String(f.value);
        var ext1=val.substr(val.lastIndexOf('.'));
        var j;
        b=false;

        for(j=0;j<=15;j++)
        {
           if(ext[j]==ext1.toLowerCase())
           {
               return true;
           }
        }

        return false;
    }

    
    function checkurl(f)
    {
        var i;
        var regexp = /(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
        return regexp.test(f);
    }
 
/*
 * jQuery Progress Bar plugin
 * Version 1.1.0 (06/20/2008)
 * @requires jQuery v1.2.1 or later
 *
 * Copyright (c) 2008 Gary Teo
 * http://t.wits.sg

USAGE:
    $(".someclass").progressBar();
    $("#progressbar").progressBar();
    $("#progressbar").progressBar(45);                          // percentage
    $("#progressbar").progressBar({showText: false });          // percentage with config
    $("#progressbar").progressBar(45, {showText: false });      // percentage with config
*/
(function($) {
    $.extend({
        progressBar: new function() {

            this.defaults = {
                increment   : 2,
                speed       : 20,
                showText    : false,                                         // show text with percentage in next to the progressbar? - default : true
                width       : 250,                                          // Width of the progressbar - don't forget to adjust your image too!!!
                boxImage    : 'http://img.movavi.com/online/pic/progress_bar/progressbar.gif',        // boxImage : image around the progress bar
                barImage    : 'http://img.movavi.com/online/pic/progress_bar/progressbg_orange.gif',   // Image to use in the progressbar. Can be an array of images too.
                height      : 12                                            // Height of the progressbar - don't forget to adjust your image too!!!
            };
            
            /* public methods */
            this.construct = function(arg1, arg2) {
                var argpercentage   = null;
                var argconfig       = null;
                
                if (arg1 != null) {
                    if (!isNaN(arg1)) {
                        argpercentage   = arg1;
                        if (arg2 != null) {
                            argconfig   = arg2; }
                    } else {
                        argconfig       = arg1; 
                    }
                }
                
                return this.each(function(child) {
                    var pb      = this;
                    if (argpercentage != null && this.bar != null && this.config != null) {
                        this.config.tpercentage = argpercentage;
                        if (argconfig != null)
                            pb.config           = $.extend(this.config, argconfig);
                    } else {
                        var $this               = $(this);
                        var config              = $.extend({}, $.progressBar.defaults, argconfig);
                        var percentage          = argpercentage;
                        if (argpercentage == null)
                            var percentage      = parseInt($this.html().replace("%","")); // parsed percentage
                        
                        
                        $this.html("");
                        var bar                 = document.createElement('img');
                        var text                = document.createElement('span');
                        bar.id                  = this.id + "_percentImage";
                        text.id                 = this.id + "_percentText";
                        bar.src                 = config.boxImage;
                        bar.width               = config.width;
                        var $bar                = $(bar);
                        var $text               = $(text);
                        
                        this.bar                = $bar;
                        this.ntext              = $text;
                        this.config             = config;
                        this.config.cpercentage = 0;
                        this.config.tpercentage = percentage;
                        
                        $bar.css("width", config.width + "px");
                        $bar.css("height", config.height + "px");
                        $bar.css("background-image", "url(" + config.barImage + ")");
                        $bar.css("padding", "0");
                        $bar.css("margin", "0");
                        $this.append($bar);
                        $this.append($text);
                        
                        bar.alt             = this.tpercentage;
                        bar.title           = this.tpercentage;
                    }
                    
                    
                    
                    var t = setInterval(function() {
                        var config      = pb.config;
                        var cpercentage = parseInt(config.cpercentage);
                        var tpercentage = parseInt(config.tpercentage);
                        var increment   = parseInt(config.increment);
                        var bar         = pb.bar;
                        var text        = pb.ntext;
                        var pixels      = config.width / 100;           // Define how many pixels go into 1%
                        
                        bar.css("background-position", (((config.width * -1)) + (cpercentage * pixels)) + 'px 50%');
                        
                        if (config.showText)
                            text.html(" " + Math.round(cpercentage) + "%");
                        
                        if (cpercentage > tpercentage) {
                            if (cpercentage - increment  < tpercentage) {
                                pb.config.cpercentage = 0 + tpercentage
                            } else {
                                pb.config.cpercentage -= increment;
                            }
                        }
                        else if (pb.config.cpercentage < pb.config.tpercentage) {
                            if (cpercentage + increment  > tpercentage) {
                                pb.config.cpercentage = tpercentage
                            } else {
                                pb.config.cpercentage += increment;
                            }
                        } 
                        else {
                            clearInterval(t);
                        }
                    }, pb.config.speed); 
                });
            };
        }
    });
        
    $.fn.extend({
        progressBar: $.progressBar.construct
    });
    
})(jQuery);/**
* jQuery jSelect plugin
* @requires jQuery v1.2+
* @licenses Creative Commons BY-SA [ http://creativecommons.org/licenses/by-sa/2.0/deed.fr ]
* @desc     Plugin jQuery that enable load and add Option in Select
* @author   Herv? GOUCHET [ contact(at)rvdevsign(dot)net ]
* @version  1.3.1
* @date     2009/03/17
* @doc      http://www.rvdevsign.net/ressources/javascript/jselect-plugin-jquery.html
*/

(function(d){d.fn.jselect=function(b){var n=this;var b=d.extend({},d.fn.jselect.defaults,b);var j=[];if(b.loadUrl){d.ajax({type:b.loadType,url:b.loadUrl,data:b.loadData,dataType:b.loadDataType,success:function(c){var a=false;if(c){a=true}if(b.data.length>0){k(b.data,b.dataType,!a,false)}if(a==true){k(c,b.loadDataType,a,false)}},error:function(){b.loadUrl=null;if(d.isFunction(b.loadOnError)){b.loadOnError()}}})}else if(b.data.length>0){k(b.data,b.dataType,true,false)}else{p()}function p(){if(n.is("select")==true){s(d(n));if(d.isFunction(b.onComplete)){b.onComplete(d(n))}}}function k(a,e,i,h){var m={oValue:"",oText:"",oSelected:"",oClass:""};var l=[];if(e=='xml'||e=='html'){d('option',a).each(function(){oValue=d(this).attr('value');oText=(e=='xml'?d(this).attr('text'):d(this).text());oSelected=(d(this).attr('selected')=="true"||d(this).attr('selected')=="selected"?true:false);if(oValue!==""&&oText!==""){var c={oValue:oValue,oText:oText,oSelected:oSelected,oClass:d(this).attr('class')};c=d.extend({},m,c);if(h==false){j.push(c)}else{l.push(c)}}})}else if(e=='array'){var o=a.length;for(var f=0;f<o;f++){if(a[f].constructor.toString().indexOf("Array")==-1){if(a[f]!==""){var g={oValue:a[f],oText:a[f],oSelected:false,oClass:""};g=d.extend({},m,g);if(h==false){j.push(g)}else{l.push(g)}}}else if(a[f].length>1){if(a[f][0]!==""&&a[f][1]!==""){var g={oValue:a[f][0],oText:a[f][1],oSelected:(typeof a[f][2]!="undefined"?a[f][2]:false),oClass:(typeof a[f][3]!="undefined"?a[f][3]:"")};g=d.extend({},m,g);if(h==false){j.push(g)}else{l.push(g)}}}}}else if(e=='json'){var o=a.select.length;for(var f=0;f<o;f++){if(a.select[f].oValue!==""&&a.select[f].oText!==""){var g=d.extend({},m,a.select[f]);if(h==false){j.push(g)}else{l.push(g)}}}}if(i==true&&h==false){p()}if(h==true){return l}}function s(c){var a=j;if(b.replaceAll==false){var e=k(c,"html",false,true);a=e.concat(a)}c.empty();if(b.addOption==true){a.push({oValue:b.addOptionValue,oText:b.addOptionText,oSelected:false,oClass:b.addOptionClass})}q(c,a);c.change(function(){if(b.addOption==true){t(c)}if(d.isFunction(b.onChange)){b.onChange(d(this).val(),d(this).find("option[value='"+d(this).val()+"']").html(),d(this))}})}function q(c,a){var e=c.get(0);var i=a.length;e.options.length=i;for(var h=0;h<i;h++){u(e,h,a[h])}}function u(c,a,e){c.options[a]=new Option(e.oText,e.oValue);if(e.oSelected&&e.oSelected==true){c.options[a].selected=true}if(e.oClass){c.options[a].setAttribute("class",e.oClass)}}function t(c){if(c.val()==b.addOptionValue){var a=prompt(b.addOptionPrompt,"");if(a&&b.addOptionUrl){v(c,a)}}}function v(a,e){d.ajax({type:b.addOptionType,url:b.addOptionUrl,data:b.addOptionData+e,success:function(c){if(c&&c!=""){w(a,c,e)}else{r(a,e)}},error:function(){r(a,e)}})}function r(c,a){b.addOptionUrl=null;c.get(0)[0].selected=true;if(d.isFunction(b.addOptionOnError)){b.addOptionOnError(a,c)}}function w(c,a,e){var i=[];i=k(c,"html",false,true);if(b.addOption==true){i.pop()}i.push({oValue:a,oText:e,oSelected:b.addOptionSetSelected,oClass:b.addOptionSetClass});if(b.addOption==true){i.push({oValue:b.addOptionValue,oText:b.addOptionText,oSelected:false,oClass:b.addOptionClass})}q(c,i);if(d.isFunction(b.addOptionOnComplete)){b.addOptionOnComplete(a,e,c)}}};d.fn.jselect.defaults={data:[],dataType:"array",replaceAll:true,onChange:function(){},onComplete:function(){},loadUrl:null,loadData:null,loadType:"POST",loadOnError:function(){},loadDataType:"xml",addOption:false,addOptionUrl:null,addOptionData:"newOption=",addOptionType:"POST",addOptionValue:"-1",addOptionText:"Add an option",addOptionClass:null,addOptionPrompt:"Text of the new option:",addOptionSetSelected:true,addOptionSetClass:null,addOptionOnComplete:function(){},addOptionOnError:function(){}}})(jQuery);var FMT_DOWNLOAD= [-1,  "Download Only"];
var FMT_DOWNLOAD= [-1,  "Download Only", "dwn"];
var FMT_AVI     = [0,  "AVI (DIVX; XVID; etc)", "avi"];
var FMT_MPEG12  = [1,  "MPEG1;2 (DVD; SVCD; VCD)", "mpg"];
var FMT_MPEG4   = [2,  "MPEG4 (iPod; MP4)", "mp4"];
var FMT_3GPP    = [3,  "3GPP (GSM)", "3gp"];
var FMT_3GPP2   = [4,  "3GPP2 (CDMA)", "3gp2"];
var FMT_QT      = [5,  "QuickTime (mov)", "mov"];
var FMT_WMV     = [6,  "WMV", "wmv"]; 
var FMT_RM      = [7,  "RealMedia", "rmvb"];
var FMT_FLV     = [8,  "Flash (flv)", "flv"];
var FMT_WAV     = [9, "WAV", "wav"];
var FMT_MP3     = [10,  "MP3", "mp3"];
//WMA 11
var FMT_AAC     = [12, "AAC", "aac"];
var FMT_OGG     = [13, "OGG", "ogg"];
var FMT_FLAC    = [14, "FLAC", "flac"];
//APE 15
var aPrs = {
    DownloadOnly            : [-1,  "Same as source", 0],
    AVI_XviD                : [0,  "MPEG4 Xvid Compatible", FMT_AVI[0]],
    MPEG4_SameAsInput       : [1,  "Mpeg-4 format", FMT_MPEG4[0]],
    MPEG2_DVD_PAL           : [2,  "DVD PAL Compatible", FMT_MPEG12[0]],
    MPEG2_DVD_NTSC          : [3,  "DVD NTSC Compatible", FMT_MPEG12[0]],
    MPEG4_iPod              : [4,  "iPod (320x240)", FMT_MPEG4[0]],
    MPEG4_iPod_5G           : [5,  "iPod 5G (640x480)", FMT_MPEG4[0]],
    MPEG4_PSP               : [6,  "Video for PSP", FMT_MPEG4[0]],
    TGPP_Cellphone          : [8,  "3gp for cellphone", FMT_3GPP[0]],
    TGPP2_Cellphone         : [9,  "3gp2 for cellphone", FMT_3GPP2[0]],
    QT_Podcasts             : [14, "Best for video podcast, MPEG4 format", FMT_QT[0]],
    MP3_HHQ                 : [15, "Audio Only: MP3 Higher Quality", FMT_MP3[0]],
    AVI_XviD_YouTube        : [16, "MPEG4 Xvid for YouTube", FMT_AVI[0]],
    MPEG2_SameAsInput       : [17, "Best Quality", FMT_MPEG12[0]],
    MPEG2_VCD_NTSC          : [18, "VCD NTSC Compatible", FMT_MPEG12[0]],
    MPEG2_VCD_PAL           : [19, "VCD PAL Compatible", FMT_MPEG12[0]],
    MPEG2_SVCD_NTSC         : [20, "SVCD NTSC Compatible", FMT_MPEG12[0]],
    MPEG2_SVCD_PAL          : [21, "SVCD PAL Compatible", FMT_MPEG12[0]],
    MPEG2_HD1               : [22, "HD 1440x1088, 25 fps", FMT_MPEG12[0]],
    MPEG2_HD2               : [23, "HD 1280x720, 25 fps", FMT_MPEG12[0]],
    MPEG4_HD_MPEG4_720      : [24, "HD MPEG4 720p", FMT_MPEG4[0]],
    MPEG4_HD_MPEG4_1080     : [25, "HD MPEG4 1080p", FMT_MPEG4[0]],
    MPEG4_HD_H264_720       : [26, "HD H.264 720p", FMT_MPEG4[0]],
    MPEG4_HD_H264_1080      : [27, "HD H.264 1080p", FMT_MPEG4[0]],
    MPEG4_iPhone            : [28, "iPhone (480x320)", FMT_MPEG4[0]],
    MPEG4_AppleTV           : [29, "Apple TV", FMT_MPEG4[0]],
    MPEG4_Epson_1           : [30, "Epson P-3000/P-5000/P-4500", FMT_MPEG4[0]],
    MPEG4_Epson_2           : [31, "Epson P-2000", FMT_MPEG4[0]],
    MPEG4_Blackberry_1      : [32, "Blackberry 8300/8700/8800", FMT_MPEG4[0]],
    MPEG4_Blackberry_2      : [33, "Blackberry 7100/8100", FMT_MPEG4[0]],
    TGPP_OQ                 : [34, "Optimal Quality", FMT_3GPP[0]],
    TGPP_HQ                 : [35, "Highest Available Quality", FMT_3GPP[0]],
    TGPP_SQ                 : [36, "Standard Quality", FMT_3GPP[0]],
    TGPP_BQ                 : [37, "Balanced Quality", FMT_3GPP[0]],
    TGPP_SSA                : [38, "Smallest Size with Audio", FMT_3GPP[0]],
    TGPP_SSwA               : [39, "Smallest Size w/o Audio", FMT_3GPP[0]],
    TGPP2_OQ                : [40, "Optimal Quality", FMT_3GPP2[0]],
    TGPP2_HQ                : [41, "Highest Available Quality", FMT_3GPP2[0]],
    TGPP2_SQ                : [42, "Standard Quality", FMT_3GPP2[0]],
    TGPP2_BQ                : [43, "Balanced Quality", FMT_3GPP2[0]],
    TGPP2_SSA               : [44, "Smallest Size with Audio", FMT_3GPP2[0]],
    TGPP2_SSwA              : [45, "Smallest Size w/o Audio", FMT_3GPP2[0]],
    QT_iPod                 : [46, "iPod (320x240)", FMT_QT[0]],
    FLV_100                 : [47, "100% Quality (H.263, MP3 - 128 Kbps)", FMT_FLV[0]],
    FLV_75                  : [48, "75% Quality (H.263, MP3 - 64 Kbps)", FMT_FLV[0]],
    FLV_50                  : [49, "50% Quality (H.263, MP3 - 48 Kbps)", FMT_FLV[0]],
    FLV_25                  : [50, "25% Quality (H.263, MP3 - 32 Kbps)", FMT_FLV[0]],
    FLV_20                  : [51, "20% Quality (H.263, No audio)", FMT_FLV[0]],
    WAV_Standart            : [52, "CD Quality", FMT_MP3[0]],
    MP3_GQ                  : [53, "Audio Only: MP3 Good Quality", FMT_MP3[0]],
    MP3_HQ                  : [54, "Audio Only: MP3 High Quality", FMT_MP3[0]],
    MP3_AppleTV             : [55, "Audio Only: Apple TV", FMT_MP3[0]],
    AAC_GQ                  : [56, "Audio Only: AAC Good Quality", FMT_AAC[0]],
    AAC_HQ                  : [57, "Audio Only: AAC High Quality", FMT_AAC[0]],
    AAC_HHQ                 : [58, "Audio Only: AAC Higher Quality", FMT_AAC[0]],
    OGG_GQ                  : [59, "Audio Only: OGG Good Quality", FMT_OGG[0]],
    OGG_HQ                  : [60, "Audio Only: OGG High Quality", FMT_OGG[0]],
    OGG_HHQ                 : [61, "Audio Only: OGG Higher Quality", FMT_OGG[0]],
    FLAC_BQ                 : [62, "Best quality", FMT_FLAC[0]],
    WMV9_00                 : [80494176, "WMV 9 for VHS quality video", FMT_WMV[0]],
    WMV9_01                 : [80494464, "WMV 9 for DVD quality video (1 mbps)", FMT_WMV[0]],
    WMV9_02                 : [80494592, "WMV 9 for DVD quality video (2 mbps)", FMT_WMV[0]],
    WMV9_03                 : [80494824, "WMV HD 720/25p", FMT_WMV[0]],
    WMV9_04                 : [80495080, "WMV HD 720/30p", FMT_WMV[0]],
    WMV9_05                 : [80495472, "WMV HD 1080/25p", FMT_WMV[0]],
    WMV9_06                 : [80495728, "WMV HD 1080/30p", FMT_WMV[0]],
    WMV9_07                 : [80496056, "WMV 9 for Dial-up Modems (28,8 kbps)", FMT_WMV[0]],
    WMV9_08                 : [80496360, "WMV 9 for Dial-up Modems (56 kbps)", FMT_WMV[0]],
    WMV9_09                 : [80496560, "WMV 9 for Dial-up Modems or LAN (28,8 to 100 kbps)", FMT_WMV[0]],
    WMV9_10                 : [80496896, "WMV 9 for LAN,Cable Modem, or xDSL  (100 to 768kbps)", FMT_WMV[0]],
    WMV9_11                 : [80497232, "WMV 9 for Local Network (100 kbps)", FMT_WMV[0]],
    WMV9_12                 : [80497432, "WMV 9 for Local Network (256 kbps)", FMT_WMV[0]],
    WMV9_13                 : [80497632, "WMV 9 for Local Network (384 kbps)", FMT_WMV[0]],
    WMV9_14                 : [80497832, "WMV 9 for Local Network (768 kbps)", FMT_WMV[0]],
    WMV9_15                 : [80498128, "WMV 9 for Pocket PC (225kbps)", FMT_WMV[0]],
    WMV9_16                 : [80498328, "WMV 9 Web Streaming", FMT_WMV[0]],
    WMV9_17                 : [80498528, "WMV 9 E-mail", FMT_WMV[0]],
    WMV9_18                 : [80498784, "Zune", FMT_WMV[0]],
    WMV9_19                 : [80498984, "Zen vision", FMT_WMV[0]],
    WMV9_20                 : [80499368, "Zen Vision W", FMT_WMV[0]],
    WMV9_21                 : [80499624, "Zen Vision M / Zen", FMT_WMV[0]],
    WMV9_22                 : [80499888, "PS3 DVD-PAL", FMT_WMV[0]],
    WMV9_23                 : [80500136, "PS3 DVD-NTSC", FMT_WMV[0]],
    WMV9_24                 : [80500320, "PS3 HD-720p", FMT_WMV[0]],
    WMV9_25                 : [80500568, "PS3 HD-1080p", FMT_WMV[0]],
    WMV9_26                 : [80500896, "Archos 105", FMT_WMV[0]],
    WMV9_27                 : [80501144, "Archos 404/405", FMT_WMV[0]],
    WMV9_28                 : [80501400, "Archos 504/604", FMT_WMV[0]],
    WMV9_29                 : [80501656, "Archos 605/705/Archos TV+", FMT_WMV[0]]                        
};                         

var PRESET_DAIALOG = 0;
var FORMATS ;
if(url_mode)
    FORMATS = [FMT_DOWNLOAD, FMT_AVI, FMT_MPEG12, FMT_MPEG4, FMT_3GPP, FMT_3GPP2, FMT_QT,FMT_WMV,FMT_RM,FMT_FLV,FMT_MP3,FMT_AAC,FMT_OGG,FMT_WAV, FMT_FLAC];
else
    FORMATS = [FMT_AVI, FMT_MPEG12, FMT_MPEG4, FMT_3GPP, FMT_3GPP2, FMT_QT,FMT_WMV,FMT_RM,FMT_FLV,FMT_MP3,FMT_AAC,FMT_OGG,FMT_WAV, FMT_FLAC];
var PRESETS = {};
if(url_mode)
    PRESETS[FMT_DOWNLOAD[0]]= [aPrs.DownloadOnly];
PRESETS[FMT_AVI[0]]     = [aPrs.AVI_XviD, aPrs.AVI_XviD_YouTube];
PRESETS[FMT_MPEG12[0]]  = [aPrs.MPEG2_SameAsInput, aPrs.MPEG2_VCD_NTSC, aPrs.MPEG2_VCD_PAL,aPrs.MPEG2_SVCD_NTSC, aPrs.MPEG2_SVCD_PAL, aPrs.MPEG2_DVD_NTSC, aPrs.MPEG2_DVD_PAL, aPrs.MPEG2_HD1, aPrs.MPEG2_HD2];
PRESETS[FMT_MPEG4[0]]   = [aPrs.MPEG4_SameAsInput, aPrs.MPEG4_HD_MPEG4_720, aPrs.MPEG4_HD_MPEG4_1080, aPrs.MPEG4_HD_H264_720, aPrs.MPEG4_HD_H264_1080,  aPrs.MPEG4_iPod, aPrs.MPEG4_iPod_5G,aPrs.MPEG4_iPhone, aPrs.MPEG4_AppleTV, aPrs.MPEG4_PSP, aPrs.MPEG4_Epson_1, aPrs.MPEG4_Epson_2, aPrs.MPEG4_Blackberry_1, aPrs.MPEG4_Blackberry_2];
PRESETS[FMT_3GPP[0]]    = [aPrs.TGPP_OQ, aPrs.TGPP_HQ, aPrs.TGPP_SQ, aPrs.TGPP_BQ, aPrs.TGPP_SSA, aPrs.TGPP_SSwA, aPrs.TGPP_Cellphone];
PRESETS[FMT_3GPP2[0]]   = [aPrs.TGPP2_OQ, aPrs.TGPP2_HQ, aPrs.TGPP2_SQ, aPrs.TGPP2_BQ, aPrs.TGPP2_SSA, aPrs.TGPP2_SSwA, aPrs.TGPP2_Cellphone];
PRESETS[FMT_QT[0]]      = [aPrs.QT_Podcasts, aPrs.QT_iPod];
PRESETS[FMT_WMV[0]]     = [aPrs.WMV9_00,aPrs.WMV9_01,aPrs.WMV9_02,aPrs.WMV9_03,aPrs.WMV9_04,aPrs.WMV9_05,aPrs.WMV9_06,aPrs.WMV9_07,aPrs.WMV9_08,aPrs.WMV9_09,aPrs.WMV9_10,aPrs.WMV9_11,aPrs.WMV9_12,aPrs.WMV9_13,aPrs.WMV9_14,aPrs.WMV9_15,aPrs.WMV9_16,aPrs.WMV9_17,aPrs.WMV9_18,aPrs.WMV9_19,aPrs.WMV9_20,aPrs.WMV9_21,aPrs.WMV9_22,aPrs.WMV9_23,aPrs.WMV9_24,aPrs.WMV9_25,aPrs.WMV9_26,aPrs.WMV9_27,aPrs.WMV9_28,aPrs.WMV9_29];

PRESETS[FMT_MP3[0]]     = [aPrs.MP3_HHQ, aPrs.MP3_GQ, aPrs.MP3_HQ, aPrs.MP3_AppleTV];
PRESETS[FMT_AAC[0]]     = [aPrs.AAC_GQ, aPrs.AAC_HQ, aPrs.AAC_HHQ];
PRESETS[FMT_OGG[0]]     = [aPrs.OGG_GQ, aPrs.OGG_HQ, aPrs.OGG_HHQ];
PRESETS[FMT_WAV[0]]     = [aPrs.WAV_Standart];
PRESETS[FMT_FLAC[0]]    = [aPrs.FLAC_BQ];
PRESETS[FMT_FLV[0]]     = [aPrs.FLV_100, aPrs.FLV_75, aPrs.FLV_50, aPrs.FLV_25, aPrs.FLV_20];
PRESETS[FMT_RM[0]]      = [[80434800, "100% Quality Download (VBR)", FMT_RM[0]],
        [80434960, "128k Dual ISDN", FMT_RM[0]],[80435024, "12k Substream for 28k Dial-up", FMT_RM[0]],[80435136, "150k LAN", FMT_RM[0]],
        [80435424, "16k Substream for 28k Dial-up", FMT_RM[0]],[80435488, "1M Download (VBR)", FMT_RM[0]],[80435624, "1M Multichannel (VBR)", FMT_RM[0]],
        [80435928, "1M Surround Stereo (VBR)", FMT_RM[0]],[80436040, "256k DSL or Cable", FMT_RM[0]],[80436280, "26k Substream for 56k Dial-up", FMT_RM[0]],
        [80436528, "28k Dial-up", FMT_RM[0]],[80436768, "2M Download (VBR)", FMT_RM[0]],[80436976, "2M Multichannel (VBR)", FMT_RM[0]],
        [80437200, "2M Surround Stereo (VBR)", FMT_RM[0]],[80437392, "350k Download (VBR)", FMT_RM[0]],[80437600, "350k Multichannel (VBR)", FMT_RM[0]],
        [80437824, "350k Surround Stereo (VBR)", FMT_RM[0]],[80438016, "384k DSL or Cable", FMT_RM[0]],[80438208, "450k Download (VBR)", FMT_RM[0]],
        [80438416, "450k Multichannel (VBR)", FMT_RM[0]],[80438776, "450k Surround Stereo (VBR)", FMT_RM[0]],[80438968, "512k DSL or Cable", FMT_RM[0]],
        [80439080, "56k Dial-up", FMT_RM[0]],[80439320, "5M Download (VBR)", FMT_RM[0]],[80439528, "5M Multichannel (VBR)", FMT_RM[0]],
        [80439752, "5M Surround Stereo (VBR)", FMT_RM[0]],[80439928, "64k Single ISDN", FMT_RM[0]],[80440152, "70% Quality Download (VBR)", FMT_RM[0]],
        [80440344, "750k Download (VBR)", FMT_RM[0]],[80440552, "750k Multichannel (VBR)", FMT_RM[0]],[80440912, "750k Surround Stereo (VBR)", FMT_RM[0]],
        [80441104, "768k DSL or Cable", FMT_RM[0]],[80441328, "80% Quality Download (VBR)", FMT_RM[0]],[80441552, "90% Quality Download (VBR)", FMT_RM[0]],
        [80441792, "General Mobile Local Playback", FMT_RM[0]],[80442016, "General Mobile Streaming", FMT_RM[0]],[80442192, "Lossless Audio", FMT_RM[0]],[80442400, "PocketPC Local Playback", FMT_RM[0]]
    ];
RM_STRETCH  = [0,"Stretch"];
RM_LETTER   = [1,"Letterbox"];
RM_CROP     = [2,"Crop"];
RESIZE_METHODS  = [RM_STRETCH, RM_LETTER, RM_CROP];

RQ_NORMAL   = [0, "Normal (Fast)"];
RQ_BEST     = [1,"Best (Slow)"];
RESIZE_QUALITY  = [RQ_NORMAL, RQ_BEST];

var aFreqs = {
    FQ_48_KHZ   : 48000,
    FQ_44_KHZ   : 44100,
    FQ_32_KHZ   : 32000,
    FQ_24_KHZ   : 24000,
    FQ_22_KHZ   : 22050,
    FQ_16_KHZ   : 16000,
    FQ_12_KHZ   : 12000,
    FQ_11_KHZ   : 11025,
    FQ_8_KHZ    : 8000,
    FQ_6_KHZ    : 6000
}


AUTO        = [0,"Auto"];
MONO        = [1,"Mono"];
STEREO      = [2,"Stereo"];
CHANNELS    = [AUTO, MONO, STEREO];

var PRESETS_DATA = {};
var isChangingPreset = false;
var DIALOGS = {};
DIALOGS[FMT_DOWNLOAD[0]]= {isInit:false, name : "IDD_DOWNLOADOPTS", bModified: false};
DIALOGS[FMT_AVI[0]]     = {isInit:false, name : "IDD_AVIOPTS",  bModified: false};
DIALOGS[FMT_MPEG12[0]]  = {isInit:false, name : "IDD_MPEGOPTS", bModified: false};
DIALOGS[FMT_MPEG4[0]]   = {isInit:false, name : "IDD_MP4OPTS",  bModified: false};
DIALOGS[FMT_3GPP[0]]    = {isInit:false, name : "IDD_3GPOPTS",  bModified: false};
DIALOGS[FMT_3GPP2[0]]   = {isInit:false, name : "IDD_3GP2OPTS", bModified: false};
DIALOGS[FMT_QT[0]]      = {isInit:false, name : "IDD_QTOPTS",   bModified: false};
DIALOGS[FMT_WMV[0]]     = {isInit:false, name : "IDD_WMVOPTS",  bModified: false};
DIALOGS[FMT_RM[0]]      = {isInit:false, name : "IDD_RMOPTS",   bModified: false};
DIALOGS[FMT_MP3[0]]     = {isInit:false, name : "IDD_MP3OPTS",  bModified: false};
DIALOGS[FMT_AAC[0]]     = {isInit:false, name : "IDD_AACOPTS",  bModified: false};
DIALOGS[FMT_OGG[0]]     = {isInit:false, name : "IDD_OGGOPTS",  bModified: false};
DIALOGS[FMT_WAV[0]]     = {isInit:false, name : "IDD_WAVOPTS",  bModified: false};
DIALOGS[FMT_FLV[0]]     = {isInit:false, name : "IDD_FLVOPTS",  bModified: false};
DIALOGS[FMT_FLAC[0]]    = {isInit:false, name : "IDD_FLACOPTS", bModified: false};
DIALOGS[-2]             = {isInit:false, name : "OPT_DIALOGS",  bModified: false};
function onSelectPreset(presetId, presetName)
{
}

function getFormatID(presetID)
{
    var formatId = -1;
    $.each(PRESETS, function (format_id, preset_list) 
    {
        var res = false;
        //console.log("format: ", format_id);
        $.each(preset_list, function (p_format_id, preset_item) {
            //console.log("[" + preset_item[0]+"]"+preset_item[1]);
            if(presetID == preset_item[0])
            {
                formatId = format_id;
                res = true;
                return false;
            }
        });
        if(res) return false;
    });
    return formatId;
}
function initPresetList(presetId, bChanged, bReloadPreset)
{
    var c_dialog = $("#preset_dialog");
    var FMT_SELECT = $("#IDC_FORMAT");
    var PRESET_SELECT = $("#IDC_PRESET", c_dialog);
    if(bChanged)
    {
        if(bReloadPreset)
        {
            PRESETS_DATA[-2] = {data: DIALOGS[FMT_SELECT.val()].exportPreset(), format: FMT_SELECT.val()};
            PRESETS_DATA[-2].data.FormatID = FMT_SELECT.val();
        }
        PRESET_SELECT.jselect({
            data: [[-2, "Custom preset"]]
        });
    }
    PRESET_SELECT.jselect({
        data: PRESETS[presetId],
        replaceAll: !bChanged,
        onChange: function(value, text){ onPresetChangeGlobal(value); prevPreset = value;}
    });
    if(bChanged)
PRESET_SELECT.change(); 
}
var onPresetChange = function () {};
var prevFormat = -1;
var prevPreset = -1;
function onPresetChangeGlobal(presetID)
{
    if(presetID == prevPreset) return;
    //console.log("presetID: ", presetID, "PrevPresetID: ", prevPreset);
    isChangingPreset = true;
    var FMT_SELECT = $("#preset_dialog select#IDC_FORMAT");

    DIALOGS[FMT_SELECT.val()].initPreset(presetID);
    if(presetID != -2)
    {
        DIALOGS[FMT_SELECT.val()].bModified = false;
    }
    isChangingPreset = false;
}

function initFormatList()
{
    var c_dialog = $("#preset_dialog");
    var FMT_SELECT = $("select#IDC_FORMAT", c_dialog);

    FMT_SELECT.jselect({
        data: FORMATS,
        onChange: function(value, text)
        { 
            //$("#ajax_loader", c_dialog).show( );
            $("#" + DIALOGS[prevFormat].name).hide();
            $("#" + DIALOGS[value].name).show();
            if(!DIALOGS[value].isInit) {DIALOGS[value].init();DIALOGS[value].isInit = true;}
            onPresetChangeGlobal(PRESETS[value][0][0], aPrs.AVI_XviD);  
            //$("#ajax_loader", c_dialog).hide( );

            initPresetList(value, false, true); 
            prevFormat = value;
        }
    });
}

function toggleDisabled (context, idList, checked) {
    $.each(idList, function () {
        $("[for=" + this + "]", context).attr('disabled', checked).toggleClass( 'ui-state-disabled', checked);
        $("#" + this, context).attr('disabled', checked).toggleClass( 'ui-state-disabled', checked);
    });
}

$(document).ready(function(){
    $("#preset_dialog input[type=text]").keypress(function (e)
    {
      if(e.which!=46 && e.which!=8 && e.which!=0 && (e.which<48 || e.which>57))
      {
        return false;
      }
    });

    PRESET_DIALOG = $("#preset_dialog");
    PRESET_DIALOG.dialog(
    { 
        buttons: {
            "Ok": function() 
                { 
                    var selected_preset = $("#IDC_PRESET").val();
                    var selected_format = $("#IDC_FORMAT").val();
                    var format_name = "";
                    var preset_name = "";
                    
                    if(selected_preset == -2) preset_name = "User defined";
                    else
                    $.each(PRESETS, function () {
                        var res = false;
                        $.each(this, function () {
                            if(selected_preset == this[0])
                            {
                                preset_name = this[1];
                                res = true;
                                return false;
                            }
                        });
                        if(res) return false;
                    });
                    
                    $.each(FORMATS, function () {
                        if(selected_format == this[0])
                        {
                            format_name = this[1];
                            return false;
                        }
                    });
                    
                    if(-1 == $.inArray(selected_preset, ["-1","0","1","2","3","4","5","28","6","8","9","14","47","54"]))
                    {
                        var elSel = $("#combo_box").get(0);
                        var gr = $("#user_presets_group");
                        if(gr.length == 0)
                        {
                            $("#combo_box").prepend("<optgroup id='user_presets_group'label='" + JS_LANG_ADVANCED + ":' >"
                            + "</optgroup>");
                        }
                        var elOpt= 0;
                        if(selected_preset == -2)
                        {
                            if($("#custom_preset_option").length == 0)
                                $("#user_presets_group").prepend("<option value='-2' id='custom_preset_option' style='padding-left:20px;'>  </option>");
                            elOpt = $("#custom_preset_option").get(0);
                        }
                        else
                        {
                            $("#user_presets_group").prepend("<option value='-2' style='padding-left:20px;'>  </option>");
                            elOpt = elSel.options[0];
                        }
                        elOpt.text = '  ' + format_name + ", " + preset_name;
                        elOpt.value = selected_preset;                      
                        $("#combo_box").val(selected_preset);
                    }
                    else
                    {
                        $("#combo_box").val(selected_preset);
                    }
                    
                    $("#preset_dialog").dialog('close');
                    return true;
                },
            "Cancel": function() 
                { 
                    $("#preset_dialog").dialog('close');
                    return true;
                }
        },
        beforeclose: function(event, ui) {},
        modal: false, 
        //resizable: false,
        autoOpen: false,
        bgiframe: true,
        width: 500,
        height:460
    });

    initFormatList();
    $("#IDC_EXPORT_PRESET").click(function () {
        var FMT_SELECT = $("#preset_dialog select#IDC_FORMAT");
        var prData = DIALOGS[FMT_SELECT.val()].exportPreset();
        prData.FormatId = FMT_SELECT.val();
        $("#preset_data_export").val(JSON.encode(prData));
    });
    $("#show_preset_dialog2").click(function () {
        //setTimeout(function () {
            var FMT_SELECT = $("select#IDC_FORMAT");
            var main_wnd_preset = $("#combo_box").val();
            var main_wnd_preset_item = -1;
            var main_wnd_format = -1;
            //prevFormat = -1;
            $.each(PRESETS, function (format_id, preset_list) {
            var res = false;
                //console.log("format: ", format_id);
                $.each(preset_list, function (p_format_id, preset_item) {
                    //console.log("[" + preset_item[0]+"]"+preset_item[1]);
                    if(main_wnd_preset == preset_item[0])
                    {
                        main_wnd_preset_item = preset_item;
                        main_wnd_format = format_id;
                        res = true;
                        return false;
                    }
                });
                if(res) return false;
            });
            if(main_wnd_preset == -2) main_wnd_format = PRESETS_DATA[-2].format;
            FMT_SELECT.val(main_wnd_format).change();
            initPresetList(main_wnd_format, (main_wnd_preset == -2) ,false);
             $("#IDC_PRESET").val(main_wnd_preset).change();
            DIALOGS[main_wnd_format].initPreset(main_wnd_preset);
            //if(!DIALOGS[-2].isInit) {DIALOGS[-2].init();DIALOGS[-2].isInit = true;}
            prevFormat = main_wnd_format;
        //});
        PRESET_DIALOG.dialog('open');
    });
    $("#preset_dialog input, #preset_dialog select").change(function () {
        if(("IDC_PRESET" != $(this).attr("id")) &&
            ("IDC_FORMAT" != $(this).attr("id")))
        {
            var FMT_SELECT = $("#IDC_FORMAT");
            //console.log($(this).attr("id"),"isChangingPreset: ", isChangingPreset);
            //console.log();
            if(!isChangingPreset)
            {
                DIALOGS[FMT_SELECT.val()].bModified = true;
                initPresetList(FMT_SELECT.val(), true, true); 
                $("#IDC_PRESET").val(-2);
            }
        }
    });
});

//====================================================================

var C_MPEG4 = ['mp4v', "MPEG4 Video"];
var C_H263 = ['s263', "H.263"];
var C_H264 = ['avc1', "H.264"];
var C_AAC = ['mp4a', "AAC"];
var C_AMR = ['samr', "AMR"];
var C_NONE = [0, "None"];

var PROFILES_mp4v = [[8, "Simple"], [148, "Advanced Realtime Simple"], [244, "Advanced Simple"]];
var QUALITY_mp4v = [[0, "Lowest"], [1, "Low"], [2, "Medium Low"], [3, "Medium"], [4, "Medium High"], [5, "High"], [6, "Highest"]];

var QUALITY_s263 = [[1, "Lowest"], [5, "Low"], [10, "Medium Low"], [15, "Medium"], [20, "Medium High"], [25, "High"], [30, "Highest"]];
var RANGE_s263 = [[1, "Very Small"], [3, "Small"], [7, "Medium"], [10, "Wide"], [15, "Very Wide"]];

var PROFILES_avc1 = [[1, "Baseline"], [2, "Main"], [4, "High"]];
var QUALITY_avc1 = [[0, "Default"], [1, "Low"], [2, "Medium"], [3, "High"], [4, "Highest"]];

var PROFILES_mp4a = [[1, "Main"], [2, "LC"], [5, "LTP"]];
var BITRATES_mp4a = [8, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];
var QUALITY_mp4a     = [[100, "Medium"], [250, "High"], [500, "Highest"]];

var BITRATES_samr = [4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200];

var MP4_VIDEO_CODECS = [C_MPEG4, C_H263, C_H264];
var MP4_AUDIO_CODECS = [C_NONE, C_AAC, C_AMR];

PRESETS_DATA[aPrs.MPEG4_SameAsInput[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "25",
    VParams         : { MPG4 : {
        Profile : 244,
        Bitrate : 2500000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode     : false,
    VideoSAsInput   : true,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_720[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 1280,
    Height          : 720,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "25",
    VParams         : { MPG4 : {
        Profile : 244,
        Bitrate : 10000000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 192000, 
        Quality : 100
    }},
    PSPMode         : false,
    LinkSizes       : true,
    WPerc           : 100,
    HPerc           : 100
    }
};
PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_1080[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_720[0]]);
PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_1080[0]].data.Width = 1920;
PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_1080[0]].data.Height = 1088;
PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_1080[0]].data.VParams.MPG4.Bitrate = 15000000;

PRESETS_DATA[aPrs.MPEG4_HD_H264_720[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_720[0]]);
PRESETS_DATA[aPrs.MPEG4_HD_H264_720[0]].data.VideoCodec = C_H264[0];
PRESETS_DATA[aPrs.MPEG4_HD_H264_720[0]].data.VParams.H264 = {Profile: 4, Bitrate: 1000000, VBR: false, Quality:2};

PRESETS_DATA[aPrs.MPEG4_HD_H264_1080[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG4_HD_MPEG4_1080[0]]);
PRESETS_DATA[aPrs.MPEG4_HD_H264_1080[0]].data.VideoCodec = C_H264[0];
PRESETS_DATA[aPrs.MPEG4_HD_H264_1080[0]].data.VParams.H264 = {Profile: 4, Bitrate: 1500000, VBR: false, Quality:2};

PRESETS_DATA[aPrs.MPEG4_iPod[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "25",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 572000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode     : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_iPod_5G[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 640,
    Height          : 480,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "25",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 2500000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 48000,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode     : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_iPhone[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 480,
    Height          : 320,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "25",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 1000000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 48000,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode     : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_AppleTV[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 720,
    Height          : 432,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "30",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 2000000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 48000,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode     : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_PSP[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 368,
    Height          : 208,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "29.97",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 504000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 24000,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 96000, 
        Quality : 100
    }},
    PSPMode         : true,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_Epson_1[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 640,
    Height          : 480,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "30",
    VParams         : { MPG4 : {
        Profile : 244,
        Bitrate : 2000000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode         : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_Epson_2[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 640,
    Height          : 480,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "30",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 2000000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode         : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_Blackberry_1[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 500000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode         : false,
    LinkSizes       : true
    }
};

PRESETS_DATA[aPrs.MPEG4_Blackberry_2[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    VideoSAsInput   : false,
    Width           : 240,
    Height          : 260,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { MPG4 : {
        Profile : 8,
        Bitrate : 400000, 
        Quality : 3
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Profile : 2,
        Bitrate : 128000, 
        Quality : 100
    }},
    PSPMode         : false,
    LinkSizes       : true
    }
};

DIALOGS[FMT_MPEG4[0]].exportPreset = function()
{
    var c_dialog = $("div#IDD_MP4OPTS");
    var data = [];// PRESETS_DATA[presetId].data;
    data.VideoCodec = $("#MP4_IDC_VIDEOCODEC", c_dialog).val();
    data.AudioCodec = $("#MP4_IDC_AUDIOCODEC", c_dialog).val();

    data.Width = $("#MP4_IDC_WIDTH", c_dialog).val();
    data.Height = $("#MP4_IDC_HEIGHT", c_dialog).val();
    data.WPerc = $("#MP4_IDC_WPERC", c_dialog).val();
    data.HPerc = $("#MP4_IDC_HPERC", c_dialog).val();

    data.FrameRate = $("#MP4_IDC_FRPERSECOND", c_dialog).val();
    data.VideoSAsInput = $("#MP4_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
    data.LinkSizes = $("#MP4_IDC_LINKSIZES", c_dialog).attr('checked');
    data.PSPMode = $("#MP4_IDC_PSPMODE", c_dialog).attr('checked');
        
    data.ResizeMethod = $("select#MP4_IDC_RESIZE_METHOD", c_dialog).val();
    data.ResizeQuality = $("select#MP4_IDC_RESIZEQUALITY", c_dialog).val();
    data.Freq = $("select#MP4_IDC_FREQUENCY", c_dialog).val();
    data.Channels = $("select#MP4_IDC_CHANNELS", c_dialog).val();

    
    switch(data.VideoCodec) {
        case C_MPEG4[0]: 
            //alert($("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val());
            data.VParams = {MPG4 : {        
                Profile : $("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val(),
                Bitrate : $("div#IDD_OPT_mp4v #IDC_BITRATE_mp4v").val()*1000,
                Quality : $("div#IDD_OPT_mp4v #IDC_QUALITY_mp4v").val()
                }};
            break;
        case C_H263[0]:
            data.VParams = {H263 : {        
                MotionSrchRng   : $("div#IDD_OPT_s263 #IDC_SEARCHRANGE_s263").val(),
                Bitrate         : 1000*$("div#IDD_OPT_s263 #IDC_BITRATE_s263").val(),
                Quality         : $("div#IDD_OPT_s263 #IDC_QUALITY_s263").val(),
                VBR             : $("div#IDD_OPT_s263 #IDC_USEVBR_s263").attr('checked')
            }};
            break;
        case C_H264[0]: 
            data.VParams = {H264 : {        
                Profile : $("div#IDD_OPT_avc1 #IDC_PROFILE_avc1").val(),
                Bitrate : 1000*$("div#IDD_OPT_avc1 #IDC_BITRATE_avc1").val(),
                Quality : $("div#IDD_OPT_avc1 #IDC_QUALITY_avc1").val(),
                VBR     : $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('checked')
                }};
            break;
    }
    switch(data.AudioCodec) {
        case C_NONE[0]: 
            break;
        case C_AAC[0]: 
            data.AParams = {AAC : {     
                Profile : $("div#IDD_OPT_mp4a #IDC_PROFILE_mp4a").val(),
                Bitrate : 1000*$("div#IDD_OPT_mp4a #IDC_BITRATE_mp4a").val(),
                Quality : $("div#IDD_OPT_mp4a #IDC_QUALITY_mp4a").val()
            }};
            break;
        case C_AMR[0]:
            data.AParams = {AMR : {Bitrate : $("div#IDD_OPT_samr #IDC_BITRATE_samr").val()}};
            //DWORD dwBitrate;
        break;
    }
    return data;
}
DIALOGS[FMT_MPEG4[0]].initPreset = function(presetId)
{
    var c_dialog = $("div#IDD_MP4OPTS");
    var data = PRESETS_DATA[presetId].data;
    initW = data.Width;
    initH = data.Height;
    $("#MP4_IDC_VIDEOCODEC", c_dialog).val(data.VideoCodec);
    $("#MP4_IDC_AUDIOCODEC", c_dialog).val(data.AudioCodec);

    $("#MP4_IDC_WIDTH", c_dialog).val(data.Width);
    $("#MP4_IDC_HEIGHT", c_dialog).val(data.Height);
    $("#MP4_IDC_WPERC", c_dialog).val(data.WPerc);
    $("#MP4_IDC_HPERC", c_dialog).val(data.HPerc);

    $("#MP4_IDC_FRPERSECOND", c_dialog).val(data.FrameRate);
    $("#MP4_IDC_VIDEOSASINPUT", c_dialog).attr('checked', data.VideoSAsInput).change();
    $("#MP4_IDC_LINKSIZES", c_dialog).attr('checked', data.LinkSizes).change();
    $("#MP4_IDC_PSPMODE", c_dialog).attr('checked', data.PSPMode).change();
        
    $("select#MP4_IDC_RESIZE_METHOD", c_dialog).val(data.ResizeMethod);
    $("select#MP4_IDC_RESIZEQUALITY", c_dialog).val(data.ResizeQuality);
    $("select#MP4_IDC_FREQUENCY", c_dialog).val(data.Freq);
    $("select#MP4_IDC_CHANNELS", c_dialog).val(data.Channels);
    switch(data.VideoCodec) {
        case C_MPEG4[0]: 
            $("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val(data.VParams.MPG4.Profile);
            $("div#IDD_OPT_mp4v #IDC_BITRATE_mp4v").val(data.VParams.MPG4.Bitrate/1000);
            $("div#IDD_OPT_mp4v #IDC_QUALITY_mp4v").val(data.VParams.MPG4.Quality);
            break;
        case C_H263[0]: 
            $("div#IDD_OPT_s263 #IDC_SEARCHRANGE_s263").val(data.VParams.H263.MotionSrchRng);
            $("div#IDD_OPT_s263 #IDC_BITRATE_s263").val(data.VParams.H263.Bitrate/1000);
            $("div#IDD_OPT_s263 #IDC_QUALITY_s263").val(data.VParams.H263.Quality);
            $("div#IDD_OPT_s263 #IDC_USEVBR_s263").attr('checked', data.VParams.H263.VBR);
            break;
        case C_H264[0]: 
            $("div#IDD_OPT_avc1 #IDC_PROFILE_avc1").val(data.VParams.H264.Profile);
            $("div#IDD_OPT_avc1 #IDC_BITRATE_avc1").val(data.VParams.H264.Bitrate/1000);
            $("div#IDD_OPT_avc1 #IDC_QUALITY_avc1").val(data.VParams.H264.Quality);
            $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('checked', data.VParams.H264.VBR)
            break;
    }
    
    switch(data.AudioCodec) {
        case C_NONE[0]: 
            break;
        case C_AAC[0]: 
            $("div#IDD_OPT_mp4a #IDC_PROFILE_mp4a").val(data.AParams.AAC.Profile);
            $("div#IDD_OPT_mp4a #IDC_BITRATE_mp4a").val(data.AParams.AAC.Bitrate/1000);
            $("div#IDD_OPT_mp4a #IDC_QUALITY_mp4a").val(data.AParams.AAC.Quality);
            break;
        case C_AMR[0]:
        break;
            $("div#IDD_OPT_samr #IDC_BITRATE_samr").val(data.AParams.AMR.Bitrate);
            //DWORD dwBitrate;
    }
    
    
};


DIALOGS[FMT_MPEG4[0]].init = function()
{
    var c_dialog = $("div#IDD_MP4OPTS");

    $("select#MP4_IDC_AUDIOCODEC", c_dialog).change(function () {
        var checked = ($(this).val() == C_NONE[0]);
        var checked2 = checked || ($(this).val() == C_AMR[0]);
        toggleDisabled($("div#preset_dialog"), ["MP4_IDC_AUDIOOPTS"], checked);     
        toggleDisabled($("div#preset_dialog"), ["MP4_IDC_FREQUENCY", "MP4_IDC_CHANNELS"], checked2);        
    });
    
    $("input[type=button]", c_dialog).hover(
            function(){ 
                $(this).addClass("ui-state-hover"); 
            },
            function(){ 
                $(this).removeClass("ui-state-hover"); 
            }
        ).mousedown(function(){
            $(this).addClass("ui-state-active"); 
        }).mouseup(function(){
                $(this).removeClass("ui-state-active");
        });

    $("input#MP4_IDC_VIDEOOPTS", c_dialog).click(function () {
        var dlg_name = "#IDD_OPT_" + $("#MP4_IDC_VIDEOCODEC", c_dialog).val() ;
        $(dlg_name).dialog('open');
    }
    );
    $("input#MP4_IDC_AUDIOOPTS", c_dialog).click(function () {
        var dlg_name = "#IDD_OPT_" + $("#MP4_IDC_AUDIOCODEC", c_dialog).val() ;
        $(dlg_name).dialog('open');
    }
    );

    $("#MP4_IDC_HEIGHT", c_dialog).change(function () {
        if($("#MP4_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            var nw = ($(this).val()/initH) * initW;
            $("#MP4_IDC_WIDTH", c_dialog).val(parseInt(nw));
        }
        var npw = ($("#MP4_IDC_WIDTH", c_dialog).val()/initW) * 100;
        $("#MP4_IDC_WPERC", c_dialog).val(parseInt(npw));
        var nph = ($("#MP4_IDC_HEIGHT", c_dialog).val()/initH) * 100;
        $("#MP4_IDC_HPERC", c_dialog).val(parseInt(nph));
    });
    
    $("div#IDD_MP4OPTS input#MP4_IDC_WIDTH").change(function () {
    
        if($("#MP4_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            var nh = ($(this).val()/initW) * initH;
            $("#MP4_IDC_HEIGHT", c_dialog).val(parseInt(nh));
        }
        var npw = ($("input#MP4_IDC_WIDTH").val()/initW) * 100;
        $("#MP4_IDC_WPERC", c_dialog).val(parseInt(npw));
        var nph = ($("#MP4_IDC_HEIGHT", c_dialog).val()/initH) * 100;
        $("#MP4_IDC_HPERC", c_dialog).val(parseInt(nph));
    });
    
    $("#MP4_IDC_WPERC", c_dialog).change(function () {
        var nw = (($(this).val()/100)*initW);
        $("div#IDD_MP4OPTS input#MP4_IDC_WIDTH").val(parseInt(nw));

        if($("#MP4_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            $("#MP4_IDC_HPERC", c_dialog).val($(this).val());
            var nh = (($(this).val()/100)*initH);
            $("#MP4_IDC_HEIGHT", c_dialog).val(parseInt(nh));
        }
    });

    $("#MP4_IDC_HPERC", c_dialog).change(function () {
        var nh = (($(this).val()/100)*initH);
        $("#MP4_IDC_HEIGHT", c_dialog).val(parseInt(nh));

        if($("#MP4_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            $("#MP4_IDC_WPERC", c_dialog).val($(this).val());
            var nw = (($(this).val()/100)*initW);
            $("#MP4_IDC_WIDTH", c_dialog).val(parseInt(nw));
        }
    });

    $("#MP4_IDC_VIDEOSASINPUT", c_dialog).change(function () {
        var checked = $("#MP4_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), ["MP4_IDC_WIDTH","MP4_IDC_HEIGHT","MP4_IDC_WPERC","MP4_IDC_HPERC","MP4_IDC_FRPERSECOND","MP4_IDC_LINKSIZES"], checked);      
    });

    $("#MP4_IDC_RESIZE_METHOD", c_dialog).jselect({
        data: [RM_STRETCH, RM_LETTER, RM_CROP]
    });
    $("#MP4_IDC_RESIZEQUALITY", c_dialog).jselect({
        data: [RQ_NORMAL, RQ_BEST]
    });

    $("#MP4_IDC_FREQUENCY", c_dialog).jselect({
        data: [aFreqs.FQ_48_KHZ,aFreqs.FQ_44_KHZ,aFreqs.FQ_32_KHZ,
            aFreqs.FQ_24_KHZ,aFreqs.FQ_22_KHZ,aFreqs.FQ_16_KHZ,
            aFreqs.FQ_12_KHZ,aFreqs.FQ_11_KHZ,aFreqs.FQ_8_KHZ]
    });
    
    $("#MP4_IDC_CHANNELS", c_dialog).jselect({
        data: [MONO, STEREO]
    });
    
    $("#MP4_IDC_VIDEOCODEC", c_dialog).jselect({data: MP4_VIDEO_CODECS});
    $("#MP4_IDC_AUDIOCODEC", c_dialog).jselect({data: MP4_AUDIO_CODECS});
};
//=
var C_XVID = [2015444769, "XviD MPEG-4 Codec"];

var C_MP3 = [-1, "MP3"];
var C_PCM = [-2, "PCM"];
var C_NONE = [0, "None"];

var WMV_VIDEO_CODECS = [    [0, "Windows Media Video V7"], 
                        [1, "Windows Media Screen V7"], 
                        [2, "Windows Media Video 9 Screen"], 
                        [3, "Windows Media Video 9"], 
                        [4, "Windows Media Video V8"], 
                        [5, "Windows Media Video 9 Advanced Profile"], 
                        [6, "Uncompressed Video"]
];
var WMV_AUDIO_CODECS = [    [0, "Windows Media Audio 9.2"], 
                        [1, "ACELP.NET"], 
                        [2, "Windows Media Audio Voice 9"], 
                        [3, "Windows Media Audio 10 Professional"], 
                        [4, "Windows Media Audio 9.2 Lossless"], 
                        [5, "Uncompressed Audio"], 
                        [6, "Audio None"]
];

var BUFFERS = ["OFF", 5000];
var COMBOVBR = [ [0, "Disable"],
                [1, "Quality"],
                [2, "Constrained"],
                [3, "Unconstrained"]
            ];


var WMV_FORMATS = [];
WMV_FORMATS[0] =[
    [0, "  8 kbps,  8 kHz, mono CBR"],
    [1, "  6 kbps,  8 kHz, mono CBR"],
    [2, "  5 kbps,  8 kHz, mono CBR"],
    [3, "  0 kbps,  8 kHz, mono CBR"],
    [4, " 12 kbps,  8 kHz, stereo CBR"],
    [5, " 10 kbps, 11 kHz, mono CBR"],
    [6, "  8 kbps, 11 kHz, mono CBR"],
    [7, " 16 kbps, 16 kHz, mono CBR"],
    [8, " 12 kbps, 16 kHz, mono CBR"],
    [9, " 10 kbps, 16 kHz, mono CBR"],
    [10, " 20 kbps, 16 kHz, stereo CBR"],
    [11, " 16 kbps, 16 kHz, stereo CBR"],
    [12, " 20 kbps, 22 kHz, mono CBR"],
    [13, " 16 kbps, 22 kHz, mono CBR"],
    [14, " 32 kbps, 22 kHz, stereo CBR"],
    [15, " 22 kbps, 22 kHz, stereo CBR"],
    [16, " 20 kbps, 22 kHz, stereo CBR"],
    [17, " 20 kbps, 32 kHz, mono CBR"],
    [18, " 48 kbps, 32 kHz, stereo CBR"],
    [19, " 40 kbps, 32 kHz, stereo CBR"],
    [20, " 32 kbps, 32 kHz, stereo CBR"],
    [21, " 24 kbps, 32 kHz, stereo CBR"],
    [22, " 48 kbps, 44 kHz, mono CBR"],
    [23, " 32 kbps, 44 kHz, mono CBR"],
    [24, " 20 kbps, 44 kHz, mono CBR"],
    [25, "320 kbps, 44 kHz, stereo CBR"],
    [26, "256 kbps, 44 kHz, stereo CBR"],
    [27, "192 kbps, 44 kHz, stereo CBR"],
    [28, "160 kbps, 44 kHz, stereo CBR"],
    [29, "128 kbps, 44 kHz, stereo CBR"],
    [30, " 96 kbps, 44 kHz, stereo CBR"],
    [31, " 80 kbps, 44 kHz, stereo CBR"],
    [32, " 64 kbps, 44 kHz, stereo CBR"],
    [33, " 48 kbps, 44 kHz, stereo CBR"],
    [34, " 32 kbps, 44 kHz, stereo CBR"],
    [35, "192 kbps, 48 kHz, stereo CBR"],
    [36, "191 kbps, 48 kHz, stereo Low Delay CBR"],
    [37, "160 kbps, 48 kHz, stereo CBR"],
    [38, "128 kbps, 48 kHz, stereo CBR"],
    [39, "127 kbps, 48 kHz, stereo Low Delay CBR"],
    [40, " 96 kbps, 48 kHz, stereo CBR"],
    [41, " 95 kbps, 48 kHz, stereo Low Delay CBR"],
    [42, " 64 kbps, 48 kHz, stereo CBR"],
    [43, " 63 kbps, 48 kHz, stereo Low Delay CBR"],
    [44, "  8 kbps,  8 kHz, mono (A/V) CBR"],
    [45, "  6 kbps,  8 kHz, mono (A/V) CBR"],
    [46, "  5 kbps,  8 kHz, mono (A/V) CBR"],
    [47, " 12 kbps,  8 kHz, stereo (A/V) CBR"],
    [48, " 10 kbps, 11 kHz, mono (A/V) CBR"],
    [49, "  8 kbps, 11 kHz, mono (A/V) CBR"],
    [50, " 20 kbps, 22 kHz, mono (A/V) CBR"],
    [51, " 16 kbps, 22 kHz, mono (A/V) CBR"],
    [52, " 32 kbps, 22 kHz, stereo (A/V) CBR"],
    [53, " 22 kbps, 22 kHz, stereo (A/V) CBR"],
    [54, " 20 kbps, 22 kHz, stereo (A/V) CBR"],
    [55, " 20 kbps, 32 kHz, mono (A/V) CBR"],
    [56, " 48 kbps, 32 kHz, stereo (A/V) CBR"],
    [57, " 40 kbps, 32 kHz, stereo (A/V) CBR"],
    [58, " 32 kbps, 32 kHz, stereo (A/V) CBR"],
    [59, " 24 kbps, 32 kHz, stereo (A/V) CBR"],
    [60, " 48 kbps, 44 kHz, mono (A/V) CBR"],
    [61, " 32 kbps, 44 kHz, mono (A/V) CBR"],
    [62, " 20 kbps, 44 kHz, mono (A/V) CBR"],
    [63, "320 kbps, 44 kHz, stereo (A/V) CBR"],
    [64, "256 kbps, 44 kHz, stereo (A/V) CBR"],
    [65, "192 kbps, 44 kHz, stereo (A/V) CBR"],
    [66, "160 kbps, 44 kHz, stereo (A/V) CBR"],
    [67, "128 kbps, 44 kHz, stereo (A/V) CBR"],
    [68, " 96 kbps, 44 kHz, stereo (A/V) CBR"],
    [69, " 80 kbps, 44 kHz, stereo (A/V) CBR"],
    [70, " 64 kbps, 44 kHz, stereo (A/V) CBR"],
    [71, " 48 kbps, 44 kHz, stereo (A/V) CBR"],
    [72, " 32 kbps, 44 kHz, stereo (A/V) CBR"],
    [73, "192 kbps, 48 kHz, stereo (A/V) CBR"],
    [74, "160 kbps, 48 kHz, stereo (A/V) CBR"],
    [75, "128 kbps, 48 kHz, stereo (A/V) CBR"],
    [76, " 96 kbps, 48 kHz, stereo (A/V) CBR"],
    [77, " 64 kbps, 48 kHz, stereo (A/V) CBR"],
    [78, "VBR Quality 98, 44 kHz, stereo VBR"],
    [79, "VBR Quality 90, 44 kHz, stereo VBR"],
    [80, "VBR Quality 75, 44 kHz, stereo VBR"],
    [81, "VBR Quality 50, 44 kHz, stereo VBR"],
    [82, "VBR Quality 25, 44 kHz, stereo VBR"],
    [83, "VBR Quality 10, 44 kHz, stereo VBR"],
    [84, "VBR Quality 98, 48 kHz, stereo VBR"],
    [85, "VBR Quality 90, 48 kHz, stereo VBR"]
];

WMV_FORMATS[1] =[
    [0, "5 Kbits/s, 8000Hz, Mono"],
    [1, "6.5 Kbits/s, 8000Hz, Mono"],
    [2, "8.5 Kbits/s, 8000Hz, Mono"],
    [3, "16 Kbits/s, 16000Hz, Mono"]
];

WMV_FORMATS[2] =[
    [0, "4 kbps, 8 kHz, mono"],
    [1, "5 kbps, 8 kHz, mono"],
    [2, "8 kbps, 8 kHz, mono"],
    [3, "10 kbps, 11.025 kHz, mono"],
    [4, "12 kbps, 16 kHz, mono"],
    [5, "16 kbps, 16 kHz, mono"],
    [6, "20 kbps, 22.05 kHz, mono"]
];
WMV_FORMATS[3] =[
    [0, " 32 kbps, 32 kHz, 2 channel 16 bit CBR"],
    [1, "440 kbps, 44 kHz, 2 channel 24 bit CBR"],
    [2, "384 kbps, 44 kHz, 2 channel 24 bit CBR"],
    [3, "256 kbps, 44 kHz, 2 channel 24 bit CBR"],
    [4, "256 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [5, "192 kbps, 44 kHz, 2 channel 24 bit CBR"],
    [6, "192 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [7, "160 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [8, "128 kbps, 44 kHz, 2 channel 24 bit CBR"],
    [9, "128 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [10, " 96 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [11, " 80 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [12, " 64 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [13, " 48 kbps, 44 kHz, 2 channel 16 bit CBR"],
    [26, "440 kbps, 48 kHz, 2 channel 24 bit CBR"],
    [27, "384 kbps, 48 kHz, 2 channel 24 bit CBR"],
    [28, "256 kbps, 48 kHz, 2 channel 24 bit CBR"],
    [29, "256 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [30, "192 kbps, 48 kHz, 2 channel 24 bit CBR"],
    [31, "192 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [32, "191 kbps, 48 kHz, 2 channel 24 bit Low Delay CBR"],
    [33, "160 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [34, "128 kbps, 48 kHz, 2 channel 24 bit CBR"],
    [35, "128 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [36, "127 kbps, 48 kHz, 2 channel 24 bit Low Delay CBR"],
    [37, " 96 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [38, " 80 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [39, " 64 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [40, " 48 kbps, 48 kHz, 2 channel 16 bit CBR"],
    [79, " 32 kbps, 32 kHz, 2 channel 16 bit (A/V) CBR"],
    [80, "440 kbps, 44 kHz, 2 channel 24 bit (A/V) CBR"],
    [81, "384 kbps, 44 kHz, 2 channel 24 bit (A/V) CBR"],
    [82, "256 kbps, 44 kHz, 2 channel 24 bit (A/V) CBR"],
    [83, "256 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [84, "192 kbps, 44 kHz, 2 channel 24 bit (A/V) CBR"],
    [85, "192 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [86, "160 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [87, "128 kbps, 44 kHz, 2 channel 24 bit (A/V) CBR"],
    [88, "128 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [89, " 96 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [90, " 80 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [91, " 64 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [92, " 48 kbps, 44 kHz, 2 channel 16 bit (A/V) CBR"],
    [105, "440 kbps, 48 kHz, 2 channel 24 bit (A/V) CBR"],
    [106, "384 kbps, 48 kHz, 2 channel 24 bit (A/V) CBR"],
    [107, "256 kbps, 48 kHz, 2 channel 24 bit (A/V) CBR"],
    [108, "256 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [109, "192 kbps, 48 kHz, 2 channel 24 bit (A/V) CBR"],
    [110, "192 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [111, "160 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [112, "128 kbps, 48 kHz, 2 channel 24 bit (A/V) CBR"],
    [113, "128 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [114, " 96 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [115, " 80 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [116, " 64 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [117, " 48 kbps, 48 kHz, 2 channel 16 bit (A/V) CBR"],
    [153, "VBR Quality 98, 44 kHz, 2 channel 24 bit VBR"],
    [154, "VBR Quality 90, 44 kHz, 2 channel 24 bit VBR"],
    [155, "VBR Quality 75, 44 kHz, 2 channel 24 bit VBR"],
    [156, "VBR Quality 50, 44 kHz, 2 channel 24 bit VBR"],
    [157, "VBR Quality 25, 44 kHz, 2 channel 24 bit VBR"],
    [158, "VBR Quality 10, 44 kHz, 2 channel 24 bit VBR"],
    [165, "VBR Quality 98, 48 kHz, 2 channel 24 bit VBR"],
    [166, "VBR Quality 90, 48 kHz, 2 channel 24 bit VBR"],
    [167, "VBR Quality 75, 48 kHz, 2 channel 24 bit VBR"],
    [168, "VBR Quality 50, 48 kHz, 2 channel 24 bit VBR"],
    [169, "VBR Quality 25, 48 kHz, 2 channel 24 bit VBR"],
    [170, "VBR Quality 10, 48 kHz, 2 channel 24 bit VBR"]
];
WMV_FORMATS[4] =[
    [0, "VBR Quality 100, 44 kHz, 2 channel 16 bit VBR"],
    [1, "VBR Quality 100, 44 kHz, 2 channel 24 bit VBR"],
    [2, "VBR Quality 100, 48 kHz, 2 channel 24 bit VBR"]
];
WMV_FORMATS[5] =[
    [0, "8000 Hz, 8 Bits, Mono"],
    [1, "8000 Hz, 8 Bits, Stereo"],
    [2, "8000 Hz, 16 Bits, Mono"],
    [3, "8000 Hz, 16 Bits, Stereo"],
    [4, "11025 Hz, 8 Bits, Mono"],
    [5, "11025 Hz, 8 Bits, Stereo"],
    [6, "11025 Hz, 16 Bits, Mono"],
    [7, "11025 Hz, 16 Bits, Stereo"],
    [8, "12000 Hz, 8 Bits, Mono"],
    [9, "12000 Hz, 8 Bits, Stereo"],
    [10, "12000 Hz, 16 Bits, Mono"],
    [11, "12000 Hz, 16 Bits, Stereo"],
    [12, "16000 Hz, 8 Bits, Mono"],
    [13, "16000 Hz, 8 Bits, Stereo"],
    [14, "16000 Hz, 16 Bits, Mono"],
    [15, "16000 Hz, 16 Bits, Stereo"],
    [16, "22050 Hz, 8 Bits, Mono"],
    [17, "22050 Hz, 8 Bits, Stereo"],
    [18, "22050 Hz, 16 Bits, Mono"],
    [19, "22050 Hz, 16 Bits, Stereo"],
    [20, "24000 Hz, 8 Bits, Mono"],
    [21, "24000 Hz, 8 Bits, Stereo"],
    [22, "24000 Hz, 16 Bits, Mono"],
    [23, "24000 Hz, 16 Bits, Stereo"],
    [24, "32000 Hz, 8 Bits, Mono"],
    [25, "32000 Hz, 8 Bits, Stereo"],
    [26, "32000 Hz, 16 Bits, Mono"],
    [27, "32000 Hz, 16 Bits, Stereo"],
    [28, "44100 Hz, 8 Bits, Mono"],
    [29, "44100 Hz, 8 Bits, Stereo"],
    [30, "44100 Hz, 16 Bits, Mono"],
    [31, "44100 Hz, 16 Bits, Stereo"],
    [32, "48000 Hz, 8 Bits, Mono"],
    [33, "48000 Hz, 8 Bits, Stereo"],
    [34, "48000 Hz, 16 Bits, Mono"],
    [35, "48000 Hz, 16 Bits, Stereo"]
];
WMV_FORMATS[6] =[];

PRESETS_DATA[aPrs.WMV9_00[0]] = {data : {
    //AudioCodec        :-1,
    Freq            :aFreqs.FQ_44_KHZ,
    Channels        :2,
    
    ProfileNum      :0,
    LinkSizes       :true,
    VideoSAsInput   :false,
    WPerc           :100,
    HPerc           :100,
    ResizeMethod    :RM_LETTER,
    ResizeQuality   :RQ_BEST,

    Width           : 320,
    Height          : 240,
    FrameRate       : "29.97",
    VideoBitrate    : 327000,
    VideoQuality    : 70,
    VideoBuffer     : 5000,
    AudioBuffer     : -1,
    AudioFormatNum  : 42,
    AudioCodecNum   : 0,
    VideoCodecNum   : 3,
    WMV             : {
                        VBR : 0,
                        VidBuffer : 5000,
                        VBRMaxBitrate : 0,
                        VBRQuality : 0
                    }
}};

PRESETS_DATA[aPrs.WMV9_01[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_00[0]]);
PRESETS_DATA[aPrs.WMV9_01[0]].data.ProfileNum = 1;
PRESETS_DATA[aPrs.WMV9_01[0]].data.Width = 640;
PRESETS_DATA[aPrs.WMV9_01[0]].data.Height =480;
PRESETS_DATA[aPrs.WMV9_01[0]].data.VideoBitrate = 1000000;
PRESETS_DATA[aPrs.WMV9_01[0]].data.VideoQuality = 75;

PRESETS_DATA[aPrs.WMV9_02[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_01[0]]);
PRESETS_DATA[aPrs.WMV9_02[0]].data.ProfileNum = 2;
PRESETS_DATA[aPrs.WMV9_02[0]].data.VideoBitrate = 2000000;
PRESETS_DATA[aPrs.WMV9_02[0]].data.VideoQuality = 85;

PRESETS_DATA[aPrs.WMV9_03[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_02[0]]);
PRESETS_DATA[aPrs.WMV9_03[0]].data.ProfileNum       = 3;
PRESETS_DATA[aPrs.WMV9_03[0]].data.Width            = 1280;
PRESETS_DATA[aPrs.WMV9_03[0]].data.Height           = 720;
PRESETS_DATA[aPrs.WMV9_03[0]].data.VideoBitrate     = 4800000;
PRESETS_DATA[aPrs.WMV9_03[0]].data.VideoQuality     = 85;
PRESETS_DATA[aPrs.WMV9_03[0]].data.AudioBuffer      = 5000;
PRESETS_DATA[aPrs.WMV9_03[0]].data.AudioFormatNum   = 35;
PRESETS_DATA[aPrs.WMV9_03[0]].data.AudioCodecNum    = 0;
PRESETS_DATA[aPrs.WMV9_03[0]].data.VideoCodecNum    = 3;
PRESETS_DATA[aPrs.WMV9_03[0]].data.FrameRate        = "25";

PRESETS_DATA[aPrs.WMV9_04[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_03[0]]);
PRESETS_DATA[aPrs.WMV9_04[0]].data.ProfileNum       = 4;
PRESETS_DATA[aPrs.WMV9_04[0]].data.VideoQuality     = 85;
PRESETS_DATA[aPrs.WMV9_04[0]].data.FrameRate        = "30";

PRESETS_DATA[aPrs.WMV9_05[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_04[0]]);
PRESETS_DATA[aPrs.WMV9_05[0]].data.ProfileNum       = 5;
PRESETS_DATA[aPrs.WMV9_05[0]].data.Width            = 1440;
PRESETS_DATA[aPrs.WMV9_05[0]].data.Height           = 1080;
PRESETS_DATA[aPrs.WMV9_05[0]].data.FrameRate        = "25";
PRESETS_DATA[aPrs.WMV9_05[0]].data.VideoBitrate     = 7300000;
PRESETS_DATA[aPrs.WMV9_05[0]].data.VideoQuality     = 85;
PRESETS_DATA[aPrs.WMV9_05[0]].data.AudioBuffer      = 5000;
PRESETS_DATA[aPrs.WMV9_05[0]].data.VideoBuffer      = 5000;
PRESETS_DATA[aPrs.WMV9_05[0]].data.AudioFormatNum   = 35;
PRESETS_DATA[aPrs.WMV9_05[0]].data.AudioCodecNum    = 0;
PRESETS_DATA[aPrs.WMV9_05[0]].data.VideoCodecNum    = 3;

PRESETS_DATA[aPrs.WMV9_06[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_05[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_06[0]];
tmp.data.ProfileNum         = 6;
tmp.data.Width              = 1440;
tmp.data.Height             = 1080;
tmp.data.FrameRate          = "30";
tmp.data.VideoBitrate       = 7300000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 35;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;


PRESETS_DATA[aPrs.WMV9_07[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_06[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_07[0]];
tmp.data.ProfileNum         = 7;
tmp.data.Width              = 160;
tmp.data.Height             = 120;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 14000;
tmp.data.VideoQuality       = 50;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 49;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_08[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_07[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_08[0]];
tmp.data.ProfileNum         = 8;
tmp.data.Width              = 176;
tmp.data.Height             = 144;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 40000;
tmp.data.VideoQuality       = 75;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 9;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_09[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_08[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_09[0]];
tmp.data.ProfileNum         = 9;
tmp.data.Width              = 176;
tmp.data.Height             = 144;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 78000;
tmp.data.VideoQuality       = 75;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 9;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_10[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_09[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_10[0]];
tmp.data.ProfileNum         = 10;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 391000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 58;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_11[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_10[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_11[0]];
tmp.data.ProfileNum         = 11;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 83000;
tmp.data.VideoQuality       = 75;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 9;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_12[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_11[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_12[0]];
tmp.data.ProfileNum         = 12;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 198976;
tmp.data.VideoQuality       = 80;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 60;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_13[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_12[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_13[0]];
tmp.data.ProfileNum         = 13;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 279000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 76;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_14[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_13[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_14[0]];
tmp.data.ProfileNum         = 14;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 662960;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 68;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;

PRESETS_DATA[aPrs.WMV9_15[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_14[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_15[0]];
tmp.data.ProfileNum         = 15;
tmp.data.Width              = 208;
tmp.data.Height             = 160;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 662960;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = 5000;
tmp.data.VideoBuffer        = 5000;
tmp.data.AudioFormatNum     = 68;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;


PRESETS_DATA[aPrs.WMV9_16[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_15[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_16[0]];
tmp.data.ProfileNum         = 16;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 309000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 70;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_17[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_16[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_17[0]];
tmp.data.ProfileNum         = 17;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 309000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 70;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_18[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_17[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_18[0]];
tmp.data.ProfileNum         = 18;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "30";
tmp.data.VideoBitrate       = 1500000;
tmp.data.VideoQuality       = 75;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 75;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_19[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_18[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_19[0]];
tmp.data.ProfileNum         = 19;
tmp.data.Width              = 640;
tmp.data.Height             = 480;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 500000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 67;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;


PRESETS_DATA[aPrs.WMV9_20[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_19[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_20[0]];
tmp.data.ProfileNum         = 20;
tmp.data.Width              = 480;
tmp.data.Height             = 272;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 500000;
tmp.data.VideoQuality       = 75;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 67;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_21[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_20[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_21[0]];
tmp.data.ProfileNum         = 21;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "15";
tmp.data.VideoBitrate       = 500000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 67;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_22[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_21[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_22[0]];
tmp.data.ProfileNum         = 22;
tmp.data.Width              = 720;
tmp.data.Height             = 576;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 1000000;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 73;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_23[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_22[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_23[0]];
tmp.data.ProfileNum         = 23;
tmp.data.Width              = 720;
tmp.data.Height             = 480;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 1000000;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 73;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_24[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_23[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_24[0]];
tmp.data.ProfileNum         = 24;
tmp.data.Width              = 1280;
tmp.data.Height             = 720;
tmp.data.FrameRate          = "29.97";
tmp.data.VideoBitrate       = 3000000;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 73;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_25[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_24[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_25[0]];
tmp.data.ProfileNum         = 25;
tmp.data.Width              = 1440;
tmp.data.Height             = 1088;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 5000000;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 73;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_26[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_25[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_26[0]];
tmp.data.ProfileNum         = 26;
tmp.data.Width              = 160;
tmp.data.Height             = 128;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 200000;
tmp.data.VideoQuality       = 70;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 70;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_27[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_26[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_27[0]];
tmp.data.ProfileNum         = 27;
tmp.data.Width              = 320;
tmp.data.Height             = 240;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 500000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 67;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_28[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_27[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_28[0]];
tmp.data.ProfileNum         = 28;
tmp.data.Width              = 480;
tmp.data.Height             = 272;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 500000;
tmp.data.VideoQuality       = 85;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 67;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

PRESETS_DATA[aPrs.WMV9_29[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.WMV9_28[0]]); 
tmp = PRESETS_DATA[aPrs.WMV9_29[0]];
tmp.data.ProfileNum         = 29;
tmp.data.Width              = 800;
tmp.data.Height             = 480;
tmp.data.FrameRate          = "25";
tmp.data.VideoBitrate       = 1000000;
tmp.data.VideoQuality       = 90;
tmp.data.AudioBuffer        = -1;
tmp.data.VideoBuffer        = -1;
tmp.data.AudioFormatNum     = 67;
tmp.data.AudioCodecNum      = 0;
tmp.data.VideoCodecNum      = 3;
tmp.data.WMV.VidBuffer      = -1;

DIALOGS[FMT_WMV[0]].exportPreset = function()
{
    var data = [];//PRESETS_DATA[presetId].data;
    var m_dialog = $("div#IDD_WMVOPTS");
    data.Width = $("#WMV_IDC_WIDTH", m_dialog).val();
    data.Height = $("#WMV_IDC_HEIGHT", m_dialog).val();
    data.HPerc = $("#WMV_IDC_WPERC", m_dialog).val();
    data.WPerc = $("#WMV_IDC_HPERC", m_dialog).val();

    data.FrameRate = $("#WMV_IDC_FRPERSECOND", m_dialog).val();
    data.VideoSAsInput = $("#WMV_IDC_VIDEOSASINPUT", m_dialog).attr('checked' );
    data.LinkSizes = $("#WMV_IDC_LINKSIZES", m_dialog).attr('checked');
    
    
    data.ResizeMethod = $("select#WMV_IDC_RESIZE_METHOD", m_dialog).val();
    data.ResizeQuality = $("select#WMV_IDC_RESIZEQUALITY", m_dialog).val();
    data.Freq = $("select#WMV_IDC_FREQUENCY", m_dialog).val();
    data.Channels = $("select#WMV_IDC_CHANNELS", m_dialog).val();
    data.VideoCodecNum = $("select#WMV_IDC_VIDEOCODEC", m_dialog).val();
    data.AudioCodecNum = $("select#WMV_IDC_AUDIOCODEC", m_dialog).val();
    data.AudioFormatNum = $("select#WMV_IDC_WMAFORMAT", m_dialog).val();
    
    data.VideoQuality = $("input#WMV_IDC_QUALITY", m_dialog).val();
    data.VideoBitrate = $("input#WMV_IDC_BITRATE", m_dialog).val();
    data.VideoBuffer = $("select#WMV_IDC_BUFFER", m_dialog).val();

    var m_opt_dialog = $("div#IDD_OPT_WMV");
    data.WMV = [];
    data.WMV.VBR = $("select#IDC_COMBOVBR_WMV", m_opt_dialog).val();
    data.WMV.VBRMaxBitrate = $("input#IDC_VBRMAXBITRATE_WMV", m_opt_dialog).val();
    data.WMV.VBRQuality = $("input#IDC_VBRQUALITY_WMV", m_opt_dialog).val();
    data.WMV.VidBuffer = $("select#IDC_VIDBUFFER_WMV", m_opt_dialog).val();
    return data;
};

DIALOGS[FMT_WMV[0]].initPreset = function(presetId)
{
    var data = PRESETS_DATA[presetId].data;
    initW = data.Width;
    initH = data.Height;
    var m_dialog = $("div#IDD_WMVOPTS");
    $("#WMV_IDC_WIDTH", m_dialog).val(data.Width);
    $("#WMV_IDC_HEIGHT", m_dialog).val(data.Height);
    $("#WMV_IDC_WPERC", m_dialog).val(data.WPerc);
    $("#WMV_IDC_HPERC", m_dialog).val(data.HPerc);

    $("#WMV_IDC_FRPERSECOND", m_dialog).val(data.FrameRate);
    $("#WMV_IDC_VIDEOSASINPUT", m_dialog).attr('checked', data.VideoSAsInput).change();
    $("#WMV_IDC_LINKSIZES", m_dialog).attr('checked', data.LinkSizes).change();
    
    
    $("#WMV_IDC_RESIZE_METHOD", m_dialog).val(data.ResizeMethod);
    $("#WMV_IDC_RESIZEQUALITY", m_dialog).val(data.ResizeQuality);
    $("#WMV_IDC_FREQUENCY", m_dialog).val(data.Freq);
    $("#WMV_IDC_CHANNELS", m_dialog).val(data.Channels);
    $("#WMV_IDC_VIDEOCODEC", m_dialog).val(data.VideoCodecNum);
    $("#WMV_IDC_AUDIOCODEC", m_dialog).val(data.AudioCodecNum).change();
    $("#WMV_IDC_WMAFORMAT", m_dialog).val(data.AudioFormatNum);
    
    $("#WMV_IDC_QUALITY", m_dialog).val(data.VideoQuality);
    $("#WMV_IDC_BITRATE", m_dialog).val(data.VideoBitrate);
    $("#WMV_IDC_BUFFER", m_dialog).val(data.VideoBuffer);

    var m_opt_dialog = $("div#IDD_OPT_WMV");
    $("#IDC_COMBOVBR_WMV", m_opt_dialog).val(data.WMV.VBR).change();
    $("#IDC_VBRMAXBITRATE_WMV", m_opt_dialog).val(data.WMV.VBRMaxBitrate);
    $("#IDC_VBRQUALITY_WMV", m_opt_dialog).val(data.WMV.VBRQuality);
    $("#IDC_VIDBUFFER_WMV", m_opt_dialog).val(data.WMV.VidBuffer);
    $("#IDC_VBRMAXBUFF_WMV", m_opt_dialog).val(-1);
    $("#IDC_VBRMAXBUF_WMV", m_opt_dialog).attr('checked', false).change();

};

DIALOGS[FMT_WMV[0]].init = function()
{
    var m_dialog = $("#IDD_WMVOPTS");
    var m_opt_dialog = $("#IDD_OPT_WMV");

    $("input[type=button]", m_dialog).hover(
        function(){ 
            $(this).addClass("ui-state-hover"); 
        },
        function(){ 
            $(this).removeClass("ui-state-hover"); 
        }
    ).mousedown(function(){
        $(this).addClass("ui-state-active"); 
    }).mouseup(function(){
            $(this).removeClass("ui-state-active");
    });

    $("input#WMV_IDC_VIDEOOPTS", m_dialog).click(function () {
        m_opt_dialog.dialog('open');
    });
        
    $("#WMV_IDC_BUFFER").jselect({data: BUFFERS});
    $("#WMV_IDC_VIDEOCODEC").jselect({data: WMV_VIDEO_CODECS});
    $("#WMV_IDC_AUDIOCODEC").jselect({data: WMV_AUDIO_CODECS});
       
    $("#WMV_IDC_AUDIOCODEC", m_dialog).change(function () {
        $("select#WMV_IDC_WMAFORMAT", m_dialog).jselect({data: WMV_FORMATS[$(this).val()]});            
    });

    $("#WMV_IDC_WIDTH", m_dialog).change(function () {
        if($("#WMV_IDC_LINKSIZES", m_dialog).attr('checked'))
        {
            var nh = ($(this).val()/initW) * initH;
            $("#WMV_IDC_HEIGHT", m_dialog).val(parseInt(nh));
        }
        var npw = ($("#WMV_IDC_WIDTH", m_dialog).val()/initW) * 100;
        $("#WMV_IDC_WPERC", m_dialog).val(parseInt(npw));
        var nph = ($("#WMV_IDC_HEIGHT", m_dialog).val()/initH) * 100;
        $("#WMV_IDC_HPERC", m_dialog).val(parseInt(nph));
    });
    $("#WMV_IDC_HEIGHT", m_dialog).change(function () {
        if($("#WMV_IDC_LINKSIZES", m_dialog).attr('checked'))
        {
            var nw = ($(this).val()/initH) * initW;
            $("#WMV_IDC_WIDTH", m_dialog).val(parseInt(nw));
        }
        var npw = ($("#WMV_IDC_WIDTH", m_dialog).val()/initW) * 100;
        $("#WMV_IDC_WPERC", m_dialog).val(parseInt(npw));
        var nph = ($("#WMV_IDC_HEIGHT", m_dialog).val()/initH) * 100;
        $("#WMV_IDC_HPERC", m_dialog).val(parseInt(nph));
    });
    
    $("#WMV_IDC_WPERC", m_dialog).change(function () {
        var nw = (($(this).val()/100)*initW);
        $("#WMV_IDC_WIDTH", m_dialog).val(parseInt(nw));

        if($("#WMV_IDC_LINKSIZES", m_dialog).attr('checked'))
        {
            $("#WMV_IDC_HPERC", m_dialog).val($(this).val());
            var nh = (($(this).val()/100)*initH);
            $("#WMV_IDC_HEIGHT", m_dialog).val(parseInt(nh));
        }
    });

    $("#WMV_IDC_HPERC", m_dialog).change(function () {
        var nh = (($(this).val()/100)*initH);
        $("#WMV_IDC_HEIGHT", m_dialog).val(parseInt(nh));

        if($("#WMV_IDC_LINKSIZES", m_dialog).attr('checked'))
        {
            $("#WMV_IDC_WPERC", m_dialog).val($(this).val());
            var nw = (($(this).val()/100)*initW);
            $("#WMV_IDC_WIDTH", m_dialog).val(parseInt(nw));
        }
    });

    $("#WMV_IDC_VIDEOSASINPUT", m_dialog).change(function () {
        var checked = $("#WMV_IDC_VIDEOSASINPUT", m_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), 
                        ["WMV_IDC_WIDTH", "WMV_IDC_HEIGHT", "WMV_IDC_WPERC",
                        "WMV_IDC_HPERC", "WMV_IDC_FRPERSECOND", "WMV_IDC_LINKSIZES"], 
                        checked);
    });
    $("select#WMV_IDC_RESIZE_METHOD", m_dialog).jselect({data: [RM_STRETCH, RM_LETTER, RM_CROP]});
    $("select#WMV_IDC_RESIZEQUALITY", m_dialog).jselect({data: [RQ_NORMAL, RQ_BEST]});
    
}


var ABITRATE_LIST = [[32000, "32 Kbit/sec"],[40000, "40 Kbit/sec"],[48000, "48 Kbit/sec"],[56000, "56 Kbit/sec"],[64000, "64 Kbit/sec"],[80000, "80 Kbit/sec"],[96000, "96 Kbit/sec"],[112000, "112 Kbit/sec"],[128000, "128 Kbit/sec"],[160000, "160 Kbit/sec"],[192000, "192 Kbit/sec"],[224000, "224 Kbit/sec"],[256000, "256 Kbit/sec"],[320000, "320 Kbit/sec"]]; 

PRESETS_DATA[aPrs.FLV_100[0]] = { data : {
    VideoSAsInput   : true,
    LinkSizes       : true,
    IsSound         : true,
    
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,
    ResizeQuality   : RQ_BEST,
    FrameRate       : "25",
    VideoQuality    : 30,
    Frequency       : 44100,
    Channels        : 2,
    AudioBitrate    : 128
    }
};

PRESETS_DATA[aPrs.FLV_75[0]] = { data : {
    VideoSAsInput   : true,
    LinkSizes       : true,
    IsSound         : true,
    
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,
    ResizeQuality   : RQ_BEST,
    FrameRate       : "15",
    VideoQuality    : 26,
    Frequency       : 44100,
    Channels        : 1,
    AudioBitrate    : 64
    }
};
PRESETS_DATA[aPrs.FLV_50[0]] = { data : {
    VideoSAsInput   : true,
    LinkSizes       : true,
    IsSound         : true,
    
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,
    ResizeQuality   : RQ_BEST,
    FrameRate       : "15",
    VideoQuality    : 20,
    Frequency       : 22050,
    Channels        : 1,
    AudioBitrate    : 48
    }
};
PRESETS_DATA[aPrs.FLV_25[0]] = { data : {
    VideoSAsInput   : true,
    LinkSizes       : true,
    IsSound         : true,
    
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,
    ResizeQuality   : RQ_BEST,
    FrameRate       : "15",
    VideoQuality    : 15,
    Frequency       : 22050,
    Channels        : 1,
    AudioBitrate    : 32
    }
};
PRESETS_DATA[aPrs.FLV_20[0]] = { data : {
    VideoSAsInput   : true,
    LinkSizes       : true,
    IsSound         : false,
    
    Width           : 320,
    Height          : 240,
    WPerc           : 100,
    HPerc           : 100,
    ResizeMethod    : RM_LETTER,
    ResizeQuality   : RQ_BEST,
    FrameRate       : "10",
    VideoQuality    : 10,
    Frequency       : 22050,
    Channels        : 1,
    AudioBitrate    : 32
    }
};

DIALOGS[FMT_FLV[0]].initPreset = function(presetId)
{
    //var c_dialog = $("div#IDD_FLVOPTS");
    var data = PRESETS_DATA[presetId].data;
    initW = data.Width;
    initH = data.Height;
    
    $("#FLV_IDC_WIDTH").val(data.Width);
    $("#FLV_IDC_HEIGHT").val(data.Height);
    $("#FLV_IDC_WPERC").val(data.WPerc);
    $("#FLV_IDC_HPERC").val(data.HPerc);

    $("#FLV_IDC_FRPERSECOND").val(data.FrameRate);
    $("#FLV_IDC_VIDEOSASINPUT").attr('checked', data.VideoSAsInput).change();
    $("#FLV_IDC_LINKSIZES").attr('checked', data.LinkSizes).change();
        
    $("#FLV_IDC_RESIZE_METHOD").val(data.ResizeMethod);
    $("#FLV_IDC_RESIZEQUALITY").val(data.ResizeQuality);
    $("#FLV_IDC_FREQUENCY").val(data.Freq);
    $("#FLV_IDC_CHANNELS").val(data.Channels);
    $("#FLV_IDC_INCSOUND").attr('checked', data.IsSound).change();
    $("#FLV_IDC_VIDEOQUALITY").slider('value', data.VideoQuality);
};


DIALOGS[FMT_FLV[0]].exportPreset = function()
{
    //var c_dialog = $("div#IDD_FLVOPTS");
    var data = [];//PRESETS_DATA[presetId].data;

    data.Width = $("#FLV_IDC_WIDTH").val();
    data.Height = $("#FLV_IDC_HEIGHT").val();
    data.WPerc = $("#FLV_IDC_WPERC").val();
    data.HPerc = $("#FLV_IDC_HPERC").val();

    data.FrameRate = $("#FLV_IDC_FRPERSECOND").val();
    data.VideoSAsInput = $("#FLV_IDC_VIDEOSASINPUT").attr('checked');
    data.LinkSizes = $("#FLV_IDC_LINKSIZES").attr('checked');
        
    data.ResizeMethod = $("#FLV_IDC_RESIZE_METHOD").val();
    data.ResizeQuality = $("#FLV_IDC_RESIZEQUALITY").val();
    data.Freq = $("#FLV_IDC_FREQUENCY").val();
    data.Channels = $("#FLV_IDC_CHANNELS").val();
    data.IsSound = $("#FLV_IDC_INCSOUND").attr('checked');
    data.VideoQuality = $("#FLV_IDC_VIDEOQUALITY").slider('value');
    return data;
};


DIALOGS[FMT_FLV[0]].init = function()
{
    var c_dialog = $("div#IDD_FLVOPTS");
    $("#FLV_IDC_VIDEOQUALITY", c_dialog).slider({
        min: 1,
        max: 30,
        step: 1
    });
    $("#FLV_IDC_INCSOUND", c_dialog).change(function () {
        var checked = !$("#FLV_IDC_INCSOUND", c_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), 
                        ["FLV_IDC_FREQUENCY", "FLV_IDC_CHANNELS", "FLV_IDC_AUDIOBITRATE"], 
                        checked);
    });
    
    $("#FLV_IDC_HEIGHT", c_dialog).change(function () {
        if($("#FLV_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            var nw = ($(this).val()/initH) * initW;
            $("#FLV_IDC_WIDTH", c_dialog).val(parseInt(nw));
        }
        var npw = ($("#FLV_IDC_WIDTH", c_dialog).val()/initW) * 100;
        $("#FLV_IDC_WPERC", c_dialog).val(parseInt(npw));
        var nph = ($("#FLV_IDC_HEIGHT", c_dialog).val()/initH) * 100;
        $("#FLV_IDC_HPERC", c_dialog).val(parseInt(nph));
    });

    
    $("#FLV_IDC_WPERC", c_dialog).change(function () {
        var nw = (($(this).val()/100)*initW);
        $("div#IDD_MP4OPTS input#FLV_IDC_WIDTH").val(parseInt(nw));

        if($("#FLV_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            $("#FLV_IDC_HPERC", c_dialog).val($(this).val());
            var nh = (($(this).val()/100)*initH);
            $("#FLV_IDC_HEIGHT", c_dialog).val(parseInt(nh));
        }
    });

    $("#FLV_IDC_HPERC", c_dialog).change(function () {
        var nh = (($(this).val()/100)*initH);
        $("#FLV_IDC_HEIGHT", c_dialog).val(parseInt(nh));

        if($("#FLV_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            $("#FLV_IDC_WPERC", c_dialog).val($(this).val());
            var nw = (($(this).val()/100)*initW);
            $("#FLV_IDC_WIDTH", c_dialog).val(parseInt(nw));
        }
    });

    $("#FLV_IDC_VIDEOSASINPUT", c_dialog).change(function () {
        var checked = $("#FLV_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), 
                        ["FLV_IDC_WIDTH", "FLV_IDC_HEIGHT", "FLV_IDC_WPERC",
                        "FLV_IDC_HPERC", "FLV_IDC_FRPERSECOND", "FLV_IDC_LINKSIZES"], 
                        checked);       
    });

    $("select#FLV_IDC_RESIZE_METHOD", c_dialog).jselect({
        data: [RM_STRETCH, RM_LETTER, RM_CROP]
    });
    $("select#FLV_IDC_RESIZEQUALITY", c_dialog).jselect({
        data: [RQ_NORMAL, RQ_BEST]
    });

    $("select#FLV_IDC_FREQUENCY", c_dialog).jselect({
        data: [aFreqs.FQ_11_KHZ,aFreqs.FQ_22_KHZ,aFreqs.FQ_44_KHZ]
    });
    
    $("select#FLV_IDC_AUDIOBITRATE", c_dialog).jselect({data: ABITRATE_LIST});
    
    $("select#FLV_IDC_CHANNELS", c_dialog).jselect({
        data: [MONO, STEREO]
    });
    
};

var MPEG2_ABITRATE_LIST = [32,48,56,64,80,96,112,160,192,224,256,320,384];
var MPEG2_RATIO_LIST = [[0, "Square"], [1, "4:3"], [2, "16:9"], [3, "2.21:1"]];
var MPEG2_VBR_LIST = [[0, "None"], [1, "Ultra"], [2, "Very High"], [3, "High"], [4, "Normal"]];
var MPEG2_FRAMERATE_LIST = ["23.976", "24", "25", "29.97", "30"];
var MPEG2_WIDTH_LIST = [160, 176, 320, 352, 480, 640, 704, 720, 800, 1280, 1440, 1920];
var MPEG2_HEIGHT_LIST = [128, 144, 240, 256, 288, 480, 576, 704, 720, 800, 1024, 1088];
var MPEG1 = [0, "MPEG1"];
var MPEG2 = [2, "MPEG2"];
//aPrs.MPEG2_DVD_PAL, aPrs.MPEG2_DVD_NTSC, aPrs.MPEG2_SameAsInput, aPrs.MPEG2_VCD_NTSC, aPrs.MPEG2_VCD_PAL, aPrs.MPEG2_SVCD_NTSC, aPrs.MPEG2_SVCD_PAL, aPrs.MPEG2_HD1, aPrs.MPEG2_HD2
PRESETS_DATA[aPrs.MPEG2_SameAsInput[0]] = { data : {
    Type : MPEG2[0],//
    VideoBitrate : 4025,//
    VBRQuality : 0,//
    VideoSAsInput : true,//
    Width : 720,//
    Height : 576,//
    ResizeMethod : RM_LETTER,//
    ResizeQuality : RQ_BEST,//
    FrameRate : "25",//
    AspectRatio : 0,//
    IsSound : true,//
    AudioBitrate : 224,
    Frequency : 44100,//
    Channels : 2,//
    JointStereo : false
    }
};
PRESETS_DATA[aPrs.MPEG2_VCD_NTSC[0]] = { data : {
    Type : MPEG1[0],//
    VideoBitrate : 1150,//
    VBRQuality : 0,//
    VideoSAsInput : false,//
    Width : 352,//
    Height : 240,//
    ResizeMethod : RM_LETTER,//
    ResizeQuality : RQ_BEST,//
    FrameRate : "29.97",//
    AspectRatio : 0,//
    IsSound : true,//
    AudioBitrate : 224,
    Frequency : 44100,//
    Channels : 2,//
    JointStereo : false
    }
};
PRESETS_DATA[aPrs.MPEG2_VCD_PAL[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG2_VCD_NTSC[0]]);
PRESETS_DATA[aPrs.MPEG2_VCD_NTSC[0]].data.FrameRate = "25";

PRESETS_DATA[aPrs.MPEG2_SVCD_NTSC[0]] = { data : {
    Type : MPEG2[0],//
    VideoBitrate : 2415,//
    VBRQuality : 0,//
    VideoSAsInput : false,//
    Width : 480,//
    Height :480,//
    ResizeMethod : RM_LETTER,//
    ResizeQuality : RQ_BEST,//
    FrameRate : "29.97",//
    AspectRatio : 3,//
    IsSound : true,//
    AudioBitrate : 224,
    Frequency : 44100,//
    Channels : 2,//
    JointStereo : false
    }
};

PRESETS_DATA[aPrs.MPEG2_SVCD_PAL[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG2_SVCD_NTSC[0]]);
PRESETS_DATA[aPrs.MPEG2_SVCD_PAL[0]].data.FrameRate = "25";
PRESETS_DATA[aPrs.MPEG2_SVCD_PAL[0]].data.AspectRatio = 2;
PRESETS_DATA[aPrs.MPEG2_SVCD_PAL[0]].data.Height = 576;

PRESETS_DATA[aPrs.MPEG2_DVD_NTSC[0]] = { data : {
    Type : MPEG2[0],//
    VideoBitrate : 4025,//
    VBRQuality : 0,//
    VideoSAsInput : false,//
    Width : 720,//
    Height :480,//
    ResizeMethod : RM_LETTER,//
    ResizeQuality : RQ_BEST,//
    FrameRate : "29.97",//
    AspectRatio : 3,//
    IsSound : true,//
    AudioBitrate : 224,
    Frequency : 48000,//
    Channels : 2,//
    JointStereo : false
    }
};
PRESETS_DATA[aPrs.MPEG2_DVD_PAL[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG2_DVD_NTSC[0]]);
PRESETS_DATA[aPrs.MPEG2_DVD_PAL[0]].data.FrameRate = "25";
PRESETS_DATA[aPrs.MPEG2_DVD_PAL[0]].data.AspectRatio = 2;
PRESETS_DATA[aPrs.MPEG2_DVD_PAL[0]].data.Height = 576;

PRESETS_DATA[aPrs.MPEG2_HD1[0]] = { data : {
    Type : MPEG2[0],//
    VideoBitrate : 16100,//
    VBRQuality : 0,//
    VideoSAsInput : false,//
    Width : 1440,//
    Height :1088,//
    ResizeMethod : RM_LETTER,//
    ResizeQuality : RQ_BEST,//
    FrameRate : "25",//
    AspectRatio : 3,//
    IsSound : true,//
    AudioBitrate : 384,
    Frequency : 48000,//
    Channels : 2,//
    JointStereo : false
    }
};

PRESETS_DATA[aPrs.MPEG2_HD2[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.MPEG2_HD1[0]]);
PRESETS_DATA[aPrs.MPEG2_HD2[0]].data.Width = 1280;
PRESETS_DATA[aPrs.MPEG2_HD2[0]].data.Height = 720;
PRESETS_DATA[aPrs.MPEG2_HD2[0]].data.VideoBitrate = 13110;

DIALOGS[FMT_MPEG12[0]].initPreset = function(presetId)
{
    var data = PRESETS_DATA[presetId].data;
    var c_dialog = $("#IDD_MPEGOPTS");
    $("#MPEG2_IDC_WIDTH", c_dialog).val(data.Width);
    $("#MPEG2_IDC_HEIGHT", c_dialog).val(data.Height);
    $("#MPEG2_IDC_RATIO", c_dialog).val(data.AspectRatio);
    $("#MPEG2_IDC_FRPERSECOND", c_dialog).val(data.FrameRate);
    $("#MPEG2_IDC_RESIZE_METHOD", c_dialog).val(data.ResizeMethod);
    $("#MPEG2_IDC_RESIZEQUALITY", c_dialog).val(data.ResizeQuality);
    $("#MPEG2_IDC_FREQUENCY", c_dialog).val(data.Freq);
    $("#MPEG2_IDC_CHANNELS", c_dialog).val(data.Channels);
    $("#MPEG2_IDC_VIDEOBITRATE", c_dialog).val(data.VideoBitrate);
    $("#MPEG2_IDC_VIDEOVARB", c_dialog).val(data.VBRQuality);
    $("#MPEG2_IDC_AUDIOBITRATE", c_dialog).val(data.AudioBitrate);
    
    $("#MPEG2_IDC_VIDEOSASINPUT", c_dialog).attr('checked', data.VideoSAsInput).change();
    $("#MPEG2_IDC_INCSOUND", c_dialog).attr('checked', data.IsSound).change();
    $("#MPEG2_IDC_MPEGVER", c_dialog).val(data.Type).change();

};

DIALOGS[FMT_MPEG12[0]].exportPreset = function()
{
    var data = [];//PRESETS_DATA[presetId].data;
    var c_dialog = $("#IDD_MPEGOPTS");
    data.Width = $("#MPEG2_IDC_WIDTH", c_dialog).val();
    data.Height = $("#MPEG2_IDC_HEIGHT", c_dialog).val();
    data.AspectRatio = $("#MPEG2_IDC_RATIO", c_dialog).val();
    data.FrameRate = $("#MPEG2_IDC_FRPERSECOND", c_dialog).val();
    data.ResizeMethod = $("#MPEG2_IDC_RESIZE_METHOD", c_dialog).val();
    data.ResizeQuality = $("#MPEG2_IDC_RESIZEQUALITY", c_dialog).val();
    data.Freq = $("#MPEG2_IDC_FREQUENCY", c_dialog).val();
    data.Channels = $("#MPEG2_IDC_CHANNELS", c_dialog).val();
    data.VideoBitrate = $("#MPEG2_IDC_VIDEOBITRATE", c_dialog).val();
    data.VBRQuality = $("#MPEG2_IDC_VIDEOVARB", c_dialog).val();
    data.AudioBitrate = $("#MPEG2_IDC_AUDIOBITRATE", c_dialog).val();
    
    data.VideoSAsInput = $("#MPEG2_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
    data.IsSound = $("#MPEG2_IDC_INCSOUND", c_dialog).attr('checked');
    data.Type = $("#MPEG2_IDC_MPEGVER", c_dialog).val();
    return data;

};

DIALOGS[FMT_MPEG12[0]].init = function()
{
    var c_dialog = $("#IDD_MPEGOPTS");
    $("select#MPEG2_IDC_MPEGVER", c_dialog).change( function() {
        var checked = $("#MPEG2_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
        if(!checked)
        {
            if(MPEG1[0] == $(this).val())
                $("#MPEG2_IDC_RATIO", c_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
            if(MPEG2[0] == $(this).val())
                $("#MPEG2_IDC_RATIO", c_dialog).attr('disabled', false).toggleClass( 'ui-state-disabled', false);
        }
        
    });

    $("#MPEG2_IDC_VIDEOSASINPUT", c_dialog).change(function () {
        var checked = $("#MPEG2_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), 
            ["IDC_WIDTH","IDC_HEIGHT", "IDC_FRPERSECOND", "IDC_RATIO"], 
            checked);       
        $("select#MPEG2_IDC_MPEGVER", c_dialog).change();
    });
    
    $("#MPEG2_IDC_INCSOUND", c_dialog).change(function () {
        var checked = !$("#MPEG2_IDC_INCSOUND", c_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), 
            ["IDC_FREQUENCY","IDC_CHANNELS", "IDC_AUDIOBITRATE"], 
            checked);
    });
    
    $("select#MPEG2_IDC_RESIZE_METHOD", c_dialog).jselect({data: [RM_STRETCH, RM_LETTER, RM_CROP]});
    $("select#MPEG2_IDC_RESIZEQUALITY", c_dialog).jselect({data: [RQ_NORMAL, RQ_BEST]});
    $("select#MPEG2_IDC_FREQUENCY", c_dialog).jselect({data: [aFreqs.FQ_48_KHZ,aFreqs.FQ_44_KHZ,aFreqs.FQ_32_KHZ]});
    $("select#MPEG2_IDC_CHANNELS", c_dialog).jselect({data: [MONO, STEREO]});
    $("select#MPEG2_IDC_WIDTH", c_dialog).jselect({data: MPEG2_WIDTH_LIST});
    $("select#MPEG2_IDC_HEIGHT", c_dialog).jselect({data: MPEG2_HEIGHT_LIST});
    $("select#MPEG2_IDC_FRPERSECOND", c_dialog).jselect({data: MPEG2_FRAMERATE_LIST});
    $("select#MPEG2_IDC_RATIO", c_dialog).jselect({data: MPEG2_RATIO_LIST});
    $("select#MPEG2_IDC_MPEGVER", c_dialog).jselect({data: [MPEG1, MPEG2]});
    
    var VBITRATE_LIST = [];
    var j = 0;
    for(i=115; i<=23000; i+=115)
        VBITRATE_LIST[j++] = ""+i;
    $("select#MPEG2_IDC_VIDEOBITRATE", c_dialog).jselect({data: VBITRATE_LIST});

    $("select#MPEG2_IDC_VIDEOVARB", c_dialog).jselect({data: MPEG2_VBR_LIST});
    $("select#MPEG2_IDC_AUDIOBITRATE", c_dialog).jselect({data: MPEG2_ABITRATE_LIST});
}

var C_XVID = [879783277, "XviD MPEG-4 Codec"];

var C_MP3 = [-1, "MP3"];
var C_PCM = [-2, "PCM"];
var C_NONE = [0, "None"];

var AVI_VIDEO_CODECS = [C_XVID];
var AVI_AUDIO_CODECS = [C_NONE, C_MP3, C_PCM];

PRESETS_DATA[aPrs.AVI_XviD[0]] = function(){};
PRESETS_DATA[aPrs.AVI_XviD[0]].data = {
    VideoCodec      :879783277,
    Width           :320,
    Height          :240,
    WPerc           :100,
    HPerc           :100,
    FrameRate       :"25",
    LinkSizes       :true,
    ResizeMethod    :RM_LETTER,
    ResizeQuality   :RQ_BEST,
    VideoSAsInput   :false,
    AudioCodec      :-1,
    Freq            :aFreqs.FQ_44_KHZ,
    Channels        :2
};
PRESETS_DATA[aPrs.AVI_XviD_YouTube[0]] = jQuery.extend(true, {}, PRESETS_DATA[aPrs.AVI_XviD[0]]);
PRESETS_DATA[aPrs.AVI_XviD_YouTube[0]].data.VideoSAsInput = true;

DIALOGS[FMT_AVI[0]].init = function()
{
    var c_dialog = $("#IDD_AVIOPTS");
    $("select#AVI_IDC_VIDEOCODEC", c_dialog).jselect({data: AVI_VIDEO_CODECS});
    $("select#AVI_IDC_AUDIOCODEC", c_dialog).jselect({data: AVI_AUDIO_CODECS});
    
    $("#AVI_IDC_WIDTH", c_dialog).change(function () {
        if($("#AVI_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            var nh = ($(this).val()/initW) * initH;
            $("#AVI_IDC_HEIGHT", c_dialog).val(parseInt(nh));
        }
        var npw = ($("#AVI_IDC_WIDTH", c_dialog).val()/initW) * 100;
        $("#AVI_IDC_WPERC", c_dialog).val(parseInt(npw));
        var nph = ($("#AVI_IDC_HEIGHT", c_dialog).val()/initH) * 100;
        $("#AVI_IDC_HPERC", c_dialog).val(parseInt(nph));
    });
    $("#AVI_IDC_HEIGHT", c_dialog).change(function () {
        if($("#AVI_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            var nw = ($(this).val()/initH) * initW;
            $("#AVI_IDC_WIDTH", c_dialog).val(parseInt(nw));
        }
        var npw = ($("#AVI_IDC_WIDTH", c_dialog).val()/initW) * 100;
        $("#AVI_IDC_WPERC", c_dialog).val(parseInt(npw));
        var nph = ($("#AVI_IDC_HEIGHT", c_dialog).val()/initH) * 100;
        $("#AVI_IDC_HPERC", c_dialog).val(parseInt(nph));
    });
    
    $("#AVI_IDC_WPERC", c_dialog).change(function () {
        var nw = (($(this).val()/100)*initW);
        $("#AVI_IDC_WIDTH", c_dialog).val(parseInt(nw));

        if($("#AVI_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            $("#AVI_IDC_HPERC", c_dialog).val($(this).val());
            var nh = (($(this).val()/100)*initH);
            $("#AVI_IDC_HEIGHT", c_dialog).val(parseInt(nh));
        }
    });

    $("#AVI_IDC_HPERC", c_dialog).change(function () {
        var nh = (($(this).val()/100)*initH);
        $("#AVI_IDC_HEIGHT", c_dialog).val(parseInt(nh));

        if($("#AVI_IDC_LINKSIZES", c_dialog).attr('checked'))
        {
            $("#AVI_IDC_WPERC", c_dialog).val($(this).val());
            var nw = (($(this).val()/100)*initW);
            $("#AVI_IDC_WIDTH", c_dialog).val(parseInt(nw));
        }
    });

    $("#AVI_IDC_VIDEOSASINPUT", c_dialog).change(function () {
        var checked = $("#AVI_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
        toggleDisabled($("div#preset_dialog"), 
                        ["AVI_IDC_WIDTH", "AVI_IDC_HEIGHT", "AVI_IDC_WPERC",
                        "AVI_IDC_HPERC", "AVI_IDC_FRPERSECOND", "AVI_IDC_LINKSIZES"], 
                        checked);       
    });
    $("select#AVI_IDC_RESIZE_METHOD", c_dialog).jselect({data: [RM_STRETCH, RM_LETTER, RM_CROP]});
    $("select#AVI_IDC_RESIZEQUALITY", c_dialog).jselect({data: [RQ_NORMAL, RQ_BEST]});
    $("select#AVI_IDC_CHANNELS", c_dialog).jselect({data: [MONO, STEREO]});
    $("select#AVI_IDC_AUDIOCODEC", c_dialog).change(function () {
        var checked = ($(this).val() == C_NONE[0]);
        toggleDisabled($("div#preset_dialog"), ["IDC_AUDIOOPTS","IDC_FREQUENCY", "IDC_CHANNELS"], checked);     
    });
    $("select#AVI_IDC_FREQUENCY", c_dialog).jselect({
        data: [aFreqs.FQ_48_KHZ,aFreqs.FQ_44_KHZ,aFreqs.FQ_32_KHZ,aFreqs.FQ_24_KHZ,aFreqs.FQ_22_KHZ,aFreqs.FQ_16_KHZ,aFreqs.FQ_12_KHZ,aFreqs.FQ_11_KHZ,aFreqs.FQ_8_KHZ]
    }); 
}
DIALOGS[FMT_AVI[0]].exportPreset = function()
{
    var c_dialog = $("#IDD_AVIOPTS");
    var data = [];//PRESETS_DATA[presetId].data;

    data.Width  = $("#AVI_IDC_WIDTH", c_dialog).val();
    data.Height = $("#AVI_IDC_HEIGHT", c_dialog).val();
    data.WPerc  = $("#AVI_IDC_WPERC", c_dialog).val();
    data.HPerc  = $("#AVI_IDC_HPERC", c_dialog).val();

    data.FrameRate = $("#AVI_IDC_FRPERSECOND", c_dialog).val();
    data.VideoSAsInput = $("#AVI_IDC_VIDEOSASINPUT", c_dialog).attr('checked');
    data.LinkSizes = $("#AVI_IDC_LINKSIZES", c_dialog).attr('checked');
    
    
    data.ResizeMethod = $("select#AVI_IDC_RESIZE_METHOD", c_dialog).val();
    data.ResizeQuality = $("select#AVI_IDC_RESIZEQUALITY", c_dialog).val();
    data.Freq = $("select#AVI_IDC_FREQUENCY", c_dialog).val();
    data.Channels = $("select#AVI_IDC_CHANNELS", c_dialog).val();
    data.VideoCodec = $("select#AVI_IDC_VIDEOCODEC", c_dialog).val();
    data.AudioCodec = $("select#AVI_IDC_AUDIOCODEC", c_dialog).val();
    return data;
}

DIALOGS[FMT_AVI[0]].initPreset = function(presetId)
{
    var c_dialog = $("#IDD_AVIOPTS");
    var data = PRESETS_DATA[presetId].data;
    initW = data.Width;
    initH = data.Height;
    $("#AVI_IDC_WIDTH", c_dialog).val(data.Width);
    $("#AVI_IDC_HEIGHT", c_dialog).val(data.Height);
    $("#AVI_IDC_WPERC", c_dialog).val(data.WPerc);
    $("#AVI_IDC_HPERC", c_dialog).val(data.HPerc);

    $("#AVI_IDC_FRPERSECOND", c_dialog).val(data.FrameRate);
    $("#AVI_IDC_VIDEOSASINPUT", c_dialog).attr('checked', data.VideoSAsInput).change();
    $("#AVI_IDC_LINKSIZES", c_dialog).attr('checked', data.LinkSizes).change();
    
    
    $("select#AVI_IDC_RESIZE_METHOD", c_dialog).val(data.ResizeMethod);
    $("select#AVI_IDC_RESIZEQUALITY", c_dialog).val(data.ResizeQuality);
    $("select#AVI_IDC_FREQUENCY", c_dialog).val(data.Freq);
    $("select#AVI_IDC_CHANNELS", c_dialog).val(data.Channels);
    $("select#AVI_IDC_VIDEOCODEC", c_dialog).val(data.VideoCodec);
    $("select#AVI_IDC_AUDIOCODEC", c_dialog).val(data.AudioCodec);
};
var C_MPEG4 = ['mp4v', "MPEG4 Video"];
var C_H263 = ['s263', "H.263"];
var C_H264 = ['avc1', "H.264"];
var C_AAC = ['mp4a', "AAC"];
var C_AMR = ['samr', "AMR"];
var C_NONE = [0, "None"];

var PROFILES_mp4v = [[8, "Simple"], [148, "Advanced Realtime Simple"], [244, "Advanced Simple"]];
var QUALITY_mp4v = [[0, "Lowest"], [1, "Low"], [2, "Medium Low"], [3, "Medium"], [4, "Medium High"], [5, "High"], [6, "Highest"]];

var QUALITY_s263 = [[1, "Lowest"], [5, "Low"], [10, "Medium Low"], [15, "Medium"], [20, "Medium High"], [25, "High"], [30, "Highest"]];
var RANGE_s263 = [[1, "Very Small"], [3, "Small"], [7, "Medium"], [10, "Wide"], [15, "Very Wide"]];

var PROFILES_avc1 = [[1, "Baseline"], [2, "Main"], [4, "High"]];
var QUALITY_avc1 = [[0, "Default"], [1, "Low"], [2, "Medium"], [3, "High"], [4, "Highest"]];

var PROFILES_mp4a = [[1, "Main"], [2, "LC"], [5, "LTP"]];
var BITRATES_mp4a = [8, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];
var QUALITY_mp4a     = [[100, "Medium"], [250, "High"], [500, "Highest"]];

var BITRATES_samr = [4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200];

var GP2_FRAMERATES = ["8", "10", "12", "15", "23.976", "24", "25", "29.97", "30"];

var GP2_VIDEO_CODECS = [C_MPEG4, C_H263, C_H264];
var GP2_AUDIO_CODECS = [C_NONE, C_AAC, C_AMR];

var S_SUBQCIF = [8388704, "128x96 SubQCIF"];
var S_QCIF    = [11534480, "176x144 QCIF"];
var S_XVGA    = [15728960, "320x240 XVGA"];
var S_SAME    = [0, "Same as input"];
var GP2_IMAGE_SIZES = [S_SUBQCIF, S_QCIF, S_XVGA, S_SAME];
var GP2_IMAGE_SIZES2    = [S_SUBQCIF, S_QCIF, S_SAME];
//96|(80<<16)  - 5242976
//128|(96<<16) - 8388704
//176|(144<<16)- 11534480
//320 240      - 15728960
PRESETS_DATA[aPrs.TGPP2_OQ[0]] = { data : {
    VideoCodec      : C_H263[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { H263 : {
        Bitrate : 128000, 
        VBR     : false,
        MotionSrchRng : 15,
        Quality : 30
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 12200
    }},
    b3GPP2Mode      : true
    }
};

PRESETS_DATA[aPrs.TGPP2_HQ[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { MPG4 : {
        Bitrate     : 192000, 
        Profile     : 8,
        Quality     : 6
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Bitrate     : 96000, 
        Profile     : 2,
        Quality     : 100
    }},
    b3GPP2Mode      : true
    }
};

PRESETS_DATA[aPrs.TGPP2_SQ[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "12",
    VParams         : { MPG4 : {
        Bitrate     : 72000, 
        Profile     : 8,
        Quality     : 5
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 12200
    }},
    b3GPP2Mode      : true
    }
};

PRESETS_DATA[aPrs.TGPP2_BQ[0]] = { data : {
    VideoCodec      : C_H263[0],
    Size            : 8388704,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "10",
    VParams         : { H263 : {
        Bitrate : 64000, 
        VBR     : false,
        MotionSrchRng : 7,
        Quality : 15
    }},
    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 10200
    }},
    b3GPP2Mode      : true
    }
};

PRESETS_DATA[aPrs.TGPP2_SSA[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 8388704,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "10",
    VParams         : { MPG4 : {
        Bitrate     : 32000, 
        Profile     : 8,
        Quality     : 1
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 6700
    }},
    b3GPP2Mode      : true
    }
};

PRESETS_DATA[aPrs.TGPP2_SSwA[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 8388704,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "10",
    VParams         : { MPG4 : {
        Bitrate     : 32000, 
        Profile     : 8,
        Quality     : 1
    }},

    AudioCodec      : C_NONE[0],
    Frequency       : 8000,
    Channels        : 1
    }
};

PRESETS_DATA[aPrs.TGPP2_Cellphone[0]] = { data : {
    VideoCodec      : C_H263[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { H263 : {
        Bitrate : 128000, 
        VBR     : false,
        MotionSrchRng : 15,
        Quality : 30
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 12200
    }},
    b3GPP2Mode      : true
    }
};

DIALOGS[FMT_3GPP2[0]].exportPreset = function()
{
    var data = [];//PRESETS_DATA[presetId].data;

    var c_dialog = $("#IDD_3GP2OPTS");
    data.VideoCodec = $("#GP2_IDC_VIDEOCODEC", c_dialog).val();
    data.AudioCodec = $("#GP2_IDC_AUDIOCODEC", c_dialog).val();

    data.Size = $("#GP2_IDC_IMAGESIZE", c_dialog).val();


    data.FrameRate =    $("#GP2_IDC_FRAMERATE", c_dialog).val();
    //$("#GP_IDC_PSPMODE", c_dialog).attr('checked', data.PSPMode).change();
        
    data.ResizeMethod = $("select#GP2_IDC_RESIZE_METHOD", c_dialog).val();
    data.ResizeQuality = $("select#GP2_IDC_RESIZEQUALITY", c_dialog).val();
    data.Freq = $("select#GP2_IDC_FREQUENCY", c_dialog).val();
    data.Channels = $("select#GP2_IDC_CHANNELS", c_dialog).val();
    switch(data.VideoCodec) {
        case C_MPEG4[0]: 
            data.VParams = {MPG4:{
                Profile : $("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val(),
                Bitrate : 1000*$("div#IDD_OPT_mp4v #IDC_BITRATE_mp4v").val(),
                Quality : $("div#IDD_OPT_mp4v #IDC_QUALITY_mp4v").val()
                }};
            break;
        case C_H263[0]: 
            data.VParams = {H263 : {        
                MotionSrchRng   : $("div#IDD_OPT_s263 #IDC_SEARCHRANGE_s263").val(),
                Bitrate         : 1000*$("div#IDD_OPT_s263 #IDC_BITRATE_s263").val(),
                Quality         : $("div#IDD_OPT_s263 #IDC_QUALITY_s263").val(),
                VBR             : $("div#IDD_OPT_s263 #IDC_USEVBR_s263").attr('checked')
            }};

            break;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
            //BYTE btMotionSrchRng;
        case C_H264[0]: 
            data.VParams = {H264 : {        
                Profile : $("div#IDD_OPT_avc1 #IDC_PROFILE_avc1").val(),
                Bitrate : 1000*$("div#IDD_OPT_avc1 #IDC_BITRATE_avc1").val(),
                Quality : $("div#IDD_OPT_avc1 #IDC_QUALITY_avc1").val(),
                VBR     : $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('checked')
                }};
            break;
            //BYTE btProfile;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
    }
    switch(data.AudioCodec) {
        case C_NONE[0]: 
            break;
        case C_AAC[0]: 
            data.AParams = {AAC : {     
                Profile : $("div#IDD_OPT_mp4a #IDC_PROFILE_mp4a").val(),
                Bitrate : 1000*$("div#IDD_OPT_mp4a #IDC_BITRATE_mp4a").val(),
                Quality : $("div#IDD_OPT_mp4a #IDC_QUALITY_mp4a").val()
            }};
            break;
        case C_AMR[0]: 
            data.AParams = {AMR : {Bitrate : $("div#IDD_OPT_samr #IDC_BITRATE_samr").val()}};
            break;
            //DWORD dwBitrate;
    }
    
    return data;
};


DIALOGS[FMT_3GPP2[0]].initPreset = function(presetId)
{
    var data = PRESETS_DATA[presetId].data;
    initW = data.Width;
    initH = data.Height;
    var c_dialog = $("#IDD_3GP2OPTS");
    $("#GP2_IDC_VIDEOCODEC", c_dialog).val(data.VideoCodec);
    $("#GP2_IDC_AUDIOCODEC", c_dialog).val(data.AudioCodec);

    $("#GP2_IDC_IMAGESIZE", c_dialog).val(data.Size);


    $("#GP2_IDC_FRAMERATE", c_dialog).val(data.FrameRate);
    //$("#GP_IDC_PSPMODE", c_dialog).attr('checked', data.PSPMode).change();
        
    $("select#GP2_IDC_RESIZE_METHOD", c_dialog).val(data.ResizeMethod);
    $("select#GP2_IDC_RESIZEQUALITY", c_dialog).val(data.ResizeQuality);
    $("select#GP2_IDC_FREQUENCY", c_dialog).val(data.Freq);
    $("select#GP2_IDC_CHANNELS", c_dialog).val(data.Channels);
    switch(data.VideoCodec) {
        case C_MPEG4[0]: 
            data.VParams = {MPG4:{
                Profile : $("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val(),
                Bitrate : 1000*$("div#IDD_OPT_mp4v #IDC_BITRATE_mp4v").val(),
                Quality : $("div#IDD_OPT_mp4v #IDC_QUALITY_mp4v").val()
                }};
            break;
        case C_H263[0]: 
            data.VParams = {H263 : {        
                MotionSrchRng   : $("div#IDD_OPT_s263 #IDC_SEARCHRANGE_s263").val(),
                Bitrate         : 1000*$("div#IDD_OPT_s263 #IDC_BITRATE_s263").val(),
                Quality         : $("div#IDD_OPT_s263 #IDC_QUALITY_s263").val(),
                VBR             : $("div#IDD_OPT_s263 #IDC_USEVBR_s263").attr('checked')
            }};

            break;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
            //BYTE btMotionSrchRng;
        case C_H264[0]: 
            data.VParams = {H264 : {        
                Profile : $("div#IDD_OPT_avc1 #IDC_PROFILE_avc1").val(),
                Bitrate : 1000*$("div#IDD_OPT_avc1 #IDC_BITRATE_avc1").val(),
                Quality : $("div#IDD_OPT_avc1 #IDC_QUALITY_avc1").val(),
                VBR     : $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('checked')
                }};
            break;
            //BYTE btProfile;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
    }
    switch(data.AudioCodec) {
        case C_NONE[0]: 
            break;
        case C_AAC[0]: 
            data.AParams = {AAC : {     
                Profile : $("div#IDD_OPT_mp4a #IDC_PROFILE_mp4a").val(),
                Bitrate : 1000*$("div#IDD_OPT_mp4a #IDC_BITRATE_mp4a").val(),
                Quality : $("div#IDD_OPT_mp4a #IDC_QUALITY_mp4a").val()
            }};
            break;
        case C_AMR[0]: 
            data.AParams = {AMR : {Bitrate : $("div#IDD_OPT_samr #IDC_BITRATE_samr").val()}};
            break;
            //DWORD dwBitrate;
    }
    
    
};


DIALOGS[FMT_3GPP2[0]].init = function()
{
    var c_dialog = $("#IDD_3GP2OPTS");
    
    $("select#GP2_IDC_VIDEOCODEC", c_dialog).change(function () {
        var val = $("select#GP_IDC_IMAGESIZE", c_dialog).val();
        if($(this).val() == C_H264[0])
            $("select#GP2_IDC_IMAGESIZE", c_dialog).jselect({   data: GP2_IMAGE_SIZES   });
        else $("select#GP2_IDC_IMAGESIZE", c_dialog).jselect({  data: GP2_IMAGE_SIZES2  });
        $("select#GP2_IDC_IMAGESIZE", c_dialog).val(val);
    });
    
    $("select#GP2_IDC_AUDIOCODEC", c_dialog).change(function () {
        var checked = ($(this).val() == C_NONE[0]);
        var checked2 = checked || ($(this).val() == C_AMR[0]);
        toggleDisabled($("div#preset_dialog"), 
                ["GP2_IDC_AUDIOOPTS"], 
                checked);   
        toggleDisabled($("div#preset_dialog"), 
                ["GP2_IDC_FREQUENCY", "GP2_IDC_CHANNELS"], 
                checked2);  
    });
        
    $("input[type=button]", c_dialog).hover(
            function(){ 
                $(this).addClass("ui-state-hover"); 
            },
            function(){ 
                $(this).removeClass("ui-state-hover"); 
            }
        ).mousedown(function(){
            $(this).addClass("ui-state-active"); 
        }).mouseup(function(){
                $(this).removeClass("ui-state-active");
        });

    $("input#GP2_IDC_VIDEOOPTS", c_dialog).click(function () {
        var dlg_name = "#IDD_OPT_" + $("#GP2_IDC_VIDEOCODEC", c_dialog).val() ;
        $(dlg_name).dialog('open');
    }
    );
    $("input#GP2_IDC_AUDIOOPTS", c_dialog).click(function () {
        var dlg_name = "#IDD_OPT_" + $("#GP2_IDC_AUDIOCODEC", c_dialog).val() ;
        $(dlg_name).dialog('open');
    }
    );
    
    $("select#GP2_IDC_RESIZE_METHOD", c_dialog).jselect({
        data: [RM_STRETCH, RM_LETTER, RM_CROP]
    });
    $("select#GP2_IDC_RESIZEQUALITY", c_dialog).jselect({
        data: [RQ_NORMAL, RQ_BEST]
    });

    $("select#GP2_IDC_FREQUENCY", c_dialog).jselect({
        data: [aFreqs.FQ_48_KHZ,aFreqs.FQ_44_KHZ,aFreqs.FQ_32_KHZ,
            aFreqs.FQ_24_KHZ,aFreqs.FQ_22_KHZ,aFreqs.FQ_16_KHZ,
            aFreqs.FQ_12_KHZ,aFreqs.FQ_11_KHZ,aFreqs.FQ_8_KHZ]
    });
    
    $("select#GP2_IDC_CHANNELS", c_dialog).jselect({
        data: [MONO, STEREO]
    });
    
    $("select#GP2_IDC_VIDEOCODEC", c_dialog).jselect({data: GP2_VIDEO_CODECS});
    $("select#GP2_IDC_AUDIOCODEC", c_dialog).jselect({data: GP2_AUDIO_CODECS});
    $("select#GP2_IDC_IMAGESIZE", c_dialog).jselect({data: GP2_IMAGE_SIZES});
    $("select#GP2_IDC_FRAMERATE", c_dialog).jselect({data: GP2_FRAMERATES});
};
var C_MPEG4 = ['mp4v', "MPEG4 Video"];
var C_H263 = ['s263', "H.263"];
var C_H264 = ['avc1', "H.264"];
var C_AAC = ['mp4a', "AAC"];
var C_AMR = ['samr', "AMR"];
var C_NONE = [0, "None"];

var PROFILES_mp4v = [[8, "Simple"], [148, "Advanced Realtime Simple"], [244, "Advanced Simple"]];
var QUALITY_mp4v = [[0, "Lowest"], [1, "Low"], [2, "Medium Low"], [3, "Medium"], [4, "Medium High"], [5, "High"], [6, "Highest"]];

var QUALITY_s263 = [[1, "Lowest"], [5, "Low"], [10, "Medium Low"], [15, "Medium"], [20, "Medium High"], [25, "High"], [30, "Highest"]];
var RANGE_s263 = [[1, "Very Small"], [3, "Small"], [7, "Medium"], [10, "Wide"], [15, "Very Wide"]];

var PROFILES_avc1 = [[1, "Baseline"], [2, "Main"], [4, "High"]];
var QUALITY_avc1 = [[0, "Default"], [1, "Low"], [2, "Medium"], [3, "High"], [4, "Highest"]];

var PROFILES_mp4a = [[1, "Main"], [2, "LC"], [5, "LTP"]];
var BITRATES_mp4a = [8, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];
var QUALITY_mp4a     = [[100, "Medium"], [250, "High"], [500, "Highest"]];

var BITRATES_samr = [4750, 5150, 5900, 6700, 7400, 7950, 10200, 12200];

var GP_FRAMERATES = ["8", "10", "12", "15", "23.976", "24", "25", "29.97", "30"];

var GP_VIDEO_CODECS = [C_MPEG4, C_H263, C_H264];
var GP_AUDIO_CODECS = [C_NONE, C_AAC, C_AMR];

var S_SUBQCIF = [8388704, "128x96 SubQCIF"];
var S_QCIF    = [11534480, "176x144 QCIF"];
var S_XVGA    = [15728960, "320x240 XVGA"];
var S_SAME    = [0, "Same as input"];
var GP_IMAGE_SIZES  = [S_SUBQCIF, S_QCIF, S_XVGA, S_SAME];
var GP_IMAGE_SIZES2 = [S_SUBQCIF, S_QCIF, S_SAME];
//96|(80<<16)  - 5242976
//128|(96<<16) - 8388704
//176|(144<<16)- 11534480
//320 240      - 15728960
PRESETS_DATA[aPrs.TGPP_OQ[0]] = { data : {
    VideoCodec      : C_H263[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { H263 : {
        Bitrate : 128000, 
        VBR     : false,
        MotionSrchRng : 15,
        Quality : 30
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 12200
    }}
    }
};

PRESETS_DATA[aPrs.TGPP_HQ[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { MPG4 : {
        Bitrate     : 192000, 
        Profile     : 8,
        Quality     : 6
    }},

    AudioCodec      : C_AAC[0],
    Frequency       : 44100,
    Channels        : 2,
    AParams         : {AAC : {
        Bitrate     : 96000, 
        Profile     : 2,
        Quality     : 100
    }}
    }
};

PRESETS_DATA[aPrs.TGPP_SQ[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "12",
    VParams         : { MPG4 : {
        Bitrate     : 72000, 
        Profile     : 8,
        Quality     : 5
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 12200
    }}
    }
};

PRESETS_DATA[aPrs.TGPP_BQ[0]] = { data : {
    VideoCodec      : C_H263[0],
    Size            : 8388704,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "10",
    VParams         : { H263 : {
        Bitrate : 64000, 
        VBR     : false,
        MotionSrchRng : 7,
        Quality : 15
    }},
    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 10200
    }}
    }
};

PRESETS_DATA[aPrs.TGPP_SSA[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 8388704,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "10",
    VParams         : { MPG4 : {
        Bitrate     : 32000, 
        Profile     : 8,
        Quality     : 1
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 6700
    }}
    }
};

PRESETS_DATA[aPrs.TGPP_SSwA[0]] = { data : {
    VideoCodec      : C_MPEG4[0],
    Size            : 8388704,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "10",
    VParams         : { MPG4 : {
        Bitrate     : 32000, 
        Profile     : 8,
        Quality     : 1
    }},

    AudioCodec      : C_NONE[0],
    Frequency       : 8000,
    Channels        : 1
    }
};

PRESETS_DATA[aPrs.TGPP_Cellphone[0]] = { data : {
    VideoCodec      : C_H263[0],
    Size            : 11534480,
    ResizeMethod    : RM_LETTER,//
    ResizeQuality   : RQ_BEST,//
    FrameRate       : "15",
    VParams         : { H263 : {
        Bitrate : 128000, 
        VBR     : false,
        MotionSrchRng : 15,
        Quality : 30
    }},

    AudioCodec      : C_AMR[0],
    Frequency       : 8000,
    Channels        : 1,
    AParams         : {AMR : {
        Bitrate : 12200
    }}
    }
};
DIALOGS[FMT_3GPP[0]].exportPreset = function()
{
    var data = [];//PRESETS_DATA[presetId].data;

    var c_dialog = $("#IDD_3GPOPTS");
    data.VideoCodec = $("#GP_IDC_VIDEOCODEC", c_dialog).val();
    data.AudioCodec = $("#GP_IDC_AUDIOCODEC", c_dialog).val();

    data.Size = $("#GP_IDC_IMAGESIZE", c_dialog).val();


    data.FrameRate =    $("#GP_IDC_FRAMERATE", c_dialog).val();
    //$("#GP_IDC_PSPMODE", c_dialog).attr('checked', data.PSPMode).change();
        
    data.ResizeMethod = $("select#GP_IDC_RESIZE_METHOD", c_dialog).val();
    data.ResizeQuality = $("select#GP_IDC_RESIZEQUALITY", c_dialog).val();
    data.Freq = $("select#GP_IDC_FREQUENCY", c_dialog).val();
    data.Channels = $("select#GP_IDC_CHANNELS", c_dialog).val();
    switch(data.VideoCodec) {
        case C_MPEG4[0]: 
            data.VParams = {MPG4 : {
                Profile : $("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val(),
                Bitrate : $("div#IDD_OPT_mp4v #IDC_BITRATE_mp4v").val()*1000,
                Quality : $("div#IDD_OPT_mp4v #IDC_QUALITY_mp4v").val()
                }};
            break;
        case C_H263[0]: 
            data.VParams = {H263 : {        
                MotionSrchRng   : $("div#IDD_OPT_s263 #IDC_SEARCHRANGE_s263").val(),
                Bitrate         : 1000*$("div#IDD_OPT_s263 #IDC_BITRATE_s263").val(),
                Quality         : $("div#IDD_OPT_s263 #IDC_QUALITY_s263").val(),
                VBR             : $("div#IDD_OPT_s263 #IDC_USEVBR_s263").attr('checked')
            }};
            break;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
            //BYTE btMotionSrchRng;
        case C_H264[0]: 
            data.VParams = {H264 : {        
                Profile : $("div#IDD_OPT_avc1 #IDC_PROFILE_avc1").val(),
                Bitrate : 1000*$("div#IDD_OPT_avc1 #IDC_BITRATE_avc1").val(),
                Quality : $("div#IDD_OPT_avc1 #IDC_QUALITY_avc1").val(),
                VBR     : $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('checked')
                }};
            break;
            //BYTE btProfile;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
    }
    switch(data.AudioCodec) {
        case C_NONE[0]: 
            break;
        case C_AAC[0]: 
            data.AParams = {AAC : {     
                Profile : $("div#IDD_OPT_mp4a #IDC_PROFILE_mp4a").val(),
                Bitrate : 1000*$("div#IDD_OPT_mp4a #IDC_BITRATE_mp4a").val(),
                Quality : $("div#IDD_OPT_mp4a #IDC_QUALITY_mp4a").val()
            }};
            break;
        case C_AMR[0]: 
            data.AParams = {AMR : {Bitrate : $("div#IDD_OPT_samr #IDC_BITRATE_samr").val()}};
            break;
            //DWORD dwBitrate;
    }
    
    return data;
};

DIALOGS[FMT_3GPP[0]].initPreset = function(presetId)
{
    var c_dialog = $("#IDD_3GPOPTS");
    var data = PRESETS_DATA[presetId].data;
    initW = data.Width;
    initH = data.Height;
    $("#GP_IDC_VIDEOCODEC", c_dialog).val(data.VideoCodec);
    $("#GP_IDC_AUDIOCODEC", c_dialog).val(data.AudioCodec);

    $("#GP_IDC_IMAGESIZE", c_dialog).val(data.Size);


    $("#GP_IDC_FRAMERATE", c_dialog).val(data.FrameRate);
    //$("#GP_IDC_PSPMODE", c_dialog).attr('checked', data.PSPMode).change();
        
    $("select#GP_IDC_RESIZE_METHOD", c_dialog).val(data.ResizeMethod);
    $("select#GP_IDC_RESIZEQUALITY", c_dialog).val(data.ResizeQuality);
    $("select#GP_IDC_FREQUENCY", c_dialog).val(data.Freq);
    $("select#GP_IDC_CHANNELS", c_dialog).val(data.Channels);
    switch(data.VideoCodec) {
        case C_MPEG4[0]: 
            $("div#IDD_OPT_mp4v #IDC_PROFILE_mp4v").val(data.VParams.MPG4.Profile);
            $("div#IDD_OPT_mp4v #IDC_BITRATE_mp4v").val(data.VParams.MPG4.Bitrate/1000);
            $("div#IDD_OPT_mp4v #IDC_QUALITY_mp4v").val(data.VParams.MPG4.Quality);
            break;
        case C_H263[0]: 
            $("div#IDD_OPT_s263 #IDC_SEARCHRANGE_s263").val(data.VParams.H263.MotionSrchRng);
            $("div#IDD_OPT_s263 #IDC_BITRATE_s263").val(data.VParams.H263.Bitrate/1000);
            $("div#IDD_OPT_s263 #IDC_QUALITY_s263").val(data.VParams.H263.Quality);
            $("div#IDD_OPT_s263 #IDC_USEVBR_s263").attr('checked', data.VParams.H263.VBR).change();

            break;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
            //BYTE btMotionSrchRng;
        case C_H264[0]: 
            $("div#IDD_OPT_avc1 #IDC_PROFILE_avc1").val(data.VParams.H264.Profile);
            $("div#IDD_OPT_avc1 #IDC_BITRATE_avc1").val(data.VParams.H264.Bitrate/1000);
            $("div#IDD_OPT_avc1 #IDC_QUALITY_avc1").val(data.VParams.H264.Quality);
            $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('checked', data.VParams.H264.VBR).change();
            break;
            //BYTE btProfile;
            //DWORD dwBitrate;
            //bool bVBR;
            //BYTE btQuality;
    }
    switch(data.AudioCodec) {
        case C_NONE[0]: 
            break;
        case C_AAC[0]: 
        
            $("div#IDD_OPT_mp4a #IDC_PROFILE_mp4a").val(data.AParams.AAC.Profile);
            $("div#IDD_OPT_mp4a #IDC_BITRATE_mp4a").val(data.AParams.AAC.Bitrate/1000);
            $("div#IDD_OPT_mp4a #IDC_QUALITY_mp4a").val(data.AParams.AAC.Quality);
            break;
        case C_AMR[0]: 
            $("div#IDD_OPT_samr #IDC_BITRATE_samr").val(data.AParams.AMR.Bitrate);
            break;
            //DWORD dwBitrate;
    }
    
    
};


DIALOGS[FMT_3GPP[0]].init = function()
{
    var c_dialog = $("#IDD_3GPOPTS");

    $("select#GP_IDC_VIDEOCODEC", c_dialog).change(function () {
        var val = $("select#GP_IDC_IMAGESIZE", c_dialog).val();
        if($(this).val() == C_H264[0])
            $("select#GP_IDC_IMAGESIZE", c_dialog).jselect({    data: GP_IMAGE_SIZES    });
        else $("select#GP_IDC_IMAGESIZE", c_dialog).jselect({   data: GP_IMAGE_SIZES2   });
        $("select#GP_IDC_IMAGESIZE", c_dialog).val(val);
    });

    $("select#GP_IDC_AUDIOCODEC", c_dialog).change(function () {
        var checked = ($(this).val() == C_NONE[0]);
        var checked2 = checked || ($(this).val() == C_AMR[0]);
        toggleDisabled($("div#preset_dialog"), 
                ["GP2_IDC_AUDIOOPTS"], 
                checked);   
        toggleDisabled($("div#preset_dialog"), 
                ["GP2_IDC_FREQUENCY", "GP2_IDC_CHANNELS"], 
                checked2);  
    });
        
    $("input[type=button]", c_dialog).hover(
            function(){ 
                $(this).addClass("ui-state-hover"); 
            },
            function(){ 
                $(this).removeClass("ui-state-hover"); 
            }
        ).mousedown(function(){
            $(this).addClass("ui-state-active"); 
        }).mouseup(function(){
                $(this).removeClass("ui-state-active");
        });

    $("input#GP_IDC_VIDEOOPTS", c_dialog).click(function () {
        var dlg_name = "#IDD_OPT_" + $("#GP_IDC_VIDEOCODEC", c_dialog).val() ;
        $(dlg_name).dialog('open');
    }
    );
    $("input#GP_IDC_AUDIOOPTS", c_dialog).click(function () {
        var dlg_name = "#IDD_OPT_" + $("#GP_IDC_AUDIOCODEC", c_dialog).val() ;
        $(dlg_name).dialog('open');
    }
    );
    
    $("select#GP_IDC_RESIZE_METHOD", c_dialog).jselect({
        data: [RM_STRETCH, RM_LETTER, RM_CROP]
    });
    $("select#GP_IDC_RESIZEQUALITY", c_dialog).jselect({
        data: [RQ_NORMAL, RQ_BEST]
    });

    $("select#GP_IDC_FREQUENCY", c_dialog).jselect({
        data: [aFreqs.FQ_48_KHZ,aFreqs.FQ_44_KHZ,aFreqs.FQ_32_KHZ,
            aFreqs.FQ_24_KHZ,aFreqs.FQ_22_KHZ,aFreqs.FQ_16_KHZ,
            aFreqs.FQ_12_KHZ,aFreqs.FQ_11_KHZ,aFreqs.FQ_8_KHZ]
    });
    
    $("select#GP_IDC_CHANNELS", c_dialog).jselect({
        data: [MONO, STEREO]
    });
    
    $("select#GP_IDC_VIDEOCODEC", c_dialog).jselect({data: GP_VIDEO_CODECS});
    $("select#GP_IDC_AUDIOCODEC", c_dialog).jselect({data: GP_AUDIO_CODECS});
    $("select#GP_IDC_IMAGESIZE", c_dialog).jselect({data: GP_IMAGE_SIZES});
    $("select#GP_IDC_FRAMERATE", c_dialog).jselect({data: GP_FRAMERATES});
};

DIALOGS[FMT_QT[0]].initPreset = function(presetId)
{

};
DIALOGS[FMT_QT[0]].exportPreset = function()
{
    return [];
};


DIALOGS[FMT_QT[0]].init = function()
{

};

DIALOGS[FMT_RM[0]].initPreset = function(presetId)
{

};

DIALOGS[FMT_RM[0]].exportPreset = function()
{
    return [];
};


DIALOGS[FMT_RM[0]].init = function()
{

};

DIALOGS[FMT_DOWNLOAD[0]].initPreset = function(presetId)
{

};

DIALOGS[FMT_DOWNLOAD[0]].exportPreset = function()
{
    return [];
};


DIALOGS[FMT_DOWNLOAD[0]].init = function()
{

};

var C_MP3 = [1, "MP3"];
var C_PCM = [0, "PCM"];

var WAV_AUDIO_CODECS = [C_PCM, C_MP3];

PRESETS_DATA[aPrs.WAV_Standart[0]] = { data : {
        SAsInput : false,
        Frequency : 44100,
        Channels : 2,
        BitsPerSample : 16,
        AudioCodecNum : 0
    }
};


DIALOGS[FMT_WAV[0]].initPreset = function(presetId)
{
    var data = PRESETS_DATA[presetId].data;
    $("#WAV_IDC_AUDIOCODEC").val(data.AudioCodecNum);
    $("#WAV_IDC_CHANNELS").val(data.Channels);
    $("#WAV_IDC_FREQUENCY").val(data.Frequency);
    $("#WAV_IDC_SASINPUT").attr('checked', data.SAsInput);

};


DIALOGS[FMT_WAV[0]].exportPreset = function(presetId)
{
    var data = [];//PRESETS_DATA[presetId].data;
    data.AudioCodecNum = $("#WAV_IDC_AUDIOCODEC").val();
    data.Channels = $("#WAV_IDC_CHANNELS").val();
    data.Frequency = $("#WAV_IDC_FREQUENCY").val();
    data.SAsInput = $("#WAV_IDC_SASINPUT").attr('checked'); 
    return data;
};

DIALOGS[FMT_WAV[0]].init = function()
{
    var c_dialog = $("#preset_dialog");
    $("#WAV_IDC_AUDIOCODEC").jselect({data: WAV_AUDIO_CODECS});
    $("#WAV_IDC_CHANNELS").jselect({data: [MONO, STEREO]});
    $("#WAV_IDC_SASINPUT").change(function () {
        var checked = ($(this).attr('checked'));
        toggleDisabled($("#IDD_WAVOPTS"), ["WAV_IDC_AUDIOOPTS","WAV_IDC_FREQUENCY", "WAV_IDC_CHANNELS"], checked);      
    });
    $("#WAV_IDC_FREQUENCY").jselect({
        data: [ aFreqs.FQ_8_KHZ,    aFreqs.FQ_11_KHZ,   aFreqs.FQ_12_KHZ,   aFreqs.FQ_16_KHZ,   aFreqs.FQ_22_KHZ,
                aFreqs.FQ_24_KHZ,   aFreqs.FQ_32_KHZ,   aFreqs.FQ_44_KHZ,   aFreqs.FQ_48_KHZ    ]
    }); 
    
};

var MP3_ABITRATE_LIST = [[32000, "32 Kbit/sec"],[40000, "40 Kbit/sec"],[48000, "48 Kbit/sec"],[56000, "56 Kbit/sec"],[64000, "64 Kbit/sec"],[80000, "80 Kbit/sec"],[96000, "96 Kbit/sec"],[112000, "112 Kbit/sec"],[128000, "128 Kbit/sec"],[160000, "160 Kbit/sec"],[192000, "192 Kbit/sec"],[224000, "224 Kbit/sec"],[256000, "256 Kbit/sec"],[320000, "320 Kbit/sec"]]; 
var MP3_SAMPLERATE_LIST = [
    [0, "Auto"],
    [8000, "8000"],
    [11025, "11025"],
    [12000, "12000"],
    [16000, "16000"],
    [22050, "22050"],
    [24000, "24000"],
    [32000, "32000"],
    [44100, "44100"],
    [48000, "48000"]];
    
var MP3_BITRATE_LIST = [
    [16, "16 Kbit/sec"],
    [24, "24 Kbit/sec"],
    [32, "32 Kbit/sec"],
    [40, "40 Kbit/sec"],
    [48, "48 Kbit/sec"],
    [56, "56 Kbit/sec"],
    [64, "64 Kbit/sec"],
    [80, "80 Kbit/sec"],
    [96, "96 Kbit/sec"],
    [112, "112 Kbit/sec"],
    [128, "128 Kbit/sec"],
    [160, "160 Kbit/sec"],
    [192, "192 Kbit/sec"],
    [224, "224 Kbit/sec"],
    [256, "256 Kbit/sec"],
    [320, "320 Kbit/sec"]];
var MP3_CHANNELS_LIST = [
    [0, "Auto"],
    [1, "Mono"],
    [2, "Stereo"]];
var MP3_STEREOMODE_LIST = [
    [1, "Joint Stereo"],
    [2, "Dual Channel"]];
var MP3_VBRQUALITY_LIST = [
    [9, "9"],
    [7, "7"],
    [5, "5"],
    [4, "4"],
    [3, "3"],
    [1, "1"],
    [0, "0"]];

PRESETS_DATA[aPrs.MP3_HHQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        StereoMode : 1,
        Bitrate : 128,
        VBR : -1
    }
};

PRESETS_DATA[aPrs.MP3_GQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        StereoMode : 1,
        Bitrate : 160,
        VBR : -1
    }
};

PRESETS_DATA[aPrs.MP3_HQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        StereoMode : 2,
        Bitrate : 192,
        VBR : -1
    }
};
PRESETS_DATA[aPrs.MP3_AppleTV[0]] = { data : {
        Frequency : 44100,
        Channels : 2,
        StereoMode : 2,
        Bitrate : 192,
        VBR : -1
    }
};

DIALOGS[FMT_MP3[0]].initPreset = function(presetId)
{
    var c_dialog = $("div#IDD_MP3OPTS");
    var data = PRESETS_DATA[presetId].data;
    $("#MP3_IDC_CHANNELS", c_dialog).val(data.Channels);
    $("#MP3_IDC_SAMPLERATE", c_dialog).val(data.Frequency);
    $("#MP3_IDC_BITRATE", c_dialog).val(data.Bitrate);
    $("#MP3_IDC_STEREOMODE", c_dialog).val(data.StereoMode);
    $("#MP3_IDC_VBRQUALITY", c_dialog).val(data.VBR);
    $("#MP3_IDC_USEVBR", c_dialog).attr('checked', false).change();
};


DIALOGS[FMT_MP3[0]].exportPreset = function()
{
    var c_dialog = $("div#IDD_MP3OPTS");
    var data = [];//PRESETS_DATA[presetId].data;
    data.Channels = $("#MP3_IDC_CHANNELS", c_dialog).val();
    data.Frequency = $("#MP3_IDC_SAMPLERATE", c_dialog).val();
    data.Bitrate = $("#MP3_IDC_BITRATE", c_dialog).val();
    data.StereoMode = $("#MP3_IDC_STEREOMODE", c_dialog).val();
    data.VBR = $("#MP3_IDC_VBRQUALITY", c_dialog).val();
    return data;
};

DIALOGS[FMT_MP3[0]].init = function()
{
    var c_dialog = $("#IDD_MP3OPTS");
    $("#MP3_IDC_USEVBR", c_dialog).change(function () {
        var checked = !$("#MP3_IDC_USEVBR", c_dialog).attr('checked');
        toggleDisabled($("div#IDD_MP3OPTS"), 
                        ["MP3_IDC_VBRQUALITY"], 
                        checked);
    });

    $("#MP3_IDC_SAMPLERATE", c_dialog).jselect({data: MP3_SAMPLERATE_LIST});
    $("#MP3_IDC_CHANNELS", c_dialog).jselect({data: MP3_CHANNELS_LIST});
    $("#MP3_IDC_BITRATE", c_dialog).jselect({data: MP3_BITRATE_LIST});
    $("#MP3_IDC_STEREOMODE", c_dialog).jselect({data: MP3_STEREOMODE_LIST});
    $("#MP3_IDC_VBRQUALITY", c_dialog).jselect({data: MP3_VBRQUALITY_LIST});
};


DIALOGS[-1].init = function()
{
    $("#IDD_OPT_mp4v").dialog(
    { 
        buttons: {
            "Ok": function() { 
                    $("#IDD_OPT_mp4v").dialog('close'); return true;
                },
            "Cancel": function() {      
                    $("#IDD_OPT_mp4v").dialog('close'); return true;
                }
        },
        //resizable: false,
        autoOpen: false,
        bgiframe: true,
        modal: true,
        width: 300,
        height:230
    }); 
   
	 
    $("div#IDD_OPT_mp4v select#IDC_PROFILE_mp4v").jselect({ data: PROFILES_mp4v });
    $("div#IDD_OPT_mp4v select#IDC_QUALITY_mp4v").jselect({ data: QUALITY_mp4v  });
    
    $("#IDD_OPT_mp4a").dialog(
    { 
        buttons: {
            "Ok": function() { 
                    $("#IDD_OPT_mp4a").dialog('close'); return true;
                },
            "Cancel": function() {      
                    $("#IDD_OPT_mp4a").dialog('close'); return true;
                }
        },
        resizable: false,
        autoOpen: false,
        bgiframe: true,
        modal: true,
        width: 300,
        height:235
    }); 
        
    $("div#IDD_OPT_mp4a select#IDC_PROFILE_mp4a").jselect({ data: PROFILES_mp4a });
    $("div#IDD_OPT_mp4a select#IDC_QUALITY_mp4a").jselect({ data: QUALITY_mp4a  });

    $("#IDD_OPT_samr").dialog(
    { 
        buttons: {
            "Ok": function() { 
                    $("#IDD_OPT_samr").dialog('close'); return true;
                },
            "Cancel": function() {      
                    $("#IDD_OPT_samr").dialog('close'); return true;
                }
        },
        resizable: false,
        autoOpen: false,
        bgiframe: true,
        modal: true,
        width: 310,
        height:100
    });
    $("div#IDD_OPT_samr select#IDC_BITRATE_samr").jselect({ data: BITRATES_samr });

    $("#IDD_OPT_s263").dialog(
    { 
        buttons: {
            "Ok": function() { 
                    $("#IDD_OPT_s263").dialog('close'); return true;
                },
            "Cancel": function() {      
                    $("#IDD_OPT_s263").dialog('close'); return true;
                }
        },
        resizable: false,
        autoOpen: false,
        bgiframe: true,
        modal: true,
        width: 300,
        height:220
    });
    $("div#IDD_OPT_s263 select#IDC_SEARCHRANGE_s263").jselect({ data: RANGE_s263});
    $("div#IDD_OPT_s263 select#IDC_QUALITY_s263").jselect({ data: QUALITY_s263  });

    $("#IDD_OPT_avc1").dialog(
    { 
        buttons: {
            "Ok": function() { 
                    $("#IDD_OPT_avc1").dialog('close'); return true;
                },
            "Cancel": function() {      
                    $("#IDD_OPT_avc1").dialog('close'); return true;
                }
        },
        resizable: false,
        autoOpen: false,
        modal: true,
        bgiframe: true,
        width: 310,
        height:230
    });
    $("div#IDD_OPT_avc1 select#IDC_PROFILE_avc1").jselect({ data: PROFILES_avc1 });
    $("div#IDD_OPT_avc1 select#IDC_QUALITY_avc1").jselect({ data: QUALITY_avc1});
    
    $("div#IDD_OPT_avc1 select#IDC_PROFILE_avc1").change(function () {
        var checked = ($(this).val() != "4");
        $("div#IDD_OPT_avc1 #IDC_USEVBR_avc1").attr('disabled', checked).toggleClass( 'ui-state-disabled', checked);
    });

    $("div#IDD_OPT_s263 input#IDC_USEVBR_s263").click(function () {
        var checked = $(this).attr('checked');
        if(checked)
        {
            $("div#IDD_OPT_s263 #for_var_bitrate").show();
            $("div#IDD_OPT_s263 #not_for_var_bitrate").hide();
        }
        else
        {
            $("div#IDD_OPT_s263 #for_var_bitrate").hide();
            $("div#IDD_OPT_s263 #not_for_var_bitrate").show();
        }
    });

    var m_opt_dialog = $("#IDD_OPT_WMV");

    m_opt_dialog.dialog(
    { 
        buttons: {
            "Ok": function() { 
                    m_opt_dialog.dialog('close');   return true;
                },
            "Cancel": function() {      
                    m_opt_dialog.dialog('close');   return true;
                }
        },
        resizable: false,
        autoOpen: false,
        bgiframe: true,
        modal: true,
        width: 225,
        height:275
    });
    $("#IDD_OPT_WMV input, #IDD_OPT_WMV select").change(function () {
        
    });
    $("#IDC_COMBOVBR_WMV", m_opt_dialog).jselect({data: COMBOVBR});
    $("select#IDC_VIDBUFFER_WMV", m_opt_dialog).jselect({data: BUFFERS});

    $("input#IDC_VBRMAXBUF_WMV", m_opt_dialog).change(function() {
        var checked = $(this).val();
        $("#IDC_VBRMAXBUFF_WMV", m_opt_dialog).attr('disabled', checked).toggleClass( 'ui-state-disabled', checked);
    });
    
    $("select#IDC_COMBOVBR_WMV", m_opt_dialog).change(function() {
        switch($(this).val())
        {
            case "0":
                $("#IDC_VBRMAXBITRATE_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRQUALITY_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRMAXBUFF_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRMAXBUF_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                break;
            case "1":
                $("#IDC_VBRMAXBITRATE_WMV", m_opt_dialog).attr('disabled',  true).toggleClass( 'ui-state-disabled',  true);
                $("#IDC_VBRQUALITY_WMV", m_opt_dialog).attr('disabled',false).toggleClass( 'ui-state-disabled', false);
                $("#IDC_VBRMAXBUFF_WMV", m_opt_dialog).attr('disabled',  true).toggleClass( 'ui-state-disabled',  true);
                $("#IDC_VBRMAXBUF_WMV", m_opt_dialog).attr('disabled',  true).toggleClass( 'ui-state-disabled',  true);
                break;
            case "2":
                $("#IDC_VBRMAXBITRATE_WMV", m_opt_dialog).attr('disabled', false).toggleClass( 'ui-state-disabled', false);
                $("#IDC_VBRQUALITY_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRMAXBUFF_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRMAXBUF_WMV", m_opt_dialog).attr('disabled', false).toggleClass( 'ui-state-disabled', false);
                break;
            case "3":
                $("#IDC_VBRMAXBITRATE_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRQUALITY_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRMAXBUFF_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);
                $("#IDC_VBRMAXBUF_WMV", m_opt_dialog).attr('disabled', true).toggleClass( 'ui-state-disabled', true);               break;
        }
    });

};

var FLAC_ABITRATE_LIST = [[32000, "32 Kbit/sec"],[40000, "40 Kbit/sec"],[48000, "48 Kbit/sec"],[56000, "56 Kbit/sec"],[64000, "64 Kbit/sec"],[80000, "80 Kbit/sec"],[96000, "96 Kbit/sec"],[112000, "112 Kbit/sec"],[128000, "128 Kbit/sec"],[160000, "160 Kbit/sec"],[192000, "192 Kbit/sec"],[224000, "224 Kbit/sec"],[256000, "256 Kbit/sec"],[320000, "320 Kbit/sec"]]; 
var FLAC_SAMPLERATE_LIST = [
    [0, "Auto"],
    [8000, "8000"],
    [11025, "11025"],
    [12000, "12000"],
    [16000, "16000"],
    [22050, "22050"],
    [24000, "24000"],
    [32000, "32000"],
    [44100, "44100"],
    [48000, "48000"],
    [96000, "96000"]
    ];
    
var FLAC_CHANNELS_LIST = [
    [0, "Auto"],
    [1, "Mono"],
    [2, "Stereo"]];
var FLAC_ENCMODE_LIST = [
    [0, "CBR"],
    [1, "ABR"],
    [2, "VBR"]
    ];  
var FLAC_COMP_LIST = [
    [0, "Minimum"],
    [1, "Fastest"],
    [3, "Fast"],
    [5, "Normal"],
    [6, "Good"],
    [7, "Best"],
    [8, "Maximum"]
    ];

PRESETS_DATA[aPrs.FLAC_BQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        SAsInput : true,
        Compression : 1
    }
};
DIALOGS[FMT_FLAC[0]].initPreset = function(presetId)
{
    var c_dialog = $("#preset_dialog");
    var data = PRESETS_DATA[presetId].data;
    $("#FLAC_IDC_CHANNELS", c_dialog).val(data.Channels);
    $("#FLAC_IDC_SAMPLERATE", c_dialog).val(data.Frequency);
    $("#FLAC_IDC_COMP", c_dialog).val(data.Compression);
    $("#FLAC_IDC_SASINPUT", c_dialog).attr('checked', data.SAsInput).change();
};

DIALOGS[FMT_FLAC[0]].exportPreset = function()
{
    var c_dialog = $("#preset_dialog");
    var data = [];//PRESETS_DATA[presetId].data;
    data.Channels = $("#FLAC_IDC_CHANNELS", c_dialog).val();
    data.Frequency = $("#FLAC_IDC_SAMPLERATE", c_dialog).val();
    data.Compression = $("#FLAC_IDC_COMP", c_dialog).val();
    data.SAsInput = $("#FLAC_IDC_SASINPUT", c_dialog).attr('checked');
    return data;
};

DIALOGS[FMT_FLAC[0]].init = function()
{
    var c_dialog = $("#preset_dialog");
    $("#FLAC_IDC_SASINPUT", c_dialog).change(function () {
        var checked = $("#FLAC_IDC_SASINPUT", c_dialog).attr('checked');
        toggleDisabled($("#preset_dialog"), 
            ["FLAC_IDC_SAMPLERATE", "FLAC_IDC_CHANNELS"], 
            checked);
    });

    $("#FLAC_IDC_SAMPLERATE", c_dialog).jselect({data: FLAC_SAMPLERATE_LIST});
    $("#FLAC_IDC_CHANNELS", c_dialog).jselect({data: FLAC_CHANNELS_LIST});
    $("#FLAC_IDC_COMP", c_dialog).jselect({data: FLAC_COMP_LIST});
};
var OGG_ABITRATE_LIST = [[32000, "32 Kbit/sec"],[40000, "40 Kbit/sec"],[48000, "48 Kbit/sec"],[56000, "56 Kbit/sec"],[64000, "64 Kbit/sec"],[80000, "80 Kbit/sec"],[96000, "96 Kbit/sec"],[112000, "112 Kbit/sec"],[128000, "128 Kbit/sec"],[160000, "160 Kbit/sec"],[192000, "192 Kbit/sec"],[224000, "224 Kbit/sec"],[256000, "256 Kbit/sec"],[320000, "320 Kbit/sec"]]; 
var OGG_SAMPLERATE_LIST = [
    [0, "Auto"],
    [8000, "8000"],
    [11025, "11025"],
    [12000, "12000"],
    [16000, "16000"],
    [22050, "22050"],
    [24000, "24000"],
    [32000, "32000"],
    [44100, "44100"],
    [48000, "48000"],
    [96000, "96000"]
    ];
    
var OGG_BITRATE_LIST = [
    [16000, "16 Kbit/sec"],
    [24000, "24 Kbit/sec"],
    [32000, "32 Kbit/sec"],
    [40000, "40 Kbit/sec"],
    [48000, "48 Kbit/sec"],
    [56000, "56 Kbit/sec"],
    [64000, "64 Kbit/sec"],
    [80000, "80 Kbit/sec"],
    [96000, "96 Kbit/sec"],
    [112000, "112 Kbit/sec"],
    [128000, "128 Kbit/sec"],
    [160000, "160 Kbit/sec"],
    [192000, "192 Kbit/sec"],
    [224000, "224 Kbit/sec"],
    [256000, "256 Kbit/sec"],
    [320000, "320 Kbit/sec"]];
var OGG_CHANNELS_LIST = [
    [0, "Auto"],
    [1, "Mono"],
    [2, "Stereo"]];
var OGG_ENCMODE_LIST = [
    [0, "CBR"],
    [1, "ABR"],
    [2, "VBR"]
    ];  
var OGG_QUALITY_LIST = [
    [10, "Lowest"],
    [20, "Low"],
    [40, "Medium Low"],
    [60, "Medium"],
    [80, "Medium High"],
    [90, "High"],
    [100, "Highest"]
    ];

PRESETS_DATA[aPrs.OGG_GQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        Bitrate : 128000,
        Mode : 1,
        Quality : 90
    }
};

PRESETS_DATA[aPrs.OGG_HQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        Bitrate : 160000,
        Mode : 1,
        Quality : 90
    }
};

PRESETS_DATA[aPrs.OGG_HHQ[0]] = { data : {
        Frequency : 0,
        Channels : 0,
        Bitrate : 192000,
        Mode : 1,
        Quality : 90
    }
};

DIALOGS[FMT_OGG[0]].initPreset = function(presetId)
{
    var c_dialog = $("#preset_dialog");
    var data = PRESETS_DATA[presetId].data;
    $("#OGG_IDC_CHANNELS", c_dialog).val(data.Channels);
    $("#OGG_IDC_MPEGVER", c_dialog).val(data.Frequency);
    $("#OGG_IDC_BITRATE", c_dialog).val(data.Bitrate);
    $("#OGG_IDC_ENCMODE", c_dialog).val(data.Mode);
    $("#OGG_IDC_QUALITY", c_dialog).val(data.Quality);
    $("#OGG_IDC_USEQ", c_dialog).attr('checked', false).change();
};

DIALOGS[FMT_OGG[0]].exportPreset = function()
{
    var c_dialog = $("#preset_dialog");
    var data = [];//PRESETS_DATA[presetId].data;
    data.Channels = $("#OGG_IDC_CHANNELS", c_dialog).val();
    data.Frequency = $("#OGG_IDC_MPEGVER", c_dialog).val();
    data.Bitrate = $("#OGG_IDC_BITRATE", c_dialog).val();
    data.Mode = $("#OGG_IDC_ENCMODE", c_dialog).val();
    data.Quality = $("#OGG_IDC_QUALITY", c_dialog).val();
    return data;
};

DIALOGS[FMT_OGG[0]].init = function()
{
    var c_dialog = $("#preset_dialog");
    $("#OGG_IDC_USEQ", c_dialog).change(function () {
        var checked = !$("#OGG_IDC_USEQ", c_dialog).attr('checked');
        if(checked)
        {
            $("#OGG_IDC_ENCMODE").val(2);
        }       
        toggleDisabled($("#preset_dialog"), 
            ["OGG_IDC_ENCMODE", "OGG_IDC_BITRATE"], 
            !checked);
        toggleDisabled($("#preset_dialog"), 
            ["OGG_IDC_QUALITY"], 
            checked);

    });

    $("#OGG_IDC_SAMPLERATE", c_dialog).jselect({data: OGG_SAMPLERATE_LIST});
    $("#OGG_IDC_CHANNELS", c_dialog).jselect({data: OGG_CHANNELS_LIST});
    $("#OGG_IDC_BITRATE", c_dialog).jselect({data: OGG_BITRATE_LIST});
    $("#OGG_IDC_ENCMODE", c_dialog).jselect({data: OGG_ENCMODE_LIST});
    $("#OGG_IDC_QUALITY", c_dialog).jselect({data: OGG_QUALITY_LIST});
};
/*
Script: JSON.js

JSON encoder / decoder: 
    This object uses good practices to encode/decode quikly and a bit safer(*) every kind of JSON compatible variable.
    
    (*) Please read more about JSON and Ajax JavaScript Hijacking problems, <http://www.fortifysoftware.com/advisory.jsp>
    
    To download last version of this script use this link: <http://www.devpro.it/code/149.html>

Version:
    1.3b - modified toDate method, now compatible with milliseconds time too (time or milliseconds/1000)

Compatibility:
    FireFox - Version 1, 1.5, 2 and 3 (FireFox uses secure code evaluation)
    Internet Explorer - Version 5, 5.5, 6 and 7
    Opera - 8 and 9 (probably 7 too)
    Safari - Version 2 (probably 1 too)
    Konqueror - Version 3 or greater

Dependencies:
    <JSONError.js>

Credits:
    - JSON site for safe RegExp and generic JSON informations, <http://www.json.org/>
    - kenta for safe evaluation idea, <http://mykenta.blogspot.com/>

Author:
    Andrea Giammarchi, <http://www.3site.eu>

License:
    >Copyright (C) 2007 Andrea Giammarchi - www.3site.eu
    >   
    >Permission is hereby granted, free of charge,
    >to any person obtaining a copy of this software and associated
    >documentation files (the "Software"),
    >to deal in the Software without restriction,
    >including without limitation the rights to use, copy, modify, merge,
    >publish, distribute, sublicense, and/or sell copies of the Software,
    >and to permit persons to whom the Software is furnished to do so,
    >subject to the following conditions:
    >
    >The above copyright notice and this permission notice shall be included
    >in all copies or substantial portions of the Software.
    >
    >THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
    >INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    >FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
    >IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
    >DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
    >ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
    >OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

/*
Object: JSON
    Stand alone or prototyped encode, decode or toDate public methods.

Example:
    >alert(JSON.encode([0,1,false,true,null,[2,3],{"some":"value"}]));
    >// [0,1,false,true,null,[2,3],{"some":"value"}]
    >
    >alert(JSON.decode('[0,1,false,true,null,[2,3],{"some":"value"}]'))
    >// 0,1,false,true,,2,3,[object Object]
*/
JSON = new function(){

    /* Section: Methods - Public */
    
    /*
    Method: decode
        decodes a valid JSON encoded string.
    
    Arguments:
        [String / Function] - Optional JSON string to decode or a filter function if method is a String prototype.
        [Function] - Optional filter function if first argument is a JSON string and this method is not a String prototype.
    
    Returns:
        Object - Generic JavaScript variable or undefined
    
    Example [Basic]:
        >var    arr = JSON.decode('[1,2,3]');
        >alert(arr);    // 1,2,3
        >
        >arr = JSON.decode('[1,2,3]', function(key, value){return key * value});
        >alert(arr);    // 0,2,6
    
    Example [Prototype]:
        >String.prototype.parseJSON = JSON.decode;
        >
        >alert('[1,2,3]'.parseJSON());  // 1,2,3
        >
        >try {
        >   alert('[1,2,3]'.parseJSON(function(key, value){return key * value}));
        >   // 0,2,6
        >}
        >catch(e) {
        >   alert(e.message);
        >}
    
    Note:
        Internet Explorer 5 and other old browsers should use a different regular expression to check if a JSON string is valid or not.
        This old browsers dedicated RegExp is not safe as native version is but it required for compatibility.
    */
    this.decode = function(){
        var filter, result, self, tmp;
        if($$("toString")) {
            switch(arguments.length){
                case    2:
                    self = arguments[0];
                    filter = arguments[1];
                    break;
                case    1:
                    if($[typeof arguments[0]](arguments[0]) === Function) {
                        self = this;
                        filter = arguments[0];
                    }
                    else
                        self = arguments[0];
                    break;
                default:
                    self = this;
                    break;
            };
            if(rc.test(self)){
                try{
                    result = e("(".concat(self, ")"));
                    if(filter && result !== null && (tmp = $[typeof result](result)) && (tmp === Array || tmp === Object)){
                        for(self in result)
                            result[self] = v(self, result) ? filter(self, result[self]) : result[self];
                    }
                }
                catch(z){}
            }
            else {
                throw new JSONError("bad data");
            }
        };
        return result;
    };
    
    /*
    Method: encode
        encode a generic JavaScript variable into a valid JSON string.
    
    Arguments:
        [Object] - Optional generic JavaScript variable to encode if method is not an Object prototype.
    
    Returns:
        String - Valid JSON string or undefined
    
    Example [Basic]:
        >var    s = JSON.encode([1,2,3]);
        >alert(s);  // [1,2,3]
    
    Example [Prototype]:
        >Object.prototype.toJSONString = JSON.encode;
        >
        >alert([1,2,3].toJSONString()); // [1,2,3]
    */
    this.encode = function(){
        var self = arguments.length ? arguments[0] : this,
            result, tmp;
        if(self === null)
            result = "null";
        else if(self !== undefined && (tmp = $[typeof self](self))) {
            switch(tmp){
                case    Array:
                    result = [];
                    for(var i in self) {
                        if(i !== undefined && (tmp = JSON.encode(self[i])))
                            result[i] = tmp;
                    };
                    res = []; n = 0;
                    for(var i in result) {
                        res[n++]= '"' + i + '":' + result[i];
                    }
                    result = "{" + res.join(",") + "}";
                    break;
                case    Boolean:
                    result = String(self);
                    break;
                case    Date:
                    result = '"'.concat(self.getFullYear(), '-', d(self.getMonth() + 1), '-', d(self.getDate()), 'T', d(self.getHours()), ':', d(self.getMinutes()), ':', d(self.getSeconds()), '"');
                    break;
                case    Function:
                    break;
                case    Number:
                    result = isFinite(self) ? String(self) : "null";
                    break;
                case    String:
                    result = '"'.concat(self.replace(rs, s).replace(ru, u), '"');
                    break;
                default:
                    var i = 0, key;
                    result = [];
                    for(key in self) {
                        if(self[key] !== undefined && (tmp = JSON.encode(self[key])))
                            result[i++] = '"'.concat(key.replace(rs, s).replace(ru, u), '":', tmp);
                    };
                    result = "{".concat(result.join(","), "}");
                    break;
            }
        };
        return result;
    };
    
    /*
    Method: toDate
        transforms a JSON encoded Date string into a native Date object.
    
    Arguments:
        [String/Number] - Optional JSON Date string or server time if this method is not a String prototype. Server time should be an integer, based on seconds since 1970/01/01 or milliseconds / 1000 since 1970/01/01.
    
    Returns:
        Date - Date object or undefined if string is not a valid Date
    
    Example [Basic]:
        >var    serverDate = JSON.toDate("2007-04-05T08:36:46");
        >alert(serverDate.getMonth());  // 3 (months start from 0)
    
    Example [Prototype]:
        >String.prototype.parseDate = JSON.toDate;
        >
        >alert("2007-04-05T08:36:46".parseDate().getDate());    // 5
    
    Example [Server Time]:
        >var    phpServerDate = JSON.toDate(<?php echo time(); ?>);
        >var    csServerDate = JSON.toDate(<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000);
    
    Example [Server Time Prototype]:
        >Number.prototype.parseDate = JSON.toDate;
        >var    phpServerDate = (<?php echo time(); ?>).parseDate();
        >var    csServerDate = (<%=(DateTime.Now.Ticks/10000-62135596800000)%>/1000).parseDate();
    
    Note:
        This method accepts an integer or numeric string too to mantain compatibility with generic server side time() function.
        You can convert quickly mtime, ctime, time and other time based values.
        With languages that supports milliseconds you can send total milliseconds / 1000 (time is set as time * 1000)
    */
    this.toDate = function(){
        var self = arguments.length ? arguments[0] : this,
            result;
        if(rd.test(self)){
            result = new Date;
            result.setHours(i(self, 11, 2));
            result.setMinutes(i(self, 14, 2));
            result.setSeconds(i(self, 17, 2));
            result.setMonth(i(self, 5, 2) - 1);
            result.setDate(i(self, 8, 2));
            result.setFullYear(i(self, 0, 4));
        }
        else if(rt.test(self))
            result = new Date(self * 1000);
        return result;
    };
    
    /* Section: Properties - Private */
    
    /*
    Property: Private
    
    List:
        Object - 'c' - a dictionary with useful keys / values for fast encode convertion
        Function - 'd' - returns decimal string rappresentation of a number ("14", "03", etc)
        Function - 'e' - safe and native code evaulation
        Function - 'i' - returns integer from string ("01" => 1, "15" => 15, etc)
        Array - 'p' - a list with different "0" strings for fast special chars escape convertion
        RegExp - 'rc' - regular expression to check JSON strings (different for IE5 or old browsers and new one)
        RegExp - 'rd' - regular expression to check a JSON Date string
        RegExp - 'rs' - regular expression to check string chars to modify using c (char) values
        RegExp - 'rt' - regular expression to check integer numeric string (for toDate time version evaluation)
        RegExp - 'ru' - regular expression to check string chars to escape using "\u" prefix
        Function - 's' - returns escaped string adding "\\" char as prefix ("\\" => "\\\\", etc.)
        Function - 'u' - returns escaped string, modifyng special chars using "\uNNNN" notation
        Function - 'v' - returns boolean value to skip object methods or prototyped parameters (length, others), used for optional decode filter function
        Function - '$' - returns object constructor if it was not cracked (someVar = {}; someVar.constructor = String <= ignore them)
        Function - '$$' - returns boolean value to check native Array and Object constructors before convertion
    */
    var c = {"\b":"b","\t":"t","\n":"n","\f":"f","\r":"r",'"':'"',"\\":"\\","/":"/"},
        d = function(n){return n<10?"0".concat(n):n},
        e = function(c,f,e){e=eval;delete eval;if(typeof eval==="undefined")eval=e;f=eval(""+c);eval=e;return f},
        i = function(e,p,l){return 1*e.substr(p,l)},
        p = ["","000","00","0",""],
        rc = null,
        rd = /^[0-9]{4}\-[0-9]{2}\-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}$/,
        rs = /(\x5c|\x2F|\x22|[\x0c-\x0d]|[\x08-\x0a])/g,
        rt = /^([0-9]+|[0-9]+[,\.][0-9]{1,3})$/,
        ru = /([\x00-\x07]|\x0b|[\x0e-\x1f])/g,
        s = function(i,d){return "\\".concat(c[d])},
        u = function(i,d){
            var n=d.charCodeAt(0).toString(16);
            return "\\u".concat(p[n.length],n)
        },
        v = function(k,v){return $[typeof result](result)!==Function&&(v.hasOwnProperty?v.hasOwnProperty(k):v.constructor.prototype[k]!==v[k])},
        $ = {
            "boolean":function(){return Boolean},
            "function":function(){return Function},
            "number":function(){return Number},
            "object":function(o){return o instanceof o.constructor?o.constructor:null},
            "string":function(){return String},
            "undefined":function(){return null}
        },
        $$ = function(m){
            function $(c,t){t=c[m];delete c[m];try{e(c)}catch(z){c[m]=t;return 1}};
            return $(Array)&&$(Object)
        };
    try{rc=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
    catch(z){rc=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
};

//============================================================

function has(arr, key) {
	var i;
	for(i in arr){
		if (i === key) {
			return true;
		}
	}
	return false;
};

function getFormatEXT(formatID)
{
	var formatExt = "undef";
	$.each(FORMATS, function (num, item) 
	{
		if(item[0] == formatID)
		{
			formatExt = item[2];
			return false;
		}
	});
	return formatExt;
}

function get_current_params (i)
{
	var params = new Array();
	var FMT_SELECT = $("#IDC_FORMAT");
	params.presetID = $("#combo_box").val();
	params.presetData = "";
	if(params.presetID == -2)
	{
		params.formatID = FMT_SELECT.val();
		if(("item_" + i) in PRESETS_DATA) {}
		else	PRESETS_DATA["item_" + i] = new Array();
		PRESETS_DATA["item_" + i].data = DIALOGS[FMT_SELECT.val()].exportPreset();
		params.presetData = JSON.encode(PRESETS_DATA["item_" + i].data);
	}
	else
	{
		params.formatID = getFormatID($("#combo_box").val());
	}
	params.formatName = getFormatEXT(params.formatID);
	params.targetFolderId = $("#output_folder").val();
	params.targetFolderName = $("#output_folder").val();
	
	return params;
}

function format_time(time)
{
	if(time > 60 * 60) time = parseInt(time/(60*60)) + " " + JS_TIME_FORMAT_HOUR;
	else if(time > 60) time = parseInt(time/(60)) + " " + JS_TIME_FORMAT_MIN;
	else if(time > 10) time = JS_TIME_FORMAT_LMIN;
	else time = JS_TIME_FORMAT_SECS;
	return time;
}
function format_size(sz)
{
	var m1 = "";
	if(sz>1024*1024)
	{
		m1="mb";
		sz/=1024*1024;
		sz=parseInt(""+sz);
	}
	else if(sz>1024)
	{
		m1="kb";
		sz/=1024;
		sz=parseInt(""+sz);
	}
	return sz + m1;
}
var block_params = { 

	message: null, 
	css: { 
    color:          '#fff',
    backgroundColor:          '#fff',
		border: '0'
	},
	overlayCSS:{opacity:0.6}
}
var block_params2 = { 

	message: null, 
	css: { 
    color:          '#fff',
    backgroundColor:          '#fff',
		border: '0',   
		cursor: 'default'

	},
	overlayCSS:{opacity:0.6, cursor: 'default'}
}
server_rpc_array = new Array();
var set_email = "";
process_tasks = new Array();
user_tasks = new Array();
var counter = 0;
refresh_event = false;
reloadsCount = 0;
	
// Flash Player Version Detection - Rev 1.6
// Detect Client Browser type
// Copyright(c) 2005-2006 Adobe Macromedia Software, LLC. All rights reserved.
var isIE  = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;

function ControlVersion()
{
	var version;
	var axo;
	var e;

	// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

	try {
		// version will be set for 7.X or greater players
		axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
		version = axo.GetVariable("$version");
	} catch (e) {
	}

	if (!version)
	{
		try {
			// version will be set for 6.X players only
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
			
			// installed player is some revision of 6.0
			// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
			// so we have to be careful. 
			
			// default to the first public version
			version = "WIN 6,0,21,0";

			// throws if AllowScripAccess does not exist (introduced in 6.0r47)		
			axo.AllowScriptAccess = "always";

			// safe to call for 6.0r47 or greater
			version = axo.GetVariable("$version");

		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 4.X or 5.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = axo.GetVariable("$version");
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 3.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
			version = "WIN 3,0,18,0";
		} catch (e) {
		}
	}

	if (!version)
	{
		try {
			// version will be set for 2.X player
			axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
			version = "WIN 2,0,0,11";
		} catch (e) {
			version = -1;
		}
	}
	
	return version;
}

// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
	// NS/Opera version >= 3 check for Flash plugin in plugin array
	var flashVer = -1;
	
	if (navigator.plugins != null && navigator.plugins.length > 0) {
		if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
			var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
			var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
			var descArray = flashDescription.split(" ");
			var tempArrayMajor = descArray[2].split(".");			
			var versionMajor = tempArrayMajor[0];
			var versionMinor = tempArrayMajor[1];
			var versionRevision = descArray[3];
			if (versionRevision == "") {
				versionRevision = descArray[4];
			}
			if (versionRevision[0] == "d") {
				versionRevision = versionRevision.substring(1);
			} else if (versionRevision[0] == "r") {
				versionRevision = versionRevision.substring(1);
				if (versionRevision.indexOf("d") > 0) {
					versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
				}
			}
			var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
			//alert("flashVer="+flashVer);
		}
	}
	// MSN/WebTV 2.6 supports Flash 4
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
	// WebTV 2.5 supports Flash 3
	else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
	// older WebTV supports Flash 2
	else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
	else if ( isIE && isWin && !isOpera ) {
		flashVer = ControlVersion();
	}	
	return flashVer;
}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
	versionStr = GetSwfVer();
	if (versionStr == -1 ) {
		return false;
	} else if (versionStr != 0) {
		if(isIE && isWin && !isOpera) {
			// Given "WIN 2,0,0,11"
			tempArray         = versionStr.split(" "); 	// ["WIN", "2,0,0,11"]
			tempString        = tempArray[1];			// "2,0,0,11"
			versionArray      = tempString.split(",");	// ['2', '0', '0', '11']
		} else {
			versionArray      = versionStr.split(".");
		}
		var versionMajor      = versionArray[0];
		var versionMinor      = versionArray[1];
		var versionRevision   = versionArray[2];

        	// is the major.revision >= requested major.revision AND the minor version >= requested minor
		if (versionMajor > parseFloat(reqMajorVer)) {
			return true;
		} else if (versionMajor == parseFloat(reqMajorVer)) {
			if (versionMinor > parseFloat(reqMinorVer))
				return true;
			else if (versionMinor == parseFloat(reqMinorVer)) {
				if (versionRevision >= parseFloat(reqRevision))
					return true;
			}
		}
		return false;
	}
}

function AC_AddExtension(src, ext)
{
  if (src.indexOf('?') != -1)
    return src.replace(/\?/, ext+'?'); 
  else
    return src + ext;
}

function AC_Generateobj(objAttrs, params, embedAttrs) 
{ 
    var str = '';
    if (isIE && isWin && !isOpera)
    {
  		str += '<object ';
  		for (var i in objAttrs)
  			str += i + '="' + objAttrs[i] + '" ';
  		for (var i in params)
  			str += '><param name="' + i + '" value="' + params[i] + '" /> ';
  		str += '></object>';
    } else {
  		str += '<embed ';
  		for (var i in embedAttrs)
  			str += i + '="' + embedAttrs[i] + '" ';
  		str += '> </embed>';
    }

    document.write(str);
}

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
  var ret = new Object();
  ret.embedAttrs = new Object();
  ret.params = new Object();
  ret.objAttrs = new Object();
  for (var i=0; i < args.length; i=i+2){
    var currArg = args[i].toLowerCase();    

    switch (currArg){	
      case "classid":
        break;
      case "pluginspage":
        ret.embedAttrs[args[i]] = args[i+1];
        break;
      case "src":
      case "movie":	
        args[i+1] = AC_AddExtension(args[i+1], ext);
        ret.embedAttrs["src"] = args[i+1];
        ret.params[srcParamName] = args[i+1];
        break;
      case "onafterupdate":
      case "onbeforeupdate":
      case "onblur":
      case "oncellchange":
      case "onclick":
      case "ondblClick":
      case "ondrag":
      case "ondragend":
      case "ondragenter":
      case "ondragleave":
      case "ondragover":
      case "ondrop":
      case "onfinish":
      case "onfocus":
      case "onhelp":
      case "onmousedown":
      case "onmouseup":
      case "onmouseover":
      case "onmousemove":
      case "onmouseout":
      case "onkeypress":
      case "onkeydown":
      case "onkeyup":
      case "onload":
      case "onlosecapture":
      case "onpropertychange":
      case "onreadystatechange":
      case "onrowsdelete":
      case "onrowenter":
      case "onrowexit":
      case "onrowsinserted":
      case "onstart":
      case "onscroll":
      case "onbeforeeditfocus":
      case "onactivate":
      case "onbeforedeactivate":
      case "ondeactivate":
      case "type":
      case "codebase":
        ret.objAttrs[args[i]] = args[i+1];
        break;
      case "id":
      case "width":
      case "height":
      case "align":
      case "vspace": 
      case "hspace":
      case "class":
      case "title":
      case "accesskey":
      case "name":
      case "tabindex":
        ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
        break;
      default:
        ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
    }
  }
  ret.objAttrs["classid"] = classid;
  if (mimeType) ret.embedAttrs["type"] = mimeType;
  return ret;
}

/*!
 * jQuery blockUI plugin
 * Version 2.25 (29-AUG-2009)
 * @requires jQuery v1.2.3 or later
 *
 * Examples at: http://malsup.com/jquery/block/
 * Copyright (c) 2007-2008 M. Alsup
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Thanks to Amir-Hossein Sobhi for some excellent contributions!
 */

;(function($) {

if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
    alert('blockUI requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);
    return;
}

$.fn._fadeIn = $.fn.fadeIn;

// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
// retarded userAgent strings on Vista)
var mode = document.documentMode || 0;
var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;

// global $ methods for blocking/unblocking the entire page
$.blockUI   = function(opts) { install(window, opts); };
$.unblockUI = function(opts) { remove(window, opts); };

// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)
$.growlUI = function(title, message, timeout, onClose) {
    var $m = $('<div class="growlUI"></div>');
    if (title) $m.append('<h1>'+title+'</h1>');
    if (message) $m.append('<h2>'+message+'</h2>');
    if (timeout == undefined) timeout = 3000;
    $.blockUI({
        message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
        timeout: timeout, showOverlay: false,
        onUnblock: onClose, 
        css: $.blockUI.defaults.growlCSS
    });
};

// plugin method for blocking element content
$.fn.block = function(opts) {
    return this.unblock({ fadeOut: 0 }).each(function() {
        if ($.css(this,'position') == 'static')
            this.style.position = 'relative';
        if ($.browser.msie)
            this.style.zoom = 1; // force 'hasLayout'
        install(this, opts);
    });
};

// plugin method for unblocking element content
$.fn.unblock = function(opts) {
    return this.each(function() {
        remove(this, opts);
    });
};

$.blockUI.version = 2.25; // 2nd generation blocking at no extra cost!

// override these in your code to change the default behavior and style
$.blockUI.defaults = {
    // message displayed when blocking (use null for no message)
    message:  '<h1>Please wait...</h1>',

    title: null,      // title string; only used when theme == true
    draggable: true,  // only used when theme == true (requires jquery-ui.js to be loaded)
    
    theme: false, // set to true to use with jQuery UI themes
    
    // styles for the message when blocking; if you wish to disable
    // these and use an external stylesheet then do this in your code:
    // $.blockUI.defaults.css = {};
    css: {
        padding:        0,
        margin:         0,
        width:          '30%',
        top:            '40%',
        left:           '35%',
        textAlign:      'center',
        color:          '#000',
        border:         '3px solid #aaa',
        backgroundColor:'#fff',
        cursor:         'wait'
    },
    
    // minimal style set used when themes are used
    themedCSS: {
        width:          '30%',
        top:            '40%',
        left:           '35%'
    },

    // styles for the overlay
    overlayCSS:  {
        backgroundColor: '#fff',
        opacity:          0.6,
        cursor:          'wait'
    },

    // styles applied when using $.growlUI
    growlCSS: {
        width:  '350px',
        top:        '10px',
        left:       '',
        right:  '10px',
        border: 'none',
        padding:    '5px',
        opacity:    0.6,
        cursor:  null,
        color:      '#fff',
        backgroundColor: '#fff',
        '-webkit-border-radius': '10px',
        '-moz-border-radius':     '10px'
    },
    
    // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
    // (hat tip to Jorge H. N. de Vasconcelos)
    iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',

    // force usage of iframe in non-IE browsers (handy for blocking applets)
    forceIframe: false,

    // z-index for the blocking overlay
    baseZ: 1000,

    // set these to true to have the message automatically centered
    centerX: true, // <-- only effects element blocking (page block controlled via css above)
    centerY: true,

    // allow body element to be stetched in ie6; this makes blocking look better
    // on "short" pages.  disable if you wish to prevent changes to the body height
    allowBodyStretch: true,

    // enable if you want key and mouse events to be disabled for content that is blocked
    bindEvents: true,

    // be default blockUI will supress tab navigation from leaving blocking content
    // (if bindEvents is true)
    constrainTabKey: true,

    // fadeIn time in millis; set to 0 to disable fadeIn on block
    fadeIn:  200,

    // fadeOut time in millis; set to 0 to disable fadeOut on unblock
    fadeOut:  400,

    // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
    timeout: 0,

    // disable if you don't want to show the overlay
    showOverlay: true,

    // if true, focus will be placed in the first available input field when
    // page blocking
    focusInput: true,

    // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
    applyPlatformOpacityRules: true,

    // callback method invoked when unblocking has completed; the callback is
    // passed the element that has been unblocked (which is the window object for page
    // blocks) and the options that were passed to the unblock call:
    //     onUnblock(element, options)
    onUnblock: null,

    // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
    quirksmodeOffsetHack: 4
};

// private data and functions follow...

var pageBlock = null;
var pageBlockEls = [];

function install(el, opts) {
    var full = (el == window);
    var msg = opts && opts.message !== undefined ? opts.message : undefined;
    opts = $.extend({}, $.blockUI.defaults, opts || {});
    opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
    var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
    var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
    msg = msg === undefined ? opts.message : msg;

    // remove the current block (if there is one)
    if (full && pageBlock)
        remove(window, {fadeOut:0});

    // if an existing element is being used as the blocking content then we capture
    // its current place in the DOM (and current display style) so we can restore
    // it when we unblock
    if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
        var node = msg.jquery ? msg[0] : msg;
        var data = {};
        $(el).data('blockUI.history', data);
        data.el = node;
        data.parent = node.parentNode;
        data.display = node.style.display;
        data.position = node.style.position;
        if (data.parent)
            data.parent.removeChild(node);
    }

    var z = opts.baseZ;

    // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
    // layer1 is the iframe layer which is used to supress bleed through of underlying content
    // layer2 is the overlay layer which has opacity and a wait cursor (by default)
    // layer3 is the message content that is displayed while blocking

    var lyr1 = ($.browser.msie || opts.forceIframe) 
        ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
        : $('<div class="blockUI" style="display:none"></div>');
    var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
    
    var lyr3;
    if (opts.theme && full) {
        var s = '<div class="blockUI blockMsg blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
                    '<div class="ui-widget-header ui-dialog-titlebar blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
                    '<div class="ui-widget-content ui-dialog-content"></div>' +
                '</div>';
        lyr3 = $(s);
    }
    else {
        lyr3 = full ? $('<div class="blockUI blockMsg blockPage" style="z-index:'+z+';display:none;position:fixed"></div>')
                    : $('<div class="blockUI blockMsg blockElement" style="z-index:'+z+';display:none;position:absolute"></div>');
    }                           

    // if we have a message, style it
    if (msg) {
        if (opts.theme) {
            lyr3.css(themedCSS);
            //lyr3.addClass('ui-widget-content');
        }
        else 
            lyr3.css(css);
    }

    // style the overlay
    if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
        lyr2.css(opts.overlayCSS);
    lyr2.css('position', full ? 'fixed' : 'absolute');

    // make iframe layer transparent in IE
    if ($.browser.msie || opts.forceIframe)
        lyr1.css('opacity',0.0);

    $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
    
    if (opts.theme && opts.draggable && $.fn.draggable) {
        lyr3.draggable({
            handle: '.ui-dialog-titlebar',
            cancel: 'li'
        });
    }

    // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
    var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
    if (ie6 || expr) {
        // give body 100% height
        if (full && opts.allowBodyStretch && $.boxModel)
            $('html,body').css('height','100%');

        // fix ie6 issue when blocked element has a border width
        if ((ie6 || !$.boxModel) && !full) {
            var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
            var fixT = t ? '(0 - '+t+')' : 0;
            var fixL = l ? '(0 - '+l+')' : 0;
        }

        // simulate fixed position
        $.each([lyr1,lyr2,lyr3], function(i,o) {
            var s = o[0].style;
            s.position = 'absolute';
            if (i < 2) {
                full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
                     : s.setExpression('height','this.parentNode.offsetHeight + "px"');
                full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
                     : s.setExpression('width','this.parentNode.offsetWidth + "px"');
                if (fixL) s.setExpression('left', fixL);
                if (fixT) s.setExpression('top', fixT);
            }
            else if (opts.centerY) {
                if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
                s.marginTop = 0;
            }
            else if (!opts.centerY && full) {
                var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
                var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
                s.setExpression('top',expression);
            }
        });
    }

    // show the message
    if (msg) {
        if (opts.theme)
            lyr3.find('.ui-widget-content').append(msg);
        else
            lyr3.append(msg);
        if (msg.jquery || msg.nodeType)
            $(msg).show();
    }

    if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
        lyr1.show(); // opacity is zero
    if (opts.fadeIn) {
        if (opts.showOverlay)
            lyr2._fadeIn(opts.fadeIn);
        if (msg)
            lyr3.fadeIn(opts.fadeIn);
    }
    else {
        if (opts.showOverlay)
            lyr2.show();
        if (msg)
            lyr3.show();
    }

    // bind key and mouse events
    bind(1, el, opts);

    if (full) {
        pageBlock = lyr3[0];
        pageBlockEls = $(':input:enabled:visible',pageBlock);
        if (opts.focusInput)
            setTimeout(focus, 20);
    }
    else
        center(lyr3[0], opts.centerX, opts.centerY);

    if (opts.timeout) {
        // auto-unblock
        var to = setTimeout(function() {
            full ? $.unblockUI(opts) : $(el).unblock(opts);
        }, opts.timeout);
        $(el).data('blockUI.timeout', to);
    }
};

// remove the block
function remove(el, opts) {
    var full = (el == window);
    var $el = $(el);
    var data = $el.data('blockUI.history');
    var to = $el.data('blockUI.timeout');
    if (to) {
        clearTimeout(to);
        $el.removeData('blockUI.timeout');
    }
    opts = $.extend({}, $.blockUI.defaults, opts || {});
    bind(0, el, opts); // unbind events
    
    var els;
    if (full) // crazy selector to handle odd field errors in ie6/7
        els = $('body').children().filter('.blockUI').add('body > .blockUI');
    else
        els = $('.blockUI', el);

    if (full)
        pageBlock = pageBlockEls = null;

    if (opts.fadeOut) {
        els.fadeOut(opts.fadeOut);
        setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
    }
    else
        reset(els, data, opts, el);
};

// move blocking element back into the DOM where it started
function reset(els,data,opts,el) {
    els.each(function(i,o) {
        // remove via DOM calls so we don't lose event handlers
        if (this.parentNode)
            this.parentNode.removeChild(this);
    });

    if (data && data.el) {
        data.el.style.display = data.display;
        data.el.style.position = data.position;
        if (data.parent)
            data.parent.appendChild(data.el);
        $(data.el).removeData('blockUI.history');
    }

    if (typeof opts.onUnblock == 'function')
        opts.onUnblock(el,opts);
};

// bind/unbind the handler
function bind(b, el, opts) {
    var full = el == window, $el = $(el);

    // don't bother unbinding if there is nothing to unbind
    if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
        return;
    if (!full)
        $el.data('blockUI.isBlocked', b);

    // don't bind events when overlay is not in use or if bindEvents is false
    if (!opts.bindEvents || (b && !opts.showOverlay)) 
        return;

    // bind anchors and inputs for mouse and key events
    var events = 'mousedown mouseup keydown keypress';
    b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);

// former impl...
//       var $e = $('a,:input');
//       b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
};

// event handler to suppress keyboard/mouse events when blocking
function handler(e) {
    // allow tab navigation (conditionally)
    if (e.keyCode && e.keyCode == 9) {
        if (pageBlock && e.data.constrainTabKey) {
            var els = pageBlockEls;
            var fwd = !e.shiftKey && e.target == els[els.length-1];
            var back = e.shiftKey && e.target == els[0];
            if (fwd || back) {
                setTimeout(function(){focus(back)},10);
                return false;
            }
        }
    }
    // allow events within the message content
    if ($(e.target).parents('div.blockMsg').length > 0)
        return true;

    // allow events for content that is not being blocked
    return $(e.target).parents().children().filter('div.blockUI').length == 0;
};

function focus(back) {
    if (!pageBlockEls)
        return;
    var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
    if (e)
        e.focus();
};

function center(el, x, y) {
    var p = el.parentNode, s = el.style;
    var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
    var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
    if (x) s.left = l > 0 ? (l+'px') : '0';
    if (y) s.top  = t > 0 ? (t+'px') : '0';
};

function sz(el, p) {
    return parseInt($.css(el,p))||0;
};

})(jQuery);


/*
 * JSON/XML-RPC Client <http://code.google.com/p/json-xml-rpc/>
 * Version: 0.8.0.2 (2007-12-06)
 * Copyright: 2007, Weston Ruter <http://weston.ruter.net/>
 * License: GNU General Public License, Free Software Foundation
 *          <http://creativecommons.org/licenses/GPL/2.0/>
 *
 * Original inspiration for the design of this implementation is from jsolait, from which 
 * are taken the "ServiceProxy" name and the interface for synchronous method calls.
 * 
 * See the following specifications:
 *   - XML-RPC: <http://www.xmlrpc.com/spec>
 *   - JSON-RPC 1.0: <http://json-rpc.org/wiki/specification>
 *   - JSON-RPC 1.1 (draft): <http://json-rpc.org/wd/JSON-RPC-1-1-WD-20060807.html>
 *
 * Usage:
 * var service = new rpc.ServiceProxy("/app/service", {
 *                         asynchronous: true,   //default: true
 *                         sanitize: true,       //default: true
 *                         methods: ['greet'],   //default: null (synchronous introspection populates)
 *                         protocol: 'JSON-RPC', //default: JSON-RPC
 * }); 
 * service.greet({
 *    params:{name:"World"},
 *    onSuccess:function(message){
 *        alert(message);
 *    },
 *    onException:function(e){
 *        alert("Unable to greet because: " + e);
 *        return true;
 *    }
 * });
 *
 * If you create the service proxy with asynchronous set to false you may execute
 * the previous as follows:
 *
 * try {
 *    var message = service.greet("World");
 *    alert(message);
 * }
 * catch(e){
 *    alert("Unable to greet because: " + e);
 * }
 *
 * Finally, if the URL provided is on a site that violates the same origin policy,
 * then you may only create an asynchronous proxy, the resultant data may not be
 * sanitized, and you must provide the methods yourself. In order to obtain the
 * method response, the JSON-RPC server must be provided the name of a callback
 * function which will be generated in the JavaScript (json-in-script) response. The HTTP GET
 * parameter for passing the callback function is currently non-standardized and so
 * varies from server to server. Create a service proxy with the option
 * 'callbackParamName' in order to specify the callback function name parameter;
 * the default is 'JSON-response-callback', as used by associated JSON/XML-RPC
 * Server project. For example, getting Google Calendar data:
 *
 * var gcalService = new rpc.ServiceProxy("http://www.google.com/calendar/feeds/myemail%40gmail.com/public", {
 *                         asynchronous: true,  //true (default) required, otherwise error raised
 *                         sanitize: false,     //explicit false required, otherwise error raised
 *                         methods: ['full']    //explicit list required, otherwise error raised
 *                         callbackParamName: 'callback'
 *                         }); 
 * gcalService.full({
 *      params:{
 *          alt:'json-in-script' //required for this to work
 *          'start-min':new Date() //automatically converted to ISO8601
 *          //other Google Calendar parameters
 *      },
 *      onSuccess:function(json){
 *          json.feed.entry.each(function(entry){
 *              //do something
 *          });
 *      }
 * });
 */

var rpc = {
	version:"0.8.0.2",	
	requestCount: 0
};

rpc.ServiceProxy = function(serviceURL, options){
	//if(typeof Prototype == 'undefined')
	//	throw Error("The RPC client currently requires the use of Prototype.");
	this.__serviceURL = serviceURL;
	
	//Determine if accessing the server would violate the same origin policy
	this.__isCrossSite = false;
	var urlParts = this.__serviceURL.match(/^(\w+:)\/\/([^\/]+?)(?::(\d+))?(?:$|\/)/);
	if(urlParts){
		this.__isCrossSite = (
			location.protocol !=  urlParts[1] ||
			document.domain   !=  urlParts[2] ||
			location.port     != (urlParts[3] || "")
		);
	}

	//Set other default options
	var providedMethodList;
	this.__use_flXHR = false;
	this.__flproxy = null;
	this.__isAsynchronous = true;
	this.__isResponseSanitized = true;
	this.__authUsername = null;
	this.__authPassword = null;
	this.__callbackParamName = 'JSON-response-callback';
	this.__protocol = 'JSON-RPC';
	this.__dateEncoding = 'ISO8601'; // ("@timestamp@" || "@ticks@") || "classHinting" || "ASP.NET"
	this.__decodeISO8601 = true; //JSON only
	
	//Get the provided options
	if(options instanceof Object){
		if(options.asynchronous !== undefined){
			this.__isAsynchronous = !!options.asynchronous;
			if(!this.__use_flXHR && !this.__isAsynchronous && this.__isCrossSite)
				throw Error("It is not possible to establish a synchronous connection to a cross-site RPC service.");
		}
		if(options.sanitize != undefined)
			this.__isResponseSanitized = !!options.sanitize;
		if(options.user != undefined)
			this.__authUsername = options.user;
		if(options.password != undefined)
			this.__authPassword = options.password;
		if(options.callbackParamName != undefined)
			this.__callbackParamName = options.callbackParamName;
		if(String(options.protocol).toUpperCase() == 'XML-RPC')
			this.__protocol = 'XML-RPC';
		if(options.dateEncoding != undefined)
			this.__dateEncoding = options.dateEncoding;
		if(options.decodeISO8601 != undefined)
			this.__decodeISO8601 = !!options.decodeISO8601;
		providedMethodList = options.methods;
		if(options.use_flXHR != undefined)
		{
			this.__use_flXHR = true;
		    this.__flproxy = new flensed.flXHR(
			{
				autoUpdatePlayer:true, 
				noCacheHeader:false, 
				xmlResponseText : false,
				loadPolicyURL : options.crossdomain_xml
			});
			
			//alert(options.crossdomain_xml);
			this.__isCrossSite = false;

		}
	}
	if(this.__isCrossSite){
		if(this.__isResponseSanitized){
			throw Error("You are attempting to access a service on another site, and the JSON data returned " +
						"by cross-site requests cannot be sanitized. You must therefore explicitly set the " +
						"'sanitize' option to false (it is true by default) in order to proceed with making " +
						"potentially insecure cross-site rpc calls.");
		}
		else if(this.__protocol == 'XML-RPC')
			throw Error("Unable to use the XML-RPC protocol to access services on other domains.");
	}
	
	//Obtain the list of methods made available by the server
	if( this.__isCrossSite && !providedMethodList)
		throw Error("You must manually supply the service's method names since auto-introspection is not permitted for cross-site services.");
	if(providedMethodList)
		this.__methodList = providedMethodList;
	else {
		//Introspection must be performed synchronously
		var async = this.__isAsynchronous;
		this.__isAsynchronous = false;
		this.__methodList = this.__callMethod("system.listMethods", []);
		this.__isAsynchronous = async;
	}
	this.__methodList.push('system.listMethods');
	this.__methodList.push('system.describe');
	
	//Create local "wrapper" functions which reference the methods obtained above
	for(var methodName, i = 0; methodName = this.__methodList[i]; i++){
		//Make available the received methods in the form of chained property lists (eg. "parent.child.methodName")
		var methodObject = this;
		var propChain = methodName.split(/\./);
		for(var j = 0; j+1 < propChain.length; j++){
			if(!methodObject[propChain[j]])
				methodObject[propChain[j]] = {};
			methodObject = methodObject[propChain[j]];
		}

		//Create a wrapper to this.__callMethod with this instance and this methodName bound
		var wrapper = (function(instance, methodName){
			var call = {instance:instance, methodName:methodName}; //Pass parameters into closure
			return function(){
				if(call.instance.__isAsynchronous){
					if(arguments.length == 1 && arguments[0] instanceof Object){
						call.instance.__callMethod(call.methodName,
												 arguments[0].params,
												 arguments[0].onSuccess,
												 arguments[0].onException,
												 arguments[0].onComplete,
												 arguments[0].local_params);
					}
					else {
						call.instance.__callMethod(call.methodName,
												 arguments[0],
												 arguments[1],
												 arguments[2],
												 arguments[3], arguments[4]);
					}	
					return undefined;
				}
				else return call.instance.__callMethod(call.methodName, rpc.toArray(arguments));
			};
		})(this, methodName);
		
		methodObject[propChain[propChain.length-1]] = wrapper;
	}
};

rpc.setAsynchronous = function(serviceProxy, isAsynchronous){
	if(!isAsynchronous && serviceProxy.__isCrossSite)
		throw Error("It is not possible to establish a synchronous connection to a cross-site RPC service.");
	serviceProxy.__isAsynchronous = !!isAsynchronous;
};

rpc.ServiceProxy.prototype.__callMethod = function(methodName, params, successHandler, exceptionHandler, completeHandler, local_params){
	rpc.requestCount++;
	
	//Verify that successHandler, exceptionHandler, and completeHandler are functions
	if(this.__isAsynchronous){
		if(successHandler && typeof successHandler != 'function')
			throw Error('The asynchronous onSuccess handler callback function you provided is invalid; the value you provided (' + successHandler.toString() + ') is of type "' + typeof(successHandler) + '".');
		if(exceptionHandler && typeof exceptionHandler != 'function')
			throw Error('The asynchronous onException handler callback function you provided is invalid; the value you provided (' + exceptionHandler.toString() + ') is of type "' + typeof(exceptionHandler) + '".');
		if(completeHandler && typeof completeHandler != 'function')
			throw Error('The asynchronous onComplete handler callback function you provided is invalid; the value you provided (' + completeHandler.toString() + ') is of type "' + typeof(completeHandler) + '".');
	}	

	try {
		//Assign the provided callback function to the response lookup table
		if(this.__isAsynchronous || this.__isCrossSite){
			rpc.pendingRequests[String(rpc.requestCount)] = {
				//method:methodName,
				onSuccess:successHandler,
				onException:exceptionHandler,
				onComplete:completeHandler,
				_local_params:local_params
			};
		}
			
		//Asynchronous cross-domain call (JSON-in-Script) -----------------------------------------------------
		if(this.__isCrossSite){ //then this.__isAsynchronous is implied
			
			//Create an ad hoc function specifically for this cross-site request; this is necessary because it is 
			//  not possible pass an JSON-RPC request object with an id over HTTP Get requests.
			rpc.callbacks['r' + String(rpc.requestCount)] = (function(instance, id){
				var call = {instance: instance, id: id}; //Pass parameter into closure
				return function(response){
					if(response instanceof Object && (response.result || response.error)){
						response.id = call.id;
						instance.__doCallback(response);
					}
					else {//Allow data without response wrapper (i.e. GData)
						instance.__doCallback({id: call.id, result: response});
					}
				}
			})(this, rpc.requestCount);
			//rpc.callbacks['r' + String(rpc.requestCount)] = new Function("response", 'response.id = ' + rpc.requestCount + '; this.__doCallback(response);');
			

			//Make the request by adding a SCRIPT element to the page
			var script = document.createElement('script');
			script.setAttribute('type', 'text/javascript');
			var src = this.__serviceURL +
						'/' + methodName +
						'?' + this.__callbackParamName + '=rpc.callbacks.r' + (rpc.requestCount);
			if(params)
				src += '&' + rpc.toQueryString(params);
			script.setAttribute('src', src);
			script.setAttribute('id', 'rpc' + rpc.requestCount);
			var head = document.getElementsByTagName('head')[0];
			rpc.pendingRequests[rpc.requestCount].scriptElement = script;
			head.appendChild(script);

			return undefined;
		}
		//Calls made with XMLHttpRequest ------------------------------------------------------------
		else {
			//Obtain and verify the parameters
			if(params){
				if(!(params instanceof Object) || params instanceof Date) //JSON-RPC 1.1 allows params to be a hash not just an array
					throw Error('When making asynchronous calls, the parameters for the method must be passed as an array (or a hash); the value you supplied (' + String(params) + ') is of type "' + typeof(params) + '".');
				//request.params = params;
			}
			
			//Prepare the XML-RPC request
			var request,postData;
			if(this.__protocol == 'XML-RPC'){
				if(!(params instanceof Array))
					throw Error("Unable to pass associative arrays to XML-RPC services.");
				
				var xml = ['<?xml version="1.0"?><methodCall><methodName>' + methodName + '</methodName>'];
				if(params){
					xml.push('<params>');
					for(var i = 0; i < params.length; i++)
						xml.push('<param>' + this.__toXMLRPC(params[i]) + '</param>');
					xml.push('</params>');
				}
				xml.push('</methodCall>');
				postData = xml.join('');
				
				//request = new Document();
				//var methodCallEl = document.createElement('methodCall');
				//var methodNameEl = document.createElement('methodName');
				//methodNameEl.appendChild(document.createTextNode(methodName));
				//methodCallEl.appendChild(methodNameEl);
				//if(params){
				//	var paramsEl = document.createElement('params');
				//	for(var i = 0; i < params.length; i++){
				//		var paramEl = document.createElement('param');
				//		paramEl.appendChild(this.__toXMLRPC(params[i]));
				//		paramsEl.appendChild(paramEl);
				//	}
				//	methodCallEl.appendChild(paramsEl);
				//}
				//request.appendChild(methodCallEl);
				//postData = request.serializeXML();
			}
			//Prepare the JSON-RPC request
			else {
				request = {
					version:"1.1",
					method:methodName,
					id:rpc.requestCount
				};
				if(params)
					request.params = params;
				postData = this.__toJSON(request);
			}
			
			//XMLHttpRequest chosen (over Ajax.Request) because it propogates uncaught exceptions
			var xhr;
			if(!this.__use_flXHR)
			{
				if(window.XMLHttpRequest)
					xhr = new XMLHttpRequest();
				else if(window.ActiveXObject){
					try {
						xhr = new ActiveXObject('Msxml2.XMLHTTP');
					} catch(err){
						xhr = new ActiveXObject('Microsoft.XMLHTTP');
					}
				}
			}
			else
			{
				xhr = this.__flproxy;
				//xhr.setRequestHeader('Accept', 'application/json;q=0.9, */*;q=0.1');
			}
			
			xhr.open('POST', this.__serviceURL, this.__isAsynchronous, this.__authUsername, this.__authPassword);
			if(this.__protocol == 'XML-RPC'){
				xhr.setRequestHeader('Content-Type', 'text/xml');
				xhr.setRequestHeader('Accept', 'text/xml');
			}
			else {
				xhr.setRequestHeader('Content-Type', 'application/json');
				xhr.setRequestHeader('Accept', 'application/json;q=0.9, */*;q=0.1');
			}
			xhr.setRequestHeader('X-XSS-Protection', '0');

			
			
			//Asynchronous same-domain call -----------------------------------------------------
			if(this.__isAsynchronous){
				//Send the request
				xhr.send(postData);
				
				//Handle the response
				var instance = this;
				var requestInfo = {id:rpc.requestCount}; //for XML-RPC since the 'request' object cannot contain request ID
				xhr.onreadystatechange = function(){
					//QUESTION: Why can't I use this.readyState?
					if(xhr.readyState == 4){
						//XML-RPC
						if(instance.__protocol == 'XML-RPC'){
							var response = instance.__getXMLRPCResponse(xhr, requestInfo.id);
							instance.__doCallback(response);
						}
						//JSON-RPC
						else {
						
							var response = instance.__evalJSON(xhr.responseText, instance.__isResponseSanitized);
							if(!response.id)
								response.id = requestInfo.id;
							instance.__doCallback(response);
						}
					}
				};
				
				return undefined;
			}
			//Synchronous same-domain call -----------------------------------------------------
			else {
				//Send the request
				xhr.send(postData);
				var response;
				//alert(xhr.responseText);
				if(this.__protocol == 'XML-RPC')
					response = this.__getXMLRPCResponse(xhr, rpc.requestCount);
				else
					response = this.__evalJSON(xhr.responseText, this.__isResponseSanitized);
				
				//Note that this error must be caught with a try/catch block instead of by passing a onException callback
				if(response.error)
					throw Error('Unable to call "' + methodName + '". Server responsed with error (code ' + response.error.code + '): ' + response.error.message);
				
				this.__upgradeValuesFromJSON(response);
				return response.result;
			}
		}
	}
	catch(err){
		//err.locationCode = PRE-REQUEST Cleint
		var isCaught = false;
		if(exceptionHandler)
			isCaught = exceptionHandler(err); //add error location
		if(completeHandler)
			completeHandler();
			
		if(!isCaught)
			throw err;
	}
};

//This acts as a lookup table for the response callback to execute the user-defined
//   callbacks and to clean up after a request
rpc.pendingRequests = {};

//Ad hoc cross-site callback functions keyed by request ID; when a cross-site request
//   is made, a function is created 
rpc.callbacks = {};

//Called by asychronous calls when their responses have loaded
rpc.ServiceProxy.prototype.__doCallback = function(response){
	if(typeof response != 'object')
		throw Error('The server did not respond with a response object.');
	if(!response.id)
		throw Error('The server did not respond with the required response id for asynchronous calls.');

	if(!rpc.pendingRequests[response.id])
		throw Error('Fatal error with RPC code: no ID "' + response.id + '" found in pendingRequests.');
	
	//Remove the SCRIPT element from the DOM tree for cross-site (JSON-in-Script) requests
	if(rpc.pendingRequests[response.id].scriptElement){
		var script = rpc.pendingRequests[response.id].scriptElement;
		script.parentNode.removeChild(script);
	}
	//Remove the ad hoc cross-site callback function
	if(rpc.callbacks[response.id])
		delete rpc.callbacks['r' + response.id];
	
	var uncaughtExceptions = [];
	
	//Handle errors returned by the server
	if(response.error !== undefined){
		var err = new Error(response.error.message);
		err.code = response.error.code;
		//err.locationCode = SERVER
		if(rpc.pendingRequests[response.id].onException){
			try{
				if(!rpc.pendingRequests[response.id].onException(err))
					uncaughtExceptions.push(err);
			}
			catch(err2){ //If the onException handler also fails
				uncaughtExceptions.push(err);
				uncaughtExceptions.push(err2);
			}
		}
		else uncaughtExceptions.push(err);
	}
	
	//Process the valid result
	else if(response.result !== undefined){
		//iterate over all values and substitute date strings with Date objects
		//Note that response.result is not passed because the values contained
		//  need to be modified by reference, and the only way to do so is
		//  but accessing an object's properties. Thus an extra level of
		//  abstraction allows for accessing all of the results members by reference.
		this.__upgradeValuesFromJSON(response);
		
		if(rpc.pendingRequests[response.id].onSuccess){
			try {
				rpc.pendingRequests[response.id].onSuccess(response.result, rpc.pendingRequests[response.id]._local_params);
			}
			//If the onSuccess callback itself fails, then call the onException handler as above
			catch(err){
				//err3.locationCode = CLIENT;
				if(rpc.pendingRequests[response.id].onException){
					try {
						if(!rpc.pendingRequests[response.id].onException(err))
							uncaughtExceptions.push(err);
					}
					catch(err2){ //If the onException handler also fails
						uncaughtExceptions.push(err);
						uncaughtExceptions.push(err2);
					}
				}
				else uncaughtExceptions.push(err);
			}
		}
	}
	
	//Call the onComplete handler
	try {
		if(rpc.pendingRequests[response.id].onComplete)
			rpc.pendingRequests[response.id].onComplete(response);
	}
	catch(err){ //If the onComplete handler fails
		//err3.locationCode = CLIENT;
		if(rpc.pendingRequests[response.id].onException){
			try {
				if(!rpc.pendingRequests[response.id].onException(err))
					uncaughtExceptions.push(err);
			}
			catch(err2){ //If the onException handler also fails
				uncaughtExceptions.push(err);
				uncaughtExceptions.push(err2);
			}
		}
		else uncaughtExceptions.push(err);
	}
	
	delete rpc.pendingRequests[response.id];
	
	//Merge any exception raised by onComplete into the previous one(s) and throw it
	if(uncaughtExceptions.length){
		var code;
		var message = 'There ' + (uncaughtExceptions.length == 1 ?
							 'was 1 uncaught exception' :
							 'were ' + uncaughtExceptions.length + ' uncaught exceptions') + ': ';
		for(var i = 0; i < uncaughtExceptions.length; i++){
			if(i)
				message += "; ";
			message += uncaughtExceptions[i].message;
			if(uncaughtExceptions[i].code)
				code = uncaughtExceptions[i].code;
		}
		var err = new Error(message);
		err.code = code;	
		throw err;
	}
};


/*******************************************************************************************
 * JSON-RPC Specific Functions
 ******************************************************************************************/
rpc.ServiceProxy.prototype.__toJSON = function(value){
	switch(typeof value){
		case 'number':
			return isFinite(value) ? value.toString() : 'null';
		case 'boolean':
			return value.toString();
		case 'string':
			//Taken from Ext JSON.js
			var specialChars = {
				"\b": '\\b',
				"\t": '\\t',
				"\n": '\\n',
				"\f": '\\f',
				"\r": '\\r',
				'"' : '\\"',
				"\\": '\\\\',
				"/" : '\/'
			};
			return '"' + value.replace(/([\x00-\x1f\\"])/g, function(a, b) {
				var c = specialChars[b];
				if(c)
					return c;
				c = b.charCodeAt();
				//return "\\u00" + Math.floor(c / 16).toString(16) + (c % 16).toString(16);
				return '\\u00' + rpc.zeroPad(c.toString(16));
			}) + '"';
		case 'object':
			if(value === null)
				return 'null';
			else if(value instanceof Array){
				var json = ['['];  //Ext's JSON.js reminds me that Array.join is faster than += in MSIE
				for(var i = 0; i < value.length; i++){
					if(i)
						json.push(',');
					json.push(this.__toJSON(value[i]));
				}
				json.push(']');
				return json.join('');
			}
			else if(value instanceof Date){
				switch(this.__dateEncoding){
					case 'classHinting': //{"__jsonclass__":["constructor", [param1,...]], "prop1": ...}
						return '{"__jsonclass__":["Date",[' + value.valueOf() + ']]}';
					case '@timestamp@':
					case '@ticks@':
						return '"@' + value.valueOf() + '@"';
					case 'ASP.NET':
						return '"\\/Date(' + value.valueOf() + ')\\/"';
					default:
						return '"' + rpc.dateToISO8601(value) + '"';
				}
			}
			else if(value instanceof Number || value instanceof String || value instanceof Boolean)
				return this.__toJSON(value.valueOf());
			else {
				var useHasOwn = {}.hasOwnProperty ? true : false; //From Ext's JSON.js
				var json = ['{'];
				for(var key in value){
					if(!useHasOwn || value.hasOwnProperty(key)){
						if(json.length > 1)
							json.push(',');
						json.push(this.__toJSON(key) + ':' + this.__toJSON(value[key]));
					}
				}
				json.push('}');
				return json.join('');
			}
		//case 'undefined':
		//case 'function':
		//case 'unknown':
		//default:
	}
	throw new TypeError('Unable to convert the value of type "' + typeof(value) + '" to JSON.'); //(' + String(value) + ') 
};

rpc.isJSON = function(string){ //from Prototype String.isJSON()
    var testStr = string.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(testStr);
};

rpc.ServiceProxy.prototype.__evalJSON = function(json, sanitize){ //from Prototype String.evalJSON()
//alert(json);
	if(json == null) return "";
	//Remove security comment delimiters
	json = json.replace(/^\/\*-secure-([\s\S]*)\*\/\s*$/, "$1");
	var err;
    try {
		if(!sanitize || rpc.isJSON(json))
			return eval('(' + json + ')');
    }
	catch(e){err = e;}
    throw new SyntaxError('Badly formed JSON string: ' + json + " ... " + (err ? err.message : ''));
};

//This function iterates over the properties of the passed object and converts them 
//   into more appropriate data types, i.e. ISO8601 strings are converted to Date objects.
rpc.ServiceProxy.prototype.__upgradeValuesFromJSON = function(obj){
	var matches, useHasOwn = {}.hasOwnProperty ? true : false;
	for(var key in obj){
		if(!useHasOwn || obj.hasOwnProperty(key)){
			//Parse date strings
			if(typeof obj[key] == 'string'){
				//ISO8601
				if(this.__decodeISO8601 && (matches = obj[key].match(/^(?:(\d\d\d\d)-(\d\d)(?:-(\d\d)(?:T(\d\d)(?::(\d\d)(?::(\d\d)(?:\.(\d+))?)?)?)?)?)$/))){
					obj[key] = new Date(0);
					if(matches[1]) obj[key].setUTCFullYear(parseInt(matches[1]));
					if(matches[2]) obj[key].setUTCMonth(parseInt(matches[2]-1));
					if(matches[3]) obj[key].setUTCDate(parseInt(matches[3]));
					if(matches[4]) obj[key].setUTCHours(parseInt(matches[4]));
					if(matches[5]) obj[key].setUTCMinutes(parseInt(matches[5]));
					if(matches[6]) obj[key].setUTCMilliseconds(parseInt(matches[6]));
				}
				//timestamp / ticks
				else if(matches = obj[key].match(/^@(\d+)@$/)){
					obj[key] = new Date(parseInt(matches[1]))
				}
				//ASP.NET
				else if(matches = obj[key].match(/^\/Date\((\d+)\)\/$/)){
					obj[key] = new Date(parseInt(matches[1]))
				}
			}
			else if(obj[key] instanceof Object){

				//JSON 1.0 Class Hinting: {"__jsonclass__":["constructor", [param1,...]], "prop1": ...}
				if(obj[key].__jsonclass__ instanceof Array){
					//console.info('good1');
					if(obj[key].__jsonclass__[0] == 'Date'){
						//console.info('good2');
						if(obj[key].__jsonclass__[1] instanceof Array && obj[key].__jsonclass__[1][0])
							obj[key] = new Date(obj[key].__jsonclass__[1][0]);
						else
							obj[key] = new Date();
					}
				}
				else this.__upgradeValuesFromJSON(obj[key]);
			}
		}
	}
};


/*******************************************************************************************
 * XML-RPC Specific Functions
 ******************************************************************************************/

rpc.ServiceProxy.prototype.__toXMLRPC = function(value){
	var xml = ['<value>'];
	switch(typeof value){
		case 'number':
			if(!isFinite(value))
				xml.push('<nil/>');
			else if(parseInt(value) == Math.ceil(value)){
				xml.push('<int>');
				xml.push(value.toString());
				xml.push('</int>');
			}
			else {
				xml.push('<double>');
				xml.push(value.toString());
				xml.push('</double>');
			}
			break;
		case 'boolean':
			xml.push('<boolean>');
			xml.push(value ? '1' : '0');
			xml.push('</boolean>');
			break;
		case 'string':
			xml.push('<string>');
			xml.push(value.replace(/[<>&]/, function(ch){
				
			})); //escape for XML!
			xml.push('</string>');
			break;
		case 'object':
			if(value === null)
				xml.push('<nil/>');
			else if(value instanceof Array){
				xml.push('<array><data>');
				for(var i = 0; i < value.length; i++)
					xml.push(this.__toXMLRPC(value[i]));
				xml.push('</data></array>');
			}
			else if(value instanceof Date){
				xml.push('<dateTime.iso8601>' + rpc.dateToISO8601(value) + '</dateTime.iso8601>');
			}
			else if(value instanceof Number || value instanceof String || value instanceof Boolean)
				return rpc.dateToISO8601(value.valueOf());
			else {
				xml.push('<struct>');
				var useHasOwn = {}.hasOwnProperty ? true : false; //From Ext's JSON.js
				for(var key in value){
					if(!useHasOwn || value.hasOwnProperty(key)){
						xml.push('<member>');
						xml.push('<name>' + key + '</name>'); //Excape XML!
						xml.push(this.__toXMLRPC(value[key]));
						xml.push('</member>');
					}
				}
				xml.push('</struct>');
			}
			break;
		//case 'undefined':
		//case 'function':
		//case 'unknown':
		default:
			throw new TypeError('Unable to convert the value of type "' + typeof(value) + '" to XML-RPC.'); //(' + String(value) + ')
	}
	xml.push('</value>');
	return xml.join('');
};

//rpc.ServiceProxy.prototype.toXMLRPC = function(value){ //documentNode
//	var valueEl = document.createElement('value');
//	//var xml = ['<value>'];
//	switch(typeof value){
//		case 'number':
//			if(!isFinite(value))
//				//xml.push('<nil/>');
//				valueEl.appendChild(document.createElement('nil'));
//			//else if(parseInt(value) == Math.ceil(value)){
//			//	var intEl = document.createElement('int');
//			//	intEl.appendChild(document.createTextNode(value.toString()));
//			//	valueEl.appendChild(intEl);
//			//	//xml.push('<int>');
//			//	//xml.push(value.toString());
//			//	//xml.push('</int>');
//			//}
//			//else {
//			//	var doubleEl = document.createElement('double');
//			//	doubleEl.appendChild(document.createTextNode(value.toString()));
//			//	valueEl.appendChild(doubleEl);
//			//	//xml.push('<double>');
//			//	//xml.push(value.toString());
//			//	//xml.push('</double>');
//			//}
//			else {
//				var numEl = document.createElement(parseInt(value) == Math.ceil(value) ? 'int' : 'double');
//				numEl.appendChild(document.createTextNode(value.toString()));
//				valueEl.appendChild(numEl);
//			}
//			return valueEl;
//		case 'boolean':
//			var boolEl = document.createElement('boolean');
//			boolEl.appendChild(document.createTextNode(value ? '1' : '0'));
//			valueEl.appendChild(boolEl);
//			return valueEl;
//			//xml.push('<boolean>');
//			//xml.push(value ? '1' : '0');
//			//xml.push('</boolean>');
//		case 'string':
//			var stringEl = document.createElement('string');
//			stringEl.appendChild(document.createTextNode(value));
//			valueEl.appendChild(stringEl);
//			return valueEl;
//		case 'object':
//			if(value === null)
//				valueEl.appendChild(document.createElement('nil'));
//			else if(value instanceof Array){
//				var arrayEl = document.createElement('array');
//				var dataEl = document.createElement('data');
//				for(var i = 0; i < value.length; i++)
//					dataEl.appendChild(this.__toXMLRPC(value[i]));
//				arrayEl.appendChild(dataEl);
//				valueEl.appendChild(arrayEl);
//			}
//			else if(value instanceof Date){
//				var dateEl = document.createElement('datetime.ISO8601');
//				dateEl.appendChild(document.createTextNode(rpc.dateToISO8601(value)));
//				valueEl.appendChild(dateEl);
//			}
//			else if(value instanceof Number || value instanceof String || value instanceof Boolean)
//				return rpc.dateToISO8601(value.valueOf());
//			else {
//				var structEl = document.createElement('struct');
//				var useHasOwn = {}.hasOwnProperty ? true : false; //From Ext's JSON.js
//				for(var key in value){
//					if(!useHasOwn || value.hasOwnProperty(key)){
//						var memberEl = document.createElement('member');
//						var nameEl = document.createElement('name')
//						nameEl.appendChild(document.createTextNode(key));
//						memberEl.appendChild(nameEl);
//						memberEl.appendChild(this.__toXMLRPC(value[key]));
//						structEl.appendChild(memberEl);
//					}
//				}
//				valueEl.appendChild(structEl);
//			}
//			return valueEl;
//		//case 'undefined':
//		//case 'function':
//		//case 'unknown':
//		//default:
//	}
//	throw new TypeError('Unable to convert the value of type "' + typeof(value) + '" to XML-RPC.'); //(' + String(value) + ')
//};

rpc.ServiceProxy.prototype.__parseXMLRPC = function(valueEl){
	if(valueEl.childNodes.length == 1 &&
	   valueEl.childNodes.item(0).nodeType == 3)
	{
		return valueEl.childNodes.item(0).nodeValue;
	}
	for(var i = 0; i < valueEl.childNodes.length; i++){
		if(valueEl.childNodes.item(i).nodeType == 1){
			var typeEL = valueEl.childNodes.item(i);
			switch(typeEL.nodeName.toLowerCase()){
				case 'i4':
				case 'int':
					//An integer is a 32-bit signed number. You can include a plus or minus at the
					//   beginning of a string of numeric characters. Leading zeros are collapsed.
					//   Whitespace is not permitted. Just numeric characters preceeded by a plus or minus.
					var intVal = parseInt(typeEL.firstChild.nodeValue);
					if(isNaN(intVal))
						throw Error("XML-RPC Parse Error: The value provided as an integer '" + typeEL.firstChild.nodeValue + "' is invalid.");
					return intVal;
				case 'double':
					//There is no representation for infinity or negative infinity or "not a number".
					//   At this time, only decimal point notation is allowed, a plus or a minus,
					//   followed by any number of numeric characters, followed by a period and any
					//   number of numeric characters. Whitespace is not allowed. The range of
					//   allowable values is implementation-dependent, is not specified.
					var floatVal = parseFloat(typeEL.firstChild.nodeValue);
					if(isNaN(floatVal))
						throw Error("XML-RPC Parse Error: The value provided as a double '" + typeEL.firstChild.nodeValue + "' is invalid.");
					return floatVal;
				case 'boolean':
					if(typeEL.firstChild.nodeValue != '0' && typeEL.firstChild.nodeValue != '1')
						throw Error("XML-RPC Parse Error: The value provided as a boolean '" + typeEL.firstChild.nodeValue + "' is invalid.");
					return Boolean(parseInt(typeEL.firstChild.nodeValue));
				case 'string':
					if(!typeEL.firstChild)
						return "";
					return typeEL.firstChild.nodeValue;
				case 'datetime.iso8601':
					var matches, date = new Date(0);
					if(matches = typeEL.firstChild.nodeValue.match(/^(?:(\d\d\d\d)-(\d\d)(?:-(\d\d)(?:T(\d\d)(?::(\d\d)(?::(\d\d)(?:\.(\d+))?)?)?)?)?)$/)){
						if(matches[1]) date.setUTCFullYear(parseInt(matches[1]));
						if(matches[2]) date.setUTCMonth(parseInt(matches[2]-1));
						if(matches[3]) date.setUTCDate(parseInt(matches[3]));
						if(matches[4]) date.setUTCHours(parseInt(matches[4]));
						if(matches[5]) date.setUTCMinutes(parseInt(matches[5]));
						if(matches[6]) date.setUTCMilliseconds(parseInt(matches[6]));
						return date;
					}
					throw Error("XML-RPC Parse Error: The provided value does not match ISO8601.");
				case 'base64':
					throw Error("Not able to parse base64 data yet.");
					//return base64_decode(typeEL.firstChild.nodeValue);
				case 'nil':
					return null;
				case 'struct':
					//A <struct> contains <member>s and each <member> contains a <name> and a <value>.
					var obj = {};
					for(var memberEl, j = 0; memberEl = typeEL.childNodes.item(j); j++){
						if(memberEl.nodeType == 1 && memberEl.nodeName == 'member'){
							var name = '';
							valueEl = null;
							for(var child, k = 0; child = memberEl.childNodes.item(k); k++){
								if(child.nodeType == 1){
									if(child.nodeName == 'name')
										name = child.firstChild.nodeValue;
									else if(child.nodeName == 'value')
										valueEl = child;
								}
							}
							//<struct>s can be recursive, any <value> may contain a <struct> or
							//   any other type, including an <array>, described below.
							if(name && valueEl)
								obj[name] = this.__parseXMLRPC(valueEl);
						}
					}
					return obj;
				case 'array':
					//An <array> contains a single <data> element, which can contain any number of <value>s.
					var arr = [];
					var dataEl = typeEL.firstChild;
					while(dataEl && (dataEl.nodeType != 1 || dataEl.nodeName != 'data'))
						dataEl = dataEl.nextSibling;
					
					if(!dataEl)
						new Error("XML-RPC Parse Error: Expected 'data' element as sole child element of 'array'.");
					
					valueEl = dataEl.firstChild;
					while(valueEl){
						if(valueEl.nodeType == 1){
							//<arrays>s can be recursive, any value may contain an <array> or
							//   any other type, including a <struct>, described above.
							if(valueEl.nodeName == 'value')
								arr.push(this.__parseXMLRPC(valueEl));
							else
								throw Error("XML-RPC Parse Error: Illegal element child '" + valueEl.nodeName + "' of an array's 'data' element.");
						}
						valueEl = valueEl.nextSibling;
					}
					return arr;
				default:
					throw Error("XML-RPC Parse Error: Illegal element '" + typeEL.nodeName + "' child of the 'value' element.");
			}
		}
	}
	return '';
}

rpc.ServiceProxy.prototype.__getXMLRPCResponse = function(xhr, id){
	var response = {};
	if(!xhr.responseXML)
		throw Error("Malformed XML document.");
	var doc = xhr.responseXML.documentElement;
	if(doc.nodeName != 'methodResponse')
		throw Error("Invalid XML-RPC document.");
	
	var valueEl = doc.getElementsByTagName('value')[0];
	if(valueEl.parentNode.nodeName == 'param' &&
	   valueEl.parentNode.parentNode.nodeName == 'params')
	{
		response.result = this.__parseXMLRPC(valueEl);
	}
	else if(valueEl.parentNode.nodeName == 'fault'){
		var fault = this.__parseXMLRPC(valueEl);
		response.error = {
			code: fault.faultCode,
			message: fault.faultString
		};
	}
	else throw Error("Invalid XML-RPC document.");
	
	if(!response.result && !response.error)
		throw Error("Malformed XML-RPC methodResponse document.");
	
	response.id = id; //XML-RPC cannot pass and return request IDs
	return response;
};

/*******************************************************************************************
 * Other helper functions
 ******************************************************************************************/

//Takes an array or hash and coverts it into a query string, converting dates to ISO8601
//   and throwing an exception if nested hashes or nested arrays appear.
rpc.toQueryString = function(params){
	if(!(params instanceof Object || params instanceof Array) || params instanceof Date)
		throw Error('You must supply either an array or object type to convert into a query string. You supplied: ' + params.constructor);

	var str = '';
	var useHasOwn = {}.hasOwnProperty ? true : false;
	
	for(var key in params){
		if(useHasOwn && params.hasOwnProperty(key)){
			//Process an array
			if(params[key] instanceof Array){
				for(var i = 0; i < params[key].length; i++){
					if(str)
						str += '&';
					str += encodeURIComponent(key) + "=";
					if(params[key][i] instanceof Date)
						str += encodeURIComponent(rpc.dateToISO8601(params[key][i]));
					else if(params[key][i] instanceof Object)
						throw Error('Unable to pass nested arrays nor objects as parameters while in making a cross-site request. The object in question has this constructor: ' + params[key][i].constructor);
					else str += encodeURIComponent(String(params[key][i]));
				}
			}
			else {
				if(str)
					str += '&';
				str += encodeURIComponent(key) + "=";
				if(params[key] instanceof Date)
					str += encodeURIComponent(rpc.dateToISO8601(params[key]));
				else if(params[key] instanceof Object)
					throw Error('Unable to pass objects as parameters while in making a cross-site request. The object in question has this constructor: ' + params[key].constructor);
				else str += encodeURIComponent(String(params[key]));
			}
		}
	}
	return str;
};

//Converts an iterateable value into an array; similar to Prototype's $A function
rpc.toArray = function(value){
	//if(value && value.length){
		if(value instanceof Array)
			return value;
		var array = [];
		for(var i = 0; i < value.length; i++)
			array.push(value[i]);
		return array;
	//}
	//throw Error("Unable to convert to an array the value: " + String(value));
};

//Returns an ISO8601 string *in UTC* for the provided date (Prototype's Date.toJSON() returns localtime)
rpc.dateToISO8601 = function(date){
	//var jsonDate = date.toJSON();
	//return jsonDate.substring(1, jsonDate.length-1); //strip double quotes
	
	return date.getUTCFullYear()             + '-' +
	       rpc.zeroPad(date.getUTCMonth()+1) + '-' +
		   rpc.zeroPad(date.getUTCDate())    + 'T' +
	       rpc.zeroPad(date.getUTCHours())   + ':' +
		   rpc.zeroPad(date.getUTCMinutes()) + ':' +
		   rpc.zeroPad(date.getUTCSeconds()) + '.' +
		   //Prototype's Date.toJSON() method does not include milliseconds
		   rpc.zeroPad(date.getUTCMilliseconds(), 3);
};

rpc.zeroPad = function(value, width){
	if(!width)
		width = 2;
	value = (value == undefined ? '' : String(value))
	while(value.length < width)
		value = '0' + value;
	return value;
};