var TextfieldPlaceholder = new Class ({
	Implements: [Options, Events],
	
	options: {
		targetAttribute: "placeholder",
		destroyLabelIfPresent: true,
		placeholderClass: "textfield-placeholder",
		passwordListener: true,
		passwordListenerInterval: 200
	},
	
	initialize: function(element, options){
		this.setOptions(options);
		
		var self = this;
		
		self.element = $(element);
		
		// Destroy the Unneccessary Label Element.
		if (self.options.destroyLabelIfPresent) {
			var label = document.getElement("label[for="+ self.element.get("id") +"]");
			if (label) {
				self.labelText = label.get("text");
				label.destroy();
			}
		}		
		
		// Does this element support the placeholder attribute?
		if (self.supports_textfield_placeholder(self.element)) return false;
		if (self.element.get("tag") != "input" && self.element.get("tag") != "textarea") return false; // This might be redundant.
		if (self.element.get("tag") == "input") {
			if (self.element.get("type") != "text" && self.element.get("type") != "password") return false; // This might also be redundant.	
		}
		
				
		
		// Get the placeholder Text.
		if (self.options.targetAttribute == "label") {
			self.element.placeholderText = labelText;
		} else {
			self.element.placeholderText = self.element.get(self.options.targetAttribute);
		}
		
		// Get the original Text.
		self.element.originalText = self.element.get("value");
		
		// Build the Placeholder Element.
		self.element.ePlaceholder = new Element("p",{
			"class" : self.options.placeholderClass,
			text: self.element.placeholderText
		}).injectBefore(self.element);
		
		self.element.addEvents({
			"focus": function(evt) {
				
				if (self.element.get("value") == "") {
					self.element.ePlaceholder.setStyle("display", "none");
				}
				
			},
			
			"blur": function(evt) {
				
				if (self.element.get("value") == "") {
					self.element.ePlaceholder.setStyle("display", null);
					
					if (self.element.get("type") == "password" && self.options.passwordListener == true) {

						self.checkForAutofill();

					}
					
				}
				
			},
			
			"change": function(evt) {
				
				if (self.element.get("value") == "") {
					self.element.ePlaceholder.setStyle("display", null);
				} else {
					self.element.ePlaceholder.setStyle("display", "none");
				}
				
			}
		});
		
		if (self.element.get("type") == "password" && self.options.passwordListener == true) {
			
			self.checkForAutofill();
			
		}
		
		self.element.ePlaceholder.addEvents({
			"click": function(evt) {
				
				evt.stop();
				self.element.ePlaceholder.setStyle("display", "none");
				self.element.focus();
				
			}
		});
		
		// Browser Stuff for Autofill forms.
		
		// Check for a default value
		if (self.element.get("value") != "") self.element.ePlaceholder.setStyle("display", "none");
		
		return self.element;
		
	},
	
	supports_textfield_placeholder: function(element) {
		
		var temp_element = document.createElement(element.get("tag"));
		var support = ('placeholder' in temp_element);
		
		delete temp_element;
	  	
		return support;
		
	},
	
	checkForAutofill: function() {
		
		var self = this;
		
		var periodicalID = (function(){
			
			if (self.element.get("value") != self.element.originalText) {

				self.element.ePlaceholder.setStyle("display", "none");
				$clear(periodicalID);
				
			}
			
		}).periodical(self.options.passwordListenerInterval);
		
	}
	
});
