Current File : /home/escuelai/public_html/biblioteca.escuelaintegral.edu.uy/javascript/misc.js
// +-------------------------------------------------+
// � 2002-2004 PMB Services / www.sigb.net pmb@sigb.net et contributeurs (voir www.sigb.net)
// +-------------------------------------------------+
// $Id: misc.js,v 1.27 2021/06/16 14:46:41 tsamson Exp $


// Fonction check_checkbox : Permet de changer l'etats d'une liste de checkbox.
// checkbox_list : Liste d'id des checkbox separee par |
// level: 1 (checked) ou 0;
function check_checkbox(checkbox_list,level) {
	var ids,id,state;
	if(level) state=true; else state=false;
	ids=checkbox_list.split('|');
	while (ids.length>0) {
		id=ids.shift();
		if(!document.getElementById(id).disabled) {
			document.getElementById(id).checked = state;
		}
	}
}


/* -------------------------------------------------------------------------------------
 *		Deroulement du menu vertical sur clic, enregistrement
 *		des preferences sur ctrl+clic avec ajax
 *
 *		menuHide - setMenu - menuSelectH3 - setMenuHide - menuAutoHide
 * ----------------------------------------------------------------------------------- */

/* -----------------------------------------------------------------------------------
 * Fonction menuHide
 * gestionnaire general pour masquer le menu, declenche sur onclick du <span>
 */
// si l'utilisateur n'enregistre pas de preferences,  on retracte/deplie le menu.
function menuHide(obj,event){
	var ctrl = event.ctrlKey || event.metaKey;
	if (ctrl){setMenu(event);}
	else {menuHideObject(obj);}
}

/* -----------------------------------------------------------------------------------
 * Fonction setMenu
 * sauve-restaure les preferences sur le deroulement par defaut du menu selectionne
 */
// Variables globales
var hlist=new Array();
var hclasses=new Array();

function setMenu(){
	var menu = document.getElementById("menu");
	var childs = menu.childNodes;
	var parseH3=0;
	
	//on releve l'etat du menu
	var values="";
	var j=1;
	for(i=0; i<childs.length; i++){
		if(childs[i].tagName=='H3'){
			hlist[j]=childs[i];
			hclasses[j]=hlist[j].className;
			parseH3=1;
			j++;
		} else if (childs[i].tagName=='UL' && parseH3==1){
			if(childs[i].style.display=='none'){values+='f,';}
			else{values+='t,';}
			parseH3=0;
		}
	}
	//requete ajax pour sauvegarder l'etat
	savehide = new http_request();
	var url= "./ajax.php?module=ajax&categ=menuhide&fname=setpref";
	url=encodeURI(url) 
	var page = document.getElementById("body_current_module").getAttribute('page_name');
	page=encodeURI(page)
	values=encodeURI(values)
	savehide.request(url,1,"&page="+page+"&values="+values);
	if(savehide.get_text()!=0){
		alert(savehide.get_text());
	} else {
		for(i=1; i<hlist.length; i++){
			setTimeout("hlist["+i+"].className=\"setpref\"",i*15);
			setTimeout("hlist["+i+"].className=hclasses["+i+"]",i*15+500);
		}
	}
}

/* -------------------------------------------------------------------------------------
 * Fonction menuHideObject
 * Masque ou affiche le menu sous le H3 selectionne
 */
function menuHideObject(obj,force) {
	var pointer=obj;
	do{
		pointer=pointer.nextSibling;
		if (pointer.tagName=='H3' || pointer.tagName=='DIV'){
			break;
		}
		if (pointer.tagName=='UL'){
			if (force==undefined){
				if (pointer.style.display=='none'){
					pointer.style.display='block';
					menuSelectH3(pointer,"");
				}
				else {
					pointer.style.display='none';
					menuSelectH3(pointer,"selected");
				}
			} else {
				if (force==0){
					pointer.style.display='block';
					menuSelectH3(pointer,"");
				}
				else {
					pointer.style.display='none';
					menuSelectH3(pointer,"selected");
				}
			}
		}
	}while(pointer.nextSibling);
}
/* -------------------------------------------------------------------------------------
 * Fonction menuSelectH3()
 * Attribue au menuH3 selectionne une nouvelle classe css (a priori purement esthetique)
 */
function menuSelectH3(ulChild,selectState){
	prec=ulChild.previousSibling;
	if(navigator.appName != "Microsoft Internet Explorer"){
		prec=prec.previousSibling;
	}
	if(prec.tagName=='H3'){
		prec.className=selectState;
	}
}

/* --------------------------------------------------------------------------------------
 * Fonction menuGlobalHide
 * Force le depliement d'une liste de menus, masque tous les autres.
 */
function menuGlobalHide(boollist){
	var boollist=boollist.split(",");	
	var menu = document.getElementById("menu");
	var fils = menu.childNodes;
	var j=0;
	for(i=0; i<fils.length; i++){
		if(fils[i].tagName=='H3'){
			if(boollist[j]=='t'){
				menuHideObject(fils[i],0);
			} else {
				menuHideObject(fils[i],1);
			}
			j++;
		}
	}
}

/* --------------------------------------------------------------------------------------
 * Fonction menuAutoHide
 * Recuppere les preferences d'affichage de l'user, si != 0 elles sont definies
 * et on deplie/replie les menus avec l'appel e menuGlobalHide
 */
function menuAutoHide(){
	if (!trueids) {
		var getHide = new http_request();
		var url = "./ajax.php?module=ajax&categ=menuhide&fname=getpref";
		url=encodeURI(url)
		var page = document.getElementById("body_current_module").getAttribute('page_name');
		page=encodeURI(page)
		getHide.request(url,1,"&page="+page);	
		if(getHide.get_text()!=0){
			menuGlobalHide(getHide.get_text());	
		}
	} else if (trueids!="0") menuGlobalHide(trueids);	
}

/* --------------------------------------------------------------------------------------
 * Fonction addLoadEvent
 * Empile les differentes fonctions a appeler quand la page est chargee
 */
function addLoadEvent(func) {
  if (window.addEventListener)
    window.addEventListener("load", func, false);
  else if (window.attachEvent)
    window.attachEvent("onload", func);
  else { // fallback
    var old = window.onload;
    window.onload = function() {
      if (old) old();
      func();
    };
  }
}

var pmbForm = {
    fieldToObject: function fieldToObject(inputNode){

        var ret = null;
        if(inputNode){
            var _in = inputNode.name, type = (inputNode.type || "").toLowerCase();
            if(_in && type && !inputNode.disabled){
            	if(type == "textarea" && inputNode.id !="" && inputNode.value == ""){ //Test tinymce
            		if(typeof tinyMCE != 'undefined' && tinyMCE.get(inputNode.id)){
            			return tinyMCE.get(inputNode.id).getContent();
            		}
            	}
                if(type == "radio" || type == "checkbox"){
                    if(inputNode.checked){
                        ret = inputNode.value;
                    }
                }else if(inputNode.multiple){
                    ret = [];
                    var nodes = [inputNode.firstChild];
                    while(nodes.length){
                        for(var node = nodes.pop(); node; node = node.nextSibling){
                            if(node.nodeType == 1 && node.tagName.toLowerCase() == "option"){
                                if(node.selected){
                                    ret.push(node.value);
                                }
                            }else{
                                if(node.nextSibling){
                                    nodes.push(node.nextSibling);
                                }
                                if(node.firstChild){
                                    nodes.push(node.firstChild);
                                }
                                break;
                            }
                        }
                    }
                }else{
                    ret = inputNode.value;
                }
            }
        }
        
        if(!ret && pmbForm.include.indexOf(type)!= -1){
        	var form = inputNode.form;
        	var widgetNode = form.querySelector('[widgetid="'+inputNode.name+'"]');
        	if(widgetNode){
        		var widget = dijit.byId(widgetNode.getAttribute('widgetid'));
        	} else {
        		var widgetNode2 = form.querySelector('[widgetid="'+inputNode.name+'_form"]');
            	if(widgetNode2){
            		var widget = dijit.byId(widgetNode2.getAttribute('widgetid'));
            	}
        	}
        	if (widget) {
        		return widget.get('value') ? widget.get('value') : '';
        	}
        }
        return ret;
    },
    setValue: function(obj, name, value){
    	if(value === null){
    		return;
    	}
    	var val = obj[name];
    	if(typeof val == "string"){
    		obj[name] = [val, value];
    	}else if(Array.isArray(val)){
    		val.push(value);
    	}else{
    		obj[name] = value;
    	}
	},
	exclude: ["file", "submit", "image", "reset", "button"],
	include: ['text', 'hidden', 'textarea'],
    toObject: function formToObject(formNode){
        var ret = {}, elems = document.getElementById(formNode).elements;
        for(var i = 0, l = elems.length; i < l; ++i){
            var item = elems[i], _in = item.name, type = (item.type || "").toLowerCase();
            if(_in && type && pmbForm.exclude.indexOf(type) < 0 && !item.disabled){
                pmbForm.setValue(ret, _in, pmbForm.fieldToObject(item));
                if(type == "image"){
                    ret[_in + ".x"] = ret[_in + ".y"] = ret[_in].x = ret[_in].y = 0;
                }
            }
        }
        return ret; 
    },

    toQuery: function formToQuery(formNode){
        return ioq.objectToQuery(pmbForm.toObject(formNode));
    },

    toJson: function formToJson(formNode,prettyPrint){

        return JSON.stringify(pmbForm.toObject(formNode), null, prettyPrint ? 4 : 0);
    }
};

function preLoadScripts(domNode){
	if(domNode){
		var scripts = domNode.querySelectorAll('script');
		scripts = Array.prototype.slice.call(scripts);
		var tabScripts = new Array();
		scripts.forEach(function(script){
			var newScript = document.createElement('script');
			var scriptAttributes = Array.prototype.slice.call(script.attributes);
			scriptAttributes.forEach(function(attribute){
				newScript.setAttribute(attribute.name, attribute.value);
			});			
			if (script.innerHTML.trim() != '' ) {
				newScript.innerHTML = script.innerHTML;
			}			
			newScript.domNode = domNode;
			tabScripts.push(newScript);
			script.parentNode.removeChild(script);
		});
		loadScripts(tabScripts);		
		var nodes = document.querySelectorAll("[data-dojo-type]");
		var tabNodes = Array.prototype.slice.call(nodes);
		tabNodes.forEach(function(node){
			if (parentElement != node.parentElement) {
				if (!node.getAttribute('widgetid')) {
					dojo.parser.parse(node.parentElement);
				}
				var parentElement = node.parentElement;
			}				
		});
	}
}
function loadScripts(tabScripts){
	if(tabScripts.length){
		var currentScript = tabScripts.shift();
		if (currentScript.src) {
			//l'evenement onload ne fonctionne que sur des scripts avec l'attribut src
			currentScript.onload = currentScript.onreadystatechange =  function(){
				loadScripts(tabScripts);
			}
			currentScript.domNode.appendChild(currentScript);
		} else {
			currentScript.domNode.appendChild(currentScript);
			loadScripts(tabScripts);
		}
	}
};

function empty_dojo_calendar_by_id(id){
	require(["dijit/registry"], function(registry) {registry.byId(id).set('value',null);});
}

function aide_regex() {
	openPopUp('./help.php?whatis=regex', 'regex_howto');
}

function closeCurrentEnv(what){
	window.parent.require(["dojo/topic"],
		function(topic){
			var evtArgs = [];
			if(what) {
				evtArgs.what = what;
			}
			topic.publish("SelectorTab", "SelectorTab", "closeCurrentTab", evtArgs);
		}
	);
}

function get_input_date_time_inter_js(div, name, id, today, msg_date_begin, msg_date_end) {
	
	var date = new Date();
	if (today) {
		date = null;
	} else {
		date = date.toISOString().substr(0, 10);
	}    
	var label_begin = document.createElement('label');
	label_begin.innerHTML = pmbDojo.messages.getMessage('date', msg_date_begin);

	var date_begin = document.createElement('input');
    date_begin.setAttribute('type', 'date');
    date_begin.setAttribute('id', id + '_date_begin');
    date_begin.setAttribute('value', date);
	

	var time_begin = document.createElement('input');
	time_begin.setAttribute('type', 'time');
	time_begin.setAttribute('id', id + '_time_begin');
			
	var label_end = document.createElement('label');
	label_end.innerHTML = pmbDojo.messages.getMessage('date', msg_date_end);
			
	var date_end = document.createElement('input');
    date_end.setAttribute('type','date');
    date_end.setAttribute('id', id + '_date_end');
    date_end.value = date;
    
	var time_end = document.createElement('input');
	time_end.setAttribute('type','time');
	time_end.setAttribute('id', id + '_time_end');
	
	var del = document.createElement('input');
	del.setAttribute('type', 'button');
    del.setAttribute('class', 'bouton');
    del.setAttribute('value', 'X');
    
    var buttonId = id.split('_');
    buttonId.pop();
    buttonId = buttonId.join('_');
    var buttonAdd = document.getElementById('button_add_' + buttonId);
    
	if (use_dojo_calendar == 1) { 
		del.addEventListener('click', function() {
			require(['dijit/registry'], function(registry) {
				empty_dojo_calendar_by_id(id + '_date_begin');
				empty_dojo_calendar_by_id(id + '_time_begin');
				empty_dojo_calendar_by_id(id + '_date_end');
				empty_dojo_calendar_by_id(id + '_time_end');
			});
		}, false);
		
	} else {
	    date_begin.setAttribute('name', name + '[date_begin]');
		time_begin.setAttribute('name', name + '[time_begin]');
	    date_end.setAttribute('name', name + '[date_end]');
		time_end.setAttribute('name', name + '[time_end]');
		del.addEventListener('click', function() {
			document.getElementById(id + '_date_begin').value = '';
			document.getElementById(id + '_time_begin').value = '';
			document.getElementById(id + '_date_end').value = '';
			document.getElementById(id + '_time_end').value = '';
		}, false);
		
	}
	var br = document.createElement('br');
	div.appendChild(label_begin);
	div.appendChild(document.createTextNode(' '));
	div.appendChild(date_begin);
	div.appendChild(document.createTextNode(' '));
	div.appendChild(time_begin);
	div.appendChild(document.createTextNode(' '));
	div.appendChild(label_end);
	div.appendChild(document.createTextNode(' '));
	div.appendChild(date_end);
	div.appendChild(document.createTextNode(' '));
	div.appendChild(time_end);
	div.appendChild(document.createTextNode(' '));
	div.appendChild(del);
	if (buttonAdd) div.appendChild(buttonAdd);
	div.appendChild(br);
	
	if (use_dojo_calendar == 1) { 		
		require(['dijit/form/TimeTextBox', 'dijit/form/DateTextBox'], function(TimeTextBox, DateTextBox) {
			new DateTextBox({value : date, name : name + '[date_begin]'}, id + '_date_begin').startup();

			new TimeTextBox({value: null,
				name : name + '[time_begin]',
				constraints : {
					timePattern : 'HH:mm',
					clickableIncrement : 'T00:15:00',
					visibleIncrement : 'T01:00:00',
					visibleRange : 'T01:00:00'
				}
			}, id + '_time_begin').startup();

			new DateTextBox({value : date, name : name + '[date_end]'}, id + '_date_end').startup();

			new TimeTextBox({value : null,
				name : name + '[time_end]',
				constraints : {
					timePattern : 'HH:mm',
					clickableIncrement : 'T00:15:00',
					visibleIncrement : 'T01:00:00',
					visibleRange : 'T01:00:00'
				}
			}, id + '_time_end').startup();
		});
		
	} 
    return div;
}

function get_input_date_js(name, id, value, required, onchange) {
	
    var input_date = document.createElement('input');
    input_date.setAttribute('name', name);
    input_date.setAttribute('id', id);
    if (use_dojo_calendar == 1) { 
        input_date.setAttribute('data-dojo-type', 'dijit/form/DateTextBox');
        input_date.setAttribute('type', 'text');
    } else {
        input_date.setAttribute('type', 'date');
    }
    if (value) {
    	input_date.setAttribute('value', value);
    } else {
    	input_date.setAttribute('value', '');
    }
    return input_date;
}

function set_parent_value(f_caller, id, value){
	if (!f_caller || !id) return;
	if(typeof window.parent.document.forms[f_caller] != 'undefined') {
		window.parent.document.forms[f_caller].elements[id].value = value;
	} else if(typeof window.opener.document.forms[f_caller] != 'undefined') {
		window.opener.document.forms[f_caller].elements[id].value = value;
	} 
}

function get_parent_value(f_caller, id){
	if(typeof window.parent.document.forms[f_caller] != 'undefined') {
		return window.parent.document.forms[f_caller].elements[id].value;
	} else if(typeof window.opener.document.forms[f_caller] != 'undefined') {
		return window.opener.document.forms[f_caller].elements[id].value;
	}
	return '';
}

function set_parent_focus(f_caller, id){
	if(typeof window.parent.document.forms[f_caller] != 'undefined') {
		window.parent.document.forms[f_caller].elements[id].focus();
	} else if(typeof window.opener.document.forms[f_caller] != 'undefined') {
		window.opener.document.forms[f_caller].elements[id].focus();
	}
}

function is_valid_mail(mail){
	var regex = /(^(([^<>()\[\]\\.,;:\s@\"]+(\.[^<>()\[\]\\.,;:\s@\"]+)*)|(\"\.+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$)/;
	var result = mail.match(regex);
	if(null == result){
		return false;
	}
	return true;
}

function toggle_password(caller,id) {
	
	try {
		var i = document.getElementById(id);
		switch (i.type) {
			case 'text' :
				i.type='password';
				caller.setAttribute('class', 'fa fa-eye');
				break;;
			case 'password' :
				i.type='text';
				caller.setAttribute('class', 'fa fa-eye-slash');
				break;
		}
		
	} catch(e) {}
}

function show_elements(class_name) {
	try {
		var elements = document.querySelectorAll("*[class='"+class_name+"']");
		elements.forEach(function(element){
			element.style.display = "block"
		});
		
	} catch(e) {}
}

function hide_elements(class_name) {
	try {
		var elements = document.querySelectorAll("*[class='"+class_name+"']");
		elements.forEach(function(element){
			element.style.display = "none"
		});
		
	} catch(e) {}
}