var current_GPC=new Array;
var known_GPCs=new Array;
var aSourceArrays=new Array;
var matched_gpc_words=new Array;
var regGPCwords;
var processedWords=new Array;
var current_array=new Array;
var wordsInTable='';
var aPhonemeGroups=new Array();
var user_name='';

function run(){
	choose_the_arrays();
	groupGPCsByPhonemes(known_GPCs);
	if(document.getElementById('showAllVocab').checked==false){
		select_gpc_words_from_arrays(current_GPC,known_GPCs);
	} else{
		select_gpc_words_from_arrays(known_GPCs,known_GPCs);
	}
	processedWords.length=0;
	displayList(matched_gpc_words);
}
function select_gpc_words_from_arrays(aSource,aCriteria){
	construct_source_array_names(aSource);
	matched_gpc_words.length=0;
	create_regexp_from_known_gpcs(aCriteria);
	for(ca in current_array){
		for(i in aSourceArrays){
			var gpc_words=current_array[ca][aSourceArrays[i]];
			for(s in gpc_words){
				var reject=0;
				var one_gpc_word=gpc_words[s].split(',');
				for(gpc in one_gpc_word){
					if(one_gpc_word[gpc]!=one_gpc_word[gpc].match(regGPCwords,"g")){
						reject=1;
						break;
					}
				}
				if(reject==0){
					word_exists=0;
					for(i in matched_gpc_words){
						if(matched_gpc_words[i]==gpc_words[s]){
							word_exists=1;
						}
					}
					if(word_exists==0){
					matched_gpc_words.push(gpc_words[s]);
					}
				}
			}
		}
	}
}
function construct_source_array_names(aSource){
	var syllables=document.getElementsByName('syllable_length');
	aSourceArrays.length=0;
	for(var i in aSource){
		for(s=0; s<syllables.length; s++){
			if(syllables[s].checked==true){
				if(/\,/.test(syllables[s].value)==false){
					aSourceArrays.push(aSource[i]+syllables[s].value);
				}
				if(/\,/.test(syllables[s].value)==true){
					var a=syllables[s].value.split(',');
					for(j in a){
						aSourceArrays.push(aSource[i]+a[j]);
					}
				}
			}
		}
	}
}
function create_regexp_from_known_gpcs(aItems){
	var regString='\\b('+aItems.join('|')+')\\b';
	regGPCwords=new RegExp(regString,"g");
}
function addUniqueItemsToArray(Recipient,Donor){
	var found=0;
	for(var d in Donor){
		for(var r in Recipient){
			if(Donor[d]==Recipient[r]){
				found=1;
				break;
			}
		}
		if(found==0){
			Recipient.push(Donor[d]);
		}
	}
}
function addItemsToArray(ArrayName,Items){
	var aItem=new Array;
	var found=0;
	aItem=Items.split(',');
	for(var a in aItem){
		for(var i in ArrayName){
			if(aItem[a]==ArrayName[i]){
				found=1;
				break;
			}
		}
		if(found==0){
			ArrayName.push(aItem[a]);
		}
	}
}
function removeItemfromArray(ArrayName,Items){
	var aItem=new Array;
	var found=0;
	aItem=Items.split(',');
	for(var a in aItem){
		for(var i in ArrayName){
			if(aItem[a]==ArrayName[i]){
				ArrayName.splice(i,1);
			}
		}
	}
}
function inArray(item,arrayName) {
	for(var i in currentArray) {
		if(item==currentArray[i]){
			return 1;
		}
	}
	return 0;
}
function add_gpc(items){
	var found=0;
	current_GPC.length=0;
	if(document.getElementById(items).checked==true){
		addItemsToArray(known_GPCs,items);
		addItemsToArray(current_GPC,items);
	}
	if(document.getElementById(items).checked==false){
		removeItemfromArray(known_GPCs,items);
		removeItemfromArray(current_GPC,items);
		if(known_GPCs.length>1){
			addItemsToArray(current_GPC,known_GPCs[known_GPCs.length-1]);
		}
	}
	run();
}
function displayList(aSeq){
	var highlight=document.getElementById('highlightGPC');
	var randomize=document.getElementById('randomize');
	var wordList=new Array;
	if(randomize.checked==true){
		wordList=aSeq.sort(randOrd);
	} else{
		wordList=aSeq;
	}
	var gpc=new Array;
	var graphemic_word='';
	var graphemic_wordlist=new Array;
	var cur=new Array;
	var lexeme=new Array;//gets displayed in Tooltip dictionary lookup
	if(current_GPC[0]!=undefined){
		cur=current_GPC[0].split('_');
	} else{
		cur='';
	}
//	if(wordList.length>0){
//		var focus_GPC=new Array;
//		var found=0;
//		for(w in wordList){
//			gpc=wordList[w].split(',');
//			for(var i=0; i<gpc.length; i++){//eg: s_s, ae_a-e
//				//now we need to pick one out of potentially several items in current_GPC array (eg. for case associations or multiple focus GPCs)
//				for(var c in current_GPC){
//					if(gpc[i]==current_GPC[c]){
//						focus_GPC[0]=current_GPC[c];
//					}
//				}
//				if(gpc[i]==focus_GPC[0]){//for GPCs in focus
//					if(/_/.test(gpc[i])==true){//if current_GPC has an underscore
//						var g=gpc[i].split('_');
//						if(/-/.test(g[1])==false){//if current_GPC does not have a split digraph
//							if(highlight.checked==true){
//								graphemic_word+='<span class="focus">'+g[1]+'</span>';
//							} else{
//								graphemic_word+=g[1];
//							}
//						} else{//if current_GPC has split digraph
//							var sd=g[1].split('-');//sd=split digraph
//							if(highlight.checked==true){
//								graphemic_word+='<span class="focus">'+sd[0]+'</span>';
//								gpc[i+1]+='<span class="focus">'+sd[1]+'</span>';
//							} else{
//								graphemic_word+=sd[0];
//								gpc[i+1]+=sd[1];
//							}
//						}
//					} else{//if current_GPC does not have an underscore
//						if(highlight.checked==true){
//							graphemic_word+='<span class="focus">'+gpc[i]+'</span>';
//						} else{
//							graphemic_word+=gpc[i];
//						}
//					}
//				} else{//for known_GPCs
//					if(/_/.test(gpc[i])==true){//if GPC has an underscore
//						var g=gpc[i].split('_');
//						if(/-/.test(g[1])==false){
//							graphemic_word+=g[1];
//						} else{//has split digraph
//							var sd=g[1].split('-');//sd=split digraph
//							graphemic_word+=sd[0];
//							gpc.splice(i+2,0,sd.join('_'));//insert rejoined sd as new item in array
//						}
//					} else{//if GPC does not have an underscore
//						graphemic_word+=gpc[i];
//					}
//				}
//			}
//		graphemic_wordlist.push(graphemic_word);
//		graphemic_word='';
//		}
//	wordList=graphemic_wordlist;
//	}
	if(wordList.length>0){
		var temp=new Array;
		var splitD='';//second part of split digraph
		for(w in wordList){//words are in expanded or simple GPC form
			lexeme[w]='';
			gpc=wordList[w].split(',');
			for(var l=0; l<gpc.length; l++){//eg: s_s, ae_a-e
				if(gpc[l]==current_GPC){//'focus' GPCs
					var g=gpc[l].split('_');
					if(/-/.test(g[1])==false){
						if(highlight.checked==true){
							graphemic_word+='<span class="focus">'+g[1]+'</span>';
							lexeme[w]+=g[1];
						} else {
							graphemic_word+=g[1];
							lexeme[w]+=g[1];
						}
					} else {//has split digraph
						var sd=g[1].split('-');//sd=split digraph
						if(highlight.checked==true){
							graphemic_word+='<span class="focus">'+sd[0]+'</span>';//add first part of split digraph to graphemic word
							lexeme[w]+=sd[0];//add first part of split digraph to lexeme
							splitD=sd[1];//store second part of split digraph for later re-insertion
						} else {
							graphemic_word+=sd[0];//add first part of split digraph to graphemic word
							gpc[l+1]+=sd[1];//add second part of split digraph to next array item
							lexeme[w]+=sd[0];
						}
					}
				} else {//non-focus GPCs
					var g=gpc[l].split('_');
					if(/-/.test(gpc[l])==false){
						graphemic_word+=g[1];
						lexeme[w]+=g[1];
						if(splitD!='') {
							lexeme[w]+=splitD;
							graphemic_word+='<span class="focus">'+splitD+'</span>';//add second part of split digraph to graphemic word
							splitD='';//empty splitD
						}
					} else {//has split digraph
						var sd=g[1].split('-');//sd=split digraph
						graphemic_word+=sd[0];
						gpc.splice(l+2,0,sd.join('_'));//insert rejoined sd as new item in array
						lexeme[w]+=sd[0];
					}
				}
			}
		graphemic_wordlist.push(graphemic_word);
		graphemic_word='';
		}
	wordList=graphemic_wordlist;
	}
//********
	for(var w in wordList){
		//processedWords.push('<span class="w">'+wordList[w]+'</span>');
		var def='';
		if(lexiconE[lexeme[w]]) {//extract definitions from lexicon for tooltip requires wz_tooltip.js from http://www.walterzorn.com
			var word=lexiconE[lexeme[w]];
			if(word[0])  def+='<span class=&quot;sn&quot;>'   + word[0]+ '.&nbsp;</span>';//sense number
			if(word[1])  def+='<span class=&quot;ps&quot;>['  + word[1]+ ']&nbsp;</span>';//part of speech
			if(word[2])  def+='<span  class=&quot;def&quot;>' + word[2]+ '</span>';// doesn't work yet: <span onmouseover=&quot;alert'+'(\&#39;hello world\&#39;)'+'&quot;><img src=&quot;graphics\/sound.gif&quot; /></span>';//definition //&quot;SpeakText&#40;\''+word[2]+'\',1&#41;&quot;
			if(word[3])  def+='<span  class=&quot;ex&quot;>'  + word[3]+ '</span>';//sample sentence
			if(word[4])  def+='<span class=&quot;sn&quot;>'   + word[4]+ '.&nbsp;</span>';
			if(word[5])  def+='<span class=&quot;ps&quot;>['  + word[5]+ ']&nbsp;</span>';
			if(word[6])  def+='<span  class=&quot;def&quot;>' + word[6]+ '</span>';
			if(word[7])  def+='<span  class=&quot;ex&quot;>'  + word[7]+ '</span>';
			if(word[8])  def+='<span class=&quot;sn&quot;>'  + word[8]+ '.&nbsp;</span>';
			if(word[9])  def+='<span class=&quot;ps&quot;>[' + word[9]+ ']&nbsp;</span>';
			if(word[10]) def+='<span  class=&quot;def&quot;>'+word[10]+ '</span>';
			if(word[11]) def+='<span  class=&quot;ex&quot;>' +word[11]+ '</span>';
			if(word[12]) def+='<span class=&quot;sn&quot;>'  +word[12]+ '.&nbsp;</span>';
			if(word[13]) def+='<span class=&quot;ps&quot;>[' +word[13]+ ']&nbsp;</span>';
			if(word[14]) def+='<span  class=&quot;def&quot;>'+word[14]+ '</span>';
			if(word[15]) def+='<span  class=&quot;ex&quot;>' +word[15]+ '</span>';
			if(word[16]) def+='<span class=&quot;sn&quot;>'  +word[16]+ '.&nbsp;</span>';
			if(word[17]) def+='<span class=&quot;ps&quot;>[' +word[17]+ ']&nbsp;</span>';
			if(word[18]) def+='<span  class=&quot;def&quot;>'+word[18]+ '</span>';
			if(word[19]) def+='<span  class=&quot;ex&quot;>' +word[19]+ '</span>';
		} else {
			def='Sorry, no definition is available for this word.';
		}
		var TipParameters="\', WIDTH, 300, TITLE, \'<span class=&quot;lx&quot;>"+lexeme[w]+"</span>\', SHADOW, true, STICKY, 1, CLOSEBTN, true, CLICKCLOSE, true";//FADEIN, 300, FADEOUT, 300,
		var temp='<a href="#" onclick="Tip(\''+def+TipParameters+')"  class="w">'+wordList[w]+'</a>' ; //onmouseout=\"UnTip()\"
		processedWords.push(temp);
	}
	put_vocab_into_table(processedWords);
	document.getElementById('multi-column').innerHTML=wordsInTable;
	document.getElementById('current_vocab').innerHTML='Current Vocabulary: '+matched_gpc_words.length;
	if(document.getElementById('showAllVocab').checked==false){
		document.getElementById('page_title').innerHTML='The focus is on: '+ cur[1]+ '&nbsp;&nbsp;&nbsp;<a href="#" onclick="soundManager.onload(); soundManager.createSound('+ "'"+ cur[0]+ "'"+ ",'sound/"+ cur[0]+ ".mp3'); soundManager.play('"+ cur[0]+ "');"+ '" ><img src="graphics\/sound.gif" /></a>';
	} else{
		document.getElementById('page_title').innerHTML='Cumulative word list for '+known_GPCs.length+' lessons';
	}
	createCookie(user_name+'sequence',known_GPCs.join(),365);
}
function randOrd(a,b){
	return (Math.round(Math.random())-0.3);
}
function put_vocab_into_table(aItems){
	var col=0;
	var table='\n<table class="vocab" cellspacing="0" cellpadding="0" style="width: 100%">\n\t<tbody>';
	var cols=document.getElementsByName('col');
	for(i=0;i<cols.length;i++){
		if(cols[i].checked==true){
			col=parseInt(cols[i].value);
		}
	}
	var rows=Math.ceil(aItems.length/col);
	var i=0;
	while(i<aItems.length){
		for(r=0; r<rows; r++){
			table+='\n\t<tr>';
			if(aItems[i]==null) aItems[i]='&nbsp;';
			for(td=0; td<col; td++){
				if(aItems[i]==null) aItems[i]='&nbsp;';
				table+='\n\t\t<td>'+aItems[i]+'</td>';
				i++;
			}
		}
		table+='</tr>';
	}
	wordsInTable=table+'\n\t</tbody>\n</table>\n';
}
function unselect_known_letters(aItems){
	var checkboxes=document.getElementById('gpcs');
	for(gpc=0;gpc<checkboxes.length;gpc++){
		for(i in aItems){
			if(checkboxes[gpc].value==aItems[i] && checkboxes[gpc].checked==true){
				document.getElementById('gpcs')[gpc].checked=false;
			}
		}
	}
}
function setStyleById(i, p, v){
	var n=document.getElementById(i);
	n.style[p]=v;
}
function choose_the_arrays(){
	current_array.length=0;
	var ca=document.getElementsByName('list_selector');
	for(a=0; a<ca.length; a++){
		if(ca[a].checked==true){
			var sArray=ca[a].value;
			switch(sArray){
				case 'seq1': current_array.push(seq1); break;
				case 'seq2': current_array.push(seq2); break;
				case 'seq3': current_array.push(seq3); break;
				case 'seq4': current_array.push(seq4); break;
			}
		}
	}
}
function createCookie(name,value,days){
	if (days){
		var date=new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires="; expires="+date.toGMTString();
	} else{
		var expires="";
	}
	document.cookie=(name+"="+value+expires+"; path=/");
}
function readCookie(name){
	var nameEQ=name+"=";
	var ca=document.cookie.split(';');
	for(var i=0;i<ca.length;i++){
		var c=ca[i];
		while (c.charAt(0)==' ') c=c.substring(1,c.length);
		if (c.indexOf(nameEQ)==0){
			var what=new Array;
			what=c.split('=');
			known_GPCs=what[1].split(',');//populate known_GPCs array
		}
	}
	if(known_GPCs.length>1){//fill current_GPC array with last item in known_GPCs array
		current_GPC[0]=known_GPCs[known_GPCs.length-1];
	} else{
		current_GPC[0]=known_GPCs[0];
	}
	var checkboxes=document.getElementById('gpcs');
	for(i in known_GPCs){//select checkboxes based on known_GPCs
		for(c=0; c<checkboxes.length; c++){
			if(checkboxes[c].value==known_GPCs[i]){
				checkboxes[c].checked=true;
			}
		}
	}
}
function eraseCookie(name){
	unselect_known_letters(known_GPCs);
	createCookie(user_name+name,'',-1);
	known_GPCs.length=0;
	window.location.reload();
}
function onLoad(){
	readCookie('sequence');
	run();
}
function writingExercise(aList,focusGPC){
	//parameters: wordlist array name, row number
	//this function prints a word and dotted lines for writing practise
var htmlTop="<html>\n<head>\n<title>Sounds of English Wordlist Writing Exercise</title>\n<style type='text/css'>.lines{background-image: url(graphics/dotted_lines.gif);background-repeat: repeat-x;background-position: left center;height: 50px;width: 600pt;}.w{padding-right: 5px;text-align: right;font-family: 'Andika DesRev F',Arial,Helvetica,sans-serif;font-weight: inherit;vertical-align: middle;font-size: 24pt;}.page_break{page-break-before:always;display:block;} h1{font-size:18pt; margin: 0; padding:0;}</style>\n</head>\n<body>\n";
	var pageTitle="<h1>Focus on the letter(s):&nbsp;&nbsp;<span class='focus'><b>"+focusGPC+"</b></span></h1>\n";
	var htmlBottom="</body>\n</html>";
	var page=''; //this variable contains the html code for the whole page
	var col=1;
	page=htmlTop+pageTitle;
	if(aList.length!=0){//if the wordlist is not empty
		var words_per_page=15;
		var counter=0;
		page+="\n<table cellpadding='0' cellspacing='0' border='0' style='width:100%; height:720pt;'>\n";
		for(var w in aList){//for every word in the list
			if(counter==words_per_page){
				page+="</table>\n<div class='page_break'>&nbsp;</div>\n";
				page+=pageTitle;
				page+="\n<table cellpadding='0' cellspacing='0' border='0' style='width:100%; height:720pt;'>\n";
				counter=0;
			}
			page+="\t<tr>\n";
			page+="\t\t<td class='w'>"+aList[w]+"</td>";
			page+="<td class='lines'>&nbsp;</td>\n";
			page+="\t</tr>\n";
			counter++;
		}
		page+="</table>\n";
	}
	page+=htmlBottom
	dopopup(page);
}

function dopopup(page){
	var generator=window.open('','hello','menubar=yes,resizable=yes,height=600,toolbars=1,width=750,scrollbars=1');
	//generator.document.open();
	generator.document.write(page);
	generator.document.close();
	return true;
}
function groupGPCsByPhonemes(items){
//this function groups GPCs by their phonemes
//input parameter is an array of GPCs, usually the known_GPCs
	for(var a in aPhonemeGroups) {
		aPhonemeGroups[a].length=0;
	}
	//aComplexLevel.length=0;
	document.getElementById('phonemes').innerHTML='';
	for(var i in items){
		var temp=items[i].split('_');
		if(!aPhonemeGroups[temp[0]]){
			aPhonemeGroups[temp[0]]=new Array;//create new sub-array
		}
   		addItemsToArray(aPhonemeGroups[temp[0]],items[i]);//add GPC to new sub-array
	}
	//aPhonemeGroups is now populated by GPCs grouped by phonemes
	var phonemeText='Complex Code<br />';//starting text
	for(var p in aPhonemeGroups){//now we check to see how long each sub-array is
		if(aPhonemeGroups[p].length>1){//if greater than 1
			//phonemeText+=aPhonemeGroups[p].join()+'<br />';
			phonemeText+='<input id="p'+p+'" name="phonemes" value="p'+p+'" onclick="doComplexLevel(\''+aPhonemeGroups[p]+'\',\'p'+p+'\');" type="checkbox" /><label for="">'+aPhonemeGroups[p]+'</label><br />\n';
		}
	}
	phonemeText+='';//trailing text
	//aComplexLevel is now an array with GPCs grouped by phonemes which have more than 1 GPC in them
	//this makes them available to do complex level reading which groups words together that have the
	//same sound but different graphemic representation.
	document.getElementById('phonemes').innerHTML=phonemeText;
}

function doComplexLevel(items,checkboxP) {
	for(a=0; a< document.getElementsByName('phonemes').length; a++){
		//alert(checkboxP+'  '+document.getElementsByName('phonemes')[a].value);
		if(document.getElementsByName('phonemes')[a].value != checkboxP && document.getElementsByName('phonemes')[a].checked==true) {
			document.getElementsByName('phonemes')[a].checked=false;
		}
	}
	current_GPC=items.split(',');
	document.getElementById('randomize').checked=true;
	select_gpc_words_from_arrays(current_GPC,known_GPCs);
	processedWords.length=0;
	displayList(matched_gpc_words);
}

//This next function enables Text to Speech synthesis in Windows
//download url for Sapi: http://msdn.microsoft.com/en-us/library/ms723627.aspx
//var VoiceObj = new ActiveXObject("Sapi.SpVoice");
function SpeakText(text,num) {
VoiceObj.Speak(text,num);
}
function display_login(){
	document.getElementById('login_area').innerHTML='<textarea id="login_name" rows="1" cols="15" scrolling="no" ></textarea>'+
	'&nbsp;<input id="login_button" type="button" value="Login" onclick="log_me_in();"/>&nbsp;<input id="cancel_button" type="button" value="Cancel" onclick="logout();" />';
	document.getElementById('login_name').focus();
}
function log_me_in(){
	//var user_name='';
	user_name=document.getElementById('login_name').value+'_';
	if(user_name != ''){
		document.getElementById('login_area').innerHTML='Logged in as: '+ user_name + '&nbsp;&nbsp;<span id="logout" class="logout" onclick="logout();">[ Log out ]</span>';
	} else {
		logout();
	}
}
function logout(){
	document.getElementById('login_area').innerHTML='<span id="login_label" onclick="display_login();" >Login</span>';
	user_name='';
}
