/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* Copyright (C) 2005 SKYRIX Software AG This file is part of OpenGroupware.org. OGo is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. OGo is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with OGo; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Dependencies: * It's required that "currentIndex" is defined in a top level context. * * Exports: * defines hasRecipients() returning a bool for the * surrounding context to check. */ var lastIndex = currentIndex; function sanitizedCn(cn) { var parts; parts = cn.split(', '); if(parts.length == 1) return cn; return parts[0]; } function hasAddress(email) { var e = $(email); if(e) return true; return false; } function checkAddresses() { alert("addressCount: " + this.getAddressCount() + " currentIndex: " + currentIndex + " lastIndex: " + lastIndex); } function fancyAddRow(text, type) { var addr = $('addr_' + lastIndex); if (addr && addr.value == '') { var sub = $('subjectField'); if (sub && sub.value != '') { sub.focus(); sub.select(); return; } } var addressList = $("addressList").tBodies[0]; var lastChild = $("lastRow"); currentIndex++; var proto = lastChild.previous("tr"); var row = proto.cloneNode(true); row.writeAttribute("id", 'row_' + currentIndex); var rowNodes = row.childNodesWithTag("td"); var select = $(rowNodes[0]).childNodesWithTag("select")[0]; select.name = 'popup_' + currentIndex; select.value = (type? type : proto.down("select").value); var cell = $(rowNodes[1]); var input = cell.childNodesWithTag("input")[0]; if (Prototype.Browser.IE) { cell.removeChild(input); input = new Element("input"); cell.appendChild(input); } input.name = 'addr_' + currentIndex; input.id = 'addr_' + currentIndex; input.value = text; input.stopObserving(); input.addInterface(SOGoAutoCompletionInterface); addressList.insertBefore(row, lastChild); input.observe("focus", addressFieldGotFocus.bind(input)); input.observe("blur", addressFieldLostFocus.bind(input)); input.observe("autocompletion:changedlist", expandContactList); input.on("autocompletion:changed", addressFieldChanged.bind(input)); input.focus(); return input; } function expandContactList (e) { var container = $(e).memo; var url = UserFolderURL + "Contacts/" + container + "/" + this.readAttribute("uid") + "/properties"; triggerAjaxRequest (url, expandContactListCallback, this); } function expandContactListCallback (http) { if (http.readyState == 4) { var input = http.callbackData; if (http.status == 200) { var data = http.responseText.evalJSON(true); // TODO: Should check for duplicated entries for (var i = data.length - 1; i >= 0; i--) // Remove contacts with no email address if (data[i][2].length == 0) data.splice(i, 1); if (data.length >= 1) { var text = data[0][2]; if (data[0][1].length) text = data[0][1] + " <" + data[0][2] + ">"; input.value = text; input.writeAttribute("container", null); } if (data.length > 1) { for (var i = 1; i < data.length; i++) { var text = data[i][2]; if (data[i][1].length) text = data[i][1] + " <" + data[i][2] + ">"; fancyAddRow(text, $(input).up("tr").down("select").value); } } } } } function addressFieldGotFocus(event) { var idx; idx = getIndexFromIdentifier(this.id); if (lastIndex == idx) return; removeLastEditedRowIfEmpty(); if (Prototype.Browser.IE && this.value.length == 0) $(this).setCaretTo(0); // IE hack onWindowResize(null); return false; } function addressFieldLostFocus(event) { lastIndex = getIndexFromIdentifier(this.id); addressFieldChanged.bind(this, event)(); } function addressFieldChanged(event) { // We first split by semi-colon and then by comma only if there's no // email address detected. // Examples: // "dude, buddy dude@domain.com; bro" => "dude, buddy " + "bro" // "dude, buddy, bro " => "dude, buddy, bro " // "dude, buddy, bro" => "dude" + "buddy" + "bro" // "dude@domain.com, " => "" + "" var addresses = this.value.split(';'); if (addresses.length > 0) { var first = true; for (var i = 0; i < addresses.length; i++) { var words = addresses[i].split(' '); var phrase = new Array(); for (var j = 0; j < words.length; j++) { var word = words[j].strip().replace(/<(.+)>/, "$1").replace(',', ''); if (word.length > 0) { // Use the regexp defined in generic.js if (emailRE.test(word)) { phrase.push('<' + word + '>'); if (first) { this.value = phrase.join(' '); first = false; } else fancyAddRow(phrase.join(' '), $(this).up("tr").down("select").value); phrase = new Array(); } else phrase.push(words[j].strip()); } } if (phrase.length > 0) { words = phrase.join(' ').split(','); for (var j = 0; j < words.length; j++) { word = words[j]; if (first) { this.value = word; first = false; } else fancyAddRow(word, $(this).up("tr").down("select").value); } phrase = new Array(); } } } // Verify if a new row should be created var keyCode = event.memo; if (keyCode == Event.KEY_RETURN) { var input = fancyAddRow(""); if (Prototype.Browser.IE) $(input.id).focus(); else input.focus(); } onWindowResize(null); } function removeLastEditedRowIfEmpty() { var addr, addressList, senderRow; addressList = $("addressList").tBodies[0]; if (lastIndex == 0 && addressList.childNodes.length <= 2) return; addr = $('addr_' + lastIndex); if (!addr) return; if (addr.value.strip() != '') return; senderRow = $("row_" + lastIndex); addressList.removeChild(senderRow); } function getIndexFromIdentifier(id) { return id.split('_')[1]; } function getAddressIDs() { var addressList, rows, i, count, addressIDs; addressIDs = new Array(); addressList = $("addressList").tBodies[0]; rows = addressList.childNodes; count = rows.length; for (i = 0; i < count; i++) { var row, rowId; row = rows[i]; rowId = row.id; if (rowId && rowId != 'lastRow') { var idx; idx = this.getIndexFromIdentifier(rowId); addressIDs.push(idx); } } return addressIDs; } function getAddressCount() { var addressCount, addressIDs, i, count; addressCount = 0; addressIDs = this.getAddressIDs(); count = addressIDs.length; for (i = 0; i < count; i++) { var idx, input; idx = addressIDs[i]; input = $('addr_' + idx); if (input && input.value != '') addressCount++; } return addressCount; } function hasRecipients() { var count; count = this.getAddressCount(); return (count > 0); } function initMailToSelection() { currentIndex = lastIndex = $$("table#addressList tr").length - 2; } document.observe("dom:loaded", initMailToSelection);