/**
 * @author Administrator
 */
(function() {
	YAHOO.namespace("HLK");
	
	YAHOO.HLK.FormEater = function(el, attr) {		
	    attr = attr || {};				
		if (!el) {
			alert("Element not found");
		}
		YAHOO.HLK.FormEater.superclass.constructor.call(this, el, attr);
	};
		
	YAHOO.extend(YAHOO.HLK.FormEater, YAHOO.util.Element);

	var proto = YAHOO.HLK.FormEater.prototype;
	var Dom = YAHOO.util.Dom;	
	var Event = YAHOO.util.Event;

	proto._resultParent = null;
	proto._closeBtnEl = null;
	
	proto.initAttributes = function(attr) {
        attr = attr || {};
        YAHOO.HLK.FormEater.superclass.initAttributes.call(this, attr);				

		this.setAttributeConfig('loaderHTML', {
            value: attr.loaderHTML || "<div class=\"loader\">Laster...</div>",
            validator: YAHOO.lang.isBoolean,
            writeOnce: true
        });

		this.setAttributeConfig('errorHTML', {
            value: attr.errorHTML || "<div class=\"error\">Feil under kommunikasjon med server</div>",
            validator: YAHOO.lang.isBoolean,
            writeOnce: true
        });

		this.setAttributeConfig('result_classname', {
            value: attr.results_classname || 'result',
            validator: YAHOO.lang.isBoolean,
            writeOnce: true
        });
		
		this.setAttributeConfig('closeBtn', {
			value: attr.closeBtn || true
		});

		this.setAttributeConfig('closeBtnTitle', {
			value: attr.closeBtnTitle || 'Lukk'
		});

		this.setAttributeConfig('closeBtnClass', {
			value: attr.closeBtnClass || 'btn-close'
		});
		
		this.setAttributeConfig('forms', {
            value: [],
            readOnly: true
        });
					
		// Find results area
		this._resultParent = 
        	this.getElementsByClassName(this.get('result_classname'), 'div' )[0] || alert("no result area");
		
		if(this._resultParent)
			this._resultParent.style.display = 'none';
		
		// Finds exsiting forms
		_initForms.call(this);

	};
	
	proto.addField = function(form, attr) {
		// TODO: This should allso work if form is passed, eighter by 
		// index, form name or object

		var forms = [];
		
		if (arguments.length == 1) {
            attr = form; // treat first arg as attr object
            form = attr.form || null;
        }
		
		forms = this.get('forms');		
		for(var i=0; i < forms.length ;i++) {
			var input = document.createElement('input');
			YAHOO.lang.augmentObject( input , attr, true );
			forms[i].appendChild(input);
			//this.get('element').appendChild(input);
		}	
	};
	
	proto.addForm = function(form) {
		//Hijack form
		Event.addListener(form, 'submit', _sendForm, form, this);
		this.get('forms').push(form);
	};

	var _initForms = function() {
		var forms = this.getElementsByTagName( 'form' );

		for (var i = 0, len = forms.length; i < len; ++i) {
			this.addForm(forms[i]);
		}
	};
	
	var _sendForm = function(e, form) {
		YAHOO.util.Event.preventDefault(e); 

		// TODO: Check if ?* should be stripped on POST
		// TODO: touppercase for form.method
		var method = form.method || 'POST';
		var action = method == 'POST' ? (form.action || document.location) : form.action;	
		
		YAHOO.util.Connect.setForm(form); 
		
		// Temporarily disable the form
		for(var i=0; i<form.elements.length; i++) { 
			form.elements[i].disabled = true;			
		}
		
		//Display loader code
		this._resultParent.style.display='block';
		this._resultParent.innerHTML = this.get('loaderHTML');
				
		YAHOO.util.Connect.asyncRequest(
			method,
			action,
			{
				success: function(o) {						
					this._resultParent.innerHTML = o.responseText;

					if( this.get('closeBtn') ) {
						var self=this;
												
						this._closeBtnEl = document.createElement('a');
						this._closeBtnEl.innerHTML = this.get('closeBtnTitle');
						this._closeBtnEl.className = this.get('closeBtnClass');			
						this._closeBtnEl.href = "#";				
						this._resultParent.insertBefore(this._closeBtnEl, this._resultParent.childNodes[0]);
						
						var close = function(e) {	
							YAHOO.util.Event.preventDefault(e);
							self._resultParent.style.display = 'none';
						}
						YAHOO.util.Event.addListener(this._closeBtnEl, "click", close ); 
					}
					
					for(var i=0; i<form.elements.length; i++) { 
						form.elements[i].disabled = false;			
					}
				},
				failure: function(o) {
					this._resultParent.innerHTML = this.get('errorHTML');
				},
				scope: this,
				timeout: 5000
				}
		);		
	};
})();