Ajax Talk - Asynchronous javascript and xml discussion board
 FAQ   Search    Usergroups      Register   Profile   Check your messages   Log in 
Signup now to enjoy a range of free membership advantages !!
Ajax Talk - Moderators Wanted
Looking for help customizing AJAX shoutbox for Joomla CMS.

 
Post new topic   Reply to topic    Ajaxtalk.com Forum Index -> AJAX Help
View previous topic :: View next topic  
Author Message
veryjerry
New one
New one


Joined: 21 Jul 2007
Posts: 1

PostPosted: Sun Jul 22, 2007 8:05 pm    Post subject: Looking for help customizing AJAX shoutbox for Joomla CMS. Reply with quote

GOAL
We've made modifications to Ajax shoutbox on Joomla. What we've done is tweak mod_shoutbox.php and created some new MySQL tables so there exists 3 groups, each with their own 'coach'. Only one user of a particular group is allowed on the chat at a time, and users and coaches are unable to see the conversations of the other 2 groups. When a new user tries to enter the chat and there is already someone of the same group active then the new user gets a “chat full” message.

If the old user has been idle for longer than 15 minutes that user's info is deleted from the MySQL tables and the new user is allowed in the chat.

PROBLEM:
Our problem is, when the new user begins to chat with their coach the old user can see that conversation even after the idle time expiry. We can't have that (we need privacy). This problem is corrected if the old user refreshed the page, for the script does it's thing and gives the old user a “you've been idle for too long” message. Unfortunately, refreshing the page with metatags or other methods is not an option because if a user is in the middle of typing they lose their message. I suspect the only elegant solution would be to tweak the ajax file, fatAjax.php (posted below). What we think would work is to have a looping function which makes queries to the database and checks to make sure there is not 2 users of the same group on the chat. If so, fatAjax.php would substitute any active chatting with a message notifying the old user that they've been idle for too long.

SOLUTION:
Is this possible? We are looking for someone that has the necessary knowledge to make this happen for us. Since the AJAX runs in the cache we have not been able to force an idle user out of the session, and need to get this handled in the AJAX itself. We would like to get help with this, and although our budget is small we would like to compensate some one for a fix that resolves this issue. We would like to work with some one who can take this on and resolve it fast.

PHP
We are fairly confident in our PHP file and can provide a sample of the guts of this for someones perusal in getting this AJAX to call on the appropriate functions.

here is the Fatajax:

AJAX
/********** Begin fatAjax.php document which needs adjustment *************/

BEGIN fatAjax.php
Code:

<?php
// The headers below cache the file and make it javascript

   header("Cache-Control: must-revalidate");
   $offset = 60*60*24*60;
   $ExpStr = "Expires: ".gmdate("D, d M Y H:i:s",time() + $offset)." GMT";
   header($ExpStr);
   header('Content-Type: application/x-javascript');
   require_once( "../administrator/components/com_shoutbox/shoutbox.cfg.php");
   require_once( "../configuration.php");
?>

var Fat = {
   make_hex : function (r,g,b)
   {
      r = r.toString(16); if (r.length == 1) r = '0' + r;
      g = g.toString(16); if (g.length == 1) g = '0' + g;
      b = b.toString(16); if (b.length == 1) b = '0' + b;
      return "#" + r + g + b;
   },
   fade_all : function ()
   {
      var a = document.getElementsByTagName("*");
      for (var i = 0; i < a.length; i++)
      {
         var o = a[i];
         var r = /fade-?(\w{3,6})?/.exec(o.className);
         if (r)
         {
            if (!r[1]) r[1] = "";
            if (o.id) Fat.fade_element(o.id,null,null,"#"+r[1]);
         }
      }
   },
   fade_element : function (id, fps, duration, from, to)
   {
      if (!fps) fps = 30;
      if (!duration) duration = 3000;
      if (!from || from=="#") from = "#FFFF33";
      if (!to) to = this.get_bgcolor(id);

      var frames = Math.round(fps * (duration / 1000));
      var interval = duration / frames;
      var delay = interval;
      var frame = 0;

      if (from.length < 7) from += from.substr(1,3);
      if (to.length < 7) to += to.substr(1,3);

      var rf = parseInt(from.substr(1,2),16);
      var gf = parseInt(from.substr(3,2),16);
      var bf = parseInt(from.substr(5,2),16);
      var rt = parseInt(to.substr(1,2),16);
      var gt = parseInt(to.substr(3,2),16);
      var bt = parseInt(to.substr(5,2),16);

      var r,g,b,h;
      while (frame < frames)
      {
         r = Math.floor(rf * ((frames-frame)/frames) + rt * (frame/frames));
         g = Math.floor(gf * ((frames-frame)/frames) + gt * (frame/frames));
         b = Math.floor(bf * ((frames-frame)/frames) + bt * (frame/frames));
         h = this.make_hex(r,g,b);

         setTimeout("Fat.set_bgcolor('"+id+"','"+h+"')", delay);

         frame++;
         delay = interval * frame;
      }
      setTimeout("Fat.set_bgcolor('"+id+"','"+to+"')", delay);
   },
   set_bgcolor : function (id, c)
   {
      var o = document.getElementById(id);
      o.style.backgroundColor = c;
   },
   get_bgcolor : function (id)
   {
      var o = document.getElementById(id);
      while(o)
      {
         var c;
         if (window.getComputedStyle) c =
window.getComputedStyle(o,null).getPropertyValue("background-color");
         if (o.currentStyle) c = o.currentStyle.backgroundColor;
         if ((c != "" && c != "transparent") || o.tagName == "BODY") { break; }
         o = o.parentNode;
      }
      if (c == undefined || c == "" || c == "transparent") c = "#FFFFFF";
      var rgb =
c.match(/rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)/);
      if (rgb) c =
this.make_hex(parseInt(rgb[1]),parseInt(rgb[2]),parseInt(rgb[3]));
      return c;
   }
}


function jal_apply_filters(s) {
   return filter_smilies(make_links((s)));
}

var smilies =  [[':\\)',   'icon_smile.gif'],
      [':\\-\\)',   'icon_smile.gif'],
      [':D',      'icon_biggrin.gif'],
      [':\\-D',   'icon_biggrin.gif'],
      [':grin:',  'icon_biggrin.gif'],
      [':smile:',  'icon_smile.gif'],
      [':\\(',   'icon_sad.gif'],
      [':\\-\\(',   'icon_sad.gif'],
      [':sad:',  'icon_sad.gif'],
      [':o',      'icon_surprised.gif'],
      [':\\-o',   'icon_surprised.gif'],
      ['8o',      'icon_eek.gif'],
      ['8\\-O',   'icon_eek.gif'],
      ['8\\-0',   'icon_eek.gif'],
      [':eek:',   'icon_eek.gif'],
      [':s',      'icon_confused.gif'],
      [':\\-s',   'icon_confused.gif'],
      [':lol:',   'icon_lol.gif'],
      [':cool:',   'icon_cool.gif'],
      ['8\\)',   'icon_cool.gif'],
      ['8\\-\\)',   'icon_cool.gif'],
      [':x',      'icon_mad.gif'],
      [':-x',      'icon_mad.gif'],
      [':mad:',   'icon_mad.gif'],
      [':p',      'icon_razz.gif'],
      [':\\-p',   'icon_razz.gif'],
      [':razz:',   'icon_razz.gif'],
      [':\\$',   'icon_redface.gif'],
      [':\\-\\$',   'icon_redface.gif'],
      [':\'\\(',   'icon_cry.gif'],
      [':evil:',   'icon_evil.gif'],
      [':twisted:','icon_twisted.gif'],
      [':cry:',   'icon_cry.gif'],
      [':roll:',   'icon_rolleyes.gif'],
      [':wink:',   'icon_wink.gif'],
      [';\\)',   'icon_wink.gif'],
      [';\\-\\)',   'icon_wink.gif'],
      [':!:',      'icon_exclaim.gif'],
      [':\\?:',   'icon_question.gif'],
      [':\\-\\?:',   'icon_question.gif'],
      [':idea:',   'icon_idea.gif'],
      [':arrow:',   'icon_arrow.gif'],
      [':\\|',   'icon_neutral.gif'],
      [':neutral:',   'icon_neutral.gif'],
      [':\\-\\|',   'icon_neutral.gif'],
      [':mrgreen:',   'icon_mrgreen.gif']];

function make_links (s) {

   var re = /((http|https|ftp):\/\/[^ ]*)/gi;
   text = s.replace(re,"<a href=\"$1\">&laquo;link&raquo;</a>");
   return text;
}

function filter_smilies(s) {
   for (var i = 0; i < smilies.length; i++) {
      var search = smilies[i][0];
      var replace = '<img src="components/com_shoutbox/smilies/' +
smilies[i][1] + '" class="wp-smiley" alt="' +
smilies[i][0].replace(/\\/g, '') + '" />';
      re = new RegExp(search, 'gi');
      s = s.replace(re, replace);
   }

   return s;
};

// XHTML live Chat
// author: alexander kohlhofer
// version: 1.0
// http://www.plasticshore.com
// http://www.plasticshore.com/projects/chat/
// please let the author know if you put any of this to use
// XHTML live Chat (including this script) is published under a creative
commons license
// license: http://creativecommons.org/licenses/by-nc-sa/2.0/


var jal_loadtimes;
var jal_org_timeout = <?php echo stripslashes(shoutbox_update_seconds); ?>;
var jal_timeout = jal_org_timeout;
var GetChaturl = "<?php echo $mosConfig_live_site;
?>/modules/mod_shoutbox.php?jalGetChat=yes";
var SendChaturl = "<?php echo $mosConfig_live_site;
?>/modules/mod_shoutbox.php?jalSendChat=yes";
var httpReceiveChat;
var httpSendChat;

///////////////////////////////////////
//
//  Generic onload by Brothercake
//  http://www.brothercake.com/
//
///////////////////////////////////////

//onload function

//setup onload function
if(typeof window.addEventListener != 'undefined')
{
   //.. gecko, safari, konqueror and standard
   window.addEventListener('load', initJavaScript, false);
}
else if(typeof document.addEventListener != 'undefined')
{
   //.. opera 7
   document.addEventListener('load', initJavaScript, false);
}
else if(typeof window.attachEvent != 'undefined')
{
   //.. win/ie

   window.attachEvent('onload', initJavaScript);
}



function initJavaScript() {
   if (!document.getElementById('chatbarText')) { return; }
   document.forms['chatForm'].elements['chatbarText'].setAttribute('autocomplete','off');
//this non standard attribute prevents firefox' autofill function to
clash with this script
   // initiates the two objects for sending and receiving data
   checkStatus(''); //sets the initial value and state of the input comment
   checkName(); //checks the initial value of the input name
   checkUrl();

   jal_loadtimes = 1;

   httpReceiveChat = getHTTPObject();
   httpSendChat = getHTTPObject();

   setTimeout('receiveChatText()', jal_timeout); //initiates the first data
query

   document.getElementById('shoutboxname').onblur = checkName;
   document.getElementById('shoutboxurl').onblur = checkUrl;
   document.getElementById('chatbarText').onfocus = function () {
checkStatus('active'); }
   document.getElementById('chatbarText').onblur = function () {
checkStatus(''); }
   document.getElementById('submitchat').onclick = sendComment;
    document.getElementById('chatForm').onsubmit = function () { return
false; }
   // When user mouses over shoutbox
    document.getElementById('chatoutput').onmouseover = function () {
       if (jal_loadtimes > 9) {
          jal_loadtimes = 1;
         receiveChatText();
       }
       jal_timeout = jal_org_timeout;
    }
}

//initiates the first data query
function receiveChatText() {
   jal_lastID = parseInt(document.getElementById('jal_lastID').value) - 1;
   if (httpReceiveChat.readyState == 4 || httpReceiveChat.readyState == 0) {
        httpReceiveChat.open("GET",GetChaturl + '&jal_lastID=' + jal_lastID +
'&rand='+Math.floor(Math.random() * 1000000), true);
      httpReceiveChat.onreadystatechange = handlehHttpReceiveChat;
        httpReceiveChat.send(null);
      jal_loadtimes++;
       if (jal_loadtimes > 9) jal_timeout = jal_timeout * 5 / 4;
   }
       setTimeout('receiveChatText()',jal_timeout);

}

//deals with the servers' reply to requesting new content
function handlehHttpReceiveChat() {
  if (httpReceiveChat.readyState == 4) {
    results = httpReceiveChat.responseText.split('---'); //the fields are
seperated by ---
    if (results.length > 4) {
       for(i=0;i < (results.length-1);i=i+5) { //goes through the result one
message at a time
          insertNewContent(results[i+1],results[i+2],results[i+3],results[i+4],
results[i]); //inserts the new content into the page
          document.getElementById('jal_lastID').value = parseInt(results[i]) + 1;
       }
       jal_timeout = jal_org_timeout;
       jal_loadtimes = 1;

    }
  }
}

//inserts the new content into the page
function insertNewContent(liName,liText,lastResponse, liUrl, liId) {
    response = document.getElementById("responseTime");
    response.replaceChild(document.createTextNode(lastResponse),
response.firstChild);
   insertO = document.getElementById("outputList");
   oLi = document.createElement('li');
   oLi.setAttribute('id','comment-new'+liId);

   oSpan = document.createElement('span');
   oSpan.setAttribute('class','name');

   oName = document.createTextNode(liName);

   if (liUrl != "http://" && liUrl != '') {
      oURL = document.createElement('a');
      oURL.href = liUrl;
      oURL.appendChild(oName);
   } else {
      oURL = oName;
   }

   oSpan.appendChild(oURL);
   oSpan.appendChild(document.createTextNode(' : '));
   oLi.appendChild(oSpan);
   oLi.innerHTML += jal_apply_filters(liText);
   insertO.insertBefore(oLi, insertO.firstChild);
   Fat.fade_element("comment-new"+liId, 30, <?php echo
stripslashes(shoutbox_fade_length); ?>, "#<?php echo
stripslashes(shoutbox_fade_from); ?>", "#<?php echo
stripslashes(shoutbox_fade_to); ?>");
}


//stores a new comment on the server
function sendComment() {
   currentChatText = document.forms['chatForm'].elements['chatbarText'].value;
   if (httpSendChat.readyState == 4 || httpSendChat.readyState == 0) {
      if (currentChatText == '') return;
      currentName = document.getElementById('shoutboxname').value;
      currentUrl = document.getElementById('shoutboxurl').value;
      param = 'n='+ encodeURIComponent(currentName)+'&c='+
encodeURIComponent(currentChatText) +'&u='+
encodeURIComponent(currentUrl);
      httpSendChat.open("POST", SendChaturl, true);
      httpSendChat.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        httpSendChat.onreadystatechange = receiveChatText;
        httpSendChat.send(param);
        document.forms['chatForm'].elements['chatbarText'].value = '';
   }
}

// http://www.codingforums.com/showthread.php?t=63818
function pressedEnter(field,event) {
   var theCode = event.keyCode ? event.keyCode : event.which ? event.which :
event.charCode;
   if (theCode == 13) {
      sendComment();
      return false;
   }
   else return true;
}

//does clever things to the input and submit
function checkStatus(focusState) {
   currentChatText = document.forms['chatForm'].elements['chatbarText'];
   oSubmit = document.forms['chatForm'].elements['submit'];
   if (currentChatText.value != '' || focusState == 'active') {
      oSubmit.disabled = false;
   } else {
      oSubmit.disabled = true;
   }
}

function jal_getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}


//autoasigns a random name to a new user
//If the user has chosen a name, use that
function checkName() {

   jalCookie = jal_getCookie("jalUserName");
   currentName = document.getElementById('shoutboxname');

   if (currentName.value != jalCookie) {
      document.cookie = "jalUserName="+currentName.value+"; expires=<?php echo
gmdate("D, d M Y H:i:s",time() + $offset)." UTC"; ?>;"
   }

   if (jalCookie && currentName.value == '') {
      currentName.value = jalCookie;
      return;
   }

   if (currentName.value == '') {
      currentName.value = 'gast_'+ Math.floor(Math.random() * 10000);
   }

}

function checkUrl() {

   jalCookie = jal_getCookie("jalUrl");
   currentName = document.getElementById('shoutboxurl');

   if (currentName.value == '')
      return;

   if (currentName.value != jalCookie) {
      document.cookie = "jalUrl="+currentName.value+"; expires=<?php echo
gmdate("D, d M Y H:i:s",time() + $offset)." UTC"; ?>;"
      return;
   }

   if (jalCookie && ( currentName.value == '' || currentName.value ==
"http://")) {
      currentName.value = jalCookie;
      return;
   }
}


//initiates the XMLHttpRequest object
//as found here: http://www.webpasties.com/xmlHttpRequest
function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Ajaxtalk.com Forum Index -> AJAX Help All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
 Advertisements
 XML & Copyright Notice 
    


Powered by phpBB © 2001, 2005 phpBB Group

What is according to Wikipedia: Ajax Web2.0 XML E4X


Link to our site:

  


del.icio.us digg spurl wists simpy newsvine blinklist furl blogmarks yahoo! myweb smarking ma.gnolia segnalo reddit fark technorati cosmos


Normal Bookmark


Partner Button Links:
Codecrunch.com: Webmaster Tutorials    One Ajax


Partner Text Links:
quomon | web20log | ajaxmatters | tableless | 456bereastreet | music charts | gift ideas | competitions | free xbox 360 | link trade ?


Credits:
it consultancy & project management lead generation zoekmachine optimalisatie steal these buttons seo expert