Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unmodified Runaway.w2i doesn't install #3

Open
Darthagnon opened this issue May 3, 2020 · 4 comments
Open

Unmodified Runaway.w2i doesn't install #3

Darthagnon opened this issue May 3, 2020 · 4 comments

Comments

@Darthagnon
Copy link
Owner

Darthagnon commented May 3, 2020

See Reddit post here about the problems: https://old.reddit.com/r/FreeGameFindings/comments/g8wtfu/pc_game_runaway_a_road_adventure/

Obviously this script isn't a full replacement for the FXWebStore. The recently give-away Runaway.w2i refuses to install/extract with 7zip or this script, but works fine with the FXWebStore.

I don't know why or how.

I examined the processes in Process Hacker, and, while the other games had 7zr.exe (extracting w2i) then w2i.exe (installing extracted files) pop up during the installation process, this one had only w2i.exe pop up to install it.

@Darthagnon
Copy link
Owner Author

None of the FX Web Store's files have changed recently, so it's not a "recent update" afaik

@Darthagnon
Copy link
Owner Author

Darthagnon commented May 3, 2020

Runaway.w2i (spanish version) Hashes:

CRC32: A9FEFFE6
MD5: D8ACBD798489DDCF986245641A670504
SHA-1: 1A8DF882D3BBB2406F01630C3A9D4C1629E3666A

Game is installed from FXWebPlayer.exe. No command-line changes are visible.

Update:

Firefox console when loading page https://juegos.fxinteractive.com/fx/gamepriv.php?id=24
(logged in as a valid account, owning the game) - I'm guessing this information is passed to FXWebPlayer.exe

ajax/generic.php->({"_resultStr":"WU_OK","_permit":true,"Games":[{"RegisterDate":"2020-05-03 15:09:18","HasPackage":true,"Id":24,"Keycode":"AA1-AA1-AA1","Installed":0,"ExtraData":"","Uses":-1,"HasContentArea":true,"RemainingInstalls":4,"RemainingTime":-1,"Name":"Runaway"}],"_resultMsg":"Operacion completada correctamente","call":"User.GetGames"})

Keycode is letters and numbers (dummied here), game is installed.

@Darthagnon
Copy link
Owner Author

Darthagnon commented May 3, 2020

The above output is given by wu2.js.php:

Spoiler, very long code, click to expand!

// Espacio de nombres de FX
if (typeof FXPlanet!='object')
	FXPlanet = {};
	
FXPlanet.social_network = "fb";
FXPlanet.social_network_prefix = "fb";
FXPlanet.social_signed_request = "";
FXPlanet.social_getting_login_state = false;
FXPlanet.social_getting_data = false;
FXPlanet.social_checking = false;
FXPlanet.social_check_permissions = true;
FXPlanet.social_check_associate = true;
FXPlanet.social_want_to_connect = false;
FXPlanet.social_session_change = false;
FXPlanet.social_canvas = false;
FXPlanet.social_create_user_if_necessary = FXPlanet.social_canvas;
FXPlanet.social_try_login = true;
FXPlanet.social_create_user_just_failed = false;
FXPlanet.social_user_logged = false;
FXPlanet.social_user = "";
FXPlanet.social_name = "";
FXPlanet.social_signed_token = "";
FXPlanet.social_proxied_email = "";
FXPlanet.social_email = "";
FXPlanet.social_sex = "";
FXPlanet.social_fxuser_id = ""; // id de FB asociado al usuario plataforma
FXPlanet.social_data = {};
FXPlanet.social_friends = {};

FXPlanet.Pixapi = function(call, params, callback) {
	PIX.apiCall(call, params, function(data) {
		DebugLog("PixapiResult:"+call);
		for (var i in data)
			DebugLog("Pixapi:"+call+"->"+i+"->"+data[i].toString());
		if (data["error"]==undefined)
			callback(data);
	});
};

FXPlanet.MakeNick = function(first_name,last_name,cb)
{
	// inventa un nick válido para la plataforma basándome en el nombre de Facebook/Pixonic
	if (FXPlanet.social_network!="pixonic" && last_name.length>2)
		last_name = last_name.slice(0,2);
	var result = first_name+last_name;
	result = result.toUpperCase();
	var first_invalid;
	while ((first_invalid=strspn(result,"0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ-_."))<result.length)
		result = result.slice(0,first_invalid)+result.slice(first_invalid+1);
	if (result.length>15)
		result = result.slice(0,15);
	FXPlanet.AjaxCallEx("ajax/generic.php", { call: "User.SuggestAlias", UserAlias: result }, function(reply) {
		if (reply._resultStr!="WU_OK") {
			reply._resultStr = "WU_OK";
			if (result.length>11)
				result = result.slice(0,11);
			reply.Suggestions = new Array(result+Math.floor(Math.random()*10)+Math.floor(Math.random()*10)+Math.floor(Math.random()*10)+Math.floor(Math.random()*10));
		}
		cb(reply);
	});
}

// Obtiene la información (id, nombre...) del usuario actualmente logueado en facebook
FXPlanet.GetSocialData = function(callback)
{
	DebugLog("GetSocialData");
	FXPlanet.social_getting_data = true;
	var arrParams = { product: game_id };
	if (FXPlanet.social_signed_request!="")
		arrParams["signed_request"] = FXPlanet.social_signed_request;
	if (FXPlanet.social_network=="pixonic") {
		PIX.apiCall("profile.get", {}, function(data) {
			FXPlanet.social_getting_data = false;
			FXPlanet.social_user = FXPlanet.social_name = FXPlanet.social_proxied_email = FXPlanet.social_email = FXPlanet.social_sex = "";
			if (data["error"]!=undefined)
				return;
			data = data["response"]["profile"];
			FXPlanet.social_data = data;
			FXPlanet.social_user = data["id"];
			FXPlanet.social_sex = data["gender"]=="M" ? "male" : "female";
			FXPlanet.MakeNick(data["firstName"],data["lastName"],function(reply) {
				FXPlanet.social_name=reply.Suggestions[0];
				if (typeof callback === 'function')
					callback();
			});
    	});
	}
	else
		FXPlanet.AjaxCallEx("ajax/fb_on_login.php", arrParams, function(reply) {
			FXPlanet.social_getting_data = false;
			FXPlanet.social_user = FXPlanet.social_name = FXPlanet.social_signed_token = FXPlanet.social_proxied_email = FXPlanet.social_email = FXPlanet.social_sex = "";
			if (reply._resultStr!="WU_OK" || reply.user=="")
				return;
			FXPlanet.social_user = reply.user;
			FXPlanet.social_signed_token = reply.signed_token;
			FXPlanet.social_proxied_email = reply.proxied_email;
			FXPlanet.social_email = reply.email;
			FXPlanet.social_sex = reply.sex;
			FXPlanet.MakeNick(reply.first_name,reply.last_name,function(reply) {
				FXPlanet.social_name=reply.Suggestions[0];
				if (typeof callback === 'function')
					callback();
			});
		});	
};

// Hace login en la plataforma con el usuario actual de fb
FXPlanet.SocialLogin = function(create_if_necessary,page)
{
	if (page==null)
		page = "";
	FXPlanet.doing_login = true;
	FXPlanet.AjaxCallEx("ajax/social_login.php", { social_id: FXPlanet.social_user, social_signed_token: FXPlanet.social_signed_token, social_network_prefix: FXPlanet.social_network_prefix }, function(reply) {
		FXPlanet.doing_login = false;
		// el usuario plataforma ya fue creado a partir de su id facebook
		if (reply._resultStr=="WU_OK") {
			user_hash_passw = "";
			FXPlanet.social_user_logged = true;
			FXPlanet.User.uid = reply.UserId;
			FXPlanet.Event.trigger("login",reply.UserMail,reply.Alias,reply.Country,reply.CountryBirth,reply.UserId,page);
			report_bug_url = "https://juegos.fxinteractive.comapplication/report_bug.php?bug_key="+reply.bug_key+"&email="+reply.UserMail+"&alias="+reply.Alias;
			$('#report_bug > [name=clave]').val(reply.bug_key);
			$('#report_bug > [name=email]').val(reply.UserMail);
			$('#report_bug > [name=alias]').val(reply.Alias);
			FXPlanet.AjaxCallEx("ajax/register_game.php", {game_id: game_id, referer:FXPlanet.Referer, tag:FXPlanet.Tag }, function(reply) {});
			FXPlanet.CallLauncherSafe("login_social?socialid="+FXPlanet.social_user+"&network="+"FB"+"&token="+FXPlanet.social_signed_token+"&no_reconnect=1");
			FXPlanet.CallLauncherSafe("notify?data=pass_"+FXPlanet.social_signed_token);
			return;
		}
		if (!create_if_necessary)
			return;
		// el usuario plataforma no ha sido creado a partir de su id facebook; lo creamos ahora
		FXPlanet.doing_login = true;
		DebugLog("SocialLogin creando cuenta por "+reply._resultStr);
		FXPlanet.AjaxCallEx("ajax/is_mail_available.php", { mail: FXPlanet.social_email }, function(reply) {
			var func_create = function(nick_fb) {
				data = FXPlanet.CallLauncher("get_machine_id");
				machine = data.Result && data.Result!="Error" ? data.Reply : "";
				FXPlanet.AjaxCallEx("ajax/social_create_user.php", { social_id: FXPlanet.social_user, alias: nick_fb, email: FXPlanet.social_email,
					sex: FXPlanet.social_sex, language: FXPlanet.locale, validated: "yes", machine: machine, tag:FXPlanet.Tag, referer:FXPlanet.Referer }, function(reply) {
					FXPlanet.doing_login = false;
					if (reply._resultStr=="WU_OK") {
						FXPlanet.SocialLogin(false,page);
						FXPlanet.SendStat("has_ever_signedup","web_new_user_signedup",{ social:1 });
					}
					else if (reply._resultStr=="WC_ERROR_USED_USERMAIL") {
						FXPlanet.social_create_user_just_failed = true;
						ShowMessage('Atención','Ya hay un usuario registrado con el Email de tu cuenta Facebook.<br/><br/>Haz clic <a href="#" name="js_goto_login">aqu&iacute;</a> para entrar con tu Email y contrase&ntilde;a.',false);
					}
					else
						ShowMessage('Atención',reply._resultMsg);
				});
			};
			if (reply._resultStr!="WU_OK" && reply._resultStr=="WC_ERROR_USED_USERMAIL")
				func_create(""); // Email del user fb ya existe en plataforma; social_create_user.php los auto-asociara
			else
				OpenWindow('win_crear_cuenta_nm_fb.php',function() {
					FXPlanet.SendStat("has_ever_window_create","web_window_create_user_fb");
					$("#fb_create_nick").val(FXPlanet.social_name);
					$("#fb_create_nick").focus();
					$("[name=js_goto_login]").toggle(FXPlanet.social_network!="pixonic");
					$("#btn_yes").mousedown(function() {
						if ($("[name$=js_accept_terms]").length>0 && $("[@name=js_accept_terms]:checked").val()==undefined) {
							ShowMessage('Atención','Debes aceptar las condiciones del servicio para continuar.');
							return;
						}
						CloseWindow($(this));
						func_create($("#fb_create_nick").val());
					});
				});
		});
	});
}

FXPlanet.GetRankingUsers = function(callback)
{
	if (FXPlanet.social_network=="fb")
		ajaxGet('/fx/application/get_ranking_users.php', {}, callback);
	else {
		var result = { "uid": FXPlanet.social_user, "friends": [], "friendsInApp": [] };
		FXPlanet.Pixapi("friends.get", {}, function(data) {
			data = data["response"]["profiles"];
			FXPlanet.social_friends = data;
			for (i=0; i<data.length; i++)
				result.friends[i] = data[i]["id"];
			FXPlanet.Pixapi("friends.appUsers", {}, function(data) {
				data = data["response"]["profiles"];
				for (i=0; i<data.length; i++)
					result.friendsInApp[i] = data[i]["id"];
				if (typeof callback === 'function')
					callback(JSON.stringify(result));
			});
		});
	}
};

FXPlanet.GetNamePicture = function(social_user,callback) {
	if (FXPlanet.social_network=="fb") {
	    FB.api(String(social_user), {fields: 'name,picture'}, function(response) {
			if (response)
				callback(social_user,response.name,response.picture);
	    });
	}
	else if (FXPlanet.social_network=="pixonic") {
		setTimeout(function() {
			if (FXPlanet.social_user==social_user && typeof FXPlanet.social_data === 'object')
				callback(social_user,FXPlanet.social_data["name"],FXPlanet.social_data["pictureSmall"]);
			else
				for (i=0; i<FXPlanet.social_friends.length; i++)
					if (FXPlanet.social_friends[i]["id"]==social_user) {
						callback(social_user,FXPlanet.social_friends[i]["name"],FXPlanet.social_friends[i]["pictureSmall"]);
						return;
					}
		},1000); // userProfileNamePic no funciona si le respondo instantáneamente
	}
}

FXPlanet.ShowInviteForm = function(text,app_users_too,callback) {
	if (typeof text=="undefined" || text=="")
		text='Me gustaría que jugaras conmigo a Navy Moves y compitieramos juntos';
	if (typeof app_users_too=="undefined")
		app_users_too=false;
	if (FXPlanet.social_network=="fb") {
		arrParams = { method: 'apprequests', title: 'Invitar a jugar a Fancy Locos', message: text, data: '' };
		if (!app_users_too)
			arrParams['filters'] = ['app_non_users'];
		FB.ui(arrParams, callback);
	}
	else if (FXPlanet.social_network=="pixonic") {
		if (navigator.userAgent.indexOf("Chrome")!=-1)
			FXInstallEntertainment.Show(); // para que el navy no se pinte encima de la ventana de invitar amigos en chrome
		FXPlanet.Pixapi("invite.show", {}, callback);
	}
};

FXPlanet.SocialPublish = function(title,body,label,referralToken,image,callback) {
	image = image.replace("pruebas.fxinteractive.com","juegos.fxinteractive.com").replace(/\/\//g,'/').replace("http:/","http://");
	if (image.indexOf("/")==0)
		image = "http:/"+image;
	if (FXPlanet.social_network=="fb") {
	}
	else if (FXPlanet.social_network=="pixonic") {
		if (typeof referralToken!="object")
			FXPlanet.Pixapi("stream.post", { title: title, body: body, label: label, image: image}, callback);
		else
			FXPlanet.Pixapi("stream.postAction", { title: title, body: body, label: label, image: image, referralToken: bin2hex(json_encode(referralToken)) }, callback);
	}
};

// Inicializa datos en pixonic (en fb esto lo hace nuestra respuesta al evento auth.sessionChange)
if (FXPlanet.social_network=="pixonic") {
	FXPlanet.GetSocialData(function() {
		FXPlanet.GetRankingUsers(function(reply) {
			if (typeof NavyOnLogin != 'undefined') {
				var argument = { "uid": FXPlanet.social_user, "access_token": FXPlanet.social_signed_token};
				NavyOnLogin();
				NavyOnLogin(argument);
			}
		});
	});
	FXPlanet.Pixapi("referral.getToken", {}, function(data) {
		var token = data["response"]["token"];
		if (token!=null && token!="") {
			data = eval("("+hex2bin(token)+")");
			if ((typeof data["social_user"]!="undefined") && (typeof data["wu2_user"]!="undefined") && (typeof data["alias"]!="undefined"))
				FXPlanet.ShowVitrina(data["wu2_user"],"","");
		}
	});
}

$ = jQuery;

//<![CDATA[
// Espacio de nombres de FX
if (typeof FXPlanet!='object')
	FXPlanet = {};

FXPlanet.is_explorer = IsIE();
FXPlanet.is_plugin_installed = false;
FXPlanet.locale = "es";
FXPlanet.get_params = "";
FXPlanet.default_width = 760;
FXPlanet.default_height = 570;

var plugin_min_version = 10;
var user_logged = false;
var user_email = "";
var user_alias = "";
var user_hash_passw = "";
var user_hold_logged = true;
var user_country = "";
var user_country_birth = "";
var user_email_validated = false;
var is_checking_validated = false;
var alias_checks = 0; // contador de llamadas a is_nick_available.php
var navy_session = false;
var game_id = 0;
var current_page = "";
var overlay_next = 102;
var overlay_number = 0;
var install_state = 0; // 0 nada, 1 usuario consiente instalar, 2 descargando, 3 instalando, 4 instalado
var check_launcher_environment = false;
var gls_start = 0,
    gls_web_login = 1,
    gls_plugin = 2,
    gls_launcher_update = 3,
    gls_launcher_login = 4,
    gls_install = 5,
    gls_game_installing = 6,
    gls_game_launch = 7,
    gls_game_update = 8,
    gls_game_running = 9,
	gls_game_register = 10;
var game_launch_init = false;
var game_launch_state = 0;
var game_launch_try = 0;
var game_launch_time;
var game_launch_social_time;
var game_launch_errors = 0;
var game_launch_logged = false;
var game_launch_params = ' /SN"'+FXPlanet.social_network_prefix+'" /LANG: '+FXPlanet.locale;
if (FXPlanet.get_params.indexOf("mute_locu")!=-1)
	game_launch_params = " /mute_locu"+game_launch_params;
FXPlanet.game_name = "Game";
FXPlanet.game_name_no_space = "Game";
FXPlanet.game_launch_on_step_cb = function(step,param) { return true; };
FXPlanet.game_launch_on_update_state = function(data,text1,text2) {};
FXPlanet.game_launch_wait_for_install_folder = false;
FXPlanet.game_launch_install_folder = "";
FXPlanet.game_auto_relaunch = false;
FXPlanet.net_slow = false; // true si FXWebPlayer se descarga a menos de 100K/sec
FXPlanet.firewall_error = false;
FXPlanet.Tag = "-941,FXS-";
FXPlanet.Referer = "https://juegos.fxinteractive.com/fx/gamepriv.php?id=174";
FXPlanet.game_registered = false;
FXPlanet.game_launched = false;
FXPlanet.game_launched_playing = false;
FXPlanet.game_launched_playing_last_time = 0;
FXPlanet.game_avoid_show = new Array("not_loaded");
FXPlanet.game_launch_plugin_position = "0px";
FXPlanet.game_launch_window = "";
FXPlanet.game_launch_survive_if_possible = false;
FXPlanet.gameplayer_variable_size = false;
FXPlanet.must_confirm_exit_game = true;
FXPlanet.other_planets = new Array(); // Otros FXPlanets que tambien reaccionan al mostrar ventanas emergentes, etc.
FXPlanet.doing_login = false;
var onlogin_open_edituser = false;
var onlogin_open_shop = false;
var launcher_connecting_fb = false;
var launcher_last_time = 0;
var report_bug_url = "";
var window_width = 0;
var window_height = 0;
var window_just_closed = false;
var send_notifications = false;
var uniqid = GetCookie("uniqid")!="" ? GetCookie("uniqid") : "5eaee4f385453";
var machine_id = '';
SetCookie("uniqid",uniqid,365);
FXPlanet.stats_sent = [];
FXPlanet.vast_url = "";
FXPlanet.vast_videos = {};
FXPlanet.vast_tracking = new Array();
FXPlanet.vast_tracking_initial = new Array();

// callback para los botones de "cambiar país"
$("[name=js_edituser_birth_country],[name=js_edituser_country],[name=credits_country]").live("click",function(e) {
	window_name = $(this).attr("name");
	OpenWindow("win_select_country.php",function() {
		$("[name^=country_cell_]").live("click",function(e) {
		    var country = $(this).attr("name").substring(String('country_cell_').length);
			CloseWindow($(this));
			SetCountry(window_name,country);
		});	
	},true);
});

var arrGameNames = new Array();
arrGameNames[20] = "Navy Moves";
arrGameNames[21] = "Anubis Quest";
arrGameNames[32] = "Hollywood Monsters";

var arrCountries = new Array();
arrCountries["OTR"] = "Otro";
arrCountries["AND"] = "Andorra";
arrCountries["ARG"] = "Argentina";
arrCountries["BLZ"] = "Belice";
arrCountries["BOL"] = "Bolivia";
arrCountries["CHL"] = "Chile";
arrCountries["COL"] = "Colombia";
arrCountries["CRI"] = "Costa Rica";
arrCountries["CUB"] = "Cuba";
arrCountries["ECU"] = "Ecuador";
arrCountries["SLV"] = "El Salvador";
arrCountries["ESP"] = "Espa&ntilde;a";
arrCountries["USA"] = "Estados Unidos";
arrCountries["GIB"] = "Gibraltar";
arrCountries["GTM"] = "Guatemala";
arrCountries["GNQ"] = "Guinea Ecuatorial";
arrCountries["HND"] = "Honduras";
arrCountries["MEX"] = "M&eacute;xico";
arrCountries["NIC"] = "Nicaragua";
arrCountries["PAN"] = "Panam&aacute;";
arrCountries["PRY"] = "Paraguay";
arrCountries["PER"] = "Per&uacute;";
arrCountries["PRI"] = "Puerto Rico";
arrCountries["DOM"] = "Rep&uacute;blica Dominicana";
arrCountries["URY"] = "Uruguay";
arrCountries["VEN"] = "Venezuela";

function DebugLog(text)
{
	AppendText("debug_log","- "+text);
	if (typeof console!="undefined")
		console.log(text);
}

FXPlanet.java_version = false;
FXPlanet.GetJavaVersion = function()
{
	if (typeof FXPlanet.java_version === 'object')
		return FXPlanet.java_version;
	var obj = new Object;
	obj.version = 0;
	obj.subVersion = 0;
	obj.text = "0.0";
	obj._resultStr = "ERROR_JSON";
	// en chrome no hay forma de saber si java esta enabled (siempre dice true y saca barra de informacion al usuario)
	// en ie8 si no esta instalado, saca desagradable ventana de informacion sobre java
	if (FXPlanet.get_params.indexOf("no_java")!=-1 || navigator.appVersion.indexOf("Chrome")!=-1 || FXPlanet.is_explorer || navigator.appVersion.indexOf("Safari")!=-1) {
		FXPlanet.java_version = obj;
		return obj;
	}
	if ((typeof navigator!="undefined") && (typeof navigator.javaEnabled!="undefined") && navigator.javaEnabled() && (typeof java!="undefined"))
		obj.text = java.lang.System.getProperty("java.version");
	//else if (FXPlanet.is_explorer && IsJavaInExplorerInstalled())
	//	obj.text = "1.5"; // ya no comprobamos versión con un applet; en chrome desencadena preguntas adicionales a usuario
	//else if (!FXPlanet.is_explorer && (typeof navigator!="undefined") && (typeof navigator.javaEnabled!="undefined") && navigator.javaEnabled())
	//	obj.text = "1.5"; // ya no comprobamos versión con un applet; en chrome desencadena preguntas adicionales a usuario
	else {
		try {
			if (document.getElementById('applet_java_version')==null)
				$("body").append('<applet height="1" width="1" id="applet_java_version" codebase="/fx/public/applet" code="GetJavaVersion.class">');
			obj.text = document.getElementById('applet_java_version').GetVersion();
		}
		catch (err) {}
	}
	var dot = obj.text.indexOf(".");
	if (dot!=-1) {
		obj.version = parseInt(obj.text.substr(0,dot));
		obj.subVersion = parseInt(obj.text.substr(dot+1,dot));
		if (obj.version>0)
			FXPlanet.java_version = obj;
	}
	return obj;
}

FXPlanet.CompleteUrl = function(url)
{
	var complete_url = $.trim(url);
	if (complete_url.indexOf("/fx/application/")!=0 && complete_url.indexOf("http://")==-1)
		complete_url = "/fx/application/"+url;
	return complete_url;
}

FXPlanet.next_call_sync = false;
FXPlanet.AjaxCall = function(url,params,callback,cb_error,trace)
{
	var cb = callback;
	complete_url = url;
	if (complete_url.indexOf("/fx/application/")!=0 && complete_url.indexOf("http://")==-1)
		complete_url = "/fx/application/"+url;
	// compatibilidad con arrays unidimensionales
	for (var i in params)
		if (typeof params[i]=='object') {
			//for (var j in params[i])
			for (var j=0; j<params[i].length; j++)
				params["arr_"+j+"_"+i] = params[i][j];
			params[i] = "";
		}
	$.ajax({
		type: 'POST',
		url: FXPlanet.CompleteUrl(url),
		data: params,
		success: function(xml) {
			if (trace==undefined || trace)
				DebugLog(url+"->"+xml.replace(/\n/g, ' '));
			if (user_logged && !FXPlanet.doing_login && GetXMLData(xml,"error")=="WC_ERROR_NO_SESSION") {
				DebugLog("reintentando login por WC_ERROR_NO_SESSION");
				user_logged = false;
				if (!FXPlanet.social_user_logged)
					FXPlanet.Login(user_email,"",user_hash_passw,user_hold_logged);
				else
					FXPlanet.SocialLogin(false);
			}
			if (typeof cb === 'function') cb(xml);
		},
		error: function(jqXHR, textStatus, errorThrown)
		{
			if (cb_error!=undefined)
				cb_error();
			DebugLog(url+json_encode(params)+"-> error: "+textStatus+"-"+errorThrown);
		},
		async: !FXPlanet.next_call_sync,
		dataType: "text"
	});
	FXPlanet.next_call_sync = false;
};

FXPlanet.AjaxCallEx = function(url,params,callback,cb_error,trace)
{
	var cb_ex = function(reply) {
		var obj;
		try { obj = eval(reply); } catch(err) { obj = new Object; obj._resultStr = "ERROR_JSON"; };
		if (typeof callback === 'function') callback(obj);
	};
	FXPlanet.AjaxCall(url,params,cb_ex,cb_error,trace);
};

FXPlanet.SendStat = function(cookie_name,stat_name,additional_params,callback)
{
	if (SearchArray(FXPlanet.stats_sent,stat_name)!=-1) {
		if (typeof callback==='function') callback();
		return;
	}
	FXPlanet.stats_sent.push(stat_name);
	if (cookie_name==undefined || cookie_name=="" || cookie_name==null || GetCookie(cookie_name)!="yes") {
		var arrParams = { Type: stat_name, Referer:FXPlanet.Referer, Tag:FXPlanet.Tag, UniqId: uniqid };
		if (machine_id!='')
			arrParams['machine_id'] = machine_id;
		if (typeof additional_params=='object')
			for (var i in additional_params)
				arrParams[i] = additional_params[i];
		FXPlanet.AjaxCallEx("ajax/send_stat.php",arrParams,callback);	
	}
	else if (typeof callback==='function')
		callback();
	if (cookie_name!=undefined && cookie_name!="" && cookie_name!=null)
		SetCookie(cookie_name,"yes");
};

function WindowCenter(overlay_name,animate)
{
	var width = $("#"+overlay_name+"_content > div").css("width");
	var height = $("#"+overlay_name+"_content > div").css("height");
	if (isNaN(parseInt(width)) || parseInt(width)==0) width="650px"; // en opera y safari las líneas de arriba no son muy fiables
	if (isNaN(parseInt(height)) || parseInt(height)==0) height="500px";
	var show_on_top = $("#"+overlay_name+"_box").hasClass("no_auto_center");
	$("#"+overlay_name+"_box").attr("width",width);
	$("#"+overlay_name+"_box").attr("height",height);
	$("#"+overlay_name+"_content").attr("width",width);
	$("#"+overlay_name+"_content").attr("height",height);
	$("#"+overlay_name+"_box > .overlay_boxclose").css("left",parseInt(width)-52);
	var left = Math.max(0,(GetWindowWidth()-parseInt(width))/2); // +overlay_number*20
	var top = show_on_top ? 0 : Math.max(13,(GetWindowHeight()-parseInt(height))/3); // +overlay_number*20
	if (!animate)
		$("#"+overlay_name+"_box").stop(true,true).css("top",top+"px");
	else
		$("#"+overlay_name+"_box").stop(true,true).animate({"top":top+"px"},500);
	$("#"+overlay_name+"_box").css("left",left+"px");
	$("#"+overlay_name+"_box").css("right",left+"px");
}

function GamePlayerSetDefaultSize()
{
	if (!FXPlanet.gameplayer_variable_size) {
		$("#gameplayer_frame").css("width",FXPlanet.default_width+"px");
		$("#gameplayer_frame").css("height",FXPlanet.default_height+"px");
	}
	else { // en el abu, el tamano de la pantalla del juego es proporcional a la ventana del navegador
		var max_height = Math.max(384,window_height-45);
		var max_width = window_width-20;
		max_height = Math.min(max_height,max_width*3/4)|0;
		max_width = Math.min(max_width,max_height*16/9)|0;
		$("#gameplayer_frame").css("height",max_height+"px");
		$("#gameplayer_frame").css("width",max_width+"px");
	}
}

function CenterWindowsPeriodic()
{
	if (window_width!=GetWindowWidth() || window_height!=GetWindowHeight()) {
		window_width = GetWindowWidth();
		window_height = GetWindowHeight();
		$(".overlay_box").each(function(index) {
			var name = $(this).attr("name");
			if (name.indexOf("_box")==name.length-4) {
				name = name.slice(0,name.length-4);
				WindowCenter(name,false);
			}
		});
		if (!FXInstallEntertainment.is_launched)
			GamePlayerSetDefaultSize();
		//$("#Banner").toggleClass("Banner_Narrow",window_height<650 || FXPlanet.social_network=="pixonic");
		//$("#Banner").toggleClass("Banner",window_height>=650 && FXPlanet.social_network!="pixonic");
	}
	setTimeout(CenterWindowsPeriodic,1000);
}

function GetWindowClass(url)
{
	var url_begin_length = url.indexOf(".");
	var window_class = url.slice(0,url_begin_length==-1?url.length:url_begin_length);
	window_class = window_class.replace(/\//g,'_');
	return window_class;
}

FXPlanet.close_window_cbs = {};
FXPlanet.windows_urls = {};

function OpenWindow(url,callback,closable,show_on_top,no_repeat/*opcional*/,cb_close/*opcional*/,no_animate/*opcional*/)
{
	// añade un div al DOM, sobre el que se cargará el html que haya en la url especificada
	url = $.trim(url);
	var overlay_name = "overlayframe"+overlay_next;
	var no_auto_center = show_on_top ? " no_auto_center" : "";
	var no_animate = no_animate ? " no_animate" : "";
	var window_class = GetWindowClass(url);
	var window_classes = "overlay_box "+window_class+no_auto_center+no_animate;
	FXPlanet.close_window_cbs[window_class] = (typeof cb_close==='function') ? cb_close : (function(){});
	FXPlanet.windows_urls[window_class] = url;
	if ((no_repeat===null || no_repeat===true || no_repeat===undefined) && $("."+window_class).length>0 && !$("."+window_class).hasClass("closing"))
		return ''; // evita abrir varias veces la misma ventana
	$("body").prepend(
		'<div class="'+window_classes+'" id="'+overlay_name+'_box" name="'+overlay_name+'_box" style="z-index: '+overlay_next+'; display:none; position:absolute;" width="730" height="548">'+
		'<a class="overlay_boxclose" id="'+overlay_name+'_boxclose" name="'+overlay_name+'_boxclose" style="z-index: '+(overlay_next+1)+';"></a>'+
		'<div id="'+overlay_name+'_content" style="position:relative;"></div>'+
		'</div>');
	
	overlay_next = overlay_next+2;
	var cb_result = callback==null ? (function(){}) : callback;
	if (closable===null || closable===false || closable===undefined)
		$("a[name="+overlay_name+"_boxclose]").css("display","none");
	window_just_closed = false;
	DebugLog("OpenWindow "+window_class);
	// carga el html de la url especificada, y muestra centrado el resultado
	$("#"+overlay_name+"_content").load(FXPlanet.CompleteUrl(url),function() {
		if (!FXPlanet.is_explorer || GetIEVersion()>6) {
			if ($("#overlay").length==0) {
				var overlayColor = FXPlanet.get_params.indexOf("from_fb=1")!=-1 ? "#FFF" : "#000";
				$("body").prepend('<div class="overlay" id="overlay" style="display:none; position:fixed; top:0px; bottom:0px; left:0px; right:0px; z-index:100; background-color: '+overlayColor+'; -moz-opacity: 0.75; opacity:0.75; filter: alpha(opacity=75);"></div>');
			}
			if (FXPlanet.is_explorer)
				$("#overlay").show();
			else
				$("#overlay").fadeIn("fast",function() {}); // por algún motivo el fadeIn de jquery no funciona en internet explorer
			$("#"+overlay_name+"_box").css("position","fixed");
		}
		WindowCenter(overlay_name,!no_animate);
		$("#"+overlay_name+"_box").show();
		overlay_number++;
		if (true) { // Antes comprobaba overlay_number <=, pero a veces es incorrectamente mayor de lo normal
	   		FXPlanet.GameLaunchShowOrHide(); // para que no se pinten juego / flashes encima de ventanas jquery
   		}
		cb_result(overlay_name);
		$("a[name$=_boxclose]").live("click",function(e) {
			window_just_closed = true;
			CloseWindow($(this));
		});
		FXInstallEntertainment.HideVideo();
	});
	return overlay_name;
}

function CloseWindow(jq_element)
{
	jq_element.each(function(index) {
		element = this;
		while (element && !$(element).hasClass("overlay_box"))
			element = element.parentNode;
		if (element) {
			$(element).addClass("closing");
			var anim_time = $(element).hasClass("no_animate") ? 0 : 500;
			$(element).stop(true,true).animate({"top":"-1000px"},anim_time,function() {
				DebugLog("CloseWindow");
				for(var class_name in FXPlanet.close_window_cbs) { // llama al callback de cerrar
					if ($(this).hasClass(class_name)) {
						FXPlanet.close_window_cbs[class_name]();
						delete FXPlanet.close_window_cbs[class_name];
					}
				}
				$(this).remove();
				overlay_number = Math.max(0,overlay_number-1); // [TODO] Es posible que disminuya 2 veces, al cerrar misma ventana varias veces en animación
				if ($(".overlay_box").length==0) {
					if (!FXPlanet.is_explorer || GetIEVersion()>6)
						if (FXPlanet.is_explorer)
							$("#overlay").hide();
						else
							$("#overlay").fadeOut("fast"); // por algún motivo el fadeIn de jquery no funciona en internet explorer
					FXPlanet.GameLaunchShowOrHide();
				}
			});
		}
	});
}

function CloseAllWindows()
{
	CloseWindow($(".overlay_box"));
}

function CloseWindows()
{
	var jq_selector = "";
    for (var i=0; i<CloseWindows.arguments.length; i++) {
    	if (i>0)
    		jq_selector = jq_selector+",";
		var window_class = GetWindowClass(CloseWindows.arguments[i]);
    	jq_selector = jq_selector+"."+window_class;
    }
	CloseWindow($(jq_selector));
}

FXPlanet.OpenWindow = OpenWindow;
FXPlanet.CloseWindows = CloseWindows;

function CloseLoginWindows()
{
	CloseWindows("win_crear_cuenta_nm_plataforma.php","win_login_nm_plataforma.php","win_forgot_password.php","win_crear_cuenta_nm_fb.php",
		"win_instalacion_plugin_en_noexplorer_a_nv.php","win_instalacion_plugin_en_explorer_a_nv.php",
		"win_instalacion_plugin_en_explorer_b_nv.php","win_instalacion_plugin_en_explorer_c_nv.php","win_crear_cuenta_nm_fb_cuenta_previa_nm.php");
}

function IsAnyLoginWindow()
{
	var jq_selector = ".win_crear_cuenta_nm_plataforma,.win_login_nm_plataforma,.win_forgot_password,.win_crear_cuenta_nm_fb,"+
		".win_instalacion_plugin_en_noexplorer_a_nv,.win_instalacion_plugin_en_explorer_a_nv,.win_instalacion_plugin_en_explorer_b_nv,"+
		".win_instalacion_plugin_en_explorer_c_nv,.win_crear_cuenta_nm_fb_cuenta_previa_nm";
	var num_login_windows = 0;
	$(jq_selector).each(function(index) { num_login_windows++; });
	return num_login_windows>0;
}

function IsAnyWindow(url)
{
	var num_windows = 0;
	$("."+GetWindowClass(url)).each(function(index) { num_windows++; });
	return num_windows>0;
}

function ShowMessage(title,text,closable,show_cb,close_cb)
{
	if (game_id!=20 && game_id!=21) // en web de edicion que no quieren estos mensajes
		return;
	if (closable===null || closable===undefined)
		closable = true;
	text = text.replace(/\n/g,'<br/>');
	overlay_name = OpenWindow('win_message.php?title='+bin2hex(utf8_encode(title))+'&text='+bin2hex(utf8_encode(text)),function() {
		size = Math.min(32,35-0.3*title.length)|0;
		$("#overlay_message_title").css('font-size',size+'px');
		OnWindowBlur();
		if (typeof show_cb==='function') show_cb();
		$(".overlay_boxclose").click(function() { CloseWindow($(this)); if (typeof close_cb==='function') close_cb(); });
	},closable,false,false);
	return overlay_name;
}

function ConfirmDialog(title,text,ok_cb,cancel_cb)
{
	if (game_id!=20 && game_id!=21) // en web de edicion que no quieren estos mensajes
		return;
	overlay_name = OpenWindow('win_confirm.php?title='+bin2hex(utf8_encode(title))+'&text='+bin2hex(utf8_encode(text)),function() {
		size = Math.min(32,35-0.3*title.length)|0;
		$("#overlay_message_title").css('font-size',size+'px');
		$("#btn_yes").click(function() { CloseWindow($(this)); if (typeof ok_cb === 'function') ok_cb(); });
		$("#btn_no").click(function() { CloseWindow($(this)); if (typeof cancel_cb === 'function') cancel_cb(); });
		$("#overlay_boxclose").click(function() { CloseWindow($(this)); if (typeof cancel_cb === 'function') cancel_cb(); });
	});
}

function ShowMessageValidateEmail(closable)
{
	OpenWindow('win_validar_email.php',function() {
		if (closable===false)
			$("[name=js_validate_later]").hide();
		ChangeText("js_validate_email",user_email);
		$("[name=js_validate_later]").click(function() { CloseWindow($(this)); });
		$("[name=js_validate_resend]").click(function()
		{
			FXPlanet.AjaxCall("ajax/send_validation_email.php", {}, function(xml) {
				if (GetXMLData(xml,"result")!="ok")
					ShowMessage('Atención','Error al reenviar Email. Intentalo de nuevo mas adelante.');
				else
					ShowMessage('Email reenviado','Hemos vuelto a enviar tu Email de validación.');
			});	
		});
		$("[name=js_validate_change_email]").click(function(e) {
		    OpenWindow("win_editar_cuenta_email.php",function() {
				// validando mail del usuario: el usuario seguramente quiera cambiar email
				$("[name=js_edituser_email]").val(user_email);
		    },true);
		});
	});
}

// Obtiene la información (id, nombre...) del usuario actualmente logueado en facebook; opcionalmente, hace login con este usuario
function FBGetData(do_fx_login,create_if_necessary,page)
{
	DebugLog("FBGetData "+create_if_necessary);
	FXPlanet.GetSocialData(function() {
		if (!do_fx_login)
			FBCheck();
		else
			FXPlanet.SocialLogin(create_if_necessary,page);
	});	
}

function ConnectWithFacebookDialog(tip, login_cb) {
	ConfirmDialog('CONECTA CON FACEBOOK',
		((typeof tip !== 'undefined' && tip) ? tip :
		'Si conectas '+FXPlanet.game_name+' con Facebook dispondr&aacute;s de nuevas opciones: ' +
		'Ranking de tus amigos, publicar tus trofeos en el muro, retar a tus amigos a trav&eacute;s de Facebook, etc') +
		'¿Quieres conectar '+FXPlanet.game_name+' con Facebook?',
		function() {
			FB.login(login_cb, {scope: 'email'});
		}, function() {
			FXPlanet.User.setConnectedToFacebook(false);
			if (typeof login_cb === 'function') login_cb({});
		});
}

// asocia la cuenta facebook con la cuenta de la plataforma
function FXSetUserFB() {
	FXPlanet.AjaxCall("ajax/fb_set_user_fb.php", { fb_id: FXPlanet.social_user }, function(xml) {
		if (GetXMLData(xml,"result")=="ok") {
			ShowMessage('Facebook',"La cuenta Facebook "+FXPlanet.social_email+" ha sido asociada a "+FXPlanet.game_name+".");
			$("#accesos_fb_connect").hide();
			$("#accesos_ranking").show();
			FXPlanet.User.setConnectedToFacebook(true);
		} else if (GetXMLData(xml,"error")=='WC_ERROR_USED_ID') {
			alert("No se ha asociado la cuenta Facebook a "+FXPlanet.game_name+".\n\nLa cuenta Facebook ya está asociada a otra cuenta "+FXPlanet.game_name+".");
		} else {
			alert("No se ha asociado la cuenta Facebook a "+FXPlanet.game_name+".\n\nInténtalo de nuevo más adelante.");
		}
		//FBAskPermissionsIfNeeded();
	});
}

// A llamar cuando cambie el usuario actualmente logueado en facebook/fx: comprueba asociación de cuentas, y que nos ha dado permisos
function FBCheck()
{
	DebugLog("FBCheck "+FXPlanet.social_user);
	if (!user_logged || FXPlanet.social_network!="fb")
		return;
	if (FXPlanet.social_user=="") { // web no tiene login fb, mostrar botón fb para hacer login
		$("#accesos_fb_connect").show();
		$("#accesos_ranking").hide();
		return;
	}
	FXPlanet.social_checking = true;
	FXPlanet.AjaxCallEx("ajax/fb_get_fb.php", {}, function(reply) {
		FXPlanet.social_checking = false;
		if (reply._resultStr=="WC_ERROR_NO_SESSION")
			return;
 		FXPlanet.social_fxuser_id = reply.SocialId===undefined || reply.SocialId=="0" ? "" : reply.SocialId;
 		// el usuario fx tiene login sin fb; web tiene fb; mostrar botón fb para asociarlos
		$("#accesos_fb_connect").toggle(FXPlanet.social_fxuser_id=="" || FXPlanet.social_fxuser_id!=FXPlanet.social_user);
		$("#accesos_ranking").toggle(FXPlanet.social_fxuser_id!="" && FXPlanet.social_fxuser_id==FXPlanet.social_user);
		if (FXPlanet.social_fxuser_id!="" && FXPlanet.social_fxuser_id==FXPlanet.social_user)
			FXPlanet.User.setConnectedToFacebook(true);
		else if (FXPlanet.social_fxuser_id=="" && FXPlanet.social_email==user_email)
			FXSetUserFB();
		else if (FXPlanet.social_want_to_connect)
			OpenWindow('win_crear_cuenta_nm_plataforma_conexion_fb.php',function() {
				$("#btn_yes").mousedown(function() { CloseWindow($(this)); FXSetUserFB(); });
				$("#btn_no").mousedown(function() { CloseWindow($(this)); });
			});
		//	FBAskPermissionsIfNeeded();
	});
}

FXPlanet.IsPluginInstalled = function ()
{
	if (FXPlanet.is_plugin_installed)
		return true;
	if (FXPlanet.is_explorer) {
		FXPlanet.is_plugin_installed = IsPluginActiveXInstalled();
	}
	else {
		navigator.plugins.refresh();
		for (i=0; i<navigator.plugins.length; i++)
			if (navigator.plugins[i].filename=="npfxplanet.dll") {
				FXPlanet.is_plugin_installed = true;
				break;
			}
	}
	return FXPlanet.is_plugin_installed;
}

FXPlanet.IsFlashInstalled = function ()
{
	var hasFlash = false;
	try {
		var fo = (navigator.mimeTypes && navigator.mimeTypes['application/x-shockwave-flash']) ? navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin : 0;
		if (fo)
			hasFlash = true;
	}catch(e) {
		if (navigator.mimeTypes ['application/x-shockwave-flash'] != undefined)
			hasFlash = true;
	}
	return hasFlash;
}

function SetCountry(Obj, Value, reload_pfx)
{
	$("[name="+Obj+"]").val(Value);
	$("[name="+Obj+"_flag]").attr("src","/fxplanet/public/images/icon_flag_"+Value+"_022x016.gif");
	ChangeText(Obj+"_name",arrCountries[Value]+"&nbsp;",false);
	var user_country_old = user_country;
	if (Obj=="js_edituser_country")
		user_country = Value;
	else if (Obj=="js_edituser_birth_country")
		user_country_birth = Value;
	if (reload_pfx===undefined || reload_pfx) {
		user_country = Value;
		FXPlanet.AjaxCallEx("ajax/set_user_info.php", { country: user_country });
		if (IsAnyWindow("win_pfx.php")) {
			CloseWindows("win_pfx.php");
			FXPlanet.OpenPfxWindow();
		}
		if (IsAnyWindow("win_navy_item.php")) {
			var url = FXPlanet.windows_urls[GetWindowClass("win_navy_item.php")].replace("country="+user_country_old,"country="+user_country);
			CloseWindows("win_navy_item.php");
			OpenWindow(url,FXPlanet.PfxWindowCallback,true,false,false,true);
		}
	}
}

function PluginCall(command,params,auto_add)
{
	var plugin = FXPlanet.is_explorer ? document.getElementById('fxplanet_object') : document.getElementById('fxplanet_embed');
	if (plugin==null) {
		if (!FXPlanet.IsPluginInstalled() || $("#gameplayer_frame").length>0) {
			result = new Object;
			result.Result = "Error";
			return result;
		}
		DebugLog("PluginCall activando plugin")
		$("body").prepend(
			'<object id="fxplanet_object" classid="clsid:{909993D2-766A-4199-A8F4-B60083619D93}" codebase="https://juegos.fxinteractive.comapplication/game_start.php?Type=web_fxwebplayer_click&goto=http%3A%2F%2Fdownloadnavy.fxinteractive.com%2Fwu_updates_public%2Fstats%2FFXWebPlayer.exe" style="position:absolute; top:-2000px; left:0px; width:100%; height:100%;">'+
			'<embed id="fxplanet_embed" style="position:absolute; top:0px; left:0px; width:100%; height:100%;" pluginspage="https://juegos.fxinteractive.comapplication/game_start.php?Type=web_fxwebplayer_click&goto=http%3A%2F%2Fdownloadnavy.fxinteractive.com%2Fwu_updates_public%2Fstats%2FFXWebPlayer.exe" type="application/fxplanet"></embed>'+
			'</object>');
		plugin = FXPlanet.is_explorer ? document.getElementById('fxplanet_object') : document.getElementById('fxplanet_embed');
	}
	return PluginCallInner(command,params,plugin);
};

function PluginCallInner(command,params,plugin)
{
	if (params==null)
		params = "";
	var result;
	try {
		resp = plugin.Process('{"Command":"'+command+'"'+params+'}');
		result = jQuery.parseJSON(resp);
		if (result === null)
			DebugLog("ERROR en plugin.Process: "+resp);
	}
	catch(err) {
		result = new Object;
		result.Result = "Error";
	}
	return result;
};

FXPlanet.launcher_notifs_interval = 0;
FXPlanet.launcher_notifs_cb = null;
FXPlanet.SetLauncherNotificationsCallback = function(cb)
{
	if (FXPlanet.launcher_notifs_interval) {
		clearInterval(FXPlanet.launcher_notifs_interval)
		FXPlanet.launcher_notifs_interval = 0;
	}
	if (typeof cb==='function') {
		FXPlanet.launcher_notifs_cb = cb;
		var cb_notifs = function() {
			var data = FXPlanet.CallLauncher("notifications");
			if (data!=null && data.Result && data.Result!="Error")
				for (var i=0; i<data.Notifications.length; i++)
					FXPlanet.launcher_notifs_cb(data.Notifications[i]);
		}
		FXPlanet.launcher_notifs_interval = window.setInterval(cb_notifs,500);
	}
}


FXPlanet.CallLauncher = function(call)
{
	call = call.replace(/\\/gi,'\\\\').replace(/\"/gi,'\\\"');
	var data = PluginCall("LauncherCall",',"Call":"'+call+'"');
	if (data && data.Result && data.Result!="Error")
		launcher_last_time = (new Date()).getTime();
	return data;
};

FXPlanet.CallLauncherIPCCom = function(type,data)
{
	var data = PluginCall("LauncherIPCCom",',"Type":"'+type+'","Data":"'+data+'"');
	if (data && data.Result && data.Result!="Error")
		launcher_last_time = (new Date()).getTime();
	return data;
};

FXPlanet.CallLauncherSafe = function(call,callback)
{
	//DebugLog("LauncherCall: "+call);
	//var cb_result = callback==null ? (function(data){}) : callback;
	//cb_result(FXPlanet.CallLauncher(call));
	
	DebugLog("LauncherCall: "+call);
	var cb_result = callback==null ? (function(data){}) : callback;
	var tries = 10;
	var cb = function() {
		var data = FXPlanet.CallLauncher(call);
		if (data && (typeof data.Result!="undefined") && data.Result!="Error" || (--tries)<0)
			cb_result(data);
		else
			setTimeout(cb,250);
	};
	cb();
};

function OpenCreateUserWindow()
{
	if (FXPlanet.social_canvas)
		ShowMessage('Error','Error de conexión con el servidor');
	else {
		FXPlanet.SendStat("has_ever_window_create","web_window_create_user");
		OpenWindow("win_crear_cuenta_nm_plataforma.php");
	}
}

function OpenLoginWindow(callback)
{
	if (FXPlanet.social_canvas)
		ShowMessage('Error','Error de conexión con el servidor');
	else
		OpenWindow("win_login_nm_plataforma.php",callback);
}

function OpenEditUserWindow(show_email_pass,closable)
{
	if (!user_logged)
		return; // antes sacaba la ventana de login si no estabas logueado, pero daba problemas (luego iba a salir una "mejor")
	OpenWindow("win_editar_cuenta_plataforma.php",function() {},closable===undefined || closable);
}

FXPlanet.OpenFolderWindow = function(title)
{
	FXPlanet.CallLauncher("show_folder_selection?title="+title+"&nonewfolder=1");
	FXPlanet.game_launch_wait_for_install_folder = true;
}

FXPlanet.OpenPfxWindowMethod = function(id_pfx,pay_method,obj)
{
	obj = (obj==null || typeof obj=="undefined") ? new Object : obj;
	FXPlanet.transaction_data = obj;
	FXPlanet.transaction_id_pfx = id_pfx;
	var email = user_email!='' ? user_email : GetCookie('user_email');
	var url_extra = obj.url_extra==undefined ? "" : obj.url_extra;
	var item = obj.item==undefined ? "" : obj.item;
    if (pay_method.indexOf("pay_trialpay")!=-1)
    	FXPlanet.OpenTrialPayWindow(url_extra);
    else if (pay_method.indexOf("pay_superrewards")!=-1)
    	FXPlanet.OpenSuperRewardsWindow();
    else if (pay_method.indexOf("pay_facebook_credits")!=-1)
    	FXPlanet.OpenFacebookCredits(id_pfx,obj);
	else if (pay_method.indexOf("pay_paypal")!=-1 || pay_method.indexOf("pay_visa")!=-1 || pay_method.indexOf("pay_paysafecard")!=-1 || pay_method.indexOf("pay_boa")!=-1) {
		var currency = pay_method.indexOf("_usd")!=-1 ? "USD" : "EUR";
		var url = "https://juegos.fxinteractive.com/fxplanet/application/visa_paypal_go.php?email="+bin2hex(email)+"&nick="+user_alias+"&game="+game_id+"&product_index="+id_pfx+"&currency="+currency+"&language="+FXPlanet.locale+"&shop="+pay_method;
		if (typeof obj=="object")
			for (var prop in obj)
				url = url+"&"+prop+"="+obj[prop];
		var mywindow = window.open(url,'puntosFX','width=950,height=510,scrollbars=yes,resizable=1');
		if (navigator.userAgent.indexOf("Chrome")==-1)
			mywindow.moveTo(75,0);
	}
	else if (pay_method.indexOf("pay_pixonic")!=-1) {
		var method = pay_method.slice(pay_method.indexOf("pay_pixonic")+String("pay_pixonic_").length);
		var title = "-"+method+"-"+id_pfx+"-"+item;
		var url_extra = obj.url_extra==undefined ? "" : obj.url_extra;
		FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Store.OpenTransaction", ArticleId: 7, Game: game_id, CallbackHex2Bin: url_extra }, function(reply) {
			if (reply._resultStr!="WU_OK")
				ShowMessage('Servicio en mantenimiento',"Este servicio está en mantenimiento.<br/><br/>Vuelve a intentarlo más tarde.<br/><br/>");
			else
				FXPlanet.Pixapi("client.initiatePayment", { orderId:reply.Id, title:title }, function(data) {});
		});
	}
	else if (pay_method.indexOf("pay_sms")!=-1 && FXPlanet.get_params.indexOf('mobiadvance')!=-1) {
		FXPlanet.AjaxCallEx("ajax/mobiadvanced_get_form.php", { item:(item==''?'pfx':item) }, function(reply) {
			if (reply._resultStr!="WU_OK")
				ShowMessage('Servicio en mantenimiento',"Este servicio está en mantenimiento.<br/><br/>Vuelve a intentarlo más tarde.<br/><br/>");
			else
				eval(reply.js);
		});
	}
	else {
		// sacar ventana flotante con el método de pago correspondiente, y esperar a que termine
		var url = pay_method.indexOf("pay_phone")!=-1 ? "win_pfx_phone.php" :
		          pay_method.indexOf("pay_toditocard")!=-1 ? "win_pfx_todito.php" :
		          "win_pfx_sms.php?country="+user_country+"&item="+item+"&package="+id_pfx;
		OpenWindow(url,function() {},true);
	}
}

FXPlanet.PfxWindowCallback = function(text)
{
	if (text!=undefined)
		$("#credits_text1").html(text);
	$("[name=credits_country]").val("ESP");	
	if (user_email=="" && FXPlanet.social_user_logged)
		ChangeText("credits_email","tu Email v&iacute;a Facebook");
	else
		ChangeText("credits_email",user_email);
	SetCountry("credits_country",user_country,false);
	$("#credits_edituser,#tasks_login").click(function(e) {
		OpenEditUserWindow(false);
	});
	var win_pfx_update = function() {
		if (!IsAnyWindow("win_pfx.php") && !IsAnyWindow("win_navy_item.php"))
			return;
		FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Web.GetNotifications" }, function(reply) {
			if (reply._resultStr=="WU_OK")
				for (var i=1; i<99; i++) {
					if (typeof reply[i+'']=="undefined")
						break;
					// auto-cerrar ventana con mensaje, si la plataforma ha recibido el sms
					if (reply[i+''].indexOf("sms_transaction(")!=-1) {
						num_pfx = reply[i+''].slice(String('sms_transaction(').length,reply[i+''].length-1);
						CloseWindows("win_pfx_sms.php");
						ShowMessage('Recarga de puntosFX',"SMS recibido. Ahora tienes "+num_pfx+" puntosFX");
					}
					// 
					else if (reply[i+''].indexOf("transaction")!=-1) {
						CloseWindows("win_pfx.php","win_pfx_code.php","win_navy_item.php");
						FXPlanet.CallLauncher("notify?data=rejoin");
				   		FXPlanet.CallLauncher("notify?data=update_shop");
					}
				}
			setTimeout(win_pfx_update,2000);
		});
	};
	win_pfx_update();
};

FXPlanet.OpenPfxWindow = function(cb_close,text)
{
	if (!user_logged)
		//	GameExit(null,function() { OpenLoginWindow(); });
		return;
	var network = FXPlanet.social_canvas ? FXPlanet.social_network_prefix : "fx";
	OpenWindow("win_pfx.php?country="+user_country+"&network="+network+"&user="+FXPlanet.User.uid,function(){ FXPlanet.PfxWindowCallback(); },true,true,false,cb_close);
	onlogin_open_shop = false;
}

FXPlanet.OpenTrialPayWindow = function(cb_close,url_extra)
{
	url_extra = typeof url_extra=="undefined" ? "" : url_extra;
	FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Store.OpenTransaction", ArticleId: 7, Game: game_id, CallbackHex2Bin: url_extra }, function(reply) {
		if (reply._resultStr!="WU_OK")
			ShowMessage('Servicio en mantenimiento',"Este servicio está en mantenimiento.<br/><br/>Vuelve a intentarlo más tarde.<br/><br/>");
		else {
	    	var url_trial_pay = 'http://www.trialpay.com/dispatch/ad90bb3b15ea5983fe01c81e9f575f06?'+"sid="+reply.Id;
		    OpenWindow("win_frame_2.php?width=620&height=640&url="+bin2hex(url_trial_pay),null,false,false,cb_close);
		}
	});
}


FXPlanet.OpenFacebookCredits = function(id,obj)
{
	var url_extra = obj.url_extra==undefined ? "" : obj.url_extra;
	var item = obj.item==undefined ? "" : obj.item;
	var package = obj.package==undefined ? id : obj.package;
	ArrayAddIfNotExist(FXPlanet.game_avoid_show,"fb_credits");
	FXPlanet.GameLaunchShowOrHide();
	FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Store.OpenTransaction", ArticleId: 7, Game: game_id, CallbackHex2Bin: url_extra }, function(reply) {
		if (reply._resultStr!="WU_OK")
			ShowMessage('Servicio en mantenimiento',"Este servicio está en mantenimiento.<br/><br/>Vuelve a intentarlo más tarde.<br/><br/>");
		else {
			var order_info = package+"-"+reply.Id+"-"+item;
			FB.ui({ method: 'pay', order_info: order_info, purchase_type: 'item' }, function(data) {
				ArrayRemove(FXPlanet.game_avoid_show,"fb_credits");
				FXPlanet.GameLaunchShowOrHide();
				//alert(json_encode(data));
				if (data['order_id'])
					return true;
				else //handle errors here
					return false;
			});
		}
    });
}

FXPlanet.GetTrophies = function(callback)
{
	if (typeof FXPlanet.arrTrophies!="undefined" && typeof FXPlanet.arrCollections!="undefined") {
		callback(FXPlanet.arrTrophies,FXPlanet.arrCollections);
		return;
	}
	FXPlanet.arrTrophies = new Array();
	FXPlanet.arrCollections = new Array();
	var locale = FXPlanet.locale=="ru" ? "en" : FXPlanet.locale;
	FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Trophies.GetCollections" }, function(reply) {
		if (reply._resultStr!='WU_OK') {
			callback(FXPlanet.arrTrophies,FXPlanet.arrCollections);
			return;
		}
		var arrCollectionIds = reply.Collections;
		var arrTrophiesCodes = new Array();
		for (i=0; i<arrCollectionIds.length; i++)
			FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Trophies.GetCollection", Id:arrCollectionIds[i], Language:locale }, function(reply) {
				if (reply._resultStr!='WU_OK') {
					callback(FXPlanet.arrTrophies,FXPlanet.arrCollections);
					return;
				}
				FXPlanet.arrCollections.push(reply);
				for (j=0; j<reply.Trophies.length; j++)
					ArrayAddIfNotExist(arrTrophiesCodes,reply.Trophies[j]);
				if (FXPlanet.arrCollections.length==arrCollectionIds.length)
					FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Trophies.GetTrophy", Codes:arrTrophiesCodes, Language:locale }, function(reply) {
						if (reply._resultStr!='WU_OK') {
							callback(FXPlanet.arrTrophies,FXPlanet.arrCollections);
							return;
						}
						for (j=0; j<reply.Trophies.length; j++)
							FXPlanet.arrTrophies[reply.Trophies[j].Code] = reply.Trophies[j];
						callback(FXPlanet.arrTrophies,FXPlanet.arrCollections);
					});
			});

	});
};

FXPlanet.GetSponsoredContestHtml = function(arrTrophies,arrCollections,contest,id)
{
	var html = '';
	html += '<div class="competition_top">';
	html += '<div class="competition_title">COMPETICI�N DE $comp_name</div>';
	html += '<div style="width:100%; height:9px;"></div>';
	html += '<div style="float:left; width:190px; height:103px;">';
		html += '<div><img style="margin: 3px 0 0 14px; height:101px;" src="/fx/public/images/prizes/prem_episode$scene_id.jpg" border="0" /></div>';
		html += '<div style="position: relative; text-align: center; top: -20px; padding-left:40px; font-size:12px;">$scene_name</div>';
	html += '</div>';
	html += '<div style="float:left; width:350px; height:103px;">';
		html += '<div style="padding:10px 0px 10px 0px"><div class="competition_label_left">Patrocinado por:</div><div class="competition_label_right" style="width:auto;">$clan_name</div>';
		html += '<div style="width:37px; float:left;"><img style="width:26px; height:26px; margin-left:5px; border-style:solid; border-width:2px; border-color:rgb(166,180,193);" src="$clan_image" /></div></div>';
		html += '<div style="padding:10px 0px 10px 0px"><div class="competition_label_left">Fecha de finalización:</div><div class="competition_label_right">$date_end</div></div>';
		if (contest.rank>=0 && contest.rank<12 && false) {
			html += '<div style="padding:10px 0px 10px 0px"><div class="competition_label_left">Exclusivo para:</div>';
			html += '<div style="width:37px; float:left;"><img style="width:33px; height:26px; padding-top:3px;" src="$rank_image" border="0" /></div>';
			html += '<div class="competition_label_right" style="width: 150px;">$rank</div></div>';
		}
		else {
			html += '<div style="padding:10px 0px 10px 0px"><div class="competition_label_left">Premio:</div>';
			html += '<div style="width:37px; float:left;"><img style="width:37px; height:37px;" src="$show_trophy_image" border="0" /></div>';
			html += '<div style="width:auto; float:left; font-size:12px; padding:8px 0px 0px 10px; height:27px;"><div style="color:rgb(103,149,211);">$show_trophy_uses usos</div></div></div>';
			html += '<div style="width:auto; float:left; font-size:12px; padding:8px 0px 0px 10px; height:27px;"><a href="#" name="contest_show_'+id+'">Ver +</a></div></div>';
		}
	html += '</div>';

	html += '</div>';
	html += '<div class="competition_mid">';
	html += '<div name="contest_details_'+id+'" style="padding-left:20px; width:100%; display:none;">';
	html += '<div style="width:100%; height:22px;"><div class="competition_prizes_header" style="width:135px;">Clasificación</div>';
	html += '<div class="competition_prizes_header" style="width:135px;">Premios</div>';
	html += '<div class="competition_prizes_header" style="width:80px;"></div>';
	html += '<div class="competition_prizes_header" style="width:160px;">Trofeos</div></div>';
	var arrContestTrophies = new Array();
	var trophyToShow = '';
	var trophyToShowUses = 0;
	if (typeof contest.prizes!="undefined")
		for (var iInterval=0; iInterval<contest.prizes.length; iInterval++) {
			html += '<div class="competition_prizes_row"><div style="width:135px; float:left; padding-top:15px;">';
			if (contest.prizes[iInterval].range[0]==contest.prizes[iInterval].range[1])
				html += '$rank_0º</div>';
			else
				html += '$rank_0º al $rank_1º</div>';
			html += '<div style="width:135px; float:left; padding-top:15px; $pfx_visible">$pfx_number Puntos FX</div>';
			html += '<div style="width:80px; float:left;"><img style="margin: 0 0 0 50px; width:37px; height:37px;" src="$trophy_image" border="0" /></div>';
			html += '<div style="width:130px; float:left; font-size:12px; padding-top:8px; height:37px;"><div><b>$trophy</b></div><div style="color:rgb(103,149,211);$visible_uses">$uses usos</div></div></div>';
			var trophy = contest.prizes[iInterval].trophy;
			if (trophyToShow=='')
				trophyToShow = trophy;
			if (trophyToShow==trophy && typeof contest.prizes[iInterval].trophy_uses!="undefined")
				trophyToShowUses += contest.prizes[iInterval].trophy_uses*(contest.prizes[iInterval].range[1]-contest.prizes[iInterval].range[0]+1);
			html = html.replace("$rank_0",contest.prizes[iInterval].range[0]);
			html = html.replace("$rank_1",contest.prizes[iInterval].range[1]);
			html = html.replace("$pfx_number",contest.prizes[iInterval].credits);
			html = html.replace("$pfx_visible",contest.prizes[iInterval].credits==0?"visibility:hidden;":"");
			html = html.replace("$trophy_image",typeof arrTrophies[trophy]=="undefined" ? "" : arrTrophies[trophy].Image);
			html = html.replace("$trophy",typeof arrTrophies[trophy]=="undefined" ? "" : arrTrophies[trophy].Name);
			html = html.replace("$visible_uses",typeof arrTrophies[trophy]=="undefined" || typeof contest.prizes[iInterval].trophy_uses=="undefined" ? "display:none;" : "");
			html = html.replace("$uses",typeof arrTrophies[trophy]=="undefined" || typeof contest.prizes[iInterval].trophy_uses=="undefined" ? "" : contest.prizes[iInterval].trophy_uses);
			arrContestTrophies[trophy] = trophy;
		}
	html += '</div>';
	for (var iTrophy in arrContestTrophies) {
		if (iTrophy=="" || arrContestTrophies[iTrophy]==undefined || arrTrophies[iTrophy].Name==undefined)
			continue;
		var collection;
		for (var iCollection=0; iCollection<arrCollections.length; iCollection++) {
			collection = arrCollections[iCollection];
			if (SearchArray(collection.Trophies,arrContestTrophies[iTrophy])!=-1)
				break;
		}
		if (collection.Trophies.length<=1)
			break;
		html += '<div style="width:100%; height:45px; padding: 5px 0 0 8px;">';
		html += '<div style="float:left;"><img style="width:43px; height:43px;" src="$trophy_image" border="0" /></div>';
		html += '<div style="float:left; font-size:10px; padding:15px 2px 0px 2px;"><b>$trophy</b> pertenece a la colección <b>$collection</b></div>';
		var short_name = arrTrophies[iTrophy].Name;
		if (short_name.length>10)
			short_name = short_name.slice(0,7)+"...";
		html = html.replace("$trophy_image",arrTrophies[iTrophy].Image);
		html = html.replace("$trophy",short_name);
		html = html.replace("$collection",collection.Name);
		html += '<div style="float:left; width:6px; height:48px; background: url(/fx/public/images/prizes/prem_bg_col_left.png"></div>';
		html += '<div style="float:left; height:48px; background: url(/fx/public/images/prizes/prem_bg_col_center.png">';
		for (var iColTrophy=0; iColTrophy<collection.Trophies.length; iColTrophy++) {
			html += '<div style="float:left;"><img style="width:43px; height:43px; padding-left:2px;" src="$trophy_image" border="0" /></div>';
			html = html.replace("$trophy_image",arrTrophies[collection.Trophies[iColTrophy]].Image);
		}
		html += '</div>';
		html += '<div style="float:left; width:6px; height:48px; background: url(/fx/public/images/prizes/prem_bg_col_right.png"></div>';
		html += '</div>';
	}
	html += '</div>';
	html += '<div class="competition_bottom">';
	html += '</div>';
	html = html.replace("$comp_name",contest.community);
	html = html.replace("$clan_name",contest.community);
	var clanImage = ("/fx/public/images/clans/"+contest.community+".jpg").replace(/ /g,'_');
	html = html.replace("$clan_image",clanImage);
	html = html.replace("$date_end",contest.date_end);
	var arrRankImages = [ "recluta_B.png", "recluta_plus_B.png", "comando_B.png", "comando_plus_B.png", "heroe_B.png",
		"heroe_plus_B.png", "maestro_B.png", "maestro_plus_B.png", "gran_maestro_B.png", "gran_maestro_plus_B.png",
		"Leyenda_B.png", "leyenda_plus_B.png" ];
	var rankImage = contest.rank>0 && contest.rank<12 ? arrRankImages[0] : "";
	html = html.replace("$rank_image","/fx/public/images/20/"+rankImage);
	html = html.replace("$rank",User.prototype.rankToString(contest.rank));
	html = html.replace("$scene_id",contest.scene_id);
	html = html.replace("$scene_name",contest.scene);
	html = html.replace("$show_trophy_image",typeof arrTrophies[trophyToShow]=="undefined" ? "" : arrTrophies[trophyToShow].Image);
	html = html.replace("$show_trophy_uses",trophyToShowUses);
	return html;
};

FXPlanet.ShowScrollArrows = function(jquery_selector)
{
	$(jquery_selector).jScrollPane({"showArrows":true});
}

FXPlanet.ShowVitrina = function(wu2_user,user_mail,news_id,tab_active,no_ranking,closable)
{
	if (game_launch_state<gls_install) // detiene el lanzamiento del juego al sacar vitrina directamente desde url
		FXPlanet.GameLaunchStop();
	if (no_ranking==undefined)
		no_ranking = false;
	OpenWindow('win_vitrina.php?wu2_user='+wu2_user+'&user_mail='+user_mail,function(window_name){
		var tabs = [
			{src: 'https://juegos.fxinteractive.comapplication/informe_semanal/index.php'},
			{src: 'https://juegos.fxinteractive.comapplication/win_mytrophies.php?wu2_user='+wu2_user+(no_ranking?'&no_ranking=1':'')},
			{src: 'https://juegos.fxinteractive.comapplication/win_competitions.php?wu2_user='+wu2_user},
			{src: 'https://juegos.fxinteractive.comapplication/win_news.php?news_id='+news_id+'&channel=news'},
			{src: 'https://juegos.fxinteractive.comapplication/win_news.php?channel=alerts'}
		];
		var id = "#"+window_name+"_box ";
		$(id+"[name^=vitrina_usar_]").click(function(e) {
			e.preventDefault(); // stop normal link click
			var trophy = $(this).attr("name").slice(String('vitrina_usar_').length);
			ShowMessage("En construccion","Trofeo "+trophy);
		});
		$(id+"#vitrina_play").click(function(e) {
			CloseWindow($(this));
			if (game_launch_state<gls_install)
				window.location = "https://juegos.fxinteractive.comapplication/wu2.php?"+RemoveGet(FXPlanet.get_params,["social_user","wu2_user","alias","goto"]);
		});
		var funcTab = function(tab) {
			if (tab==1 && wu2_user=="0") { // al pinchar en pestana trofeos sin user logueado del que verlos, salen las vitrinas mas valoradas
				OpenWindow('win_frame_2.php?width=460&height=360&url='+bin2hex('win_vitrina_ranking.php'));
				return;
			}
			$(id+"[name^=vitrina_frame_]").hide();
			$(id+"[name^=vitrina_foot_]").each(function() { $(this).toggle($(this).attr("name").slice(String('vitrina_foot_').length)==tab); });
			$(id+"[name^=vitrina_tab_]").each(function() {
				$(this).toggleClass("vitrina_tab_off",$(this).attr("name").slice(String('vitrina_tab_').length)!=tab);
				$(this).toggleClass("vitrina_tab_on",$(this).attr("name").slice(String('vitrina_tab_').length)==tab);
			});
			if ($(id+"[name=vitrina_frame_"+tab+"]").attr("src")==tabs[tab].src) {
				$(id+"[name=vitrina_frame_"+tab+"]").show();
				return;
			}
			$(id+"#vitrina_loading").show();
			$(id+"[name=vitrina_frame_"+tab+"]").attr("src", tabs[tab].src);
			$(id+"[name=vitrina_frame_"+tab+"]").load(function() {
				$(id+"[name=vitrina_frame_"+tab+"]").toggle($(id+"[name=vitrina_tab_"+tab+"]").hasClass("vitrina_tab_on"));
				$(id+"#vitrina_loading").hide();
			});
			if (tab==0) { // actualizar cookie de informe semanal visto
				SetCookie("last_visit_the_best",""+new Date()); 
				$(id+"#informe_semanal_number").hide();
			}
			else if (tab==3) // actualizar noticias sin mirar
				$(id+"#accesos_noticias_number").hide();
			else if (tab==4) // actualizar noticias sin mirar
				$(id+"#accesos_alertas_number").hide();
		};
		$(id+"[name=vitrina_tab_0]").toggle(!no_ranking);
		$(id+"[name=vitrina_tab_1]").toggle(true); // wu2_user!="0"
		$(id+"[name=vitrina_tab_2]").toggle(!no_ranking);
		$(id+"[name=vitrina_tab_3]").toggle(!no_ranking && FXPlanet.locale!="ru");
		$(id+"[name=vitrina_tab_4]").toggle(user_mail!="" && !no_ranking);
		$(id+"[name^=vitrina_tab_]").click(function(e) {
			e.preventDefault(); // stop normal link click
			if ($(id+"#vitrina_loading").is(":visible"))
				return;
			var tab = $(this).attr("name").slice(String('vitrina_tab_').length);
			funcTab(tab);
		});
		if (tab_active==undefined)
			tab_active = 1;
		funcTab(tab_active);
		if (closable!==true && game_launch_state<gls_install)
			$(id+"#vitrina_boxclose").hide();
	},false,false,false);
};

FXPlanet.GetNewsNumber = function(channel,cookie,callback)
{
	FXPlanet.AjaxCallEx("ajax/read_news.php", { channel:channel }, function(reply) {
		if (reply._resultStr!='WU_OK')
			return;
		var maxId = parseInt(GetCookie(cookie));
		var unreaded = 0;
		for (var iNew=0; iNew<reply.Items.length && unreaded<9; iNew++)
			if (reply.Items[iNew].Id>maxId)
				unreaded++;
		if (unreaded>0)
			callback(unreaded);
	},null,false);
};

function ShowPage(page)
{
	if (page==current_page || page==undefined || page=="")
		return;
	// establecer la página actual (oculta todas menos gameplayer y muestra la elegida)
	current_page = page;
	$("#loading,#ranking_navy,#page_install_fxwebplayer,#page_vast").hide();
	$("#"+page).show();
	// inicializaciones varias
	if (page=="gameplayer") {
   		FXPlanet.CallLauncher("notify?data=focus");
		GamePlayerSetDefaultSize();
	}
	else
		$("#gameplayer_frame").css('height','1px'); // no puede desaparecer, y no quiero hueco enorme en su lugar
	$("[name=gameplayer_foot]").toggle(page!="ranking_navy");
	$("#accesos_jugar").toggle(page!="gameplayer");
	$("#accesos_hd,#accesos_fullscreen").toggle(page=="gameplayer");
	if (!FXPlanet.game_launched)
		FXPlanet.GameLaunchStop();
	else if (page!="gameplayer") {
   		FXPlanet.CallLauncher("notify?data=blur");
		ArrayAddIfNotExist(FXPlanet.game_avoid_show,"not_gameplayer");
   	}
   	else
		ArrayRemove(FXPlanet.game_avoid_show,"not_gameplayer");
	FXPlanet.GameLaunchShowOrHide();
	FXPlanet.CallLauncher("state");	
}

function ShowGameProgressText(text1)
{
	var data = new Object;
	data.State = "unknown";
	data.Progress = 0.0;
	data.BPS = 0.0;
	data.Time = 0;
	FXPlanet.game_launch_on_update_state(data,text1,"");
}

function ShowGameProgress(data,downloading_text,installing_text)
{
	if (downloading_text==null)
		downloading_text = "Cargando";
	if (installing_text==null)
		installing_text = "Actualizando";
	var state_text = downloading_text;
	var progress_text = "";
	if (data.State=="waiting") state_text="<b>"+FXPlanet.game_name+"</b> iniciando...";
	else if (data.State=="listing") state_text="<b>"+FXPlanet.game_name+"</b> iniciando...";
	else if (data.State=="checking") state_text="<b>"+FXPlanet.game_name+"</b> iniciando...";
	else if (data.State=="downloading") state_text=downloading_text;
	else if (data.State=="paused") state_text="Descarga en pausa...";
	else if (data.State=="downloaded") state_text="Descarga terminada...";
	else if (data.State=="installing") state_text=installing_text;
	else if (data.State=="finished") { state_text="<b>"+FXPlanet.game_name+"</b> iniciando..."; }
	else if (data.State=="error") state_text="Error en la descarga...";
	else if (data.State=="not_found") state_text="Iniciando...";
	else state_text=data.State;
	if (data.Progress>0 && data.Progress<=1 && (data.State=="downloading" || data.State=="installing")) {
		// 18/193 es un ajuste para que la barra de progreso se salte los bordes izquierdo/derecho de su marco
		var progress = Math.round(data.Progress*1000)/10;
		progress_text = progress.toString();
		progress_text += progress_text.length<3 ? ".0%" : "%";
	}
	FXPlanet.game_launch_on_update_state(data,state_text,progress_text);
}

FXPlanet.ProcessNotifications = function()
{
	// Recoger las notificaciones
	data = FXPlanet.CallLauncher("notifications");
	if (!data || !data.Result || data.Result=="Error" || (typeof data.Notifications == 'undefined'))
		return;
	var obj;
	for (var i=0; i<data.Notifications.length; i++) {
		//DebugLog("Notificación "+(i+1)+"/"+data.Notifications.length+": "+data.Notifications[i]);
		if (data.Notifications[i]=="w2i: finished" && install_state==3) {
			install_state = 4;
			FXPlanet.SendStat("has_ever_w2i_finished","web_w2i_finished");
		}
		else if (data.Notifications[i].indexOf("folder: ")==0) {
			FXPlanet.game_launch_wait_for_install_folder = false;
			if (data.Notifications[i].substr(8)=="cancel") {
				data = FXPlanet.CallLauncher("down_stop?id="+game_id+"&core=1&isw2i=1"); // detener la descarga
				DebugLog("gls_game_installing folder cancel "+(data.Result?"ok":"error"));
				FXPlanet.GameLaunchStop();
			}
			FXPlanet.game_launch_on_step_cb("folder",data.Notifications[i].substr(8));
		}
		else if (data.Notifications[i]=="w2i: started")
			FXPlanet.game_launch_on_step_cb("started","");
		else if (data.Notifications[i].indexOf("w2i: error")==0) {
			/// DEPURANDO RAUL
			DebugLog("gls_game_installing4 "+data.Notifications[i]);
			FXPlanet.GameLaunchStop();
			FXPlanet.game_launch_on_step_cb("error",data.Notifications[i]);
		}
		// coloca la ventana del juego en el centro de la pantalla cuando termina de cargar
		else if (data.Notifications[i]=="finish_load") {
			FXPlanet.SendStat("has_ever_finish_load","game_finish_load");
			send_notifications = true;
			if (game_launch_time>0.0) {
				DebugLog("gls_game_running finish_load");
				game_launch_time = 1.0; // para que el principio de gls_game_running muestre el juego
			}
		}
		// abre la página de recargar puntosFX
		else if (data.Notifications[i].indexOf("goto credits")==0) {
			try { obj=eval("( "+data.Notifications[i].slice("goto credits".length)+" )"); } catch(err) { obj=new Object; };
			if (obj.Reason===undefined || obj.Pfx===undefined)
				FXPlanet.OpenPfxWindow();
			else
				FXPlanet.AjaxCallEx("ajax/get_credit.php", {}, function(reply) {
					if (reply._resultStr!="WU_OK")
						return;
					var text = obj.Reason=="1" ? "Para participar en esta partida necesitas <b>$needed puntosFX</b>." :
					           obj.Reason=="2" ? "Para comprar los ítems seleccionados necesitas <b>$needed puntosFX</b>." :
					           obj.Reason=="3" ? "Para realizar esta promoción necesitas <b>$needed puntosFX</b>." :
					           "Para realizar esta acción necesitas <b>$needed puntosFX</b>.";
					text = text.replace("$needed",obj.Pfx).replace("$total",reply.Credit);
					FXPlanet.OpenPfxWindow(null,text);
				});
		}
		// abre la página de recargar puntosFX con trialpay o superrewards
		else if (data.Notifications[i]=="goto trialpay" || data.Notifications[i]=="goto superrewards") {
			if (FXPlanet.get_params.indexOf("fb_sig_in_iframe=1")==-1)
				if (data.Notifications[i]=="goto trialpay")
					FXPlanet.OpenTrialPayWindow();
				else
					FXPlanet.OpenSuperRewardsWindow();
			else {
				if (navigator.userAgent.indexOf("Chrome")!=-1)
					FXInstallEntertainment.Show(); // para que el navy no se pinte encima de la ventana de completar ofertas en Chrome
			    FB.ui({ method: 'pay', credits_purchase: true, dev_purchase_params: {"shortcut":"offer"} }, function() {});
			}
		}
		// abre la página de comprar item de Navy directamente con dinero
		else if (data.Notifications[i].indexOf("goto navy_items")==0) {
			try { obj=eval("( "+data.Notifications[i].slice("goto navy_items".length)+" )"); } catch(err) { obj=new Object; };
			if (obj.Item!=undefined) {
				var network = FXPlanet.social_canvas ? FXPlanet.social_network_prefix : "fx";
				OpenWindow("win_pfx.php?country="+user_country+"&network="+network+"&user="+FXPlanet.User.uid+"&item="+obj.Item,function(){ FXPlanet.PfxWindowCallback(); },true,false,false);
			}
		}
		// vuelve al juego
		else if (data.Notifications[i]=="goto gameplayer")
			ShowPage("gameplayer");				
		// saca la pestana de alertas
		else if (data.Notifications[i].indexOf("goto alerts")==0)
			FXPlanet.ShowVitrina(FXPlanet.User.uid,user_email,"",4);
		// se puede / no se puede ir a pantalla completa
		else if (data.Notifications[i]=="full_screen_available yes")
			$("[name=btn_fullscreen]").show();
		else if (data.Notifications[i]=="full_screen_available no")
			$("[name=btn_fullscreen]").hide();
		// no hay que / hay que mostrar mensaje de confirmacion de "se va a interrumpir la partida"
		else if (data.Notifications[i]=="in_main_menu yes") {
			FXPlanet.SendStat("has_ever_mainmenu","web_new_user_main_menu",{ nick:user_alias });
			FXPlanet.must_confirm_exit_game = false;
		}
		else if (data.Notifications[i]=="in_main_menu no")
			FXPlanet.must_confirm_exit_game = true;
		// mostrar la ventana de invitaciones
		else if (data.Notifications[i].indexOf("fb_invite")==0) {
			try { obj=eval("( "+data.Notifications[i].slice("fb_invite".length)+" )"); } catch(err) { obj=new Object; };
			showInviteForm(obj.text==undefined?'':obj.text,obj.app_users_too!=undefined && obj.app_users_too);
		}
		// mostrar la ventana de premios de los premios
		else if (data.Notifications[i].search(/^sponsor/) != -1)
		{
			var extra = data.Notifications[i].slice("sponsor".length+1);
			OpenWindow(extra, null, true, true, false);
		}
		// mostrar la ventana del informe semanal
		else if (data.Notifications[i]=="show_report")
			FXPlanet.ShowVitrina(FXPlanet.User.uid,user_email,"",0);
		// mostrar la ventana de la lista de premios
		else if (data.Notifications[i]=="show_prizes")
			FXPlanet.ShowVitrina(FXPlanet.User.uid,user_email,"",2);
		// mostrar una ventana
		else if (data.Notifications[i].indexOf("open_window ")==0)
			OpenWindow(data.Notifications[i].slice("open_window ".length), null, true, false, false);
		// hace una llamada ajax
		else if (data.Notifications[i].indexOf("ajax_call ")==0) {
			var arrParams = ParamsToArray(data.Notifications[i].slice("ajax_call ".length));
			FXPlanet.AjaxCallEx("ajax/generic.php", arrParams, function(reply) {
				for (var i in reply) {
					if (typeof reply[i]=='object') {
						for (var j in reply[i])
							reply[i+'_'+j] = reply[i][j];
						delete reply[i];
					}
				}
				reply = json_encode(reply).replace(/\"/g,'\'').replace(/ *: */g,':').replace(/\n/g,' ').replace(/ *\'/g,'\'');
		   		FXPlanet.CallLauncherSafe("notify?data=ajax_call "+reply);
			});					
		}
		// notificar al servidor de los videos disponibles
		else if (data.Notifications[i].search(/^av_videos/) != -1)
		{
			if (user_logged)
			{
				var videolist = data.Notifications[i].slice("av_videos".length+1);
				FXPlanet.AjaxCall("ajax/set_available_videos.php", { Videos: videolist });
			}
		}
		// ocultar el usuario facebook de la web si es distinto del asociado al usuario que esté jugando
		else if (data.Notifications[i].indexOf("fb_id ")==0) {
			var fb_got = data.Notifications[i].slice(6);
			if (FXPlanet.social_user!="" && fb_got!="0" && FXPlanet.social_user!=fb_got) {
				DebugLog("quitando fb: "+FXPlanet.social_user+"!="+data.Notifications[i].slice(6));
				FXPlanet.User.setConnectedToFacebook(false);
			}
		}
		// Activar las acciones del login (a propósito no incluyo navy en el texto de la notificación, así es más genérico)
		else if (data.Notifications[i]=="login_completed")
		{
			if (game_id==20 && typeof FXPlanet.NavyOnLogin==='function')
				FXPlanet.NavyOnLogin();
		}
		// Saca una ventana de "ya tienes que validar tu email para continuar"
		else if (data.Notifications[i].indexOf("check_email_validated ")==0 && !user_email_validated) {
			//FXPlanet.User.validateEmail(data.Notifications[i].slice(22)!="now");
			FXPlanet.User.validateEmail(true);
		}
		// Comenzar el login con facebook
		else if (data.Notifications[i].search(/^execute facebook_login/) != -1) {
			var extra = data.Notifications[i].slice("execute facebook_login".length+1);
			if (extra && extra=='ask_publish_stream') {
				FXPlanet.social_session_change = false;
				ConnectWithFacebookDialog(null, function(response) {
					if (response.authResponse)
						AskFBPublishPermissionAndNotifyGame();
					else
						FXPlanet.CallLauncherSafe("notify?data=publish_stream 0");
				});
			} else if (extra)
				ConnectWithFacebookDialog(extra);
			else
				ConnectWithFacebookDialog();
		// Enviar un mensaje
		} else if (data.Notifications[i].search(/^execute publish/) != -1) {
			OpenWindow("win_publish.php?"+data.Notifications[i].slice("execute publish".length+1), null, true);
		} else if (data.Notifications[i]=="execute ask_publish_stream")
			AskFBPublishPermissionAndNotifyGame();
		else if (data.Notifications[i]=="glow publicar") {
			BarraProgreso.setComponentActive('publicar', true);
			BarraProgreso.setComponentBlink('publicar', true);
		} else if (data.Notifications[i]=="unglow publicar") {
			BarraProgreso.setComponentBlink('publicar', false);
			BarraProgreso.paint();
		}
		else if (data.Notifications[i]=="glow hd") {
			BarraProgreso.setComponentBlink('hd', true);
		}
		else if (data.Notifications[i]=="unglow hd") {
			BarraProgreso.setComponentBlink('hd', false);
			BarraProgreso.paint();
		}
		// Estado de instalación de las texturas HD
		else if (data.Notifications[i] == "textures_hd yes") {
			BarraProgreso.setHD();
		}
		else if (data.Notifications[i] == "textures_hd no") {
			BarraProgreso.setHD(0);
		}
		// Mostrar un mensaje
		else if (data.Notifications[i]=="minimum_requirements") {
			//var message = data.Notifications[i].slice("show_message ".length);
			ShowMessage("Requisitos m&iacute;nimos","Tu ordenador no cumple los requisitos m&iacute;nimos para jugar a "+FXPlanet.game_name+".<br/>Es posible que "+FXPlanet.game_name+" funcione lentamente o no funcione correctamente.");
		}
		else if (data.Notifications[i]=="reload_test") {
    		FXPlanet.CallLauncherSafe("notify?data=browser_out_float");
			setTimeout(function() { top.location.reload(); },5000);
		}
		else if (data.Notifications[i].search(/^fb_dialog friends/) != -1) {
			FB.ui({method: 'friends',id: data.Notifications[i].slice("fb_dialog friends".length+1)});
		}

		else if (data.Notifications[i].indexOf("hd_percent ")==0) {
			$("#barra_progreso_hd_percent").show();
			ChangeText("barra_progreso_hd_percent",data.Notifications[i].slice(11));
		}
		// El juego pide el nombre y foto de un usuario en la red social actual, a partir de su id
		else if (data.Notifications[i].indexOf("get_name_picture ")==0) {
			FXPlanet.GetNamePicture(data.Notifications[i].slice(17),function (social_id,name,picture) {
		   		FXPlanet.CallLauncherSafe("notify?data=name_picture_"+social_id+" name: "+name+" pic: "+picture);
			});
		}
		// El juego pide mostrar la vitrina de trofeos de un usuario
		else if (data.Notifications[i].indexOf("vitrina")==0) {
			try { obj=eval("( "+data.Notifications[i].slice("vitrina".length)+" )"); } catch(err) { obj=new Object; };
			if (obj.alias!=undefined && obj.wu2_user!=undefined && obj.social_user!=undefined)
				FXPlanet.ShowVitrina(obj.wu2_user,user_email,"");
		}
		// publicacion en red social
		else if (data.Notifications[i].indexOf("publish")==0) {
			try { obj=eval("( "+data.Notifications[i].slice("publish".length)+" )"); } catch(err) { obj=new Object; };
			obj["method"] = "Social.ApplyTemplate";
			obj["Language"] = FXPlanet.locale;
			obj["ALIAS"] = user_alias;
			ajaxPost("/fx/application/ranking_navy/wuapi.php", obj, function(reply) {
				try { reply = eval('(' + reply + ')'); } catch (err) { reply = new Object; }
				if (reply.msg!=undefined)
					FXPlanet.SocialPublish(reply.msg.title,reply.msg.text,"","",reply.msg.image,function(){
						FXPlanet.CallLauncherSafe("notify?data=close_window_facebook_publish");
					});
			});
		}
		// devolver nombre del siguiente video de publicidad con vast
		else if (data.Notifications[i]=="get_ad_name")
	   		FXPlanet.CallLauncherSafe("notify?data=get_ad_name:"+FXPlanet.VastGetAdName());
		// mostrar video de publicidad vast
		else if (data.Notifications[i]=="play_ad")
			FXPlanet.VastPlayAd();
		// notificar al juego
		else if (data.Notifications[i].indexOf("notify_game:")==0)
	   		FXPlanet.CallLauncherSafe("notify?data="+data.Notifications[i].slice("notify_game:".length));
		// abrir el Ladder de clanes
		else if (data.Notifications[i].indexOf("clan_ladder")==0) {
			try { obj=eval("( "+data.Notifications[i].slice("clan_ladder".length)+" )"); } catch(err) { obj=new Object; };
			var sextra = '';
			if (obj['division']!=undefined && obj['group']!=undefined)
				sextra = '?division=' + obj['division'] + '&group=' + obj['group'];
			OpenWindow("win_clan_ladder.php"+sextra,null,false,false,true,null,true);
		}
	}
}

FXPlanet.GameLaunchStart = function(id_game,cb_on_step)
{
	if (id_game!=null && id_game!=undefined) game_id = id_game;
	if (cb_on_step===null || cb_on_step===undefined)
		cb_on_step = function(step,param) { return true; }
	FXPlanet.game_launch_on_step_cb = cb_on_step;
	ShowPage("gameplayer");
	
	var cb_launch = function() {
		game_launch_try++;
		game_launch_state = gls_start;
		GameLaunch(game_launch_try);
	};
	
	// versión inglesa requiere password
	if (game_launch_init)
		cb_launch();
	else {
		game_launch_init = true;
		CenterWindowsPeriodic();
		// de vez en cuando, comprobar que la sesión de la web no ha expirado
		var func_refresh = function()
		{
			FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Web.Refresh" });
		};
		window.setInterval(func_refresh,60*1000);
		//if (true)
		if (FXPlanet.locale=="es" || FXPlanet.social_network=="pixonic")
			cb_launch();
		else if (!IsAnyWindow("win_english_pass.php"))
			OpenWindow("win_english_pass.php",function() {
				$("[name=english_password]").val(GetCookie("publisher_password"));
				// auto-cerrar ventana con mensaje, si la plataforma ha recibido el sms
				$("[name=js_english_ok]").live("click",function(e) {
					FXPlanet.AjaxCallEx("ajax/is_english_pass_valid.php", { pass: $("[name=english_password]").val() }, function(reply) {
						if (reply._resultStr=="WU_OK") {
							CloseWindows("win_english_pass.php");
							cb_launch();
							var remember_password = $("[name=english_password_hold]").attr("checked") ? $("[name=english_password]").val() : ""; 
							SetCookie("publisher_password",remember_password);
						}
						else
							ShowMessage("Error","Password incorrect");
					});	
				});
			},false);
	}
}

FXPlanet.GameLaunchStop = function()
{
	game_launch_try++;
	FXPlanet.CallLauncher("down_stop?id="+game_id+"&core=1&isw2i=1"); // detener la descarga del juego, si la hay
	ShowGameProgressText("");
}

FXPlanet.GameLaunchShow = function()
{
	FXPlanet.SendStat("has_ever_game_show","web_game_show");
	DebugLog("GameLaunchShow");
	$("#barra_progreso").show();
	$("#game_foot").show();
	$("#game_ready").hide();
	$("#game_progress_container").hide();
	if (FXPlanet.User.connectedToFacebook || FXPlanet.social_network=="pixonic") {
		//$("#btn_volver_ranking").show();
		$("#ranking_stripe_div").show();
	}
	CloseLoginWindows();
	FXInstallEntertainment.Hide();
	$("#gameplayer_frame").children("img").remove();
	ArrayRemove(FXPlanet.game_avoid_show,"not_loaded");
	FXPlanet.GameLaunchShowOrHide();
}

// Oculta el juego (para evitar que se pinte a traves de ventanas emergentes) o lo muestra (segun si hay ventanas emergentes o no)
FXPlanet.GameLaunchShowOrHide = function()
{
	var anyOverlayInParent = false;
	try { if ($('.overlay_box',window.parent.document).length>0) anyOverlayInParent=true; } catch(err) {};
	if (FXPlanet.game_avoid_show.length==0 && $(".overlay_box,#adk_interstitial_container").length==0 && !anyOverlayInParent) {
		$("#fxplanet_object").css("top",FXPlanet.game_launch_plugin_position);
		$("#gameplayer_frame").children("img").show();
   		FXPlanet.CallLauncher("notify?data=focus");
   	}
   	else {
		$("#fxplanet_object").css("top","-2000px");
		$("#gameplayer_frame").children("img").hide();
   		FXPlanet.CallLauncher("notify?data=blur");
   	}
	for (var i=0; i<FXPlanet.other_planets.length; i++)
		FXPlanet.other_planets[i].GameLaunchShowOrHide();
}

FXInstallEntertainment = {};
FXInstallEntertainment.is_busy = false;
FXInstallEntertainment.is_launched = false;
FXInstallEntertainment.Hide = function()
{
	$(".spectrum_text").hide();
	$("#install_entertainment").empty();
	$("#install_entertainment").hide();
	$("#ranking_stripe_div").toggle(FXPlanet.social_user!="");
	GamePlayerSetDefaultSize();
	FXInstallEntertainment.is_busy = false;
	FXInstallEntertainment.is_launched = false;
	if (FXInstallEntertainment.show_dynamic_text_interval) {
		clearInterval(FXInstallEntertainment.show_dynamic_text_interval)
		FXInstallEntertainment.show_dynamic_text_interval = 0;
	}
}
FXInstallEntertainment.page = new Array();
FXInstallEntertainment.numPages = new Array();
FXInstallEntertainment.page[1] = 1;
FXInstallEntertainment.page[2] = 1;
FXInstallEntertainment.numPages[1] = FXPlanet.locale=='es'?22:21;
FXInstallEntertainment.numPages[2] = 18;
FXInstallEntertainment.channel = 2;
FXInstallEntertainment.autoZapTimeout = null;

FXInstallEntertainment.ChangeChannel = function()
{
	FXInstallEntertainment.channel = (FXInstallEntertainment.channel%2)+1;
	var buttonImg = FXInstallEntertainment.channel==1 ? "screenshots" : "comic";
	buttonImg = "/fx/public/images/0/"+FXPlanet.locale+"/btn_ver"+buttonImg+".gif";
	$("#comic_zapping_btn").attr("src",buttonImg);
	FXInstallEntertainment.ShowPage(FXInstallEntertainment.page[FXInstallEntertainment.channel]);
}

FXInstallEntertainment.ShowPage = function(page)
{
	numPages = FXInstallEntertainment.numPages[FXInstallEntertainment.channel];
	if (page>numPages) {
		FXInstallEntertainment.page[(FXInstallEntertainment.channel%2)+1] = 1;
		FXInstallEntertainment.ChangeChannel();
		return;
	}
	page = page<1 ? 1 : page>numPages ? numPages : page;
	FXInstallEntertainment.page[FXInstallEntertainment.channel] = page;
	$("[name=comic_loading]").toggle(!$("#game_ready").is(":visible") && page==numPages);
	$("#comic_numpage").html(page);
	$("#comic_numpages").html(numPages);
	$("[name^=comic_channel_]").stop(true,true);
	$("[name=comic_channel_1]").animate({"top":(-514*(FXInstallEntertainment.channel-1))+"px","left":(-685*(FXInstallEntertainment.page[1]-1))+"px"},500);
	$("[name=comic_channel_2]").animate({"top":(-514*(FXInstallEntertainment.channel-1))+"px","left":(-685*(FXInstallEntertainment.page[2]-1))+"px"},500);
	if (FXInstallEntertainment.autoZapTimeout) {
		clearTimeout(FXInstallEntertainment.autoZapTimeout);
		FXInstallEntertainment.autoZapTimeout = null;
	}
	var funcAutoZap = function() {
		if (FXInstallEntertainment.is_launched)
			FXInstallEntertainment.ShowPage(FXInstallEntertainment.page[FXInstallEntertainment.channel]+1);
	};
	FXInstallEntertainment.autoZapTimeout = setTimeout(funcAutoZap,FXInstallEntertainment.channel==1 ? 10000 : 5000);
}

FXInstallEntertainment.game_progress_dynamic_text_type = 0;
FXInstallEntertainment.show_dynamic_text_interval = null;
FXInstallEntertainment.ShowDynamicText = function()
{
	if (FXPlanet.locale=="ru")
		return;
	var iMinutes = parseInt(FXPlanet.game_launch_remaining_time/60);
	var text = "";
	if (FXInstallEntertainment.game_progress_dynamic_text_type==0)
		if (FXPlanet.game_launch_remaining_time==0.0 || iMinutes>3)
			FXInstallEntertainment.game_progress_dynamic_text_type = 1;
		else if (iMinutes<=1)
			text = "Queda menos de 1 minuto para que <b>$game_name</b> se inicie";
		else
			text = "Quedan alrededor de $minutes minutos para que <b>$game_name</b> se inicie";
	if (FXInstallEntertainment.game_progress_dynamic_text_type==1)
		if (FXInstallEntertainment.channel==1)
			text = "Pulsa <b>VER SCREENSHOTS</b> para ver imágenes de <b>$game_name</b>";
		else
			text = "Pulsa <b>VER C�MIC</b> para ver la historia de <b>$game_name</b>";
	text = text.replace(/\$game_name/g,FXPlanet.game_name).replace(/\$minutes/g,iMinutes);
	$("[name=game_progress_dynamic_text_2]").html(text);
	FXInstallEntertainment.game_progress_dynamic_text_type = (FXInstallEntertainment.game_progress_dynamic_text_type+1)%2;
	$("[name^=game_progress_dynamic_text]").stop(true,true).css("left","-1000px");
	$("[name^=game_progress_dynamic_text]").animate({left:"68px"},1000).delay(3000).animate({left:"1000px"},1000);
}

function onYouTubePlayerReady(playerId) { document.getElementById("youtube_comic").addEventListener("onStateChange", "ytStateChange"); }
function ytStateChange(new_state)
{
	if (new_state==0) // video terminado, lo sustituye por las imagenes (deja 5 segundos por si la gente hace clic en me gusta)
		FXInstallEntertainment.HideVideo(); // quito los 5 segs porque con el nuevo fondo y tamano ya no se ve el me gusta
		//setTimeout(FXInstallEntertainment.HideVideo,5000);
}
FXInstallEntertainment.HideVideo = function()
{
	FXInstallEntertainment.channel = FXPlanet.locale=="ru" || game_launch_state<gls_game_update ? 2 : 1; // al reves para que lo cambie ChangeChannel
	FXInstallEntertainment.ChangeChannel();
	$('#video_comic').hide();
	$("[name^=comic_channel_]").show();
	$("#comic_zapping").toggle(FXPlanet.locale!="ru");
	if (FXInstallEntertainment.show_dynamic_text_interval==null)
		FXInstallEntertainment.show_dynamic_text_interval = window.setInterval(FXInstallEntertainment.ShowDynamicText,10000);
}

FXInstallEntertainment.Show = function()
{
	if ($("#install_entertainment").length==0 || game_id!=20)
		return;
	$("#fxplanet_object").css("top","-2000px");
	$("#gameplayer_frame").children("img").hide();
	$("#install_entertainment").empty();
	$("#install_entertainment").show();
	$("#install_entertainment").css("top",FXPlanet.game_launch_plugin_position);
	var with_flash = FXPlanet.locale!="ru" && FXPlanet.get_params.indexOf("noflash")==-1 && FXPlanet.IsFlashInstalled();
	$("#install_entertainment").load("comic.php"+(with_flash?"":"?no_flash=1"),function()
	{
		$("#fxplanet_object").css("width",FXPlanet.default_width+"px"); // evita que el fxplanet_object se redimensione con el gameplayer_frame
		$("#fxplanet_object").css("height",FXPlanet.default_height+"px");
		FXInstallEntertainment.channel = FXPlanet.locale=="ru" || game_launch_state<gls_game_update ? 1 : 2;
		// primero muestra trailer del juego (no en version rusa), y cuando termine, pone las imagenes
		if (!with_flash)
			FXInstallEntertainment.HideVideo();
		else
			$("[name^=comic_channel_]").hide();
		$("[name=comic_ready]").toggle($("#game_ready").is(":visible") || game_launch_state==gls_game_running && game_launch_time<=0.0);
		$("[name=comic_loading]").hide();
		$("#comic_ready_ok").click(function(e) { FXPlanet.GameLaunchShow(); });
		$("#btn_comic_prev").click(function(e) { FXInstallEntertainment.ShowPage(FXInstallEntertainment.page[FXInstallEntertainment.channel]-1); });
		$("#btn_comic_next,#comic_frame").click(function(e) { FXInstallEntertainment.ShowPage(FXInstallEntertainment.page[FXInstallEntertainment.channel]+1); });
		$("#comic_zapping").click(function(e) { FXInstallEntertainment.ChangeChannel(); });
	});
	FXInstallEntertainment.is_busy = true;
	FXPlanet.CallLauncher("notify?data=blur");
	$("#game_foot").hide();
	ShowPage("gameplayer");
	FXInstallEntertainment.is_launched = true;
}
FXInstallEntertainment.IsLaunched = function()
{
	return FXInstallEntertainment.is_launched;
	//return $("#install_entertainment").children().length>0;
}

function SpectrumIsPlaying() // llamada por el flash
{
	DebugLog("SpectrumIsPlaying");
	//FXInstallEntertainment.is_busy = true;
}
function CheckLauncherTimeOut(data,timeout,launch_try,log)
{
	if (data!=null && data.Result!="Error")
		return false;
	if ((new Date()).getTime()-launcher_last_time>timeout && !FXPlanet.game_launch_wait_for_install_folder) {
		DebugLog("CheckLauncherTimeOut "+log+" "+((new Date()).getTime()-launcher_last_time));
		FXPlanet.GameLaunchStart(game_id,FXPlanet.game_launch_on_step_cb);
	}
	else
		setTimeout("GameLaunch("+launch_try+")",250);
	return true;
}

function ServerDown(log_error)
{
	ShowMessage('Servidor en mantenimiento','El servidor de FX Interactive está en mantenimiento en estos momentos.<br/><br/>Por favor, disculpa las molestias y recarga la p&aacute;gina en unos minutos.',false);
	$("#game_progress_container").hide();
	if (typeof log_error!='undefined')
		DebugLog(log_error);
	GameExit("",function(){});
}

function GetGameName(id)
{
	return arrGameNames[id]==undefined ? ("Game_"+id) : arrGameNames[id];
}

function SetGameName(name)
{
	FXPlanet.game_name = name;
	if (game_id==20 || game_id==21)
		document.title = FXPlanet.game_name;
	FXPlanet.game_name_no_space = FXPlanet.game_name.replace(" ","");
}

function GameLaunch(launch_try)
{
	// cancelar el proceso si procede
	if (launch_try!=game_launch_try)
		return;
	var game_launch_state_previous = game_launch_state;
	time_out = 250;
	switch (game_launch_state) {
	case gls_start:
		// PASO 1: inicializar variables
		SetGameName(GetGameName(game_id));
		if (FXPlanet.game_name=="Game" || FXPlanet.game_name=="Game_"+game_id) {
			FXPlanet.AjaxCallEx("ajax/generic.php", { call: "Game.List" }, function(reply) {
				for (i=0; i<reply.Games.length; i++)
					if (reply.Games[i].Id==game_id)
						SetGameName(reply.Games[i].Name);
			});
		}
		FXPlanet.game_launch_plugin_position = game_id==20 || game_id==21 ? "0px" : "-2000px"; // que el plugin se vea sólo para juegos jugables en navegador
		browser = navigator.userAgent;
		if (navigator.appVersion.indexOf("Win")==-1) {
			GameExit("",function(){});
			window.location = "https://juegos.fxinteractive.comapplication/dispositivos_no_compatibles.php";
			return;
		}
		if (browser.indexOf("x64")!=-1) {
			GameExit("",function(){});
			alert("Estás usando Internet Explorer 64bits. Esta página requiere usar la versión de 32bits.");
			return;
		}
		if (browser.indexOf("MSIE")==-1 && browser.indexOf("Firefox")==-1 && browser.indexOf("Chrome")==-1 && browser.indexOf("Opera")==-1 && browser.indexOf("Safari")==-1) {
			GameExit("",function(){});
			alert(FXPlanet.game_name+" de momento sólo es compatible con los navegadores Internet Explorer 7+ (32 bits), Firefox, Chrome, Opera y Safari. Visítanos más adelante.");
			return;
		}
		if (false) {
			ServerDown();
			return;
		}
		DebugLog("gls_start: "+(FXPlanet.IsPluginInstalled()?"plugin detectado":"plugin no detectado"));
		game_launch_logged = false;
		$("#barra_progreso").hide();
		//$("#game_foot").hide();
		$("#game_progress_show").show();
		$("#game_progress_container").show();
		$("#game_ready").hide();
		$("#ranking_stripe_div").hide();
		// si se recarga la página (instalación del plugin, vuelta desde páginas de pago de puntosFX...): recordar autolanzar el juego
		FXPlanet.game_launched = true;
		FXPlanet.game_launched_playing = false;
		ArrayAddIfNotExist(FXPlanet.game_avoid_show,"not_loaded");
		FXInstallEntertainment.Hide();
		FXPlanet.social_try_login = true;
		install_state = 0;
		check_launcher_environment = true;
		game_launch_state = gls_web_login;
		game_launch_social_time = 30.0;
		// FXPlanet.game_registered no se reinicializa, no hace falta registrar más de una vez el juego
		break;
	case gls_web_login:
		// PASO 2: que el usuario haga login (sacando ventana flotante de login, o de signup, o usando login fb)
		game_launch_social_time -= 0.25;
		// esperar primero a saber si tenemos FB o no (para que se actualicen fb_user y user_logged)
		if ((FXPlanet.social_getting_data || FXPlanet.social_getting_login_state) && game_launch_social_time>0.0)
			ShowGameProgressText("Conectando con Facebook...");
		else if (FXPlanet.doing_login)
			ShowGameProgressText("Estableciendo usuario y contraseña...");
		else if (user_logged) { // si web ya tiene login, pasamos al siguiente paso
			DebugLog("gls_web_login terminado");
			ShowGameProgressText("Comprobando FX Web Player...");
			game_launch_state = FXPlanet.IsPluginInstalled() ? gls_launcher_update : gls_plugin;
			game_launch_time = 0.0;
		}
		else if (!IsAnyLoginWindow()) {
			if (FXPlanet.social_user!="" && FXPlanet.social_try_login) {  // si web tiene fb, hago login con fb y luego se lo paso al launcher
				ShowGameProgressText("Conectando con Facebook...");
				FXPlanet.social_try_login = false;
				DebugLog("gls_web_login login fb");
				FXPlanet.SocialLogin(FXPlanet.social_create_user_if_necessary);
			}
			else if (!FXPlanet.game_launch_on_step_cb("unlogged","")) {
				ShowGameProgressText("");
				return;
			}
			else {
				ShowGameProgressText("Esperando usuario y contraseña...");
				DebugLog("gls_web_login sin login");
				if (GetCookie("has_ever_logged")=="yes")
					OpenLoginWindow();
				else
					OpenCreateUserWindow();
			}
		}
		break;
	case gls_plugin:
		// PASO 3: que el usuario instale el plugin si no lo está
		if (FXPlanet.IsPluginInstalled()) { // el navegador nos va a recargar
			DebugLog("gls_plugin: detectado");
			FXPlanet.GameLaunchStop();
			window.location.reload();
			break;
		}
		var is_showing = true; // evita envio estadistica boton plugin mientras se esta cargando en background desde la home
		try { is_showing = parseInt($('#frame_game',window.parent.document).css('top'))>0; } catch(err) {};
		if (is_showing)
			FXPlanet.SendStat("has_ever_window_plugin","web_window_plugin_java_manual");
		if (overlay_number!=0 || onlogin_open_edituser || onlogin_open_shop || $(".overlay_box").length>0 || (typeof FXPlanet.select_hd)!="undefined")
			break;
		FXPlanet.select_hd = true;
		FXPlanet.GetJavaVersion(); // esta función puede que no devuelva la versión de java a la primera llamada (debido al retraso al cargar el applet en ie)
		$("#game_progress_container").hide();
		if (true) //FXPlanet.locale=="ru" || game_id!=20)
			ShowPage("page_install_fxwebplayer");
		else
			OpenWindow("win_hd_o_online.php",function() {
				$("#js_install_hd").click(function(e) {
					CloseWindow($(this));
					setTimeout(function() { ShowMessage('Descargando la versión HD de Navy Moves','Es la primera vez que juegas a Navy Moves en este ordenador.\n\nUna vez descargado, ejecutalo y se instalará la versión HD de Navy Moves.',false); },1000);
					setTimeout(function() { window.location="https://juegos.fxinteractive.com/" },10000);
				});
				$("#js_install_online").click(function(e) { CloseWindow($(this)); ShowPage("page_install_fxwebplayer"); });	
			});
		break;
	case gls_launcher_update:
		// PASO 4: esperar a que el plugin esté en marcha y respondiendo, y que el launcher esté instalado y actualizado por el plugin
		var plugin_state = PluginCall("State",',"LauncherParams":"/public"');
		// si el plugin está instalado...
		if (plugin_state.Result!="Ok")
			break;
		// mostrar progreso de la instalación del launcher, si es lo que hace el plugin
		ShowGameProgress(plugin_state,"Descargando FX Web Player","Instalando FX Web Player");
		// quitar mensajes de instrucciones para instalar el plugin: el plugin ya está instalado
		CloseWindows("win_instalacion_plugin_en_noexplorer_a_nv.php");
		if (check_launcher_environment) {
			environment = FXPlanet.CallLauncher("environment");
			if (environment && environment.Result!="Error") {
				DebugLog("gls_launcher_environment "+environment.Environment+"/public");
				if ("/public"=='/'+environment.Environment)
					check_launcher_environment = false;
				else {
					FXPlanet.CallLauncherIPCCom("close","");
					game_launch_state_previous = game_launch_state = gls_start;
				}
			}
			break;
		}
		data = FXPlanet.CallLauncher("state");
		if (!data.Result || data.Result=="Error" || data.Game_State=="preupdate")
			break;
		FXPlanet.net_slow = data.NetSlow;
		//alert("Recarga fxp.dll: "+PluginCall("ReloadFxpDll").Result);
		if (data.Connection=="no_connection") {
			game_launch_time -= 0.25;
			if (game_launch_time<=-15.0 && !FXPlanet.firewall_error) { // llevamos 15 segundos esperando que se conecte
				FXPlanet.firewall_error = true;
				ShowMessage('Conectando','Parece que hay un problema de conexión.<br/><br/>Si tienes un firewall, asegúrate de que esté permitiendo al FX Web Player el acceso a Internet.');
				FXPlanet.SendStat("has_ever_plugin_connected","web_plugin_no_connection");
			}
		}
		else if (data.Updating && data.Game_Id==0) {
			data = FXPlanet.CallLauncher("download_ex?id=0&core=1&isw2i=0");
			if (data.Result && data.Result!="Error")
				ShowGameProgress(data,"Descargando actualización de FX Web Player","Actualizando FX Web Player");
		}
		else {
			FXPlanet.SendStat("has_ever_plugin_connected","web_plugin_connection");
			//alert("Forzando reinstalación"); PluginCall("ReinstallLauncher");
			data_version = PluginCall("Version");
			if (!FXPlanet.is_explorer && (data_version.Result!="Ok" || data_version.Version<plugin_min_version)) {
				ShowMessage('Actualización del plugin','Se acaba de realizar una actualización del FX Web Player para visualizar entornos 3D en tu navegador.<br/><br/>Por favor, cierra tu navegador completamente (todas las ventanas y pestañas) y vuelve a abrirlo para que la aplicación tenga efecto.',false);
				GameExit("",function(){});
			}
			else {
				$("#debug_version").html("9-"+PluginCall("Version").Version+"-"+PluginCall("VersionFXP").Version+"-"+FXPlanet.CallLauncher("version").Version);
				if (data.Game_State=="playing" && data.Game_Id==game_id && FXPlanet.game_launch_survive_if_possible) {
					DebugLog("gls_launcher_update terminado - launcher jugando - pasando a gls_install");
					game_launch_state = gls_install;
				}
				else {
					DebugLog("gls_launcher_update terminado");
					game_launch_state = gls_launcher_login;
					game_launch_time = 30.0;
					launcher_connecting_fb = FXPlanet.social_user!="" && FXPlanet.social_signed_token!="" && user_hash_passw=="";
					if (launcher_connecting_fb)
						FXPlanet.CallLauncherSafe("login_social?socialid="+FXPlanet.social_user+"&network="+FXPlanet.social_network_prefix+"&token="+FXPlanet.social_signed_token+"&uniqid="+uniqid);
					else if (user_email!="")
						FXPlanet.CallLauncherSafe("login?user="+user_email+"&password="+user_hash_passw+"&rememberMe=0&uniqid="+uniqid);
					else
						FXPlanet.CallLauncherSafe("login?user="+GetCookie("user_email")+"&password="+user_hash_passw+"&rememberMe=0&uniqid="+uniqid);
					FXPlanet.SendStat("has_ever_launcher_login","web_launcher_login");
				}
			}
		}
		data = FXPlanet.CallLauncher("get_machine_id");
		if (data.Result && data.Result!="Error")
			machine_id = data.Reply;
		FXPlanet.SendStat("has_ever_plugin","web_install_plugin");
		break;
	case gls_launcher_login:
		// PASO 5: esperar a que el launcher se loguee con nuestro email/pass
		game_launch_time -= 0.25;
		if (game_launch_time<=0.0) {
			DebugLog("gls_launcher_login 1");
			game_launch_state = gls_start;
		}
		data = FXPlanet.CallLauncher("state");
		if (CheckLauncherTimeOut(data,5000,launch_try,"gls_launcher_login"))
			return;
		if (data.Result && data.Connection=="logged") {
			DebugLog("gls_launcher_login "+data.Connection);
			game_launch_state = gls_install;
		}
		else if (data.Result && data.Connection=="wrong_user") {
			DebugLog("gls_launcher_login "+data.Connection);
			if (launcher_connecting_fb)
				FBGetData(true,true);
			else
				Logout();
			game_launch_state = gls_start;
			FXPlanet.SendStat("has_ever_wrong_user","web_wrong_user");
		}
		break;
	case gls_install:
		// PASO 6: lograr que el juego esté instalado
		game_launch_time = 30.0;
		FXPlanet.SetLauncherNotificationsCallback();
		data = FXPlanet.CallLauncher("check_game?id="+game_id);
		if (CheckLauncherTimeOut(data,5000,launch_try,"gls_install-checkgame"))
			return;
		if (data.Result) {
			DebugLog("gls_install ya instalado");
			install_state = 4;
			FXPlanet.SendStat("has_ever_download_w2i","web_yet_installed");
		}
		else { // el juego no está instalado, instalarlo
			DebugLog("gls_install instalando juego");
			if (install_state==0 && !FXPlanet.game_launch_on_step_cb("uninstalled","")) {
				ShowGameProgressText("");
				return;
			}
			install_state = 1;
			data = FXPlanet.CallLauncher("download_w2i?id="+game_id);
			if (CheckLauncherTimeOut(data,5000,launch_try,"gls_install-download_w2i"))
				return;
			FXPlanet.SendStat("has_ever_download_w2i","web_download_w2i");
			DebugLog("gls_install download_w2i "+(data.Result?"ok":"cancel"));
			install_state = 2;
			if (!FXPlanet.net_slow || FXPlanet.locale=="ru")
				FXInstallEntertainment.Show();
			else
				OpenWindow("win_descarga_lenta.php",null,null,false,true,function() {
					FXInstallEntertainment.Show();
				});
		}
		game_launch_state = gls_game_installing;
		CloseLoginWindows();
		break;
	case gls_game_installing:
		// PASO 7: el juego se esta instalando
		game_launch_time -= 0.25;
		// si el juego se está descargando, mostrar progreso y mirar si ha terminado
		if (install_state==2) {
			data = FXPlanet.CallLauncher("download_ex?id="+game_id+"&core=1&isw2i=1");
			if (CheckLauncherTimeOut(data,5000,launch_try,"gls_game_installing-download_ex"))
				return;
			if (data.Result) {
				ShowGameProgress(data, String("<b>$game_name</b> cargando...").replace("$game_name",FXPlanet.game_name));
				if (data.State=="error") {
					/// DEPURANDO RAUL
					DebugLog("gls_game_installing2 "+data.State);
					FXPlanet.GameLaunchStop();
					ShowMessage('No hay conexión','No hay conexión con el servidor.<br/><br/>Por favor, disculpa las molestias y recarga la p&aacute;gina en unos minutos.',false);
					$("#game_progress_container").hide();
					FXPlanet.game_launch_on_step_cb("error","");
					return;
				}
				if (data.State=="finished" && (!FXPlanet.game_launch_wait_for_install_folder || FXPlanet.game_launch_install_folder!="")) {
					var data = new Object;
					data.State = "installing";
					data.Progress = 0.0;
					data.BPS = 0.0;
					data.Time = 0;
					FXPlanet.game_launch_on_update_state(data,"","");
					//FXPlanet.game_launch_on_step_cb("downloaded","");
					if (!FXPlanet.game_launch_on_step_cb("downloaded","")) {
					ShowGameProgressText("");
					return;
					}
					CloseWindows("win_descarga_lenta.php");
					var call = "install_w2i?id="+game_id;
					if (FXPlanet.game_launch_install_folder!="")
						call = call+'&dest="'+FXPlanet.game_launch_install_folder+'"';
					data = FXPlanet.CallLauncher(call);
					if (CheckLauncherTimeOut(data,5000,launch_try,"gls_game_installing-install_w2i"))
						return;
					DebugLog("gls_game_installing3 "+call+" devuelve "+(data.Result?"ok":"error"));
					if (data.Result)
						install_state = 3;
					FXPlanet.SendStat("has_ever_download_finished","web_download_finished");
				}
				else {
					if (data.Progress>=0.99)
						FXPlanet.SendStat("has_ever_download_progress_99","web_download_progress_99");
					else if (data.Progress>=0.75)
						FXPlanet.SendStat("has_ever_download_progress_75","web_download_progress_75");
					else if (data.Progress>=0.50)
						FXPlanet.SendStat("has_ever_download_progress_50","web_download_progress_50");
					else if (data.Progress>=0.25)
						FXPlanet.SendStat("has_ever_download_progress_25","web_download_progress_25");
					else if (data.Progress>=0.01)
						FXPlanet.SendStat("has_ever_download_progress_1","web_download_progress_1");
				}
			}
		}
		// la siguiente llamada, ademas de procesar peticiones de abrir tienda, etc., mira si la instalacion ha terminado
		FXPlanet.ProcessNotifications();
		// pasa a jugar de una vez si el juego está instalado, el launcher logueado, y no le estamos preguntando nada al usuario
		if (install_state==4 && overlay_number==0 && (game_launch_time<=0.0 || !FXPlanet.social_checking)) {
			if (!FXPlanet.game_launch_on_step_cb("installed","")) {
				ShowGameProgressText("");
				return;
			}
			DebugLog("gls_game_installing go!");
			//FXPlanet.AjaxCall("ajax/register_game.php", {game_id: game_id, referer:FXPlanet.Referer, tag:FXPlanet.Tag }, function(r) {
				//console.log("Registrando juego "+game_id);
				FXPlanet.game_registered = true;
			//});
			game_launch_state = gls_game_register;
			game_launch_time = 30.0;
			ShowGameProgressText("Registrando <b>"+FXPlanet.game_name+"</b>...");
			// activa el "instalado" de la barra de progreso
			if (typeof BarraProgreso != 'undefined') {
				BarraProgreso.setInstalled();
				BarraProgreso.update();
			}
		}
		//else
		//	DebugLog("-"+install_state+"-"+overlay_number+"-"+game_launch_time+"-"+FXPlanet.social_checking+"-"+user_logged+"-"+FXPlanet.social_user);
		break;
	case gls_game_register:
		// PASO 8: antes de lanzar, esperar a que el juego esté registrado
		game_launch_time -= 0.25;
		if (FXPlanet.game_registered) {
			DebugLog("gls_game_register registered");
			game_launch_state = gls_game_launch;
		}
		else if (game_launch_time<=0.0) {
			DebugLog("gls_game_register timeout, restarting");
			game_launch_state = gls_start;
		}
		break;
	case gls_game_launch:
		// PASO 9: lanzar el juego en sí (hay que esperar a que esté registrado)
		ShowGameProgressText(String("<b>$game_name</b> cargando...").replace("$game_name",FXPlanet.game_name));
		// pasa como parámetro la ventana del plugin, para que el juego se pinte en ella
		var plugin_result = PluginCall("Window");
		if (plugin_result.Result!="Ok") {
			ShowMessage('Atención','No se ha podido lanzar el juego.<br/><br/>');
			return;
		}
		FXPlanet.game_launch_window = plugin_result.Window;
		game_launch_time = 10.0; // 30.0; // ahora el juego se muestra poco después de empezar a cargarse
		game_launch_errors = 0;
		// si el juego ya esta lanzado, lo reutiliza
		if (FXPlanet.game_launch_survive_if_possible) {
			data = FXPlanet.CallLauncher("state");
			if (CheckLauncherTimeOut(data,30000,launch_try,"gls_game_launch-state"))
				return;
			if (data.Result) {
				FXPlanet.game_launch_survive_if_possible = data.Game_State=="playing" && data.Game_Id==game_id;
				if (FXPlanet.game_launch_survive_if_possible) {
					data = FXPlanet.CallLauncher("notify?data=hwnd_"+FXPlanet.game_launch_window);
					send_notifications = true;
					if (CheckLauncherTimeOut(data,30000,launch_try,"gls_game_launch-notify"))
						return;
					if (data.Result) {
						DebugLog("gls_game_launch notify "+FXPlanet.game_launch_window+" OK");
						game_launch_time = 1.0; // para que el principio de gls_game_running muestre el juego
						game_launch_state = gls_game_update;
						FXPlanet.CallLauncherIPCCom("setvardic","plugin_window,"+FXPlanet.game_launch_window); // sirve para detectar plugin en otra ventana
					}
				}
			}
		}
		else {// lanza el juego
			command_line = '&cmd=/HWND '+FXPlanet.game_launch_window+game_launch_params;
			if (FXPlanet.get_params.indexOf("reload_test")!=-1)
				command_line = command_line+"/reload_test";
			DebugLog("gls_game_launch launch");
			data = FXPlanet.CallLauncher("launch?id="+game_id+command_line);
			if (CheckLauncherTimeOut(data,30000,launch_try,"gls_game_launch-launch"))
				return;
			if (data.Result) {
				FXPlanet.SendStat("has_ever_game_launched","web_new_game_launched");
				ShowGameProgressText(String("<b>$game_name</b> cargando...").replace("$game_name",FXPlanet.game_name));
				DebugLog("lanzado");
				game_launch_state = gls_game_update;
				FXPlanet.CallLauncherIPCCom("setvardic","plugin_window,"+FXPlanet.game_launch_window); // sirve para detectar plugin en otra ventana
				//FXPlanet.AjaxCall("ajax/set_user_info.php", { Language: FXPlanet.locale }); // antes informaba del idioma de la sesioon al servidor navy
			}
		}
		break;
	case gls_game_update:
		// PASO 10: esperar a que el juego este actualizado
		data = FXPlanet.CallLauncher("state");
		if (!data.Result || data.Result=="Error")
			break;
		if (data.Game_State=="playing") {
			game_launch_state = gls_game_running;
			// estadística de gente nueva que juega
			FXPlanet.SendStat("has_ever_played","web_new_user_played");
			FXPlanet.game_launched_playing = true;
			FXPlanet.game_launched_playing_last_time = 0;
			$("#debug_version").html("9-"+PluginCall("Version").Version+"-"+PluginCall("VersionFXP").Version+"-"+
				FXPlanet.CallLauncher("version").Version+"-"+FXPlanet.CallLauncherIPCCom("game_version","").Reply);
			if (!FXInstallEntertainment.is_busy) // si no está en marcha el entretenimiento, mostrar el juego ya
				FXPlanet.GameLaunchShow();
		}
		else if (data.Game_State=="updating") {
			data = FXPlanet.CallLauncher("download_ex?id="+game_id+"&core=1&isw2i=0");
			if (data.Result && data.Result!="Error") {
				ShowGameProgress(data,"Descargando actualización de <b>"+FXPlanet.game_name+"</b>","Actualizando <b>"+FXPlanet.game_name+"</b>");
				// si no está en marcha el entretenimiento, ponerlo en marcha (para entretener al usuario)
				if ((data.State=="downloading" || data.State=="installing") && !FXInstallEntertainment.IsLaunched())
					FXInstallEntertainment.Show();
			}
		}
		else if (data.Game_State=="none" || data.Game_State=="main") {
			game_launch_errors++;
			if (game_launch_errors>=20) {
				DebugLog("gls_game_update relanzando juego: "+json_encode(data).replace(/\n/g,' '));
				game_launch_state = gls_start;
			}
		}
		FXPlanet.ProcessNotifications();
		break;
	case gls_game_running:
		// PASO 11: mostrar juego y responder a sus notificaciones
		time_out = 1000;
		game_launch_time -= 1.0;
		if (game_launch_time>-0.5 && game_launch_time<0.5) {
			DebugLog("gls_game_running juego cargado ");
			$("#game_progress_container").hide();
			FXPlanet.GameLaunchShow();
		}
		else if (game_launch_time>0) {
			if ($("#fxplanet_object").css("top")==FXPlanet.game_launch_plugin_position)
				$("#game_progress_container").hide();
			else
				ShowGameProgressText(String("<b>$game_name</b> cargando...").replace("$game_name",FXPlanet.game_name));
		}
		// verificar que el juego sigue en marcha, reiniciandolo si peta
		if (FXPlanet.game_auto_relaunch) {
			data = FXPlanet.CallLauncher("state");
			if (data.Result && data.Result!="Error" && (data.Game_State=="playing" || data.Game_State=="setting" || data.Game_State=="updating"))
				FXPlanet.game_launched_playing_last_time = 0;
			else if (++FXPlanet.game_launched_playing_last_time>=5) {
				DebugLog("gls_game_running relanzando juego: "+json_encode(data).replace(/\n/g,' '));
				game_launch_state = gls_start;
			}
		}
		// verificar que el juego no se ha abierto en otra ventana/pestaña
		data = FXPlanet.CallLauncherIPCCom("getvardic","plugin_window");
		if (data.Result=="Ok" && data.Reply!="" && data.Reply!=FXPlanet.game_launch_window) {
			ShowMessage('Juego en otra ventana',FXPlanet.game_name+' se ha abierto en otra ventana o pestaña del navegador.<br/><br/>Para seguir jugando, utiliza esa ventana o pestaña.',false);
			GameExit("",function(){});
		}
		// Enviar notificaciones pendientes
		if (send_notifications)
			FXPlanet.Notification.flush();
		FXPlanet.ProcessNotifications();
		break;
	}
	if (game_launch_state_previous!=game_launch_state)
		time_out = 0;
	setTimeout("GameLaunch("+launch_try+")",time_out);
}

function GameExit(confirm_text,callback)
{
	if (!FXPlanet.game_launched) {
		callback();
		return;
	}
	var cb_exit = function()
	{
		FXPlanet.game_launched = false;
		FXPlanet.game_launched_playing = false;
		ArrayAddIfNotExist(FXPlanet.game_avoid_show,"not_loaded");
		FXPlanet.GameLaunchStop();
		$("#install_entertainment").empty();
		$("#install_entertainment").hide();
		$("#fxplanet_object").remove();
		callback();
	};
	if (confirm_text===null || confirm_text===undefined)
		confirm_text = "Para realizar esta acción es necesario abandonar la partida. ¿Estás seguro?";
	if (confirm_text!="" && FXPlanet.must_confirm_exit_game)
		ConfirmDialog("Abandonar la partida",confirm_text,cb_exit);
	else
		cb_exit();
}

function BeforeUnload()
{
	return "Al cerrar la página saldrás del juego. ¿Estás seguro?";
}

function WaitForReplyChallenge(challenge,callback)
{
	var cb = callback;
	var tries = 30;
	var _challenge = challenge;
	var func_wait = function() {
		try {
			if ((--tries)<=0) {
				DebugLog("https no responde");
				cb("","HTTPS_NO_CONNECTION","No hay conexión con el servidor.\n\nPor favor, vuelve a intentarlo en unos minutos");
				return;
			}
			frame_content = $("#https")[0].contentWindow.document.body.innerHTML;
			reply_challenge = GetXMLData(frame_content,"reply_challenge");
			hash_passw = GetXMLData(frame_content,"user_hash_passw");
			if (reply_challenge=="" || GetXMLData(frame_content,"challenge")!=_challenge)
				throw "continue";
			else if (reply_challenge=="error" || hash_passw=="") {
				SetCookie("user_pass_known","");
				cb("","WRONG_PASS","La contraseña no es correcta");
			}
			else {
				SetCookie("user_pass_known","true");
				SetCookie("user_hash_passw",hash_passw);
				DebugLog("reply_challenge->"+reply_challenge+";hash_passw->"+hash_passw);
				user_hash_passw = hash_passw;
				cb(reply_challenge,"","");
			}
		}
		catch(err) {
			setTimeout(func_wait,500);
		}
	};
	func_wait();
}

function WaitForFrameContent(element_id,search_content,callback)
{
	var cb = callback;
	var func_wait = function() {
		try {
			element = document.getElementById(element_id);
			if (element==null) {
				cb("");
				return;
			}
			frame_content = element.contentWindow.document.body.innerHTML;
			if (frame_content.indexOf(search_content)!=-1) {
				cb(frame_content);
				return;
			}
			throw "continue";
		}
		catch(err) {
			setTimeout(func_wait,500);
		}
	};
	func_wait();
}


FXPlanet.LoginWithPass = function(email,user_pass,user_hold_logged,cb_ok,cb_ko)
{
	FXPlanet.Login(email,"",hashPassword(user_pass,email),user_hold_logged,cb_ok,cb_ko);
}

FXPlanet.Login = function(email,user_id,user_hash,user_hold_logged,cb_ok,cb_ko)
{
	user_hash_passw = user_hash;
	var arrParams;
	FXPlanet.doing_login = true;
	$("#js_loading").show();
	FXPlanet.AjaxCallEx("ajax/login_get_challenge.php", { mail: email }, function(reply) {
		if (reply._resultStr!="WU_OK") {
			FXPlanet.doing_login = false;
			FXPlanet.Event.trigger("login_ko",reply);
			if (typeof cb_ko==='function') cb_ko(reply);
			return;
		}
		login_url = "https://juegos.fxinteractive.com/fx/application/wu2_login.php?email="+bin2hex(email)+"&challenge="+bin2hex(reply.Challenge);
		if (user_hash_passw!="")
			login_url += "&hash_passw="+bin2hex(user_hash_passw);
		DebugLog("login_url->"+login_url+"<-");
		DebugLog("challenge->"+reply.Challenge);
		if ($("#https").length==0)
			$("body").prepend('<iframe name="https" id="https" width="400" height="400" src="loading.php" style="display:none;"></iframe>');
    	$("#https").attr("src",login_url);
    	WaitForReplyChallenge(reply.Challenge,function(reply_challenge,error,error_message) {
    		if (reply_challenge=="") {
				FXPlanet.doing_login = false;
				var obj = new Object;
				obj._resultStr = error;
				obj._resultMsg = error_message;
				FXPlanet.Event.trigger("login_ko",obj);
				if (typeof cb_ko==='function') cb_ko(obj);
				return;
			}
			if (user_id!="")
				arrParams = { userid: user_id, hash: reply_challenge, navy: navy_session };
			else
				arrParams = { mail: email, hash: reply_challenge, navy: navy_session };
			FXPlanet.AjaxCallEx("ajax/login.php", arrParams, function(reply) {
				$("#js_loading").hide();
				if (reply._resultStr!="WU_OK") {
					FXPlanet.doing_login = false;
					FXPlanet.Event.trigger("login_ko",reply);
					if (typeof cb_ko==='function') cb_ko(reply);
					return;
				}
				var emailLogged = reply.UserMail!="" ? reply.UserMail : email;
				FXPlanet.social_user_logged = false;
				FXPlanet.User.uid = reply.UserId;
				FXPlanet.Event.trigger("login",emailLogged,reply.Alias,reply.Country,reply.CountryBirth,reply.UserId,"",user_hold_logged);
				if (typeof cb_ok==='function') cb_ok(reply);
			});
    	});
	});
}

FXPlanet.LoginWithCookies = function(cb_ok,cb_ko)
{
	if (user_logged) {
		if (typeof cb_ok==='function') cb_ok();
		return;
	}
	if (typeof cb_ok==='function') FXPlanet.Event.subscribe('login', cb_ok);
	if (typeof cb_ko==='function') FXPlanet.Event.subscribe('login_ko', cb_ko);
	if (!FXPlanet.doing_login) {
		FXPlanet.doing_login = true;
		FXPlanet.AjaxCallEx("ajax/login_with_session.php", {}, function(reply) {
			FXPlanet.doing_login = false;
			if (reply._resultStr=="WU_OK") {
				FXPlanet.social_user_logged = false;
				FXPlanet.User.uid = reply.UserId;
				FXPlanet.Event.trigger("login",reply.UserMail,reply.Alias,reply.Country,reply.CountryBirth,reply.UserId);
				user_hash_passw = GetCookie("user_hash_passw");
			}
			else if (GetCookie("user_email")!="" && GetCookie("user_pass_known")=="true") {
				DebugLog("FXPlanet.LoginWithCookies");
				FXPlanet.Login(GetCookie("user_email"),"","",true);
			}
			else if (FXPlanet.social_network=="fb") {
				FXPlanet.GetSocialData(function() { FXPlanet.SocialLogin(false,null); },cb_ko);	
			}
			else
				if (typeof cb_ko==='function') cb_ko();
		});
	}
}

function OnLogin(mail,alias,country,country_birth,session,page,user_hold_logged)
{
	DebugLog("OnLogin "+mail);
	FXPlanet.doing_login = false;
	user_logged = true;
	user_email = mail;
	user_alias = alias;
	user_country = country;
	user_country_birth = country_birth;
	SetCookie("user_email",(user_hold_logged!==false)?user_email:"");
	$("input[name=alias]").val(user_alias);
	ShowPage(page);
	if (typeof BarraProgreso=='undefined' || FXPlanet.social_user!="")
		user_email_validated = true;
	else // activa el texto "email" de la barra de progreso
		FXPlanet.AjaxCall("ajax/is_validated.php", {}, function(xml) {
			user_email_validated = GetXMLData(xml,'result')=='ok';
			if (user_email_validated)
				BarraProgreso.setEmail();
		});
	// estadística de gente nueva que hace login
	FXPlanet.SendStat("has_ever_logged","web_new_user_logged");
	// comprobacion de usuario baneado
	FXPlanet.AjaxCallEx("ajax/generic.php", { call: "User.CheckBan", Game: game_id }, function(reply) {
		if (reply._resultStr=="WC_ERROR_BANNED") {
			var message = 'Tu cuenta ha sido desactivada hasta el $date.<br/><br/>Razón: $reason';
			message = message.replace('$date',reply.BanEndDate).replace('$reason',reply.BanReason);
			ShowMessage('Cuenta desactivada',message,false);
			GameExit("",function(){});
		}
	});
	if (onlogin_open_edituser)
		OpenEditUserWindow(true,FXPlanet.IsPluginInstalled());
	if (onlogin_open_shop)
		FXPlanet.OpenPfxWindow();
	FBCheck();
}
FXPlanet.Event.subscribe('login', OnLogin);

function Logout(cb_ok)
{
	user_logged = FXPlanet.social_user_logged = user_email_validated = false;
	user_email = '';
	FXPlanet.AjaxCall("ajax/logout.php", {}, function(xml) {
		SetCookie("user_email","");
		SetCookie("user_pass_known","false");
		if (typeof cb_ok==='function') cb_ok();
	});			
}

//Redirige al juego los eventos de pérdida y adquisición de foco de la web, para pausarlo si pierde el foco
var active_element;
function SetFocusEvents() {
	// [ALFON] document.activeElement produce error de js no previsible en IE
	//active_element = document.activeElement;
	if (FXPlanet.is_explorer) {
		document.onfocusout = function() { OnWindowBlur(); };
		document.onfocusin = function() { OnWindowFocus(); };
	}
	else {
		window.onblur = function() { OnWindowBlur(); };
		window.onfocus = function() { OnWindowFocus(); };
	}
}
function OnWindowFocus() {
	if (FXPlanet.game_avoid_show.length==0 && $(".overlay_box").length==0)
		FXPlanet.CallLauncher("notify?data=focus");
}
function OnWindowBlur() {
	// [ALFON] document.activeElement produce error de js no previsible en IE
	//if (active_element != document.activeElement) {
	//	active_element = document.activeElement;
	//	return;
	//}
	//FXPlanet.CallLauncher("notify?data=blur");
}

function SendTraces()
{
	var obj_traces = document.getElementById("debug_log");
	if (obj_traces!=null)
		FXPlanet.AjaxCallEx("ajax/trace_error.php", { trace: uniqid+": "+obj_traces.innerHTML }, function(reply) { });
	setTimeout(SendTraces,5000);
}

function InitTraces()
{
	// envio de trazas periodicamente
	if (FXPlanet.get_params.indexOf("trace_errors")!=-1)
		SendTraces();
	DebugLog("userAgent: "+navigator.userAgent);
	DebugLog("appVersion: "+navigator.appVersion);
	DebugLog("get_params: "+FXPlanet.get_params);
}
setTimeout(InitTraces,5000);

FXPlanet.VastSet = function(xml,cb_ok)
{
	FXPlanet.vast_videos = $('VAST > Ad > InLine',xml);
	if (FXPlanet.vast_videos.length==0) {
		var wrapperUrl = $.trim($('VAST > Ad > Wrapper > VASTAdTagURI',xml).text());
		if (wrapperUrl!='') {
			FXPlanet.VastInitTrack(FXPlanet.vast_tracking_initial,xml);
			FXPlanet.VastSetUrl(wrapperUrl,cb_ok);
		}
		else
			FXPlanet.CallLauncher("notify?data=play_ad_ko");
	}
	else
		if (typeof cb_ok==='function') cb_ok();
}

FXPlanet.VastSetUrl = function(url)
{
	FXPlanet.vast_url = url;
}

FXPlanet.VastGetAdName = function()
{
	if (FXPlanet.vast_videos.length==0 || typeof jwplayer=='undefined')
		return '';
   	else
   		return $('AdTitle',FXPlanet.vast_videos[0]).text();
}

FXPlanet.VastInitTrack = function(track,xmlData)
{
	var AddTrack = function(track,name,selector,xmlData)
	{
		$(selector,xmlData).each(function(index) {
			var url = $.trim($(this).text());
			if (typeof track[name]=='undefined')
				track[name] = [];
			if (url!='')
				track[name].push(url);
		});
	};
	AddTrack(track,'impression','Impression',xmlData);
	AddTrack(track,'start','Tracking[event="start"]',xmlData);
	AddTrack(track,'midpoint','Tracking[event="midpoint"]',xmlData);
	AddTrack(track,'complete','Tracking[event="complete"]',xmlData);
	AddTrack(track,'mute','Tracking[event="mute"]',xmlData);
	AddTrack(track,'pause','Tracking[event="pause"]',xmlData);
	AddTrack(track,'fullscreen','Tracking[event="fullscreen"]',xmlData);
	AddTrack(track,'firstQuartile','Tracking[event="firstQuartile"]',xmlData);
	AddTrack(track,'midpoint','Tracking[event="midpoint"]',xmlData);
	AddTrack(track,'thirdQuartile','Tracking[event="thirdQuartile"]',xmlData);
	AddTrack(track,'click','ClickTracking',xmlData);
}

FXPlanet.VastTrack = function(arrTracks)
{
    for (var i=0; i<arrTracks.length; i++)
    	if (arrTracks[i]!='')
    		//$.ajax({ url:arrTracks[i] });
			$.ajax({ url: 'https://juegos.fxinteractive.comapplication/ajax/redirect.php?url='+encodeURIComponent(arrTracks[i]) });
}

function CloneObject(obj)
{
	var newObj = (obj instanceof Array) ? [] : {};
	for (i in obj)
		newObj[i] = (obj[i] && typeof obj[i]=="object") ? CloneObject(obj[i]) : obj[i]
	return newObj;
};

FXPlanet.VastPlayAd = function()
{
	FXPlanet.vast_tracking_initial = new Array();
	$.ajax({
		url: 'https://juegos.fxinteractive.comapplication/ajax/redirect.php?url='+encodeURIComponent(FXPlanet.vast_url),
		error: function(jqXHR, textStatus, errorThrown) {
			DebugLog('VastSetUrl '+FXPlanet.vast_url+"-> error: "+textStatus+"-"+errorThrown);
			FXPlanet.CallLauncher("notify?data=play_ad_ko");
		},
		success: function(xml) {
			FXPlanet.VastSet(xml,function() {
				DebugLog('VastPlayAd leidos '+FXPlanet.vast_videos.length+' videos de '+FXPlanet.vast_url);
				if (FXPlanet.vast_videos.length==0 || typeof jwplayer=='undefined') {
					FXPlanet.CallLauncher("notify?data=play_ad_ko");
					return;
				}
				var video_data = FXPlanet.vast_videos[0];
				FXPlanet.vast_tracking = CloneObject(FXPlanet.vast_tracking_initial);
				FXPlanet.VastInitTrack(FXPlanet.vast_tracking,video_data);
				FXPlanet.vast_position = 0.0;
				var urlFile = $.trim($('MediaFile[delivery="progressive"]:first',video_data).text());
				var bestDist = 1000000;
				$('MediaFile[delivery="progressive"]',video_data).each(function(index) {
					var dist = Math.abs(parseInt($(this).attr('bitrate'))-600);
					if (dist<bestDist) {
						bestDist = dist;
						urlFile = $.trim($(this).text());
					}
				});
				DebugLog('VastPlayAd lanzando '+urlFile);
				jwplayer("vast_container_2").setup({
					flashplayer: "/fx/public/swf/player.swf",
					file: urlFile,
					width: parseInt($('#vast_container').css('width')),
					height: parseInt($('#vast_container').css('height')),
					'controlbar.position': 'none',
					events: {
						onPlay: function() {
							FXPlanet.VastTrack(FXPlanet.vast_tracking['impression']);
							FXPlanet.VastTrack(FXPlanet.vast_tracking['start']);
						},
						onPause: function() {
							jwplayer("vast_container_2").play();
							window.open($.trim($('ClickThrough:first',video_data).text()),$('AdTitle',video_data).text());
							FXPlanet.VastTrack(FXPlanet.vast_tracking['click']);
						},
						onComplete: function()
						{
							FXPlanet.VastTrack(FXPlanet.vast_tracking['complete']);
							ShowPage('gameplayer');
							FXPlanet.CallLauncher("notify?data=play_ad_ok");
						},
						onMute: function() { FXPlanet.VastTrack(FXPlanet.vast_tracking['mute']); },
						onFullscreen: function() { FXPlanet.VastTrack(FXPlanet.vast_tracking['fullscreen']); },
						onTime: function(data) { 
							var position = data.position/data.duration;
							if (position>0.75 && FXPlanet.vast_position<=0.75) FXPlanet.VastTrack(FXPlanet.vast_tracking['thirdQuartile']);
							if (position>0.50 && FXPlanet.vast_position<=0.50) FXPlanet.VastTrack(FXPlanet.vast_tracking['midpoint']);
							if (position>0.25 && FXPlanet.vast_position<=0.25) FXPlanet.VastTrack(FXPlanet.vast_tracking['firstQuartile']);
							FXPlanet.vast_position = position;
						}
					}
				});
				jwplayer().play();
				ShowPage('page_vast');
			});
		}
	});
}
</details>

@Darthagnon
Copy link
Owner Author

Darthagnon commented May 3, 2020

Temporary workaround:
Download your games as normal via FX Store. Then, once the w2i has downloaded, check that it opens with 7zip.

If it does, it's a good w2i image. Save it and back it up.

If it doesn't, save it anyway (in case we ever find a proper fix), but also save the extracted files and make a 7zip out of them. Then, rename that 7zip as a w2i file.

EDIT: confirmed that the only game afaik that has this problem is Runaway. Tested with Imperium II la conquista de hispania, and the newly downloaded w2i is the same as always. Should be the same for most other FX w2i games. Let me know of any that don't work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant