[Join-cvs] join1/src/web/scripts/editor/utils editable_selects.js, NONE, 1.1 form_utils.js, NONE, 1
Brought to you by:
lbroudoux
|
From: Laurent B. <lbr...@us...> - 2008-02-03 23:10:11
|
Update of /cvsroot/join/join1/src/web/scripts/editor/utils In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv13350/scripts/editor/utils Added Files: editable_selects.js form_utils.js mclayer.js mctabs.js validate.js Log Message: Add a rich text editor for messages --- NEW FILE: editable_selects.js --- /** * $Id: editable_selects.js,v 1.1 2008/02/03 23:10:03 lbroudoux Exp $ * * Makes select boxes editable. * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ var TinyMCE_EditableSelects = { editSelectElm : null, init : function() { var nl = document.getElementsByTagName("select"), i, d = document, o; for (i=0; i<nl.length; i++) { if (nl[i].className.indexOf('mceEditableSelect') != -1) { o = new Option('(value)', '__mce_add_custom__'); o.className = 'mceAddSelectValue'; nl[i].options[nl[i].options.length] = o; nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);'); } } }, onChangeEditableSelect : function(se) { var d = document, ne; if (se.options[se.selectedIndex].value == '__mce_add_custom__') { ne = d.createElement("input"); ne.id = se.id + "_custom"; ne.name = se.name + "_custom"; ne.type = "text"; ne.style.width = se.clientWidth; se.parentNode.insertBefore(ne, se); se.style.display = 'none'; ne.focus(); ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput; TinyMCE_EditableSelects.editSelectElm = se; } }, onBlurEditableSelectInput : function() { var se = TinyMCE_EditableSelects.editSelectElm; if (se) { if (se.previousSibling.value != '') { addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value); selectByValue(document.forms[0], se.id, se.previousSibling.value); } else selectByValue(document.forms[0], se.id, ''); se.style.display = 'inline'; se.parentNode.removeChild(se.previousSibling); TinyMCE_EditableSelects.editSelectElm = null; } } }; --- NEW FILE: mctabs.js --- /** * $Id: mctabs.js,v 1.1 2008/02/03 23:10:03 lbroudoux Exp $ * * Moxiecode DHTML Tabs script. * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ function MCTabs() { this.settings = new Array(); }; MCTabs.prototype.init = function(settings) { this.settings = settings; }; MCTabs.prototype.getParam = function(name, default_value) { var value = null; value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; // Fix bool values if (value == "true" || value == "false") return (value == "true"); return value; }; MCTabs.prototype.displayTab = function(tab_id, panel_id) { var panelElm = document.getElementById(panel_id); var panelContainerElm = panelElm ? panelElm.parentNode : null; var tabElm = document.getElementById(tab_id); var tabContainerElm = tabElm ? tabElm.parentNode : null; var selectionClass = this.getParam('selection_class', 'current'); if (tabElm && tabContainerElm) { var nodes = tabContainerElm.childNodes; // Hide all other tabs for (var i=0; i<nodes.length; i++) { if (nodes[i].nodeName == "LI") nodes[i].className = ''; } // Show selected tab tabElm.className = 'current'; } if (panelElm && panelContainerElm) { var nodes = panelContainerElm.childNodes; // Hide all other panels for (var i=0; i<nodes.length; i++) { if (nodes[i].nodeName == "DIV") nodes[i].className = 'panel'; } // Show selected panel panelElm.className = 'current'; } }; MCTabs.prototype.getAnchor = function() { var pos, url = document.location.href; if ((pos = url.lastIndexOf('#')) != -1) return url.substring(pos + 1); return ""; }; // Global instance var mcTabs = new MCTabs(); --- NEW FILE: mclayer.js --- /** * $Id: mclayer.js,v 1.1 2008/02/03 23:10:03 lbroudoux Exp $ * * Moxiecode floating layer script. * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ function MCLayer(id) { this.id = id; this.settings = new Array(); this.blockerElement = null; this.isMSIE = navigator.appName == "Microsoft Internet Explorer"; this.events = false; this.autoHideCallback = null; } MCLayer.prototype = { moveRelativeTo : function(re, p, a) { var rep = this.getAbsPosition(re); var w = parseInt(re.offsetWidth); var h = parseInt(re.offsetHeight); var x, y; switch (p) { case "tl": break; case "tr": x = rep.absLeft + w; y = rep.absTop; break; case "bl": break; case "br": break; } this.moveTo(x, y); }, moveBy : function(dx, dy) { var e = this.getElement(); var x = parseInt(e.style.left); var y = parseInt(e.style.top); e.style.left = (x + dx) + "px"; e.style.top = (y + dy) + "px"; this.updateBlocker(); }, moveTo : function(x, y) { var e = this.getElement(); e.style.left = x + "px"; e.style.top = y + "px"; this.updateBlocker(); }, show : function() { MCLayer.visibleLayer = this; this.getElement().style.display = 'block'; this.updateBlocker(); }, hide : function() { this.getElement().style.display = 'none'; this.updateBlocker(); }, setAutoHide : function(s, cb) { this.autoHideCallback = cb; this.registerEventHandlers(); }, getElement : function() { return document.getElementById(this.id); }, updateBlocker : function() { if (!this.isMSIE) return; var e = this.getElement(); var b = this.getBlocker(); var x = this.parseInt(e.style.left); var y = this.parseInt(e.style.top); var w = this.parseInt(e.offsetWidth); var h = this.parseInt(e.offsetHeight); b.style.left = x + 'px'; b.style.top = y + 'px'; b.style.width = w + 'px'; b.style.height = h + 'px'; b.style.display = e.style.display; }, getBlocker : function() { if (!this.blockerElement) { var d = document, b = d.createElement("iframe"); b.style.cssText = 'display: none; left: 0px; position: absolute; top: 0'; b.src = 'javascript:false;'; b.frameBorder = '0'; b.scrolling = 'no'; d.body.appendChild(b); this.blockerElement = b; } return this.blockerElement; }, getAbsPosition : function(n) { var p = {absLeft : 0, absTop : 0}; while (n) { p.absLeft += n.offsetLeft; p.absTop += n.offsetTop; n = n.offsetParent; } return p; }, registerEventHandlers : function() { if (!this.events) { var d = document; this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown); this.events = true; } }, addEvent : function(o, n, h) { if (o.attachEvent) o.attachEvent("on" + n, h); else o.addEventListener(n, h, false); }, onMouseDown : function(e) { e = typeof(e) == "undefined" ? window.event : e; var b = document.body; var l = MCLayer.visibleLayer; if (l) { var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX; var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY; var el = l.getElement(); var x = parseInt(el.style.left); var y = parseInt(el.style.top); var w = parseInt(el.offsetWidth); var h = parseInt(el.offsetHeight); if (!(mx > x && mx < x + w && my > y && my < y + h)) { MCLayer.visibleLayer = null; if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my)) return true; l.hide(); } } }, addCSSClass : function(e, c) { this.removeCSSClass(e, c); var a = this.explode(' ', e.className); a[a.length] = c; e.className = a.join(' '); }, removeCSSClass : function(e, c) { var a = this.explode(' ', e.className), i; for (i=0; i<a.length; i++) { if (a[i] == c) a[i] = ''; } e.className = a.join(' '); }, explode : function(d, s) { var ar = s.split(d); var oar = new Array(); for (var i = 0; i<ar.length; i++) { if (ar[i] != "") oar[oar.length] = ar[i]; } return oar; }, parseInt : function(s) { if (s == null || s == '') return 0; return parseInt(s); } } --- NEW FILE: form_utils.js --- /** * $Id: form_utils.js,v 1.1 2008/02/03 23:10:03 lbroudoux Exp $ * * Various form utilitiy functions. * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme"); function getColorPickerHTML(id, target_form_element) { var h = ""; h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">'; h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"'; h += ' onmouseover="this.className=\'mceButtonOver\'"'; h += ' onmouseout="this.className=\'mceButtonNormal\'"'; h += ' onmousedown="this.className=\'mceButtonDown\'"'; h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"'; h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>'; return h; } function pickColor(e, target_form_element) { if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown") tinyMCEPopup.pickColor(e, target_form_element); } function updateColor(img_id, form_element_id) { document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; } function setBrowserDisabled(id, state) { var img = document.getElementById(id); var lnk = document.getElementById(id + "_link"); if (lnk) { if (state) { lnk.setAttribute("realhref", lnk.getAttribute("href")); lnk.removeAttribute("href"); tinyMCE.switchClass(img, 'mceButtonDisabled', true); } else { lnk.setAttribute("href", lnk.getAttribute("realhref")); tinyMCE.switchClass(img, 'mceButtonNormal', false); } } } function getBrowserHTML(id, target_form_element, type, prefix) { var option = prefix + "_" + type + "_browser_callback"; var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback")); if (cb == null) return ""; var html = ""; html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">'; html += '<img id="' + id + '" src="' + themeBaseURL + '/images/browse.gif"'; html += ' onmouseover="this.className=\'mceButtonOver\';"'; html += ' onmouseout="this.className=\'mceButtonNormal\';"'; html += ' onmousedown="this.className=\'mceButtonDown\';"'; html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"'; html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>'; return html; } function openBrower(img_id, target_form_element, type, option) { var img = document.getElementById(img_id); if (img.className != "mceButtonDisabled") tinyMCEPopup.openBrowser(target_form_element, type, option); } function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { if (!form_obj || !form_obj.elements[field_name]) return; var sel = form_obj.elements[field_name]; var found = false; for (var i=0; i<sel.options.length; i++) { var option = sel.options[i]; if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) { option.selected = true; found = true; } else option.selected = false; } if (!found && add_custom && value != '') { var option = new Option(value, value); option.selected = true; sel.options[sel.options.length] = option; sel.selectedIndex = sel.options.length - 1; } return found; } function getSelectValue(form_obj, field_name) { var elm = form_obj.elements[field_name]; if (elm == null || elm.options == null) return ""; return elm.options[elm.selectedIndex].value; } function addSelectValue(form_obj, field_name, name, value) { var s = form_obj.elements[field_name]; var o = new Option(name, value); s.options[s.options.length] = o; } function addClassesToList(list_id, specific_option) { // Setup class droplist var styleSelectElm = document.getElementById(list_id); var styles = tinyMCE.getParam('theme_advanced_styles', false); styles = tinyMCE.getParam(specific_option, styles); if (styles) { var stylesAr = styles.split(';'); for (var i=0; i<stylesAr.length; i++) { if (stylesAr != "") { var key, value; key = stylesAr[i].split('=')[0]; value = stylesAr[i].split('=')[1]; styleSelectElm.options[styleSelectElm.length] = new Option(key, value); } } } else { // Use auto impored classes var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id')); for (var i=0; i<csses.length; i++) styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]); } } function isVisible(element_id) { var elm = document.getElementById(element_id); return elm && elm.style.display != "none"; } function convertRGBToHex(col) { var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); var rgb = col.replace(re, "$1,$2,$3").split(','); if (rgb.length == 3) { r = parseInt(rgb[0]).toString(16); g = parseInt(rgb[1]).toString(16); b = parseInt(rgb[2]).toString(16); r = r.length == 1 ? '0' + r : r; g = g.length == 1 ? '0' + g : g; b = b.length == 1 ? '0' + b : b; return "#" + r + g + b; } return col; } function convertHexToRGB(col) { if (col.indexOf('#') != -1) { col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); r = parseInt(col.substring(0, 2), 16); g = parseInt(col.substring(2, 4), 16); b = parseInt(col.substring(4, 6), 16); return "rgb(" + r + "," + g + "," + b + ")"; } return col; } function trimSize(size) { return size.replace(new RegExp('[^0-9%]', 'gi'), ''); } function getCSSSize(size) { size = trimSize(size); if (size == "") return ""; return size.indexOf('%') != -1 ? size : size + "px"; } function getStyle(elm, attrib, style) { var val = tinyMCE.getAttrib(elm, attrib); if (val != '') return '' + val; if (typeof(style) == 'undefined') style = attrib; val = eval('elm.style.' + style); return val == null ? '' : '' + val; } --- NEW FILE: validate.js --- /** * $Id: validate.js,v 1.1 2008/02/03 23:10:03 lbroudoux Exp $ * * Various form validation methods. * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ /** // String validation: if (!Validator.isEmail('myemail')) alert('Invalid email.'); // Form validation: var f = document.forms['myform']; if (!Validator.isEmail(f.myemail)) alert('Invalid email.'); */ var Validator = { isEmail : function(s) { return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$'); }, isAbsUrl : function(s) { return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$'); }, isSize : function(s) { return this.test(s, '^[0-9]+(px|%)?$'); }, isId : function(s) { return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$'); }, isEmpty : function(s) { var nl, i; if (s.nodeName == 'SELECT' && s.selectedIndex < 1) return true; if (s.type == 'checkbox' && !s.checked) return true; if (s.type == 'radio') { for (i=0, nl = s.form.elements; i<nl.length; i++) { if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked) return false; } return true; } return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s); }, isNumber : function(s, d) { return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$')); }, test : function(s, p) { s = s.nodeType == 1 ? s.value : s; return s == '' || new RegExp(p).test(s); } }; var AutoValidator = { settings : { id_cls : 'id', int_cls : 'int', url_cls : 'url', number_cls : 'number', email_cls : 'email', size_cls : 'size', required_cls : 'required', invalid_cls : 'invalid', min_cls : 'min', max_cls : 'max' }, init : function(s) { var n; for (n in s) this.settings[n] = s[n]; }, validate : function(f) { var i, nl, s = this.settings, c = 0; nl = this.tags(f, 'label'); for (i=0; i<nl.length; i++) this.removeClass(nl[i], s.invalid_cls); c += this.validateElms(f, 'input'); c += this.validateElms(f, 'select'); c += this.validateElms(f, 'textarea'); return c == 3; }, invalidate : function(n) { this.mark(n.form, n); }, reset : function(e) { var t = new Array('label', 'input', 'select', 'textarea'); var i, j, nl, s = this.settings; if (e == null) return; for (i=0; i<t.length; i++) { nl = this.tags(e.form ? e.form : e, t[i]); for (j=0; j<nl.length; j++) this.removeClass(nl[j], s.invalid_cls); } }, validateElms : function(f, e) { var nl, i, n, s = this.settings, st = true, va = Validator, v; nl = this.tags(f, e); for (i=0; i<nl.length; i++) { n = nl[i]; this.removeClass(n, s.invalid_cls); if (this.hasClass(n, s.required_cls) && va.isEmpty(n)) st = this.mark(f, n); if (this.hasClass(n, s.number_cls) && !va.isNumber(n)) st = this.mark(f, n); if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true)) st = this.mark(f, n); if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n)) st = this.mark(f, n); if (this.hasClass(n, s.email_cls) && !va.isEmail(n)) st = this.mark(f, n); if (this.hasClass(n, s.size_cls) && !va.isSize(n)) st = this.mark(f, n); if (this.hasClass(n, s.id_cls) && !va.isId(n)) st = this.mark(f, n); if (this.hasClass(n, s.min_cls, true)) { v = this.getNum(n, s.min_cls); if (isNaN(v) || parseInt(n.value) < parseInt(v)) st = this.mark(f, n); } if (this.hasClass(n, s.max_cls, true)) { v = this.getNum(n, s.max_cls); if (isNaN(v) || parseInt(n.value) > parseInt(v)) st = this.mark(f, n); } } return st; }, hasClass : function(n, c, d) { return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); }, getNum : function(n, c) { c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; c = c.replace(/[^0-9]/g, ''); return c; }, addClass : function(n, c, b) { var o = this.removeClass(n, c); n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; }, removeClass : function(n, c) { c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); return n.className = c != ' ' ? c : ''; }, tags : function(f, s) { return f.getElementsByTagName(s); }, mark : function(f, n) { var s = this.settings; this.addClass(n, s.invalid_cls); this.markLabels(f, n, s.invalid_cls); return false; }, markLabels : function(f, n, ic) { var nl, i; nl = this.tags(f, "label"); for (i=0; i<nl.length; i++) { if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id) this.addClass(nl[i], ic); } return null; } }; |