class MailCatcher constructor: -> $('#messages tr').live 'click', (e) => e.preventDefault() @loadMessage $(e.currentTarget).attr 'data-message-id' $('#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) => 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) => 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 formatDate: (date) -> date &&= @parseDate(date) if typeof(date) == "string" 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' 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.
""") # This should be cached if already accessed, so it's actually quite quick $.get "/messages/#{id}.html", (html) -> $iframe .find('input[name="html"]').attr('value', html).end() .find('.loading').hide().end() .find('input[type="submit"]').attr('disabled', null).end() .find('form').submit -> $(this) .find('input[type="submit"]').attr('disabled', 'disabled').end() .find('.loading').text('Analysing...').show() # FIXME: Fractal need to allow GET requests to their JSONP endpoint, then we can use the API: # $.ajax # url: 'http://getfractal.com/api/v1/validate/format/jsonp' # data: # api_key: '59372c4f65426f78282c5c657d' # html: html # dataType: 'jsonp' # success: (json) -> # console.log json # $iframe.children().html json 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