/**
 * dropboxwrapper.js
 * wrap input elements with drop boxes
 * 
 * search page, looking for INPUT elements of class taxondrop, namedrop or placedrop
 * where found, add dropbox packaging
 * 
 * @author Tom Humphrey <t.humphrey@bigfoot.com>
 * @copyright Tom Humphrey 2008
 * @version forked from atHome.005w.js
 * @package docform
 */
 
 function DropBoxWrapper() {
    /**
  	 * refs for all dropboxes, for purposes of cleanup on unload
     * 
     * @var array
     */
 	this.dropboxList=[];
 	this.windowUnloadHandle=register_event_handler(window,'unload',this,'onunload_handler','');
 }
 
 /**
  * handler for window onload event
  * 
  * Wrappers must be registered once the page is fully loaded.
  */
 DropBoxWrapper.prototype.onload_handler = function ()
 {
 	this.wrap('taxondropbox',TaxonBox);
 	this.wrap('persondropbox',NameBox);
 	this.wrap('placedropbox',StandalonePlaceName);
 };
 
 /**
  * handler for window unload event
  * 
  * Dispose of all registered wrappers
  */
DropBoxWrapper.prototype.onunload_handler = function ()
{
 	window.onunload=null;
 	window.onerror=null;

	this.destroy();
 };
 
DropBoxWrapper.prototype.wrap = function (className, object)
{
 	var inputElements=document.getElementsByTagName('input');
 	
 	var classMatch=new RegExp('\\b'+className+'\\b');
 	
 	for (var i=0, l=inputElements.length; i<l; i++) {
 		if (inputElements[i].className.search(classMatch)!==-1) { 
 			var obj=new object();
 			var inputName=inputElements[i].name;
 			var inputId=inputElements[i].id;
 			var inputValue=inputElements[i].value;
 			var inputWidth=inputElements[i].style.width;
 			var inputTitle=inputElements[i].title;
 			var inputClass=inputElements[i].className;
 			
 			// look for any additional input element which contains an external id
 			// will have id of the form dropboxedelementid_id
 			// strip any square-bracket component first
 			//var idContainerElement=document.getElementById((inputId.search(/\[/)!=-1)?inputId.replace(/\[/,'id['):inputId+'id');
 			//if (idContainerElement) {
 			//	obj.set_id_container_element(idContainerElement);
 			//}
 			obj.wrapper_link_related_elements(inputId);
 			
 			inputElements[i].parentNode.replaceChild(obj.container,inputElements[i]);
 			
 			obj.input.setAttribute('name',inputName);
 			obj.input.value=inputValue;
 			obj.input.style.width=inputWidth;
 			obj.input.title=inputTitle;
 			obj.input.className=inputClass;
 		
 			this.dropboxList.push(obj);
 		}
 	}
};
 
DropBoxWrapper.prototype.destroy = function ()
{
	for (var n in this.dropboxList) {
		this.dropboxList[n].destroy(); // destruction may need to leave input boxes intact???
	}
	this.dropboxList=null;
	
	this.windowUnloadHandle=remove_event_handler(this.windowUnloadHandle);
};

var wrapper=new DropBoxWrapper();
wrapper.onload_handler();
