Eliza



Eliza

ELIZA: a very basic chatbot

Talk to Eliza by typing your questions and answers in the input box.

TYPE HERE

Credit: This javascript version of ELIZA was originally written by Michael Wallace and enhanced by George Dunlop.

<p>&nbsp;</p>

<!-- saved from url=(0041)https://web.njit.edu/~ronkowit/eliza.html -->

<html><grammarly-extension data-grammarly-shadow-root="true" style="position: absolute; top: 0px; left: 0px; pointer-events: none;" class="cGcvT"></grammarly-extension><grammarly-extension data-grammarly-shadow-root="true" style="mix-blend-mode: darken; position: absolute; top: 0px; left: 0px; pointer-events: none;" class="cGcvT"></grammarly-extension><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="About the early chatbot called ELIZA" content="Eliza chatbot">
<title>Eliza</title>
<script src="./Eliza, a chatbot therapist_files/jquery.min.js.download" type="text/javascript"></script>
<script language="JavaScript"><!-- 

  // 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 "It is nice to be chatting with you." } 
				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( "ELIZA",    		63, 63);
    keyword[25]=new key( "TODAY",       		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);
    keyword[37]=new key( "HELLO", 	        117, 118);
	keyword[37]=new key( "OKAY", 	        83, 119);

    response[  0]="I'll have to get back to you on that<*";
    response[  1]="Don't you believe that I can<*";
    response[  2]="Is it that you would like to be able to<*";
    response[  3]="Do I hear you saying that you want me to be able to<*";
    response[  4]="I'm not convinced that you truly want to<*";
    response[  5]="Hmmm... you want to be able to<*";
    response[  6]="What makes you think I am<*";
    response[  7]="Does it please you to think that I am<*";
    response[  8]="Perhaps you would like to be<*";
    response[  9]="I'm getting the sense that sometimes you actually 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 one day 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... Let's move on to something else for a bit. <*";
    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]="We don't need names here.";
    response[ 50]="No need for names in our session. Continue";
    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]="Interesting. What does that dream suggest to you?";
    response[ 60]="Do you often remember your dreams?";
    response[ 61]="Are there certain people who regularly appear in your dreams?";
    response[ 62]="Do your dreams disturb you or feel more like nightmares?";
    response[ 63]="What would you like to discuss in this session?";
    response[ 64]="You don't seem quite certain. Am I correct?";
    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 and that won't help us move forward.";
    response[ 71]="Why not?";
    response[ 72]="Are you sure?";
    response[ 73]="Why no?";
    response[ 74]="Why are you so 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]="You see a resemblence here? Interesting. Care to go deeper with that?";
    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 about that?";
    response[ 91]="I see. Let's explore that a bit more.";
    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 say things to you thay seem unfriendly?";
    response[ 96]="Are you sure your friends are truly friends?";
    response[ 97]="Perhaps you impose on these people. Is that a possibilty?";
    response[ 98]="Perhaps your love for people actually worries you.";
    response[ 99]="Do computers make you uncomfortable?";
    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 inanimate things have to do with your problems?";
    response[104]="Don't you believe technology can help people?";
    response[105]="What is it about technology that worries you?";
    response[106]="Would you say that you have psychological problems?";
    response[107]="What does that suggest to you?";
    response[108]="I see. Let's try another topic and we will come back to that issue later.";
    response[109]="I'm not sure I understand you fully.";
    response[110]="I think you are blocking what you really want to say.";
    response[111]="Can you elaborate on that?";
    response[112]="That is an interesting response. Let me make anote of that for next time.";
    response[113]="Okay, now you're repeating yourself. That is not moving us forward.";
    response[114]="Do you really expect a different answer if you keep repeating yourself?";
    response[115]="Let's take a moment here. Think about what you just said and try to rephrase it a bit more specifically.";
    response[116]="Again? We need to move on.";
	response[117]="And hello to you.";
    response[118]="I am pleased to work with you today. Shall we chat?";
	response[119]="Good. What else do you want to tell me?";
	
    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. I'll be your therapist today."; 
		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

	

// --></script>
<link rel="stylesheet" href="./Eliza, a chatbot therapist_files/station.css">
</head>
<body onload="start();" bgcolor="#FFFFFF" data-new-gr-c-s-check-loaded="14.1022.0" data-gr-ext-installed="" data-new-gr-c-s-loaded="14.1022.0">



<h1>ELIZA: a very basic chatbot</h1>

<br>
 
<div style="float:left; margin-right:10px;">
<script type="text/javascript"><!--
google_ad_client = "pub-5782868064860207";
google_ad_width = 336;
google_ad_height = 280;
google_ad_format = "336x280_as";
google_ad_type = "text_image";
google_ad_channel ="";
google_color_border = "000000";
google_color_bg = "EEEEEE";
google_color_link = "0033FF";
google_color_url = "0066CC";
google_color_text = "000000";
//--></script>
<script type="text/javascript" src="./Eliza, a chatbot therapist_files/f.txt">
</script></div>
<p>
  
</p>
<table cellspacing="0" cellpadding="2" border="0" align="center" class="neurotoy">
	<tbody><tr><th bgcolor="#ffffff" align="left">
		<font color="#00000">Talk to Eliza by typing your questions and answers in the input box.</font>
  </th></tr>
  	<tr><td bgcolor="#0097FF">
    	<form name="Eliza" onsubmit="return dialog();">
      	<textarea rows="18" cols="75" name="log" spellcheck="false"></textarea>
      	<center><font color="#000000"><br>TYPE HERE</font>
		  <input type="text" size="65" name="input" value=""></center>
    	</form>
  	</td></tr>
</tbody></table>

<hr>
<p>
 
<br>
<br><br>


<br>

<p align="center">Credit: This javascript version of ELIZA was originally written by Michael Wallace and enhanced by George Dunlop.</p> 
</body><grammarly-desktop-integration data-grammarly-shadow-root="true"></grammarly-desktop-integration><grammarly-mirror data-grammarly-shadow-root="true" class="cGcvT"></grammarly-mirror></html>

 

Eliza

ELIZA: a very basic chatbot


Talk to Eliza by typing your questions and answers in the input box.

TYPE HERE





Credit: This javascript version of ELIZA was originally written by Michael Wallace and enhanced by George Dunlop.

แปล »