/** * @author Antonio Gámez * @contact agamez@dobleh.com * dobleOS desktop API */ /** lo primero es cargar Jquery, sincronamente. lo necesitamos para todo */ //var req = new XMLHttpRequest(); //req.open("GET", "/backoffice/js/jquery-2.1.1.min.js", false); // 'false': synchronous. //req.send(null); //var headElement = document.getElementsByTagName("head")[0]; //var newScriptElement = document.createElement("script"); //newScriptElement.type = "text/javascript"; //newScriptElement.text = req.responseText; //headElement.appendChild(newScriptElement); var PATH = "/backoffice"; var PATH_APP = "/backoffice/applications"; var MODULE_NAME = "data-module"; var MODULE_JS = "data-js"; var MODULE_CSS = "data-css"; var EXTRAS = "data-extras"; var WORKING_MSG = "Dame un segundo..."; var LANG = "/es" var fullscreen = false; $(document).ready(function(){ /** Inicializacion */ $(document).ready(function(){ load();//->carga los modulos solicitados configureUI();//->configura los componentes de UI }); }); /** Carga las librerias y hojas de estilo que necesite el modulo en ejecucion */ function load(){ if ( $("body").attr(EXTRAS)==null ) pEXTRAS = ""; else pEXTRAS = $("body").attr(EXTRAS); /** JS modulo en ejecucion */ if ( $("body").attr(MODULE_NAME) ){ loadJS(PATH_APP+"/"+$("body").attr(MODULE_NAME)+"/js/application.js"); //loadCSS(PATH_APP+"/"+$("body").attr(MODULE_NAME)+"/css/application.css");//es lento y genera un efecto de recolocacion en pantalla muy feo } if ( $("body").attr(MODULE_JS) ){ $.each( $("body").attr(MODULE_JS).split(","), function(key,value){ loadJS(PATH_APP+"/"+$("body").attr(MODULE_NAME)+"/js/"+value.trim()+".js"); }); } if ( $("body").attr(MODULE_CSS) ){ $.each( $("body").attr(MODULE_CSS).split(","), function(key,value){ loadCSS(PATH_APP+"/"+$("body").attr(MODULE_NAME)+"/css/"+value.trim()+".css"); }); } //libreria de sistema loadCSS(PATH+"/js/jquery-ui/jquery-ui.min.css"); loadJS(PATH+"/js/jquery-ui/jquery-ui.min.js"); loadCSS(PATH+"/js/fancy/jquery.fancybox.css"); loadJS(PATH+"/js/fancy/jquery.fancybox.js"); loadJS(PATH+"/js/fancy/jquery.fancybox.pack.js"); if ( pEXTRAS.indexOf('grid')!=-1 ){ loadCSS(PATH+"/js/grid/pqgrid.min.css"); loadJS(PATH+"/js/grid/pq-localize-es.js"); loadJS(PATH+"/js/grid/pqgrid.min.js"); /** El GRID es castellano */ $.paramquery.pqPager.setDefaults($.paramquery.pqPager.regional['es']); } if ( pEXTRAS.indexOf('select2')!=-1 ){ loadCSS(PATH+"/js/select2/select2.css"); loadJS(PATH+"/js/select2/select2.min.js"); } if ( pEXTRAS.indexOf('download')!=-1 ){ loadJS(PATH+"/js/jquery.fileDownload.js"); } if ( pEXTRAS.indexOf('fullscreen')!=-1 ){ loadJS(PATH+"/js/jquery.nativefullscreenapi.js"); } if ( pEXTRAS.indexOf('upload')!=-1 ){ loadCSS(PATH+"/js/upload/css/style.css"); loadJS(PATH+"/js/upload/jquery.fileupload.js"); loadJS(PATH+"/js/upload/jquery.iframe-transport.js"); loadJS(PATH+"/js/upload/jquery.knob.js"); loadJS(PATH+"/js/upload/jquery.ui.widget.js"); } if ( pEXTRAS.indexOf('datetimepicker')!=-1 ){ loadCSS(PATH+"/js/datetimepicker/jquery.datetimepicker.css"); loadJS(PATH+"/js/datetimepicker/jquery.datetimepicker.full.min.js"); } if ( pEXTRAS.indexOf('footable')!=-1 ){ loadCSS(PATH+"/js/footable/css/footable.core.css"); loadCSS(PATH+"/js/footable/css/footable.metro.css"); loadJS(PATH+"/js/footable/footable.all.min.js"); } } /** * function to load a given css file */ function loadCSS(href) { var cssLink = $(""); $("head").append(cssLink); }; /** * function to load a given js file */ function loadJS(src) { $.ajaxSetup({async:false}); $.getScript(src, function(data, textStatus, jqxhr) { console.log('modulo '+src.split('/').pop()+' cargado'); }); $.ajaxSetup({async:true}); }; /** recarga la ventana princial */ function reload(){ location.reload(); } /** Configura los componentes de UI */ function configureUI(){ $( ".radio-ui" ).buttonset(); $("button").click( function(e){e.preventDefault();e.stopPropagation();}); //deshabilita el submit que por defecto tiene los botones $("button.reload").click( function() { reload() }); /** esto asigna al evento onclick del objeto, la llamada al metodo doXXX */ $("button[data-action]").each(function(){ try { $(this).click( function(){ eval($(this).attr("data-action")+"()"); return false; }); } catch (e){console.error(e);} }); /** el boton cerrar modulo */ $("nav ul li.close").click(function(){ closeWindowModule(); }); } /** bloquear la pantalla */ function overlay(){ if ( !$("#overlay").length ) $("
").appendTo("body"); } /** bloquear la pantalla con un mensaje */ function blockScreen(msg){ extra_overlay=""; extra_box=""; append="#overlay"; if ( $("#overlay").length ){ console.log("detectada superposicion de overlays"); extra_overlay="overlay-extra"; extra_box="box-rgba-8-extra"; append=".overlay-extra"; } $("
").appendTo("body"); $("

"+msg+"

").appendTo(append); } /** desbloquear la pantalla */ function unblockScreen(){ if ( $(".overlay-extra").length ){ console.log("desbloqueando pantalla superpuesta"); $(".overlay-extra").remove(); return; } if ( $("#overlay").length ){ console.log("desbloqueando pantalla normal"); $("#overlay").remove(); } } /** * Envia una peticion y recibe los datos en formato json invocando al callback correspondiente, ok o ko */ function query(parameters,ifok,iferr,async){ if ( async==false ) console.log("llamada sincrona !!!") $.ajax({type: "post",url: '/?',data: parameters,async:(async==null?true:async),success: ifok,error: iferr,dataType: "json"}); } /** Envio generico del formulario de pantalla */ function sendForm(action){ blockScreen(WORKING_MSG); $("#action").val(action); $("#channel").val("html"); $("form").attr("method","post").submit(); } /** Envio generico del formulario modo json */ function sendJsonForm(action, success, fail, async){ blockScreen(WORKING_MSG); $("#action").val(action); $("#channel").val("json"); query( $("form").serialize(), success, fail, async ); } function showAlert(msg){ $( "
"+msg+"
" ).dialog({ modal: true, buttons: { VALE: function(){ $( this ).dialog( "close" ); } } }); return false; } /************************************** * Abrir, reabrir y cerrar modulos *************************************/ $open_modules = new Array();//array de objetos informacion de estado modulos function getOpenModules(clazz){ for(var i=0;i<$open_modules.length;i++) if($open_modules[i].clazz==clazz) return i; return null; } function getActiveModule(){ for(var i=0;i<$open_modules.length;i++) if($open_modules[i].focus==true) return i; return null; } function openWindowModule(clazz,action){ toggleFullScreen(); clazz=clazz.toLowerCase(); if ( getOpenModules(clazz)==null ){ $div = $("
"); $if = $(""); $if.appendTo($div); $div.appendTo("body"); $if.fadeIn(300); $div.animate({top:"0px"},200); setTimeout(function(){ if ( action ) action="&action="+action; else action=""; $if.attr("src","?class="+clazz+action); }, 500); console.log("modulo "+clazz+" creado"); $open_modules.push({'clazz':clazz,'focus':true}); console.debug( $open_modules ); if (clazz == "gesbox" || clazz == "auditor" || clazz == "mensajes" || clazz == "noticias" || clazz == "encuestas" || clazz=="tareas" || clazz=="analytics" || clazz=="colector" || clazz=="telematel") {/** fix angular */ $(document).find("nav").css("display","none"); } } else { reopenWindowModule(clazz); if (clazz=="gesbox"||clazz=="auditor"||clazz=="mensajes" || clazz == "noticias" || clazz == "encuestas" || clazz=="tareas" || clazz=="analytics" || clazz=="colector" || clazz=="telematel"){/** fix angular */ $(document).find("nav").css("display","none"); } } } function reopenWindowModule(clazz){ $("#window-"+clazz).animate({top:"0px"},200); $("#window-"+clazz).fadeIn(300); $(".iframe-"+clazz).get(0).contentWindow['doLoadMenu'](); $open_modules[getOpenModules(clazz)].focus=true; console.log("modulo "+clazz+" recargado"); console.debug( $open_modules ); } function hideWindowModule(){ $(".flag-menu-open").removeClass("flag-menu-open"); for(var i=0;i<$open_modules.length;i++){ console.log("marcando menu "+".flag-"+$open_modules[i].clazz); $(".flag-"+$open_modules[i].clazz).addClass("flag-menu-open"); } o = getActiveModule(); if ( o==null ) { return false; } clazz = $open_modules[o].clazz; $("#window-"+clazz).animate({top:"-10000px"},500); $("#window-"+clazz).fadeOut(300); closeMenu(); closeTitle(); $open_modules[o].focus=false; console.log("modulo "+clazz+" oculto"); console.debug( $open_modules ); if (clazz == "gesbox" || clazz == "auditor" || clazz == "mensajes" || clazz == "noticias" || clazz == "encuestas" || clazz=="tareas" || clazz=="analytics" || clazz=="colector" || clazz=="telematel") {/** fix angular */ $(document).find("nav").css("display","inline"); } } function closeWindowModule(){ //si el visor esta activo, lo cerramos y salimos sin cerrar el modulo console.log("----------------cerrando ventanas"); o = getActiveModule(); v = getOpenModules('viewer'); if ( o==null ) return false; clazz = $open_modules[o].clazz; if ( clazz=="gesbox" && v!=null ){ console.log("cerrando viewer"); $($open_modules[v].object).fadeOut(500); $($open_modules[v].object).find("iframe").delay(600).remove(); $open_modules.splice( v,1 ); return false; } if (clazz == "gesbox" || clazz == "auditor" || clazz == "mensajes" || clazz == "noticias" || clazz == "encuestas" || clazz=="tareas" || clazz=="analytics" || clazz=="colector" || clazz=="telematel") {/** fix angular */ $(document).find("nav").css("display","inline"); } console.log("cerrando "+clazz); $(".iframe-"+clazz)[0].contentWindow.doClose(); $("#window-"+clazz).remove(); //o=getOpenModules(clazz); $open_modules.splice( o,1 ); console.log("modulo "+clazz+" eliminado"); console.debug( $open_modules ); closeMenu(); closeTitle(); hideWindowModule(); return false; } /******************************************************************************** * Crear menu, cerra menu en el boton de la barra de estado *******************************************************************************/ function newMenu(menu){ console.log("configurando nuevo menu "+menu.attr("title")); $("#menu-movil .module").each(function(){ $(this).remove(); });//opciones viejas fuera $("#menu-movil .desktop, #menu-movil .help, #menu-movil .exit").each(function(){ $(this).css("display","none"); });//opciones comunes ocultas $(menu).find("a").each(function(){ $(this).addClass("module");//ñapa para no tocar los htmls $(this).bind("click",function(){ return menuClick($(this).attr("data-class"),'module',$(this).attr("data-action")); }); $("#menu-movil a:last").after( $(this) ); }); return false; } function closeMenu(){ console.log("cerrando menu"); $("#menu-movil .module").each(function(){ $(this).remove(); });//opciones viejas fuera $("#menu-movil .desktop, #menu-movil .exit, #menu-movil .help").each(function(){ $(this).css("display","block"); });//opciones comunes ocultas return false; } /******************************************************************************** * Crear titulo y boton cerrar, cerrar titulo y boton cerrar en la barra estado *******************************************************************************/ function newTitle(title){ $(".menu-title span").not(":first").each(function(){ console.log ( "Tengo estos titulos: " + $(this).text() ); $(this).remove(); }); $(".menu-title span").first().css("display","none");//oculto primer titulo "Mi escritorio" $(".menu-title span").last().after(""+title );//añado el nuevo acontinuacion $("nav ul li.close").css("display","table-cell");//mostramos X icono de cerrar } function closeTitle(){ $(".menu-title span").first().css("display","block"); $(".menu-title span:not(:first)").remove(); $("nav ul li.close").css("display","none").off( "click", "**" );//mostramos X icono de cerrar } /******************************************************************************** * Click en una opcion de la barra estado *******************************************************************************/ /** Que hacer cuando hagan click en el dock o el boton de apps */ function menuClick( clazz, source, action ){ //if ( source=='apps' ) toggleFullScreen(); openCloseMenuStatusBar();//decido si oculto o no el menu apps doClickMenuApps( clazz, source, action ); return false; } function doClickMenuApps( clazz, source, action ){ console.log ( "lanzar class:"+clazz.toLowerCase()+" con action:"+action ); switch ( clazz.toLowerCase() ){ case 'close-menu': console.log("cerrar menu"); break; case 'help': showWindowHelp(clazz);break; case 'exit': showWindowLogoff();break; default: if ( source!='module' ) openWindowModule( clazz ); else { var $f = $(".iframe-"+clazz); var fd = $f[0].document || $f.get(0).contentWindow; // document of iframe $(".iframe-"+clazz).get(0).contentWindow[action](); } } return false; } /** fullscreen */ function toggleFullScreen() { return; if ( isMobile()==false || fullscreen==true ) return; var doc = window.document; var docEl = doc.documentElement; var requestFullScreen = docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen; var cancelFullScreen = doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen; if(!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) { console.log("fullscreen"); requestFullScreen.call(docEl); fullscreen = true; } else { console.log("cancel fullscreen"); cancelFullScreen.call(doc); } } /** es un movil */ function isMobile() { try{ document.createEvent("TouchEvent"); console.log("ismobile");return true; } catch(e){ console.log("NO ismobile");return false; } } /** ventana ayuda. mostramos la ayuda del modulo activo */ function showWindowHelp(){ o = getActiveModule(); if ( o==null ) { $body = $("body"); }else{ clazz = $open_modules[o].clazz; $body = $(".iframe-"+clazz).contents().find("body"); } if ( $body.attr("data-help")==null||$body.attr("data-help")=='' ) console.log("Ayuda no detectada"); else $.fancybox.open({padding: 0,href : $body.attr("data-help"),type: 'iframe'}); }