/*
 *	DFI Chat Script
 *	June 14, 2010
 *	Richard Gilchrist
 *
 *	Usage:
 *	----------------------
 *	<script type="text/javascript" src="/<script_directory>/dfichat.js"></script>
 *  <x onclick="dfiChatInit();" />
 *	----------------------
 */

var chatId='';
var chatter='';
var lastMsgId=0;
var ajaxObj;
var ajaxAdminObj;
var ajaxAdminAlertObj;
var ajaxSendChatObj;
var ajaxCheckChatObj;
var ajaxJoinChatObj;
var divScroll;
var chatInput;
var chatDiv;
var chatterCount = 0;
var joinTimeout=60000;
var checkVar;
var checkTime=250;
var chatAdminDiv;
var isAdmin=false;
var serv='Server';
var push='::push:: ';
var close='::close::';
var pushWindow;

var chatscroll = new Object();

  chatscroll.Pane = function(scrollContainerId){
    this.bottomThreshold = 100;
    this.scrollContainerId = scrollContainerId;
    this._lastScrollPosition = 100000000;
  }

  chatscroll.Pane.prototype.activeScroll = function(){

    var _ref = this;
    var scrollDiv = document.getElementById(this.scrollContainerId);
    var currentHeight = 0;

    var _getElementHeight = function(){
      var intHt = 0;
      if(scrollDiv.style.pixelHeight)intHt = scrollDiv.style.pixelHeight;
      else intHt = scrollDiv.offsetHeight;
      return parseInt(intHt);
    }

    var _hasUserScrolled = function(){
      if(_ref._lastScrollPosition == scrollDiv.scrollTop || _ref._lastScrollPosition == null){
        return false;
      }
      return true;
    }

    var _scrollIfInZone = function(){
      if( !_hasUserScrolled ||
		  (currentHeight - scrollDiv.scrollTop - _getElementHeight() <= _ref.bottomThreshold)){
		  if($('#'+scrollDiv.id+':animated').length > 0) {
			$('#'+scrollDiv.id+':animated').stop();
			$('#chatDiv p').css({'display':'','opacity':'1','filter':''});
		  }
		  $('#'+scrollDiv.id).animate({
			scrollTop: currentHeight
		  }, 1000);
		  //scrollDiv.scrollTop = currentHeight;
		  $('#chatDiv p:last').css('display','none').fadeIn(500);
		  _ref._isUserActive = false;
      }
    }


    if (scrollDiv.scrollHeight > 0)currentHeight = scrollDiv.scrollHeight;
    else if(scrollDiv.offsetHeight > 0)currentHeight = scrollDiv.offsetHeight;

    _scrollIfInZone();

    _ref = null;
    scrollDiv = null;

  }
  
function getXmlHttpObject(){
	if (window.XMLHttpRequest) return new XMLHttpRequest();
	if (window.ActiveXObject) return new ActiveXObject("Microsoft.XMLHTTP");
	alert('Operation Aborted: Your browser does not support AJAX.');
	return null;
}

function onInitFinished(){
	if (ajaxObj.readyState == 4) {
		//writeMessage('Server', 'onInitFinished');
		chatId=ajaxObj.responseText;
		onAfterInit();
		//writeMessage('Server', 'onInitFinished done');
	}
}

function onAfterInit(){
	setupWindow();
	document.getElementById('sendButton').style.display='';
	checkChat();
}

function getXml(txt) {
	var xmlDoc;
	if (window.DOMParser) {
		parser=new DOMParser();
		xmlDoc=parser.parseFromString(txt,"text/xml");
	}
	else {
		xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async="false";
		xmlDoc.loadXML(txt);
	}
	return xmlDoc;
}
function pushOpener(page){
	if(window && window.opener && !window.opener.closed)
		window.opener.location=page;
	else if(pushWindow && !pushWindow.closed)
		pushWindow.location=page;
	else
		pushWindow=window.open(page);
}
function setupLinks(chatMessage) {
	var urlRegex = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/ig
	var matches=chatMessage.match(urlRegex);
	if(matches==null) return chatMessage;
	for(var i = 0; i < matches.length; i++) {
		chatMessage=chatMessage.replace(matches[i],'<span class="chatLink" onclick="pushOpener(\''+matches[i]+'\')">'+matches[i]+'</span>');
	}
	return chatMessage;
}
function writeMessage(chatterName, chatMessage) {
	if(!chatDiv || chatDiv==null) return;
	chatMessage=setupLinks(chatMessage);
	if(chatterName==serv && chatMessage.substr(0,push.length)==push && !isAdmin) {
		var page = chatMessage.substr(push.length);
		pushOpener(page);
	} else if(chatterName==serv && chatMessage.substr(0,close.length)==close) {
		if(isAdmin) {
			popupNote();
		} else {
			lockChat();
			lockButtons();
			popupNote();
		}
	} else if (chatterName==serv) {
		if(chatMessage.indexOf('joined the chat') > 0) chatterCount++;
		chatDiv.innerHTML += 	'<p class="servtext msg-'+lastMsgId+'" style="margin: 0; padding: 3px 0 3px 5px;">' +
									'<span> ' + chatMessage + '</span>' +
								'</p>';
		divScroll.activeScroll();
	} else {
		chatDiv.innerHTML += 	'<p class="' + ((chatter==chatterName) ? 'mytext' : '') + '  msg-'+lastMsgId+'" style="margin: 0; padding: 3px 0 3px 30px;">' +
									'<strong style="margin: 0 0 0 -25px;">' + chatterName + ':' + '</strong>' +
									'<span> ' + chatMessage + '</span>' +
								'</p>';
		divScroll.activeScroll();
	}
}
function lockChat() {
	$('textarea').attr('disabled', 'disabled').animate({
			opacity: 0.2
		  }, 1000);
}
function lockButtons() {
	$('input').attr('disabled', 'disabled').animate({
			opacity: 0.2
		  }, 1000);
}
function popupNote() {
	$("#extras").empty().append('<div id="screen"></div><div id="alertBox"></div>');
	$("#screen").css({'width':'100%','height':$(document).height(),'position':'absolute','left':'0px', 'top':'0px','background':'url(\'/images/chatback.jpg\')','opacity':'0'}).animate({opacity: 0.5},1500);
	$("#alertBox").append("<div onclick='clearNote()' style='margin:0px 10px; height: 20px; width: 20px; float: right; padding: 2px; font-size: 16px;font-weight: bold;border: solid 2px white; color: white; background: red; cursor:pointer;'>X</div><p style='clear:both;margin: 0; padding: 0;'>The chat has ended.</p>").css({'width':'100%', 'position':'absolute','left':'0px', 'bottom':'0px','background':(jQuery.support.opacity?'rgba(0,0,0,0.8)':'rgb(0,0,0)'),'color':'white','text-align':'center','border-top':'solid 3px black','font-weight':'bold','padding-top':'10px','font-size':'20px','opacity':'0'}).animate({
			height: '115px',
			opacity: 1
		  }, 1000);
}

function clearNote() {
	$("#screen").fadeOut(1500, function(){
		$("#extras").empty();
	});
	$("#alertBox").animate({
		height: '5px',
		opacity: 0
	  }, 1000);
}

function onCheckChatFinished(){
	if (ajaxCheckChatObj.readyState == 4) {
		//writeMessage('Server', 'onCheckChatFinished');
		var chatXML=getXml(ajaxCheckChatObj.responseText);
		var messages=chatXML.getElementsByTagName('message');
		for( var i = lastMsgId; lastMsgId < messages.length; lastMsgId++) {
			writeMessage( messages[lastMsgId].attributes.getNamedItem('chatter').value, messages[lastMsgId].attributes.getNamedItem('msg').value);
		}
		checkVar=setTimeout("checkChat()",checkTime);
		//writeMessage('Server', 'onCheckChatFinished done');
	}
}

function checkChat(){
	//writeMessage('Server', 'checkChat');
	var randomnumber=Math.floor(Math.random()*99999)
	ajaxCheckChatObj=getXmlHttpObject();
	if (!ajaxCheckChatObj) return;
	ajaxCheckChatObj.onreadystatechange=onCheckChatFinished;
	ajaxCheckChatObj.open("GET", '/chat/'+chatId+'.xml?rand=' + randomnumber, true);
	ajaxCheckChatObj.send();
	//writeMessage('Server', 'checkChat done');
}

function onSendChatDone(){
	if (ajaxSendChatObj.readyState == 4) {
		clearTimeout(checkVar);
		checkChat();
	}
}

function sendChat(){
	//writeMessage('Server', 'sendChat');
	var chatMsg = chatInput.value;
	if(!chatMsg || chatMsg==null|| chatMsg=="") return;
	doChat(chatter, chatMsg);
	chatInput.value='';
	chatInput.focus();
}

function joinChat(){
	ajaxJoinChatObj=getXmlHttpObject();
	if (!ajaxJoinChatObj) return;
	ajaxJoinChatObj.open("POST", '/chat.jsp?chatStage=join&chatter='+chatter+'&chatId='+chatId, true);
	ajaxJoinChatObj.send();
}
function doChat(myChatter, chatMsg, skipCheck){
	if(skipCheck === undefined) skipCheck = false;
	chatMsg = chatMsg.replace(/"/gi, '&quot;');
	chatMsg = chatMsg.replace(/>/gi, '&gt;');
	chatMsg = chatMsg.replace(/</gi, '&lt;');
	ajaxSendChatObj=getXmlHttpObject();
	if (!ajaxSendChatObj) return;
	if(!skipCheck)
		ajaxSendChatObj.onreadystatechange=onSendChatDone;
	ajaxSendChatObj.open("POST", '/chat.jsp?chatStage=chat&chatter='+myChatter+'&chatId='+chatId+'&msgId='+(lastMsgId + 1)+'&chatMsg='+encodeURIComponent(chatMsg), true);
	ajaxSendChatObj.send();
}

function pushPage(){
	var page;
	while(page==null) page=prompt('Enter the URL to push to the user','http://');
	doChat(serv,push+page);
}

function closeChat(){
	if(confirm('This will close the chat for all participants. Are you sure you want to close the chat?'))
		endChat();
}

function endChat(){
	doChat(serv,close);
	ajaxAdminObj=getXmlHttpObject();
	if (!ajaxAdminObj) return;
	ajaxAdminObj.open("POST", '/chat.jsp?chatStage=close&chatId='+chatId, true);
	ajaxAdminObj.send();
}

function onLeftChat() {
	ajaxJoinChatObj=getXmlHttpObject();
	if (!ajaxJoinChatObj) return;
	ajaxJoinChatObj.open("POST", '/chat.jsp?chatStage=exit&chatter='+chatter+'&chatId='+chatId, true);
	ajaxJoinChatObj.send();
}

function setupWindow(){
	var maindiv=document.getElementById('chatwindow');
	var maincontent=	'<table cellpadding="0" cellspacing="0" border="0" style="height: 490px; width: 340px; border-collapse: collapse;">'+
							'<tr>' +
								'<td colspan="2" style="height:20px; line-height: 20px; vertical-align: middle;">' +
									'<h1>Data Foundations Live Chat</h1>' +
								'</td>' +
							'</tr>' +
							'<tr>' +
								'<td colspan="2" style="height:360px">' +
									'<div id="chatDiv">' +
									'</div>' +
								'</td>' +
							'</tr>' +
							'<tr id="chatbottom">' +
								'<td valign="top" style="height:95px;width: 245px;">' +
									'<textarea rows="5" id="inputText" onkeydown="if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {sendChat();return false;} else return true;" >' +
									'</textarea>' +
								'</td>' +
								'<td valign="top" style="height:95px;">' +
									'<input type="button" class="chatbutton" id="sendButton" value="Send" onclick="sendChat();"/>' +
									'<br/>' +
									'' + (isAdmin ? '<input class="chatbutton" type="button" id="pushButton" value="Push Page" onclick="pushPage();"/>' : '' ) +
									'<br/>' +
									'' + (isAdmin ? '<input class="chatbutton" type="button" id="closechatbutton" value="End Chat" onclick="closeChat();"/>' : '' ) +
								'</td>' +
							'</tr>' +
						'</table>'+
						'<a name="bottom" />';
	maindiv.innerHTML=maincontent;

	divScroll = new chatscroll.Pane('chatDiv');
	divScroll.activeScroll();
	chatDiv = document.getElementById('chatDiv');
	chatInput=document.getElementById('inputText');
	document.getElementById('sendButton').style.display='none';
	establishChatterName();
}
function establishChatterName() {
	if (chatter==null || chatter=='') {
		
		$("#extras").empty().append('<div id="screen1"></div><div id="requestNameBox"></div>');
		$("#screen1").css({'width':'100%','height':$(document).height(),'position':'absolute','left':'0px', 'top':'0px','background':'url(\'/images/chatback.jpg\')','opacity':'0'}).animate({opacity: 0.5},1500);
		$("#requestNameBox").append('<p style="color:white; text-align:center; font-weight:bold; font-size:20px;">Please enter your name.</p><input type="text" id="inputChatterName" style="width:245px; margin:0 10px;" onkeydown="if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {checkChatterName();return false;} else return true;" /><input class="chatbutton" type="button" onclick="checkChatterName()" value="OK" />').css({'width':'100%', 'position':'absolute','left':'0px', 'bottom':'0px','background':(jQuery.support.opacity?'rgba(0,0,0,0.8)':'rgb(0,0,0)'),'border-top':'solid 3px black','padding-top':'10px','opacity':'0'}).animate({
				height: '115px',
				opacity: 1
			  }, 1000);
		$('#inputChatterName').focus();
	} else {
		onAfterChatterNameEstablished();
	}
}
function checkChatterName() {
	chatter=$('#inputChatterName').val();
	if (chatter!=null && chatter!='') {
		$("#requestNameBox p").empty().append("Thanks!");
		$("#screen1").fadeOut(1500, function(){
			$("#extras").empty();
		});
		$("#requestNameBox").animate({
			height: '5px',
			opacity: 0
		  }, 1000);
		onAfterChatterNameEstablished();
	}
}
function onAfterChatterNameEstablished() {
	if(!isAdmin) beginCheckForJoins();
	joinChat();
	alertAdmin();
}
function alertAdmin(){
	if(isAdmin) return;
	/*
	ajaxAdminAlertObj=getXmlHttpObject();
	if (!ajaxAdminAlertObj) return;
	//ajaxAdminAlertObj.open("POST", '/submit.form?formId=1000&chatName='+chatter+'&chatId='+chatId, true);
	ajaxAdminAlertObj.send();
	*/
	doChat(serv, "Chat initiated from: " + window.opener.location);
	doChat(serv, "Please wait while a Data Foundations representative is located...");
}
function beginCheckForJoins() {
	//writeMessage('alert','beginCheckForJoins');
	setTimeout("apologize()",joinTimeout);
}
function apologize() {
	//writeMessage('alert','apologize');
	if(chatterCount < 2) {
		//writeMessage('alert','chatterCount < 2');
		//return;
		$("#extras").empty().append('<div id="screen"></div><div id="alertBox"></div>');
		$("#screen").css({'height':$(document).height(),'width':'100%','position':'absolute','left':'0px', 'top':'0px','background':'url(\'/images/chatback.jpg\')','opacity':'0'}).animate({opacity: 0.5},1500);
		$("#alertBox").append("<div onclick='clearNote()' style='margin:0px 10px; height: 14px; width: 14px; float: right; padding: 2px; font-size: 10px;font-weight: bold;border: solid 2px white; color: white; background: red; cursor:pointer;'>X</div><p style='clear:both;margin: 0; padding: 0 20px;'>Our Apologies!<br/><span style='font-size:16px;'>We could not locate someone to chat.<br/>Please use the <span style='text-decoration:underline; cursor:pointer' onclick='pushOpener(\"http://www.datafoundations.com/company_contact.jsp\")' >Contact Us Form</span> instead.</span></p>").css({'width':'100%', 'position':'absolute','left':'0px', 'bottom':'0px','background':(jQuery.support.opacity?'rgba(0,0,0,0.8)':'rgb(0,0,0)'),'color':'white','text-align':'center','border-top':'solid 3px black','font-weight':'bold','padding-top':'10px','font-size':'20px','opacity':'0'}).animate({
				height: '115px',
				opacity: 1
			  }, 1000);
	}
}
function initDfiChat(myChatId,myIsAdmin,chatName){
	isAdmin = myIsAdmin;
	if(!(chatName===undefined)) chatter=chatName;
	if(myChatId=='0') {
		ajaxObj=getXmlHttpObject();
		if (!ajaxObj) return;
		ajaxObj.onreadystatechange=onInitFinished;
		ajaxObj.open("POST", '/chat.jsp?chatStage=init' , true);
		ajaxObj.send();
	} else {
		chatId=myChatId;
		onAfterInit();
	}
}
 function dfiChatInit(myChatId,myIsAdmin,chatName) {
	if(myChatId === undefined) myChatId='0';
	if(myIsAdmin === undefined) myIsAdmin=false;
	var newwindow2=window.open('','dfichatwindow','height=510,width=360,scrollbars=no, resize=no, statusbar=no, menubar=no');
	var tmp = newwindow2.document;
	var myOutput =	'<html>' +
						'<head>' +
							'<title>Data Foundations Chat Window</title>' +
							'<script type="text/javascript" src="/js/dfichat.js"></script>'+
							'<script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>'+
							'<link rel="stylesheet" type="text/css" href="/css/dfichat.css"></script>'+
						'</head>'+
						'<body onunload="onLeftChat()">' +
							'<div id="chatwindow" style="width:350px;height:500px;" >' +
								'Loading Chat...' +
							'</div>'+
							'<script type="text/javascript">'+
								'setTimeout("'+
									'initDfiChat(' +
										'\'' + myChatId + '\'' +
										'' + (myIsAdmin ? ',true' : ',false') +
										'' + (chatName===undefined ? '' : ',\'' + chatName+ '\'' ) +
									')' +
								'",100)' +
							'</script>'+
							'<div id="extras"></div>' +
						'</body>' +
					'</html>';
	tmp.write(myOutput);
	tmp.close();
 }

 function onInitChatAdmin(){
	if (ajaxAdminObj.readyState == 4) {
		var chatAdminXML=getXml(ajaxAdminObj.responseText);
		var conversations=chatAdminXML.getElementsByTagName('title');
		for( var i = 1; i < conversations.length; i++) {
			chatAdminDiv.innerHTML += '<input type="button" value="'+conversations[i].childNodes[0].nodeValue+'" onclick="dfiChatInit(\''+conversations[i].childNodes[0].nodeValue+'\',true,\'admin\')" /><br/>';
		}
	}
 }

 function dfiChatCheckInit(chatAdmin) {
	var search1 = location.search;
	if(search1.length > 1) {
		search1 = search1.substr(1);
		var search2 = search1.split("&");
		for(var i = 0;i < search2.length; i++)
		{
			if(search2[i].split("=")[0]=='dfiChatId') {
				var cid = '' + search2[i].split("=")[1];
				while(dfichat_user===undefined || dfichat_user==null) dfichat_user=prompt("Please enter your name.", "Your Name");

				dfiChatInit(cid,true,dfichat_user);
			}
		}
	} else {
		chatAdminDiv = document.getElementById(chatAdmin);
		ajaxAdminObj=getXmlHttpObject();
		if (!ajaxAdminObj) return;
		ajaxAdminObj.onreadystatechange=onInitChatAdmin;
		ajaxAdminObj.open("GET", '/chat/conversations.xml' , true);
		ajaxAdminObj.send();
	}
 /*
	var search1 = location.search;
	if(search1.length > 1) {
		search1 = search1.substr(1);
		var search2 = search1.split("&");
		for(var i = 0;i < search2.length; i++)
		{
			if(search2[i].split("=")[0]=='dfiChatId') {
				var cid = '' + search2[i].split("=")[1];
				while(dfichat_user===undefined || dfichat_user==null) dfichat_user=prompt("Please enter your name.", "Your Name");
				dfiChatInit(cid,true,dfichat_user);
			}
		}
	} else {
		chatAdminDiv = document.getElementById(chatAdmin);
		ajaxAdminObj=getXmlHttpObject();
		if (!ajaxAdminObj) return;
		ajaxAdminObj.onreadystatechange=onInitChatAdmin;
		ajaxAdminObj.open("GET", '/chat/conversations.xml' , true);
		ajaxAdminObj.send();
	}
*/
 }

 function displayChatImage(displayChat) {
	if(displayChat) {
		document.write('<img border="0" width="198" height="112" src="/images/chaticons/reponline.gif" style="cursor:pointer;" onclick="dfiChatInit();" />');
	} else {
		document.write('<a href="/company_contact.jsp"><img width="198" height="112" border="0" src="/images/chaticons/repoffline.gif" /></a>');
	}

 }
