// ajaxchat js library (c) www.fijiwebdesign.com

var loggingOut = false; // logging out status
var no_polling = false; // allow/disallow polling
var ajc_room_status = '(logged in)';

// simple debug handler
function _debug(msg) {
    try { logger(msg); } catch(e) { /* no logger available */ }
}

var ss = true;
var ajc_statusDivs = new Array();
function showStatus(msg, from) {
	try {
		if (!ss) return;
		ajc_statusDivs[ajc_statusDivs.length] = 'status_div';
		var count = 0;
		for (var x in ajc_statusDivs) {
			try { 
				s = $(ajc_statusDivs[x]); 
				s.innerHTML = msg;
				if (s.style.display && s.style.display != 'none') count++;
			} catch(e) { /* continue */ }
		}
		//_debug("Count Status Divs:"+count);
		if (count == 0) {
			window.status = msg;
			return;
		} 
	} catch(e) { _debug("showStatus Exception!\r\nError:"+e); }
}

// ------------------------ worker functions ------------------------------
// todo: check banned user
// edit: gabe - single request mode.  feb 28 04
// edit: gabe - login functions,

var requestMode = false;
var _setTimeout = true;

// toggles loggin of xmlhttprequests output debug
function loggerToggle() {
    try {
        _logger = !_logger;
        document.ajax_chat_form.lt.value = (_logger) ? 'Stop Logging' : 'ReStart Logging';
    } catch (e) {
    // no logger
    }
}

// toggles the sending of chat requests
function chatToggle(name) {

    try {
    _setTimeout = !_setTimeout;
    if (no_polling) {
         no_polling = false; // resume polling
         newSession(); // refresh room state
    } else {
        no_polling = true; // stop polling
    }
    el = document.getElementsByName(name);
    el[0].value = (_setTimeout) ? 'Pause Chat' : 'Resume Chat';
    } catch(e) { alert('Client does not support this function.'); }
}

var win_delay = 1000;
var ajcl_popupblocked = 'Your popup blocker is stopping you from viewing private messages.... Grrr';
function focusWin(name, timeout, i) {
	if (!timeout) timeout = win_delay; // set timeout
	if (pm_window[name]) {
		 pm_window[name].focus(); // focus window
	} else {
		if (i > 3) {
			alert(ajcl_popupblocked); // 3 tries failed
		} else {
			if (!i) i = 0;
			focusWin(name, timeout, i++);
		}
	}
}

// opens pm window
var pm_window = [];
function privateChat(recipient, roomid) {

var windowName = "pm_" + recipient;
var settings=
"toolbar=no,location=no,directories=no,"+
"status=no,menubar=no,scrollbars=no,"+
"resizable=yes,width=" + pm_width + ",height=" + pm_height;
var url = serverUrl + "index2.php?option=com_ajaxchat&task=pm&recipient=" + recipient;

if (!pm_window[windowName]) {
    _debug('new window:' + url);
    pm_window[windowName] = window.open(url, windowName, settings);
   	focusWin(windowName);
    return;
}

if (pm_window[windowName].location && !pm_window[windowName].closed) {
    _debug('window exists:' + url);

	if (roomid != pm_window[windowName].roomid) {
	_debug('new privte message session.')
	pm_window[windowName] = window.open(url, windowName, settings);
	}
    focusWin(windowName);
    } else {
		_debug('old window reopen:' + url);
		pm_window[windowName] = window.open(url, windowName, settings);
		pm_window[windowName].focus();
	}
}

// ------------------------------ send new msg --------------- //
var ajc_msgHandler = new Object(); // functions to trigger before send message
var msg;
function ajax_send_message(msg) {

	try {
	
		msg = document.ajax_chat_form.ajax_chat_input.value;
		document.ajax_chat_form.ajax_chat_input.value = '';
		if (msg.match(/^[ \n]+$/)) {
		  alert('Please type a message...');
		  return;
		}
		
		// execute event handlers for this function
		try {
			for (var fn in ajc_msgHandler) {
				msg = ajc_msgHandler[fn](msg);
			}
		} catch(e) {
			alert("Exception in ajax_chat_message.onExec \r\nError:"+e);
		}
		_setTimeout = false; // stay in single polling mode
	
		if (exclude_me) { // add msg immediately
			addmsgRow(myusername, msg, chat_table_row_classname);
		}
		return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&msg=" + encode(msg) + "&no_html=1&task=write" + "&recipient=" + encode(recipient) + "&roomid=" + encode(roomid) + (exclude_me ? "&exclude=" + encode(myusername) : "" ), ajax_show_msgs);

	} catch(e) {}

}


// -------------------- dynamic new messages -----------------------

var msg_count = 0;
var addMsgRowListerners = new Array();
function addmsgRow(userName, msg, trClass, chat_screen_id, msg_style) {

    msg = url2link(msg);   // replace urls with links
    msg = msg.replace(/\n/gi, '<br />'); // replace line breaks to html breaks
	
	/**
	* Write the new msg to the chat screen
	* InnerHTML is used lavishly instead of DOM since userName and msg can contain html nodes
	* Could clone nodes, bah... innerHTML is faster in all browsers anyways
	*/
	var _msg_style = msg_style ? msg_style : ajc_msg_style;
	var _id = (chat_screen_id && chat_screen_id != '') ? chat_screen_id : 'chat_screen';
	var chat_screen = $(_id);
	if (_msg_style == 'div') { // div formatted msgs
		var child = document.createElement('div');
		child.setAttribute('class', trClass+' msg_row' );
		child.className = trClass+' msg_row'; // IE
		child.setAttribute('id', 'msg_'+msg_count);
		child.innerHTML = '<span class="msg_user">'+userName+'</span>'+msg_spacer;
		child.innerHTML += '<span class="msg_text">'+msg+'</span>';
		var ajc_screen = chat_screen;
		
	} else if (_msg_style == 'fieldset') { // fieldset formatted msgs
		var fieldset = document.createElement('fieldset');
		var legend = document.createElement('legend');
		legend.innerHTML += '<span class="msg_user">'+userName+'</span>';
		fieldset.appendChild(legend);
		fieldset.innerHTML += '<span class="msg_text">'+msg+'</span>';
		fieldset.setAttribute('class', trClass+' msg_row' );
		fieldset.className = trClass+' msg_row'; // IE
		fieldset.setAttribute('id', 'msg_'+msg_count);
		var child = fieldset;
		var ajc_screen = chat_screen; 
		
	} else if (_msg_style == 'para') { // paragraph formatted msgs
		var p = document.createElement('p');
		p.innerHTML += '<span class="msg_user">'+userName+'</span>'+msg_spacer;
		p.innerHTML += '<span class="msg_text">'+msg+'</span>';
		p.setAttribute('class', trClass+' msg_row' );
		p.className = trClass+' msg_row'; // IE
		p.setAttribute('id', 'msg_'+msg_count);
		var child = p;
		var ajc_screen = chat_screen;

	} else if (_msg_style == 'list') { // list formatted msgs
		var ul_msgs = document.getElementById('ul_'+_id);
		if (!ul_msgs) { // create ul
			chat_screen.innerHTML = '<ul id="ul_'+_id+'"></ul>';
			var ul_msgs = document.getElementById('ul_'+_id);
		} else { // tbl exists
			var ajc_screen = ul_msgs;
		}
		// write li
		var li = document.createElement('li');
		li.innerHTML += '<span class="msg_user">'+userName+'</span>'+msg_spacer;
		li.innerHTML += '<span class="msg_text">'+msg+'</span>';
		li.setAttribute('class', trClass+' msg_row' );
		li.className = trClass+' msg_row'; // IE
		li.setAttribute('id', 'msg_'+msg_count);
		var child = li;
		var ajc_screen = ul_msgs;
		
	} else { // table formatted msgs
		var tbl = document.getElementById('tbl_msgs');
		if (!tbl) { // create out table
			chat_screen.innerHTML = '<table id="tbl_msgs"><caption></caption><th></th><tbody></tbody></table>';
			var ajc_screen = document.getElementById('tbl_msgs').tBodies[0];
		} else { // tbl exists
			var ajc_screen = tbl.tBodies[0];
		}
		// write table row
		var tr = document.createElement('tr');
		tr.setAttribute('class', trClass+' msg_row' );
		tr.setAttribute('id', 'msg_'+msg_count);
		tr.className = trClass+' msg_row'; // IE
		var td = document.createElement('td');
		td.innerHTML = '<span class="msg_user">'+userName+'</span>'+msg_spacer;
		td.innerHTML += '<span class="msg_text">'+msg+'</span>';
		tr.appendChild(td);
		var child = tr;
	}
	
	// run attached events
	var newChild;
	for(var x in addMsgRowListerners) {
		try {
			newChild = addMsgRowListerners[x](msg_count, userName, _id, child, _msg_style);
			if (typeof newChild == 'object') { 
				child = newChild; 
			}
		} catch(e) { }
	}

    if (yScroll) { // append to last node and scroll to bottom
        ajc_screen.appendChild(child);
		scrollMod(chat_screen);	// scroll down			
        if (msg_count >= msgDispCount) ajc_screen.removeChild(ajc_screen.firstChild);
    } else { // append to first node
        ajc_screen.insertBefore(child, ajc_screen.firstChild);
        if (msg_count >= msgDispCount) ajc_screen.removeChild(ajc_screen.lastChild);
    }
    msg_count++;
}

function scrollMod(el, offset) {
	if (!offset) offset = 100;
    var y = el.scrollTop; // vertical scroll offset
    var h = el.scrollHeight; // height of div
    var c = el.clientHeight; // scroll bar height
    if (h < (y + c + offset)) {
        el.scrollTop += 1000; // scroll down
    }
}

// ------------------------ / dynamic new messsages -----------------

// -------------------- show new messages ------------------//

function ajax_new_msgs() { _debug('new msgs request');
	try {
		// for stopping polling between connections
		if (no_polling) {
			//setTimeout(ajax_new_msgs, period_newMsgs);
			_debug('new msgs request prevented');
			return false;
		}
	
		// limit to one query at a time
		if (requestMode){
		  _debug('request in progress...');
		  //setTimeout('ajax_new_msgs()', 600);
		  return;
		}
		else {
			requestMode = true;
	  	}
		return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=1&task=newmsgs&roomid=" + encode(roomid) + "&recipient=" + encode(recipient) + (exclude_me ? "&exclude=" + encode(myusername) : "" ) + "&r=" + encode(Math.round(999*Math.random())), ajax_show_msgs);
	} catch(e) { _debug("Ajax new Messages Exception\r\nError:"+e); }
}

var current_chat = ''; // global chat html content storage obj
var session_msgs = '0'; // global message count
var showMsgsTimer; // global message setTimout

function ajax_show_msgs(myAJAX) {

    try {
		if (loggingOut == true) return; // drop on logout
		if (myAJAX.readyState == 4) {
	
			if (myAJAX.status == 200) {  
				showStatus('All msgs Recieved.', 'ajc_msgs');
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				logger('Response: ' + text);
				//logger('Headers: '+myAJAX.getAllResponseHeaders());
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					var messages = xml.documentElement.getElementsByTagName("msg");
					//logger(messages);
	
					try {
						var msgs_len = messages.length;
					} catch (e) {
						var msgs_len = 0;
					}
	
					if (msgs_len > 0) {
	
						var div = '';
						for (var i = 0; i < messages.length; i++) {
	
						var user = messages[i].getAttributeNode("user").nodeValue;
						var message = decode(messages[i].firstChild.nodeValue);
	
							var sectid = (user == 'admin') ? "2" : "1";
							var userLink = (user != myusername) ?
							"<a href=\"javascript:void(0);\" onclick=\"privateChat('" + user + "')\">" + user + "</a>" :
							user;
							var bgcolor = '';
	
							addmsgRow(user, message, chat_table_row_classname);
							titleStatus(user, message);
						}
	
					} else {
					  logger('no msgs to read');
	
					  // make sure we have a session
					  validateResponse(xml);
	
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
			}
			requestMode = false;
			if (_setTimeout)
			showMsgsTimer = setTimeout(ajax_new_msgs, period_newMsgs);
			else _setTimeout = true;
			if (msgs_len > 0) {
				session_msgs = parseInt(session_msgs + msgs_len);
				showStatus('status: ' + session_msgs + ' msgs');
			}
	
		}
	
	} catch(e) { try { _debug("Show Messages Exception!\r\nError:"+e); } catch(e) { /* trap */ } }

}

// add new message to title
function titleStatus(user, msg) {
	// show title bar messages for pms
	if (roomid == -1) {
		if (user != myusername) {
			msg = msg.replace(/<(.*)>/g, ''); // remove html tags
			document.title = user+msg_spacer+msg;
		}
	}
}

// handle key press events
function handleKeyUp( e ) {

    e = (!e) ? window.event : e;
    target = (!e.target) ? e.srcElement : e.target;
    var input = document.ajax_chat_form.ajax_chat_input;

    if (e.type == "keyup") {
        // shift+enter pressed, dont submit
        if (e.shiftKey && e.keyCode == 13) {
        } else {
          logger('typing...');
            // enter pressed while in ajax_chat_input
            if (target.name == "ajax_chat_input" && e.keyCode == 13) {
                logger('sending msg');
                if(input.value.match(/^\n+$/)) {
                    input.value = '';
                    _debug('please type a message...');
                    return;
                }
                ajax_send_message(input.value.replace(/\n+$/, ''));
                input.value = '';
            }
        }
    }
}

// ------------------------ end dynamic users online table -----------------

var requestMode_users = false;
var _setTimeout_users = true;

function showUsers(roomid) { // get all users in a room
    var users_div = document.getElementById('users');
    if(!users_div) {
        _debug('The chat client does not support the userlist.');
        return false;
    }
    
    // for stopping polling between connections
    if (no_polling) {
        //setTimeout(showUsers, period_users);
        _debug('new users request prevented');
        return false;
    }

    if (requestMode_users) return;
    else requestMode_users = true;

	return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('users') +"&roomid=" + encode(roomid),
                               displayUsers);

}

var usersTimer; // global display users setTimeout
function displayUsers(myAJAX) {

    try {
    	if (loggingOut == true) return; // drop on logout
        var users_div = document.getElementById('users');

        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				
				if (!users_div) {
					// no users div, stop getting users online data
					clearTimeout(usersTimer);
					usersTimer = null; alert('no users');
					return false;
					
				}
				
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				logger('Response text/xml: ' + text);
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					var users = xml.documentElement.getElementsByTagName("user");
					//logger(messages);
	
					if (users.length > 0) {
	
						var div = '';
						users_div.innerHTML = '';
						for (var i = 0; i < users.length; i++) {
	
							var userid = users[i].getAttributeNode("id").nodeValue;
							var username = users[i].getAttributeNode("name").nodeValue;
							var userStatus = users[i].getAttributeNode("status").nodeValue;
							var userLink = getUserLink(username);
							
							 if (users_table_row_classname_suffix) // highlight my->username
								var sectid = (username == myusername) ? "2" : "1";
								else  var sectid = '';
							
							if (ajc_users_style != 'default') {
								addmsgRow("<b>" + userLink + "</b>", userStatus, users_table_row_classname_suffix+sectid, 'users', ajc_users_style);
							} else {
								var bgcolor = '';
		
								div += "<tr class=\"" + users_table_row_classname + sectid + "\">";
								div += "<td valign=\"top\" bgcolor=\"" + bgcolor + "\">" +
								"<b>" + userLink + "</b></td>";
								div += "<td width=\"60%\" valign=\"top\" bgcolor=\"" + bgcolor + "\"><i>"
								+ userStatus + "</i></td>";
								div += "</tr>";
							}
						}
						
						if (ajc_users_style == 'default') {
							users_div.innerHTML = '<table class="'+users_table_classname+'"><tbody>'+div+'</tbody></table>';
						}
	
					} else {
					  logger('no users logged in.');
					  // make sure we have a connection
					  validateResponse(xml);
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
			}
			requestMode_users = false;
			if (_setTimeout_users) {
				usersTimer = setTimeout('showUsers(' + roomid + ')', period_users); 
			} else {  _setTimeout_users = true; }
    	}
	} catch(e) { return false; }
} // display users

// write the users link
function getUserLink(username) {
    if (username == myusername) return username;  // no link for self
    var linkHtml = '<a href="javascript:;" onclick="privateChat(\''+username+'\');return false;">'+username+'</a>';
    return linkHtml;    
}

//----------------------------------------------------- notifications -----------------

function showNotifications() { // get new notifications

	_debug('new notifications request');
	if (no_polling) {
		//setTimeout(showNotifications, period_notify);
		_debug('new notifications request prevented...');
		return false;
	}
	return new AJAXRequest("post", 
		serverUrl + "index2.php", "option=" +
		encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('notify'),
		displayNotifications);
}

var _setTimeout_notes = true;
var notesTimer; // global setTimeout for notes
var notesListerner = new ajcEventsListerner(); // new event listerner
notesListerner.addEvent('newpm'); // add new pm event

// display notifications
function displayNotifications(myAJAX) {

    try {
    	if (loggingOut == true) return; // drop on logout
        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				logger('Response text/xml: ' + text);
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					var notifications = xml.documentElement.getElementsByTagName("note");
	
					if (notifications.length > 0) {
	
						for (var i = 0; i < notifications.length; i++) {
	
							var roomid = notifications[i].getAttributeNode("roomid").nodeValue;
							var creator = notifications[i].getAttributeNode("creator").nodeValue;
							
							// add onerror trigger
							notesListerner.newOnError('newpm', function() { privateChat(creator, roomid); });
	
							// callback function to extend listerner
							var callback = function(fn, args) {
								fn(args[0], args[1]);
							}
							notesListerner.setCallback('newpm', callback);
							
							// execute new pm event listerners
							notesListerner.exec('newpm', creator, roomid);
	
						}
	
					} else {
					  logger('no notifications.');
					  validateResponse(xml); // validate connection
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
			}
			requestMode = false;
			if (_setTimeout_notes) {
				notesTimer = setTimeout('showNotifications()', period_notify);
			} else _setTimeout_notes = true;
	
		}
	} catch(e) { try{ _debug("Display Notifications Exception!\r\nError:"+e); } catch(e) { /*catch*/ } }
} // display notifications

//-------------------------------- display rooms ---------------------------------//

var requestMode_rooms = false;

function showRooms() { // get all published rooms

_debug('new rooms request');

    var rooms_div = document.getElementById('rooms');
    if(!rooms_div) {
        //_debug('The chat client does not support rooms.');
        return false;
    }

    // single room requests only
    if (requestMode_rooms) return;
    else requestMode_rooms = true;
    
    if (no_polling) {
        //setTimeout(showRooms, period_rooms);
        _debug('new rooms request prevented...');
        return false;
    }

    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('rooms') , displayRooms);
}

var _setTimeout_rooms = true;
var roomsTimer; // global setTimeout holder for rooms

function displayRooms(myAJAX) {

    try {
		if (loggingOut == true) return; // drop on logout
		var rooms_div = document.getElementById('rooms');

        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				
				if (!rooms_div) {
					// no users div, stop getting users online data
					clearTimeout(roomsTimer);
					roomsTimer = null; alert('no rooms');
					return false;
					
				}
				
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				logger('Response text/xml: ' + text);
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					var rooms = xml.documentElement.getElementsByTagName("room");
					//logger(messages);
	
					if (rooms.length > 0) {
	
						var div = '';
						rooms_div.innerHTML = '';
						for (var i = 0; i < rooms.length; i++) {
	
							var myroomid = rooms[i].getAttributeNode("id").nodeValue;
							var roomname = rooms[i].getAttributeNode("name").nodeValue;
							var roomtype = rooms[i].getAttributeNode("type").nodeValue;
	
							if (rooms_table_row_classname_suffix)   // config
							var sectid = (myroomid == roomid) ? "2" : "1";
							else var sectid = '';
							
							var currRoom = (myroomid == roomid) ? "<b>" +  roomname + "</b> " + ajc_room_status:
							"<a href=\"javascript:void(0);\" onclick=\"enterRoom('" + myroomid + "');\"><b>"
							+ roomname + "</b></a>";
							
							if (ajc_rooms_style != 'default') {
								addmsgRow(currRoom, roomtype, rooms_table_row_classname_suffix+sectid, 'rooms', ajc_rooms_style);
							} else {
	
								var totalUsers = '';
								var bgcolor = '';
		
								div += "<tr class=\"" + rooms_table_row_classname + sectid + "\">";
								div += "<td valign=\"top\" bgcolor=\"" + bgcolor + "\" width=\"60%\">" + currRoom + "</td>";
								div += "<td valign=\"top\" bgcolor=\"" + bgcolor + "\"><i>"
								+ roomtype + totalUsers + "</i></td>";
								div += "</tr>";
							}
						}
	
						if (ajc_rooms_style == 'default') {
							rooms_div.innerHTML = '<table class="' + rooms_table_classname + '" width="100%" cellpadding="0">' + div + '</table>';
						}
					} else {
					  logger('no rooms available.');
					  validateResponse(xml); // make sure we have a connection
					  
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
			}
			requestMode_rooms = false;
			if (_setTimeout_rooms) {
				roomsTimer = setTimeout('showRooms()', period_rooms);
			} else { _setTimeout_rooms = true; }

    	}
	} catch(e) { return false; }

} // display rooms

//------------------------------------ enter a new room -----------------//

function enterRoom( newroom ) {

	clearTimeout(showMsgsTimer);
    clearTimeout(usersTimer);
    clearTimeout(roomsTimer);
    clearTimeout(notesTimer);
    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('newroom') + "&newroom=" + encode(newroom) + "&oldroom=" + encode(roomid), validateRoom);

}

function validateRoom(myAJAX) {


        if (myAJAX.readyState == 4) {
        if (myAJAX.status == 200) {
            var xml = myAJAX.responseXML;
            var text = myAJAX.responseText;
            logger('Response text/xml: ' + text);

            // parse the xml
            if (xml) {
              if (xml.documentElement) {
                var room_els = xml.documentElement.getElementsByTagName('room');
                var room = room_els[0];
                //logger(messages);

                if (room) {

                    var roomStatus = room.getAttributeNode("status").nodeValue;

                    if (roomStatus == 'connected') { // todo: send room error messages
                        var newroom = room.getAttributeNode("roomid").nodeValue; // make sure there is a roomid
                      if (newroom) {

                        var roomName = room.getAttributeNode("roomname").nodeValue;
                        var roomWelcome = room.getAttributeNode("welcome").nodeValue;
                        var ftime = room.getAttributeNode("time").nodeValue;

                        roomid = newroom; // our new room is now connected

                        // show a connection message
                        //msg_row_count = 0; // clear msgs from last room
                        addmsgRow(roomName, roomWelcome, 'sectiontableentry1');
                        _setTimeout_rooms = false; // so we dont recurse through showRooms
                        showRooms(); // show rooms so we have an immediate update
                        showUsers(roomid); // show users for the new room immediately


                      } else {
							_debug('Could not enter New Room. It may be private.');
						}
                    } else {
						_debug('Could not enter New Room. It may be private.');
					}

                } else {
                  logger('Could not understand Chat Server. (requested Room Change)');
                }
              }
            }
        } else {
            logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
        }

    }
}

// check connection status
function showConnection() {

_debug('new conn request');

    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('status') , validateConnection);
}

var showConnectionTimer; // setTimeout var

function validateConnection(myAJAX) {
	try {
        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				//logger('Response text/xml: ' + text);
	
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					var conn_els = xml.documentElement.getElementsByTagName('connection');
					var connection = conn_els[0];
					//logger(messages);
	
					if (connection) {
	
						var connStatus = connection.getAttributeNode("status").nodeValue;
	
						if (connStatus == '1') {
							showStatus('Logged into Network!');
						} else {
							showStatus('<div style="color:red;">Chat Server Connection Lost!</div>');
							logger('could not connect to chat server. Please log in.');
							ajcLoginForm('Connection to Server Lost. Please log in.');
							return;
						}
	
					} else {
					  logger('Could not understand Chat Server. (requested Connection Status)');
					  ajcLoginForm('Connection Failed');
					  return;
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
				ajcLoginForm('Connection Error...');
				return;
			}
			showConnectionTimer = setTimeout('showConnection()', 10000);
    	}
	} catch(e) { return false; }
}

var no_connect = false; // global connection toggle
// create a new connection to chatroom
function newConnection() {

    _debug('new make conn request');
	addmsgRow(_system, '<span style="color: red;">Connecting...</span>');

    if (roomid*1 == -1) {
		// todo: update connection withought updating screen
        //alert('conn request denied');
        //return false;
    }
    
    if (no_connect) return false; // currently negotiating connection
    else no_connect = true; // set flag for currently connecting

    // stop msgs polling
    no_polling = true;

    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('connect') , validateNewConnection);
}

var connectCount = 0;
var newConnectionTimer; // setTimeout var
function validateNewConnection(myAJAX) {
	try {
        if (myAJAX.readyState == 4) {
			connectCount++;
			no_connect = false; // allow new connections
			
			if (myAJAX.status == 200) {
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				logger('Conn Response text/xml: ' + text);
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					
					var conn = xml.documentElement.getElementsByTagName('connection');
					var status = conn[0].getAttributeNode("status").nodeValue;
				
					if (status  == 102 || status == 101 || status == 100) {
				
							_debug('Connection: Unable to connect to chat server. Please log in.');
							if (connectCount > 1) ajcLoginForm('Connection Failed. Please retry...');
							else ajcLoginForm('Please Login with your site username and password.');
							return;
				
					} else if (status  == 106) {
				
							_debug('Connection: User is not logged in.');
							ajcLoginForm('Please Login with your site username and password.');
							return;
				
					} else if (status == 1 || status == 110) {
						// we have a connection, create session
						no_polling = false;   // restart polling
						no_connect = false; // restart new connections
						newSession();
						return;
					} else if (status == -9) {
						// User has been banned
						ajcLoginForm('<span style="color:red;">You have been banned from the chat. Please contact the administrator for further information.</span>');
						_debug('User is banned...');
						return;
					} else {
						// undefined response type
						_debug('The Chat Server is Buzy. Please try again later.');
						ajcLoginForm('Chat Connection refused. Server may be buzy... ');
						return;
					}
				  }
				}
			} else {
				_debug("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
				ajcLoginForm('Connection Error. Server may be down...');
			}
			ajcLoginForm('HTTP Error. Server may be down.');
			newConnectionTimer = setTimeout('showConnection()', 10000);
    	}
	} catch(e) { 
		ajcLoginForm('Chat Connection refused. Server may be buzy... ');
		try{ _debug("New Connection Validate Exception!\r\nError:"+e); } catch(e) { /* trap */ } 
	}
}

// create a new session to individual room
function newSession() {

_debug('new sess request');

    // turn off msgs polling
    no_polling = true;
	
	addmsgRow(_system, '<font color="green">Logging into room.</font>');

    if (roomid*1 == -1) {
        if (confirm('This PM is no longer connected to the server, close window?')) {
			window.close();
		}		
        return false;
    }
    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('chat') , validateNewSession);
}

function validateNewSession(myAJAX) {
	try {
        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				logger('Sess Response text/xml: ' + text);
	
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
	
					var conn = xml.documentElement.getElementsByTagName('connection');
					var status = conn[0].getAttributeNode("status").nodeValue;
				
				
					if (status  == 0) {
				
					_debug('Session: We were unable to log you into a room. ');
					newConnection();
					return;
				
					} else if (status == 1) {
						// we have a session
						_debug('You are logged in and may start chatting.');
						addmsgRow(_system, '<font color="green">Connected. You may start chatting...</font>');
						no_polling = false; // return to polling mode
						ajax_new_msgs();
						setTimeout(showNotifications, 5000);
						setTimeout(showRooms, 2000);
						setTimeout('showUsers(' + roomid + ')', 1000);
						return;
					} else {
						// undefined response type
						_debug('Session: Session state unknown. Starting new connection...');
						newConnection();
						return;
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
			}
			newConnectionTimer = setTimeout('showConnection()', 100000);

    	}
	} catch(e) { try{ _debug("Validate New Session Exception!\r\nError:"+e); } catch(e) { /* trap */ } }
}

// delete session
function dropSession(roomid, recipient) {
    no_polling = true; // turn off msgs polling
    _debug('requestiong session drop roomid:'+roomid+' recipient:'+recipient);
    if (roomid*1 == -1) {
        _debug('Drop session denied.');
        return false;
    }
    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('delsess') + "&roomid=" + encode(roomid) + "&recipient=" + encode(recipient) , validateDropSession);
}

function validateDropSession(myAJAX) {
    try {
    	//if (loggingOut == true) return; // drop on logout
        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					try {
						var conn = xml.documentElement.getElementsByTagName('connection');
						var status = conn[0].getAttributeNode("status").nodeValue;
					} catch(e) {
						var status = 1;
					}
					if (status  == 0) {
							_debug('You have been logged out of the Chat Room successfully...');
							no_polling = false; // resume polling
							return;
					} else if (status == 1) {
						// we still have a session?
						_debug('You failed to log out of the chatroom...');
						return;
					} else {
						// undefined response type
						_debug('You failed to log out of the chatroom since the server is buzy...');
						return;
					}
				  }
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
			}
    	}
	} catch(e) { try{ _debug("Validate Drop Sesssion Exception!\r\nError:"+e); } catch(e) { /* trap */ } }
}

// Writes login form
function ajcLoginForm(status) {

    _debug('---------login form---------');
	showStatus('Please Log in...', 'ajcLoginForm');
    var _screen = common.el('chat_screen');
    if (!_screen) {
		alert('The Chat Screen does not exist. This may be due to a faulty template. \r\nPlease contact the administrator.');
		 return false;
	}

    var txt = '<div id="box_login">';
	txt += '<div class="moduletable"><div><img src="'+serverUrl+'/components/com_ajaxchat/images/icons/cancel.gif" border="0" align="right" style="margin-top:4px;cursor:pointer;" onclick="ajcTip.hideTip(\'ajc_login_screen\');" /></div>';
    //txt += '<h3>'+login_title+'</h3>';
    txt += '<div id="box_login_username"><span>Username</span><span><input type="text" id="ajc_username" class="inputbox" /></span></div>';
    txt += '<div id="box_login_password"><span>Password</span><span><input type="password" id="ajc_password" class="inputbox" /></span></div>';
    txt += '<div id="box_login_buttons"><span><input type="button" id="ajc_loginsubmit" value="Login" class="button" /></span><span><input type="button" id="ajc_registration" value="Register" class="button" /></span></div>';
    txt += '<div id="ajc_login_status" class="small smallgrey">'+status+'</div>';
    txt += '</div>';
    txt += '<style>#ajc_login_screen div, #ajc_login_screen span { padding: 2px; }</style>';
	txt += '</div>';
    

    try {
        _screen.innerHTML = '';
        ajcTip.showTip(_screen, 'ajc_login_screen', txt, 5, 5, 250, false, false);
		
		// center login screen in chat win
		var _login = common.el('ajc_login_screen');
		var csDim = new common.objDim(_screen);
		var lsDim = new common.objDim(_login);
		var csOffset = new common.xyOffset(_screen);
		common.style(_login).left = csOffset.x +  parseInt(csDim.w/2 - lsDim.w/2) + 'px';
		common.style(_login).top = csOffset.y +  parseInt(csDim.h/2 - lsDim.h/2) + 'px';

    } catch(e) {
        _screen.innerHTML = '';
        _debug('Login Form Exception:'+e);
		_screen.innerHTML = txt;
    }

    if (!document.getElementById('ajc_loginsubmit')) {
        _debug('Login Error.');
    }
    document.getElementById('ajc_loginsubmit').onclick = function() {
        //confirm('Log Into Chatroom?');
        ajc_login();
        document.getElementById('ajc_login_status').innerHTML = 'Logging in..';
    }
    document.getElementById('ajc_registration').onclick = function() {
        document.location.href = serverUrl+'/index.php?option='+registration_link;
    }
}

// login to ajaxchat
function ajc_login() {

    // turn off msgs polling
    no_polling = true;
    _debug('Logging into chat server...');
    
    var username = document.getElementById('ajc_username').value;
    var password = document.getElementById('ajc_password').value;
    myusername = username; // global username

    return new AJAXRequest("post", serverUrl + "index2.php", "option=" + encode('com_ajaxchat') + "&no_html=" + encode(1) + "&task=" + encode('login') + "&username=" + encode(username) + "&password=" + encode(password) , validateLogin);
}

function validateLogin(myAJAX) {
	try {
        if (myAJAX.readyState == 4) {
			if (myAJAX.status == 200) {
				var xml = myAJAX.responseXML;
				var text = myAJAX.responseText;
				_debug('Login Response: '+text);
	
				// parse the xml
				if (xml) {
				  if (xml.documentElement) {
					try {
						var conn = xml.documentElement.getElementsByTagName('connection');
						var status = conn[0].getAttributeNode("status").nodeValue;
					} catch(e) {
						var status = 1;
					}
				
					if (status  == 103 || status == 102) {
							_debug('Login Failed...');
							ajcLoginForm('<span style="color:red;">Username or Password incorrect. Please try again.</span>');
				
							return;
				
					} else if (status == -1) {
						   _debug('Login Failed... User email is not activated.');
							ajcLoginForm('<span style="color:red;">Your account is not active. Please see your registration email.</span>');
				
					} else if (status == 1) {
						_debug('Logged into Ajax Chat Server...');
						document.getElementById('ajc_login_status').innerHTML = 'Logged into Chat. You may start chatting.... ';
						document.getElementById('chat_screen').style.visibility = '';
						document.getElementById('chat_screen').innerHTML = '';
						setTimeout(function() { ajcTip.tipStatus(true); ajcTip.hideTip('ajc_login_screen', 1); }, 2000);
						newConnection(); // open chat connection
						no_polling = false; // resume polling
						return;
					} else {
						// undefined response type
						_debug('Login request failed. Server may be buzy...');
						ajcLoginForm('<span style="color:red;">Chat Server Unavailable. Please try again later.</span>');
						return;
					}
	
					}
				}
			} else {
				logger("There was a problem retrieving the XML data:\n" + myAJAX.statusText);
				ajcLoginForm('<span style="color:red;">HTTP Server Unavailable. Please try again later.</span>');
			}
	
		}
	} catch(e) { try{ _debug("Validate Login Exeption!\r\nError:"+e); } catch(e) { /* trap */ } }
}

// validates the server response to make sure we are still connected
function validateResponse(xml) {
    // make sure we have a session
    try {
        var conn = xml.documentElement.getElementsByTagName('response');
        var status = conn[0].getAttributeNode("id").nodeValue;
    } catch(e) { var status = 0; }
    
    if (status < 0) {
        no_polling = true; // stop polling
        newSession(roomid); // attempt connection to current room
    }
}

// Searches message text for urls and replaces them with links
function url2link(str) {
    if (allow_links)      {
		// render http links
		str = ' ' + str; // add a space for matching
		var regexp = new RegExp("([^/\"<>])(http://([.]?[a-zA-Z0-9_/-\?&=\+])*)", "g");
		str = str.replace(regexp, "$1<a href=\"$2\">$2</a>");
		var regexp = new RegExp("([^/\"<>])(www([.]?[a-zA-Z0-9_/-\?&=\+])*)", "g");
		str = str.replace(regexp, "$1<a href=\"http://$2\">$2</a>");
    }
    return str;
}

// Runs attached functions at 1/2 sec interval
function ajcIntervals() {
	try {
		this.fns = new Array();
		
		this.set = function(fn, name) {
			this.fns[name] = fn;
		}
		
		this.unset = function(name) {
			this.fns[name] = false;
		}
		
		this.run = function() {
			for (var fn in this.fns) {
				try {
					this.fns[fn]();
				} catch(e) {
					_debug("Exception in ajc Interval running Function, "+fn+" \r\nError:"+e);
				}
			}
		}
	} catch(e) {
		_debug("Exception in ajc Interval \r\nError:"+e);
	}
}
var ajcInterval = new ajcIntervals();
var _ajcInterval = setInterval(function() { ajcInterval.run(); }, 500);

// Adds multiple window.onload event handlers
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

// some configs
var dispTime = false;
var period_newMsgs = 5000;
var period_notify = 10000;
var period_rooms = 100000;
var period_users = 10000;

// iniate chat
function initiate() {

    // catch uncaught exceptions to log
    window.onerror = function(e, file, line) {
        _debug('error: '+e+'; File:'+file+' , Line:'+line);
        return false;
    }

    showStatus('Connecting to chat server...');
	
	// make sure we have the same domain (www.example.com || example.com)
	browserUrl = window.location.href;
	var wserver = serverUrl.match(/^http:\/\/www\./) ? true : false;
	var wbrowser = browserUrl.match(/^http:\/\/www\./) ? true : false;
	if (wserver != wbrowser) {
		if (wbrowser) {
			serverUrl = serverUrl.replace(/^http:\/\//, 'http://www.');
		} else {
			serverUrl = serverUrl.replace(/^http:\/\/www\./, 'http://');
		}
	}

    if (roomid*1 != -1) { // not pm
        newConnection();
    } else { // pm
        ajax_new_msgs();
		document.title = 'Private Message with '+recipient; // set title
    }

    window.onunload = function() {
		try {
			loggingOut = true; // turn off session drop validation
			no_polling = true; // turn off new ajc polling
			// turn off active timeOuts
			clearTimeout(showMsgsTimer);
			clearTimeout(usersTimer);
			clearTimeout(roomsTimer);
			clearTimeout(notesTimer);
			dropSession(roomid, recipient); // drop the users session
		} catch(e) { /* trap exceptions */ }
    };
    loggerToggle();
}

