// Chat Bot by George Dunlop, www.peccavi.com
// Note - Eliza is a Classic Model of chat Bots.. but this implementation is mine :)
// May be used/modified if credit line is retained (c) 1997 All rights reserved

    loaded = false;				// load flag for interlocking the pages

// OBJECT TYPE DEFINITIONS

// Keys

   maxKey = 36;
   keyNotFound = maxKey-1;
   keyword = new Array(maxKey);

	function key(key,idx,end){
   	this.key = key;               			// phrase to match
    	this.idx = idx;               			// first response to use
    	this.end = end;               			// last response to use
    	this.last = end;								// response used last time
  	}
	maxrespnses =116;
   response = new Array(maxrespnses);

	maxConj = 19;
	max2ndConj = 7;
   var conj1 = new Array(maxConj);
   var conj2 = new Array(maxConj);
   var conj3 = new Array(max2ndConj);
   var conj4 = new Array(max2ndConj);
   

// Funtion to replaces all occurances of substring substr1 with substr2 within strng
// if type == 0 straight string replacement
// if type == 1 assumes padded strings and replaces whole words only
// if type == 2 non case sensitive assumes padded strings to compare whole word only
// if type == 3 non case sensitive straight string replacement

	var RPstrg = "";

	function replaceStr( strng, substr1, substr2, type){
		var pntr = -1; aString = strng;
		if( type == 0 ){  
			if( strng.indexOf( substr1 ) >= 0 ){ pntr = strng.indexOf( substr1 );	}
		} else if( type == 1 ){ 
			if( strng.indexOf( " "+ substr1 +" " ) >= 0 ){ pntr = strng.indexOf( " " + substr1 + " " ) + 1; }	
		} else if( type == 2 ){ 
			bstrng = strng.toUpperCase();
			bsubstr1 = substr1.toUpperCase();
			if( bstrng.indexOf( " "+ bsubstr1 +" " )>= 0 ){ pntr = bstrng.indexOf( " " + bsubstr1 + " " ) + 1; }	
		} else {
			bstrng = strng.toUpperCase();
			bsubstr1 = substr1.toUpperCase();
			if( bstrng.indexOf( bsubstr1 ) >= 0 ){ pntr = bstrng.indexOf( bsubstr1 ); }	
		}
		if( pntr >= 0 ){
			RPstrg += strng.substring( 0, pntr ) + substr2;
			aString = strng.substring(pntr + substr1.length, strng.length );
			if( aString.length > 0 ){ replaceStr( aString, substr1, substr2, type ); }
		}
		aString =  RPstrg + aString;
		RPstrg = "";
		return aString;
	}	


// Function to pad a string.. head, tail & punctuation

	punct = new Array(".", ",", "!", "?", ":", ";", "&", '"', "@", "#", "(", ")" )

	function padString(strng){
		aString = " " + strng + " ";
		for( i=0; i < punct.length; i++ ){
			aString = replaceStr( aString, punct[i], " " + punct[i] + " ", 0 );
		}
		return aString
	}

// Function to strip padding

	function unpadString(strng){
		aString = strng;
		aString = replaceStr( aString, "  ", " ", 0 ); 		// compress spaces
		if( strng.charAt( 0 ) == " " ){ aString = aString.substring(1, aString.length ); }
		if( strng.charAt( aString.length - 1 ) == " " ){ aString = aString.substring(0, aString.length - 1 ); }
		for( i=0; i < punct.length; i++ ){
			aString = replaceStr( aString, " " + punct[i], punct[i], 0 );
		}
		return aString
	}



// Dress Input formatting i.e leading & trailing spaces and tail punctuation
	
	var ht = 0;												// head tail stearing
	
	function strTrim(strng){
		if(ht == 0){ loc = 0; }									// head clip
		else { loc = strng.length - 1; }						// tail clip  ht = 1 
		if( strng.charAt( loc ) == " "){
			aString = strng.substring( - ( ht - 1 ), strng.length - ht);
			aString = strTrim(aString);
		} else { 
			var flg = false;
			for(i=0; i<=5; i++ ){ flg = flg || ( strng.charAt( loc ) == punct[i]); }
			if(flg){	
				aString = strng.substring( - ( ht - 1 ), strng.length - ht );
			} else { aString = strng; }
			if(aString != strng ){ strTrim(aString); }
		}
		if( ht ==0 ){ ht = 1; strTrim(aString); } 
		else { ht = 0; }		
		return aString;
	}

// adjust pronouns and verbs & such

	function conjugate( sStrg ){           	// rephrases sString
		var sString = sStrg;
		for( i = 0; i < maxConj; i++ ){			// decompose
			sString = replaceStr( sString, conj1[i], "#@&" + i, 2 );
		}
		for( i = 0; i < maxConj; i++ ){			// recompose
			sString = replaceStr( sString, "#@&" + i, conj2[i], 2 );
		}
		// post process the resulting string
		for( i = 0; i < max2ndConj; i++ ){			// decompose
			sString = replaceStr( sString, conj3[i], "#@&" + i, 2 );
		}
		for( i = 0; i < max2ndConj; i++ ){			// recompose
			sString = replaceStr( sString, "#@&" + i, conj4[i], 2 );
		}
		return sString;
	}

// Build our response string
// get a random choice of response based on the key
// Then structure the response

	var pass = 0;
	var thisstr = "";
		
	function phrase( sString, keyidx ){
		idxmin = keyword[keyidx].idx;
		idrange = keyword[keyidx].end - idxmin + 1;
		choice = keyword[keyidx].idx + Math.floor( Math.random() * idrange );
		if( choice == keyword[keyidx].last && pass < 5 ){ 
			pass++; phrase(sString, keyidx ); 
		}
		keyword[keyidx].last = choice;
		var rTemp = response[choice];
		var tempt = rTemp.charAt( rTemp.length - 1 );
		if(( tempt == "*" ) || ( tempt == "@" )){
			var sTemp = padString(sString);
			var wTemp = sTemp.toUpperCase();
			var strpstr = wTemp.indexOf( " " + keyword[keyidx].key + " " );
   		strpstr += keyword[ keyidx ].key.length + 1;
			thisstr = conjugate( sTemp.substring( strpstr, sTemp.length ) );
			thisstr = strTrim( unpadString(thisstr) )
			if( tempt == "*" ){
				sTemp = replaceStr( rTemp, "<*", " " + thisstr + "?", 0 );
			} else { sTemp = replaceStr( rTemp, "<@", " " + thisstr + ".", 0 );
			}
		} else sTemp = rTemp;
		return sTemp;
	}
	
// returns array index of first key found

		var keyid = 0;

	function testkey(wString){
		if( keyid < keyNotFound
			&& !( wString.indexOf( " " + keyword[keyid].key + " ") >= 0 )){ 
			keyid++; testkey(wString); 
		}
	}
	function findkey(wString){ 
		keyid = 0;
		found = false;
		testkey(wString);
		if( keyid >= keyNotFound ){ keyid = keyNotFound; }
  		return keyid;  		
	}

// This is the entry point and the I/O of this code

	var wTopic = "";											// Last worthy responce
	var sTopic = "";											// Last worthy responce
	var greet = false;
	var wPrevious = "";        		    				// so we can check for repeats
	var started = false;	

	function listen(User){
  		sInput = User;
   	if(started){ clearTimeout(Rtimer); }
		Rtimer = setTimeout("wakeup()", 180000);		// wake up call
		started = true;										// needed for Rtimer
   	sInput = strTrim(sInput);							// dress input formating
		if( sInput != "" ){ 
			wInput = padString(sInput.toUpperCase());	// Work copy
			var foundkey = maxKey;         		  		// assume it's a repeat input
			if (wInput != wPrevious){   					// check if user repeats himself
				foundkey = findkey(wInput);   			// look for a keyword.
			}
			if( foundkey == keyNotFound ){
				if( !greet ){ greet = true; return "Don't you ever say Hello?" } 
				else {
					wPrevious = wInput;          			// save input to check repeats
					if(( sInput.length < 10 ) && ( wTopic != "" ) && ( wTopic != wPrevious )){
						lTopic = conjugate( sTopic ); sTopic = ""; wTopic = "";
						return 'OK... "' + lTopic + '". Tell me more.';
					} else {
						if( sInput.length < 15 ){ 
							return "Tell me more..."; 
						} else { return phrase( sInput, foundkey ); }
					}
				}
			} else { 
				if( sInput.length > 12 ){ sTopic = sInput; wTopic = wInput; }
				greet = true; wPrevious = wInput;  			// save input to check repeats
				return phrase( sInput, foundkey );			// Get our response
			}
		} else { return "I can't help, if you will not chat with me!"; }
	}
	function wakeup(){
			var strng1 = "    *** Are We going to Chat? ***";
			var strng2 = "  I can't help you without a dialog!";
			update(strng1,strng2);
	}
		
// build our data base here
                                 
    conj1[0]  = "are";   		conj2[0]  = "am";
    conj1[1]  = "am";   		conj2[1]  = "are";
    conj1[2]  = "were";  		conj2[2]  = "was";
    conj1[3]  = "was";  		conj2[3]  = "were";
    conj1[4]  = "I";    			conj2[4]  = "you";    
    conj1[5]  = "me";    		conj2[5]  = "you";    
    conj1[6]  = "you";   		conj2[6]  = "me";
    conj1[7]  = "my";    		conj2[7]  = "your";    
    conj1[8]  = "your";  		conj2[8]  = "my";
    conj1[9]  = "mine";  		conj2[9]  = "your's";    
    conj1[10] = "your's"; 	conj2[10] = "mine";    
    conj1[11] = "I'm";   		conj2[11] = "you're";
    conj1[12] = "you're";  	conj2[12] = "I'm";    
    conj1[13] = "I've";  		conj2[13] = "you've";
    conj1[14] = "you've"; 	conj2[14] = "I've";
    conj1[15] = "I'll"; 		conj2[15] = "you'll";
    conj1[16] = "you'll"; 	conj2[16] = "I'll";
    conj1[17] = "myself"; 	conj2[17] = "yourself";
    conj1[18] = "yourself"; 	conj2[18] = "myself";

// array to post process correct our tenses of pronouns such as "I/me"
    
    conj3[0]  = "me am";   	conj4[0]  = "I am";
    conj3[1]  = "am me";   	conj4[1]  = "am I";
    conj3[2]  = "me can";   	conj4[2]  = "I can";
    conj3[3]  = "can me";   	conj4[3]  = "can I";
    conj3[4]  = "me have";  	conj4[4]  = "I have";
    conj3[5]  = "me will";   	conj4[5]  = "I will";
    conj3[6]  = "will me";   	conj4[6]  = "will I";
   

// Keywords

    keyword[ 0]=new key( "CAN YOU",  		1,  3);
    keyword[ 1]=new key( "CAN I",    		4,  5);
    keyword[ 2]=new key( "YOU ARE",  		6,  9);
    keyword[ 3]=new key( "YOU'RE",   		6,  9);
    keyword[ 4]=new key( "I DON'T",  		10, 13);
    keyword[ 5]=new key( "I FEEL",   		14, 16);
    keyword[ 6]=new key( "WHY DON'T YOU", 17, 19);
    keyword[ 7]=new key( "WHY CAN'T I", 	20, 21);
    keyword[ 8]=new key( "ARE YOU",  		22, 24);
    keyword[ 9]=new key( "I CAN'T",  		25, 27);
    keyword[10]=new key( "I AM",     		28, 31);
    keyword[11]=new key( "I'M",      		28, 31);
    keyword[12]=new key( "YOU",      		32, 34);
    keyword[13]=new key( "I WANT",   		35, 39);
    keyword[14]=new key( "WHAT",     		40, 48);
    keyword[15]=new key( "HOW",      		40, 48);
    keyword[16]=new key( "WHO",      		40, 48);
    keyword[17]=new key( "WHERE",    		40, 48);
    keyword[18]=new key( "WHEN",     		40, 48);
    keyword[19]=new key( "WHY",      		40, 48);
    keyword[20]=new key( "NAME",     		49, 50);
    keyword[21]=new key( "CAUSE",    		51, 54);
    keyword[22]=new key( "SORRY",    		55, 58);
    keyword[23]=new key( "DREAM",    		59, 62);
    keyword[24]=new key( "HELLO",    		63, 63);
    keyword[25]=new key( "HI",       		63, 63);
    keyword[26]=new key( "MAYBE",    		64, 68);
    keyword[27]=new key( "NO",       		69, 73);
    keyword[28]=new key( "YOUR",     		74, 75);
    keyword[29]=new key( "ALWAYS",   		76, 79);
    keyword[30]=new key( "THINK",    		80, 82);
    keyword[31]=new key( "ALIKE",    		83, 89);
    keyword[32]=new key( "YES",      		90, 92);
    keyword[33]=new key( "FRIEND",   		93, 98);
    keyword[34]=new key( "COMPUTER", 		99, 105);
    keyword[35]=new key( "NO KEY FOUND", 	106, 112);
    keyword[36]=new key( "REPEAT INPUT", 	113, 116);


    response[  0]="ELIZA - Javascript Version by George Dunlop ( george@peccavi.com )"
    response[  1]="Don't you believe that I can<*";
    response[  2]="Perhaps you would like to be able to<*";
    response[  3]="You want me to be able to<*";
    response[  4]="Perhaps you don't want to<*";
    response[  5]="Do you want to be able to<*";
    response[  6]="What makes you think I am<*";
    response[  7]="Does it please you to believe I am<*";
    response[  8]="Perhaps you would like to be<*";
    response[  9]="Do you sometimes wish you were<*";
    response[ 10]="Don't you really<*";
    response[ 11]="Why don't you<*";
    response[ 12]="Do you wish to be able to<*";
    response[ 13]="Does that trouble you?";
    response[ 14]="Tell me more about such feelings.";
    response[ 15]="Do you often feel<*";
    response[ 16]="Do you enjoy feeling<*";
    response[ 17]="Do you really believe I don't<*";
    response[ 18]="Perhaps in good time I will<@";
    response[ 19]="Do you want me to<*";
    response[ 20]="Do you think you should be able to<*";
    response[ 21]="Why can't you<*";
    response[ 22]="Why are you interested in whether or not I am<*";
    response[ 23]="Would you prefer if I were not<*";
    response[ 24]="Perhaps in your fantasies I am<*";
    response[ 25]="How do you know you can't<*";
    response[ 26]="Have you tried?";
    response[ 27]="Perhaps you can now<*";
    response[ 28]="Did you come to me because you are<*";
    response[ 29]="How long have you been<*";
    response[ 30]="Do you believe it is normal to be<*";
    response[ 31]="Do you enjoy being<*";
    response[ 32]="We were discussing you, not me.";
    response[ 33]="Oh... <*";
    response[ 34]="You're not really talking about me, are you?";
    response[ 35]="What would it mean to you if you got<*";
    response[ 36]="Why do you want<*";
    response[ 37]="Suppose you got<*";
    response[ 38]="What if you never got<*";
    response[ 39]="I sometimes also want<@";
    response[ 40]="Why do you ask?";
    response[ 41]="Does that question interest you?";
    response[ 42]="What answer would please you the most?";
    response[ 43]="What do you think?";
    response[ 44]="Are such questions on your mind often?";
    response[ 45]="What is it that you really want to know?";
    response[ 46]="Have you asked anyone else?";
    response[ 47]="Have you asked such questions before?";
    response[ 48]="What else comes to mind when you ask that?";
    response[ 49]="Names don't interest me.";
    response[ 50]="I don't care about names, please go on.";
    response[ 51]="Is that the real reason?";
    response[ 52]="Don't any other reasons come to mind?";
    response[ 53]="Does that reason explain anything else?";
    response[ 54]="What other reasons might there be?";
    response[ 55]="Please don't apologise!";
    response[ 56]="Apologies are not necessary.";
    response[ 57]="What feelings do you have when you apologise?";
    response[ 58]="Don't be so defensive!";
    response[ 59]="What does that dream suggest to you?";
    response[ 60]="Do you dream often?";
    response[ 61]="What persons appear in your dreams?";
    response[ 62]="Are you disturbed by your dreams?";
    response[ 63]="How are you today.. What would you like to discuss?";
    response[ 64]="You don't seem quite certain.";
    response[ 65]="Why the uncertain tone?";
    response[ 66]="Can't you be more positive?";
    response[ 67]="You aren't sure?";
    response[ 68]="Don't you know?";
    response[ 69]="Are you saying no just to be negative?";
    response[ 70]="You are being a bit negative.";
    response[ 71]="Why not?";
    response[ 72]="Are you sure?";
    response[ 73]="Why no?";
    response[ 74]="Why are you concerned about my<*";
    response[ 75]="What about your own<*";
    response[ 76]="Can you think of a specific example?";
    response[ 77]="When?";
    response[ 78]="What are you thinking of?";
    response[ 79]="Really, always?";
    response[ 80]="Do you really think so?";
    response[ 81]="But you are not sure you<*";
    response[ 82]="Do you doubt you<*";
    response[ 83]="In what way?";
    response[ 84]="What resemblence do you see?";
    response[ 85]="What does the similarity suggest to you?";
    response[ 86]="What other connections do you see?";
    response[ 87]="Could there really be some connection?";
    response[ 88]="How?";
    response[ 89]="You seem quite positive.";
    response[ 90]="Are you Sure?";
    response[ 91]="I see.";
    response[ 92]="I understand.";
    response[ 93]="Why do you bring up the topic of friends?";
    response[ 94]="Do your friends worry you?";
    response[ 95]="Do your friends pick on you?";
    response[ 96]="Are you sure you have any friends?";
    response[ 97]="Do you impose on your friends?";
    response[ 98]="Perhaps your love for friends worries you.";
    response[ 99]="Do computers worry you?";
    response[100]="Are you talking about me in particular?";
    response[101]="Are you frightened by machines?";
    response[102]="Why do you mention computers?";
    response[103]="What do you think machines have to do with your problems?";
    response[104]="Don't you think computers can help people?";
    response[105]="What is it about machines that worries you?";
    response[106]="Say, do you have any psychological problems?";
    response[107]="What does that suggest to you?";
    response[108]="I see.";
    response[109]="I'm not sure I understand you fully.";
    response[110]="Come, come, elucidate your thoughts.";
    response[111]="Can you elaborate on that?";
    response[112]="That is quite interesting.";
    response[113]="Why did you repeat yourself?";
    response[114]="Do you expect a different answer by repeating yourself?";
    response[115]="Come, come, elucidate your thoughts.";
    
    
    
    
    
    response[116]="Please don't repeat yourself!";
    
    loaded = true;			// set the flag as load done



	///////////////////////////////////////////////////////////////
	//***********************************************************//
	//* everything below here was originally in dia_1.html      *//
	//***********************************************************//
	///////////////////////////////////////////////////////////////

	// Chat Bot by George Dunlop, www.peccavi.com
	// May be used/modified if credit line is retained (c) 1997 All rights reserved

	// Put together an array for the dialog

		chatmax = 5;						// number of lines / 2
		chatpoint = 0;
		chatter = new Array(chatmax);

	// Wait function to allow our pieces to get here prior to starting

		function hello(){
			chatter[chatpoint] = "> Hello, I am Eliza."; 
			chatpoint = 1;
			return write();
		}
		function start(){
			for( i = 0; i < chatmax; i++){ chatter[i] = ""; }
			chatter[chatpoint] = "  Loading...";
			document.Eliza.input.focus();
			write(); 			
			if( loaded ){ hello() }
			else { setTimeout("start()", 1000); }
		}

	// Fake time thinking to allow for user self reflection
	// And to give the illusion that some thinking is going on

		var elizaresponse = "";

		function think(){
			document.Eliza.input.value = "";        
			if( elizaresponse != "" ){ respond(); }		
			else { setTimeout("think()", 250); }
		}
		function dialog(){
			var Input = document.Eliza.input.value;	  // capture input and copy to log
			document.Eliza.input.value = "";        
			chatter[chatpoint] = " \n* " + Input;
			elizaresponse = listen(Input);
			setTimeout("think()", 1000 + Math.random()*3000);
			chatpoint ++ ; 
			if( chatpoint >= chatmax ){ chatpoint = 0; }
			return write();
		}
		function respond(){
			chatpoint -- ; 
			if( chatpoint < 0 ){ chatpoint = chatmax-1; }
			chatter[chatpoint] += "\n> " + elizaresponse;
			chatpoint ++ ; 
			if( chatpoint >= chatmax ){ chatpoint = 0; }
			return write();
		}
	// Allow for unprompted response from the engine

		function update(str1,str2){
			chatter[chatpoint] = " \n> " + str1;
			chatter[chatpoint] += "\n> " + str2;
			chatpoint ++ ; 
			if( chatpoint >= chatmax ){ chatpoint = 0; }
			return write();
		}

		function write(){
			document.Eliza.log.value = "";
			for(i = 0; i < chatmax; i++){
				n = chatpoint + i;
				if( n < chatmax ){ document.Eliza.log.value += chatter[ n ]; }
				else { document.Eliza.log.value += chatter[ n - chatmax ]; }
			}
			refresh();
			return false;                              // don't redraw the ELIZA's form!
		}
		function refresh(){ setTimeout("write()", 10000); }  // Correct user overwrites
		
