/*
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
'_/ Copyright ©2003 WarmStal D!sign
'_/ Text-to-speech utilities
'_/  ZEGTAN VERSION 1.5
'_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

21-01-2004: 	Unloading bij test op defaultcharacter aangepast: hasotherclients geeft true,
					terwijl toch unload nodig is.
21-01-2004:	Verwijderen van jasvascript uit textstroom.
22-01-2004: 	Onderdrukken van achtergrond geluid (bgSound)
29-01-2004:	Rangtelwoorden Fonetische opmaak, Volumenvariatie,
					standaard E-mail context voor  uitspreken getallen.
					Applets: textinhoud.
					Volledig herschreven processing voor verwijderen punten en dubbele pauze's, ?. en !. en :
19-04-2004:   Snelheid= traag toegevoegd
28-03-2007: fix voor IE7: reset style().
*/

// debugging Mode on/off
var debug = false
// start with intro yes/no, default false
var bIntro = false
var introText = "Welkom bij de site internet voor S B O."

// * First check for text-to-speech
var isT2S = testT2S()

// * version
var version = "zegtan 1.5.1"

//=========================================================
// Variables definition
//=========================================================

/// test for characters
var testCharID = new Array( "Peedee", "Merlijn","Geest", "Robby")
var testCharACS = new Array( "peedy.acs","merlin.acs", "genie.acs", "robby.acs")

// * referentie naar het contextmenu dat deze script heeft getriggerd,
//  wordt gevuld door zegtan.html extMen =  "external.menuArguments"
var extMen =""// external.Menuarguments
var extDoc =""// extMen.document
var extEvent   =""// extMen.even
var extVersion =""//set by ext programm, for later use
var extElement=""

//Languages
var LangIDs = new Array()
LangIDs[ "0406"]="Danish"
LangIDs[ "0413"]="Nederlands"
LangIDs[ "0813"]="Belgian (Flemish)"
LangIDs[ "0409"]="Engels"
LangIDs[ "0809"]="British"
LangIDs[ "0C09"]="Australian"
LangIDs[ "1009"]="Canadian"
LangIDs[ "1409"]="New Zealand"
LangIDs[ "1809"]="Ireland"
LangIDs[ "040B"]="Finnish"
LangIDs[ "040C"]="French (Standard)"
LangIDs[ "080C"]="Belgian"
LangIDs[ "0C0C"]="Canadian"
LangIDs[ "100C"]="Swiss"
LangIDs[ "0407"]="German (Standard)"
LangIDs[ "0807"]="Swiss"
LangIDs[ "0C07"]="Austrian"
LangIDs[ "040F"]="Icelandic"
LangIDs[ "0410"]="Italian (Standard)"
LangIDs[ "0810"]="Swiss"
LangIDs[ "0414"]="Norwegian (Bokmal)"
LangIDs[ "0814"]="Norwegian (Nynorsk)"
LangIDs[ "0416"]="Portuguese (Brazilian)"
LangIDs[ "0816"]="Portuguese (Standard)"
LangIDs[ "040A"]="Spain (Standard/Traditional Sort)"
LangIDs[ "080A"]="Mexican"
LangIDs[ "0C0A"]="Spain (Modern Sort)"
LangIDs[ "041D"]="Swedish"
LangIDs[ "041F"]="Turkish"
LangIDs[ "0415"]="Polish"
LangIDs[ "0405"]="Czech"
LangIDs[ "041B"]="Slovak"
LangIDs[ "040E"]="Hungarian"
LangIDs[ "0419"]="Russian"
LangIDs[ "0408"]="Greek"
LangIDs[ "0411"]="Japanese"
LangIDs[ "0412"]="Korean"
LangIDs[ "0000"]="Language-Neutral"
LangIDs[ "0400"]="Process Default Language"


// * Voice parameters
var aVoiceSpeed = new Array (65,80,95,110)
var aVoicePitch = new Array(75,90,105)
var indexSpeed = 1
var indexPitch = 1
var voiceSpeed = "aantal woorden/minuut"
var voicePitch = "toonhoogte in HZ"
var voiceSet = "voice settings"
var maxVol = 65535 //"volume 0 -65535"
var defVol = 53000
var sModeID = ""

//------------------------------------------------------------------------------
// CHARACTER VARS

// * Character Objects
var Char;

// * Variables
var CharID;
var CharACS;
var CharLoaded;
var CharStatus="waiting"

// *Agent Control Events
var speakRequest
var stopSpeakRequest
var LoadReq;
var HideReq;



//=========================================================
// MAIN
//=========================================================

// * Init: Call onLoad
// bolean intro for skipping intro
function init() {
	// * Check for text-to-speech
	if (isT2S){
		readUserSettings()
		initChar()
 		setVoice()
 		setForm()
 		if(bIntro){
     	   		CharIntro()
     	   	}
 	 }
}

//=========================================================
// TEST FUNCTIONS
//=========================================================

// * general Test for text-to-speech
//------------------------------------------------------------------------------
function testT2S(){

	bT2S = false
	if (testEnv()){
		if (testControl()){
			if(testEngine()){
				if (testVoices() > 0) {
					if (testDutch()){
						if (testDefChar()){
						   	bT2S = true
						 }
					}
				}
			}
		}
	}
	return bT2S
}

// Test browser environment
//------------------------------------------------------------------------------
function testEnv(){

	// test windows > 3.1 (windows 32), IE , Explorer >5.0
	if (navigator.appVersion.indexOf("Win") == -1){return false}
       if ( (navigator.appVersion.indexOf("Win16") != -1) || (navigator.appVersion.indexOf("Windows 3.1") != -1) ){return false}
	if (navigator.appName != "Microsoft Internet Explorer"){return false}
	var agt=navigator.userAgent.toLowerCase();
       var is_major = parseInt(navigator.appVersion);
       var is_ie     = ( (agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1) );
        if (!is_ie) {return false}
      	 if (is_ie && (is_major < 4)) {return false}
      	 if (is_ie && (is_major == 4) && (agt.indexOf("msie 4")!=-1) ){return false}
        return true
}

// * Test on agent control version 2
//------------------------------------------------------------------------------
function testControl(){

	var oAC = new ActiveXObject("Agent.Control.2")
	if (oAC) {
		return true
	} else {
		return false
	}
}

// * Test on speakEngine
function testEngine(){
	if (document.DSS){
		return true
	} else {
		return false
	}
}

// * How many voices do we have?
//------------------------------------------------------------------------------
function testVoices(){
	document.DSS.CountEngines
	nVoices = document.DSS.CountEngines
	return nVoices
}

// * Get de TTSModeID's
//------------------------------------------------------------------------------
function getVoices(){
	nVoices = testVoices()
	var selField=document.instelForm.stem
	selField.options.length=0
	selField.options[0]= new Option("-standaardstem-", "default")
	for (i=1;i<=nVoices;i++){
		sStem =parent.document.DSS.Speaker(i)
		sModeID=parent.document.DSS.ModeID(i).toUpperCase()
		selField.options[i] =new Option(sStem,sModeID)
	}
}

// * Is there a voice with the dutch language?
//------------------------------------------------------------------------------
function testDutch(){
	bDutch = false
	// Scan all languages
	nVoices = testVoices()
	for (var i=1;i<=nVoices;i++){
		LangID = document.DSS.LanguageID(i)
		if (LangID == "1043"){
			bDutch = true
		}
	}
	return bDutch
}

// * How many languages?
//------------------------------------------------------------------------------
function testLanguages(){

	nVoices = testVoices()
	nLangCount = 0
	var Langs = new Array()

	for (var i=1;i<=nVoices;i++){
		LangID = document.DSS.LanguageID(i)
		if (Langs[LangID]==undefined){
			Langs[LangID]=1
			nLangCount++
		}
	}
	return nLangCount
}

//Test if one of the specified characters exists
//------------------------------------------------------------------------------
function testChars(){
	AgentControl.Connected = true;
	for (var i=0; i<=testCharID.length-1 ;i++){
		bLoaded = LoadLocalAgent(testCharID[i], testCharACS[i]);
		if (bLoaded){
			AgentControl.Characters.Unload(testCharID[i]);
		return true
		}
	}
}


//Test if there is a default character
//------------------------------------------------------------------------------
function testDefChar(){
	AgentControl.Connected = true;
	bLoaded = LoadLocalAgent("defChar", "");
	//unLoadLocalAgent("defChar")
	if (bLoaded){
	    AgentControl.Characters.Unload("defChar");
		return true
	}
}

//=========================================================
// ZEGTAN PROCESSING FUNCTIONS
//=========================================================

// * Initialize Character object
//------------------------------------------------------------------------------
function initChar(){

	//Initialize the Default Character
	CharID = "Zegtan";
	CharACS = "";
	CharLoaded = false;
	AgentControl.Connected = true;

    if (!CharLoaded){
   		 CharLoaded = LoadLocalAgent(CharID, CharACS);
    }

    if (CharLoaded) {
     	   	SetCharObj();
    }
}

// * Introduction text
//------------------------------------------------------------------------------
function CharIntro(){

	//Show the character
	Char.Show()
	Char.MoveTo(400,400)
	Char.Play("Announce")
	speak(introText)
	Char.Play("Alert")
	speak(specialText)
	Char.Play("Pleased")
}

// * Load a Character
// 	Purpose:  Attempts to load the specified character
// 	Returns:  true if successful, false if not
//------------------------------------------------------------------------------
function LoadLocalAgent(CharID, CharACS) {

	AgentControl.RaiseRequestErrors =false;
	if (CharACS == "") {
	        LoadReq = AgentControl.Characters.Load(CharID);
	} else {
	        LoadReq = AgentControl.Characters.Load(CharID, CharACS);
	}
	AgentControl.RaiseRequestErrors = true;

	if (LoadReq.Status != 1) {
	        return(true);
	}
	return(false);

}

// *  Unload a Character
// 	Purpose: removes the specified character
// 	Only if there are no other apps using it
//------------------------------------------------------------------------------
function unLoadLocalAgent(CharID) {

   // Unload the specified character, if there is no other app using it
  if (!AgentControl.Characters(CharID).HasOtherClients){

     	 AgentControl.Characters.Unload(CharID);
  }
}

// * Define a Character reference
// 	Purpose:  Sets the character reference and TTS Language ID
//------------------------------------------------------------------------------
function SetCharObj() {

	// Object reference
   	Char = AgentControl.Characters.Character(CharID);
   	// Language Dutch
   	Char.LanguageID = 0x413;
   	//  Initialize the Commands menu
   	Char.Commands.RemoveAll();
	Char.Commands.Caption = "Zegtan";
	Char.Commands.Add("Help", "Uitleg over het gebruik van de assistent", "");
	Char.Commands.Add("ACO", "Advanced Character Options", "Advanced Character Options");
	// Setting balloonsize: chars/line = 36 (default =28)
	Char.Balloon.Style = 0x224000F

}

// * Show Character propertiessheet
//------------------------------------------------------------------------------
function showCharProps() {

	AgentControl.ShowDefaultCharacterProperties()

}

// * Read usersettings from Cookie
//------------------------------------------------------------------------------
function readUserSettings(){

	var cookieString=getCookieValue("SET")
	//alert(cookieString)
	if (cookieString){
		alert(cookieString)
		cookieString = cookieString.split("/")
		indexSpeed =cookieString[1]
		indexPitch=cookieString[2]
		sModeID=cookieString[3]
	}
}

// * Write usersettings to Cookie
//------------------------------------------------------------------------------
function writeUserSettings(){

	//get form values
	var form = window.body.instelForm
	indexSpeed = getRadioValue(form.snelheid)
	indexPitch =  getRadioValue(form.toon)
	sModeID = form.stem.options[form.stem.selectedIndex].value
	//write cookie
	//cookieString = indexSpeed+"/"+indexPitch+"/"+sModeID
	//setCookie("SET", cookieString,"/")
	//alert (cookieString)
	//finaly set voice to new values
	setVoice()
}

// * Set voice parms
//------------------------------------------------------------------------------
function setVoice(){

	voiceSpeed= aVoiceSpeed[indexSpeed]
	voicePitch= aVoicePitch[indexPitch]
	voiceSet = "\\Pit="+voicePitch+"\\ "
    voiceSet += "\\Spd="+voiceSpeed+"\\ "
    voiceSet +="\\Vol="+defVol+"\\"
    voiceSet +="\\Ctx='E-mail'\\"

	if (sModeID != ""){
      	 	  	Char.TTSModeID = sModeID
	} else {
	   	//get de current value as default
	   	sModeID=Char.TTSModeID
	}
}

// * Set instelform
//------------------------------------------------------------------------------
function setForm(){

		//set form
		if(!window.body || !window.body.instelForm) { return;}
		var form = window.body.instelForm
		form.snelheid[indexSpeed].checked=true
		form.toon[indexPitch].checked=true

		// Stemmen inlezen
		var nVoices = testVoices()
		var selField=form.stem
		selField.options.length=0
		for (i=1;i<=nVoices;i++){
			var sStem =parent.document.DSS.Speaker(i)
			var sID="{"+parent.document.DSS.ModeID(i).toUpperCase()+"}"
			selField.options[i-1] =new Option(sStem,sID)
			if (sID==sModeID){
			     selField.options[i-1].selected=true
			}
		}
}

//
// ##############################################
// ZEGTAN PROCESSING
//  Process event called on Zegtan in contextmenu
// -------------------------------------------------------------------------------

function processEvent(){

    extElement = extEvent.srcElement
    extStyle = extElement.currentStyle

	if (debug){
			alert("Node: "+extElement.nodeName)
	}

	if(isT2S){
		Char.Show();
		supressSound();
		if (checkSelection()){
		 	processSelection()
		} else {
			processElement(extElement)
		}
	} else
	 	alert("Helaas is uw PC niet geschikt voor de voorleeshulp.\n\nGa naar het algemene deel van www.internetvoorsbo \nen kies voor de 'test uw systeem'-pagina voor meer informatie.")
}

// * Supress sound
//  If there is an bgsound object set volume tot 0
// -------------------------------------------------------------------------------
function supressSound(){
	if (extDoc){
		var soundObjects =extDoc.all.tags("bgsound")
		if (soundObjects){
			for (var i=0; i< soundObjects.length; i++){
				soundObjects[i]. volume= -2000
			}
		}
	}
}

// * Revert sound
//  If there is an bgsound object set volume tot 0
// -------------------------------------------------------------------------------
function revertSound(){
	try
	{
	if (extDoc){
		var soundObjects =extDoc.all.tags("bgsound")
			if (soundObjects){
				for (var i=0; i< soundObjects.length; i++){
				soundObjects[i]. volume= 0
				}
			}
	}
	}
	catch(e)
	{
	//
	}
}

// * processHelp
//  process captured helpbutton for difficult situations
// -------------------------------------------------------------------------------
function processHelp(){
	//extElement = extMen.event.srcElement
	//showObject(extElement)
	processElement(extElement)

	return false
}


// * processOver
//  sets element with onMouseOver event
// -------------------------------------------------------------------------------
function processOver(){
	extElement = extMen.event.srcElement
	return false
}

// * check if there is a selection
// -------------------------------------------------------------------------------
function checkSelection(){

	return (extDoc.selection.type =="Text")
}

// * Process selection
//   Extract to HTML text
// -------------------------------------------------------------------------------
function processSelection(){

	var htmlText = extDoc.selection.createRange().htmlText
	processHtml(htmlText)
}

// * Process element
//   Extract HTML text, and underline text
// -------------------------------------------------------------------------------
function processElement(extElement){

	var htmlText = ""

	if (extElement){

		// alleen underline als er tekst is
		if(extElement.innerHTML){
			accentElement(true);
			htmlText += extElement.innerHTML
		}

		// Bij een plaatje
		if (extElement.nodeName == "IMG"){
			htmlText += extElement.alt
		}

		// Input elementen, buttons, submit etc.
		if (extElement.nodeName == "INPUT"){
			htmlText += extElement.value
		}
    	processHtml(htmlText)
	}
}
// accentuate Element
// for now underlining of the element
// -------------------------------------------------------------------------------
function accentElement(on){
	if(!extElement)
	return;

	if(on) {
		extElement.runtimeStyle.textDecorationUnderline = true;
	} else {
		try {
			extElement.runtimeStyle.textDecorationUnderline = false;
		}
		catch(e) {
			//
		};
	}
}

// * Process HTMLtext
//  convert to readable and speakeble text
// -------------------------------------------------------------------------------
 function processHtml(htmlText){
 	if (debug){
		alert("Version: ["+ version+"] \n INPUT TEXT: ["+htmlText+"]")
	}
	var re = new RegExp
	var remap = "map tag"

	// Processing html Tags
	//---------------------------------------------------
	// Filtering comments
	re=/<\s*!--[^>]*?-->/gi
	htmlText = htmlText.replace(re,"")

	// Filtering scripts
	re = /<\s*script[\s\S]*?<\s*\/script\s*>/gi
	htmlText = htmlText.replace(re,"")

	// Filtering applets, in 3 steps to be shure it's a applet.
	//1. convert parm=text to text
	re= /<\s*param\s*name="text"\s*value="([^"]*)">/gi
	htmlText = htmlText.replace(re,"$1.")
	//2. removing other parms
	re= /<\s*param[^>]*>/gi
	htmlText = htmlText.replace(re,"")
	//3. removing applets
	re = /<\s*applet[^>]*>([^<]*)<\/applet>/gi
	htmlText = htmlText.replace(re,"$1.")

	// Filtering empty paragraphs
	re = /(<\s*p[^>]*>\s*<\s*\/p\s*>\s*)/gi
	htmlText = htmlText.replace(re,"")

	// Replacing non breaking spaces
	re = /(&nbsp;)+/gi
	htmlText = htmlText.replace(re, " ")

	//Raise voice on a heading <Hx>
	re = /<h[1-9][^>]*>\s*/gi
	htmlText = htmlText.replace(re,"\\Vol="+maxVol+"\\\\Emp\\")
	//Medium Pause and Point after a heading </Hx>
	re = /<\/h[1-9][^>]*>/gi
	htmlText = htmlText.replace(re,".\\Pau=600\\\\Vol="+defVol+"\\")

	//Medium Pause and Point after a table row </TR>
	re = /<\/tr[^>]*>/gi
	htmlText = htmlText.replace(re,".\\Pau=590\\")

	//Pause after </td>
	re = /<\s*\/td\s*>/gi
	htmlText = htmlText.replace(re,".\\Pau=580\\")

    //Raise voice on bold <b>
	re = /<b>([\s\S]+?)<\/b>/gi
	htmlText = htmlText.replace(re,"\\Vol="+maxVol+"\\\\Emp\\$1\\Vol="+defVol+"\\")

	// Longpause after double or more line break(s)
	re = /<\s*br\s*>\s*(<\s*br\s*>\s*)+/gi
	htmlText = htmlText.replace(re,".\\Pau=400\\")

	//Convert singel <br> to small pause
	re = /<\s*br\s*>/gi
	htmlText = htmlText.replace(re,".\\Pau=210\\")

	//Pause after and before </p>
	re = /<\s*p[^>]*>/gi
	htmlText = htmlText.replace(re," \\Pau=200\\")
	re = /<\s*\/p\s*>/gi
	htmlText = htmlText.replace(re,".\\Pau=190\\")

	// Remove italic and sup
	re = /<\s*[\/]?i[^>]*>/gi
	htmlText = htmlText.replace(re, "")
	re = /<\s*[\/]?sup[^>]*>/gi
	htmlText = htmlText.replace(re, "")

	// Convert All rest Tags to space
	re = /\s*<\s*[^>]*>\s*/g
	htmlText = htmlText.replace(re, " ")

	if (debug){
		alert("TEXT TAGS REMOVED:["+htmlText+"]")
	}

	//--------------------------------------------------------------
	// Reformatting Text
	//--------------------------------------------------------------

   // Removing double pause, keeping last
	re = /(\s*\.?\s*\\Pau=[0-9]*\\)+(\s*\.*\s*\\Pau=[0-9]*\\\s*\.*)/g
	htmlText = htmlText.replace(re,"$2")

	// Removing leading pause and points
	re = /^\s*\.*\\Pau=[0-9]*\\/g
	htmlText = htmlText.replace(re,"")

	// Removing trailing pause
	re = /\s*\\Pau=[0-9]*\\\s*$/g
	htmlText = htmlText.replace(re,"")

	// Remove double points, including white space
	re = /\s*\.[\.|\s]*/gi
	htmlText = htmlText.replace(re, ".")

	// Remove point after question mark
	re = /\?\s*\./gi
	htmlText = htmlText.replace(re, "? ")

	// Remove point and exclamation mark
	re = /!\s*\./gi
	htmlText = htmlText.replace(re, "! ")

	// Finally remove double white space
	re = /[\s]+/gi
	htmlText = htmlText.replace(re, " ")

	if (debug){
		alert("REFORMATTED TEXT:["+htmlText+"]")
	}

	// Break up long tekst at Pause
	var treshold =400 // drempel voor tekstlengte

	while (htmlText.length > treshold){
		  var pauIndex = htmlText.indexOf("\Pau=", treshold)
		  if (pauIndex == -1){
		  		break
		  } else {
		  	 	tagText(htmlText.substring(0,pauIndex-1))
	            htmlText = htmlText.substring(pauIndex+8)
	 	  }
	}

	 tagText(htmlText)
}

//--------------------------------------------------------------
// speachTagging
//--------------------------------------------------------------
function tagText(htmlText) {


	// Ad space after comma, and emphasis, exept for figures
	re = /([^0-9]),([^0-9])/g
	htmlText = htmlText.replace(re, "$1, \\Emp\\$2")

	// Ad space after colon, emphasis and pauze
	re = /:/g
	htmlText = htmlText.replace(re, ": \\Pau=399\\\\Emp\\")

	// After point rest and emphasis, exept for figures
	re = /\s*\.([^0-9])/g
 	htmlText = htmlText.replace(re, ". \\Pau=198\\\\Emp\\$1")

	if (debug){
		alert("SPEECH TAGGED TEXT: ["+htmlText+"]")
	}

	phoneticOpt(htmlText)
}

//--------------------------------------------------------------
// Phonetic optimization
//--------------------------------------------------------------
function phoneticOpt(htmlText){

    // Replacing '=' to 'is'
	re = /=(?![0-9]{1,5}\\)/g
	remap = '\\Map="is"="="\\'
	htmlText = htmlText.replace(re,remap)

	// Replacing brackets
	re = /\(([^\)]*)\)/g
	remap = '\\Pau=199\\\\Emp\\\\Map="tussenhaaakjes"="("\\\\Pau=199\\\\Emp\\'
 	htmlText = htmlText.replace(re, remap+"$1)")

	// eerste etc
	re = /([0-9]+)e/gi
	while (re.exec(htmlText)) {

			if (RegExp.$1== "1" ) {
			    var insert = '\\Map="eerste"="'+RegExp.$1+'e"\\'

			} else if (RegExp.$1=="3") {
		        var insert = '\\Map="derde"="'+RegExp.$1+'e"\\'

			} else if (RegExp.$1=="8") {
			    var insert = '\\Map="achtste"="'+RegExp.$1+'e"\\'

			} else if (RegExp.$1 >19) {
			    var insert = '\\Map="'+RegExp.$1+'-ste"="'+RegExp.$1+'e"\\'

		    } else {
			    var insert = '\\Map="'+RegExp.$1+'-de"="'+RegExp.$1+'e"\\'
			}
			re.lastIndex += insert.length
			htmlText = RegExp.leftContext+insert+RegExp.rightContext
	}

	if (debug){
		alert("SPEECH OPTIMIZED TEXT: ["+htmlText+"]")
	}

	//-------------------------
	if (htmlText != ""){
		speak(htmlText,1,1)
	} else {
		 Char.Play("Decline")
		 speak("Niks",1,1)
	}

}

//-------------------------------------------------------------------------
// * Speak te text
//  move character if necessary, turn balloon on
// -------------------------------------------------------------------------------
function speak(thisText, bBalloon, bGesture){

	//Balloon on or off
	Char.Balloon.Style = (Char.Balloon.Style | 1)
	if (bBalloon) {
		Char.Balloon.Style = (Char.Balloon.Style | 1)
	} else {
		//Char.Balloon.Style =  (Char.Balloon.Style &  ~1)
	}

	if (bGesture){
		// resposition character?
		// ** move afgeschakeld: laten staan voor later gebruik
		var eventX =extEvent.screenX
		var eventY=extEvent.screenY
		//if (Math.abs(Char.Left - eventX) > 400 || Math.abs(Char.Top - eventY) > 300) {
		// 	Char.MoveTo(eventX,eventY,100)
		//}
		Char.GestureAt(eventX,eventY)
	}

	// speak
	speakText =voiceSet+ thisText
	CharStatus = "speaking"
	speakRequest=Char.Speak(speakText)
}


// * stop Speak
//  	and do something funny
// -------------------------------------------------------------------------------
function stopSpeak(){
	if (CharStatus == "speaking"){
		Char.Stop()
		Char.Balloon.Visible = false
		Char.Balloon.Style = (Char.Balloon.Style &  ~1)
		accentElement(extElement, false);
		stopSpeakRequest=Char.Speak(voiceSet+"\\Emp\\Oke, \\Emp\\Oke, ik stop \\Emp\\al. | "+voiceSet+"ik zeg al \\Emp\\niks meer | "+voiceSet+"\\Emp\\Houd zelf je mond")
		Char.Play("Acknowledge")
	}
	if (CharStatus == "waiting"){
		Char.Stop()
		Char.Play("Confused")
		Char.Balloon.Style = (Char.Balloon.Style &  ~1)
		stopSpeakRequest=Char.Speak(voiceSet+"Wat wil je \\Emp\\nu? \\Emp\\Ik ben al stil |"+voiceSet+" Je muis kietelt me | "+voiceSet+"\\Emp\\Hee, rustig \\Emp\\aan een beetje ")
	}
}

// * handle Requests
//  	and do something
// -------------------------------------------------------------------------------

function handleRequest(RequestObject) {

	if (RequestObject == speakRequest){
		accentElement(false)
		revertSound()
		CharStatus="waiting"
	}
	if (RequestObject == stopSpeakRequest){
		CharStatus="waiting"
	}

}

// * help
//  do something
// -------------------------------------------------------------------------------

function showHelp() {

	//Show the character
	Char.Show()
	Char.MoveTo(400,400)
	var Text = "Je wilt dus meer weten. Welnu, de volgende zaken zijn belangrijk als je mij aan het werk wilt zetten."
	speak(Text)
	Char.Play("Alert")
	Text = "Ik kan een deel van de pagina voorlezen op twee manieren.\\Pau=400\\"
	Text += "1. Selecteer een deel van de \\Emp\\tekst met de muis. Klik dan met de rechter-muis-knop en kies «Zegtan» .\\Pau=400\\"
	Text += "2. Klik met de rechter-muis-knop ergens op de pagina en kies «Zegtan» . De ge-selecteerde tekst wordt onderstreept."
	speak(Text)
	Text = "Ik doe mijn werk op elke website \\Emp\\die je vanaf hier bezoekt. Maar je moet dan \\Emp\\deze site \\Emp\\niet afsluiten"
	speak(Text)
	Char.Play("GetAttention")
	Text = "Maar ik kan nog meer!\\Pau=400\\"
	speak(Text)
	Char.Play("Pleased")
	Text = "Je kunt ook \\Emp\\tekst laten voorlezen die achter figuren of links zit. Doe dit door er op te klikken met de rechter-muis-knop, of door te selecteren."
	speak(Text)
	Char.Play("Suggest")
	Text = "En nog even dit.\\Pau=400\\"
	Text += "Als ik te veel praat, dubbel klik dan op mijn buik. Ik beloof dat ik dan stop."
	Text += "En als ik in de weg sta kun je me gewoon verslepen."
	Text += "Verder kunt je me instellen met het menu onder de prikker knop."
	speak(Text)
	Text = "Bedankt voor het luisteren en op een goede samenwerking."
	speak(Text)
	Char.Play("Greet")
}

