var AutoCompleteInstance = function(){
  var $D = YAHOO.util.Dom,
  	  $E = YAHOO.util.Event,
	  auto = [],
	  clsCheck = 'autoconvert',
	  rtnObj = {}; 
  
  function _isValidSel(sel){
  	var selMult = sel.getAttribute('multiple');
		selSize = sel.getAttribute('size');	 
  	if(selMult || selSize){return false;}
	
	return true;
  };
  
  function _getOptions(sel){
  	var opt = sel.options,
		textArr = valueArr = [];
	for(var i = 0; i < opt.length; i++){
		textArr[i]  = opt[i].text;
		valueArr[textArr[i]] = opt[i].value;
	}
	return {txt:textArr, val:valueArr, sel:opt.selectedIndex};
  };
  
  function _replaceSelects(){
	var optObj,
		sel = $D.getElementsByClassName(clsCheck, 'SELECT'),
		selId, selName, modElem, inputElem, contElem, hiddenElem;
	for(var i = 0; i < sel.length; i++){
		opt = [];
		if(_isValidSel(sel[i])){
	  	  selId = sel[i].getAttribute('id');
		  selName = sel[i].getAttribute('name');
		  optObj = _getOptions(sel[i]);
		  reg = $D.getRegion(sel[i]);
		  
		  //Create Div
		  modElem = document.createElement('DIV');
		  $D.addClass(modElem, 'autocompleteModule');
		  $D.setStyle(modElem, 'width', (reg['right'] - reg['left'])+'px');
		  
		  //Create Hidden Element
		  hiddenElem = document.createElement('INPUT');
		  hiddenElem.setAttribute('type', 'hidden', true);
		  hiddenElem.setAttribute('id', selId, true);
		  hiddenElem.setAttribute('name', selName, true);
		  
		  //Create Input Element
		  inputElem = document.createElement('INPUT');
		  inputElem.setAttribute('type', 'text', true);
		  inputElem.setAttribute('id', $D.generateId(inputElem, 'auto'), true);
		  $D.addClass(inputElem, 'autocompleteInput');
		  
		  // Set Default Values
		  if(optObj.sel != -1){
		  	inputElem.value  = optObj.txt[optObj.sel];
			hiddenElem.value = optObj.val[optObj.txt[optObj.sel]]; 
		  }
		  // Create Container Element
		  contElem = document.createElement('DIV');
		  contElem.setAttribute('id', selId+'Container', true);
		  $D.addClass(contElem, 'autocompleteContainer');
		  
		  //Insert inputElem and contElem inside modElem
		  modElem.appendChild(hiddenElem);
		  modElem.appendChild(inputElem);
		  modElem.appendChild(contElem);
		  
		  // Replace Selected
		  sel[i].parentNode.insertBefore(modElem, sel[i]);
		  sel[i].parentNode.removeChild(sel[i]);
		  
		  //Create Datasources
		  auto[i] = []
		  auto[i][0] = new YAHOO.widget.DS_JSArray(optObj.txt);
		  auto[i][1] = new YAHOO.widget.AutoComplete(inputElem, contElem, auto[i][0]);
		  auto[i][1].queryDelay = 0;
          auto[i][1].prehighlightClassName = "yui-ac-prehighlight";
          auto[i][1].typeAhead = true;
          auto[i][1].useShadow = true;
		  auto[i][1].itemSelectEvent.subscribe(function(){hiddenElem.value = optObj.val[inputElem.value];})
		}  
	}	  	
  };
  
  rtnObj.replaceSelects = _replaceSelects;
  
  $E.addListener(window, 'load', function(){rtnObj.replaceSelects();});
  return rtnObj; 
}();