/** * Movim Utils * * This file include some useful functions used quite everywhere in Movim */ function movim_check_string(str) { if (typeof str == 'object') { return str instanceof String; } else { return typeof str == 'string'; } } function movim_get_node(str) { if(movim_check_string(str)) return document.querySelector(str); else return str; } /** * @brief Force Movim to go back to the login page */ function movim_disconnect() { window.location.replace(ERROR_URI); } /** * @brief Force Movim to reload the page * @param string uri */ function movim_reload(uri) { window.location.replace(uri); } /** * @brief Force Movim to reload the current page * @param string error */ function movim_reload_this() { window.location.reload(); } /** * @brief Force Movim to go to an url * @param string url */ function movim_redirect(url) { window.location.href = url; } /** * @brief Return a hash (key->value) version of a form * @param string the name of the form * @return hash */ function movim_parse_form(formname) { var form = document.forms[formname]; if(!form) return false; var data = H(); for(var i = 0; i < form.elements.length; i++) { if(form.elements[i].type == 'checkbox') { data.set(form.elements[i].name, form.elements[i].checked); } else if(form.elements[i].type == 'radio' && form.elements[i].checked ) { data.set(form.elements[i].name, form.elements[i].value); } else if(form.elements[i].type != 'radio'){ data.set(form.elements[i].name, form.elements[i].value); } } return data; } /** * @brief Return a JSON version of a form * @param string the name of the form * @return JSON */ function movim_form_to_json(formname) { var form = document.forms[formname]; if(!form) return false; var json = {}; for(var i = 0; i < form.elements.length; i++) { json_att = {}; for(var j = 0; j < form.elements[i].attributes.length; j++) { json_att[form.elements[i].attributes[j].name] = form.elements[i].attributes[j].value; } if(form.elements[i].name.length != 0) { if(form.elements[i].type == 'checkbox') json[form.elements[i].name] = {'value' : form.elements[i].checked, 'attributes' : json_att}; else if(form.elements[i].type == 'radio' && form.elements[i].checked ) json[form.elements[i].name] = {'value' : form.elements[i].value, 'attributes' : json_att}; else if(form.elements[i].type != 'radio') json[form.elements[i].name] = {'value' : form.elements[i].value, 'attributes' : json_att}; } } return json; } /** * @brief A magical function to autoresize textarea when typing * @param DOMElement textbox */ function movim_textarea_autoheight(textbox) { if(textbox != null ) { textbox.style.height = 0; textbox.style.height = textbox.scrollHeight +"px"; } } /** * Class manipulation */ /** * @brief Check if the element own the class * @param string the selector of the element (e.g '#myid', '.theclass') * @param string the class to check */ function movim_has_class(element,classname) { var node = movim_get_node(element); if(!node) console.log('Node ' + element + ' not found'); return node.className.match(new RegExp('(\\s|^)'+classname+'(\\s|$)')); } /** * @brief Add a class of an element * @param string the selector of the element * @param string the class to add */ function movim_add_class(element,classname) { if(!movim_has_class(element,classname)) { var element = movim_get_node(element); element.className += " "+classname; } } /** * @brief Remove a class of an element * @param string the selector of the element * @param string the class to remove */ function movim_remove_class(element,classname) { if (movim_has_class(element,classname)) { var reg = new RegExp('(\\s|^)'+classname+'(\\s|$)'); var element = movim_get_node(element); element.className=element.className.replace(reg,' '); } } /** * @brief Toggle the class of an element * @param string the selector of the element * @param string the class to toggle */ function movim_toggle_class(element, classname) { if(movim_has_class(element, classname)) movim_remove_class(element,classname); else movim_add_class(element, classname); } /** * @brief Save the current button class * @param string the selector of the element */ function movim_button_save(element) { var elt = document.querySelector(element); elt.dataset.oldclassname = elt.className; } /** * @brief Reset the button * @param string the selector of the element */ function movim_button_reset(element) { var elt = document.querySelector(element); elt.className = elt.dataset.oldclassname; } /** * @brief Toggle the visibility of an element * @param string the selector of the element */ function movim_toggle_display(element) { var node = movim_get_node(element); if(node != null) { if(node.style.display == 'block') node.style.display = 'none'; else node.style.display = 'block'; } } /** * @brief Set object in localStorage * @param key string * @param value the object */ Storage.prototype.setObject = function(key, value) { this.setItem(key, JSON.stringify(value)); } /** * @brief Get object in localStorage * @param key */ Storage.prototype.getObject = function(key) { return JSON.parse(this.getItem(key)); } function base64_decode(data) { // discuss at: http://phpjs.org/functions/base64_decode/ // original by: Tyler Akins (http://rumkin.com) // improved by: Thunder.m // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // input by: Aman Gupta // input by: Brett Zamir (http://brett-zamir.me) // bugfixed by: Onno Marsman // bugfixed by: Pellentesque Malesuada // bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA=='); // returns 1: 'Kevin van Zonneveld' // example 2: base64_decode('YQ==='); // returns 2: 'a' var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = '', tmp_arr = []; if (!data) { return data; } data += ''; do { // unpack four hexets into three octets using index points in b64 h1 = b64.indexOf(data.charAt(i++)); h2 = b64.indexOf(data.charAt(i++)); h3 = b64.indexOf(data.charAt(i++)); h4 = b64.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; if (h3 == 64) { tmp_arr[ac++] = String.fromCharCode(o1); } else if (h4 == 64) { tmp_arr[ac++] = String.fromCharCode(o1, o2); } else { tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); } } while (i < data.length); dec = tmp_arr.join(''); return dec.replace(/\0+$/, ''); } /** * @brief Sanitize string for easy search * @param string */ function accentsTidy(s){ //Ian Elliott in http://stackoverflow.com/questions/990904/javascript-remove-accents-diacritics-in-strings var r = s.toLowerCase(); r = r.replace(new RegExp("\\s", 'g'),""); r = r.replace(new RegExp("[àáâãäå]", 'g'),"a"); r = r.replace(new RegExp("æ", 'g'),"ae"); r = r.replace(new RegExp("ç", 'g'),"c"); r = r.replace(new RegExp("[èéêë]", 'g'),"e"); r = r.replace(new RegExp("[ìíîï]", 'g'),"i"); r = r.replace(new RegExp("ñ", 'g'),"n"); r = r.replace(new RegExp("[òóôõö]", 'g'),"o"); r = r.replace(new RegExp("œ", 'g'),"oe"); r = r.replace(new RegExp("[ùúûü]", 'g'),"u"); r = r.replace(new RegExp("[ýÿ]", 'g'),"y"); r = r.replace(new RegExp("\\W", 'g'),""); return r; };