window.addEvent('domready',function(){
	//Detect flash
	if (FlashDetect && !(Browser.Engine.gecko==true && Browser.Engine.version==18 && Browser.Platform.mac)){
		PMC.hasFlash = FlashDetect.DetectVersion(9,0,16);										//Determine flash
		if (appMode!=null && appMode=='html'){
			PMC.hasFlash = false;
		}
	}
	
	//var h = new PMC.FormHandler();																//Instantiate form handler
	//var k = new PMC.FormKitSelector();
	var flashObj = new PMC.FlashForm();
	
	$('btn-mute').addEvent('click',function(e){
		e.stopPropagation();
		flashObj.toggleAudio();
		return false;
	});
	
});






PMC.FlashForm = new Class({
	flashObj : null,
	audio : true,
	initialize : function(){
		if (PMC.hasFlash==false){
			$('content-wrapper').removeClass('has-flash');
			return;
		}
		/*
		var flashvars = {
			assetPath : "",
			status : Cookie.read("status"),
			firstname : Cookie.read("firstname"),
			package : Cookie.read("package")
		};
		
		var params = {
			bgcolor : "#FFFFFF",
			scale : "NOSCALE",
			salign : "B",
			allowscriptaccess : "always"
		};
		
		var attributes = {};
		*/
		var flashvars = {};
		flashvars.assetPath = "";
		flashvars.configPath = "assets/config/homepage_f" + flight + ".xml";
		
		var params = {};
		params.bgcolor="#FFFFFF";
		params.wmode = "transparent";
		params.allowscriptaccess = "always";
		
		var attributes = {};
		//swfobject.embedSWF("assets/swf/USPSPriorityMail.swf", "FlashForm", "941", "371", "9" , null , flashvars , params , attributes );
		swfobject.embedSWF("assets/swf/USPSHoliday.swf", "FlashForm", "941", "371", "9" , null , flashvars , params , attributes );
	},
	toggleAudio : function(){
		if (!this.flashObj){
			this.flashObj = $('FlashForm');
		}
		if (this.audio==true){
			this.flashObj.muteAudio();
		} else {
			this.flashObj.unmuteAudio();
		}
		this.audio = !this.audio;
	}
});

PMC.GetFlash = new Class({
	settings : {
	},
	element : null,
	fx : null,
	btnClose : null,
	isHidden : false,
	initialize : function(){
		this.element = $("flash-getflash-wrapper");
		
		if (PMC.hasFlash==true){
			return;
		}	
		
		this.element.setStyle('display','block');
		this.btnClose = this.element.getElement('div.close');
		this.fx = new Fx.Morph(this.element,{
			duration : '300'
		});
		var _this = this;
		this.btnClose.addEvents({
			'click':function(e){
				_this.hide();
			}
		});
	},
	hide : function(){
		var _this = this;
		if (this.isHidden==true) {return;};
		if (Browser.Engine.trident){
			$('flash-al-noflash-v2').setStyle('display','none');
			this.element.setStyle("display","none");
		} else {
			$('flash-al-noflash-v2').tween('opacity','0');
			this.fx.start({
				'height':0,
				'overflow':'hidden',
				'width':0,
				'top':0
			}).chain(function(){
				_this.element.setStyle("display","none");
			});
		}
		this.isHidden = true;
	},
	hideInstant : function(){
		$('flash-al-noflash-v2').setStyle('display','none');
		this.element.setStyle("display","none");
		this.isHidden = true;
	}
});

PMC.FormKitSelector = new Class({
	settings : {
		identifiers : {
		}
	},
	parent : null,
	currElement : null,
	kits : null,
	initialize : function(){
		var _this = this;
		this.parent = $("form-package-selector");
		this.kits = this.parent.getElements("div.package-option");
		
		this.kits.each(function(el,index){
			var thumb = el.getElement('div.pkg-thumb');
			var plus = el.getElement('div.pkg-plus');
			plus.addEvents({
				'click':function(e){
					_this.popup.show(el);
				},
				'mouseenter':function(e){
					this.addClass("pkg-plus-hover");
				},
				'mouseleave':function(e){
					this.removeClass("pkg-plus-hover");
				}
			});
			el.getElements('input').each(function(el2,index){
				el2.set('checked' , false);
				el2.addEvent('click',function(e){
					e.stopPropagation();
					$('input-kit').set('value',this.value);
					_this.select(el);
				});
			});
		});
		
		this.popup.init(this);
	},
	grayAll : function(){
		var _this = this;
		this.kits.each(function(el,index){
			var thumb = el.getElement('div.pkg-thumb');
			el.addClass("off");
			thumb.addClass("pkg-thumb-off");
		});
	},
	select : function(obj){
		this.currElement = obj;
		var _this = this;
		this.kits.each(function(el,index){
			var thumb = el.getElement('div.pkg-thumb');			
			if (!obj){
				el.removeClass("off");
				thumb.removeClass("pkg-thumb-off");
			} else {
				if (el==_this.currElement){
					el.removeClass("off");
					thumb.removeClass("pkg-thumb-off");
				} else {
					el.addClass("off");
					thumb.addClass("pkg-thumb-off");
				}
			}
		});
	},
	popup : {
		element : null,
		parent : null,
		init : function(parent){
			var _this = this;
			this.parent = parent;
			this.element = $('form-package-popup-wrapper');
			$("form-package-popup-btn-close").addEvents({
				'click':function(){
					_this.close();
				}
			});
		},
		show : function(el){
			this.parent.grayAll();
			
			this.element.setStyles({
				'display':'block',
				'overflow':'hidden',
				'height':0
			});
			
			$("form-package-popup-content-image").getElement('img').set('src',el.getElement('img').get("rel"));
			$("form-package-popup-content-detail").set('html',el.getElement('div.pkg-info').get("html").replace(/ by /g," x ").replace(/ inches/g,"\""));
			$("form-package-popup-content-header").set('html',el.getElement('h5').get("html"));
			
			$formObj = el.getElement('div.pkg-form');
			
			$("form-package-popup-content-form").set("html","");
			$formObj.getElements("label").each(function(el,index){
				var html = el.get("html");
				html = html.substring(html.toLowerCase().indexOf("</span>")+7,html.length);

				var i = new Element("input",{
					"name":"popup",
					"rel":el.get("for"),
					"id":"input_"+index,
					"type":"radio",
					"events":{
						'click':function(ev){
							$(this.get("rel")).set("checked","checked").fireEvent('click',ev);
						}
					}
				});
				var l = new Element("label",{
					"for":"input_"+index,
					"text":html
				});
				var p = new Element("p");
				p.adopt(i).adopt(l);
				$("form-package-popup-content-form").adopt(p);
			});
			this.element.morph({'height':270});
		},
		close : function(){
			this.parent.select(this.parent.currElement);
			this.element.morph({'height':0});
		}
	},
	validate : function(){
		
	}
});


/*
 * Manage validation + submission of main form
 */
PMC.FormHandler = new Class({
	settings : {
		//CSS identifiers
		identifiers : {
			validate : '.validate',
			required : '.required',
			error508Container : 'error-508-container',
			form : "pmc-form"
		}
	},
	error508Container : null,
	formFields : null,
	form : null,
	validator : null,
	errorCount : 0,
	page : 0,
	getFlash : null,
	fx : null,
	navBtnPrev : null,
	navBtnNext : null,
	h3Text : null,
	initialize : function(){
		var _this = this;
		this.page = 0;
		this.form = $(this.settings.identifiers.form);											//Object represent the page form
		
		//If no form object, exit the function. Not required since
		//this is the confirmation page and no form elements exist.
		if (!this.form){
			return;
		}
		
		//Instantiate form navigation buttons
		this.navBtnNext = new PMC.FormHandler.FormNavigationButton($("form-nav-btn-next"),this);			//Add event handler to Next button
		this.navBtnPrev = new PMC.FormHandler.FormNavigationButton($("form-nav-btn-prev"),this);			//Add event handler to Previous button
		
		//Initialize form
		this.error508Container = $(this.settings.identifiers.error508Container);				//HTML object that contains error messaging for screen readers
		this.validator = new PMC.FormHandler.FormValidator(this);								//Object containing validation code
		this.errorCount = this.form.getElements(this.settings.identifiers.required).length;		//Number of required form fields
		
		var pagination = 0;
		this.form.getElements('input').each(function(el,index){
			if (el.id=='weight1' || el.id=='shipwith1' || el.id=='pkg-input-variety'){
				pagination++;
			}
			el.set('page',pagination);
			el.addEvent('focus',_this.shiftManual.bind(_this,el));
		});
		$('package').set('page',1).addEvent('focus',this.shiftManual.bind(this,$('package')));

		
		this.formFields = this.form.getElements(this.settings.identifiers.validate);			//Get array of form elements that require validation
		this.formFields.each(function(el,index){												//Add validation when user moves off element (blur)
			el.addEvent("blur",function(ev){
				_this.validator.validate(this);
			});
			el.addEvent("focus",function(ev){
				this.removeClass("error");
			});
		});
		
		
		
		this.form.addEvent("submit",function(){													//Intersect submission by validating form fields
			_this.validator.runValidation(_this.formFields);
			var errorCount = _this.form.getElements(".error").length;
			return (errorCount===0);															//Submit form only if error count is zero
		});
		
		this.h3Text = this.form.getElement('h3').get('html');
		
		this.getFlash = new PMC.GetFlash();
		
		if ((Browser.Engine.gecko==true && Browser.Engine.version==18 && Browser.Platform.mac)){
			this.getFlash.hideInstant();
		}

		this.fx = new Fx.Morph($("form-fields"),{
			duration : 750,
			transition : Fx.Transitions.Cubic.easeInOut,
			link : 'chain'
		});
		
		//If user selects "other" shipper for who they primarily use for shipping, reveal a text box so they can enter the shipper's info
		$('shipwith1').addEvent('click',function(){
			$('input-shipper').disabled = true;
		});
		$('shipwith2').addEvent('click',function(){
			$('input-shipper').disabled = false;
		});
		this.loadForm();
		
		$('input-shipper').disabled = $('shipwith2').checked!=true;
	},
	saveForm : function(){
		var section = $("form-fields-wrapper").getElements("div.form-section")[this.page];
		section.getElements('input').each(function(el){
			if (el.get('type')=='radio'){
				if (el.checked==true){
					Cookie.write(el.name,el.value);
				}
			} else
			if (el.get('type')=='checkbox'){
				Cookie.write(el.name+'-'+el.value,el.checked);
			} else {
				Cookie.write(el.name,el.value);
			}
		});
		section.getElements('select').each(function(el){
			Cookie.write(el.name,el.value);
		});
	},
	updatePage : function(){
		var p;
		try{
			var p = Cookie.read('page').toInt();
		} catch (e){
			p = 0;
		}
		if (this.page>p){
			Cookie.write('page',this.page);
		}
	},
	loadForm : function (){
		var section = $("form-fields-wrapper");
		section.getElements('input').each(function(el){
			if (el.get('type')=='radio'){
				if (el.value==Cookie.read(el.name)){
					el.checked = true;
				}
			} else
			if (el.get('type')=='checkbox'){
				var value = Cookie.read(el.name+'-'+el.value);
				if ($defined(value)){
					el.checked = value!='false';
				} else {
					if (el.id=='input-optin'){
						el.checked = true;
					}
				}
			} else {
				value = Cookie.read(el.name);
				el.value = value==null?"":value;
			}
		});
		section.getElements('select').each(function(el){
			var value = Cookie.read(el.name);;
			if ($defined(value)){
				el.value = value;
			}
		});
		
		$("form-nav-buttons").getElements("div.form-nav-btn")[this.page].removeClass("selected");
		try{
			this.page = Cookie.read('page').toInt();
			$('form-fields').tween('margin-left',(-680)*this.page);
			this.getFlash.hideInstant();
			if (this.page!=0){
				this.navBtnPrev.enable();
			}
		} catch (e){}
		$("form-nav-buttons").getElements("div.form-nav-btn")[this.page].addClass("selected");
	},	
	error : function(error){
		if (error){
			this.errorCount++;
		}
		else {
			if (this.errorCount>0){
				this.errorCount--;
			}
		}
	},
	shiftManual : function(obj){
		var page = obj.get('page').toInt();
		this.fx.element.setStyle('margin-left',-680*page);
		if (page>=1){
			this.getFlash.btnClose.fireEvent('click');
		}
	},
	shift : function(dir,btn){
		this.saveForm();
		if (dir=="prev"){
			if (this.page==0) return;
			$("form-nav-buttons").getElements("div.form-nav-btn")[this.page].removeClass("selected");
			this.page--;
		} else
		if (dir=="next"){
			//Error check current page before shifting
			
			this.validator.runValidation(this.formFields);
			var errorCount = this.form.getElements(".error").length;
			if (this.page==0 && $("lbl-package").hasClass("error") && errorCount>0){
				errorCount--;
				$("lbl-package").removeClass("error");
			}
			if (this.page!=3 && $("lbl-input-kit").hasClass("error") && errorCount>0){
				errorCount--;
				$("lbl-input-kit").removeClass("error");
			}
			if (errorCount>0){
				this.fx.start({
					'margin-left':(-680)*this.page
				});
				this.showError();
				return;
			}
			
			if (this.page==3) {
				this.submit();
				return;
			}

			//No errors...so continue
			
			this.clearError();
			this.getFlash.btnClose.fireEvent('click');
			
			$("form-nav-buttons").getElements("div.form-nav-btn")[this.page].removeClass("selected");
			this.page++;
		}
		this.fx.start({
			'margin-left':(-680)*this.page
		});
		$("form-nav-buttons").getElements("div.form-nav-btn")[this.page].addClass("selected");
		
		if (this.page==0){
			this.navBtnPrev.disable();
		} else {
			this.navBtnPrev.enable();
		}
		this.updatePage();
	},
	submit : function(){
		$("pmc-form").submit();
	},
	showError : function(){
		this.form.getElement('h3').set('html','<span class="errormsg">Oops! You forgot to complete a required field.</span>')
	},
	clearError : function(){
		this.form.getElement('h3').set('html',this.h3Text);
	}
});


/*
 * Add mouse hover interactivity to an element represented by "obj"
 */
PMC.FormHandler.FormNavigationButton = new Class({
	Extends : PMC.Button,
	initialize : function(obj,manager){
		this.parent(obj,manager);
		this.status = 0;
	},
	attachEvents : function(){
		var _this = this;
		this.element.addEvents({
			'click':function(el){
				_this.manager.shift(this.get("rel"),this);
			}
		});
	}
});


/*
 * =====================================================
 * =====================================================
 * 		HELPER CLASSES + FUNCTIONS
 * =====================================================
 * =====================================================
 */

PMC.FormHandler.FormValidator = new Class({
	settings : {
		classError : "error"
	},
	handler : null,
	regexp : null,
	initialize : function(handler){
		this.handler = handler;
	},
	runValidation : function(items){
		//Run validation on all form fields within the items array
		var _this = this;
		items.each(function(el){_this.validate(el);});
		return false;
	},
	validate : function(obj){
		//Validate individual form fields
		
		if (obj.id=="input-kit"){
			//H
			this.validateKit(obj);return;
		}
		
		//First check is for mandatory
		if (obj.hasClass("required")){
			var lbl = $(obj.get("rel"));
			if (obj.value===null || obj.value.trim().length===0){
				this.setError(obj,1);
				this.checkGroup(obj);
				return;
			} else {
				this.checkGroup(obj);
				this.clearError(obj,1);
			}
		} else if (obj.value===null || obj.value.trim().length===0){
			//If object is not required, then additional validation is not required if the form field value is empty
			this.clearError(obj,2);
			return;
		}
		
		//Validate by field type...the additional field context is specified in the form element object's class
		if (obj.hasClass("email")){
			this.checkEmail(obj);
		} else
		if (obj.hasClass("select")){
			this.checkSelect(obj);
		} else
		if (obj.hasClass("text")){
			this.checkText(obj);
		} else
		if (obj.hasClass("zip")){
			this.checkZip(obj);
		} else
		if (obj.hasClass("phone")){
			this.checkPhone(obj);
		} else
		if (obj.hasClass("number")){
			this.checkNumber(obj);
		}
		
		this.checkGroup(obj);
	},
	checkEmail : function(obj){
		this.regexp = /^([a-zA-Z0-9])+([\.-_a-zA-Z0-9_-])*@([\.\-_a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/;
		if (obj.value.length>0 && !this.regexp.test(obj.value)){
			this.setError(obj,2);return;
		}
		this.clearError(obj,2);
	},
	checkSelect : function(obj){
	},
	checkText : function(obj){
		this.regexp = /([0-9])/;
		if (this.regexp.test(obj.value)){
			this.setError(obj,2);return;
		}
		//No errors found
		this.clearError(obj,2);
	},
	checkNumber : function(obj){
		//Check for min # of characters (Using maxchar as minimum required)
		var len = obj.get("maxlength").toInt();
		if (len!=-1 && (len!=obj.value.length)){
			this.setError(obj,2);
			return;
		} else {
			this.clearError(obj,2);
		}

		this.regexp = /^[0-9]+$/;
		if (!this.regexp.test(obj.value)){
			this.setError(obj,3);
		} else {
			this.clearError(obj,3);
		}
	},
	checkZip : function(obj){
		this.regexp = /(^\d{5}$)|(^\d{5}-\d{4}$)/;
		if (!this.regexp.test(obj.value)){
			this.setError(obj,2);return;
		}
		//No errors found
		this.clearError(obj,2);
	},
	checkPhone : function(obj){
		this.regexp = /(^\d{3}-\d{4}$)|(^\d{7}$)|(^\d{3}\s\d{4}$)/;
		if (!this.regexp.test(obj.value)){
			this.setError(obj,2);return;
		}
		//No errors found
		this.clearError(obj,2);
	},
	setError : function(obj,error){
		//Add error class to form object + toggle visibility in the accessibility error list
		//obj.addClass(this.settings.classError);
		$(obj.get("name")+"-"+error).addClass("show508");
		$$("label[for="+obj.id+"]")[0].addClass("error");
		
		this.handler.error(true);
	},
	clearError : function(obj,error){
		//Remove error class to form object + toggle visibility in the accessibility error list
		//obj.removeClass(this.settings.classError);
		$(obj.get("name")+"-"+error).removeClass("show508");
		$$("label[for="+obj.id+"]")[0].removeClass("error");

		this.handler.error(false);
	},
	checkGroup : function(obj){
		var lbl = $(obj.get("rel"));
		if (lbl){
			var inputs = obj.getParent().getElements('label');
			
			var hasError = inputs.some(function(el,index){
				return el.hasClass("error");
			});
			
			if (hasError){
				lbl.addClass("error");
			} else {
				lbl.removeClass("error");
			}
		}
	},
	validateKit : function(obj){
		if (obj.value===null || obj.value.length===0){
			$('lbl-input-kit').addClass("error");
			$(obj.get("name")+"-"+1).addClass("show508");
		} else {
			$('lbl-input-kit').removeClass("error");
			$(obj.get("name")+"-"+1).removeClass("show508");
		}
	}
});

PMC.FormHandler.StatusCodes = {
	disabled : -1,
	enabled : 1,
	off : -1,
	over : 0,
	selected : 1
};
