HTMLArea.Dialog = function(editor, html, localizer) { this.id = { }; this.r_id = { }; // reverse lookup id this.editor = editor; this.document = document; this.rootElem = document.createElement('div'); this.rootElem.className = 'dialog'; this.rootElem.style.position = 'absolute'; this.rootElem.style.display = 'none'; this.editor._framework.ed_cell.insertBefore(this.rootElem, this.editor._framework.ed_cell.firstChild); this.rootElem.style.width = this.width = this.editor._framework.ed_cell.offsetWidth + 'px'; this.rootElem.style.height = this.height = this.editor._framework.ed_cell.offsetHeight + 'px'; var dialog = this; if(typeof localizer == 'function') { this._lc = localizer; } else if(localizer) { this._lc = function(string) { return HTMLArea._lc(string,localizer); } } else { this._lc = function(string) { return string; } } html = html.replace(/\[([a-z0-9_]+)\]/ig, function(fullString, id) { if(typeof dialog.id[id] == 'undefined') { dialog.id[id] = HTMLArea.uniq('Dialog'); dialog.r_id[dialog.id[id]] = id; } return dialog.id[id]; } ).replace(/(.*?)<\/l10n>/ig, function(fullString,translate) { return dialog._lc(translate) ; } ).replace(/="_\((.*?)\)"/g, function(fullString, translate) { return '="' + dialog._lc(translate) + '"'; } ); this.rootElem.innerHTML = html; this.editor.notifyOn ('resize', function(e, args) { dialog.rootElem.style.width = dialog.width = dialog.editor._framework.ed_cell.offsetWidth + 'px'; dialog.rootElem.style.height = dialog.height = dialog.editor._framework.ed_cell.offsetHeight + 'px'; dialog.onresize(); } ); } HTMLArea.Dialog.prototype.onresize = function() { return true; } HTMLArea.Dialog.prototype.show = function(values) { // We need to preserve the selection for IE if(HTMLArea.is_ie) { this._lastRange = this.editor._createRange(this.editor._getSelection()); } if(typeof values != 'undefined') { this.setValues(values); } this._restoreTo = [this.editor._textArea.style.display, this.editor._iframe.style.visibility, this.editor.hidePanels()]; this.editor._textArea.style.display = 'none'; this.editor._iframe.style.visibility = 'hidden'; this.rootElem.style.display = ''; } HTMLArea.Dialog.prototype.hide = function() { this.rootElem.style.display = 'none'; this.editor._textArea.style.display = this._restoreTo[0]; this.editor._iframe.style.visibility = this._restoreTo[1]; this.editor.showPanels(this._restoreTo[2]); // Restore the selection if(HTMLArea.is_ie) { this._lastRange.select(); } this.editor.updateToolbar(); return this.getValues(); } HTMLArea.Dialog.prototype.toggle = function() { if(this.rootElem.style.display == 'none') { this.show(); } else { this.hide(); } } HTMLArea.Dialog.prototype.setValues = function(values) { for(var i in values) { var elems = this.getElementsByName(i); if(!elems) continue; for(var x = 0; x < elems.length; x++) { var e = elems[x]; switch(e.tagName.toLowerCase()) { case 'select' : { for(var j = 0; j < e.options.length; j++) { if(typeof values[i] == 'object') { for(var k = 0; k < values[i].length; k++) { if(values[i][k] == e.options[j].value) { e.options[j].selected = true; } } } else if(values[i] == e.options[j].value) { e.options[j].selected = true; } } break; } case 'textarea': case 'input' : { switch(e.getAttribute('type')) { case 'radio' : { if(e.value == values[i]) { e.checked = true; } break; } case 'checkbox': { if(typeof values[i] == 'object') { for(var j in values[i]) { if(values[i][j] == e.value) { e.checked = true; } } } else { if(values[i] == e.value) { e.checked = true; } } break; } default : { e.value = values[i]; } } break; } default : break; } } } } HTMLArea.Dialog.prototype.getValues = function() { var values = [ ]; var inputs = HTMLArea.collectionToArray(this.rootElem.getElementsByTagName('input')) .append(HTMLArea.collectionToArray(this.rootElem.getElementsByTagName('textarea'))) .append(HTMLArea.collectionToArray(this.rootElem.getElementsByTagName('select'))); for(var x = 0; x < inputs.length; x++) { var i = inputs[x]; if(!(i.name && this.r_id[i.name])) continue; if(typeof values[this.r_id[i.name]] == 'undefined') { values[this.r_id[i.name]] = null; } var v = values[this.r_id[i.name]]; switch(i.tagName.toLowerCase()) { case 'select': { if(i.multiple) { if(!v.push) { if(v != null) { v = [v]; } else { v = new Array(); } } for(var j = 0; j < i.options.length; j++) { if(i.options[j].selected) { v.push(i.options[j].value); } } } else { if(i.selectedIndex >= 0) { v = i.options[i.selectedIndex]; } } break; } case 'textarea': case 'input' : default : { switch(i.type.toLowerCase()) { case 'radio': { if(i.checked) { v = i.value; break; } } case 'checkbox': { if(v == null) { if(this.getElementsByName(this.r_id[i.name]).length > 1) { v = new Array(); } } if(i.checked) { if(v != null && typeof v == 'object' && v.push) { v.push(i.value); } else { v = i.value; } } break; } default : { v = i.value; break; } } } } values[this.r_id[i.name]] = v; } return values; } HTMLArea.Dialog.prototype.getElementById = function(id) { return this.document.getElementById(this.id[id] ? this.id[id] : id); } HTMLArea.Dialog.prototype.getElementsByName = function(name) { return this.document.getElementsByName(this.id[name] ? this.id[name] : name); }