$j(function(){
	
	$j("#regForm").find("select").each(function(){
		new $j.Avaya.CustomSelect($j(this));
	});
	
	
	var 
		regForm = $j('#regForm'),
		validation = new $j.Avaya.Validation({form:regForm}),
		errs = "",
		moreInfo = $j("#moreInfo"),
		moreObj = new $j.Avaya.ShowMore({trigger:moreInfo.find("a.moreTrigger"), content:moreInfo.find(".moreContent")});
		
	regForm.submit(function(e){
		errs = validation.getRequiredString();
		
		if (errs.length) {
			e.preventDefault();
			alert(errs);
		}
		
	});
	
		
	$j.Avaya.SifrConfig.masterReplace($j.Avaya.SifrConfig.gothamLight,{
		   selector: 'h1',
		   css: {
				'.sIFR-root': { 
					'color': '#cc0000', 
					'font-size': 30,
					'letter-spacing': -1
				}
		   },
		   selectable: false
	});	
	
	$j.Avaya.SifrConfig.masterReplace($j.Avaya.SifrConfig.gothamLight,{
		   selector: 'h3',
		   css: {
				'.sIFR-root': { 
					'color': '#404040', 
					'font-size': 18,
					'letter-spacing': -1
				}
		   },
		   selectable: false
	});	
	
	$j.Avaya.SifrConfig.masterReplace($j.Avaya.SifrConfig.gothamLight,{
		   selector: 'h2',
		   css: {
				'.sIFR-root': { 
					'color': '#404040', 
					'font-size':30,
					'letter-spacing': -1
				}
		   },
		   selectable: false
	});	
	
});

$j.Avaya.Validation = function(params){
	
	var settings = $j.extend({
		form : null,
		wrapperClass : 'formSection'
	},params);
	
	if (settings.form==null) return;
	
	var self = this;
	var required = settings.form.find(':text, select').not( '.not-required' );
    var conditioned = settings.form.find( 'input[data-requiredwhen]' );
	var rfs = [];
	var allerrs = '';
	
	function _checkRequired(){
		
		if( conditioned.size() ) {
            
            conditioned.each( function() {
                
                var el = $j( this ),
                    condition = el.attr( 'data-requiredwhen' ).split( '::' ),
                    field_name = condition[0],
                    condition_values = condition[1].split( ',' ),
                    condition_element = settings.form.find( '[name="' + field_name + '"]' );


                if( $j.inArray( condition_element.val(), condition_values ) >= 0 ) {
                    
                    el.removeClass( 'not-required' );

                } else {
                    
                    if( !el.hasClass( 'not-required' ) ) {
                    
                        el
                            .addClass( 'not-required' )
                            .parents( '.formSection' )
                                .removeClass( 'errorState' );

                    }

                }

            } );

            self.updateRequired();

        }
		
		for (var i=0;i<rfs.length;i++){
			var field = rfs[i].check();
			if (field && !field.valid && field.text){
				allerrs += field.text +', ';
			}
		}
	}
	
	function _setRequired(){
		
		for (var i=0;i<rfs.length;i++){
			rfs[i].checkRequired();
		}
		rfs = [];
		
		required.each(function(){
			var $this = $j(this);
			var parent = this.parentNode;
			var minLength = 1;
			var requiredGroup = 0;
			var name = $this.attr('name');
			
			while (!parent.className || parent.className.indexOf(settings.wrapperClass)==-1){
				parent = parent.parentNode;
			}
			
			rfs.push(new $j.Avaya.RequiredField({field:$this,wrapper:$j(parent),minLength:minLength}));
		});
	}
	
	_setRequired();
	
	//returns false if no errors or the string if there are
	this.getRequiredString = function(){
		allerrs = '';
		
		_checkRequired();
		if (allerrs != ''){
			allerrs = allerrs.replace(/\s*\,\s*$/,'.');
			return 'Please enter a valid ' + allerrs;
		}
		return false;
	};
	
	this.updateRequired = function(){		
		required = settings.form.find(':text, select').not( '.not-required' );
		_setRequired();
	};
};

$j.Avaya.RequiredField = function(params){
	
	var self = this;
	var settings = $j.extend({},this.defaults,params);
	
	if (settings.field==null) return;
	
	var name = settings.field.attr('name');
	var label = settings.wrapper.find('label').eq(0).html();
	var errorClass = settings.errorClass;
	
	this.check = function(){
		
		var obj = self.validate();
		
		if (obj.valid){
			self.removeFlag();
		}
		else {
			self.addFlag();
		}
		
		if (typeof settings.checkCallback == 'function'){
			settings.checkCallback();
		}
		
		return obj;
	};
	
	this.validate = function(){
		
		var obj = {
			valid : false,
			name : name,
			value : settings.field.val(),
			text : label
		};
		
		if (obj.value.length >= settings.minLength){
			if (settings.field.hasClass('email')){
				obj.valid = self.RegExp.email.test(obj.value);
			} 
			else if (settings.field.hasClass('alpha')){
				obj.valid = self.RegExp.alpha.test(obj.value);
			} 
			else if (settings.field.hasClass('phone')){
				obj.valid = self.RegExp.phone.test(obj.value);
			}
			else if (settings.field.hasClass('mixed')){
				obj.valid = self.RegExp.mixed.test(obj.value);
			}
			else {
				obj.valid = (obj.value.search(/[<>]/) == -1);
			}
		}
		return obj;
	};
	
	this.addFlag = function(){
		settings.wrapper.addClass(errorClass);
	};
	
	this.removeFlag = function(){
		settings.wrapper.removeClass(errorClass);
	};
	
	this.checkRequired = function(){
		if (settings.wrapper.hasClass('disabled')){
			settings.wrapper.removeClass(errorClass);
		}
	};
};
$j.Avaya.RequiredField.prototype = {
	defaults : {
		field : null,
		wrapper : null,
		checkCallback : 0,
		minLength : 1,
		errorClass : 'errorState'
	},
	RegExp : {
		email : /^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-]+)+$/,
		phone : /^[+]?([0-9]*[\.\s\-\(\)]|[0-9]+){10,24}$/,
		alpha : /^[a-zA-Z\s-']+$/,
		mixed : /^[a-zA-Z0-9\s-']+$/
	}
};

$j.Avaya.ShowMore = function(params){
	
	var 
		settings = $j.extend({},this.defaults,params),
		open = 0;
	
	this.trigger = settings.trigger.get(0) ? settings.trigger : $j(settings.trigger);
	this.content = settings.content.get(0) ? settings.content : $j(settings.content);
	
	this.trigger.click(function(e){
		e.preventDefault();
		_toggle();
	});
	
	function _toggle(){
		if (open){
			_hide();
		}
		else {
			_show();
		}
		$j.Avaya.Page.Sizing.resize();
	}
	
	function _hide(){
		settings.hide();
		open = 0;
	}
	
	function _show(){
		settings.show();
		open = 1;
	}	
};
$j.Avaya.ShowMore.prototype = {
	defaults : {
		show : function(){
			this.trigger.addClass('activeTrigger');
			this.content.addClass('activeContent');
		},
		hide : function(){
			this.trigger.removeClass('activeTrigger');
			this.content.removeClass('activeContent');
		}
	}
};









