/***
*
*  Upload Handler Class:  
*     --- a very beta version
*     server side note:  the server side script must echo something that contains this.options.responseOK
*     if this.options.responseOK is not echoed it will be treated as an error.
*
***/
var UploadHandler = new Class({
        //
		//  initialize
		//
		Implements: [Options,Events],
		options: {
				cover_opacity:.85,
				checkDelay:500,
				cover_id:'form_cover',
				success_str:'Your message was successfuly sent.  Thanks!',
				posterror_str:'ERROR:  We applogized but there was an error submitting your form.<br> Please try again later.<br>',
				sendToLowerCase:true,
				undetermined_str:'an undetermined field',
				checkErrorHeader:'<br>',
				missingErrorHeader:'The Following Fields are Requried:<br>',
				errorPreLine:'&nbsp;&nbsp',
				errorEndLine:'<br>',
				badEmail_str:'You have entered an invalid email address.',
				return_id:'form_return',
				return_str:'RETURN',
				responseOK:"phpResponse=ok",
				validEmail:/^[^0-9][A-z0-9_]+([.][A-z0-9_]+)*[@][A-z0-9_]+([.][A-z0-9_]+)*[.][A-z]{2,4}$/
		},
		initialize: function(form,options){
				this.form = document.id(form)
				this.form.addEvent('submit',this.check.bind(this))
		},
		// --- public ---
		//
		// setRequired (an array of names for required inputs)	
		// setEmail (same as setRequired but makes sure the fields are valid emails)	
		// addLoader (path to an animatied gif or something like that)
		//
		setRequired: function(arr){
				this.required = arr
		},
		setEmail: function(arr){
				this.emails = arr	
		},
		addLoader: function(pth,ldr_id){
				this.loader = new Element("img",{src:pth,id:ldr_id})
		},
		//  --- internal ---
		//
		//  check if form is complete and email is valid
		//
		check: function(e){
				e.stop();
				var cvr = new Element("div",{id:this.options.cover_id})
				cvr.setStyles({
						width:"100%",
						height:"100%",
						opacity:this.options.cover_opacity,
						position:"absolute",
						top:0,
						left:0,
						"z-index":9999,
						"background-color":"#000",
						"text-align":"center"
				})
				this.form.getParent().grab(cvr)
				var bool = true
				this.missing = []
				if (this.required){
						this.required.each(function(str){
								if(!!!(this.form[str].get("value") || this.form[str].get("value") === 0) && this.form[str].get("value") == ""){
										var msng = this.options.undetermined_str
										if (this.form[str].getPrevious("label")) msng = this.form[str].getPrevious("label").get("html")
										else if (this.form[str].get("id")) msng = this.form[str].get("id")
										if (this.options.sendToLowerCase) msng = msng.toLowerCase()
										this.missing.push(msng)
										bool = false
								}		
						}.bind(this))		
				}
				if (this.emails){
						this.emails.each(function(str){
								if(!this.options.validEmail.test(document.id(str).get("value"))){
										this.badEmail = true
										bool = false
								}		
						}.bind(this))		
				}
				if (bool) this.submit()
				else this.addCheckErrors()
		},
		addCheckErrors: function(){
				var err_str = this.options.checkErrorHeader
				if (this.missing.length > 0) {
						var err_str = this.options.missingErrorHeader
						this.missing.each(function(str){
								err_str += this.options.errorPreLine + str + this.options.errorEndLine
						}.bind(this))
				}
				if (this.badEmail) err_str += this.options.badEmail_str
				this.addMessage(err_str)
				this.fireEvent('ERROR')	
		},
		//
		//  submit form
		//
		submit: function(){
				this.fireEvent('SUBMIT')	
				if (this.loader){
						var ldr = this.loader.clone()
						ldr.fade("hide")
						document.id(this.options.cover_id).grab(ldr)
						ldr.fade(1)
				}
				// adding iframe for ajax uploads...
				var ifrm = new Element("iframe",{src:"javascript:false",name:"iframe"})
				document.body.grab(ifrm)
				var hiddenForm = this.form.clone()
				ifrm.grab(hiddenForm)
				ifrm.setStyle("display","none")
				hiddenForm.set("target","iframe")
				// listen for server-side response
				ifrm.addListener("load",function(e){
						var check = function(){
								if (ldr) ldr.destroy()
								this.response = ifrm.contentWindow.document.body.innerHTML
								var rsp_idx = this.response.search(this.options.responseOK)
								console.log(this.response,rsp_idx)
								if (rsp_idx>=0) {
										if (this.options.success_str) this.addMessage(this.options.success_str+"<br><br>"+this.response.substring(rsp_idx + this.response.length),true)
										else this.destroyCover(true)		
										this.fireEvent('SUCCESS')
								} else {
										if (this.options.posterror_str) this.addMessage(this.options.posterror_str+"<br>"+this.response)
										else this.destroyCover(true)		
										this.fireEvent('ERROR')	
								}		
						}.bind(this)
						check.delay(this.options.checkDelay)
				}.bind(this))
				// submit form
				hiddenForm.submit()
		},
		//
		//  utils
		//
		addMessage: function(msg,rst){
				document.id(this.options.cover_id).set("html",msg)
				var rtn = new Element("div",{id:this.options.return_id})
				rtn.set("html",this.options.return_str)
				rtn.setStyle("cursor","pointer")
				rtn.addEvent("click",function(){
						this.destroyCover(rst)
				}.bind(this))
				document.id(this.options.cover_id).grab(rtn)
		},
		destroyCover: function(rst){
				if (rst) this.form.reset()
				document.id(this.options.cover_id).destroy()
		}
		
});
