/**
 * Register events.
 */
window.addEvent('domready', initialize);

/**
 * Wrapper function to run when the page is fully loaded.
 * Here you should you put all functions that need to 
 * run automatically.
 * 
 * @return void
 * @author david
 */
function initialize () {
	showAccessLinks();
	setDefaultFormValues();
	
	hideFormFields();
	
	initAccessLoginBox();
}

/**
 * Hides spamfields in forms.
 *
 * @return void
 * @author peter
 */
function hideFormFields() {
	$$('.spch').setStyle('display', 'none');
}

function playAnimatedTutorial (tutorial) {
	win = window.open('/products/tutorials/' + tutorial + '/', 'animatedTutorial', 'width=640,height=480,resizable=yes');
}

/**
 * Remove a license from a COMSOL Access account
 */
function removeLicense (license) {
	if (window.confirm('Are you sure you want to remove license ' + license + ' from your account?')) {
		location.href = '/access/licenses/remove/?license=' + license;
	}
}

/**
 * Function to make sure that correct COMSOL Access links
 * are shown at the top of the page. Checks if the accessid
 * cookie is set to decide if you are logged in or not. This
 * function is needed to allow for caching our webpages.
 * 
 * @return void
 * @author david 
 */
function showAccessLinks () {
	try {
		var aid = Cookie.read('accessid');
		var aname = Cookie.read('accessname');
		if (aname) {
			$$('#accessDetails .accessName').set('text', decodeURI(aname).replace('+',' '));
		}
		if (aid) {
			if ($('accessLoggedIn')) {
				$('accessLoggedIn').setStyle('display', 'block');
			}
			if ($('accessLoggedOut')) {
				$('accessLoggedOut').setStyle('display', 'none');
			}
		} else {
			if ($('accessLoggedIn')) {
				$('accessLoggedIn').setStyle('display', 'none');
			}
			if ($('accessLoggedOut')) {
				$('accessLoggedOut').setStyle('display', 'block');
			}
		}
	} catch (e) {}
}

/**
 * Display a dialog with general search tips
 * 
 * @return void
 * @author david
 */
function openSearchTips () {
	window.open("/search/tips/", "searchTips", "width=440,height=400,resizable=1,scrollbars=1");
}

/**
 * Function to automatically fill out forms with info from
 * previous forms. Done using cookies. We do this with JavaScript
 * to allow caching of webpages.
 * 
 * @return void
 * @author david 
 */
function setDefaultFormValues () {
	setDefaultFormFieldValue('first_name');
	setDefaultFormFieldValue('last_name');
	setDefaultFormFieldValue('company');
	setDefaultFormFieldValue('title');
	setDefaultFormFieldValue('department');
	setDefaultFormFieldValue('address');
	setDefaultFormFieldValue('address_2');
	setDefaultFormFieldValue('city');
	setDefaultFormFieldValue('state');
	setDefaultFormFieldValue('zip_code');
	setDefaultFormFieldValue('country');
	setDefaultFormFieldValue('phone');
	setDefaultFormFieldValue('fax');
	setDefaultFormFieldValue('email');
}

function setDefaultFormFieldValue (name) {
	if (document.getElement('.validationError')) {
	} else {
		var field = $(name);
		var cval = Cookie.read('access_' + name);
		if (!cval) {
			var cval = Cookie.read(name);
		}
		if (field && cval) {
			if (field.tagName == 'INPUT' && field.value.length == 0) {
				field.value = cval;
			}
			if (field.tagName == 'SELECT' && !field.selectedIndex) {
				for (var i = 0; i < field.options.length; i++) {
					if (field.options[i].value == cval) {
						field.options[i].selected = 'selected';
						break;
					}
				}
			}
		}
	}
}

var firstTab = '';
function initAccessLoginBox() {
	if (firstTab == 'register') {
		// show register
		$('accessTabRegister').addClass('selected');
		$('accessRegister').setStyle('display', 'block');
		
		// hide other
		$('accessTabLogin').removeClass('selected');
		$('accessTabForgot').removeClass('selected');
		$('accessLogin').setStyle('display', 'none');
		$('accessForgot').setStyle('display', 'none');
	} else if (firstTab == 'forgot') {
		// show forgot
		$('accessTabForgot').addClass('selected');
		$('accessLogin').setStyle('display', 'none');
		
		// hide other
		$('accessTabLogin').removeClass('selected');
		$('accessTabRegister').removeClass('selected');
		$('accessForgot').setStyle('display', 'block');
		$('accessRegister').setStyle('display', 'none');		
	}
	
	if ($('accessBox')) {
		$('accessTabLogin').addEvent('click', function (e) {
			// display login
			$('accessTabLogin').addClass('selected');
			$('accessLogin').setStyle('display', 'block');
			
			// hide other
			$('accessTabRegister').removeClass('selected');
			$('accessTabForgot').removeClass('selected');
			$('accessRegister').setStyle('display', 'none');
			$('accessForgot').setStyle('display', 'none');
		});

		$('accessTabRegister').addEvent('click', function (e) {
			// show register
			$('accessTabRegister').addClass('selected');
			$('accessRegister').setStyle('display', 'block');
			
			// hide other
			$('accessTabLogin').removeClass('selected');
			$('accessTabForgot').removeClass('selected');
			$('accessLogin').setStyle('display', 'none');
			$('accessForgot').setStyle('display', 'none');
		});
		
		$('accessTabForgot').addEvent('click', function (e) {
			// show forgot
			$('accessTabForgot').addClass('selected');
			$('accessLogin').setStyle('display', 'none');
			
			// hide other
			$('accessTabLogin').removeClass('selected');
			$('accessTabRegister').removeClass('selected');
			$('accessForgot').setStyle('display', 'block');
			$('accessRegister').setStyle('display', 'none');
		});
	}
	
}

window.addEvent('domready', function () {
	try {
		if ($('state')) {
			$('country').addEvent('change', setStatesFromCountry);
			$('country').fireEvent('change');
		}
	} catch (e) {}
});

function setStatesFromCountry () {
	var cntry = this.options[this.selectedIndex].value;
	$('state').setStyle('display', '');
	try {
		//document.getElement('select[name=state]').replaces($('state'));
		$('state').replaces(document.getElement('select[name=state]'));
		toggleRequiredField('state', false);
	} catch (e) {
	}
	if (states[cntry]) {
		$('state').setStyle('display', 'none');
		var state_select = new Element('select', {id: 'state_select', name: 'state'});
		state_select.adopt(new Element('option'));
		for (var i = 0; i < states[cntry].length; i++) {
			state_select.adopt(new Element('option', {
				value: states[cntry][i].abbr,
				selected: (($('state').value == states[cntry][i].abbr) ? true : false)
			}).set('text', states[cntry][i].state));
		}
		$('state').getParent().adopt(state_select);
		toggleRequiredField('state', true);
	}
}

function toggleRequiredField (id, required) {
	try {
		if (span = document.getElement('#label_' + id + ' span')) {
			span.destroy();
		}
		if (required) {
			$('label_' + id).adopt(new Element('span', {'class': 'required'}).set('text', '*'));
		}
	} catch (e) {
	}
}

/**
 * Include support for validators
 */
Element.extend({

	validateErrors: [],
	
	validateForm: function () {
		this.validateErrors = [];
		this.getFormElements().each(function(el){
			if (!el.validateField()) {
				this.validateErrors.extend(el.validateErrors);
			}
		}, this);
		if (this.validateErrors.length) {
			return false;
		}
		return true;
	},
	
	validateField: function () {
		this.validateErrors = [];
		var validators = this.getProperty('validators');
		if (validators) {
			validators = validators.split(',');
			for (var i = 0; i < validators.length; i++) {
				try {
					this['validate_' + validators[i]]();
				} catch (e) {
				}
			}
		}
		if (this.validateErrors.length) {
			return false;
		}
		return true;
	},
	
	validate_email: function () {
		if (this.value.trim().length && !this.value.match(/^.*?@.*\.[a-zA-Z]+$/)) {
			this.validateErrors.include('"' + this.getValue() + '" is not a valid email address');
			return false;
		}
		return true;
	},

	validate_required: function () {
		if (!this.value.trim().length) {
			this.validateErrors.include('"' + (this.getAttribute('label') || this.getAttribute('name')) + '" is a required field');
			return false;
		}
		return true;
	},

	getPosition: function(overflown){
		overflown = overflown || [];
		var el = this, left = 0, top = 0;
		do {
			left += el.offsetLeft || 0;
			top += el.offsetTop || 0;
			el = el.offsetParent;
		} while (el);
		overflown.each(function(element){
			left -= element.scrollLeft || 0;
			top -= element.scrollTop || 0;
		});
		return {'x': left, 'y': top};
	}

});