var Login = new Class({
	Implements: [Options, Events, Chain],
	options: {
		// onFinish: function(){},
		url: null,
		required: 3,
		error: {
			'email': 'Please enter your email address.',
			'password': 'Please enter your password.',
			'incorrect': 'Sorry, you are not logged in. Your e-mail address and/or password was invalid.'
		}
	},
	initialize: function(forms, options) {
		this.setOptions(options);
		this.forms = $$(forms);
		this.forms.each(function(form, index) {
			form.addEvent('submit', function(event) {
				event.preventDefault();
				this.checkForm(form);
			}.bind(this));
		}, this);
	},
	checkForm: function(form) {
		var params = [],
			inputs = form.getElements('input');
		inputs.each(function(input) {
			if (input.get('type') !== 'submit' && input.get('type') !== 'image') {
				if ( input.value !== '') {
					params.push(input.get('name') + '=' + encodeURIComponent(input.value));
				} else {
					alert(this.options.error[input.get('name')]);
				}
			}
		}, this);
		if (params.length === this.options.required) this.sendForm(form, params);
	},
	sendForm: function(form, params) {
		var url = this.options.url;
		var requester = new Request({
			url: url,
			onComplete: function(responseText) {
				if (responseText.length === 0) {
					alert(this.options.error['incorrect']);
				} else {
					this.fireEvent('onFinish', [this.forms, this.forms.indexOf(form)]);
				}
			}.bind(this)
		});
		requester.send(params.join('&'));
	}
});

var createOverlay = function createOverlay(elem, id) {
	var overlay = new Element('div', {'id': 'overlay', 'styles': {'opacity': '0', 'visibility': 'visible', 'height': '0', 'overflow': 'hidden'}}).inject(document.body),
		e = $(id) || new Element(elem, {'id': id}).inject(document.body);
	return e;
};

var MBPaging = new Class({
	Implements: [Options, Events],
	options: {
		// onFinish: function(){},
		url: false
	},
	initialize: function(links, container, options) {
		this.setOptions(options);
		$$(links).each(function(a) {
			a.addEvent('click', function(event) {
				event.preventDefault();
				var url = (this.options.url) ? this.options.url: a.get('href'),
					requester = new Request.HTML({
						method: 'get',
						url: url,
						update: container,
						onSuccess: function(responseText) {
							this.initialize(links, container, options);
							this.fireEvent('onFinish', [links, container]);
						}.bind(this)
					});
				requester.send();
			}.bind(this));	
		}, this);
	}
});
var MBSearch = new Class({
	Implements: [Options, Events, Loader],
	options: {
		// onFinish: function(){},
		url: null,
		events: 'submit',
		preventDefault: true,
		cache: true,
		params: null,
		query: 'value',
		container: null,
		containerID: null,
		inputIndex: 0,
		loader: false,
		loaderOptions: {
			loaderSrc: false,
			loaderStyles: {'top': 0, 'right': 0},
			loaderType: 'image'
		},
		loaderParent: 'trigger' // can be 'trigger' or 'container'
	},
	initialize: function(elems, containers, options) {
		this.setOptions(options);
		this.elems = elems;
		var containers = $$(containers);
		if (typeOf(this.elems) === 'element') {
			this.addSection(this.elems, containers[0]);
		} else {
			this.elems.each(function(elem, index) {
				if (this.elems.length === containers.length) {
					this.addSection(elem, containers[index]);
				} else {
					this.addSection(elem, containers[0]);
				}
			}, this);
		}
	},
	addSection: function(elem, container) {
		elem.store('container', container);
		this.attach(elem);
	},
	attach: function(elem) {
		var es = this.options.events;
		if (typeof es === 'object' && es.constructor === Array) {
			es.each(function(e) {
				elem.addEvent(e, function(event) {
					this.getResults(elem, event);
				}.bind(this));
			});
		} else {
			elem.addEvent(es, function(event) {
				this.getResults(elem, event);
			}.bind(this));
		}
	},
	serialize: function(elem) {
		var i = (typeOf(this.elems) === 'elements') ? this.elems.indexOf(elem) : 0,
			params = [], serialized, e, url;
		Object.each(this.options.params, function(value, key) {
			if (typeOf(key) === 'object') {
				Object.each(key, function(v, k) {
					params.include(key + '=' + $$(k)[i].get(v));
				});
			} else {
				params.include(key + '=' + value);
			}
		});
		serialized = params.join('&');
		e = (elem.nodeName === 'FORM') ? elem.getElements('input[type^=text]')[this.options.inputIndex]: elem;
		url = (this.options.params) ? this.options.url + e.get(this.options.query) + '&' + serialized :
			this.options.url + e.get(this.options.query);
		return url;
	},
	getResults: function(elem, e) {
		if (this.options.preventDefault) { e.preventDefault() }
		var container = elem.retrieve('container'),
			opts = this.options.loaderOptions,
			loader;
		if (!container.retrieve('hasResults')) {
			if (this.options.loader) loader = !opts.loaderType ? this.options.loader : this.options.loaderParent === 'container' ? container: elem;
			var requester = new Request({
				method: 'get',
				url: this.serialize(elem),
				onRequest: function() {
					if (this.options.loader) this.setLoader(loader, opts);
				}.bind(this),
				onSuccess: function(responseText) {
					container.innerHTML = responseText;
					if (this.options.loader) this.hideLoader();
					if (this.options.cache) container.store('hasResults', true);
					this.fireEvent('onFinish', [elem, container]);
				}.bind(this)
			});
			requester.send();
		}
	}
});

var CheckboxSearch = new Class({
	Extends: MBSearch,
	options: {
		events: 'click',
		indexify: false,
		cache: false,
		delay: 400
	},
	getResults: function(elem) {
		var container = elem.retrieve('container'),
			checkNum = this.getChecked(),
			url = (this.options.params) ? this.options.url + checkNum + '&' + this.serialize(elem) : this.options.url + checkNum,
			opts = this.options.loaderOptions,
			loader;
		if (!this.timer) clearTimeout(this.timer);
		if (checkNum.length > 0) {
			if (this.options.loader) loader = !opts.loaderType ? this.options.loader : this.options.loaderParent === 'container' ? container: elem.getParent('ol');
			var requester = new Request({
				method: 'get',
				url: url,
				onRequest: function() {
					if (this.options.loader) this.setLoader(loader, opts);
				}.bind(this),
				onSuccess: function(responseText) {
					container.innerHTML = responseText;
					if (this.options.loader) this.hideLoader();
					this.fireEvent('onFinish', [elem, container]);
				}.bind(this)
			});
			if (this.options.delay) {
				setTimeout(function() {
					requester.send();
				}, this.options.delay)
			} else { requester.send(); }
		} else {
			container.empty();
		}
	},
	getChecked: function() {
		var checkedArray = [];
		this.elems.each(function(elem) {
			var c = elem.get('checked');
			if (c === 'checked' || c === true) { checkedArray.push(elem.get(this.options.query)); }
		}, this);
		return checkedArray.join(',');
	}
});

var MeetingBuilderAccordion = new Class({
	initialize: function(togglers, folds) {
		this.folds = $$(folds);
		$$(togglers).each(function(toggler, index) {
			this.folds[index].addClass('expanded');
			this.attach(toggler, this.folds[index]);
		}, this);
	},
	attach: function(toggler, fold) {
		toggler.addEvent('click', function(event) {
			event.preventDefault();
			if (fold.hasClass('collapsed')) {
				fold.removeClass('collapsed').addClass('expanded');
				fold.parentNode.getElements('legend img')[0].set('src', '/lead/meetingbuilder/img/accordion_open.gif')
			} else {
				fold.removeClass('expanded').addClass('collapsed');
				fold.parentNode.getElements('legend img')[0].set('src', '/lead/meetingbuilder/img/accordion_close.gif')
			}
		}.bind(this));
	}
});
function updateStep3 (box, type) {
	if ($('li' + box.get('id'))) {
		alert('You have already added this item.');
	} else {
		var li = new Element('li', {'id': 'li' + box.get('id')});
		var url = new Element('input', {'type': 'hidden', 'name': 'url', 'value': box.retrieve('url')}).inject(li);
		var id = new Element('input', {'type': 'hidden', 'name': 'id', 'value': box.get('id')}).inject(li);
		var title = document.createTextNode(box.retrieve('title'));
		var cb = new Element('input', {'type': 'checkbox', 'name': 'title', 'id': 'box' + box.get('id'), 'value': title.nodeValue, 'checked': 'checked'}).inject(li);
		var span = new Element('span', {'class': 'step3subhead'}).appendText(box.retrieve('slug')).inject(li);
		var br = new Element('br').inject(li);
		var label = new Element('label', {'for': 'box' + box.get('id')}).grab(title).inject(li);
		if (window.retrieve('guest') && type === 'curriculum') {
			$E('ol#meetingList').grab(li, 'top');
		} else if (window.retrieve('guest') && type !== 'curriculum') {
			li.inject($E('ol#meetingList'));
		} else if (!window.retrieve('guest') && type === 'curriculum') {
			li.inject($E('ol#meetingList'));
		} else if (!window.retrieve('guest') && type !== 'curriculum') {
			$E('ol#meetingList').grab(li, 'top');
		}
		$$('#stepThree fieldset')[0].addClass('step3');
	}
};
function browseCurriculumCategories(container) {
	$$('#searchResults .articlesSearchHeadRight a').each(function(a) {
		a.addEvent('click', function(event) {
			event.preventDefault();
			var requester = new Request({
				url: a.get('href'),
				method: 'get',
				onSuccess: function(responseText) {
					container.innerHTML = responseText;
					browseCurriculumCategories(container);
				}
			});
			requester.send();
		});
	});
	$$('#searchResults div.collection').each(function(div) {
		div.getElements('a').each(function(a) {
			a.addEvent('click', function(event) {
				event.preventDefault();
				var requester = new Request({
					url: '/lead/meetingbuilder/ajax/browse.html?type=article&collectionid=' + div.get('id'),
					method: 'get',
					onSuccess: function(responseText) {
						container.innerHTML = responseText;
						curriculumBrowseComplete(container);
					}
				});
				requester.send();
			});
		});
	});
};
function curriculumBrowseComplete(container) {
	var boxes = [];
	$('closeSearch').addEvent('click', function(event) {
		container.setStyle('display', 'none');
		$('overlay').tween('opacity', '0').setStyles({'height': '0', 'display': 'none'});
	});
	$$('#searchResults input[type^=checkbox]').each(function(box) {
		box.addEvent('click', function(event) {
			if (box.get('checked') === 'checked' || box.checked) {
				var id = box.get('id');
				box.store('date', $('date' + id));
				box.store('title', $('title' + id).firstChild.nodeValue);
				box.store('rating', $('rating' + id));
				box.store('slug', $('slug' + id).firstChild.nodeValue);
				box.store('url', $('title' + id).get('href'));
				boxes.push(box);
			} else {
				boxes.erase(box);
			}
		});
	});
	$('saveResults').addEvent('click', function(event) {
		boxes.each(function(box) {
			updateStep3(box, 'curriculum');
			var results = new Element('div', {'class': 'individualResults', 'id': 'div' + box.get('id')}),
				cb = new Element('input', {'type': 'checkbox', 'checked': 'checked', 'value': box.get('id')}).addEvent('click', function(event) {
					if (cb.get('checked') !== 'checked' || !cb.checked) {
						$('div' + cb.get('value')).destroy();
						$('li' + cb.get('value')).destroy();
					}
				}),
				cbCell = new Element('div', {'class': 'tableCell'}).grab(cb).inject(results),
				dateCell = new Element('div', {'class': 'tableCell'}).addClass('dateCell').grab(box.retrieve('date')).inject(results),
				titleCell = new Element('div', {'class': 'tableCell'}).addClass('titleCell').appendText(box.retrieve('title')).inject(results),
				ratingCell = new Element('div', {'class': 'tableCell'}).addClass('ratingCell').grab(box.retrieve('rating')).inject(results);
			results.inject($('meetingBuilderSearch'));
		});
		boxes.empty;
		container.setStyle('display', 'none');
		$('overlay').tween('opacity', '0').setStyles({'height': '0', 'display': 'none'});
	});
	new MBPaging('#searchResults .moreLink', container, {
		onFinish: function(links, container) {
			curriculumBrowseComplete(container);
		}
	});
	externalLinks($$('#searchResults a.external'));
};
function meetingBuilderSearchComplete(elem, container) {
	new InputClear($('newSearchType'));
	new MBSearch($('newSearch'), container, {
		url: '/lead/meetingbuilder/ajax/search_pop_over.html?type=word&filter=curriculum&contenttype=curriculum&query=',
		events: 'submit',
		cache: false,
		onFinish: function(elem, container) {
			meetingBuilderSearchComplete(elem, container);
		}
	});
	var boxes = [];
	$('overlay').set('tween').setStyles({
		'top': -$(window).getScroll().y,
		'height':$(window).getScrollSize().y+$(window).getScroll().y,
		'visibility': 'visible',
		'display': 'block'
	}).tween('opacity', '0.7');
	$('lightbox').setStyles({'display': 'block', 'visibility': 'visible'});
	var w = (Browser.opera) ? window.innerWidth/2: window.getScrollSize().x/2;
	$('lightbox').setStyles({'top': window.getScroll().y + 100 + 'px', 'left': w - ($('lightbox').getScrollSize().x/2) + 'px'});
	$('closeSearch').addEvent('click', function(event) {
		$('lightbox').setStyle('display', 'none');
		$('overlay').tween('opacity', '0').setStyles({'height': '0', 'display': 'none'});
	});
	$$('#searchResults input[type^=checkbox]').each(function(box) {
		box.addEvent('click', function(event) {
			if (box.get('checked') === 'checked' || box.checked) {
				var id = box.get('id');
				box.store('date', $('date' + id));
				box.store('title', $('title' + id).firstChild.nodeValue);
				box.store('rating', $('rating' + id));
				box.store('slug', $('slug' + id).firstChild.nodeValue);
				box.store('url', $('title' + id).get('href'));
				boxes.push(box);
			} else {
				boxes.erase(box);
			}
		});
	});
	$('saveResults').addEvent('click', function(event) {
		boxes.each(function(box) { 
			updateStep3(box, 'curriculum');
			var results = new Element('div', {'class': 'individualResults', 'id': 'div' + box.get('id')});
			var cb = new Element('input', {'type': 'checkbox', 'checked': 'checked', 'value': box.get('id')}).addEvent('click', function(event) {
				if (cb.get('checked') !== 'checked' || !cb.checked) {
					$('div' + cb.get('value')).destroy();
					$('li' + cb.get('value')).destroy();
				}
			});
			var cbCell = new Element('div', {'class': 'tableCell'}).grab(cb).inject(results);
			var dateCell = new Element('div', {'class': 'tableCell'}).addClass('dateCell').grab(box.retrieve('date')).inject(results);
			var titleCell = new Element('div', {'class': 'tableCell'}).addClass('titleCell').appendText(box.retrieve('title')).inject(results);
			var ratingCell = new Element('div', {'class': 'tableCell'}).addClass('ratingCell').grab(box.retrieve('rating')).inject(results);
			results.inject($('meetingBuilderSearch'));
		});
		boxes.empty;
		$('lightbox').setStyle('display', 'none');
		$('overlay').tween('opacity', '0').setStyles({'height': '0', 'display': 'none'});
	});
	new MBPaging('#searchResults .moreLink', container, {
		onFinish: function(links, container) {
			meetingBuilderSearchComplete(elem, container);
		}
	});
	externalLinks($$('#searchResults a.external'));
};
var mbUpdateStep3OnFinish = function mbUpdateStep3OnFinish(elem, container, meetingBuilderSearch, collectionid) {
	if (container.hasClass('collapsed')) container.removeClass('collapsed').addClass('expanded');
	container.getElements('fieldset.sortBy input[type^=radio]').each(function(button) {
		button.addEvent('click', function(event) {
			meetingBuilderSearch.options.url = '/lead/meetingbuilder/ajax/checkboxsearch.html?type=keyword&contenttype=article&collectionid=' + collectionid + '&order=' + button.get('value') + '&query=';
			meetingBuilderSearch.getResults(elem);
		});
	});
	container.getElements('input[type^=checkbox]').each(function(box, index) {
		box.store('slug', container.getParent('fieldset').getElements('legend a')[0].firstChild.nodeValue);
		box.store('title', $('title' + box.get('id')).firstChild.nodeValue);
		box.addEvent('click', function(event) {
			if (box.get('checked') === 'checked' || box.checked === true) {
				updateStep3(box, 'builder');
			} else if ($('li' + box.get('id'))) {
				$('li' + box.get('id')).destroy();
			} else if ($('meetingList').getElements('li').length === '0') {
				$$('#stepThree fieldset')[0].removeClass('step3');
			}
		});
	});
};
window.addEvent('domready', function() { 
	new InputClear($$('input[type^=text]').combine($$('input[type^=password]')));
	var tooltips = new Tips($$('.tooltip, .toggler'), {
		className: 'showTip'
	});
	if ($('saveToCabinetLogin')) {
		var ajaxLogin = new Login($('saveToCabinetLogin'), {
			url: '/system/ajax/ajax_login.html',
			onFinish: function() {
				$('savePlanFields').setStyle('display', 'block');
				$('saveToCabinetLogin').destroy();
			}
		});
	}
	new MeetingBuilderAccordion($$('.toggler'), $$('.accordion .container'));
	$$('#printPlan a').each(function(a) {
		a.addEvent('click', function(event) {
			event.preventDefault();
			var toAdd = [];
			$$('#meetingList input[type^=checkbox]').each(function(field) {
				if (field.checked === true) {
					toAdd.include(field.get('id').replace('box', ''));
				}
			});
			window.open('/lead/meetingbuilder/print.html?id=' + toAdd.join(','), 'printWindow', 'width=600,height=400,toolbar=0,location=0,directories=0,status=0,menubar=1,scrollbars=1,resizble=1');
		});
	});
	$$('#emailPlan a').each(function(a) {
		a.addEvent('click', function(event) {
			event.preventDefault();
			var toAdd = [];
			$$('#meetingList input[type^=hidden]').each(function(field) {
				if (field.get('name') === 'id') {
					toAdd.include(field.get('value'));
				}
			});
			window.open('/lead/meetingbuilder/email.html?id=' + toAdd.join(','), 'printWindow', 'width=600,height=400,toolbar=0,location=0,directories=0,status=0,menubar=1,scrollbars=1,resizble=1');
		});
	});
	var lightbox = createOverlay('div', 'lightbox');
	$$('#groupPlanSearch fieldset').each(function(fieldset,index) {
		var e = (Browser.ie) ? 'click': 'change';
		var collectionid = fieldset.getElements('input.collectionid')[0].get('value');
		var meetingBuilderSearch = new CheckboxSearch(fieldset.getElements('input[type^=checkbox]'), $$('.accordion .container')[index], {
			url: '/lead/meetingbuilder/ajax/checkboxsearch.html?type=keyword&contenttype=article&order=newest&collectionid=' + collectionid + '&query=',
			events: e,
			loader: true,
			loaderOptions: {
				loaderSrc: '/system/img/ajax-loader.gif',
				styles: {
					'top': 30,
					'left': 65
				}
			},
			onFinish: function(elem, container) {
				mbUpdateStep3OnFinish(elem, container, meetingBuilderSearch, collectionid);
				new MBPaging('.container .moreLink', container, {
					onFinish: function() {
						mbUpdateStep3OnFinish(elem, container, meetingBuilderSearch, collectionid);
					}
				});
				externalLinks(container.getElements('a.external'));
			}
		});
	});
	$('biblestudyBrowse').addEvent('click', function(event) {
		event.preventDefault();
		var requester = new Request({
			url: '/lead/meetingbuilder/ajax/browse.html?type=collection&collectionid=5043,4790,4789,4788,4787,4786',
			method: 'get',
			onSuccess: function(responseText) {
				lightbox.innerHTML = responseText;
				$('overlay').set('tween').setStyles({
					'top': -$(window).getScroll().y,
					'height':$(window).getScrollSize().y+$(window).getScroll().y,
					'visibility': 'visible',
					'display': 'block'
				}).tween('opacity', '0.7');
				$('lightbox').setStyles({'display': 'block', 'visibility': 'visible'});
				var w = (Browser.opera) ? window.innerWidth/2: window.getScrollSize().x/2;
				$('lightbox').setStyles({'top': window.getScroll().y + 100 + 'px', 'left': w - ($('lightbox').getScrollSize().x/2) + 'px'});
				$('closeSearch').addEvent('click', function(event) {
					$('lightbox').setStyle('display', 'none');
					$('overlay').tween('opacity', '0').setStyles({'height': '0', 'display': 'none'});
				});
				browseCurriculumCategories(lightbox);
			}
		});
		requester.send();
	});
	var curriculumSearch = new MBSearch($('meetingBuilderSearch'), lightbox, {
		url: '/lead/meetingbuilder/ajax/search_pop_over.html?type=word&contenttype=curriculum&query=',
		cache: false,
		onFinish: function(elem, container) {
			$$('#sortByFields input[type^=radio]').each(function(button) {
				button.addEvent('click', function(event) {
					curriculumSearch.options.url = '/lead/meetingbuilder/ajax/search_pop_over.html?type=word&contenttype=curriculum&order='
						+ button.get('value') + '&query=';
					curriculumSearch.options.preventDefault = false;
					curriculumSearch.getResults(elem);
					curriculumSearch.options.preventDefault = true;
				});
			});
			meetingBuilderSearchComplete(elem, container);
		}
	});
});
