frappe.provide('frappe.dom'); frappe.dom = { id_count: 0, freeze_count: 0, by_id: function by_id(id) { return document.getElementById(id); }, set_unique_id: function set_unique_id(ele) { var $ele = $(ele); if ($ele.attr('id')) { return $ele.attr('id'); } var id = 'unique-' + frappe.dom.id_count; $ele.attr('id', id); frappe.dom.id_count++; return id; }, eval: function _eval(txt) { if (!txt) return; var el = document.createElement('script'); el.appendChild(document.createTextNode(txt)); document.getElementsByTagName('head')[0].appendChild(el); }, remove_script_and_style: function remove_script_and_style(txt) { var div = document.createElement('div'); div.innerHTML = txt; var found = false; ["script", "style", "noscript", "title", "meta", "base", "head"].forEach(function (e, i) { var elements = div.getElementsByTagName(e); var i = elements.length; while (i--) { found = true; elements[i].parentNode.removeChild(elements[i]); } }); var elements = div.getElementsByTagName('link'); var i = elements.length; while (i--) { if (elements[i].getAttribute("rel") == "stylesheet") { found = true; elements[i].parentNode.removeChild(elements[i]); } } if (found) { return div.innerHTML; } else { return txt; } }, is_element_in_viewport: function is_element_in_viewport(el) { if (typeof jQuery === "function" && el instanceof jQuery) { el = el[0]; } var rect = el.getBoundingClientRect(); return rect.top >= 0 && rect.left >= 0; }, set_style: function set_style(txt, id) { if (!txt) return; var se = document.createElement('style'); se.type = "text/css"; if (id) { var element = document.getElementById(id); if (element) { element.parentNode.removeChild(element); } se.id = id; } if (se.styleSheet) { se.styleSheet.cssText = txt; } else { se.appendChild(document.createTextNode(txt)); } document.getElementsByTagName('head')[0].appendChild(se); }, add: function add(parent, newtag, className, cs, innerHTML, onclick) { if (parent && parent.substr) parent = frappe.dom.by_id(parent); var c = document.createElement(newtag); if (parent) parent.appendChild(c); if (className) { if (newtag.toLowerCase() == 'img') c.src = className;else c.className = className; } if (cs) frappe.dom.css(c, cs); if (innerHTML) c.innerHTML = innerHTML; if (onclick) c.onclick = onclick; return c; }, css: function css(ele, s) { if (ele && s) { $.extend(ele.style, s); } return ele; }, freeze: function freeze(msg, css_class) { if (!$('#freeze').length) { var freeze = $('').on("click", function () { if (cur_frm && cur_frm.cur_grid) { cur_frm.cur_grid.toggle_view(); return false; } }).appendTo("#body_div"); freeze.html(repl('

%(msg)s

', { msg: msg || "" })); setTimeout(function () { freeze.addClass("in"); }, 1); } else { $("#freeze").addClass("in"); } if (css_class) { $("#freeze").addClass(css_class); } frappe.dom.freeze_count++; }, unfreeze: function unfreeze() { if (!frappe.dom.freeze_count) return; frappe.dom.freeze_count--; if (!frappe.dom.freeze_count) { var freeze = $('#freeze').removeClass("in").remove(); } }, save_selection: function save_selection() { if (window.getSelection) { var sel = window.getSelection(); if (sel.getRangeAt && sel.rangeCount) { var ranges = []; for (var i = 0, len = sel.rangeCount; i < len; ++i) { ranges.push(sel.getRangeAt(i)); } return ranges; } } else if (document.selection && document.selection.createRange) { return document.selection.createRange(); } return null; }, restore_selection: function restore_selection(savedSel) { if (savedSel) { if (window.getSelection) { var sel = window.getSelection(); sel.removeAllRanges(); for (var i = 0, len = savedSel.length; i < len; ++i) { sel.addRange(savedSel[i]); } } else if (document.selection && savedSel.select) { savedSel.select(); } } }, is_touchscreen: function is_touchscreen() { return 'ontouchstart' in window; } }; frappe.ellipsis = function (text, max) { if (!max) max = 20; text = cstr(text); if (text.length > max) { text = text.substr(0, max) + '...'; } return text; }; frappe.run_serially = function (tasks) { var result = Promise.resolve(); tasks.forEach(function (task) { if (task) { result = result.then ? result.then(task) : Promise.resolve(); } }); return result; }; frappe.timeout = function (seconds) { return new Promise(function (resolve) { setTimeout(function () { return resolve(); }, seconds * 1000); }); }; frappe.scrub = function (text) { return text.replace(/ /g, "_").toLowerCase(); }; frappe.get_modal = function (title, content) { return $(frappe.render_template("modal", { title: title, content: content })).appendTo(document.body); }; (function ($) { $.fn.add_options = function (options_list) { for (var i = 0; i < options_list.length; i++) { var v = options_list[i]; if (is_null(v)) { var value = null; var label = null; } else { var is_value_null = is_null(v.value); var is_label_null = is_null(v.label); if (is_value_null && is_label_null) { var value = v; var label = __(v); } else { var value = is_value_null ? "" : v.value; var label = is_label_null ? __(value) : __(v.label); } } $('