/*
	Nuwa Hundred Names v0.1
	TODO: Add save names, add report data, add suggest data
*/

	Steamboat.debug = false;
	
	/* Packages */
	Steamboat.importPackage('./js/framework/cookie.js');
	Steamboat.importPackage('./js/framework/data.js');
	Steamboat.importPackage('./js/framework/forms.js');
	Steamboat.importPackage('./js/framework/generator.js');
	Steamboat.importPackage('./js/framework/loadbar.js');
	Steamboat.importPackage('./js/framework/toon.js');

	/*
		Hundred Names
	*/
	Hundred = {
		
		/* Static Properties */
		amount: null, 
		controls: null, 
		comments: null, 
		generator: null, 
		result: null, 
		submit: null, 
		
		/* Static Methods */
		addNameOptions: function() {
			var objNames = this.result.getElementsByTagName('li');
				for ( var intNameIndex = 0; intNameIndex < objNames.length; intNameIndex++ ) {
					var objSaveCheck = document.createElement('input');
					objSaveCheck.type = 'checkbox';
					objNames[intNameIndex].insertBefore(objSaveCheck, objNames[intNameIndex].firstChild);
					Steamboat.addEvent(objSaveCheck, 'click', Hundred.addSave.createDelegate(this));
			}
		}, 
		
		addSave: function(eSource) {
			var objSource = eSource.srcElement ? eSource.srcElement : eSource.target;
			var intIndex;
			for ( intIndex = 0; intIndex < objSource.parentNode.parentNode.childNodes.length; intIndex++ ) {
				if ( objSource.parentNode.parentNode.childNodes[intIndex] == objSource.parentNode ) {
					break;
				}
			}
			this.generator.result.dropLine(intIndex);
			var objName = objSource.parentNode;
			objName.removeChild(objSource);
			this.save.appendChild(objName);
			
			var strPostData = 'action=save&name=' + escape(objName.innerHTML);
			Steamboat.trace(strPostData);
			var objFormPost = new Steamboat.Data.request('form.php');
			objFormPost.onLoad = Hundred.onSaveLoad.createDelegate(objFormPost);
			objFormPost.post = strPostData;
			objFormPost.send();
			
			var objDeleteCheck = document.createElement('input');
			objDeleteCheck.type = 'checkbox';
			objName.insertBefore(objDeleteCheck, objName.firstChild);
			Steamboat.addEvent(objDeleteCheck, 'click', Hundred.removeSave.createDelegate(this));
			
			Steamboat.Cookie.set('save', escape(this.save.innerHTML), 1000);
			Steamboat.trace(escape(this.save.innerHTML).length);
		}, 
		
		clearSaves: function() {
			Steamboat.Cookie.clear('save');
			Steamboat.removeNodes(this.save);
		}, 
		
		closeComment: function() {
			var objOpenComments = document.getElementById('openComments');
			var objComments = document.getElementById('comments');
			Steamboat.addClass(objOpenComments, 'active');
			objComments.Steamboat.tween.rewind();
			objPost.style.display = 'block';
		}, 
		
		generateNames: function() {
			if ( this.submit.disabled ) {
				return false;
			}
			Steamboat.removeNodes(this.result);
			var objLoading = document.createElement('p');
			objLoading.appendChild(document.createTextNode('Generating...'));
			this.result.appendChild(objLoading);
			this.submit.disabled = true;
			this.generator.setColumns([
				'adjective/name', 
				'noun/name', 
				'surname/name[meaning]', 
				Steamboat.Forms.getValue(this.controls['gender']) + '/name']);
			this.generator.alliteration = Steamboat.Forms.getValue(this.controls['match']) != '';
			this.generator.generate();
			this.setDisplay();
			this.submit.disabled = false;
		}, 
		
		init: function() {
			Steamboat.Toon.fps = 60;
			Steamboat.Toon.safeMode = true;
			Steamboat.addEvent(window, 'load', Hundred.onLoad.createDelegate(this));
		}, 
		
		openComment: function() {
			var objOpenComments = document.getElementById('openComments');
			var objComments = document.getElementById('comments');
			Steamboat.removeClass(objOpenComments, 'active');
			objComments.Steamboat.tween.play();
			objComments.style.display = 'block';
		}, 
		
		postComment: function() { 
			var objPost = document.getElementById('post');
			var strPostData = 'action=post';
			for ( var intField = 0; intField < objPost.elements.length; intField++ ) {
				if ( objPost.elements[intField].name ) {
					strPostData += 
						'&' + objPost.elements[intField].name + 
						'=' + Steamboat.Forms.getValue(objPost.elements[intField]);
				}
			}
			Steamboat.trace(strPostData);
			var objFormPost = new Steamboat.Data.request('form.php');
			objFormPost.onLoad = function() { 
				Steamboat.trace(objFormPost.text);
				this.comments.send(); 
			}.createDelegate(this);
			objFormPost.post = strPostData;
			objFormPost.send();
			objPost['comment'].value = '';
			return false; 
		}, 
		
		removeSave: function(eSource) {
			var objSource = eSource.srcElement ? eSource.srcElement : eSource.target;
			objSource.parentNode.parentNode.removeChild(objSource.parentNode);
			Steamboat.Cookie.set('save', escape(this.save.innerHTML), 1000);
		},  
		
		setDisplay: function() {
			if ( this.generator.result.count ) {
				this.setOrder();
				Steamboat.removeNodes(this.result);
				this.result.appendChild(this.generator.result.toList());
				this.addNameOptions();
			}
		}, 
		
		setOrder: function() {
			var aryColumns = [];
			if ( Steamboat.Forms.getValue(this.controls['adjective']) ) {
				aryColumns.push('adjective/name');
			}
			if ( Steamboat.Forms.getValue(this.controls['noun']) ) {
				aryColumns.push('noun/name');
			}
			if ( Steamboat.Forms.getValue(this.controls['order']) ) {
				if ( Steamboat.Forms.getValue(this.controls['surname']) != '' ) {
					aryColumns.push('surname/name[meaning]');
				}
				if ( Steamboat.Forms.getValue(this.controls['givenname']) != '' ) {
					aryColumns.push(Steamboat.Forms.getValue(this.controls['gender']) + '/name');
				}
			} else {
				if ( Steamboat.Forms.getValue(this.controls['givenname']) != '' ) {
					aryColumns.push(Steamboat.Forms.getValue(this.controls['gender']) + '/name');
				}
				if ( Steamboat.Forms.getValue(this.controls['surname']) != '' ) {
					aryColumns.push('surname/name[meaning]');
				}
			}
			this.generator.setColumns(aryColumns);
		},  
		
		/* Static Events */
		onLoad: function() {
			/* DOM Objects */
			this.amount = document.getElementById('amount');
			this.controls = document.getElementById('controlPanel');
			this.resultPanel = document.getElementById('resultPanel');
			this.result = document.getElementById('result');
			this.savePanel = document.getElementById('savePanel');
			this.save = document.getElementById('save');
			this.submit = document.getElementById('submit');
			
			/* Load Data */
			this.generator = new Steamboat.Generator.widget();
			this.generator.path = './xml/names.xml';
			this.generator.onLoad = this.onLoadData.createDelegate(this);
			this.generator.load();
			
			/* Comments */
			this.comments = new Steamboat.Data.request('form.php');
			this.comments.onLoad = this.onLoadComments.createDelegate(this);
			this.comments.send();
			Steamboat.Toon.setDrag('commentHeader', 'comments');
			var objPost = document.getElementById('post');
			if ( objPost ) {
				Steamboat.addEvent('post', 'submit', Hundred.postComment.createDelegate(this));

				var objOpenComments = document.getElementById('openComments');
				var objComments = document.getElementById('comments');
				var objCloseButton = document.getElementById('closeComment');
				
				objComments.Steamboat = {
					tween: new Steamboat.Toon.tween(objComments, ['auto', 'auto', 0], ['auto', 'auto', 100], 1, Steamboat.Toon.velocity.decelerate, false)
				};
				
				Steamboat.addEvent(objCloseButton, 'click', Hundred.closeComment.createDelegate(this));
				Steamboat.addEvent(objOpenComments, 'click', Hundred.openComment.createDelegate(this));
			}
		}, 
		
		onLoadData: function() {
			//this.result.removeChild(this.loadBar);
			
			/* Saved Data */
			var strCookie = Steamboat.Cookie.get('save') || '';
			this.save.innerHTML = unescape(strCookie);
			Hundred.wireSaves();
			Steamboat.addEvent('clearSaves', 'click', Hundred.clearSaves.createDelegate(this));
			
			/* Amount */
			Hundred.updateAmount();
			Steamboat.addEvent(this.amount, 'change', Hundred.updateAmount.createDelegate(this));
			
			/* Surname */
			Steamboat.addEvent(this.controls['surname'], 'click', this.setDisplay.createDelegate(this));
			
			/* Given Name */
			Steamboat.addEvent(this.controls['givenname'], 'click', this.setDisplay.createDelegate(this));
			
			/* Name Order */
			Steamboat.addEvent(this.controls['order'], 'click', this.setDisplay.createDelegate(this));
			
			/* Adjective */
			Steamboat.addEvent(this.controls['adjective'], 'click', this.setDisplay.createDelegate(this));
			
			/* Noun */
			Steamboat.addEvent(this.controls['noun'], 'click', this.setDisplay.createDelegate(this));
			
			/* Generate */
			Steamboat.addEvent(this.submit, 'click', Hundred.generateNames.createDelegate(this));
			
			/* Unhide */
			Steamboat.addClass(this.controls, 'active');
			Steamboat.addClass(this.savePanel, 'active');
			Steamboat.addClass(this.resultPanel, 'active');
		}, 
		
		onLoadComments: function() {
			Steamboat.trace('comments loaded');
			var objComments = document.getElementById('messages');
			if ( objComments ) {
				objComments.innerHTML = this.comments.text;
				if ( !objComments.loaded ) {
					var objOpenComments = document.getElementById('openComments');
					if ( objOpenComments ) {
						Steamboat.addClass(objOpenComments, 'active');
					}
					objComments.loaded = true;
				}
			}
		}, 
		
		onSaveLoad: function() { 
			Steamboat.trace(this.text);
		}, 
		
		updateAmount: function() {
			this.generator.amount = this.amount.value;
		}, 
		
		wireSaves: function() {
			var objChecks = this.save.getElementsByTagName('input');
				for ( var intIndex = 0; intIndex < objChecks.length; intIndex++ ) {
					Steamboat.addEvent(objChecks[intIndex], 'click', Hundred.removeSave.createDelegate(this));
			}
		}
		
	};
	
	Steamboat.onload = Hundred.init.createDelegate(Hundred);
		