// email-addresses.js - RFC 5322 email address parser // v 3.0.1 // From: https://github.com/jackbearheart/email-addresses // // http://tools.ietf.org/html/rfc5322 // // This library does not validate email addresses. // emailAddresses attempts to parse addresses using the (fairly liberal) // grammar specified in RFC 5322. // // email-addresses returns { // ast: , // addresses: [{ // node: , // name: , // address: , // local: , // domain: // }, ...] // } // // emailAddresses.parseOneAddress and emailAddresses.parseAddressList // work as you might expect. Try it out. // // Many thanks to Dominic Sayers and his documentation on the is_email function, // http://code.google.com/p/isemail/ , which helped greatly in writing this parser. function checkemailaddress(emailstr) { if (emailstr == '') { return false; } // Get parts of email address emailobj = emailAddresses.parseOneAddress(emailstr); //emailobj = MyCwCal.emailAddresses.parseOneAddress(emailstr) //emailobj = this.emailAddresses.parseOneAddress(emailstr); if (emailobj && emailobj !== 'null' && emailobj !== 'undefined') { nodisplaynameemailstr = emailobj.address; } else { nodisplaynameemailstr = 'invalid'; } // Check for correct email address format var filter = /^([a-zA-Z0-9_+'\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; if (!filter.test(nodisplaynameemailstr)) { return false; } else { return true; } } (function (global) { "use strict"; function parse5322(opts) { // tokenizing functions function inStr() { return pos < len; } function curTok() { return parseString[pos]; } function getPos() { return pos; } function setPos(i) { pos = i; } function nextTok() { pos += 1; } function initialize() { pos = 0; len = parseString.length; } // parser helper functions function o(name, value) { return { name: name, tokens: value || "", semantic: value || "", children: [] }; } function wrap(name, ast) { var n; if (ast === null) { return null; } n = o(name); n.tokens = ast.tokens; n.semantic = ast.semantic; n.children.push(ast); return n; } function add(parent, child) { if (child !== null) { parent.tokens += child.tokens; parent.semantic += child.semantic; } parent.children.push(child); return parent; } function compareToken(fxnCompare) { var tok; if (!inStr()) { return null; } tok = curTok(); if (fxnCompare(tok)) { nextTok(); return o('token', tok); } return null; } function literal(lit) { return function literalFunc() { return wrap('literal', compareToken(function (tok) { return tok === lit; })); }; } function and() { var args = arguments; return function andFunc() { var i, s, result, start; start = getPos(); s = o('and'); for (i = 0; i < args.length; i += 1) { result = args[i](); if (result === null) { setPos(start); return null; } add(s, result); } return s; }; } function or() { var args = arguments; return function orFunc() { var i, result, start; start = getPos(); for (i = 0; i < args.length; i += 1) { result = args[i](); if (result !== null) { return result; } setPos(start); } return null; }; } function opt(prod) { return function optFunc() { var result, start; start = getPos(); result = prod(); if (result !== null) { return result; } else { setPos(start); return o('opt'); } }; } function invis(prod) { return function invisFunc() { var result = prod(); if (result !== null) { result.semantic = ""; } return result; }; } function colwsp(prod) { return function collapseSemanticWhitespace() { var result = prod(); if (result !== null && result.semantic.length > 0) { result.semantic = " "; } return result; }; } function star(prod, minimum) { return function starFunc() { var s, result, count, start, min; start = getPos(); s = o('star'); count = 0; min = minimum === undefined ? 0 : minimum; while ((result = prod()) !== null) { count = count + 1; add(s, result); } if (count >= min) { return s; } else { setPos(start); return null; } }; } // One expects names to get normalized like this: // " First Last " -> "First Last" // "First Last" -> "First Last" // "First Last" -> "First Last" function collapseWhitespace(s) { return s.replace(/([ \t]|\r\n)+/g, ' ').replace(/^\s*/, '').replace(/\s*$/, ''); } // UTF-8 pseudo-production (RFC 6532) // RFC 6532 extends RFC 5322 productions to include UTF-8 // using the following productions: // UTF8-non-ascii = UTF8-2 / UTF8-3 / UTF8-4 // UTF8-2 = // UTF8-3 = // UTF8-4 = // // For reference, the extended RFC 5322 productions are: // VCHAR =/ UTF8-non-ascii // ctext =/ UTF8-non-ascii // atext =/ UTF8-non-ascii // qtext =/ UTF8-non-ascii // dtext =/ UTF8-non-ascii function isUTF8NonAscii(tok) { // In JavaScript, we just deal directly with Unicode code points, // so we aren't checking individual bytes for UTF-8 encoding. // Just check that the character is non-ascii. return tok.charCodeAt(0) >= 128; } // common productions (RFC 5234) // http://tools.ietf.org/html/rfc5234 // B.1. Core Rules // CR = %x0D // ; carriage return function cr() { return wrap('cr', literal('\r')()); } // CRLF = CR LF // ; Internet standard newline function crlf() { return wrap('crlf', and(cr, lf)()); } // DQUOTE = %x22 // ; " (Double Quote) function dquote() { return wrap('dquote', literal('"')()); } // HTAB = %x09 // ; horizontal tab function htab() { return wrap('htab', literal('\t')()); } // LF = %x0A // ; linefeed function lf() { return wrap('lf', literal('\n')()); } // SP = %x20 function sp() { return wrap('sp', literal(' ')()); } // VCHAR = %x21-7E // ; visible (printing) characters function vchar() { return wrap('vchar', compareToken(function vcharFunc(tok) { var code = tok.charCodeAt(0); var accept = (0x21 <= code && code <= 0x7E); if (opts.rfc6532) { accept = accept || isUTF8NonAscii(tok); } return accept; })); } // WSP = SP / HTAB // ; white space function wsp() { return wrap('wsp', or(sp, htab)()); } // email productions (RFC 5322) // http://tools.ietf.org/html/rfc5322 // 3.2.1. Quoted characters // quoted-pair = ("\" (VCHAR / WSP)) / obs-qp function quotedPair() { var qp = wrap('quoted-pair', or( and(literal('\\'), or(vchar, wsp)), obsQP )()); if (qp === null) { return null; } // a quoted pair will be two characters, and the "\" character // should be semantically "invisible" (RFC 5322 3.2.1) qp.semantic = qp.semantic[1]; return qp; } // 3.2.2. Folding White Space and Comments // FWS = ([*WSP CRLF] 1*WSP) / obs-FWS function fws() { return wrap('fws', or( obsFws, and( opt(and( star(wsp), invis(crlf) )), star(wsp, 1) ) )()); } // ctext = %d33-39 / ; Printable US-ASCII // %d42-91 / ; characters not including // %d93-126 / ; "(", ")", or "\" // obs-ctext function ctext() { return wrap('ctext', or( function ctextFunc1() { return compareToken(function ctextFunc2(tok) { var code = tok.charCodeAt(0); var accept = (33 <= code && code <= 39) || (42 <= code && code <= 91) || (93 <= code && code <= 126); if (opts.rfc6532) { accept = accept || isUTF8NonAscii(tok); } return accept; }); }, obsCtext )()); } // ccontent = ctext / quoted-pair / comment function ccontent() { return wrap('ccontent', or(ctext, quotedPair, comment)()); } // comment = "(" *([FWS] ccontent) [FWS] ")" function comment() { return wrap('comment', and( literal('('), star(and(opt(fws), ccontent)), opt(fws), literal(')') )()); } // CFWS = (1*([FWS] comment) [FWS]) / FWS function cfws() { return wrap('cfws', or( and( star( and(opt(fws), comment), 1 ), opt(fws) ), fws )()); } // 3.2.3. Atom //atext = ALPHA / DIGIT / ; Printable US-ASCII // "!" / "#" / ; characters not including // "$" / "%" / ; specials. Used for atoms. // "&" / "'" / // "*" / "+" / // "-" / "/" / // "=" / "?" / // "^" / "_" / // "`" / "{" / // "|" / "}" / // "~" function atext() { return wrap('atext', compareToken(function atextFunc(tok) { var accept = ('a' <= tok && tok <= 'z') || ('A' <= tok && tok <= 'Z') || ('0' <= tok && tok <= '9') || (['!', '#', '$', '%', '&', '\'', '*', '+', '-', '/', '=', '?', '^', '_', '`', '{', '|', '}', '~'].indexOf(tok) >= 0); if (opts.rfc6532) { accept = accept || isUTF8NonAscii(tok); } return accept; })); } // atom = [CFWS] 1*atext [CFWS] function atom() { return wrap('atom', and(colwsp(opt(cfws)), star(atext, 1), colwsp(opt(cfws)))()); } // dot-atom-text = 1*atext *("." 1*atext) function dotAtomText() { var s, maybeText; s = wrap('dot-atom-text', star(atext, 1)()); if (s === null) { return s; } maybeText = star(and(literal('.'), star(atext, 1)))(); if (maybeText !== null) { add(s, maybeText); } return s; } // dot-atom = [CFWS] dot-atom-text [CFWS] function dotAtom() { return wrap('dot-atom', and(invis(opt(cfws)), dotAtomText, invis(opt(cfws)))()); } // 3.2.4. Quoted Strings // qtext = %d33 / ; Printable US-ASCII // %d35-91 / ; characters not including // %d93-126 / ; "\" or the quote character // obs-qtext function qtext() { return wrap('qtext', or( function qtextFunc1() { return compareToken(function qtextFunc2(tok) { var code = tok.charCodeAt(0); var accept = (33 === code) || (35 <= code && code <= 91) || (93 <= code && code <= 126); if (opts.rfc6532) { accept = accept || isUTF8NonAscii(tok); } return accept; }); }, obsQtext )()); } // qcontent = qtext / quoted-pair function qcontent() { return wrap('qcontent', or(qtext, quotedPair)()); } // quoted-string = [CFWS] // DQUOTE *([FWS] qcontent) [FWS] DQUOTE // [CFWS] function quotedString() { return wrap('quoted-string', and( invis(opt(cfws)), invis(dquote), star(and(opt(colwsp(fws)), qcontent)), opt(invis(fws)), invis(dquote), invis(opt(cfws)) )()); } // 3.2.5 Miscellaneous Tokens // word = atom / quoted-string function word() { return wrap('word', or(atom, quotedString)()); } // phrase = 1*word / obs-phrase function phrase() { return wrap('phrase', or(obsPhrase, star(word, 1))()); } // 3.4. Address Specification // address = mailbox / group function address() { return wrap('address', or(mailbox, group)()); } // mailbox = name-addr / addr-spec function mailbox() { return wrap('mailbox', or(nameAddr, addrSpec)()); } // name-addr = [display-name] angle-addr function nameAddr() { return wrap('name-addr', and(opt(displayName), angleAddr)()); } // angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / // obs-angle-addr function angleAddr() { return wrap('angle-addr', or( and( invis(opt(cfws)), literal('<'), addrSpec, literal('>'), invis(opt(cfws)) ), obsAngleAddr )()); } // group = display-name ":" [group-list] ";" [CFWS] function group() { return wrap('group', and( displayName, literal(':'), opt(groupList), literal(';'), invis(opt(cfws)) )()); } // display-name = phrase function displayName() { return wrap('display-name', function phraseFixedSemantic() { var result = phrase(); if (result !== null) { result.semantic = collapseWhitespace(result.semantic); } return result; }()); } // mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list function mailboxList() { return wrap('mailbox-list', or( and( mailbox, star(and(literal(','), mailbox)) ), obsMboxList )()); } // address-list = (address *("," address)) / obs-addr-list function addressList() { return wrap('address-list', or( and( address, star(and(literal(','), address)) ), obsAddrList )()); } // group-list = mailbox-list / CFWS / obs-group-list function groupList() { return wrap('group-list', or( mailboxList, invis(cfws), obsGroupList )()); } // 3.4.1 Addr-Spec Specification // local-part = dot-atom / quoted-string / obs-local-part function localPart() { // note: quoted-string, dotAtom are proper subsets of obs-local-part // so we really just have to look for obsLocalPart, if we don't care about the exact parse tree return wrap('local-part', or(obsLocalPart, dotAtom, quotedString)()); } // dtext = %d33-90 / ; Printable US-ASCII // %d94-126 / ; characters not including // obs-dtext ; "[", "]", or "\" function dtext() { return wrap('dtext', or( function dtextFunc1() { return compareToken(function dtextFunc2(tok) { var code = tok.charCodeAt(0); var accept = (33 <= code && code <= 90) || (94 <= code && code <= 126); if (opts.rfc6532) { accept = accept || isUTF8NonAscii(tok); } return accept; }); }, obsDtext )() ); } // domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] function domainLiteral() { return wrap('domain-literal', and( invis(opt(cfws)), literal('['), star(and(opt(fws), dtext)), opt(fws), literal(']'), invis(opt(cfws)) )()); } // domain = dot-atom / domain-literal / obs-domain function domain() { return wrap('domain', function domainCheckTLD() { var result = or(obsDomain, dotAtom, domainLiteral)(); if (opts.rejectTLD) { if (result && result.semantic && result.semantic.indexOf('.') < 0) { return null; } } // strip all whitespace from domains if (result) { result.semantic = result.semantic.replace(/\s+/g, ''); } return result; }()); } // addr-spec = local-part "@" domain function addrSpec() { return wrap('addr-spec', and( localPart, literal('@'), domain )()); } // 3.6.2 Originator Fields // Below we only parse the field body, not the name of the field // like "From:", "Sender:", or "Reply-To:". Other libraries that // parse email headers can parse those and defer to these productions // for the "RFC 5322" part. // RFC 6854 2.1. Replacement of RFC 5322, Section 3.6.2. Originator Fields // from = "From:" (mailbox-list / address-list) CRLF function fromSpec() { return wrap('from', or( mailboxList, addressList )()); } // RFC 6854 2.1. Replacement of RFC 5322, Section 3.6.2. Originator Fields // sender = "Sender:" (mailbox / address) CRLF function senderSpec() { return wrap('sender', or( mailbox, address )()); } // RFC 6854 2.1. Replacement of RFC 5322, Section 3.6.2. Originator Fields // reply-to = "Reply-To:" address-list CRLF function replyToSpec() { return wrap('reply-to', addressList()); } // 4.1. Miscellaneous Obsolete Tokens // obs-NO-WS-CTL = %d1-8 / ; US-ASCII control // %d11 / ; characters that do not // %d12 / ; include the carriage // %d14-31 / ; return, line feed, and // %d127 ; white space characters function obsNoWsCtl() { return opts.strict ? null : wrap('obs-NO-WS-CTL', compareToken(function (tok) { var code = tok.charCodeAt(0); return ((1 <= code && code <= 8) || (11 === code || 12 === code) || (14 <= code && code <= 31) || (127 === code)); })); } // obs-ctext = obs-NO-WS-CTL function obsCtext() { return opts.strict ? null : wrap('obs-ctext', obsNoWsCtl()); } // obs-qtext = obs-NO-WS-CTL function obsQtext() { return opts.strict ? null : wrap('obs-qtext', obsNoWsCtl()); } // obs-qp = "\" (%d0 / obs-NO-WS-CTL / LF / CR) function obsQP() { return opts.strict ? null : wrap('obs-qp', and( literal('\\'), or(literal('\0'), obsNoWsCtl, lf, cr) )()); } // obs-phrase = word *(word / "." / CFWS) function obsPhrase() { return opts.strict ? null : wrap('obs-phrase', and( word, star(or(word, literal('.'), colwsp(cfws))) )()); } // 4.2. Obsolete Folding White Space // NOTE: read the errata http://www.rfc-editor.org/errata_search.php?rfc=5322&eid=1908 // obs-FWS = 1*([CRLF] WSP) function obsFws() { return opts.strict ? null : wrap('obs-FWS', star( and(invis(opt(crlf)), wsp), 1 )()); } // 4.4. Obsolete Addressing // obs-angle-addr = [CFWS] "<" obs-route addr-spec ">" [CFWS] function obsAngleAddr() { return opts.strict ? null : wrap('obs-angle-addr', and( invis(opt(cfws)), literal('<'), obsRoute, addrSpec, literal('>'), invis(opt(cfws)) )()); } // obs-route = obs-domain-list ":" function obsRoute() { return opts.strict ? null : wrap('obs-route', and( obsDomainList, literal(':') )()); } // obs-domain-list = *(CFWS / ",") "@" domain // *("," [CFWS] ["@" domain]) function obsDomainList() { return opts.strict ? null : wrap('obs-domain-list', and( star(or(invis(cfws), literal(','))), literal('@'), domain, star(and( literal(','), invis(opt(cfws)), opt(and(literal('@'), domain)) )) )()); } // obs-mbox-list = *([CFWS] ",") mailbox *("," [mailbox / CFWS]) function obsMboxList() { return opts.strict ? null : wrap('obs-mbox-list', and( star(and( invis(opt(cfws)), literal(',') )), mailbox, star(and( literal(','), opt(and( mailbox, invis(cfws) )) )) )()); } // obs-addr-list = *([CFWS] ",") address *("," [address / CFWS]) function obsAddrList() { return opts.strict ? null : wrap('obs-addr-list', and( star(and( invis(opt(cfws)), literal(',') )), address, star(and( literal(','), opt(and( address, invis(cfws) )) )) )()); } // obs-group-list = 1*([CFWS] ",") [CFWS] function obsGroupList() { return opts.strict ? null : wrap('obs-group-list', and( star(and( invis(opt(cfws)), literal(',') ), 1), invis(opt(cfws)) )()); } // obs-local-part = word *("." word) function obsLocalPart() { return opts.strict ? null : wrap('obs-local-part', and(word, star(and(literal('.'), word)))()); } // obs-domain = atom *("." atom) function obsDomain() { return opts.strict ? null : wrap('obs-domain', and(atom, star(and(literal('.'), atom)))()); } // obs-dtext = obs-NO-WS-CTL / quoted-pair function obsDtext() { return opts.strict ? null : wrap('obs-dtext', or(obsNoWsCtl, quotedPair)()); } ///////////////////////////////////////////////////// // ast analysis function findNode(name, root) { var i, stack, node; if (root === null || root === undefined) { return null; } stack = [root]; while (stack.length > 0) { node = stack.pop(); if (node.name === name) { return node; } for (i = node.children.length - 1; i >= 0; i -= 1) { stack.push(node.children[i]); } } return null; } function findAllNodes(name, root) { var i, stack, node, result; if (root === null || root === undefined) { return null; } stack = [root]; result = []; while (stack.length > 0) { node = stack.pop(); if (node.name === name) { result.push(node); } for (i = node.children.length - 1; i >= 0; i -= 1) { stack.push(node.children[i]); } } return result; } function findAllNodesNoChildren(names, root) { var i, stack, node, result, namesLookup; if (root === null || root === undefined) { return null; } stack = [root]; result = []; namesLookup = {}; for (i = 0; i < names.length; i += 1) { namesLookup[names[i]] = true; } while (stack.length > 0) { node = stack.pop(); if (node.name in namesLookup) { result.push(node); // don't look at children (hence findAllNodesNoChildren) } else { for (i = node.children.length - 1; i >= 0; i -= 1) { stack.push(node.children[i]); } } } return result; } function giveResult(ast) { var addresses, groupsAndMailboxes, i, groupOrMailbox, result; if (ast === null) { return null; } addresses = []; // An address is a 'group' (i.e. a list of mailboxes) or a 'mailbox'. groupsAndMailboxes = findAllNodesNoChildren(['group', 'mailbox'], ast); for (i = 0; i < groupsAndMailboxes.length; i += 1) { groupOrMailbox = groupsAndMailboxes[i]; if (groupOrMailbox.name === 'group') { addresses.push(giveResultGroup(groupOrMailbox)); } else if (groupOrMailbox.name === 'mailbox') { addresses.push(giveResultMailbox(groupOrMailbox)); } } result = { ast: ast, addresses: addresses, }; if (opts.simple) { result = simplifyResult(result); } if (opts.oneResult) { return oneResult(result); } if (opts.simple) { return result && result.addresses; } else { return result; } } function giveResultGroup(group) { var i; var groupName = findNode('display-name', group); var groupResultMailboxes = []; var mailboxes = findAllNodesNoChildren(['mailbox'], group); for (i = 0; i < mailboxes.length; i += 1) { groupResultMailboxes.push(giveResultMailbox(mailboxes[i])); } return { node: group, parts: { name: groupName, }, type: group.name, // 'group' name: grabSemantic(groupName), addresses: groupResultMailboxes, }; } function giveResultMailbox(mailbox) { var name = findNode('display-name', mailbox); var aspec = findNode('addr-spec', mailbox); var comments = findAllNodes('cfws', mailbox); var local = findNode('local-part', aspec); var domain = findNode('domain', aspec); return { node: mailbox, parts: { name: name, address: aspec, local: local, domain: domain, comments: comments }, type: mailbox.name, // 'mailbox' name: grabSemantic(name), address: grabSemantic(aspec), local: grabSemantic(local), domain: grabSemantic(domain), groupName: grabSemantic(mailbox.groupName), }; } function grabSemantic(n) { return n !== null && n !== undefined ? n.semantic : null; } function simplifyResult(result) { var i; if (result && result.addresses) { for (i = 0; i < result.addresses.length; i += 1) { delete result.addresses[i].node; } } return result; } function oneResult(result) { if (!result) { return null; } if (!opts.partial && result.addresses.length > 1) { return null; } return result.addresses && result.addresses[0]; } ///////////////////////////////////////////////////// var parseString, pos, len, parsed, startProduction; opts = handleOpts(opts, {}); if (opts === null) { return null; } parseString = opts.input; startProduction = { 'address': address, 'address-list': addressList, 'angle-addr': angleAddr, 'from': fromSpec, 'group': group, 'mailbox': mailbox, 'mailbox-list': mailboxList, 'reply-to': replyToSpec, 'sender': senderSpec, }[opts.startAt] || addressList; if (!opts.strict) { initialize(); opts.strict = true; parsed = startProduction(parseString); if (opts.partial || !inStr()) { return giveResult(parsed); } opts.strict = false; } initialize(); parsed = startProduction(parseString); if (!opts.partial && inStr()) { return null; } return giveResult(parsed); } /* function checkemailaddress(emailstr) { if (emailstr == '') { return false; } // Get parts of email address emailobj = emailAddresses.parseOneAddress(emailstr); //emailobj = MyCwCal.emailAddresses.parseOneAddress(emailstr) //emailobj = this.emailAddresses.parseOneAddress(emailstr); if (emailobj && emailobj !== 'null' && emailobj !== 'undefined') { nodisplaynameemailstr = emailobj.address; } else { nodisplaynameemailstr = 'invalid'; } // Check for correct rsvp email address format var filter = /^([a-zA-Z0-9_+'\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; if (!filter.test(nodisplaynameemailstr)) { return false; } else { return true; } } */ function parseOneAddressSimple(opts) { return parse5322(handleOpts(opts, { oneResult: true, rfc6532: true, simple: true, startAt: 'address-list', })); } function parseAddressListSimple(opts) { return parse5322(handleOpts(opts, { rfc6532: true, simple: true, startAt: 'address-list', })); } function parseFromSimple(opts) { return parse5322(handleOpts(opts, { rfc6532: true, simple: true, startAt: 'from', })); } function parseSenderSimple(opts) { return parse5322(handleOpts(opts, { oneResult: true, rfc6532: true, simple: true, startAt: 'sender', })); } function parseReplyToSimple(opts) { return parse5322(handleOpts(opts, { rfc6532: true, simple: true, startAt: 'reply-to', })); } function handleOpts(opts, defs) { function isString(str) { return Object.prototype.toString.call(str) === '[object String]'; } function isObject(o) { return o === Object(o); } function isNullUndef(o) { return o === null || o === undefined; } var defaults, o; if (isString(opts)) { opts = { input: opts }; } else if (!isObject(opts)) { return null; } if (!isString(opts.input)) { return null; } if (!defs) { return null; } defaults = { oneResult: false, partial: false, rejectTLD: false, rfc6532: false, simple: false, startAt: 'address-list', strict: false, }; for (o in defaults) { if (isNullUndef(opts[o])) { opts[o] = !isNullUndef(defs[o]) ? defs[o] : defaults[o]; } } return opts; } parse5322.parseOneAddress = parseOneAddressSimple; parse5322.parseAddressList = parseAddressListSimple; parse5322.parseFrom = parseFromSimple; parse5322.parseSender = parseSenderSimple; parse5322.parseReplyTo = parseReplyToSimple; if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { module.exports = parse5322; } else { global.emailAddresses = parse5322; } }(this)); (function($) { //####################### cwWidget Object ###################################### var cwWidget = function(){ var urlPrefix = "https://www.calendarwiz.com"; var gCalendar; var that = this; document.write('
 
'); that.widget = document.getElementById("cw_search_widget_1728790508"); var g_rpt_master_id; var g_cw_id; var gPHPSESSID = "?PHPSESSID=" + '93c12fqnod743utr5la2lej3s0'; var ajaxActive = false; var monthEvents; var gCameFromMonth = true; var gCameFromDetail = false; var gDestinationScreen; var jHelp; that.isSrch = true; that.nameofwidget = 'MyCwSrch'; // ----------------------------------------------------------------- // Apply styles to the widget // ----------------------------------------------------------------- this.applyStyles = function(styles, notDesigner) { that.widgetStyles = styles; // NOTE: STATEMENTS ALL ONE ONE LINE IE7 MODE WILL CAUSE JS ERROR // Get height for selects based upon the field font size // Hardcoded because cannot always get height of display none objects var fldpts = styles.srch_field_size; var fldht = '20px'; if (fldpts == 7) {fldht = '16px';} if (fldpts == 8) {fldht = '18px';} if (fldpts == 9) {fldht = '20px';} if (fldpts == 10) {fldht = '21px';} if (fldpts == 11) {fldht = '24px';} if (fldpts == 12) {fldht = '25px';} // Override bootstrap styles when navbar search if (window.is_cw_search_button) { // All selects in form except multi category and multi location $("#cw_search_widget_1728790508 select").css({"padding" : "0px", "height": fldht}); $("#cw_search_widget_1728790508 input").css({"padding" : "0px 4px", "height": fldht}); } // Search form $("#searchformid").css({'margin-bottom' : '0px'}); // Heading $("#head").html(styles.srch_head_text); $("#head").css({'font-size' : styles.srch_head_size + 'pt', 'font-family' : styles.srch_head_font,'font-weight' : styles.srch_head_weight,'color' : styles.srch_head_text_color,'font-style' : styles.srch_head_style}); // Captions $(".subhead").css({'font-size' : styles.srch_caption_size + 'pt','font-family' : styles.srch_caption_font,'color' : styles.srch_caption_text_color,'margin-left' : '3px','padding-bottom' : '3px' }); // Fieldsets borders $("fieldset").css({"border-color" : styles.srch_frame_border_color, "border-width" : "1px", "border-style" : "solid", "padding" : "0px", "text-align" : "left","margin-top":"5px"}); // Form field labels $(".fieldlabel").css({'font-size' : styles.srch_label_size + 'pt', 'font-family' : styles.srch_label_font, 'color' : styles.srch_label_color}); // Form fields including dropdown checklists $("#searchformid input[type=text], #searchformid select, #searchformid button").css({'font-size' : styles.srch_field_size + 'pt','font-family' : styles.srch_field_font,'color' : styles.srch_field_color}); // Search button $("#btnsearch").css('font-size', '12px'); // Set up text height test object with current field font, this is hidden table td $("#texttesttd").show(); $("#texttesttd").css({'font-size' : styles.srch_field_size + 'pt', 'font-family' : styles.srch_field_font}); // Fix for IE not resizing select fields after font change // This is only done for IE and when in preview mode of cwsearchadmin.php if ((!notDesigner) && ('0' == '1')) { // Month Selects $("#texttesttd").html('May'); $("[cwui='bmid'], [cwui='emid']").css({ 'height' : $("#texttesttd").height() + 4 + "px", 'width' : $("#texttesttd").width() + 30 + "px" }); $("#texttesttd").html('31'); $("[cwui='bdid'], [cwui='edid']").css({ 'height' : $("#texttesttd").height() + 4 + "px", 'width' : $("#texttesttd").width() + 30 + "px" }); $("#texttesttd").html('2010'); $("[cwui='byid'], [cwui='eyid']").css({ 'height' : $("#texttesttd").height() + 4 + "px", 'width' : $("#texttesttd").width() + 30 + "px" }); $("#texttesttd").html('500 miles'); $("#pmilesid").css({ 'height' : $("#texttesttd").height() + 4 + "px", 'width' : $("#texttesttd").width() + 30 + "px" }); } $("[cwui='bmid'], [cwui='emid']").bind("change", setNumDays); $("[cwui='byid'], [cwui='eyid']").bind("change", setNumDays); // Apply layout for search method divs, srch_layout_wide == 1 for wide, srch_layout_wide == 0 for tall if (styles.srch_layout_wide == 1) { $("#startdatediv, #enddatediv, #loctextadiv, #loctextbdiv").css({'float' : 'left', 'width' : '50%'}); $("#zipmilesdiv").css({'float' : 'left', 'width' : '60%'}); $("#zipcodediv").css({'float' : 'left', 'width' : '40%'}); } else { $("#startdatediv, #enddatediv, #zipmilesdiv, #zipcodediv, #loctextadiv, #loctextbdiv").css({'float' : 'none', 'width' : '100%'}); } // Search method divs visibility $("#datarangediv").show(); // Alway shown // Optional search methods visibility if (styles.srch_catsearch_show == 1) { $("#categoriesdiv").show(); } else { $("#categoriesdiv").hide(); } if (styles.srch_locsearch_show == 1) { $("#locationsdiv").show(); } else { $("#locationsdiv").hide(); } if (styles.srch_zipsearch_show == 1) { $("#zipproximitydiv").show(); } else { $("#zipproximitydiv").hide(); } if (styles.srch_locfldsearch_show == 1) { $("#locationtextdiv").show(); } else { $("#locationtextdiv").hide(); } if (styles.srch_txtstrsearch_show == 1) { $("#eventtextdiv").show(); } else { $("#eventtextdiv").hide(); } $("#cw_search_widget_1728790508").show(); var sdt_width = $("#startdatetable").width(); var edt_width = $("#enddatetable").width(); if (styles.srch_layout_wide == 1) { var adjusted_srch_width = sdt_width + edt_width; } else { var adjusted_srch_width = sdt_width; } adjusted_srch_width = adjusted_srch_width + 30; if (adjusted_srch_width < 125) { adjusted_srch_width = 125; } $("#cw_search_widget_1728790508").css({"width" : adjusted_srch_width + "px", "border-style" : styles.srch_border_style}); $("#cw_search_widget_1728790508").css({"border-width" : styles.srch_border_width + 'px', "border-color" : styles.srch_border_color}); // Categories dropdown list items selObj = document.getElementById("categories"); selObj.options.length = 0; if (styles.categories) { var numcats = styles.categories.length; for (var i = 0; i < numcats; i++) { var optvalue = styles.categories[i].category_id; var opttext = unescape(styles.categories[i].category_name); newoption = new Option(opttext, optvalue, false, false); newindex = selObj.options.length; selObj.options[newindex] = newoption; } } // Number of categories is dynamic in the search administor preview so can't use initial value var numcategories = selObj.options.length; // Number of locations not dynamic so can use initial value in administrator preview and live plugin var numlocations = '20'; $("#categories").dropdownchecklist("destroy"); $("#locations").dropdownchecklist("destroy"); if (('0' == '0') && (numcategories > 1)) { var firstCatItemChecksAllOption = true; } else { var firstCatItemChecksAllOption = false; } if (numcategories > 1) { var catemptyText = "Select one or more.."; } else { var catemptyText = "Select one.."; } if (('0' == '0') && (numlocations > 1)) { var firstLocItemChecksAllOption = true; } else { var firstLocItemChecksAllOption = false; } if (numlocations > 1) { var locemptyText = "Select one or more.."; } else if (numlocations == 1) { var locemptyText = "Select one.."; } else { var locemptyText = "No locations defined yet.."; } // Get best width for dropdown checklists if (styles.srch_catsearch_show == 1) { var dropdowntextwidth = ($("#categoriesdiv").width() * .9) - 10; } else if (styles.srch_locsearch_show == 1) { var dropdowntextwidth = ($("#locationsdiv").width() * .9) - 10; } else { var dropdowntextwidth = 100; } if (numcategories == 0) { $("#categoriesdiv").hide(); } else { $("#categories").dropdownchecklist({ icon: {placement:"right",toOpen:"ui-icon-triangle-1-s",toClose:"ui-icon-triangle-1-s"}, width: dropdowntextwidth, maxDropHeight: 200, firstItemChecksAll: firstCatItemChecksAllOption, emptyText:catemptyText}); } if (numlocations == 0) { $("#locationsdiv").hide(); } else { $("#locations").dropdownchecklist({ icon: {placement:"right",toOpen:"ui-icon-triangle-1-s",toClose:"ui-icon-triangle-1-s"}, width: dropdowntextwidth, maxDropHeight: 200, firstItemChecksAll: firstLocItemChecksAllOption, emptyText:locemptyText}); } // Dropdown checklists styles if(navigator.userAgent.match(/MSIE 6/)) { $("#ddcl-categories .ui-dropdownchecklist-text").css({'font-size' : '12px','color' : styles.srch_field_color}); $("#ddcl-locations .ui-dropdownchecklist-text").css({'font-size' : '12px','color' : styles.srch_field_color}); } else { $("#ddcl-categories .ui-dropdownchecklist-text").css({'font-size' : styles.srch_field_size + 'pt', 'vertical-align':'top', 'color' : styles.srch_field_color}); $("#ddcl-locations .ui-dropdownchecklist-text").css({'font-size' : styles.srch_field_size + 'pt', 'vertical-align':'top', 'color' : styles.srch_field_color}); } // For new version of dropdownchecklist? // Dropdown checklists styles - applies to both category and location $("#selectlistdiv #ddcl-categories").css({"padding-left":"10px"}); $("#selectlistdiv #ddcl-locations").css({"padding-left":"10px"}); $("#selectlistdiv #ddcl-categories-ddw").css({"padding-left":"10px"}); $("#selectlistdiv #ddcl-locations-ddw").css({"padding-left":"10px"}); $("#selectlistdiv .ui-dropdownchecklist-item").css({"height":"20px","background":"none","border":"none"}); $("#selectlistdiv .ui-dropdownchecklist-item input").css({"margin":"3px 3px 3px 4px"}); $("#selectlistdiv .ui-dropdownchecklist-text").css({"vertical-align":"middle","text-align":"left","padding":"0px 0px 0px 2px","color":"#000000"}); $("#selectlistdiv .ui-dropdownchecklist-selector").css({"padding":"0px","background":"none","background-color":"white"}); $("#selectlistdiv .ui-dropdownchecklist-selector-wrapper").css({"font-size":'10px'}); $('label[for^="ddcl-categories-i"]').css({"padding":"0px 0px 3px 0px"}); $('label[for^="ddcl-locations-i"]').css({"padding":"0px 0px 3px 0px"}); // Set browser default styles so css on hosting web page does not cascade into the search widget $("#cw_search_widget_1728790508 table").css({'font-size':styles.srch_field_size + 'pt','font-weight':'bold' }); $("#cw_search_widget_1728790508 table").css({'margin':"0px"}); $("#cw_search_widget_1728790508 tr").css({'background-color':"transparent",'margin':"0px"}); $("#cw_srch_detail_dialog table").css({'margin' : "0px"}); $("#cw_srch_detail_dialog tr").css({'background-color' : "transparent",'margin':"0px"}); $("#categoriesdiv").css({'font-size' : styles.srch_field_size + 'pt' }); $("#locationsdiv").css({'font-size' : styles.srch_field_size + 'pt'}); var dropdowntextheight = fldht; $("#ddcl-categories .ui-dropdownchecklist-text, #ddcl-categories-ddw .ui-dropdownchecklist-item").css({'font-family':styles.srch_field_font,'font-size':styles.srch_field_size + 'pt'}); $("#ddcl-categories-ddw .ui-dropdownchecklist-item label").css({'font-size':styles.srch_field_size + 'pt'}); $("#ddcl-locations .ui-dropdownchecklist-text, #ddcl-locations-ddw .ui-dropdownchecklist-item").css({'font-family':styles.srch_field_font}); $("#ddcl-locations-ddw .ui-dropdownchecklist-item label").css({'font-size':styles.srch_field_size + 'pt'}); // Set height of dropdown checklist text span $("[id^='cw_search_widget_'] .ui-dropdownchecklist-text").css({ 'height' : parseInt(dropdowntextheight) + "px", 'width' : parseInt(dropdowntextwidth) + "px" }); $("[id^='cw_search_widget_'] .ui-dropdownchecklist-selector").css({ 'vertical-align' : "middle"}); $("#selectlistdiv .ui-dropdownchecklist-selector").css({ 'height' : parseInt(dropdowntextheight) + "px", 'width' : parseInt(dropdowntextwidth) + "px", "margin-bottom" : "1px" }); $("#selectlistdiv .ui-dropdownchecklist-dropcontainer-wrapper").css({ 'height' : parseInt(dropdowntextheight) + "px", 'width' : parseInt(dropdowntextwidth) + "px" }); // Set height and text-align of dropdown checklist item div $("[id^='cw_search_widget_'] .ui-dropdownchecklist-item").css({'height' : parseInt(dropdowntextheight + 3) + 'px', 'text-align' : 'left'}); $("[id^='cw_search_widget_'] .ui-dropdownchecklist-item").css({'height' : parseInt(dropdowntextheight + 3) + 'px', 'text-align' : 'left'}); $("#selectlistdiv .ui-dropdownchecklist-selector .ui-dropdownchecklist-text").css({"width":parseInt(dropdowntextwidth - 16) + "px"}); // Compute dropdown checklist container heights var categoriesheight = parseInt(dropdowntextheight + 3) * parseInt(numcategories)+ 3; if (categoriesheight > 300) { categoriesheight = 300;} if (numlocations == 0) { htnumlocations = 1; // just makes empty control look better. NOT REALLY NEEDED SINCE HIDING LOCATIONS WHEN NONE } else { htnumlocations = numlocations; } var locationsheight = parseInt(dropdowntextheight + 3) * parseInt(htnumlocations) + 3; if (locationsheight > 300) { locationsheight = 300;} // Over-ride when this using popup window option in cwsearch_page.html since most likely in an iframe // and need to keep the dropdown from not going below bottom of form which may cause scroll bars in iframe if ('0' == 1) { // For url option to use windows for popups if (categoriesheight > 125) { categoriesheight = 125;} if (locationsheight > 125) { locationsheight = 125;} } // Set the horizontal overflow of dropdown checklist container $("[id^='cw_search_widget_'] .ui-dropdownchecklist-dropcontainer, #ddcl-locations .ui-dropdownchecklist-dropcontainer").css({'overflow-x' : "hidden"}); // Set height of dropdown checklist container divs based on number of items in list $("#ddcl-categories-ddw .ui-dropdownchecklist-dropcontainer").css({'height' : categoriesheight + "px"}); $("#ddcl-locations-ddw .ui-dropdownchecklist-dropcontainer").css({'height' : locationsheight + "px"}); // Field width adjustments for IE7 // Text Search For Text td widths $("#strlabeltdid").css({'width' : $("#strlabelspanid").width() + 'px'}); // Proximity Zip Code field width $("#texttesttd").html('01234'); $("#pzipfldid").css({'width' : $("#texttesttd").width() + 5 + "px" }); if (styles.srch_layout_wide == 1) { $(".zproxtd").css({'width' : parseInt($("#zipproximitydiv").width()*.25) + "px", 'text-align' : 'center'}); } else { $(".zproxtd").css({'width' : parseInt($("#zipproximitydiv").width()*.50) + "px", 'text-align' : 'center'}); } // Location Text Fields width $("#loctextadiv input[type=text], #loctextadiv .ltxtfldlabeltd").css({'width' : parseInt($("#loctextadiv").width()*.42) + "px" }); $("#loctextbdiv input[type=text], #loctextbdiv .ltxtfldlabeltd").css({'width' : parseInt($("#loctextadiv").width()*.42) + "px" }); // Hide the test text holder $("#texttesttd").hide(); // Display the entire search widget $("#cw_search_widget_1728790508").show(); jPleaseWaitDIV.hide(); applyDayStyles(styles, notDesigner); applyDetailStyles(styles, notDesigner); } function getWidgetStyles(calendar) { if(that.widgetStyles) { that.applyStyles(that.widgetStyles, true); } else { $.getJSON(urlPrefix + "/cwapi.php" + gPHPSESSID + that.themeNV + "&callback=?", {fmt:"json", view:"srch", crd:calendar}, widgetStylesCallback); } } function applyDayStyles(styles, notDesigner) { jHelp.css({color:styles.srch_head_text_color, "font-family":styles.srch_head_font, "text-align":"center"}); var jTitleBar = jDayDIV.closest(".ui-dialog").find(".ui-dialog-titlebar"); jTitleBar.css({"padding-left" : "10px", "color" : styles.srch_head_text_color, "margin-bottom" : "5px", "cursor" : "grab"}); if(NameValues["indesigner"]) { jTitleBar.css({background:"#CCCCCC url(https://www.calendarwiz.com/jquery/css/images/ui-bg_highlight-soft_75_cccccc_1x100.png) repeat-x scroll 50% 50%", border:"#CCCCCC"}); } jDayEventsDIV.find("[cwui='event']:even").css({'background-color':styles.day_alta_bg_color}); jDayEventsDIV.find("[cwui='event']:odd").css({'background-color':styles.day_altb_bg_color}); jDayEventsDIV.find("[cwui='eventdaytitle']").css({width:"100%","padding-left":"5px","padding-right":"5px", "padding-top":"5px", "padding-bottom":"2px", color:styles.day_title_text_color, "font-family":styles.day_title_font, "font-size":styles.day_title_size + "pt", "text-align":styles.day_title_align, "font-style":styles.day_title_style, "font-weight":styles.day_title_weight}); jDayEventsDIV.find("[cwui='eventdaytimelocation']").css({width:"100%", "padding-left":"5px", "padding-right":"5px", "padding-top":"0px", "padding-bottom":"4px", color:styles.day_timelocation_text_color, "font-family":styles.day_timelocation_font, "font-style":styles.day_timelocation_style, "font-weight":styles.day_timelocation_weight, "font-size":styles.day_timelocation_size + "pt", "text-align":styles.day_timelocation_align}); if(notDesigner == undefined || !jDayDIV.dialog('isOpen')) { // If this is search from main calendar search button then set position of event list dialog if (window.is_cw_search_button) { var srch_offset = $("#cw_search_widget_1728790508").offset(); jDayDIV.dialog('option', 'position', [srch_offset.left + 100, srch_offset.top + 45]); } jDayDIV.dialog('option', 'width', parseInt(styles.pop_width)); jDayDIV.dialog('option', 'height', parseInt(styles.pop_height)); if(jDayDIV.dialog('isOpen')) { var offset = jDayDIV.offset(); // relative to the document jDayDIV.dialog('close'); jDayDIV.dialog('open'); //alert('opening day div in search'); jDayDIV.dialog('option', 'position', [offset.left - 4, offset.top - 31]); } } } // ------------------------------------------------------------------ // Common Script For Display of Calendar Event Popup Dialogs both // List of Events in a Day, List of Search Results and Details of // Individual Event // Copyright 20017, CalendarWiz, LLC all rights reserved. // ------------------------------------------------------------------ function createDayListing(showNav){ //################# Day DIV ########################### dayDIV = document.createElement("div"); jDayDIV = $(dayDIV); dayNavDIV = document.createElement("div"); daydatenavDIV = document.createElement("div"); if(showNav){ prevDayIMG = document.createElement("img"); prevDayIMG.setAttribute("src", urlPrefix + "/common/images/arrowleft.gif"); $(prevDayIMG).css({"vertical-align":"middle", "display":"inline", "width":"12px"}); nextDayIMG = document.createElement("img"); nextDayIMG.setAttribute("src", urlPrefix + "/common/images/arrowright.gif"); $(nextDayIMG).css({"vertical-align":"middle", "display":"inline", "width":"12px"}); daydatenavDIV.appendChild(prevDayIMG); dayDateSPAN = document.createElement("span"); jDayDateSPAN = $(dayDateSPAN); jDayDateSPAN.css({padding:"5px", "font-size":"110%"}); daydatenavDIV.appendChild(dayDateSPAN); daydatenavDIV.appendChild(nextDayIMG); $(nextDayIMG).bind("click", navDay); $(prevDayIMG).bind("click", navDay); $(nextDayIMG).attr("cwui", "nextday"); $(prevDayIMG).attr("cwui", "prevday"); dayNavDIV.appendChild(daydatenavDIV); jDayNavDIV = $(dayNavDIV); jDayNavDIV.attr("cwui", "daynav"); jDayNavDIV.css({padding:"5px"}); dayDIV.appendChild(dayNavDIV); } jHelp = $(dayDIV.appendChild(document.createElement("div"))); jHelp.text("(click on event for details)").css({"font-size":"65%", "padding-bottom":"5px"}); dayEventsDIV = document.createElement("div"); dayDIV.appendChild(dayEventsDIV); jDayEventsDIV = $(dayEventsDIV); jDayEventsDIV.attr("cwui", "dayevents"); //that.widget.parentNode.appendChild(dayDIV); // Configure dialog, conditional bgiframe for IE6 var dialogConfig = {autoOpen: false, position: 'center'}; if(navigator.userAgent.match(/MSIE 6/)) { dialogConfig.bgiframe = true; } // Put id into jDayDIV so we can set z-index in header.inc.php jDayDIV.attr("id", "cw_srch_daylist_dialog"); jDayDIV.dialog(dialogConfig); //####################### End Day DIV ########################## } var gData; var jDetailBodyDIV; var jRemindBodyDIV; var jMsg; var introNoteMaxLength = 800; // Set flag window.is_cw_search_button is not already set in header.inc.php when search // widget option is set for main calendar navbar search button. This is to prevent error // caused by this variable not defined so need to define and set to false here if (typeof window.is_cw_search_button == "undefined") { window.is_cw_search_button = false; } function createDayEvent(doc, makeNotClickable){ var eventsTemplateDIV = document.createElement("div"); var titleDIV = document.createElement("div"); var jTitleDIV = $(titleDIV); jTitleDIV.attr("cwui", "eventdaytitle"); eventsTemplateDIV.appendChild(titleDIV); var dayEventTitleSPAN = document.createElement("span"); var jDayEventTitleSPAN = $(dayEventTitleSPAN); jDayEventTitleSPAN.attr("cwfield", "title"); titleDIV.appendChild(dayEventTitleSPAN); var dayEventStartSPAN = document.createElement("span"); dayEventStartSPAN.setAttribute("cwfield", "start"); var dayEventEndSPAN = document.createElement("span"); dayEventEndSPAN.setAttribute("cwfield", "end"); var dayEventLocationSPAN = document.createElement("span"); dayEventLocationSPAN.setAttribute("cwfield", "location"); var eventBodyDIV = document.createElement("div"); var jEventBodyDIV = $(eventBodyDIV); jEventBodyDIV.attr("cwui", "eventdaytimelocation"); eventBodyDIV.appendChild(dayEventStartSPAN); eventBodyDIV.appendChild(dayEventEndSPAN); eventBodyDIV.appendChild(dayEventLocationSPAN); eventsTemplateDIV.appendChild(eventBodyDIV); var jEventsTemplateDIV = $(eventsTemplateDIV); if(!makeNotClickable){ jEventsTemplateDIV.css({cursor:"pointer"}); if ('0' != 1) { // For NOT url option to use windows for popups jEventsTemplateDIV.bind("click", displayEvent); } } jEventsTemplateDIV.attr("cwui", "event"); return jEventsTemplateDIV; } //####################### Event Detail DIV ####################### var linksCSS = {"font-family":"Arial", "font-size":"10px", "padding-right":"5px", "text-decoration":"underline"}; function createEventDetail(doc){ var detailDIV = doc.createElement("div"); var jDetailDIV = $(detailDIV); jDetailDIV.attr("cwui", "detaildiv"); jMsg = jDetailDIV.append('
'); jMsgDiv = jDetailDIV.find("[cwui=msgdiv]").hide(); jMsg = jDetailDIV.find("[cwui=msg]"); jDetailDIV.append("
"); var jTitleDIV = jDetailDIV.find("[cwfield='title']"); jTitleDIV.css({"font-weight":"bold"}); var detailBodyDIV = doc.createElement("div"); jDetailBodyDIV = $(detailBodyDIV); jDetailBodyDIV.attr("cwui", "detailbodydiv"); jDetailDIV.append(jDetailBodyDIV); var linksHTML = ""; linksHTML += ""; linksHTML += ""; linksHTML += ""; linksHTML += "
PrintDownloadEmailRemind
"; jDetailBodyDIV.append(linksHTML); var jPrintLink = jDetailBodyDIV.find("[cwui=printlink]"); jPrintLink.bind("click", popupPrintWindow); var jRemindLink = jDetailBodyDIV.find("[cwui=remindlink]"); jRemindLink.bind("click", getReminder); var jEmailLink = jDetailBodyDIV.find("[cwui=emaillink]"); jEmailLink.bind("click", openNewEmail); jDetailBodyDIV.find("a").css(linksCSS); jDetailBodyDIV.append("
"); createLabeledElement(doc, "Date", detailBodyDIV, "detaildate"); createLabeledElement(doc, "Time", detailBodyDIV, "startendtime"); createLabeledElement(doc, "Location", detailBodyDIV, "location_name"); createLabeledElement(doc, "Category", detailBodyDIV, "category_name"); createSubHead(doc, detailBodyDIV, "Description"); createElement(doc, "div", detailBodyDIV, "description"); createLabeledElement(doc, "Contact", detailBodyDIV, "contact"); createLabeledElement(doc, "Email", detailBodyDIV, "email"); createLabeledElement(doc, "Phone", detailBodyDIV, "phone"); createLabeledElement(doc, "More Info", detailBodyDIV, "url"); createSubHead(doc, detailBodyDIV, "Location Details"); createElement(doc, "div", detailBodyDIV, "location_name"); createElement(doc, "div", detailBodyDIV, "location_street"); $(createElement(doc, "div", detailBodyDIV, "event_id")).hide(); $(createElement(doc, "div", detailBodyDIV, "repeat_id")).hide(); var cityStateZip = createElement(doc, "div", detailBodyDIV, "citystatezip"); $(cityStateZip).html(' '); createLabeledElement(doc, "Location Contact", detailBodyDIV, "location_contact"); createLabeledElement(doc, "Location Phone", detailBodyDIV, "location_phone"); createSubHead(doc, detailBodyDIV, "Directions"); createElement(doc, "div", detailBodyDIV, "location_directions"); createSubHead(doc, detailBodyDIV, "Guidelines"); createElement(doc, "div", detailBodyDIV, "location_guidelines"); createSubHead(doc, detailBodyDIV, "Note"); createElement(doc, "div", detailBodyDIV, "privatenote"); var remindBodyDIV = doc.createElement("div"); jRemindBodyDIV = $(remindBodyDIV); var tHTML = '
Set Email Reminder
'; tHTML += '
Send reminder before this event
To this email address
'; tHTML += '
'; tHTML += ' '; tHTML += ' '; tHTML += '
'; jRemindBodyDIV.append(tHTML); jRemindBodyDIV.find("[cwui=btnback]").bind("click", function(){jDetailBodyDIV.show();jRemindBodyDIV.hide();jMsgDiv.hide();}).css({"margin-top":"10px"}); jRemindBodyDIV.find("[cwui=setremind]").bind("click", setReminder).css({"margin-top":"10px"}); jRemindBodyDIV.find("[cwui=email]").bind("keydown", function(){jMsgDiv.hide('slow')}); jRemindBodyDIV.find("[cwui=delete]").bind("click", deleteReminder).css({"margin-top":"10px"}); jRemindBodyDIV.find("[cwui=email]").css({width:"90%", "margin-top":"10px"}); jRemindBodyDIV.find("[cwui=remindheader]").css({"padding-top":"20px"}); jRemindBodyDIV.find("[cwui=sendreminder]").css({"padding-top":"10px", "padding-left":"10px"}); jDetailDIV.append(jRemindBodyDIV); jRemindBodyDIV.hide(); var emailBodyDIV = doc.createElement("div"); jEmailBodyDIV = $(emailBodyDIV); tHTML = '
Email Event
'; // Custom Code if (gCalendar == 'ohiouniversitylancaster') { tHTML += ''; } else { tHTML += '
Send email from this email address
'; tHTML += '
'; } tHTML += '
To this email address
'; tHTML += '
'; tHTML += '
Subject
'; tHTML += '
'; tHTML += '
Introduction (click here for no introduction)

'; tHTML += '
'; tHTML += ' '; tHTML += ''; jEmailBodyDIV.append(tHTML); var jIntroNote = jEmailBodyDIV.find("[cwui=intronote]"); var jCharLeft = jEmailBodyDIV.find("[cwui=charleft]").css({"font-size":"65%"}); jEmailBodyDIV.find("[cwui=nointro]") .bind("click", function(){jEmailBodyDIV.find("[cwui=intronote]").val("").trigger("keyup")}) .css({"font-size":"65%"}) .hover(function(){ jEmailBodyDIV.find("[cwui=nointro]").css({"text-decoration":"underline", cursor:"pointer"}) }, function(){ jEmailBodyDIV.find("[cwui=nointro]").css({"text-decoration":"none", cursor:"default"}) } ); jEmailBodyDIV.find("[cwui=emailbtnback]").bind("click", function(){jDetailBodyDIV.show();jEmailBodyDIV.hide();jMsgDiv.hide();}).css({"margin-top":"10px"}); jEmailBodyDIV.find("[cwui=sendemail]").bind("click", sendEmail).css({"margin-top":"10px"}); jEmailBodyDIV.find("[cwui=emailto]").bind("keydown", function(){jMsgDiv.hide('slow')}); jEmailBodyDIV.find("[cwui=emailfrom]").bind("keydown", function(){jMsgDiv.hide('slow')}); jIntroNote.bind("keydown", function(){jMsgDiv.hide('slow')}); jIntroNote.bind("keyup", function(){ var len = jIntroNote.val().length; if(len > introNoteMaxLength){ jIntroNote.val(jIntroNote.val().substr(0,introNoteMaxLength)); return false; } jCharLeft.text("Max " + introNoteMaxLength + " characters, " +(introNoteMaxLength - len) + " remaining"); return true; }); jEmailBodyDIV.find("[cwui=subject]").bind("keydown", function(){jMsgDiv.hide('slow')}); // Email for styles jEmailBodyDIV.find("[cwui=emailfrom]").css({"width":"90%", "margin-top":"10px", "margin-left":"10px"}); jEmailBodyDIV.find("[cwui=emailto]").css({width:"90%", "margin-top":"10px", "margin-left":"10px"}); jEmailBodyDIV.find("[cwui=subject]").css({width:"90%", "margin-top":"10px", "margin-left":"10px"}); jIntroNote.css({width:"90%", "margin-top":"10px", "margin-left":"10px"}); jEmailBodyDIV.find("[cwui=emailheader]").css({"padding-top":"20px"}); jEmailBodyDIV.find("[cwui=sendfromemail]").css({"padding-top":"10px", "padding-left":"10px"}); jEmailBodyDIV.find("[cwui=sendtoemail]").css({"padding-top":"10px", "padding-left":"10px"}); jEmailBodyDIV.find("[cwui=emailsubject]").css({"padding-top":"10px", "padding-left":"10px"}); jEmailBodyDIV.find("[cwui=emailmsg]").css({"padding-top":"10px", "padding-left":"10px"}); jDetailDIV.append(jEmailBodyDIV); jEmailBodyDIV.hide(); // Put id into jDetailDIV so we can set z-index in header.inc.php jDetailDIV.attr("id", "cw_srch_detail_dialog"); return detailDIV; } function popupPrintWindow(e){ if ('0' == 1) { // For url option to use windows for popups detailwindowHandle.print(); return false; } else { var id = $(e.target).closest("[cwui='detaildiv']").find("[cwfield='event_id']").text(); var features = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=450,height=450'; var windowHandle = window.open("", "cwprint", features); var jBody = $(windowHandle.document.body); jBody.html($(e.target).closest("[cwui='detaildiv']").html()); var styles = that.widgetStyles; //jBody.css({"background-color":styles.event_bg_color, color:styles.event_text_color, "font-family":styles.event_font, "font-size":styles.event_size + "pt", 'text-align' : 'left'}); jBody.css({"background-color":"#FFFFFF", color:"#000000", "font-family":styles.event_font, "font-size":styles.event_size + "pt", 'text-align' : 'left'}); var title = jBody.find("[cwfield='title']").html(); //here we set the title and the hiding of the close window button for printing $(windowHandle.document).find('head').html(""+title+"