2011-05-29 02:46:38 -04:00
class MailCatcher
constructor: ->
2011-05-31 12:40:13 -04:00
$ ( ' # messages tr ' ) . live ' click ' , (e) =>
2011-07-07 03:57:28 -04:00
e . preventDefault ( )
2011-05-29 02:46:38 -04:00
@ loadMessage $ ( e . currentTarget ) . attr ' data-message-id '
2012-03-12 06:29:42 -04:00
$ ( ' input[name=search] ' ) . live ' keyup ' , (e) =>
e . preventDefault ( )
console . log ( e )
if e . currentTarget . value == " "
@ clearSearch ( )
else
@ searchMessages e . currentTarget . value
2011-07-07 03:57:28 -04:00
$ ( ' # message .views .format.tab a ' ) . live ' click ' , (e) =>
e . preventDefault ( )
@ loadMessageBody @ selectedMessage ( ) , $ ( $ ( e . currentTarget ) . parent ( ' li ' ) ) . data ' message-format '
2011-06-10 08:47:38 -04:00
2011-07-07 04:08:32 -04:00
$ ( ' # message .views .analysis.tab a ' ) . live ' click ' , (e) =>
e . preventDefault ( )
@ loadMessageAnalysis @ selectedMessage ( )
2011-07-06 23:39:05 -04:00
$ ( ' # 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
2011-05-31 13:15:05 -04:00
$ ( ' nav.app .clear a ' ) . live ' click ' , (e) =>
2011-10-07 11:31:02 -04:00
e . preventDefault ( )
2011-05-31 13:15:05 -04:00
if confirm " You will lose all your received messages. \n \n Are you sure you want to clear all messages? "
2011-06-10 08:47:38 -04:00
$ . ajax
2011-05-31 13:15:05 -04:00
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. '
2011-05-29 02:46:38 -04:00
2011-05-31 13:14:56 -04:00
$ ( ' nav.app .quit a ' ) . live ' click ' , (e) =>
2011-10-07 11:31:02 -04:00
e . preventDefault ( )
2011-05-31 13:14:56 -04:00
if confirm " You will lose all your received messages. \n \n Are you sure you want to quit? "
$ . ajax
type: ' DELETE '
success: ->
location . replace $ ( ' body > header h1 a ' ) . attr ( ' href ' )
error: ->
alert ' Error while quitting. '
2011-06-10 08:47:38 -04:00
2011-05-29 02:46:38 -04:00
@ refresh ( )
@ subscribe ( )
2011-06-10 08:47:38 -04:00
2011-05-29 03:42:07 -04:00
# 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 )
2011-07-07 01:40:22 -04:00
new Date match [ 1 ] , match [ 2 ] - 1 , match [ 3 ] , match [ 4 ] , match [ 5 ] , match [ 6 ] , 0
2011-06-10 08:47:38 -04:00
2011-12-30 03:29:52 -05:00
offsetTimeZone: (date) ->
2012-01-01 22:01:26 -05:00
offset = Date . now ( ) . getTimezoneOffset ( ) * 60000 #convert timezone difference to milliseconds
2011-12-30 03:29:52 -05:00
date . setTime ( date . getTime ( ) - offset )
date
2011-05-29 03:42:07 -04:00
formatDate: (date) ->
2012-01-01 22:01:26 -05:00
date && = @ parseDate ( date ) if typeof ( date ) == " string "
date && = @ offsetTimeZone ( date )
2011-05-29 03:42:07 -04:00
date && = date . toString ( " dddd, d MMM yyyy h:mm:ss tt " )
2011-05-29 02:46:38 -04:00
haveMessage: (message) ->
message = message . id if message . id ?
2011-05-31 12:40:13 -04:00
$ ( " # messages tbody tr[data-message-id= \" #{ message } \" ] " ) . length > 0
2011-06-10 08:47:38 -04:00
2011-07-07 03:57:28 -04:00
selectedMessage: ->
$ ( ' # messages tr.selected ' ) . data ' message-id '
2012-03-12 06:29:42 -04:00
searchMessages: (term) ->
$ ( ' # messages tbody tr:not(:contains( " ' + term + ' " )) ' ) . hide ( )
$ ( ' # messages tbody tr(:contains( " ' + term + ' " )) ' ) . show ( )
clearSearch: ->
$ ( ' # messages tbody tr ' ) . show ( )
2011-05-29 02:46:38 -04:00
addMessage: (message) ->
2011-05-31 12:40:13 -04:00
$ ( ' # messages tbody ' ) . append \
2011-05-29 02:46:38 -04:00
$ ( ' <tr /> ' ) . attr ( ' data-message-id ' , message . id . toString ( ) )
2011-06-25 23:34:25 -04:00
. append ( $ ( ' <td/> ' ) . text ( message . sender or " No sender " ) . toggleClass ( " blank " , ! message . sender ) )
. append ( $ ( ' <td/> ' ) . text ( ( message . recipients || [ ] ) . join ( ' , ' ) or " No receipients " ) . toggleClass ( " blank " , ! message . recipients . length ) )
. append ( $ ( ' <td/> ' ) . text ( message . subject or " No subject " ) . toggleClass ( " blank " , ! message . subject ) )
2011-05-29 03:42:07 -04:00
. append ( $ ( ' <td/> ' ) . text @ formatDate message . created_at )
2011-06-10 08:47:38 -04:00
2011-05-29 02:46:38 -04:00
loadMessage: (id) ->
id = id . id if id ? . id ?
2011-05-31 12:40:13 -04:00
id || = $ ( ' # messages tr.selected ' ) . attr ' data-message-id '
2011-06-10 08:47:38 -04:00
2011-05-29 02:46:38 -04:00
if id ?
2011-05-31 12:40:13 -04:00
$ ( ' # messages tbody tr:not([data-message-id= " ' + id + ' " ]) ' ) . removeClass ' selected '
$ ( ' # messages tbody tr[data-message-id= " ' + id + ' " ] ' ) . addClass ' selected '
2011-06-10 08:47:38 -04:00
2011-05-29 02:46:38 -04:00
$ . getJSON ' /messages/ ' + id + ' .json ' , (message) =>
2011-05-31 12:40:13 -04:00
$ ( ' # message .metadata dd.created_at ' ) . text @ formatDate message . created_at
$ ( ' # message .metadata dd.from ' ) . text message . sender
$ ( ' # message .metadata dd.to ' ) . text ( message . recipients || [ ] ) . join ( ' , ' )
$ ( ' # message .metadata dd.subject ' ) . text message . subject
$ ( ' # message .views .tab.format ' ) . each (i, el) ->
2011-05-29 02:46:38 -04:00
$el = $ ( el )
format = $el . attr ' data-message-format '
if $ . inArray ( format , message . formats ) >= 0
2011-07-06 23:40:53 -04:00
$el . find ( ' a ' ) . attr ( ' href ' , ' /messages/ ' + id + ' . ' + format )
2011-05-29 02:46:38 -04:00
$el . show ( )
else
$el . hide ( )
2011-06-10 08:47:38 -04:00
2011-05-31 12:40:13 -04:00
if $ ( " # message .views .tab.selected:not(:visible) " ) . length
$ ( " # message .views .tab.selected " ) . removeClass " selected "
$ ( " # message .views .tab:visible:first " ) . addClass " selected "
2011-06-10 08:47:38 -04:00
2011-05-29 02:46:38 -04:00
if message . attachments . length
2011-07-08 02:47:41 -04:00
$ul = $ ( ' <ul/> ' ) . appendTo ( $ ( ' # message .metadata dd.attachments ' ) . empty ( ) )
2011-05-29 02:46:38 -04:00
$ . each message . attachments , (i, attachment) ->
2011-07-08 02:47:41 -04:00
$ul . append ( $ ( ' <li> ' ) . append ( $ ( ' <a> ' ) . attr ( ' href ' , attachment [ ' href ' ] ) . addClass ( attachment [ ' type ' ] . split ( ' / ' , 1 ) [ 0 ] ) . addClass ( attachment [ ' type ' ] . replace ( ' / ' , ' - ' ) ) . text ( attachment [ ' filename ' ] ) ) ) ;
2011-05-29 02:46:38 -04:00
$ ( ' # message .metadata .attachments ' ) . show ( )
else
$ ( ' # message .metadata .attachments ' ) . hide ( )
2011-06-10 08:47:38 -04:00
$ ( ' # message .views .download a ' ) . attr ' href ' , " /messages/ #{ id } .eml "
2011-07-07 04:08:32 -04:00
if $ ( ' # message .views .tab.analysis.selected ' ) . length
@ loadMessageAnalysis ( )
else
@ loadMessageBody ( )
# XXX: These should probably cache their iframes for the current message now we're using a remote service:
2011-05-29 02:46:38 -04:00
loadMessageBody: (id, format) ->
2011-07-07 03:57:28 -04:00
id || = @ selectedMessage ( )
2011-05-31 12:40:13 -04:00
format || = $ ( ' # message .views .tab.format.selected ' ) . attr ' data-message-format '
2011-05-29 02:46:38 -04:00
format || = ' html '
2011-06-10 08:47:38 -04:00
2011-05-31 12:40:13 -04:00
$ ( " # message .views .tab[data-message-format= \" #{ format } \" ]:not(.selected) " ) . addClass ' selected '
$ ( " # message .views .tab:not([data-message-format= \" #{ format } \" ]).selected " ) . removeClass ' selected '
2011-06-10 08:47:38 -04:00
2011-05-29 02:46:38 -04:00
if id ?
$ ( ' # message iframe ' ) . attr " src " , " /messages/ #{ id } . #{ format } "
2011-06-10 08:47:38 -04:00
2011-07-07 04:08:32 -04:00
loadMessageAnalysis: (id) ->
id || = @ selectedMessage ( )
$ ( " # message .views .analysis.tab:not(.selected) " ) . addClass ' selected '
$ ( " # message .views :not(.analysis).tab.selected " ) . removeClass ' selected '
if id ?
2011-10-07 12:25:04 -04:00
# Makes a new iframe and populate it with a quick intro and a button
$iframe = $ ( ' # message iframe ' ) . contents ( ) . children ( )
. html ( """
2011-07-07 04:08:32 -04:00
< html >
< head >
< title > Analysis < / title >
2011-07-07 04:11:29 -04:00
#{$('link[rel="stylesheet"]')[0].outerHTML}
2011-07-07 04:08:32 -04:00
< / head >
< body class = " iframe " >
< h1 > Analyse your email with Fractal < / h1 >
< p > < a href = " http://getfractal.com/ " target = " _blank " > Fractal < /a> is a really neat service that applies common email design and development knowledge from <a href="http:/ / www . email - standards . org / " target= " _blank " >Email Standards Project</a> to your HTML email and tells you what you ' ve done wrong or what you should do instead.</p>
< p > Please note that this < strong > sends your email to the Fractal service < /strong> for analysis. Read their <a href="http:/ / getfractal . com / terms " target= " _blank " >terms of service</a> if you ' re paranoid.</p>
2011-10-07 12:25:04 -04:00
< form >
< input type = " submit " value = " Analyse " / > < span class = " loading " style = " color: # 999; display: none " > Analysing & hellip ; < / span >
2011-07-07 04:08:32 -04:00
< / form >
< / body >
< / html >
""" )
2011-10-07 12:25:04 -04:00
$form = $iframe . find ( ' form ' )
. submit (e) ->
e . preventDefault ( )
$ ( this )
. find ( ' input[type= " submit " ] ' ) . attr ( ' disabled ' , ' disabled ' ) . end ( )
. find ( ' .loading ' ) . show ( )
2011-12-22 14:34:40 -05:00
$ ( ' # message iframe ' ) . contents ( ) . find ( ' body ' ) . xslt ( " /messages/ #{ id } /analysis.xml " , " /stylesheets/analysis.xsl " )
2011-05-29 02:46:38 -04:00
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
2011-06-10 08:47:38 -04:00
$ -> window . MailCatcher = new MailCatcher