
var LOGIN_BUTTON_SRC_HOVER = top.skinUrl + '/images/login-button-hover.gif';
new Element('img', {src: LOGIN_BUTTON_SRC_HOVER});

var contentFetcherInstance;

document.write('<style type="text/css">div.learnMore {display: none;}</style>');

window.addEvent('domready', function() {
	$$('body').addClass('js-active');

	contentFetcherInstance = new ContentFetcher([], {
		adoptOnly: 'imgouter',
		addCloseButton: false
	});

	$$('a.learnMore').each(function(e) {
		new RevealMore(e, {
			hideTrigger: true,
			onFirstClick: function() {}
		});
	});

	if (typeof showLogin != 'undefined' && showLogin) {
		var loginDrop = $('loginDrop');
		if (loginDrop) {
			loginDrop.addClass('start-open');
			$('fldLoginUsername').focus();
		}
	}
	var loginFormController = new LoginFormController();
	$$('.openLoginBox').each(function(e) {
		e.addEvent('click', function() {
			loginFormController.toggle();
		});
	});

	// Image swapper (profile page);
	var target = $$('.bigImage img');
	target = target.length ? target[0] : null;
	new ImageSwapper(target, $$('.smallImages a'));

	var el = document.getElement('#profiles-search.toggled');
	var toggler = document.getElement('#categoriesSearch a');
	if (el && toggler) {
		el.addClass('hidden');
		toggler.addEvent('click', function (evt) {
			evt.stop();
			el.toggleClass('hidden');
		});
	}

	// Forms
	var errorMessage = '<strong>Error:</strong> Please fill in all the required fields.';
	$$('form.register').each(function (e) {
		if (e.get('id') == 'frmBusinessEnquiry') {
			new jpForm('frmBusinessEnquiry', {autoScrollOnError: true, errorMessage: errorMessage});
		}
	});
	new jpForm('frmContact', {errorMessage: errorMessage});
	new jpForm('frmSignup', {autoFocus: false, errorMessage: errorMessage});
	new jpForm('frmEventRegistration', {
		autoFocus: false,
		errorMessage: errorMessage,
        relations: [{
        	type: 'incremental-show',
        	masterField: 'fldNoOfGuests',
        	slaveFieldsClass: 'guest-item',
        	slavesContainer: 'guestsListContainer'
        }]
	});

	$$('a.delete-account').each(function (el) {
		el.addEvent('click', fnConfirmForm.bindWithEvent());
		var e = $(el.get('rel'));
		if (e) {
			e.setStyle('display', 'none');
		}
	});
	$$('.confirm-options-yes a').addEvent('click', fnConfirmYes.bindWithEvent());

	new EventsCalendar();

	// Twitter
	new Request.Twitter('creativelancs', {
		onSuccess: function(responseText) {
			if (responseText.length) {
				$('tweet-container').set('html', responseText[0].text);
			}
		},
		data: {
			count: 1
		}
	}).send();

	new CharacterLimit('fldCompany_brief');
	
	// login button rollover state
	var loginButton = $('login-button');
	if (loginButton) {
		LOGIN_BUTTON_SRC = loginButton.src;
		loginButton.addEvent('mouseenter', function () {
			this.src = LOGIN_BUTTON_SRC_HOVER;
		});
		loginButton.addEvent('mouseleave', function () {
			this.src = LOGIN_BUTTON_SRC;
		});
	}
});


var CharacterLimit = new Class({
	element: null,
	limit: 0,
	numelement: null,
	initialize: function (element) {
		var element = $(element)
		if (!element) {
			return;
		}
		var classes = element.get('class').split(' ');
		classes.each(function (c) {
			if (c.indexOf('jpFrmCharLimit-') == 0) {
				var i = c.substr('jpFrmCharLimit-'.length).toInt();
				if (!isNaN(i)) {
					this.limit = i;
				}
			}
		}, this);

		this.element = element;

		this.numelement = $(this.element.get('id') + '-chars');
		if (this.numelement && this.limit) {
			this.element.addEvent('keyup', this.keyListener.bindWithEvent(this));
		}
		this.keyListener();
	},
	keyListener: function () {
		var c = this.element.get('value').length;
		var i = this.limit - c;

		var span = this.numelement.getNext('span');
		if (i == 1 || i == -1) {
			span.setStyle('display', 'none');
		}
		else {
			span.setStyle('display', '');
		}

		if (i < 0) {
			this.element.addClass('jpFrmError');
			this.numelement.getParent().addClass('charlimit-notice-error');
			this.element.getParent().getElement('label').addClass('jpFrmError');
		}
		else {
			this.element.removeClass('jpFrmError');
			this.numelement.getParent().removeClass('charlimit-notice-error');
			this.element.getParent().getElement('label').removeClass('jpFrmError');
		}
		this.numelement.set('text', i);
	}
});


var clickedElements = [];
function clickTracker (location, element) {
	if (!location) {
		return;
	}
	var track = true;
	if (element) {
		if (clickedElements.contains(element)) {
			track = false;
		}
		else {
			clickedElements.push(element);
		}
	}
	if (!track || typeof(pageTracker) == 'undefined') {
		return;
	}
	pageTracker._trackPageview(location);
}

function startImageCropper() {
	var cropperContainer = $('imgouter');
	if (cropperContainer) {
		var minWidth = $$('#imgouter #min-width')[0].get('value');
		var minHeight = $$('#imgouter #min-height')[0].get('value');
		var originalWidth = $$('#imgouter #original-width')[0].get('value');
		var originalHeight = $$('#imgouter #original-height')[0].get('value');
		imageCropper = new CwCrop({
			minsize: {x: minWidth, y: minHeight},
			maxsize: {x: 9999, y: 9999},
			originalsize: {x: originalWidth, y: originalHeight},
	//		fixedratio: minWidth / minHeight,
			maxratio: {x: 0, y: 0},
			initialposition: {x: 0, y:0},
			onCrop: function(values) {
				$('posx').set('value', values.x);
				$('posy').set('value', values.y);
				$('width').set('value', values.w);
				$('height').set('value', values.h);

				$('frm-crop').fireEvent('submit');
		    }
		});
		$('btn-do-crop').addEvent('click', function (evt) {
			evt.stop();
			imageCropper.doCrop();
		});
	}
}

var ProfileForm = new Class({
	Extends: jpForm,
	imageFields: [],
	fileFields: [],
	initialize: function (form, options) {
		options = $extend(options || {}, { autoClear: false });
		this.parent(form, options);

		var el = this.form.getElement('#fldAjaxlogo');
		this.imageFields.push(new ProfileImageField(el, this.options));

		var el = this.form.getElement('#fldAjaximage1');
		this.imageFields.push(new ProfileImageField(el, this.options));

		var requiredFileFields = [
			this.form.getElement('#fldLogoimage'),
			this.form.getElement('#fldImage1')
		];
		this.fields.each(function (f) {
			if (requiredFileFields.contains(f.element) && f.element.hasClass('jpFrmRequired')) {
				this.fileFields.push(f);
			}
		}, this);
	},
	submit: function (evt) {
		this.imageFields.each(function (f) {
			f.removeError();
		});
		var temp = [];
		this.fields.each(function (f) {
			if (!this.imageFields.contains(f)) {
				temp.push(f);
			}
		}, this);
		this.fields = temp;

		// now add the ajax fields if required
		var fancyUpload = this.form.getElement('#fldAjaxuploads').get('value').toInt();
		if (fancyUpload) {
			this.imageFields.each(function (f) {
				this.fields.push(f);
			}, this);
			this.fileFields.each(function (f) {
				f.element.removeClass('jpFrmRequired');
			}, this);
		}
		else {
			this.fileFields.each(function (f) {
				f.element.addClass('jpFrmRequired');
			}, this);
		}

		this.parent(evt);
	}
});

var ProfileImageField = new Class({
	Extends: jpField,
	initialize: function (element, options) {
		this.parent(element, options);
	},
	check: function () {
		var checked = true;
		if (this.isRequired() && !this.get('disabled')) {
			var value = this.getValue();
			checked = value != '';
		}

		if (!checked) {
			this.setError();
		}
		else {
			this.removeError();
		}
		return checked;
	},
	isRequired: function() {
		return true;
	},
	setError: function() {
		this.parent();
		var el = this.element.getParent().getElement('.img');
		el.addClass(this.options.errorClass);
	},
	removeError: function() {
		this.parent();
		var el = this.element.getParent().getElement('.img');
		el.removeClass(this.options.errorClass);
	}
});

var EventsCalendar = new Class({
	initialize: function () {
		this.initSelect();
	},
	initSelect: function () {
		var el = $('fldCalendarPeriod');
		if (!el) {
			return;
		}
		el.addEvent('change', this.changedListener.bindWithEvent(this, el));
	},
	changedListener: function (evt, el) {
		var value = el.get('value');

		var url = top.baseUrl + '/events/calendar';

		var request = new Request.HTML({
			url: url,
			data: {
				ajax: true,
				date: value
			},
			onSuccess: this.loaded.bind(this),
			onFailure: function () {
				alert('Request failed');
			}
		});
		request.send();
	},
	loaded: function (responseTree, responseElements, responseHTML, responseJavaScript) {
		var e = $('calendar');
		e.empty();
		e.adopt(responseTree);
		this.initSelect();
	}
});

var LoginFormController = new Class({
	Implements: Options,
	options: {
		id: 'loginDrop',
		toggleClass: 'login-menu-toggle',
		closeClass: 'closed'
	},
	togglers: [],
	element: null,
	initialize: function (options) {
		this.setOptions(options);
		this.element = $(this.options.id);
		if (!this.element) {
			return false;
		}

		var loginPanel = $('login-login');
		var passwordPanel = $('login-forgotpass');
		if (loginPanel && passwordPanel) {
			var elShowLogin = loginPanel.getElement('a');
			var elShowPassword = passwordPanel.getElement('a');
			elShowLogin.addEvent('click', function (evt) {
				evt.stop();
				loginPanel.toggleClass('hidden');
				passwordPanel.toggleClass('hidden');
			});
			elShowPassword.addEvent('click', function (evt) {
				evt.stop();
				loginPanel.toggleClass('hidden');
				passwordPanel.toggleClass('hidden');
			});
		}

		if (passwordPanel.getElement('p.error')) {
			loginPanel.toggleClass('hidden');
		}
		else {
			passwordPanel.toggleClass('hidden');
		}

		// set the action on all the togglers
		this.togglers = $$('.' + this.options.toggleClass);
		this.togglers.each(function (toggler) {
			toggler.addEvent('click', this.toggle.bind(this));
		}, this);

		if (!this.element.hasClass('start-open')) {
			this.close();
		}
		if (this.element.getElement('p.error')) {
			this.open();
			// open if there's an error
		}
	},
	open: function () {
		if (this.isOpen()) {
			return;
		}
		this.element.setStyle('display', 'block');
		this.element.removeClass(this.options.closeClass);
		this.togglers.addClass(this.options.toggleClass + '-open');
		this.togglers.removeClass(this.options.toggleClass + '-closed');
		$('fldLoginUsername').focus();
	},
	close: function () {
		if (!this.isOpen()) {
			return;
		}
		this.element.setStyle('display', 'none');
		this.element.addClass(this.options.closeClass);
		this.togglers.addClass(this.options.toggleClass + '-closed');
		this.togglers.removeClass(this.options.toggleClass + '-open');
	},
	toggle: function (evt) {
		if (evt) {
			evt.stop();
		}
		this.isOpen() ? this.close() : this.open();
	},
	isOpen: function () {
		return !this.element.hasClass(this.options.closeClass);
	}
});


function fnConfirmYes (evt) {
	evt.stop();
	var element = $(evt.target);
	var form = element.getParent('.confirmbox').getElement('form');
	form.submit();
}

function fnDeleteCollaborator (evt) {
	evt.stop();
	var element = $(evt.target);
	var frm = $(element.get('rel'));
	if (frm) {
		frm.submit();
	}
}

function fnConfirmForm (evt) {
	evt.stop();
	var element = $(evt.target);
	var conf = new LbConfirm(element.get('rel'));
}

function fnLbAlert (html) {
	var container = new Element('div', {styles: {display: 'none'}}).injectInside(document.body);
	var el = new Element('div', {'class': 'alertbox'}).injectInside(container);
	html = html + '<div class="alertbox-options"><a href="#" class="close">OK</a></div>';
	el.set('html', html);
	var conf = new LbConfirm(el);
	conf.addEvent('close', function () {
		container.destroy();
	});
}

var LbConfirm = new Class({
	Implements: [Options, Events],
	options: {},
	shim: null,
	overlay: null,
	window: null,
	element: null,
	parent: null,
	initialize: function (element, options) {
		this.element = $(element);
		if (!this.element) {
			return;
		}
		this.setOptions(options);
		this.parent = this.element.getParent();
		this.createOverlay();
		this.createWindow();
		window.addEvent('resize', this.evtResize.bindWithEvent(this));
		window.addEvent('scoll', this.evtScroll.bindWithEvent(this));
	},
	evtClose: function (evt) {
		if (evt) {
			evt.stop();
		}
		this.close();
	},
	evtResize: function () {
		this.positionWindow();
		this.positionOverlay();
	},
	evtScroll: function () {
		this.positionWindow();
	},
	createOverlay: function () {
		this.shim = $('jpfnlb-shim');
		if (!this.shim) {
			this.shim = new Element('iframe').setProperty('id', 'jpfnlb-shim').injectInside(document.body);
			this.shim.setOpacity(0);
		}

		this.overlay = $('jpfnlb-overlay');
		if (!this.overlay) {
			this.overlay = new Element('div').setProperty('id', 'jpfnlb-overlay').injectInside(document.body)

			this.overlay.setOpacity(0);
			this.overlay.set('tween', {
				duration: 400
			});
			this.overlay.tween('opacity', 0, 0.7);
		}

		this.overlay.addEvent('click', this.evtClose.bindWithEvent(this));
		this.positionOverlay();
	},
	createWindow: function () {
		this.window = $('jpfnlb-window');
		if (!this.window) {
			this.window = new Element('div').setProperty('id', 'jpfnlb-window').injectInside(document.body);
			this.window.setOpacity(0);
		}
		this.window.grab(this.element);
		this.element.setStyle('display', 'block');
		var size = this.element.getSize();
		this.window.setStyles({
			width: size.x,
			height: size.y
		})
		this.window.set('tween', {
			duration: 250
		});
		this.positionWindow();
		this.window.tween('opacity', 0, 1);

		this.element.getElements('.close').addEvent('click', this.evtClose.bindWithEvent(this));
	},
	positionWindow: function () {
		var size = this.window.getSize();
		this.window.setStyles({
			left: (window.getScrollLeft() + (window.getWidth() - size.x) / 2) + 'px',
			top: (window.getScrollTop() + (window.getHeight() - size.y) / 2) + 'px'
		});
	},
	positionOverlay: function () {
		var styles = {
			width: 0,
			height: 0
		};
		this.shim.setStyles(styles);
		this.overlay.setStyles(styles);
		var styles = {
			width: window.getScrollWidth(),
			height: window.getScrollHeight()
		};
		this.shim.setStyles(styles);
		this.overlay.setStyles(styles);
	},
	close: function () {
		this.element.getElements('.close').removeEvents('click');

		this.window.set('tween', {
			duration: 250,
			onComplete: function() {
				this.element.setStyle('display', 'none');
				this.parent.grab(this.element);
				this.window.dispose();
				this.fireEvent('close', [this]);
			}.bind(this)
		});
		this.window.tween('opacity', 1, 0);

		this.overlay.removeEvents('click');
		this.overlay.set('tween', {
			duration: 400,
			onComplete: function () {
				this.overlay.dispose();
			}.bind(this)
		});
		this.overlay.tween('opacity', 0.6, 0);

		window.removeEvent('resize', this.evtResize.bindWithEvent(this));
		window.removeEvent('scroll', this.evtScroll.bindWithEvent(this));

		this.shim.dispose();
		this.window.dispose();
	}
});

var RevealMore = new Class({
	Implements: [Options, Events],
	element: null,
	details: null,
	detailsHeight: 0,
	fxTrigger: null,
	fxTrigger2: null,
	fxDetails: null,
	active: false,
	numberOfClicks: 0,
	options: {
		hideTrigger: false,
		duration: 150
		/*
		onFirstClick: $empty
		onReveal: $empty
		onHide: $empty
		*/
	},
	initialize: function(element, options) {
		this.setOptions(options);
		this.element = $(element);
		if (!this.element) return;
		this.details = $(this.element.get('href').replace(/^#/, ''));
		if (!this.details) return;

		this.details.setStyle('display', 'block');
		this.detailsHeight = parseInt(this.details.getStyle('height'));
		this.fxTrigger = new Fx.Tween(this.element, {
			property: 'opacity',
			duration: this.options.duration,
			link: 'cancel',
			onComplete: this.reveal.bindWithEvent(this)
		});
		this.fxTrigger2 = new Fx.Tween(this.element, {
			property: 'height',
			duration: this.options.duration,
			link: 'cancel'
		});
		this.fxDetails = new Fx.Tween(this.details, {
			property: 'height',
			duration: this.options.duration,
			link: 'cancel'
		});
		this.fxDetails.set(0);
		this.element.addEvent('click', function(evt) {
			evt.stop();
			if (this.options.hideTrigger && this.numberOfClicks > 0) {
				return;
			}
			if (!this.active) {
				this.reveal();
			}
			else {
				this.hide();
			}
		}.bindWithEvent(this));
	},
	reveal: function() {
		if (!this.options.hideTrigger || this.element.getStyle('opacity') > 0) {
			this.fireEvent('reveal', this);
			if (this.numberOfClicks == 0) {
				this.fireEvent('firstClick', this);
			}
			this.active = true;
			this.numberOfClicks++;
		}

		if (this.options.hideTrigger && this.element.getStyle('opacity') > 0) {
			this.fxTrigger.start(0);
			this.fxTrigger2.start(0);
		}
		else {
			this.fxDetails.start(this.detailsHeight);
			this.element.addClass('on');
		}
	},
	hide: function() {
		this.fireEvent('hide', this);
		this.active = false;
		this.fxDetails.start(0);
		this.element.removeClass('on');
	}
});

var ImageSwapper = new Class({
	Implements: [Options],
	target: null, // main image
	thumbs: [], // links containing the thumbnails
	current: null,
	initialize: function(target, thumbs, options) {
		this.target = $(target);
		this.thumbs = thumbs;
		if (!this.target || !this.thumbs || !this.thumbs.length) return;
		this.prepare();
	},
	prepare: function() {
		this.current = this.thumbs[0];
		this.thumbs.each(function(e) {
			e.addEvent('click', function(evt) {
				evt.stop();
				this.swap(e);
			}.bindWithEvent(this, [e]));
			new Image().src = e.get('href');
		}, this);
	},
	swap: function(link) {
		this.current.removeClass('on');
		link.addClass('on');
		this.current = link;
		this.target.set('src', link.get('href'));
	}
});

