var MooForm=new Class({Implements:[Events,Options],options:{layer:null,layerType:'inline',layerWidth:200,layerOffset:'0, 0',zIndex:999,timeHide:3000,iframe:null,overlay:null,opacity:0.8,fadeEffect:true,mooForm:null,mooData:null,timeWait:null,errorElement:null,delimeter:'|',onShow:$empty,onHide:$empty,onChange:$empty,onSubmit:$empty},initialize:function(form,data,options){var that=this;that.setOptions(options);var formObj=$(form||document.forms[form]);if(!formObj){that.log(form+' Form does not exists!');return}that.options.mooForm=formObj;that.options.mooData=data;if(options.onSubmit){that.options.onSubmit=options.onSubmit}that.log(form+' - instance of MooFrom is starting...');that.initLayer();that.initMooForm();that.log(form+' - instance of MooFrom is ready.')},initLayer:function(){var that=this;var mooForm=that.options.mooForm;var layerId=mooForm.id||mooForm.name;that.options.layer=new Element('div',{'id':layerId+'Layer','class':'layer'}).inject(document.body);var layerButton=new Element('a',{'href':'javascript:void(0);','html':'x','events':{'click':function(e){e.stop();that.hideLayer()}}}).inject(that.options.layer);var layerContent=new Element('p').inject(that.options.layer)},initMooForm:function(){var that=this;var mooForm=that.options.mooForm;var mooData=that.options.mooData;for(var i=0;i<mooData.length;i++){for(var j=0;j<mooForm.elements.length;j++){var element=$(mooForm.elements[j]);if(element.name==mooData[i].name){that.log(mooForm.name+' - instance of MooFrom is initializing '+mooData[i].name+' element');that.initElement(element,mooData[i])}}}mooForm.removeEvents().addEvent('submit',function(e){that.log(mooForm.name+' - instance of MooFrom fired event : onSubmit');if(that.isValidMooForm()){if($type(that.options.onSubmit)!=false){e.stop();that.fireEvent('onSubmit')}}else{e.stop()}});var resetBtn=mooForm.getElement('input[type=reset]');if(resetBtn){resetBtn.addEvent('click',function(e){that.log(mooForm.name+' - instance of MooFrom fired event : onReset');e.stop();that.hideLayer();that.resetMooForm()})}},isValidMooForm:function(){var that=this;var mooForm=that.options.mooForm;var mooData=that.options.mooData;for(var i=0;i<mooData.length;i++){for(var j=0;j<mooForm.elements.length;j++){var element=$(mooForm.elements[j]);if(element.name==mooData[i].name){var validated=that.validElement(element);element.store('validated',validated);that.log(mooForm.name+' - instance of MooFrom is validating '+mooData[i].name+' element : '+validated);if(!validated){that.showLayer(element);return false}}}}return true},resetMooForm:function(){var that=this;var mooForm=that.options.mooForm;mooForm.reset();that.resetMooFormInEditMode()},initMooFormInEditMode:function(){var that=this;var mooForm=that.options.mooForm;for(var i=0;i<mooForm.elements.length;i++){var element=$(mooForm.elements[i]);switch(element.type){case'text':case'textarea':case'password':element.store('initValue',element.get('value').trim());break}switch(element.type){case'select-one':element.store('initValue',element.selectedIndex);break;case'select-multiple':element.store('initValue',true);for(var j=0;j<element.options.length;j++){if(element.options[j].selected){element.store('initValue'+j,j)}}break}switch(element.type){case'radio':case'checkbox':element.store('initValue',element.checked)}}},resetMooFormInEditMode:function(){var that=this;var mooForm=that.options.mooForm;for(var i=0;i<mooForm.elements.length;i++){var element=$(mooForm.elements[i]);var initValue=element.retrieve('initValue',false);if(initValue){switch(element.type){case'text':case'textarea':case'password':element.set('value',initValue);break}switch(element.type){case'select-one':element.selectedIndex=initValue;break;case'select-multiple':for(var j=0;j<element.options.length;j++){var _initValue=element.retrieve('initValue'+j,false);if(_initValue){element.options[j].selected=true}}break}switch(element.type){case'radio':case'checkbox':element.checked=initValue}}}},initElement:function(element,data){var that=this;element.store('data',data);element.store('validated',true);if($type(data.init)!=false){switch(element.type){case'text':case'textarea':case'password':element.store('initValue',element.get('value').trim());element.set('value',data.init);element.addEvents({'focus':function(){if(element.get('value').trim()==data.init){element.set('value','')}},'blur':function(){if(element.get('value').trim()==''){element.set('value',data.init)}}});break;case'select-one':case'select-multiple':element.store('initValue',element.selectedIndex);element.selectedIndex=Number(data.init);break;case'radio':case'checkbox':element.store('initValue',element.checked);element.form[element.name][Number(data.init)].checked=true}}if($type(data.maxLength)!=false){switch(element.type){case'text':case'password':element.set('maxLength',data.maxLength);break;case'textarea':element.addEvent('keypress',function(e){var evt=new Event(e);var code=evt.getCharCode();if(element.get('value').trim().length>=data.maxLength&&code!=0){evt.stop()}})}}if($type(data.restrict)!=false){switch(element.type){case'text':case'password':case'textarea':element.addEvent('keypress',function(e){var evt=new Event(e);var key=evt.getCharKey();var re=new RegExp(data.restrict);if(key!=''&&!re.test(key)){evt.stop()}})}}element.addEvents({'click':function(e){that.onChange(element);that.hideLayer()},'keyup':function(e){that.onChange(element);that.hideLayer()},'change':function(e){that.onChange(element);that.hideLayer()}});if($type(data.events)!=false){element.addEvents(data.events)}},validElement:function(element){var that=this;var data=element.retrieve('data');switch($type(data.valid)){case'function':element.store('message',data.message.trim());return data.valid();break;case'boolean':element.store('message',data.message.trim());return data.valid;break;case'string':var validate=data.valid.trim();var validateArray=validate.split(that.options.delimeter);var message=data.message.trim();var messageArray=message.split(that.options.delimeter);if(validateArray.length!=messageArray.length){return true}for(var i=0;i<validateArray.length;i++){if(!that.isValidated(element,validateArray[i])){element.store('validated',false);element.store('message',messageArray[i]);return false}}}return true},isValidated:function(element,valid){var data=element.retrieve('data');var value=$pick(element.get('value'),'').trim();var defaultValidated=value==$pick(data.init,'');switch(valid){case'range':switch(element.type){case'text':case'textarea':return defaultValidated||Number(value)>=$pick(data.minimum,0)&&Number(value)<=$pick(data.maximum,0)}break;case'required':switch(element.type){case'text':case'textarea':case'password':case'file':return value.length>0&&value!=$pick(data.init,'')}break;case'minimum':switch(element.type){case'text':case'textarea':case'password':case'file':return value.length>=$pick(data.minimum,0)&&value!=$pick(data.init,'')}break;case'maximum':switch(element.type){case'text':case'textarea':case'password':case'file':return value.length<=$pick(data.maximum,0)&&value!=$pick(data.init,'')}break;case'number':switch(element.type){case'text':case'textarea':case'password':return defaultValidated||value.isNumber()}break;case'email':switch(element.type){case'text':case'textarea':return defaultValidated||value.isEmail()}break;case'emails':switch(element.type){case'text':case'textarea':return defaultValidated||value.isEmails()}break;case'website':switch(element.type){case'text':case'textarea':return defaultValidated||value.isWebsite()}break;case'websites':switch(element.type){case'text':case'textarea':return defaultValidated||value.isWebsites()}break;case'phone':switch(element.type){case'text':case'textarea':return defaultValidated||value.isPhone()}break;case'date':switch(element.type){case'text':case'textarea':case'label':return defaultValidated||value.isDate($pick(data.format,'dmy'))}break;case'future':switch(element.type){case'text':case'textarea':var other=$(element.form[data.other]);var format=$pick(data.format,'dmy');if(!other){var date=new Date();var _date=date.getDate();var _month=date.getMonth()+1;var _year=date.getFullYear();switch(format){case'dmy':other=new Array(_date,_month,_year).join('/');break;case'mdy':other=new Array(_month,_date,_year).join('/');break;case'ymd':other=new Array(_year,_month,_day).join('/')}}else{other=other.get('value').trim()}return defaultValidated||value.isCompareDate(format,other)==-1}break;case'compare':switch(element.type){case'text':case'textarea':case'password':var other=$(element.form[data.other]);var format=$pick(data.format,'dmy');if(!other){switch($pick(data.type,'')){case'string':other='';break;case'number':other=0;break;case'date':var date=new Date();var _date=date.getDate();var _month=date.getMonth()+1;var _year=date.getFullYear();switch(format){case'dmy':other=new Array(_date,_month,_year).join('/');break;case'mdy':other=new Array(_month,_date,_year).join('/');break;case'ymd':other=new Array(_year,_month,_day).join('/')}}}else{other=other.get('value').trim()}switch($pick(data.operator,'=')){case'=':switch($pick(data.type,'')){case'string':return defaultValidated||value==other;case'number':return defaultValidated||Number(value)==Number(other);case'date':return defaultValidated||value.isCompareDate(format,other)==0}break;case'!=':switch($pick(data.type,'')){case'string':return defaultValidated||value!=other;case'number':return defaultValidated||Number(value)!=Number(other);case'date':return defaultValidated||value.isCompareDate(format,other)!=0}break;case'>':switch($pick(data.type,'')){case'string':return defaultValidated||value>other;case'number':return defaultValidated||Number(value)>Number(other);case'date':return defaultValidated||value.isCompareDate(format,other)==-1}break;case'>=':switch($pick(data.type,'')){case'string':return defaultValidated||value>=other;case'number':return defaultValidated||Number(value)>=Number(other);case'date':return defaultValidated||value.isCompareDate(format,other)==-1||value.isCompareDate(format,other)==0}break;case'<':switch($pick(data.type,'')){case'string':return defaultValidated||value<other;case'number':return defaultValidated||Number(value)<Number(other);case'date':return defaultValidated||value.isCompareDate(format,other)==1}break;case'<=':switch($pick(data.type,'')){case'string':return defaultValidated||value<=other;case'number':return defaultValidated||Number(value)<=Number(other);case'date':return defaultValidated||value.isCompareDate(format,other)==1||value.isCompareDate(format,other)==0}}}break;case'file':switch(element.type){case'text':case'textarea':case'file':switch($pick(data.type,'')){case'image':return defaultValidated||value.isImage();case'video':return defaultValidated||value.isVideo();case'audio':return defaultValidated||value.isAudio();case'other':return defaultValidated||value.test(new RegExp($pick(data.extension,''),'i'))}}break;case'checked':switch(element.type){case'checkbox':case'radio':var group=element.form[element.name];if(!group.length){return group.checked}else{for(var i=0;i<group.length;i++){if(group[i].checked){return true}}}return false}break;case'selected':switch(element.type){case'select-one':return element.selectedIndex!=$pick(data.init,(element.size==0)?0:-1);case'select-multiple':return element.selectedIndex!=$pick(data.init,-1)}break;default:if($type(eval('data.'+valid))!=false){return eval('data.'+valid+'()')}}return true},showLayer:function(element){var that=this;var data=element.retrieve('data');var layer=that.options.layer;that.options.errorElement=element;that.onShow(element);layer.getElement('p').set('html',element.retrieve('message'));var layerType=data.layerType||that.options.layerType;var layerOffset=(data.layerOffset)?data.layerOffset.split(','):['0','0'];var layerWidth=data.layerWidth||that.options.layerWidth;switch(layerType){case'inline':var coords=element.getCoordinates();layer.set('styles',{'visibility':'visible','display':'block','position':'absolute','top':coords.top+coords.height+layerOffset[1].toInt()+'px','left':coords.left+layerOffset[0].toInt()+'px','width':layerWidth+'px','zIndex':that.options.zIndex+3}).swapClass('popup','inline');if(Browser.Engine.trident4){that.showIframeIE6Fix(layer)}break;case'popup':var coords=layer.getCoordinates();layer.set('styles',{'visibility':'visible','display':'block','position':Browser.Engine.trident4?'absolute':'fixed','top':Browser.Engine.trident4?window.getScrollTop():0+window.getHeight()/2-coords.height/2+'px','left':window.getWidth()/2-layerWidth/2+'px','width':layerWidth+'px','zIndex':that.options.zIndex+3}).swapClass('inline','popup');if(Browser.Engine.trident4){window.addEvent('scroll',function(){layer.set('styles',{'top':window.getScrollTop()+window.getHeight()/2-coords.height/2+'px','left':window.getWidth()/2-layerWidth/2+'px'})})}var fadeEffect=$pick(data.fadeEffect,that.options.fadeEffect);if(fadeEffect){that.showOverlay()}break;case'alert':window.alert(element.retrieve('message'));break}switch(element.type){case'file':break;case'select-one':case'select-multiple':element.focus();break;default:element.select();element.focus();break}$clear(that.options.timeWait);that.options.timeWait=that.hideLayer.periodical(that.options.timeHide,that)},hideLayer:function(){var that=this;$clear(that.options.timeWait);var layer=that.options.layer;var element=that.options.errorElement;var data=null;if(element){data=element.retrieve('data');that.onHide(element)}layer.set('styles',{'visibility':'hidden'});if(Browser.Engine.trident4){that.hideIframeIE6Fix(layer)}if(element){var fadeEffect=$pick(data.fadeEffect,that.options.fadeEffect);if(fadeEffect){that.hideOverlay()}}},showIframeIE6Fix:function(layer){var that=this;var dim=layer.getCoordinates();if(!that.options.iframe){that.options.iframe=new IFrame({'id':layer.id+'Iframe','src':'javascript:false;','frameBorder':0,'scrolling':'no','styles':{'border':'0 none','margin':0,'padding':0,'zIndex':that.options.zIndex+2,'visibility':'hidden','display':'none','position':'absolute','filter':'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'}}).inject(layer,'before')}that.options.iframe.set('styles',{'visibility':'visible','display':'block','top':dim.top,'left':dim.left,'width':dim.width,'height':dim.height})},hideIframeIE6Fix:function(layer){var that=this;if(that.options.iframe){that.options.iframe.set('styles',{'visibility':'hidden','display':'none'})}},showOverlay:function(){var that=this;if(!that.options.overlay){that.options.overlay=new IFrame({'id':'overlayIframe','src':'javascript:false;','frameBorder':0,'scrolling':'no','styles':{'margin':0,'padding':0,'top':0,'left':0,'width':Math.max(window.getWidth(),document.body.offsetWidth)+'px','height':Math.max(window.getHeight(),document.body.offsetHeight)+'px','zIndex':that.options.zIndex+1,'visibility':'hidden','display':'none','position':'absolute','opacity':that.options.opacity}}).inject(document.body);var _document=$pick(that.options.overlay.contentDocument,that.options.overlay.contentWindow.document);_document.open();_document.write('<html><body bgColor="#000"></body></html>');_document.close();new Element('div',{'id':'overlayDiv','styles':{'margin':0,'padding':0,'top':0,'left':0,'width':Math.max(window.getWidth(),document.body.offsetWidth)+'px','height':Math.max(window.getHeight(),document.body.offsetHeight)+'px','zIndex':that.options.zIndex+2,'visibility':'hidden','display':'none','display':'none','position':'absolute','opacity':that.options.opacity}}).inject(document.body)}$('overlayIframe').setStyle('display','block');$('overlayDiv').setStyle('display','block');if(Browser.Engine.trident4){$$('select').each(function(element){element.setStyle('visibility','hidden')})}},hideOverlay:function(){var that=this;if($('overlayIframe')&&$('overlayDiv')){$('overlayIframe').setStyle('display','none');$('overlayDiv').setStyle('display','none');if(Browser.Engine.trident4){$$('select').each(function(element){element.setStyle('visibility','visible')});window.removeEvents()}}},onShow:function(element){var that=this;that.fireEvent('onShow',element)},onHide:function(element){var that=this;that.fireEvent('onHide',element)},onChange:function(element){var that=this;that.fireEvent('onChange',element)},onSubmit:function(element){var that=this;that.fireEvent('onSubmit',element)},log:function(text,args){if(window.console){console.log(text.substitute(args||{}))}}});