/**
* @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'});
}