From: yomguy Date: Fri, 13 Apr 2012 01:29:56 +0000 (+0200) Subject: add js static file X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=569314af14f763c617f429613eb8435140e6cf9a;p=django-jqchat.git add js static file --- diff --git a/jqchat/static/jqchat/jqchat.js b/jqchat/static/jqchat/jqchat.js new file mode 100644 index 0000000..03713b0 --- /dev/null +++ b/jqchat/static/jqchat/jqchat.js @@ -0,0 +1,174 @@ +//Handles the csrf_token for ajax posts, taken from: +// https://docs.djangoproject.com/en/dev/ref/contrib/csrf/ + +$(document).ajaxSend(function(event, xhr, settings) { + function getCookie(name) { + var cookieValue = null; + if (document.cookie && document.cookie != '') { + var cookies = document.cookie.split(';'); + for (var i = 0; i < cookies.length; i++) { + var cookie = jQuery.trim(cookies[i]); + // Does this cookie string begin with the name we want? + if (cookie.substring(0, name.length + 1) == (name + '=')) { + cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); + break; + } + } + } + return cookieValue; + } + function sameOrigin(url) { + // url could be relative or scheme relative or absolute + var host = document.location.host; // host + port + var protocol = document.location.protocol; + var sr_origin = '//' + host; + var origin = protocol + sr_origin; + // Allow absolute or scheme relative URLs to same origin + return (url == origin || url.slice(0, origin.length + 1) == origin + '/') || + (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') || + // or any other URL that isn't scheme relative or absolute i.e relative. + !(/^(\/\/|http:|https:).*/.test(url)); + } + function safeMethod(method) { + return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); + } + + if (!safeMethod(settings.type) && sameOrigin(settings.url)) { + xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); + } +}); + + +// Chat client code. + + +// Keep track of the last message received (to avoid receiving the same message several times). +// This global variable is updated every time a new message is received. +var timestamp = 0; + +// URL to contact to get updates. +var url = null; + +// How often to call updates (in milliseconds) +var CallInterval = 8000; +// ID of the function called at regular intervals. +var IntervalID = 0; + +// A callback function to be called to further process each response. +var prCallback = null; + +function callServer(){ + // At each call to the server we pass data. + $.get(url, // the url to call. + {time: timestamp}, // the data to send in the GET request. + function(payload) { // callback function to be called after the GET is completed. + processResponse(payload); + }, + 'json'); + }; + +function processResponse(payload) { + // if no new messages, return. + if(payload.status == 0) return; + // Get the timestamp, store it in global variable to be passed to the server on next call. + timestamp = payload.time; + for(message in payload.messages) { + $("#chatwindow").append(payload.messages[message].text); + } + // Scroll down if messages fill up the div. + var objDiv = document.getElementById("chatwindow"); + objDiv.scrollTop = objDiv.scrollHeight; + + // Handle custom data (data other than messages). + // This is only called if a callback function has been specified. + if(prCallback != null) prCallback(payload); +} + +function InitChatWindow(ChatMessagesUrl, ProcessResponseCallback){ +/** The args to provide are: + - the URL to call for AJAX calls. + - A callback function that handles any data in the JSON payload other than the basic messages. + For example, it is used in the example below to handle changes to the room's description. */ + + $("#loading").remove(); // Remove the dummy 'loading' message. + + // Push the calling args into global variables so that they can be accessed from any function. + url = ChatMessagesUrl; + prCallback = ProcessResponseCallback; + + // Read new messages from the server every X milliseconds. + IntervalID = setInterval(callServer, CallInterval); + + // The above will trigger the first call only after X milliseconds; so we + // manually trigger an immediate call. + callServer(); + + // Process messages input by the user & send them to the server. + $("form#chatform").submit(function(){ + // If user clicks to send a message on a empty message box, then don't do anything. + if($("#msg").val() == "") return false; + + // We don't want to post a call at the same time as the regular message update call, + // so cancel that first. + clearInterval(IntervalID); + + $.post(url, + { + time: timestamp, + action: "postmsg", + message: $("#msg").val() + }, + function(payload) { + $("#msg").val(""); // clean out contents of input field. + // Calls to the server always return the latest messages, so display them. + processResponse(payload); + }, + 'json' + ); + + // Start calling the server again at regular intervals. + IntervalID = setInterval(callServer, CallInterval); + + return false; + }); + + +} // End InitChatWindow + +/** This code below is an example of how to extend the chat system. + * It's used in the second example chat window and allows us to manage a user-updatable + * description field. + * */ + +// Callback function, processes extra data sent in server responses. +function HandleRoomDescription(payload) { + $("#chatroom_description").text(payload.description); +} + +function InitChatDescription(){ + + $("form#chatroom_description_form").submit(function(){ + // If user clicks to send a message on a empty message box, then don't do anything. + if($("#id_description").val() == "") return false; + // We don't want to post a call at the same time as the regular message update call, + // so cancel that first. + clearInterval(IntervalID); + $.post(url, + { + time: timestamp, + action: "change_description", + description: $("#id_description").val() + }, + function(payload) { + $("#id_description").val(""); // clean out contents of input field. + // Calls to the server always return the latest messages, so display them. + processResponse(payload); + }, + 'json' + ); + // Start calling the server again at regular intervals. + IntervalID = setInterval(callServer, CallInterval); + return false; + }); + +} \ No newline at end of file