// https://github.com/yanatan16/nanoajax
!function(t,e){function n(t){return t&&e.XDomainRequest&&!/MSIE 1/.test(navigator.userAgent)?new XDomainRequest:e.XMLHttpRequest?new XMLHttpRequest:void 0}function o(t,e,n){t[e]=t[e]||n}var r=["responseType","withCredentials","timeout","onprogress"];t.ajax=function(t,a){function s(t,e){return function(){c||(a(void 0===f.status?t:f.status,0===f.status?"Error":f.response||f.responseText||e,f),c=!0)}}var u=t.headers||{},i=t.body,d=t.method||(i?"POST":"GET"),c=!1,f=n(t.cors);f.open(d,t.url,!0);var l=f.onload=s(200);f.onreadystatechange=function(){4===f.readyState&&l()},f.onerror=s(null,"Error"),f.ontimeout=s(null,"Timeout"),f.onabort=s(null,"Abort"),i&&(o(u,"X-Requested-With","XMLHttpRequest"),e.FormData&&i instanceof e.FormData||o(u,"Content-Type","application/x-www-form-urlencoded"));for(var p,m=0,v=r.length;v>m;m++)p=r[m],void 0!==t[p]&&(f[p]=t[p]);for(var p in u)f.setRequestHeader(p,u[p]);return f.send(i),f},e.nanoajax=t}({},function(){return this}());

var viafirma = {
		
		init: function(options) {
			var initTime = new Date().getTime();
			// (default) After N seconds we launch a callback since the user has not Desktop installed
			var unloadedTime = 10;
			if(options.unloadedTime != null && options.unloadedTime != 0) {
				unloadedTime = options.unloadedTime;
			}
			if (!options.operationId || options.operationId == "") {
				console.error("operationId can't be empty");
				return;
			}
			
			if (!options.viafirmaUrl || options.viafirmaUrl == "") {
				console.error("viafirmaUrl can't be empty");
				return;
			}
			
			var finalOptions = {
					operationId: options.operationId,
					viafirmaUrl: options.viafirmaUrl,
					errorCallback: options.errorCallback || function() {},
					successCallback: options.successCallback || function() {},
					cancelCallback: options.cancelCallback || function() {},
					unloadedCallback: function() {
						clearInterval(interval);
						if (options.unloadedCallback) {
							options.unloadedCallback();
						} else {
							window.location.replace("https://descargas.viafirma.com/viafirma/desktop/download.html");
						}
					}
			};
			if (finalOptions.viafirmaUrl.lastIndexOf("/") < finalOptions.viafirmaUrl.length - 1) {
				finalOptions.viafirmaUrl = finalOptions.viafirmaUrl + "/"; 
			}
			
			var interval = setInterval(function() {
				nanoajax.ajax({
					url: finalOptions.viafirmaUrl +'api/rest/services/operation/finished/'+ finalOptions.operationId +"?t="+ (new Date()).getTime(),
					cors: true
				}, function (code, operation) {
					var operation = JSON.parse(operation);
					if (code != "200") {
						console.error("Operation status request error", operation);
						clearInterval(interval);
						finalOptions.errorCallback(operation);
					} else {
						console.debug(operation);						
						
						if (operation.isFinished) {
							clearInterval(interval);
							
							if (operation.isCancelled) {
								finalOptions.cancelCallback(operation);
								return;
							}
							
							if (operation.hasErrors) {
								finalOptions.errorCallback(operation);
								return;
							}

							if (operation.isSignature) {
								viafirma._sign(finalOptions);
							} else {
								viafirma._auth(finalOptions);
							}
						} else if(!operation.isDownloaded) {
							var timesecs = (new Date().getTime() - initTime)/1000;
							if(timesecs > unloadedTime) {
								finalOptions.unloadedCallback(operation);
								return;
							}
						}
					}
				});
			}, 2500);
		},
		
		_auth: function(finalOptions) {
			nanoajax.ajax({
				url: finalOptions.viafirmaUrl +'api/rest/services/auth/validation/'+ finalOptions.operationId +"?t="+ (new Date()).getTime(),
				cors: true
			}, function(code, auth) {
				var auth = JSON.parse(auth);
				
				if (code != "200") {
					console.error("Auth operation request error", auth);
					finalOptions.errorCallback(auth);
				} else {
					finalOptions.successCallback(auth);
				}
			});
		},
		
		_sign: function(finalOptions) {
			nanoajax.ajax({
				url: finalOptions.viafirmaUrl +'api/rest/services/signature/'+ finalOptions.operationId +"?t="+ (new Date()).getTime(),
				cors: true
			}, function(code, signature) {
				var signature = JSON.parse(signature);
				
				if (code != "200") {
					console.error("Signature operation request error", signature);
					finalOptions.errorCallback(signature);
				} else {
					finalOptions.successCallback(signature);
				}
			});
		}
};