function trackOmnitureReg(eventName) {
  var s = s_gi("cnetzdnetasiacom");
  s.linkTrackVars = "events";
  s.linkTrackEvents = eventName;
  s.events = eventName;
  s.tl(this,'o','Lightbox Registration');

  return false;
}

function memberCheckName() {
	var file = '/2007/members/login/submit_checkusername.htm';
	var username = encodeURIComponent($('username').value);


	var str = "";

	//Return null if no username provided
	if(username == ""){
		return null;
        }

        str = "?username="+username;

	var request =  new XMLHttpRequest();
	request.open( "GET", file+str, false );
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	request.send(str);

	var response = request.responseText;
	response = response.split("||");

	if(response != 'Username is available!'){
		return '0';
	}else{
		return '1';
	}

}

function memberCheckEmail() {

	var file = '/2007/members/login/submit_checkemail.htm';
	var email = encodeURIComponent($('email').value);

	var str = "";

	str = "?email="+email;

	var request =  new XMLHttpRequest();		
	request.open( "GET", file+str, false );
	request.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
	request.send(str);

	var response = request.responseText;
	response = response.split("||");

    if(response == 'Email already registered.'){
        return '-1';
    }else if(response != 'Email is available.'){
		return '0';
	}else{
		return '1';
	}

}

function toggle_jf(obj) {
    var i = $(obj).selectedIndex;
    var selectedText = $(obj).options[i].text;

    if ( (selectedText == 'Student') || (selectedText == 'Retired') || (selectedText == 'Unemployed') ) {
        $('li-industry').fade('hide');
        $('li-coy-size').fade('hide');
    } else {
        $('li-industry').fade('show');
        $('li-coy-size').fade('show');
    }
}

function scrollToElement(target) {
  var scrollFx = new Fx.Scroll(window, {duration:400}).toElement(target);
}


/** Lightbox form init  **/
var fc;
var lbinit = false;
var lightboxjs = {
	init: function() {       				
		$$('.sl-join').addEvent('click', function(e){
			if(lbinit == true) return false;	
			lbinit = true;
			e.stop();
			if($('sl')) { lbinit = false; $('sl').dispose(); }
			var bl = new Element('div', {
				'id':'bl'
			}).inject($(document.body),'top');
			trackOmnitureReg("event7");  //track clicks 
			new Request({url:'/zd/2007/members/lightbox/member-signup.htm',evalScripts:true, 
				onSuccess: function(responseHTML) {
					trackOmnitureReg("event6");  //track form load

					var sl = new Element('div', {
						'html':responseHTML,
						'id':'sl'
					}).inject($(document.body),'top');
					lightboxjs.positionBox();
					lightboxjs.buildForm();
				}
			}).send();
		});

	},

	buildForm: function() {
        fc = new FormCheck('sl-form');
        				
				$each($$('.sl-select-replace'), function(el, idx){
					lightboxjs.replaceSelect(el, idx);
				});
				$each($$('.sl-checkbox-replace'), function(el, idx){
					lightboxjs.replaceCheckbox(el);
				});
				$('sl-close').addEvent('click', function(e){
					e.stop();
					$('bl').dispose();
					$('sl').dispose();
					lbinit = false;
					$each($$('.fc-tbx'), function(el){
						el.dispose();
					});
				});

				if ($('sl-submit-thanks')) {
				  $('sl-submit-thanks').addEvent('click',function(e) {
                                                                                e.stop();
					var req = new Request.HTML({
					  url: '/2007/members/lightbox/templates/form-member-thankyou.htm',
					  update: $('sl'), 
					  evalScripts: true
					}).get();
				  });
				}
	},

	positionBox:function(){
		if($('sl')){
		    scrollToElement(document.body);
			var windowScrollSize = $(document.window).getScrollSize();
			var windowSize = $(document.window).getSize();
			var boxSize = $('sl').getSize();
			var topBox = (windowSize.y - boxSize.y)/2;
			var leftBox = (windowSize.x - boxSize.x)/2;
			$('sl').setStyles({
				top:topBox,
				left:leftBox
			});
			$('bl').setStyles({
			width:windowScrollSize.x,
			height:windowScrollSize.y
			});
		}
	},
	
	toggleList: function(el){
		var list = el.getParent().getElement('ul.sl-select-list');
		list.fade();		
	},

	replaceCheckbox: function(el){
		if(el.getProperty('checked')) el.getParent().addClass('sl-valid');
		var span = new Element('span').inject(el.getParent());
		el.getParent().addEvent('click', function(){
				if(this.hasClass('sl-valid')){
					this.removeClass('sl-valid')
					el.setProperty('checked', false);
				}else{
					this.addClass('sl-valid');
					el.setProperty('checked', true);
				}
		})
	},
	
	replaceSelect: function(el, idx){
		var select = el;
	
		var ul = new Element('ul', {
			'class': 'sl-select-list',
			'styles': {
				'z-index': (100 - idx)
			}
		});
		
		$each(select.getElements('option'), function(el, idx){
			if(idx == 0){
				var p = new Element('p', {
					'text': el.get('text'),
					'class': 'sl-select',
					'events': {
							'click': function(e){
								lightboxjs.toggleList(this);	
							}
					}
				}).inject(select.getParent());
				return;	
			}
			
			var liClass;
			if(el.hasClass('sl-select-head')) liClass = 'sl-select-head';
			if(el.getProperty('selected')){
				liClass = 'sl-selected';
				select.getParent().getElement('p.sl-select').set('text', el.get('text'));
				if (!el.hasClass('sl-no-validate')) fc.validate(select);
			}
			var li = new Element('li', {
				'text': el.get('text'),
				'class': liClass,
				'events': {
					'click' : function(){
						if(!el.hasClass('sl-select-head')){
							if(ul.getElement('li.sl-selected')) ul.getElement('li.sl-selected').removeClass('sl-selected');
							this.addClass('sl-selected');
							select[idx].setProperty('selected', true)
							select.getParent().getElement('p.sl-select').set('text', this.get('text'));
							ul.fade('hide');
							if (!el.hasClass('sl-no-validate')) fc.validate(select);
							//toggle Industry, Company Size
							if (select.id == 'jobfunc') {  toggle_jf(select.id);  }
						}
					}
				}
			}).inject(ul);
		});
		
		ul.inject(el.getParent()).fade('hide');		
	}	
}

window.addEvent('domready', lightboxjs.init);    
window.addEvent('resize', lightboxjs.positionBox);

/** Form check class **/
var FormCheck = new Class({
	
	Implements: [Options, Events],

	options : {
		
		tipsClass: 'fc-tbx',				//tips error class
		errorClass: 'fc-error',				//div error class
		fieldErrorClass: 'fc-field-error',	//error class for elements
		
		trimValue : true,					//trim (remove whitespaces before and after) the value
		
		submitByAjax : true,				//false : standard submit way, true : submit by ajax
		ajaxResponseDiv : 'sl',			//element to inject ajax response into (can also use onAjaxSuccess) [cronix] 
		ajaxEvalScripts : true,			//use evalScripts in the Request response [cronix] 
		onAjaxRequest : $empty,				//Function to fire when the Request event starts 
		onAjaxSuccess : $empty,				//Function to fire when the Request receives .  Args: response [the request response] - see Mootools docs for Request.onSuccess 
		onAjaxFailure : $empty,				//Function to fire if the Request fails 
		
		display : {
			showErrors : 1,
			titlesInsteadNames : 0,
			errorsLocation : 1,
			indicateErrors : 1,
			keepFocusOnError : 0,
			checkValueIfEmpty : 0,
			addClassErrorToField : 0,
			fixPngForIe : 1,
			replaceTipsEffect : 1,
			flashTips : 0,
			closeTipsButton : 1,
			tipsPosition : "right",
			tipsOffsetX : -45,
			tipsOffsetY : 0,
			listErrorsAtTop : false,
			scrollToFirst : true,
			fadeDuration : 300
		},
		
		alerts : {
			submit: "There was an error during registration. Please try again.",
			required: "This field is required.",
			alpha: "This field accepts alphabetic characters only.",
			alphanum: "This field accepts alphanumeric characters only.",
			nodigit: "No digits are accepted.",
			digit: "Please enter a valid integer.",
			digitltd: "The value must be between %0 and %1",
			number: "Please enter a valid number.",
			email: "Please enter a valid email.",
			phone: "Please enter a valid phone.",
			url: "Please enter a valid url.",
			
			confirm: "This field is different from %0",
			differs: "This value must be different of %0",
			length_str: "The length is incorrect, it must be between %0 and %1",
			length_fix: "The length is incorrect, it must be exactly %0 characters",
			lengthmax: "The length is incorrect, it must be at max %0",
			lengthmin: "The length is incorrect, it must be at least %0",
			checkbox: "Please check the box",
			radios: "Please select a radio",
			select: "Please choose a value",
			username_invalid: "Username not available or invalid, please choose another.",
			email_invalid: "Email not available or invalid, please choose another.",
			email_registered: "Email has already been registered, please choose another."
		},
		
		regexp : {
            required : /[^.*]/, 
            alpha : /^([a-z ._-]+|.{0})$/i, 
            alphanum : /^([a-z0-9 ._-]+|.{0})$/i, 
            digit : /^([-+]?[0-9]+|.{0})$/, 
            nodigit : /^([^0-9]+|.{0})$/, 
            number : /^([-+]?\d*\.?\d+|.{0})$/, 
            email : /^([a-z0-9._%-]+@[a-z0-9.-]+\.[a-z]{2,4}|.{0})$/i, 
            phone : /^([\d\s ().-]+|.{0})$/, 
            url : /^((http|https|ftp)\:\/\/[a-z0-9\-\.]+\.[a-z]{2,3}(:[a-z0-9]*)?\/?([a-z0-9\-\._\?\,\'\/\\\+&amp;%\$#\=~])*|.{0})$/i 
		}
	},
	
	/*
	Constructor: initialize
		Constructor
	
		Add event on formular and perform some stuff, you now, like settings, ...
	*/
	initialize : function(form, options) {
		if (this.form = $(form)) {
			this.form.isValid = true;
			this.regex = ['length'];
			this.setOptions(options);
			
			//internalization
			if (typeof(formcheckLanguage) != 'undefined') this.options.alerts = formcheckLanguage;
			
			this.validations = [];
			this.alreadyIndicated = false;
			this.firstError = false;
			
			var regex = new Hash(this.options.regexp);
			regex.each(function(el, key) {
				this.regex.push(key);
			}, this);
	
			this.form.getElements("*[class*=validate]").each(function(el) {
				el.validation = [];
				var classes = el.getProperty("class").split(' ');
				classes.each(function(classX) {
					if(classX.match(/^validate(\[.+\])$/)) {
						var validators = eval(classX.match(/^validate(\[.+\])$/)[1]);
						for(var i = 0; i < validators.length; i++) {
							el.validation.push(validators[i]);
						}
						this.register(el);
					}
				}, this);
			}, this);
			
			this.form.addEvents({
				"submit": this.onSubmit.bind(this)
			});
			
			if(this.options.display.fixPngForIe) this.fixIeStuffs();
			document.addEvent('mousewheel', function(){
				this.isScrolling = false;
			}.bind(this));
		}
	},
	
	/*
	Function: register
		Private method
		
		Add listener on fields
	*/
	register : function(el) {
		this.validations.push(el);
		el.errors = [];
		if (el.validation[0] == 'submit') {
			el.addEvent('click', function(e){
				this.onSubmit(e);
			}.bind(this));
			return true;
		}

		if (this.isChildType(el) == false) el.addEvent('blur', function(e) {
			if((el.element || this.options.display.showErrors == 1) && (this.options.display.checkValueIfEmpty || el.value)) this.manageError(el, 'blur');
		}.bind(this))
		//We manage errors on radio
		else if (this.isChildType(el) == true) {
			//We get all radio from the same group and add a blur option
			var nlButtonGroup = this.form.getElements('input[name="'+ el.getProperty("name") +'"]');
			nlButtonGroup.each(function(radio){
				radio.addEvent('blur', function(){
					if((el.element || this.options.display.showErrors == 1) && (this.options.display.checkValueIfEmpty || el.value)) this.manageError(el, 'click');
				}.bind(this))
			},this);
		}
	},
	
	/*
	Function: validate
		Private method
		
		Dispatch check to other methods
	*/
	validate : function(el) {
		el.errors = [];
		el.isOk = true;
		if (this.options.trimValue && el.value != null ) el.value = el.value.trim();
		//On valide l'lment qui n'est pas un radio ni checkbox
		el.validation.each(function(rule) {
			if(this.isChildType(el)) {
				if (this.validateGroup(el) == false) {
					el.isOk = false;
				}
			} else {
				var ruleArgs = [];
				if(rule.match(/^.+\[/)) {
					var ruleMethod = rule.split('[')[0];
					ruleArgs = eval(rule.match(/^.+(\[.+\])$/)[1].replace(/([A-Z\._]+)/i, "'$1'"));
				} else var ruleMethod = rule;
				
				if (this.regex.contains(ruleMethod) && el.get('tag') != "select") {

				//Added 1 July 2009
				var doValidate = true; //validate by default
				if ( (el.id == 'txt-mc') || (el.id == 'txt-mn') ){ 
				  doValidate = false; 
				  if ($('cb-uvm').checked) doValidate = true;  //if 'send me updates' is checked, always validate
				  else if (el.value) {
				    if ( (ruleMethod != "required") ) doValidate = true;  //check format only if filled in without 'send me updates'
				  }
				}
				else if ( (el.id == 'txt-cnc') || (el.id == 'txt-cna') || (el.id == 'txt-cnn')){
				  if (!el.value) doValidate = false;  //validate only if it's filled in
				}

				  if (doValidate) {
					if (this.validateRegex(el, ruleMethod, ruleArgs) == false) {
						el.isOk = false;
					}
				  }
				}
				
				if (ruleMethod == 'confirm') {
					if (this.validateConfirm(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}
				if (ruleMethod == 'differs') {
					if (this.validateDiffers(el, ruleArgs) == false) {
						el.isOk = false;
					}
				}

				//:jimmy Modified previous checking as it only checked the state field when applicable (15/01/09)
				if (el.get('tag') == "select" || (el.type == "checkbox" && ruleMethod == 'required')) {

					//Skip validating the Industry/Company Size if Job Function is one of these 3
					if ( (el.id == 'indus') || (el.id == 'csize') )
					{
						var i = $('jobfunc').selectedIndex;
					  	var selectedText = $('jobfunc').options[i].text;

						if ( (selectedText != 'Student') && (selectedText != 'Retired') && (selectedText != 'Unemployed') ) 
						{
							if (this.simpleValidate(el) == false) {
							el.isOk = false;
							}							
						}
					//Make sure others are mandatory
					} else {

						if (this.simpleValidate(el) == false) {
							el.isOk = false;
						}
					}
				}

				if(ruleMethod == 'username_availability'){
					if(el.value != ""){
						var username_status = memberCheckName();
						if(username_status == '0'){
							el.errors.push(this.options.alerts.username_invalid);
							el.isOk = false;
						}	
					}else{
						el.isOk = false;
					}
							
				}
				if(ruleMethod == 'email_availability'){
					if(el.value != ""){
						var email_status = memberCheckEmail();
						if(email_status == '0'){
							el.errors.push(this.options.alerts.email_invalid);
							el.isOk = false;
						}else if(email_status == '-1'){
							el.errors.push(this.options.alerts.email_registered);
							el.isOk = false;						
						}	
					}else{
						el.isOk = false;
					}
							
				}

			}
		}, this);
		
		if (el.isOk){
			el.getParent().removeClass('sl-error');
			el.getParent().addClass('sl-valid');
			return true;

		}else {
			el.getParent().removeClass('sl-valid');


			el.getParent().addClass('sl-error');
			return false;
		}
	},
	
	/*
	Function: simpleValidate
		Private method
		
		Perform simple check for select fields and checkboxes
	*/
	simpleValidate : function(el) {
		if (el.get('tag') == 'select' && (el.options[el.selectedIndex].text == el.options[0].text)) {
			el.errors.push(this.options.alerts.select);
			return false;
		} else if (el.type == "checkbox" && el.checked == false) {
			el.errors.push(this.options.alerts.checkbox);
			return false;
		}
		return true;
	},
	
	/*
	Function: validateRegex
		Private method
		
		Perform regex validations
	*/
	validateRegex : function(el, ruleMethod, ruleArgs) {
		var msg = "";
		if (ruleArgs[1] && ruleMethod == 'length') {
			if (ruleArgs[1] == -1) {
				this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +",}$");
				msg = this.options.alerts.lengthmin.replace("%0",ruleArgs[0]);
			} else if(ruleArgs[0] == ruleArgs[1]) {
				this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +"}$");
				msg = this.options.alerts.length_fix.replace("%0",ruleArgs[0]);
			} else {
				this.options.regexp.length = new RegExp("^[\\s\\S]{"+ ruleArgs[0] +","+ ruleArgs[1] +"}$");
				msg = this.options.alerts.length_str.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);
			}
		} else if (ruleArgs[0] && ruleMethod == 'length') {
			this.options.regexp.length = new RegExp("^.{0,"+ ruleArgs[0] +"}$");
			msg = this.options.alerts.lengthmax.replace("%0",ruleArgs[0]);
		} else {
			msg = this.options.alerts[ruleMethod];
		}
		if (ruleArgs[1] && ruleMethod == 'digit') {
			var regres = true;
			if (!this.options.regexp.digit.test(el.value)) {
				el.errors.push(this.options.alerts[ruleMethod]);
				regres = false;
			}
			if (ruleArgs[1] == -1) {
				if (el.value >= ruleArgs[0]) var valueres = true; else var valueres = false;
				msg = this.options.alerts.digitmin.replace("%0",ruleArgs[0]);
			} else {
				if (el.value >= ruleArgs[0] && el.value <= ruleArgs[1]) var valueres = true; else var valueres = false;
				msg = this.options.alerts.digitltd.replace("%0",ruleArgs[0]).replace("%1",ruleArgs[1]);
			}
			if (regres == false || valueres == false) {
				el.errors.push(msg);
				return false;
			}
		} else if (this.options.regexp[ruleMethod].test(el.value) == false)  {
			el.errors.push(msg);
			return false;
		}
		return true;
	},

	/*
	Function: validateConfirm
		Private method
		
		Perform confirm validations
	*/
	validateConfirm: function(el,ruleArgs) {
		if (el.validation.contains('required') == false) {
			el.validation.push('required');
		}
		var confirm = ruleArgs[0];
		if(el.value != this.form[confirm].value){
			if (this.options.display.titlesInsteadNames)
				var msg = this.options.alerts.confirm.replace("%0",this.form[confirm].getProperty('title'));
			else
				var msg = this.options.alerts.confirm.replace("%0",confirm);
			el.errors.push(msg);
			return false;
		}
		return true;
	},
	
	/*
	Function: validateDiffers
		Private method
		
		Perform differs validations
	*/
	validateDiffers: function(el,ruleArgs) {
		var differs = ruleArgs[0];
		if(el.value == this.form[differs].value){
			if (this.options.display.titlesInsteadNames)
				var msg = this.options.alerts.differs.replace("%0",this.form[differs].getProperty('title'));
			else
				var msg = this.options.alerts.differs.replace("%0",differs);
			el.errors.push(msg);
			return false;
		}
		return true;
	},
	
	/*
	Function: isChildType
		Private method
		
		Determine if the field is a group of radio or not.
	*/
	isChildType: function(el) {
		var elType = el.type.toLowerCase();
		if((elType == "radio")) return true;
		return false;
	},
	
	/*
	Function: validateGroup
		Private method
		
		Perform radios validations
	*/
	validateGroup : function(el) {
		el.errors = [];
		var nlButtonGroup = this.form[el.getProperty("name")];
		el.group = nlButtonGroup;
		var cbCheckeds = false;
		
		for(var i = 0; i < nlButtonGroup.length; i++) {
			if(nlButtonGroup[i].checked) {
				cbCheckeds = true;
			}
		}
		if(cbCheckeds == false) {
			el.errors.push(this.options.alerts.radios);
			return false;
		} else {
			return true;	
		}
	},
	
	/*
	Function: listErrorsAtTop
		Private method
		
		Display errors
	*/
	listErrorsAtTop : function(obj) {
		if(!this.form.element) {
			 this.form.element = new Element('div', {'id' : 'errorlist', 'class' : this.options.errorClass}).injectTop(this.form);
		}
		if ($type(obj) == 'collection') {
			new Element('p').set('html',"<span>" + obj[0].name + " : </span>" + obj[0].errors[0]).injectInside(this.form.element);
		} else {
			if ((obj.validation.contains('required') && obj.errors.length > 0) || (obj.errors.length > 0 && obj.value && obj.validation.contains('required') == false)) {
				obj.errors.each(function(error) {
					new Element('p').set('html',"<span>" + obj.name + " : </span>" + error).injectInside(this.form.element);
				}, this);
			}
		}
	},
	
	/*
	Function: manageError
		Private method
		
		Manage display of errors boxes
	*/
	manageError : function(el, method) {
		var isValid = this.validate(el);
		if ((!isValid && el.validation.contains('required')) || (!el.validation.contains('required') && el.value && !isValid)) {
			if(this.options.display.listErrorsAtTop == true && method == 'submit')
				this.listErrorsAtTop(el, method);
			if (this.options.display.indicateErrors == 2 ||this.alreadyIndicated == false || el.name == this.alreadyIndicated.name)
			{
				if(!this.firstError) this.firstError = el;
				this.alreadyIndicated = el;
				if (this.options.display.keepFocusOnError && el.name == this.firstError.name) (function(){el.focus()}).delay(20);
				this.addError(el);
				return false;
			}
		} else if ((isValid || (!el.validation.contains('required') && !el.value)) && el.element) {
			this.removeError(el);
			return true;
		}
		return true;
	},
	
	/*








	Function: addError
		Private method
		
		Add error message
	*/
	addError : function(obj) {
		if(!obj.element && this.options.display.indicateErrors != 0) {
			if (this.options.display.errorsLocation == 1) {
				var pos = (this.options.display.tipsPosition == 'left') ? obj.getCoordinates().left : obj.getCoordinates().right;
				var options = {
					'opacity' : 0,
					'position' : 'absolute',
					'float' : 'left',
					'z-index' : '9999',
					'left' : pos + this.options.display.tipsOffsetX
				}
				obj.element = new Element('div', {'class' : this.options.tipsClass, 'styles' : options}).injectInside(document.body);
				this.addPositionEvent(obj);
			} else if (this.options.display.errorsLocation == 2){
				obj.element = new Element('div', {'class' : this.options.errorClass, 'styles' : {'opacity' : 0}}).injectBefore(obj);
			} else if (this.options.display.errorsLocation == 3){
				obj.element = new Element('div', {'class' : this.options.errorClass, 'styles' : {'opacity' : 0}});
				if ($type(obj.group) == 'object' || $type(obj.group) == 'collection')
					obj.element.injectAfter(obj.group[obj.group.length-1]);
				else
					obj.element.injectAfter(obj);
			}
		}					
		if (obj.element) {
			obj.element.empty();
			if (this.options.display.errorsLocation == 1) {
				var errors = [];
				obj.errors.each(function(error) {
					errors.push(new Element('p').set('html', error));
				});
				var tips = this.makeTips(errors).injectInside(obj.element);
				if(this.options.display.closeTipsButton) {
					tips.getElements('a.close').addEvent('mouseup', function(){
						this.removeError(obj);
					}.bind(this));
				}
				obj.element.setStyle('top', obj.getCoordinates().top - tips.getCoordinates().height + this.options.display.tipsOffsetY);
			} else {
				obj.errors.each(function(error) {
					new Element('p').set('html',error).injectInside(obj.element);
				});
			}
			
			if (!Browser.Engine.trident5 && obj.element.getStyle('opacity') == 0)
				new Fx.Morph(obj.element, {'duration' : this.options.display.fadeDuration}).start({'opacity':[1]});
			else
				obj.element.setStyle('opacity', 1);
		}
		/*
		if (this.options.display.addClassErrorToField && this.isChildType(obj) == false)
		{
			obj.addClass(this.options.fieldErrorClass);
		}*/
	},
	
	/*
	Function: addPositionEvent
		
		Update tips position after a browser resize
	*/
	addPositionEvent : function(obj) {
		if(this.options.display.replaceTipsEffect) {
			obj.event = function(){
				new Fx.Morph(obj.element, {
					'duration' : this.options.display.fadeDuration
				}).start({ 
					'left':[obj.element.getStyle('left'), obj.getCoordinates().right + this.options.display.tipsOffsetX],
					'top':[obj.element.getStyle('top'), obj.getCoordinates().top - obj.element.getCoordinates().height + this.options.display.tipsOffsetY]
				});
			}.bind(this);
			
		} else {
			obj.event = function(){
				obj.element.setStyles({ 
					'left':obj.getCoordinates().right + this.options.display.tipsOffsetX,
					'top':obj.getCoordinates().top - obj.element.getCoordinates().height + this.options.display.tipsOffsetY
				});
			}.bind(this)
		}
		window.addEvent('resize', obj.event);
	},
	
	/*
	Function: removeError
		Private method
		
		Remove the error display
	*/
	removeError : function(obj) {
		this.firstError = false;
		this.alreadyIndicated = false;

		obj.errors = [];
		obj.isOK = true;
		window.removeEvent('resize', obj.event);
		if (this.options.display.errorsLocation == 2)
			new Fx.Morph(obj.element, {'duration' : this.options.display.fadeDuration}).start({ 'height':[0] });
		if (!Browser.Engine.trident5) {
			new Fx.Morph(obj.element, {
				'duration' : this.options.display.fadeDuration,
				'onComplete' : function() {
					if (obj.element) {
						obj.element.destroy();
						obj.element = false;
					}
				}.bind(this)
			}).start({ 'opacity':[1,0] });
		} else {
			obj.element.destroy();
			obj.element = false;
		}
		
		if (this.options.display.addClassErrorToField && !this.isChildType(obj))
		{
			obj.removeClass(this.options.fieldErrorClass);
		}
	},
	
	/*
	Function: focusOnError
		Private method
		
		Create set the focus to the first field with an error if needed
	*/
	focusOnError : function (obj) {
		if (this.options.display.scrollToFirst && !this.alreadyFocused && !this.isScrolling) {
			if (this.alreadyIndicated.element) {
				switch (this.options.display.errorsLocation){
					case 1 : 
						var dest = obj.element.getCoordinates().top;
						break;
					case 2 :
						var dest = obj.element.getCoordinates().top-30;
						break;
					case 3 :
						var dest = obj.getCoordinates().top-30;
						break;
				}
				this.isScrolling = true;
			} else if (!this.options.display.indicateErrors) {
				var dest = obj.getCoordinates().top-30;
			}
			if (window.getScroll.y != dest) {
				new Fx.Scroll(window, {
					onComplete : function() {
						this.isScrolling = false;
						obj.focus();
					}.bind(this)
				}).start(0,dest);
			} else {
				this.isScrolling = false;
				obj.focus();
			}
			this.alreadyFocused = true;
		}
	},
	
	/*
	Function: fixIeStuffs
		Private method
		
		Fix png for IE6
	*/
	fixIeStuffs : function () {
		if (Browser.Engine.trident4) {
			//We fix png stuffs
			var rpng = new RegExp('url\\(([\.a-zA-Z0-9_/:-]+\.png)\\)');
			var search = new RegExp('(.+)formcheck\.css');
			for (var i = 0; i < document.styleSheets.length; i++){
				if (document.styleSheets[i].href.match(/formcheck\.css$/)) {
					var root = document.styleSheets[i].href.replace(search, '$1');
					var count = document.styleSheets[i].rules.length;
					for (var j = 0; j < count; j++){
						var cssstyle = document.styleSheets[i].rules[j].style;
						var bgimage = root + cssstyle.backgroundImage.replace(rpng, '$1');
						if (bgimage && bgimage.match(/\.png/i)){
							var scale = (cssstyle.backgroundRepeat == 'no-repeat') ? 'crop' : 'scale';
							cssstyle.filter =  'progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true, src=\'' + bgimage + '\', sizingMethod=\''+ scale +'\')';
							cssstyle.backgroundImage = "none";
						}
					}
				}
			}
		}
	},
	
	/*
	Function: makeTips
		Private method
		
		Create tips boxes
	*/
	makeTips : function(txt) {
		var table = new Element('table');
			table.cellPadding ='0';
			table.cellSpacing ='0';
			table.border ='0';
			
			var tbody = new Element('tbody').injectInside(table);
				var tr1 = new Element('tr').injectInside(tbody);
					new Element('td', {'class' : 'tl'}).injectInside(tr1);
					new Element('td', {'class' : 't'}).injectInside(tr1);
					new Element('td', {'class' : 'tr'}).injectInside(tr1);
				var tr2 = new Element('tr').injectInside(tbody);
					new Element('td', {'class' : 'l'}).injectInside(tr2);
					var cont = new Element('td', {'class' : 'c'}).injectInside(tr2);
						var errors = new Element('div', {'class' : 'err'}).injectInside(cont);
						txt.each(function(error) {
							error.injectInside(errors);
						});
						if (this.options.display.closeTipsButton) new Element('a',{'class' : 'close'}).injectInside(cont);
					//	new Element('div', {'style' : "clear:both"}).injectInside(cont);
					new Element('td', {'class' : 'r'}).injectInside(tr2);
				var tr3 = new Element('tr').injectInside(tbody);
					new Element('td', {'class' : 'bl'}).injectInside(tr3);
					new Element('td', {'class' : 'b'}).injectInside(tr3);
					new Element('td', {'class' : 'br'}).injectInside(tr3);			
		return table;
	},
	
	/*
	Function: reinitialize
		Private method		
		
		Reinitialize form before submit check
	*/
	reinitialize: function() {
		this.validations.each(function(el) {
			if (el.element) {
				el.errors = [];
				el.isOK = true;
				if(this.options.display.flashTips == 1) {
					el.element.destroy();
					el.element = false;
				}
			}
		}, this);
		if (this.form.element) this.form.element.empty();
		this.alreadyFocused = false;
		this.firstError = false;
		this.alreadyIndicated = false;
		this.form.isValid = true;
	},
	
	/*
	Function: submitByAjax
		Private method		
		
		Send the form by ajax, and replace the form with response
	*/
	
	submitByAjax: function() {		
        var submission_type = $('updateType').value;

        if(submission_type == 'registerAccount') {
            $('sl-submit').set('text', 'Registering');
        }
		
		var url = this.form.getProperty('action');

		this.fireEvent('ajaxRequest');
		new Request({
			url: url,
			method: this.form.getProperty('method'),
			data : this.form.toQueryString(),
			evalScripts: this.options.ajaxEvalScripts,
			onFailure: function(instance){
				this.fireEvent('ajaxFailure', instance);
			}.bind(this),
			onSuccess: function(result){
				this.fireEvent('ajaxSuccess', result);
				if(this.options.ajaxResponseDiv){
				     var response = result.split("<!-- AJLOGIN_SPLIT -->");
				     if(response[0] != "1"){
				         //Set that an error occurred
				         $('sl-submit').errors.push(this.options.alerts.submit);
				         this.addError($('sl-submit'));
						 
						if(submission_type == 'registerAccount') {
							$('sl-submit').set('text', 'Join Now');
						} else {
							$('sl-submit').set('text', 'Update my profile');
						}
					 
				     }else{

						if(submission_type == 'registerAccount') {
							// Registration successful     
							trackOmnitureReg("event8");  //track page 1 submit
							$(this.options.ajaxResponseDiv).set('html', response[1]); 
							lightboxjs.buildForm();
							//if($('sl')) $('sl').setStyle('height','600px');

							var req = new Request.HTML({
							  url: '/2007/members/lightbox/ajax_member.htm',
							  update: $('m-login-div'), 
							  evalScripts: true
							}).get();

							var req_eb = new Request.HTML({
							  url: '/2007/members/lightbox/ajax_member_eyebrow.htm',
							  update: $('eb-login-div'), 
							  evalScripts: true
							}).get();

						} else {
							//Successful URS update
							trackOmnitureReg("event9");  //track page 2 submit
							$(this.options.ajaxResponseDiv).set('html', response[1]); 							
						}					     				     
            			 
					 //Add event on close button
      			 		 $('sl-close').addEvent('click', function(e){
							e.stop();
							if ($('bl')) $('bl').dispose();
							if ($('sl')) $('sl').dispose();
							lbinit = false;
							$each($$('.fc-tbx'), function(el){
								el.dispose();
					        });
	   			     	   });
				     }
				}
			}.bind(this)
		}).send();
	},

	
	/*
	Function: onSubmit
		Private method		
		
		Perform check on submit action
	*/
	onSubmit: function(event) {
		new Event(event).stop();
		this.reinitialize();

		this.validations.each(function(el) {
			if(!this.manageError(el,'submit')) this.form.isValid = false;
		}, this);

		(this.form.isValid) ? ((this.options.submitByAjax) ? this.submitByAjax() : this.form.submit()) : this.focusOnError(this.firstError);
	}
});