# Add a new jQuery selector expression which does a case-insensitive :contains jQuery.expr[':'].icontains = (a, i, m) -> (a.textContent ? a.innerText ? "").toUpperCase().indexOf(m[3].toUpperCase()) >= 0 class MailCatcher constructor: -> $('#messages tr').live 'click', (e) => e.preventDefault() @loadMessage $(e.currentTarget).attr 'data-message-id' $('input[name=search]').keyup (e) => query = $.trim $(e.currentTarget).val() if query @searchMessages query else @clearSearch() $('#message .views .format.tab a').live 'click', (e) => e.preventDefault() @loadMessageBody @selectedMessage(), $($(e.currentTarget).parent('li')).data 'message-format' $('#message .views .analysis.tab a').live 'click', (e) => e.preventDefault() @loadMessageAnalysis @selectedMessage() $('#resizer').live mousedown: (e) -> e.preventDefault() $(window).bind events = mouseup: (e) -> e.preventDefault() $(window).unbind events mousemove: (e) -> e.preventDefault() $('#messages').css height: e.clientY - $('#messages').offset().top $('nav.app .clear a').live 'click', (e) => e.preventDefault() if confirm "You will lose all your received messages.\n\nAre you sure you want to clear all messages?" $.ajax url: '/messages' type: 'DELETE' success: -> $('#messages tbody, #message .metadata dd').empty() $('#message .metadata .attachments').hide() $('#message iframe').attr 'src', 'about:blank' error: -> alert 'Error while quitting.' $('nav.app .quit a').live 'click', (e) => e.preventDefault() if confirm "You will lose all your received messages.\n\nAre you sure you want to quit?" $.ajax type: 'DELETE' success: -> location.replace $('body > header h1 a').attr('href') error: -> alert 'Error while quitting.' @refresh() @subscribe() # Only here because Safari's Date parsing *sucks* # We throw away the timezone, but you could use it for something... parseDateRegexp: /^(\d{4})[-\/\\](\d{2})[-\/\\](\d{2})(?:\s+|T)(\d{2})[:-](\d{2})[:-](\d{2})(?:([ +-]\d{2}:\d{2}|\s*\S+|Z?))?$/ parseDate: (date) -> if match = @parseDateRegexp.exec(date) new Date match[1], match[2] - 1, match[3], match[4], match[5], match[6], 0 offsetTimeZone: (date) -> offset = Date.now().getTimezoneOffset() * 60000 #convert timezone difference to milliseconds date.setTime(date.getTime() - offset) date formatDate: (date) -> date &&= @parseDate(date) if typeof(date) == "string" date &&= @offsetTimeZone(date) date &&= date.toString("dddd, d MMM yyyy h:mm:ss tt") haveMessage: (message) -> message = message.id if message.id? $("#messages tbody tr[data-message-id=\"#{message}\"]").length > 0 selectedMessage: -> $('#messages tr.selected').data 'message-id' searchMessages: (query) -> selector = (":icontains('#{token}')" for token in query.split /\s+/).join "" $rows = $("#messages tbody tr") $rows.not(selector).hide() $rows.filter(selector).show() clearSearch: -> $('#messages tbody tr').show() addMessage: (message) -> $('#messages tbody').append \ $('
Fractal is a really neat service that applies common email design and development knowledge from Email Standards Project to your HTML email and tells you what you've done wrong or what you should do instead.
Please note that this sends your email to the Fractal service for analysis. Read their terms of service if you're paranoid.
""") $form = $iframe.find('form') .submit (e) -> e.preventDefault() $(this) .find('input[type="submit"]').attr('disabled', 'disabled').end() .find('.loading').show() $('#message iframe').contents().find('body').xslt("/messages/#{id}/analysis.xml", "/stylesheets/analysis.xsl") refresh: -> $.getJSON '/messages', (messages) => $.each messages, (i, message) => unless @haveMessage message @addMessage message subscribe: -> if WebSocket? @subscribeWebSocket() else @subscribePoll() subscribeWebSocket: -> secure = window.location.scheme == 'https' @websocket = new WebSocket("#{if secure then 'wss' else 'ws'}://#{window.location.host}/messages"); @websocket.onmessage = (event) => @addMessage $.parseJSON event.data subscribePoll: -> unless @refreshInterval? @refreshInterval = setInterval (=> @refresh()), 1000 $ -> window.MailCatcher = new MailCatcher