3 function url(endpoint){
4 return (app.settings.opts.secure?"https://":"http://") + app.settings.opts.user + ":" + app.settings.opts.pass + "@" + app.settings.opts.host + "/api/" + endpoint + "?callback=?";
10 function MessageList(sel_elm){
11 this.elm = $(sel_elm);
15 MessageList.prototype.update = function(clb){
16 $.getJSON(url("direct_messages"), {getText:"plain"}, function(data, status){
17 //console.log(status);
22 if (senders.indexOf(msg.sender_screen_name)<0){
23 senders.push(msg.sender_screen_name);
25 out += "<aside class='pack'><img src='"+ msg.sender.profile_image_url + "'></aside>";
26 out += "<a href='#message/"+msg.sender_screen_name+"'>";
27 out += "<p>" + msg.text + "</p>";
28 out += "<p>" + msg.sender_screen_name + " - " + msg.created_at + "</p>";
41 * Conversation with a user
43 function Messages(sel_elm){
44 this.elm = $(sel_elm);
49 Messages.prototype.update = function(username, clb) {
51 this.username = username;
53 username = this.username;
56 if (!username) return;
58 $("#contact_screen_name").html(username);
60 $.getJSON(url("direct_messages/all"), {getText:"html", screen_name: username}, function(data, status){
61 //console.log(data, status);
65 var reply_id; // id of the message to reply to. should be the last.
69 pack = (msg.sender_screen_name==username ? "pack": "pack-end");
70 out += "<aside class='"+pack+"'><img src='"+ msg.sender.profile_image_url + "'></aside>";
71 //out += "<a href='#message/"+msg.sender_screen_name+"'>";
72 out += "<p>" + msg.text + "</p>";
73 out += "<p>" + msg.sender_screen_name + " - " + msg.created_at + "</p>";
80 $(".message_text").val("");
81 this.reply_id = reply_id;
89 Messages.prototype.reply = function(clb){
90 app.compose.send(clb, this.username, this.reply_id);
96 function Compose(sel_elm){
97 this.elm = $(sel_elm);
98 this.dialog = this.elm.find("#select_contact");
100 this.contact_photo = this.elm.find(".contact_photo");
101 this.contact_photo_empty = this.contact_photo.attr("src");
105 this.last_update = 0;
108 /* contact list dialog */
111 this.contact_photo.on("click",function(e){
113 for (k in this.friends) {
114 var f = this.friends[k];
115 out += "<button type='button' value='"+k+"' class='contact_item'><img src='"+f.profile_image_url+"'>"+f.name+" ("+f.screen_name+")</button>";
117 out += '<button type="button" class="cancel">Cancel</button>';
119 this.dialog.find("menu").html(out);
122 this.dialog.find(".contact_item").on("click", function(e){
123 $(".message_to").val( $(e.target).val() );
124 $(".message_to").trigger("input");
128 this.dialog.find(".cancel").on("click", function(){
133 /* /contact list dialog */
135 this.elm.find(".message_to").on('input', function(e){
136 var f=$(e.target).val().trim();
137 if (this.friends[f] !== undefined) {
138 this.contact_photo.attr("src",this.friends[f].profile_image_url);
140 this.contact_photo.attr("src", this.contact_photo_empty);
149 Compose.prototype.update = function(clb){
150 if (this.last_update > (new Date())-60000) {
151 if (clb) clb(this.friends);
154 var dl = this.elm.find("#contacts");
156 $.getJSON(url("statuses/friends"), {}, function(data, status) {
160 var friend = data[k];
161 if (friend.network == "dfrn") {
162 this.friends[friend.screen_name] = friend;
163 out += "<option value='"+friend.screen_name+"'>"+friend.name+" ("+friend.screen_name+")</option>";
166 this.last_update = (new Date()) - 0;
173 Compose.prototype.send = function(clb, send_to, reply_id){
176 var replyto = (reply_id?reply_id:$(".message_reply").val());
177 var text = $(".message_body").val();
179 text = $(".message_text").val();
182 alert("Please enter the message body");
186 if (send_to!==undefined) {
187 screen_name = send_to;
189 screen_name = $(".message_to").val().trim();
190 if (screen_name=="" || this.friends[screen_name]==undefined){
191 alert("Please enter a valid recipient");
199 Friendica doesn't set CORS headers (it should.. open a feature request!)
200 We can't send post requests via ajax on different domains without it
201 (we can get with jsonp, wich is another hack, but standard...)
202 We create an iframe, append it to body and create a form wich post data to
204 We listen for 'load' event to know when the request returned data, so we
205 can update the message list.
206 We sould remove it when finished.
207 We could read the content of the iframe before removeit as it would be json
212 var f = $("<iframe>").appendTo($("body")).hide();
214 f.on('load', function() {
217 screen_name:screen_name,
223 // we need a small timeout before we can write to iframe content
224 setTimeout( function() {
225 var doc = f[0].contentWindow.document;
227 var form = $("<form>").attr('action', url("direct_messages/new")).attr('method','POST').append(
228 $("<input>").attr('name','screen_name').val(screen_name)
230 $("<input>").attr('name','text').val(text)
232 if (replyto!=="") form.append(
233 $("<input>").attr('name','replyto').val(replyto)
235 $('body',doc).append(form);
244 function Settings(sel_elm) {
245 this.elm = $(sel_elm);
249 this.elm.find(".autoupdate").on("blur", function(e,b){
250 var val = $(e.target).val();
251 if (e.target.type=="checkbox") val = $(e.target).prop('checked');
252 this.set(e.target.id, val);
256 Settings.prototype.update = function(clb) {
257 this.opts = JSON.parse( window.localStorage.getItem("opts") );
258 if (this.opts === null) this.opts={};
261 for (k in this.opts) {
262 input_elm= this.elm.find("#"+k);
263 if (input_elm.prop("type")=="checkbox") {
264 input_elm.prop("checked", this.opts[k])
266 input_elm.val(this.opts[k]);
272 Settings.prototype.is_valid = function() {
273 return this.opts !== null &&
274 this.opts.host !== undefined && this.opts.host !== "" &&
275 this.opts.user !== undefined && this.opts.user !== "" &&
276 this.opts.pass !== undefined && this.opts.pass !=="";
279 Settings.prototype.set = function(name, value) {
280 this.opts[name] = value;
281 window.localStorage.setItem("opts", JSON.stringify(this.opts));
290 // Application Constructor
291 initialize: function() {
292 app.settings = new Settings("#settingsPage");
293 app.messagelist = new MessageList("#messageList");
294 app.messages = new Messages("#messages");
295 app.compose = new Compose("#newMessagePage");
298 '': app.page_messageList,
299 'settings' : app.page_settings,
300 'compose' : app.page_compose,
301 'message/:user': app.page_messageUser
308 page_messageList : function(){
309 if (!app.settings.is_valid()) {
310 /* alert("Please fill required settings"); */
314 app.messagelist.update(function(){
315 if ($("body > .current").length>0) {
316 $("body > .current").removeClass("current").addClass("right");
317 $("#inboxPage").addClass("current");
322 page_messageUser : function(user) {
324 app.messages.update(user, function(){
326 var ofs = $("#messages li:last-of-type").offset();
328 $("#messagePage .scrollable").scrollTop(ofs.top);
330 $("#inboxPage").removeClass("current").addClass("left");
331 $("#messagePage").removeClass("right").addClass("current");
335 page_settings : function() {
336 app.settings.update(function(){
337 $("#inboxPage").removeClass("current").addClass("left");
338 $("#settingsPage").removeClass("right").addClass("current");
342 page_compose : function() {
343 $(".message_body").val("");
344 $(".message_to").val("");
345 $(".message_reply").val("");
346 app.compose.contact_photo.attr("src", app.compose.contact_photo_empty);
348 app.compose.update(function(){
349 $("#inboxPage").removeClass("current").addClass("left");
350 $("#newMessagePage").removeClass("right").addClass("current");
354 bindEvents: function() {
358 $("#reply_send").on("click", function(e){
360 app.messages.reply(function(){
361 app.messages.update();
365 /* send new message */
366 $("#message_send").on("click", function(e){
368 app.compose.send(function(data){
369 // dovrebbe andare a message/data.screen_name
370 // ma per come รจ fatto al momento non funziona...
371 // torniamo alla lista messaggi
380 $("progress").hide();
381 $.ajaxSettings.beforeSend = function() { $("progress").show(); }
382 $.ajaxSettings.complete = function() { $("progress").hide(); }