function Pager(pageSize) {
	var _this = this;
	
	this.prevButton = Element.construct(['img',{'src':'/images/common/prevpage.gif','onclick':function(){_this.prevPage()}}]);
	this.nextButton = Element.construct(['img',{'src':'/images/common/nextpage.gif','onclick':function(){_this.nextPage()}}]);
	
	var pages = new Array(11);
	this.pageNumbers = Element.construct(['span',{'class':'pageNumbers'}]);
	this.currentPage = 0;
	this.pageCount =0;
	
	
	this.type='';
	this.resultCount=0;
	
	this.progress = Element.construct(['span',{'class':'pageProgressNote'}],'');
	var selectChange= function() {_this.setPageSize(parseInt(this.value))};
	var pageSizeSelector = Element.construct(['select',{'onchange':selectChange},[
		['option',{'value':5},'5 words/page'],
		['option',{'value':10},'10 words/page'],
		['option',{'value':25},'25 words/page'],
		['option',{'value':50},'50 words/page'],
		['option',{'value':100},'100 words/page'],
		['option',{'value':10000},'All Words']
	]]);
	
	var pageContainer = Element.construct(['div',{'class':'pageSelector'},[
							this.prevButton,
							this.pageNumbers,
							this.nextButton,
							this.progress
						 ]]);
						 
	var pageSSContainer = Element.construct(['div',{'class':'pageSizeSelector'},[
								['span',{},'show:'],
								pageSizeSelector
						 ]]);
						 			
	this.element = Element.construct(['div',{'class':'pager'},[
						pageContainer,
						pageSSContainer,
						['div',{'class':'clearer'}] 	
				   ]]);
	
	var pageOffset=0;
	
	var pageClick = function() {
		_this.setPage(pageOffset + this.index);	
		return false;		
	}			
	var createPageButton = function(i) {
		var p= Element.construct(['div',{'class':'pageNumber','onclick': pageClick },''+(i+1)]);
		p.index=i;
		return p;
	}
					
	this.setPageSize=function(ps) {
		if (ps != this.pageSize) {
			this.pageSize = ps; 
			
			for (var i=0;i<pageSizeSelector.options.length;i++) {
		        if (pageSizeSelector.options[i].value == ps) {
		           pageSizeSelector.selectedIndex = i;
		           break;
		        }
			}								
			pageSizeSelector.value = ps;
			Event.fire(this,'pageSizeChanged');
			this.setPage(0);				
			
		}
	}
	
	for (var i=0;i<pages.length;i++) {
		this.pageNumbers.appendChild(pages[i]=createPageButton(i));
	}
	
	this.setPage = function(pageNumber) {
		if (pageNumber != this.currentPage && pageNumber >= 0 && pageNumber < this.pageCount) {		
			this.currentPage= pageNumber;				
			var start = this.currentPage * this.pageSize;
			var end = Math.min(this.resultCount,start+this.pageSize);			
			Element.setText(this.progress, 'Displaying '+(start+1)+'-'+end+' of '+this.resultCount+' '+this.type);
			
			var pend   = Math.min(this.pageCount,this.currentPage+Math.ceil(pages.length/2))
			var pstart = Math.max(0,pend-pages.length);
			
			pageOffset = pstart;
			
			for (var i=0;i<pages.length;i++) {
				var page=pages[i];
				var pn = (pstart+i+1);
				page.innerHTML = (pstart+i+1);
				page.style.display=((i+pageOffset)>=this.pageCount)?'none':'';
				pages[i].className=(pstart+i == pageNumber)?'pageNumber selected':'pageNumber';					
			}
			
			Event.fire(this,'pageChanged');
		}
	}
	
	this.nextPage = function() {
		this.setPage(this.currentPage+1);
	}
	
	this.prevPage = function() {
		this.setPage(this.currentPage-1);
	}		
	
	this.init = function( resultCount, type, currentPage) {
		if (currentPage == undefined) currentPage = 0;
		this.resultCount=resultCount;
		this.pageCount = Math.ceil(resultCount/this.pageSize);
		this.type=type;
		this.currentPage = -1;
		this.setPage(currentPage);	
	
	
		if (this.resultCount==0) {
			this.element.style.display = 'none';
		} else if (this.resultCount<5) {
			this.element.style.display = 'block';
			pageSSContainer.style.display = 'none';
		} else {
			this.element.style.display = 'block';
			pageSSContainer.style.display = 'block';
		}
		
		if (this.resultCount <= this.pageSize) { 
			this.prevButton.style.display = 'none';
			this.pageNumbers.style.display = 'none';
			this.nextButton.style.display = 'none';
		} else {
			this.prevButton.style.display = '';
			this.pageNumbers.style.display = '';
			this.nextButton.style.display = '';
		}
	}
	
	this.setPageSize( pageSize );

}

function Filter(userElement) {
	var _this = this;
	var filters={};
	var currentFilter = '+';
	
	this.element = render();	
	
	
		
	DOM.whenReady( function() {
		
		if (!userElement.nodeName) userElement = $(userElement);
		if (userElement) {
		userElement.appendChild(_this.element);
		}		
	});
	
	this.setVisible=function(v) {
		userElement.style.display=v?'block':'none';
	}
	
	this.getFilter=function() {
		return currentFilter;
	}
	
	this.setFilter=function(letter,force) {
		if (currentFilter != letter || force) {				
			if (currentFilter != null) {
				Element.removeClass(filters[currentFilter],'selected');											
			}
			currentFilter=letter;
			Element.addClass(filters[currentFilter],'selected');				
			
			Event.fire(this,'filterChanged');
		}	
	}
	
	this.refresh=function(wordList){			
		for (var c in filters) {
			var cnt=wordList.getWordCount(c);
			if (cnt) {
				filters[c].title=cnt+((cnt==1)?' word':' words');					
				Element.removeClass(filters[c],'disabled');
			} else {
				Element.addClass(filters[c],'disabled');
				filters[c].title='';					
			}
		}
	}
			
	function render() {
		var filterClick = function() {
			if (Element.hasClass(this,'disabled')) return;
			if (this.letter) _this.setFilter(this.letter);
			
		}
		var createButton=function(label,letter,className) {
			if (!className) className='';
			filters[letter]=Element.construct(['div',{'class':'button disabled '+className},label]);
			filters[letter].onclick = filterClick;
			filters[letter].letter = letter;
			return filters[letter];
		}
		
		var filterPane = Element.construct(['div',{'class':'filterList'}]);			
		filterPane.appendChild(createButton('SHOW ALL WORDS','+','allwords'));			
		filterPane.appendChild(createButton('JUST ADDED','_','justadded'));	
		Element.addClass(filters['_'],'justadded');
		
		for (var i=97;i<=122;i++) {
			var letter = String.fromCharCode(i);
			filterPane.appendChild(createButton(letter,letter,'letter'));
		}
		filterPane.appendChild(createButton('#','#','letter'));
		filterPane.appendChild(Element.construct(['div',{'class':'clearer'}]));			
		Element.removeClass(filters['+'],'disabled');
		Element.addClass(filters['+'],'selected');
					
		return filterPane;
	}		
}

function ViewSelector() {
	var _this=this;
	var views = {
	 'defaultView':$('defaultViewSelector'),
	 'thumbView':$('thumbViewSelector'),
	 'listView':$('listViewSelector')
	}		
	
	if (views.defaultView) views.defaultView.onclick=function(){_this.setView('defaultView')};
	if (views.thumbView) views.thumbView.onclick=function(){_this.setView('thumbView')};
	if (views.listView) views.listView.onclick=function(){_this.setView('listView')};
	
	var currentView = 'defaultView';
	
	this.getView=function() { return currentView; } 
	this.setView=function(view) {
		if (view != currentView) {
			Element.removeClass(views[currentView],'selected');
			var evt = new Event(_this,'viewChanged');
			evt.lastView = currentView;					
			currentView=view;
			Element.addClass(views[currentView],'selected');
			evt.fire();
		}
	}		
}


function WordList( currentPage, pageSize, disabled ) {
	var _this=this;
	var element = $('wordlist');
	var wlid =  parseInt(element.getAttribute('wordlistid'));
	var wordCount = parseInt(element.getAttribute('wordcount'));
	var pagerTop = new Pager(pageSize);
	var pagerBottom = new Pager(pageSize);
	var filter = new Filter('filterPanel');
	
	this.addStamp=0;
	
	this.filter=filter;
	
	var viewSelector = new ViewSelector();
	this.viewSelector=viewSelector;
	
	var elements = {
		pages: $('pages'),
		wordList: $('listOfWords')
	};
	this.elements = elements;
	
	var pages=[];
	var entries = [];
	var wordsByWord={};
	var wordsByLetter={};
	
	
	Event.addListener(viewSelector,'viewChanged',function(e){
		if (viewSelector.getView()=='thumbView' && _this.getPageSize()<25) {
			_this.setPageSize(25);
		}
		Element.removeClass(element,e.lastView);
		Element.addClass(element,viewSelector.getView());
	});	
	
	Event.addListener(filter,'filterChanged',render);
	
	pagerTop.init(wordCount,'words',currentPage);
	pagerBottom.init(wordCount,'words',currentPage);
	$('pagerTop').appendChild(pagerTop.element);
	$('pagerBottom').appendChild(pagerBottom.element);
	
	
	this.containsWord = function(word,lang) {
		return (wordsByWord[lang+':'+word]!=null);
	}
	this.getWord = function(key) {
		return wordsByWord[key];
	}
	
	this.setWords = function(words) {
		entries=[];
		for (var i=0;i<words.length;i++) {
			if (words[i]) entries.push(words[i]);
		}
		reindex();
		render();
		filter.refresh(_this);
	}
	
	this.getWordCount = function(filter) {
		var w=this.getWords(filter);
		return (w && w.length) ? w.length : 0;
	}
	
	this.getWords = function(filter) {
		if (!filter||filter==='+') return entries; 
		var ret = wordsByLetter[filter];
		return (ret) ? ret : [];
	}
	
	function init() {
		for (var i=0;i<wordCount;i++) {
			var entry = $('entry'+i);
			entry.index=i;
			entry.word=entry.getAttribute('word');
			entry.lang=entry.getAttribute('lang');				

			var links=entry.getElementsByTagName('A');
			for (var l=0;l<links.length;l++) {
				if (links[l].className=='word') links[l].onclick=loadWord;
			}

			var thumb = Element.construct(['div',{'class':'thumb','onclick':loadWord}]);
			thumb.style.backgroundImage="url('/browse/mini/"+entry.lang+"/"+entry.word+".thm.gif')";
			entry.insertBefore(thumb,entry.firstChild);
			entries[i]=entry;			
		}
		reindex();
		render();
		filter.refresh(_this);
	}
	
	function loadRelated(renderedWords,start,end) {
		var titleElement = $('wordlistTitle');
		if (titleElement) {
		var params={'words':[],'langs':[],'name':Element.getText(titleElement)};
		for (var i=start;i<end;i++) {
			params.words.push(renderedWords[i].word);
			params.langs.push(renderedWords[i].lang);			
		}		
		var req = new JSONRequest('/wordlists/related.json',params,function(data) {
			for (var i=0;i<data.length;i++) {
				var ll = data[i];
				var ele = renderedWords[start+i];
				if (!Element.getElementsByClassName('otherlists','div',ele).length && ll && ll.length) {
					var otherLists = Element.construct(['div',{'class':'otherlists'},'Also appears in: ']);
					for (var j=0;j<ll.length;j++) {
						var ol = ll[j];
						if (j > 0) otherLists.appendChild(document.createTextNode(", "));
						otherLists.appendChild(Element.construct(['a',{'href':'/wordlists/'+ol.wordlistid},ol.name]));						
					}
					ele.appendChild(otherLists);					
				}
			}
		});
		req.send();
		}
	}
	
	function reindex() {
		wordsByWord={};
		wordsByLetter={};
				
		for (var i=0,c=entries.length;i<c;i++) {
			var w= entries[i];
			w.index=i;
			var k = (w.lang ? w.lang : 'en') + ':' +w.word;
			wordsByWord[k]=w;
			
			var ch = w.word.charAt(0).toLowerCase();
			if (ch < 'a' || ch > 'z') ch='#';
			if (!wordsByLetter[ch]) wordsByLetter[ch]=[];
			wordsByLetter[ch].push(w);
			
			if( w.addStamp == _this.addStamp) {
				
				if (!wordsByLetter['_']) wordsByLetter['_']=[];
				wordsByLetter['_'].push(w);
			}					
		}		
	}
	
	this.reindex = reindex;
	
	function pageChanged() { _this.setCurrentPage(this.currentPage); }
	Event.addListener(pagerTop,'pageChanged',pageChanged);		
	Event.addListener(pagerBottom,'pageChanged',pageChanged);
	
	function pageSizeChanged() { _this.setPageSize(this.pageSize); }
	Event.addListener(pagerTop,'pageSizeChanged',pageSizeChanged);		
	Event.addListener(pagerBottom,'pageSizeChanged',pageSizeChanged);
	
	this.getCurrentPage=function() { return currentPage; }
	this.setCurrentPage=function( page, force ) {
		if ((page != currentPage || force) && page >=0 && page < pages.length) {
			
			if(pages[currentPage]) pages[currentPage].style.display='none';
			currentPage=page;
			
			if (!pages[currentPage]) {
				pages[currentPage]=renderPage(this.getWords(filter.getFilter()),currentPage * pageSize);
				elements.pages.appendChild(pages[currentPage]);
			}
			
			pagerTop.setPage(page);
			pagerBottom.setPage(page);
			
			
			pages[currentPage].style.display='block';
			Event.fire(this,'currentPageSet');
		}
	}
	this.getPageSize=function() { return pageSize; }
	this.setPageSize=function(s) {
		if (pageSize!=s) {
			pageSize=s;
			pagerTop.setPageSize(s);
			pagerBottom.setPageSize(s);				
			render();
			Event.fire(this,'pageSizeSet');
		}
	}
	
	function render() {		
		Element.removeChildren(elements.pages);
		
		var currentFilter = filter.getFilter();
		
		var renderedWords = _this.getWords(filter.getFilter());
		
		pages = new Array((renderedWords) ? Math.ceil(renderedWords.length / pageSize) : 0);
		
		_this.setCurrentPage(0,true);
					
		var pagerType = 'Words';
		if (currentFilter == '#') {
			pagerType+=' (that start with a non letter)';
		} else if (currentFilter == '_') {
			pagerType+=' (that you just added)';
		} else if (currentFilter != '+') {
			pagerType+=' (that start with '+currentFilter+')';
		}
		
		pagerTop.init(renderedWords.length,pagerType,currentPage);		
		pagerBottom.init(renderedWords.length,pagerType,currentPage);			
		
		if (elements.wordList.nodeName =='TEXTAREA') {
			var words='';
			var entries = _this.getWords();
			for (var i=0;i<entries.length;i++) {
				var word=(entries[i].lang=='en') ? entries[i].word : (entries[i].lang+':'+entries[i].word);
				words+=word+'\n';
			}
			elements.wordList.value = words;
		} else {
			Element.removeChildren(elements.wordList);
			for (var i=0;i<renderedWords.length;i++) {
				if (i>0) elements.wordList.appendChild(document.createTextNode(", "));
				var link =Element.construct(['a',{'href':'#','onclick':loadWord},renderedWords[i].word ]);
				link.index = i;
				elements.wordList.appendChild(link);				
			}
		}		
	}
	this.render = render;
	
	function getIndex(e) {
		var idx = null;
		for (;e!=null && idx == null;e=e.parentNode) {
			idx=e.index;
		}
		return idx;
	}
	
	function loadWord() {
		_this.openWL(wlid,getIndex(this));					
		return false;
	}
	this.loadWord=loadWord;
	
	this.openWL=function(wlid,idx) {
		if (idx != null && window.VisualThesaurus) {			
			window.VisualThesaurus.instance.openWL(wlid,idx,entries[idx].word,entries[idx].lang);
		}
	}
	
	function renderPage(renderedWords,start) {
		var page = Element.construct(['div',{'class':'page'}]);
		var end = Math.min(renderedWords.length,start+pageSize);
		
		for (var i=start;i<end;i++) page.appendChild(renderedWords[i]);	
		loadRelated(renderedWords,start,end);		
		page.style.display='none';
		return page;
	}
	
	init();
}

function WordListEditor(wordList) {
	var _this=this;
	var modified = false;
	var filter=wordList.filter;
	
	$('addWordsButton').onclick = addWords;
	$('cancelButton').onclick=cancel;
	$('saveButton').onclick=save;
	$('alphaButton').onclick=alphabetize;
	
	var form = document.forms['editWordList'];
	form.elements['wordlist.name'].onchange = setModified;
	form.elements['wordlist.description'].onchange = setModified;
	$('listOfWords').onchange = listChanged;

	
	wordList.openWL=function() { }
	
	Event.addListener(wordList.viewSelector,'viewChanged',function(e){
		filter.setVisible(wordList.viewSelector.getView()!='listView');
	});	
	
	var entries = wordList.getWords();
	for (var i=0;i<entries.length;i++) {
		entries[i].getElementsByTagName('img')[0].onclick = removeWord;
	}
	
	function listChanged() {
		var w2 = Word.parseWords(this.value);
		var additions=[];
		for (var i=0;i<w2.length;i++) {
			var word=w2[i];
			var oldWord=wordList.getWord(word.key);
			if (oldWord==null) {
				word.index=i;
				additions.push(word);				
				w2[i]=null;
			} else {
				w2[i]=oldWord;
			}
		}
		if (additions.length==0) {
			wordList.setWords(w2);
			setModified();
		} else {
			var awr = new AddWordsRequest(wordList,additions,addCallback);
			awr.cancel = function() {
				wordList.render();				
			}
			awr.accept = function() {
				wordList.addStamp++;
				for (var i=0;i<this.words.length;i++) {
					var word = this.words[i];
					
					if (!word.found) {
						if (word.choice) {
							word.word=word.choice;								
						} else {
							word=null;								
						}
					}
					if (word && word.duplicate && !this.allowduplicates) {	
						word=null;
					} 
					if (word) {
						word.addStamp = wordList.addStamp;
						w2[additions[i].index] = renderWord(word);
					}				
				}
				wordList.setWords(w2);
				setModified();
				addCallback(true,awr);
			}
			awr.validate();
		}
		
	}
	
	function addWords() {
		var words = Word.parseWords($('addWordsField').value);
		if (words.length > 0) {
			var awr = new AddWordsRequest(wordList,words,addCallback);
			awr.validate();					
		}
	}
	
	function addCallback(success,data) {
		if (!success) {
			displayProblems(data);
		} else {
			$('addWordsField').value = '';
			if (filter != null) filter.setFilter( data.added ? '_' : '+');
		}
	}
	
	
	function cancel() {
		var msg = 'You have made changes to this word list. Are you sure you would like to discard them?';
		if (modified && !confirm(msg)) { 
			return false;
		} 
		return true;	
	}
	
	function save() {
		if (form.validator.validate()) {
			
			addWords();
			
			var words = wordList.getWords();
			if (words.length==0) {
				alert('You must add at least one word to this list in order to save it.');
				return;
			}
			var toSave = new Array(words.length);
			for (var i=0;i<words.length;i++) {
				var word=words[i];
				var wts={ 'word':word.word, 'lang':(word.lang)?word.lang:'en'};
				var description =word.getElementsByTagName('TEXTAREA')[0].value.trim();
				if (description.length) wts.description=description;
				toSave[i]=wts;
			}
			form.elements['wordlist.words'].value = JSON.toJSON(toSave);
			form.submit();
		}
		return false;
	}
	
	
	function alphabetize() {
		var words = wordList.getWords();
		if (words && words.length) {
			words.sort( function(a,b) { 
				var al = a.word.toLowerCase();
				var bl = b.word.toLowerCase();
				if (al > bl) return 1;
				else if (al < bl) return -1;	
				else return (a.word == b.word) ? 0 : ((a.word > b.word) ? 1 : -1); 								
			});
			wordList.reindex();		
			wordList.render();	
			setModified();
		}
	}

	function removeWord() {
		var idx = getIndex(this);
		if (idx != null) {
			setModified();
			wordList.getWords().splice(idx,1);
			document.title=''+wordList.getWords().length;
			wordList.reindex();
			wordList.render();
			filter.refresh(wordList);
		}
		
	}
	
	function getIndex(e) {
		var idx = null;
		for (;e!=null && idx == null;e=e.parentNode) {
			idx=e.index;
		}
		return idx;
	}
	
	function renderWord(word) {
		var idx = word.index;
		var lang = (word.lang)?word.lang:'en';			
		var thumb = Element.construct(['div',{'class':'thumb','alt':word.word,'title':word.word,'onclick':wordList.loadWord}]);
		thumb.style.backgroundImage = "url('/browse/mini/"+lang+"/"+word.word+".thm.gif')";
		var validation="'length':{'max':255}";
		var textarea=Element.construct(['textarea',{'onchange':setModified,'validation':validation},(word.description) ? word.description : '']);		
		textarea.validator = new FieldValidator(textarea);
		
		var ele = Element.construct(['div',{'class':'entry','index':idx,'lang':lang,'word':word.word},[				
			thumb,
			['div',{'class':'word'},word.word],
			textarea,
			['img',{'class':'delete','src':'/portlets/wordlists/delete.gif','title':'remove this word','onclick':removeWord}]
		]]);	
		
		ele.word=word.word;
		ele.lang=lang;
		ele.index=idx;
		ele.addStamp=wordList.addStamp;
		return ele;	
	}
	
	function setModified() {
		modified=true;
	}
	
	function displayProblems(data) {
		
		var pane = Element.construct(['form',{'class':'problems'},[
			['h2',{},'What would you like to do?']
		]]);
		
		if (data.duplicates) {
			var dupes = Element.construct(['div',{'class':'duplicates'},[
				['div',{ 'class':'note' },'Your word list already contains some of the words that you are adding, how would you like to handle this?'],
				createOption('dupn','duplicates','Don\'t add duplicate words','0',true),
				createOption('dupy','duplicates','Add duplicate words','1')					
			]]);
			pane.appendChild(dupes);
		}
		if (!data.valid) {
			var invalidCount=0;
			var words= data.words;
			for (var i=0;i<words.length;i++) {
				if (!words[i].found) invalidCount++;
			}
		
			var wordChoices=Element.construct(['div',{'class':'wordChoices'}]);
			var invalidWords = Element.construct(['div',{'class':'invalidwords'},[
				['div',{ 'class':'note' },(invalidCount>1) ? 'Some of the words you entered were not found in the dictionary:':
															 'The word you entered was not found in the dictionary:'],
				wordChoices											 
			]]);
			
			for (var i=0;i<words.length;i++) {
				var w=words[i];
				if(!w.found) {
					wordChoices.appendChild((new WordChoice(w.word,w,i)).element);
				}
			}				
			pane.appendChild(invalidWords);
			
			
		}
		
		function WordChoice(word,data,idx) {
			var clicked = function() { data.choice=this.value; }
			var radioGroup = 'suggest'+idx;
			var hasSuggestions = (data.suggestions && data.suggestions.length);
			this.element = Element.construct(['div',{ 'class':'wordChoice'},[['div',{'class':'word'},word]]]);
			var wordOptions = Element.construct(['div',{ 'class':'wordOptions'},[
				createOption(radioGroup+'-rem',radioGroup,'remove this word','',!hasSuggestions,clicked)
			]]);				
			if (hasSuggestions) {
				var sugEle = Element.construct(['div',{ 'class':'suggestions'},[ ]]);
				for (var i=0;i<data.suggestions.length;i++) {
					sugEle.appendChild(createOption(radioGroup+'-'+i,radioGroup,data.suggestions[i],data.suggestions[i],i==0,clicked));				
					if (i==0) data.choice = data.suggestions[i];
				}
				wordOptions.appendChild(Element.construct(['div',{},[
					['div',{ 'class':'changeTo'},'change to:'],
					sugEle
				 ]]));
			}				
			this.element.appendChild(wordOptions);
			
			
		}
				
		function createOption(id,name,label,value,selected,onclick) {
			var props ={ 'type':'radio','name':name,'id':id,'value':value};
			if (selected) props.checked='true';
			var input=Element.construct(['input',props]);
			if (onclick) input.onclick = onclick;
			return Element.construct(['div',{ 'class':'option'},[input,['label',{'for':id},label]]]);
		}
		
				
		var accept = function() {
			if (data.duplicates) {
				data.allowduplicates=(!pane.elements['duplicates'][0].checked);				
			}
			dialog.hide();
			data.accept();				
		}
		
		var cancel = function() {
			dialog.hide();
			data.cancel();
		}
								
		pane.appendChild(Element.construct(['div',{'class':'buttons'},[
			['input',{'class':'button','type':'image','src':'/buttons/default/ok.gif','onclick':accept}],
			['input',{'class':'button','type':'image','src':'/buttons/default/cancel.gif','onclick':cancel}]
		]]));		
		
		var dialog = new Dialog(pane);
		dialog.show();
		
	
		if (Browser.IE ) {
			if (words) {
				for (var i=0;i<words.length;i++) {
					var ele = pane.elements['suggest'+i];
					if (ele) {
						if (ele[1]) ele[1].checked=true;
						ele.checked=true
					}
				}
			}
			if (data.duplicates) {
				pane.elements['duplicates'][0].checked=true;
			}
		}
	}
	
	function AddWordsRequest(wordList,words,callback) {
		var _this=this;
		this.wordList = wordList;
		this.allowduplicates = false;
		this.words = words;
		this.duplicates = getDuplicates();
		this.added=0;
		
		var loaded = function(data) {
			for (var i=0;i<data.words.length;i++) {
				var word =data.words[i];
				for (var k in word) words[i][k]=word[k];					
			}
			_this.valid=data.valid;
			if (_this.isValid()) _this.accept();
			else if(callback) callback(false,_this);					
		}
		
		this.isValid = function() {
			return (this.duplicates==0 || this.allowduplicates) && this.valid
		}
		
		function getDuplicates() {
			var duplicates = 0;
			var test={};
			for (var i=0;i<words.length;i++) {
				var word=words[i];					
				if (wordList.containsWord(word.word,word.lang) || test[word.key]) {							
					word.duplicate=true;
					duplicates++;
				}
				test[word.key]=true;			
			}
			return duplicates;
		}			
		
		this.validate = function() {
			var req = new JSONRequest('/wordlists/validate.json',{'words':words});						
			req.onload = loaded;
			req.onerror = function(e) { throw e; }
			req.send();
		}
		
		this.cancel = function() {
			
		}
		
		this.accept = function() {
			wordList.addStamp++;				
			this.added=0;
			for (var i=0;i<words.length;i++) {
				var word = words[i];
				if (!word.found) {
					if (word.choice)word.word=word.choice;
					else word = null;
				}
				if (word != null && (!word.duplicate || this.allowduplicates)) {							
					var entries= wordList.getWords();
					word.index=entries.length;					
					entries.push(renderWord(word));
					this.added++;
				}		
			}			
			if (this.added) {
				setModified();
				wordList.reindex();
				wordList.render();
				filter.refresh(wordList);
				
			}
			if (callback) callback(true,this);						
		}			
	}
}


function Word(word,lang) {
	this.word=word;
	this.lang=(!lang || lang.length != 2) ? 'en':lang;
	this.key=this.lang+':'+this.word;
}
Word.prototype.toString = function() {
	return (this.lang=='en' || this.lang == undefined) ? this.word : (this.lang+":"+this.word);
}
Word.parseWords = function( words ) {
	if (typeof words == 'object' && words.length) {
		var ret = [];
		for (var i=0;i<words.length;i++) {
			var w = Word.parse(words[i]);
			if (w) ret.push(w);	
		}
		return ret;
	} else if (typeof words == 'string') {
		 var ret = [];
		 var wa=words.split(/\,\s*|\n\s*/);
		 for (var i=0;i<wa.length;i++) {
			var w = Word.parse(wa[i]);
			if (w) ret.push(w);				 	
		 } 
		 return ret;
	} else {
		return [];
	}
}
Word.parse = function(w) {
	if (typeof w == 'string') {			
		var word='', lang='en';			
		if (w.indexOf(':')==-1) {
			word = w.trim();
		} else {
			var ws = w.split(':');
			if (ws.length==2) {
				word = ws[1].trim();
				lang = ws[0].trim();
			}
		}
		if (word.length>0 && lang.length==2) return new Word(word, lang);
	} else if (w && w.lang && w.word) {
		return new Word(w.word,w.lang);
	}
}

	
function Dialog(contentElement) {
	
	var pageBody = $('pageBody');
	
	this.show = function() {
		resized();
		pageBody.appendChild(blocker);
		pageBody.appendChild(content);
		Event.addListener(window,'resize',resized);
	}
	
	this.hide = function() {
		pageBody.removeChild(blocker);
		pageBody.removeChild(content);
		Event.removeListener(window,'resize',resized);
	}
	
	var content=document.createElement('div');
	content.style.textAlign='center';
	content.style.zIndex='5001';
	content.style.position='absolute';
	content.style.top='0px';
	content.style.left='0px';	
	content.appendChild(contentElement);
	
	var blocker=document.createElement('div');
	blocker.style.backgroundColor='#FFFFFF';
	blocker.style.position='absolute';
	blocker.style.zIndex='5000';
	blocker.style.top='0px';
	blocker.style.left='0px';	
	
	content.style.width='100%';
	content.style.height='100%';	
	blocker.style.width='100%';
	blocker.style.height='100%';	
	
	if (Browser.IE) {
		blocker.style.filter='alpha(opacity=50)';
	} else {			
		blocker.style.opacity='.5';
	}
	
	function resized() {
		blocker.style.height = pageBody.clientHeight+'px';		
		content.style.height = pageBody.clientHeight+'px';	
	}
}



	
	

