
var storytitle = "";
var storytext = "";

try {
			cmlObj = new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
			try { cmlObj = new ActiveXObject("Microsoft.XMLHTTP");}
			catch (oc) { cmlObj = null; }
			}

			if(!cmlObj && typeof XMLHttpRequest != "undefined") {
				cmlObj = new XMLHttpRequest();
			}
			
function getData(url) {
		cmlObj.open("GET",url,true); 
		cmlObj.setRequestHeader("Content-Type", "text/xml");
		cmlObj.onreadystatechange = processInit;
		cmlObj.send(null);
	}
	
function loadPrompt(url) {
        cmlObj.open("GET",url,true); 
		cmlObj.setRequestHeader("Content-Type", "text/xml");
		cmlObj.onreadystatechange = processPrompt;
		cmlObj.send(null);
}

function IsValidResponse() {
	//alert(objRequest.readyState+":"+objRequest.status);
	if(cmlObj != null && cmlObj.readyState == 4) { 
	//		if(objRequest.status == 200) {		
				return true;

	//		} 
	}
	return false;
	
	}
	
function processPrompt() {
    SetInnerText("helpcontent",cmlObj.responseText);
    document.getElementById("helpprompt").style.display = "inline";
}

function ProcessScore() {
		return "Score:" + score;
		}
	
function setChapter(chapter) {
    if(IsValidResponse() && chapter ) {
 //     if(cmlObj && cmlObj.responseText && chapter) {
        chapter.process();
        CurrentChapter = chapter;
        if(storytext == "") { storytext = cmlObj.responseText; }
        
        SetInnerText("data",storytext);
        
        if(GetHTMLNode(chapter.id)) {
         SetInnerText("content",GetHTMLNode(chapter.id).innerHTML);
         SetInnerText("chaptitle",chapter.title);
        }
        document.title = storytitle + ": " + chapter.title;
        actions = chapter.actions;
    //    alert(chapter.actions);
        SetInnerText("actions","Actions: "+actions+" / "+chapter.actions);
        SetInnerText("score",ProcessScore());
        if(score == 9) {
            GetHTMLNode("scorelink").style.display = "inline";
            }
        

        
        nextchapter = null;
        for(y=0;y<Chapters.length;y++) {
            z = y + 1;
            if(Chapters[y] == chapter && z < Chapters.length) {
             nextchapter = Chapters[z];
             break;
            }
        }
        
         GetHTMLNode("chapterprompt").style.display = "none";
         SetInnerText("data",""); 
         
         FadeBlueToBlack(document.getElementsByTagName("P")[0]);
         
         if(CurrentChapter.ending == true) {
            GetHTMLNode("chapterprompt").style.display = "inline";
            GetHTMLNode("chapterprompt").innerHTML = "<a onmousedown='Reset();'>Start Again</a>";
            for(i=0; i<document.getElementsByTagName("SPAN").length; i++) {
               if(document.getElementsByTagName("SPAN")[i].id == "finalscore") 
                   {
                    document.getElementsByTagName("SPAN")[i].innerHTML = score;
                    FadeBlueToBlack(document.getElementsByTagName("SPAN")[i]);
                   }
                
                }
                
             for(i=0; i<document.getElementsByTagName("A").length; i++) {
                if(document.getElementsByTagName("A")[i].id == "0code") {
                   document.getElementsByTagName("A")[i].onmouseup(); 
                   break;
                   }
                 }
            }
        
         
         CurrentChapter.process();
         SetSavePoint(CurrentChapter);
        
         }
     
         
           
}

function Reset() {}

//Retrieves an HTML element based on id
function GetHTMLNode(id) {
		if(document.getElementById) {
		   if(document.getElementById(id))
		   { return document.getElementById(id);  }
		}
		return null;
	}

	//Set the inner text of an HTML element. SPAN seems to work best.
	function SetInnerText(id,text) {
		if(GetHTMLNode(id)){GetHTMLNode(id).innerHTML = text;}
	}
	
	//Set the CSS class of an HTML element.  
	function SetCSSClass(id,classname) {
		if(GetHTMLNode(id)){GetHTMLNode(id).className = classname;}
	}

//thanks to quirksmode.org for original script
function handleMOUSEUP()
{
    txt = getHighlight();
    //trim
    if(txt.charAt(txt.length-1) == " ") {txt = txt.substring(0,txt.length-1);}
    if(txt.charAt(0) == " ") { txt = txt.substring(1,text.length); }
    txt = txt.replace("'s","");
	if (txt != "" && document.getElementById('prompt').style.display == "none")        
	   { 
	   CheckForPrompt(txt);
	   ClearHighlight();
	   } else {
	    document.getElementById('prompt').style.display = "none";
	    }
}



function getHighlight() {
if (document.selection) 
	{
		return document.selection.createRange().text;
	}
	else if (window.getSelection)
	{
		return window.getSelection()+""; // Safari Concat Bug
	} 
	else if (document.getSelection)
	{
		return document.getSelection().toString(); 
	}
	else return;
}

function ClearHighlight() {
    if (document.selection) {document.selection.empty();}
    else if (window.getSelection()) {
        body = document.getElementsByTagName("body")[0];
        window.getSelection().collapse(body,0);
        if(window.getSelection().removeAllRanges){
            window.getSelection().removeAllRanges();
            }
        }
    else if (document.getSelection()) {document.getSelection().collapse();}
    
}

function TestDocument(search) {
    bFound = false;
    for(i=0; i<document.getElementsByTagName("P").length; i++) {
        if(document.getElementsByTagName("P")[i].id.indexOf(search) >= 0 &&
           document.getElementsByTagName("P")[i].className == "") {
        bFound = true;
        }
    }
    for(i=0; i<document.getElementsByTagName("SPAN").length; i++) {
        if(document.getElementsByTagName("SPAN")[i].id.indexOf(search) >= 0 &&
           document.getElementsByTagName("SPAN")[i].className == "") {
        bFound = true;
        }
    }    
    return bFound;

}


function AlterIDs(oldid,newid,replace) {
    for(i=0; i<document.getElementsByTagName("P").length; i++) {
        if(document.getElementsByTagName("P")[i].id.indexOf(oldid) >= 0 &&
           document.getElementsByTagName("P")[i].className == "") {
        if(!replace) {
        document.getElementsByTagName("P")[i].id = document.getElementsByTagName("P")[i].id.replace(oldid,newid);
         } else { 
         document.getElementsByTagName("P")[i].id = document.getElementsByTagName("P")[i].id = newid + ABCs.charAt(i);
         }
         
        }
    }
    for(i=0; i<document.getElementsByTagName("SPAN").length; i++) {
        if(document.getElementsByTagName("SPAN")[i].id.indexOf(oldid) >= 0 &&
           document.getElementsByTagName("SPAN")[i].className == "") {
        if(!replace) {
        document.getElementsByTagName("SPAN")[i].id = document.getElementsByTagName("SPAN")[i].id.replace(oldid,newid);
         } else { 
         document.getElementsByTagName("SPAN")[i].id = document.getElementsByTagName("SPAN")[i].id = newid + ABCs.charAt(i);
         }
        }
    }    

}

function CheckDocument(search,holdAge) {
    if (actions == 0) {return;}
    id = "";
    
    for(x=0; x<document.getElementsByTagName("P").length; x++) {
            if(!holdAge 
            && document.getElementsByTagName("P")[x].className == "recent") {
               document.getElementsByTagName("P")[x].className = "old"
            }
    }
    for(x=0; x<document.getElementsByTagName("SPAN").length; x++) {
            if(!holdAge 
            && document.getElementsByTagName("SPAN")[x].className == "recent") {
            document.getElementsByTagName("SPAN")[x].className = "old"
            }
   }
   
   bNodeFound = false;
   for(i=0; i<document.getElementsByTagName("P").length; i++) {
        if(document.getElementsByTagName("P")[i].id.indexOf(search) >= 0 &&
           (document.getElementsByTagName("P")[i].className == "hidden" ||
            document.getElementsByTagName("P")[i].className == "") ) {
           
           document.getElementsByTagName("P")[i].id
           document.getElementsByTagName("P")[i].className = "recent";
           id = document.getElementsByTagName("P")[i].id;
           FadeBlueToBlack(document.getElementsByTagName("P")[i]);
           bNodeFound = true;
           break;
           
           }
    
    }
    
    if(!bNodeFound) {
    for(i=0; i<document.getElementsByTagName("SPAN").length; i++) {
        if(document.getElementsByTagName("SPAN")[i].id.indexOf(search) >= 0 &&
           (document.getElementsByTagName("SPAN")[i].className == "hidden" ||
            document.getElementsByTagName("SPAN")[i].className == "") ) {
           
           document.getElementsByTagName("SPAN")[i].className = "recent";
           id = document.getElementsByTagName("SPAN")[i].id;
           FadeBlueToBlack(document.getElementsByTagName("SPAN")[i]);
           bNodeFound = true;
           break;
           
           }
     }
    }
    
    idcode = id + "code";
    for(i=0; i<document.getElementsByTagName("A").length; i++) {
       
        if(document.getElementsByTagName("A")[i].id == idcode) {
       //  alert(document.getElementsByTagName("A")[i].onmouseup);
         document.getElementsByTagName("A")[i].onmouseup(); 
       //  if(document.getElementsByTagName("A")[i]) {
       //    document.getElementsByTagName("A")[i].onmouseup = Void;
       //    }
        break;
        }
    }
    
    
    if(search != actions) { if( bNodeFound ) { score++; }
                            CheckDocument(actions,true) }
    else {
    actions--;
    SetInnerText("actions","Actions: "+actions+"/"+CurrentChapter.actions);
    SetInnerText("score",ProcessScore());
    document.getElementById("prompt").style.display = "none";
    GetHTMLNode("content").style.opacity="1.0";
    GetHTMLNode("content").style.filter="alpha(opacity=100)";
    FadeBlueToBlack(GetHTMLNode("actions"));
    ClearHighlight();
    }
        
    if(actions == 0) {
        GetHTMLNode("chapterprompt").style.display = "block";
        }
        
   
    
}

function AddToScore(points) {
    score += points;
    FadeBlueToBlack(GetHTMLNode("score"));
}

function Void() {}

function CheckForPrompt(txt) {
    if (actions == 0) {return;}
    bWordFound = false;
    for(i=0;i<Words.length;i++) {
        if(Words[i].phrase == txt) {   
            CreatePrompt(Words[i]);
            bWordFound = true;
            return;
        }
        for(x=0;x<Words[i].synonyms.length;x++) {
			if(Words[i].synonyms[x] == txt) {   
             CreatePrompt(Words[i],Words[i].synonyms[x]);
             bWordFound = true;
             return;
			}
        }
    }
    
    CreatePrompt("you");
 //   if(txt == "you" || txt == "You") { CreatePrompt("you"); }
//    if(!bWordFound) { CheckDocument("wait"); }
}

function StripSpaces(word) {
    tmpstr = "";
    for(z=0;z<word.length;z++) {
        if(word.charAt(z) != " ") {
            tmpstr += word.charAt(z);
        }
    }
    
    return tmpstr;
}

function StripApostrophes(word) {
    tmpstr = "";
    for(zz=0;zz<word.length;zz++) {
        if(word.charAt(zz) != "'") {
            tmpstr += word.charAt(zz);
        }
    }
    
    return tmpstr;
}

function StripNewLines(word) {
    tmpstr = "";
    for(xx=0;xx<word.length;xx++) {
        if(word.charAt(xx) != "\n") {
            tmpstr += word.charAt(xx);
        }
    }
    
    return tmpstr;
}

function CreatePrompt(word,synonym) {
    rtxt = "<UL>";
    ptxt1 = "<LI><a href='javascript:Void()' onmouseup=CheckDocument('";
    ptxt2 = "') style=color:blue;cursor:pointer;cursor:hand;>";
    ptxt3 = "</a>";
    opts = 0;
    
    if(word != "you") { //assuming "you" has no actions
    for(x=0;x<word.actions.length;x++) {
        testword = StripSpaces(word.actions[x]);
        if(TestDocument(testword+word.phrase)) {
         rtxt += ptxt1 + testword+word.phrase + ptxt2
         if(!synonym) {
            rtxt += word.actions[x] + " " + word.phrase + " " + ptxt3 + "<BR>";
            } else {
            rtxt += word.actions[x] + " " + synonym + " " + ptxt3 + "<BR>";
            }
         opts++;
        }
    }
  }
  
 // if(opts > 0 || word == "you") { //default actions
     rtxt += ptxt1 + "wait" + ptxt2 + "wait"+ptxt3+"<BR>";
     if(CurrentChapter.globalVerb) {rtxt += ptxt1 + "wait" + ptxt2 + CurrentChapter.globalVerb +ptxt3+"<BR>";}
     rtxt += "<LI><a href='javascript:Void()' onmouseup='ClearHighlight();ClosePrompt();'>cancel</a></UL>";
     
     document.getElementById("prompt").innerHTML = rtxt;
     document.getElementById("prompt").style.display = "inline";
     GetHTMLNode("content").style.opacity="0.5";
     GetHTMLNode("content").style.filter="alpha(opacity=50)";
    
 //   } else {
 //       ClearHighlight();
   //     CheckDocument("wait");
 //       }
}

function ClosePrompt() {
	document.getElementById("prompt").style.display = "none";
	GetHTMLNode("content").style.opacity="1.0";
}

/* SavePoint Object/Functions must be updated to match the data of the story to work */
SavePoints = new Array();
function SavePoint(chapter,score) {
	this.chapter = chapter;
	this.score = score;
	}

function SetSavePoint() {}


Chapters = new Array();
function Chapter(id,title,actions,alternate,ending,processFunction,globalVerb) {
    this.id = id;
    this.title = title;
    this.actions = actions;
    this.ending = ending;
    if(globalVerb) { this.globalVerb = globalVerb; }
    
    if(processFunction) { this.process = processFunction; }
    else { this.process = ProcessChapter; }
    
    if(!alternate) {Chapters[Chapters.length] = this;}
    
    this.savepoint = new SavePoint();
}

function ProcessChapter() {}

function ListSaves() {
	tmp_str = "<div style='width:400px; border: 1px solid black; padding: 10px; color:#c00;'>Once you rewind to a page, you will lose the progress leading back to the beginning of that page.</div>";
	save_header ="<HR><BR><B>Bookmarks</B><BR>";
	tmp_str += save_header;
	
	for (i=0;i<SavePoints.length;i++) {
		tmp_str += "&raquo; <a href='javascript:RestoreSave("+i+")'>"+SavePoints[i].chapter.title+"</a><BR>";
	}
//	return tmp_str;

	tmp_str += "</div>";
	SetInnerText("helpcontent",tmp_str);
    document.getElementById("helpprompt").style.display = "inline";
}

Words = new Array();
function Word(phrase,actions,synonyms) {
    this.phrase = phrase;
    
    if(!actions) { _actions = "examine"; }
    else {_actions = "examine|" + actions;}
    
    this.actions = _actions.split("|");
    
    if(synonyms) {this.synonyms = synonyms.split("|");}
    else {this.synonyms = new Array();}
    
    Words[Words.length] = this;
}

//"PLAYER" info
score = 0; //total score
actions = 10; //to be set by the chapter



//Color Arrays
blue = new Array();
//blue[0] = "#00F";
//blue[1] = "#00E";
//blue[2] = "#00D";
//blue[3] = "#00C";
//blue[4] = "#006";
//blue[5] = "#005";
//blue[6] = "#004";
//blue[7] = "#003";
//blue[8] = "#002";
//blue[9] = "#001";
//blue[10] = "#000";
blue[0] = "#F00";
blue[1] = "#E00";
blue[2] = "#D00";
blue[3] = "#B00";
blue[4] = "#C00";
blue[5] = "#A00";
blue[6] = "#900";
blue[7] = "#800";
blue[8] = "#700";
blue[9] = "#600";
blue[10] = "#500";
blue[11] = "#400";
blue[12] = "#300";
blue[13] = "#200";
blue[14] = "#100";
blue[15] = "#000";
ABCs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

fadenodes = new Array();
fadesteps = new Array();
sf = "";


function FadeBlueToBlack(fadenode) {
    clearTimeout(sf);
    fadenodes[fadenodes.length] = fadenode;
    fadesteps[fadesteps.length] = 0;
    StepFades();
    }

function StepFades() {
    bContinue = false;
    for(fi=0;fi<fadenodes.length;fi++) {
        if(fadesteps[fi] < 15) {
            fadesteps[fi]++;
            fadenodes[fi].style.color = blue[fadesteps[fi]];
            bContinue = true;
        }
    }
    if(bContinue) {
       sf = setTimeout("StepFades()",100);
    } 
}