2011-05-29 02:46:38 -04:00
( function ( ) {
var MailCatcher ;
var _ _bind = function ( fn , me ) { return function ( ) { return fn . apply ( me , arguments ) ; } ; } ;
MailCatcher = ( function ( ) {
function MailCatcher ( ) {
2011-05-31 12:40:13 -04:00
$ ( '#messages tr' ) . live ( 'click' , _ _bind ( function ( e ) {
2011-07-07 03:57:28 -04:00
e . preventDefault ( ) ;
2011-05-29 02:46:38 -04:00
return this . loadMessage ( $ ( e . currentTarget ) . attr ( 'data-message-id' ) ) ;
} , this ) ) ;
2011-07-07 03:57:28 -04:00
$ ( '#message .views .format.tab a' ) . live ( 'click' , _ _bind ( function ( e ) {
e . preventDefault ( ) ;
return this . loadMessageBody ( this . selectedMessage ( ) , $ ( $ ( e . currentTarget ) . parent ( 'li' ) ) . data ( 'message-format' ) ) ;
2011-05-29 02:46:38 -04:00
} , this ) ) ;
2011-07-07 04:08:32 -04:00
$ ( '#message .views .analysis.tab a' ) . live ( 'click' , _ _bind ( function ( e ) {
e . preventDefault ( ) ;
return this . loadMessageAnalysis ( this . selectedMessage ( ) ) ;
} , this ) ) ;
2011-07-06 23:39:05 -04:00
$ ( '#resizer' ) . live ( {
mousedown : function ( e ) {
var events ;
e . preventDefault ( ) ;
return $ ( window ) . bind ( events = {
mouseup : function ( e ) {
e . preventDefault ( ) ;
return $ ( window ) . unbind ( events ) ;
} ,
mousemove : function ( e ) {
e . preventDefault ( ) ;
return $ ( '#messages' ) . css ( {
height : e . clientY - $ ( '#messages' ) . offset ( ) . top
} ) ;
}
} ) ;
}
} ) ;
2011-05-31 13:15:05 -04:00
$ ( 'nav.app .clear a' ) . live ( 'click' , _ _bind ( function ( e ) {
if ( confirm ( "You will lose all your received messages.\n\nAre you sure you want to clear all messages?" ) ) {
return $ . ajax ( {
url : '/messages' ,
type : 'DELETE' ,
success : function ( ) {
$ ( '#messages tbody, #message .metadata dd' ) . empty ( ) ;
$ ( '#message .metadata .attachments' ) . hide ( ) ;
return $ ( '#message iframe' ) . attr ( 'src' , 'about:blank' ) ;
} ,
error : function ( ) {
return alert ( 'Error while quitting.' ) ;
}
} ) ;
}
} , this ) ) ;
2011-05-31 12:49:36 -04:00
$ ( 'nav.app .quit a' ) . live ( 'click' , _ _bind ( function ( e ) {
2011-05-31 13:14:56 -04:00
if ( confirm ( "You will lose all your received messages.\n\nAre you sure you want to quit?" ) ) {
return $ . ajax ( {
type : 'DELETE' ,
success : function ( ) {
return location . replace ( $ ( 'body > header h1 a' ) . attr ( 'href' ) ) ;
} ,
error : function ( ) {
return alert ( 'Error while quitting.' ) ;
}
} ) ;
2011-05-31 12:49:36 -04:00
}
} , this ) ) ;
2011-05-29 02:46:38 -04:00
this . refresh ( ) ;
this . subscribe ( ) ;
2011-05-27 09:46:12 -04:00
}
2011-05-29 03:42:07 -04:00
MailCatcher . prototype . parseDateRegexp = /^(\d{4})[-\/\\](\d{2})[-\/\\](\d{2})(?:\s+|T)(\d{2})[:-](\d{2})[:-](\d{2})(?:([ +-]\d{2}:\d{2}|\s*\S+|Z?))?$/ ;
MailCatcher . prototype . parseDate = function ( date ) {
var match ;
if ( match = this . parseDateRegexp . exec ( date ) ) {
2011-07-07 01:40:22 -04:00
return new Date ( match [ 1 ] , match [ 2 ] - 1 , match [ 3 ] , match [ 4 ] , match [ 5 ] , match [ 6 ] , 0 ) ;
2011-05-29 03:42:07 -04:00
}
} ;
MailCatcher . prototype . formatDate = function ( date ) {
if ( typeof date === "string" ) {
date && ( date = this . parseDate ( date ) ) ;
}
return date && ( date = date . toString ( "dddd, d MMM yyyy h:mm:ss tt" ) ) ;
} ;
2011-05-29 02:46:38 -04:00
MailCatcher . prototype . haveMessage = function ( message ) {
if ( message . id != null ) {
message = message . id ;
}
2011-05-31 12:40:13 -04:00
return $ ( "#messages tbody tr[data-message-id=\"" + message + "\"]" ) . length > 0 ;
2011-05-29 02:46:38 -04:00
} ;
2011-07-07 03:57:28 -04:00
MailCatcher . prototype . selectedMessage = function ( ) {
return $ ( '#messages tr.selected' ) . data ( 'message-id' ) ;
} ;
2011-05-29 02:46:38 -04:00
MailCatcher . prototype . addMessage = function ( message ) {
2011-06-25 23:34:25 -04:00
return $ ( '#messages tbody' ) . append ( $ ( '<tr />' ) . attr ( 'data-message-id' , message . id . toString ( ) ) . append ( $ ( '<td/>' ) . text ( message . sender || "No sender" ) . toggleClass ( "blank" , ! message . sender ) ) . append ( $ ( '<td/>' ) . text ( ( message . recipients || [ ] ) . join ( ', ' ) || "No receipients" ) . toggleClass ( "blank" , ! message . recipients . length ) ) . append ( $ ( '<td/>' ) . text ( message . subject || "No subject" ) . toggleClass ( "blank" , ! message . subject ) ) . append ( $ ( '<td/>' ) . text ( this . formatDate ( message . created _at ) ) ) ) ;
2011-05-29 02:46:38 -04:00
} ;
MailCatcher . prototype . loadMessage = function ( id ) {
if ( ( id != null ? id . id : void 0 ) != null ) {
id = id . id ;
}
2011-05-31 12:40:13 -04:00
id || ( id = $ ( '#messages tr.selected' ) . attr ( 'data-message-id' ) ) ;
2011-05-29 02:46:38 -04:00
if ( id != null ) {
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-05-29 02:46:38 -04:00
return $ . getJSON ( '/messages/' + id + '.json' , _ _bind ( function ( message ) {
2011-07-08 02:47:41 -04:00
var $ul ;
2011-05-31 12:40:13 -04:00
$ ( '#message .metadata dd.created_at' ) . text ( this . 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 ( function ( i , el ) {
2011-05-29 02:46:38 -04:00
var $el , format ;
$el = $ ( el ) ;
2010-10-27 15:12:26 -04:00
format = $el . attr ( 'data-message-format' ) ;
2011-05-29 02:46:38 -04:00
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
return $el . show ( ) ;
} else {
return $el . hide ( ) ;
}
} ) ;
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-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 , function ( i , attachment ) {
2011-07-08 02:47:41 -04:00
return $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 ( ) ;
2010-10-27 15:12:26 -04:00
} else {
2011-05-29 02:46:38 -04:00
$ ( '#message .metadata .attachments' ) . hide ( ) ;
2010-10-27 15:12:26 -04:00
}
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 ) {
return this . loadMessageAnalysis ( ) ;
} else {
return this . loadMessageBody ( ) ;
}
2011-05-29 02:46:38 -04:00
} , this ) ) ;
}
} ;
MailCatcher . prototype . loadMessageBody = function ( id , format ) {
2011-07-07 03:57:28 -04:00
id || ( id = this . selectedMessage ( ) ) ;
2011-05-31 12:40:13 -04:00
format || ( format = $ ( '#message .views .tab.format.selected' ) . attr ( 'data-message-format' ) ) ;
2011-05-29 02:46:38 -04:00
format || ( format = 'html' ) ;
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-05-29 02:46:38 -04:00
if ( id != null ) {
return $ ( '#message iframe' ) . attr ( "src" , "/messages/" + id + "." + format ) ;
}
} ;
2011-07-07 04:08:32 -04:00
MailCatcher . prototype . loadMessageAnalysis = function ( id ) {
2011-10-07 12:25:04 -04:00
var $form , $iframe ;
2011-07-07 04:08:32 -04:00
id || ( id = this . selectedMessage ( ) ) ;
$ ( "#message .views .analysis.tab:not(.selected)" ) . addClass ( 'selected' ) ;
$ ( "#message .views :not(.analysis).tab.selected" ) . removeClass ( 'selected' ) ;
if ( id != null ) {
2011-10-07 12:25:04 -04:00
$iframe = $ ( '#message iframe' ) . contents ( ) . children ( ) . html ( "<html>\n<head>\n<title>Analysis</title>\n" + ( $ ( 'link[rel="stylesheet"]' ) [ 0 ] . outerHTML ) + "\n</head>\n<body class=\"iframe\">\n<h1>Analyse your email with Fractal</h1>\n<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>\n<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>\n<p>(This output is still just raw XML. Someone keen to transform this into something prettier would be greatly appreciated!)</p>\n<form>\n<input type=\"submit\" value=\"Analyse\" /><span class=\"loading\" style=\"color: #999; display: none\">Analysing…</span>\n</form>\n</body>\n</html>" ) ;
return $form = $iframe . find ( 'form' ) . submit ( function ( e ) {
e . preventDefault ( ) ;
$ ( this ) . find ( 'input[type="submit"]' ) . attr ( 'disabled' , 'disabled' ) . end ( ) . find ( '.loading' ) . show ( ) ;
return $ . ajax ( {
url : "/messages/" + id + "/analysis.xml" ,
dataType : "text" ,
success : function ( data ) {
$form . replaceWith ( '<h2>Results</h2><pre id="result"></pre>' ) ;
return $iframe . find ( "#result" ) . text ( data ) ;
}
2011-07-07 04:08:32 -04:00
} ) ;
} ) ;
}
} ;
2011-05-29 02:46:38 -04:00
MailCatcher . prototype . refresh = function ( ) {
return $ . getJSON ( '/messages' , _ _bind ( function ( messages ) {
return $ . each ( messages , _ _bind ( function ( i , message ) {
if ( ! this . haveMessage ( message ) ) {
return this . addMessage ( message ) ;
}
} , this ) ) ;
} , this ) ) ;
} ;
MailCatcher . prototype . subscribe = function ( ) {
if ( typeof WebSocket !== "undefined" && WebSocket !== null ) {
return this . subscribeWebSocket ( ) ;
} else {
return this . subscribePoll ( ) ;
}
} ;
MailCatcher . prototype . subscribeWebSocket = function ( ) {
var secure ;
secure = window . location . scheme === 'https' ;
this . websocket = new WebSocket ( "" + ( secure ? 'wss' : 'ws' ) + "://" + window . location . host + "/messages" ) ;
return this . websocket . onmessage = _ _bind ( function ( event ) {
return this . addMessage ( $ . parseJSON ( event . data ) ) ;
} , this ) ;
} ;
MailCatcher . prototype . subscribePoll = function ( ) {
if ( this . refreshInterval == null ) {
return this . refreshInterval = setInterval ( ( _ _bind ( function ( ) {
return this . refresh ( ) ;
} , this ) ) , 1000 ) ;
}
} ;
return MailCatcher ;
} ) ( ) ;
$ ( function ( ) {
return window . MailCatcher = new MailCatcher ;
} ) ;
} ) . call ( this ) ;