/*-----------------------------------------------------------------------------------------------
Author:	Ben Plessinger
Date:		03-03-08
About:	MakeList is a prototype based extension to allow the creation
		of a list from options in a select box.
-----------------------------------------------------------------------------------------------*/
if (typeof Effect == 'undefined' || (typeof Builder == 'undefined')) 
	throw("MakeList.js requires including script.aculo.us' effects.js and builder.js library!");
var MakeList = Class.create();

MakeList.prototype = {
	elmParent: false,
	elmSelect: 	false,
	divList:	false,
	ignoreFirst: true,
	externalInput: false,
	externalAction: false,
	Added: false,
	
	initialize: function(selectbox, listdiv, options)
				{
					if (!$(selectbox))
					{
						throw(selectbox+" doesn't exist!");
						return false;
					}
					else if (!$(listdiv))
					{
						throw(destination+" doesn't exist!");
						return false;
					}
					else
					{
						this.elmSelect = $(selectbox);
						if(options)
						{
							if(options.parent)
								this.elmParent = $(options.parent);
							if(options.ignoreFirst == false)
								this.ignoreFirst = false;
							if(options.externalInput)
							{
								ext = options.externalInput
								if (ext.input)
								{
									this.externalInput = $(ext.input);
									if(ext.action)
										this.externalAction = ext.action;
									else
										this.externalAction = 'click';
									this.externalInput.observe(this.externalAction,this.addToList.bind(this));
								}
							}
							else
							{
								this.elmSelect.observe('change',this.addToList.bind(this));
							}
						}
						
						this.Added = new Hash();
						this.divList = $(listdiv);
						var children = $$('#'+listdiv+' input[type="text"]');
						children.each(this.addExisting.bind(this));
						this.divList.observe('click', this.deleteFromList.bind(this));
					}
				},
	addExisting: function(input)
				{
					var displayText = input.value
					var name = input.name;
					var value = name.substring(name.indexOf('[')+1, name.indexOf(']'));
					var itemID = "ml_"+this.elmSelect.id+"_"+value;
					this.Added.set(value, {display: displayText, id: itemID});
				},
	addToList: 	function(event)
				{
					var optionIndex = this.elmSelect.selectedIndex;
					var elmOptions = this.elmSelect.options;
					var optElm = elmOptions[optionIndex];
					if(!this.elmSelect.disabled)
					{
						var text = optElm.text;
						var value = optElm.value;
						var addedItem = this.Added.get(value);
						if(!addedItem && (!this.ignoreFirst || (this.ignoreFirst && optionIndex > 0)))
						{
							//this.Added.set(value, text);
							
							if(this.elmParent && this.elmParent.options[this.elmParent.selectedIndex].value != value)
								displayText = this.elmParent.options[this.elmParent.selectedIndex].text+" -> "+text;
							else if(this.elmParent && this.elmParent.options[this.elmParent.selectedIndex].value == value)
								displayText = this.elmParent.options[this.elmParent.selectedIndex].text;
							else
								displayText = text;
							
							var itemID = "ml_"+this.elmSelect.id+"_"+value;
							
							this.Added.set(value, {display: displayText, id: itemID});
							// <div id='this.elmSelect.id' style='display:none'>
								// displayText
								// <input type='hidden' name='texts[]' value='text'/>
								// <input type='text' name='values[]' value='value' style='display:none;'/>
								// <img src='inc/images/cancelsmall.png' />
							// </div>
							var newItemHTML = Builder.node('DIV',{'id': itemID},[
									Builder.node('SPAN',{'class' :'makelist-item' }, displayText),
									Builder.node('INPUT',{'type': 'hidden','value': text,'name': this.elmSelect.id+'['+value+']'}),'	',
									Builder.node('IMG',{'alt':'Remove '+displayText, 'class' : 'pointer', 'title':'Remove '+displayText, 'src': '/images/deleteX.gif'}),
									Builder.node('DIV',{'STYLE': 'clear:both;'})
									]);
							Element.insert(this.divList, newItemHTML);
							$(itemID).appear();
							if(this.elmParent)
							{
								this.elmParent.selectedIndex = 0;
								this.elmSelect.selectedIndex = 0;
								/*
								this.elmSelect.options[0].text = "Select";
								this.elmSelect.options[0].value = "";
								*/
								this.elmSelect.disabled = true;
							}
							else
							{
								this.elmSelect.selectedIndex = 0;
							}
							
						}
						else if(addedItem)
						{
							var itemID = addedItem.id;
						}
						if($(itemID))
							$(itemID).highlight({queue:'end'});
						if(this.divList.hasClassName('optionContainerEmpty') && this.divList.childElements().size() > 0)
						{
							this.divList.removeClassName('optionContainerEmpty');
							this.divList.addClassName('optionContainer');
						}
					}
					/*
					else
					{
						alert("Nothing has been Selected");
					}
//					event.originalTarget.removeChild(elmOptions[optionIndex]);
					event.target.removeChild(elmOptions[optionIndex]);
					alert("End of AddToList: "+this.Added.inspect());
					*/
				},
	
	deleteFromSelect:	function(item)
						{
						},
	
	addToSelect:function(value, text)
				{
					var anOption = document.createElement('option');
					anOption.value = value;
					anOption.innerHTML = text;
					this.elmSelect.appendChild(anOption);
				},
	
	deleteFromList: function(item)
					{
						item.stop();
						if(Event.element(item).tagName == 'IMG')
						{
							//var input = item.originalTarget.previous();
							//var parent = item.originalTarget.up();
							var input = item.target.previous();
							var parent = item.target.up();
							var text = input.value;
							var name = input.name
							var value = name.substring(name.indexOf('[')+1, name.indexOf(']'));
							Element.remove(parent);
							//this.addToSelect(value, text);
							this.Added.unset(value);
						}
						if(this.divList.childElements().size() == 0)
						{
							this.divList.removeClassName('optionContainer');
							this.divList.addClassName('optionContainerEmpty');
						}
						//alert("End of DeleteFromList: "+this.Added.inspect());
					}
}