Color.implement({
	changeBrightness: function(value) {
		return new Color([this.hsb[0], this.hsb[1], this.hsb[2]+value], 'hsb');
	}
});

// my first class
var PulsateFx = new Class({
	options: {
		pulselength:250,
		pulses:3,
		transitionIn:Fx.Transitions.Cubic.easeIn,
		transitionOut:Fx.Transitions.Quad.easeOut,
		toColor:false, toAlpha:.8
	},
	initialize: function(pulsatingElement, options) {
		this.setOptions(options);
		var originalBgColor = $(pulsatingElement).getStyle('background-color');
		var fxIn = $(pulsatingElement).effects({
			duration:this.options.pulselength,
			transition:this.options.transitionIn
		});
		var fxOut = $(pulsatingElement).effects({
			duration:this.options.pulselength,
			transition:this.options.transitionOut
		});
		this.pulsate(fxIn, fxOut, originalBgColor);
	},
	pulsate: function(fxIn, fxOut, originalBgColor) {
		var extraTime = 10;
		var p = function() {
			if (this.options.toColor != false) {
				if (this.options.toColor == 'lighter' || this.options.toColor == 'darker') {
					var brighterBgColor = new Color(originalBgColor);
					brighterBgColor = brighterBgColor.changeBrightness(this.options.toColor == 'lighter' ? 10 : -10).rgbToHex(false);
					fxIn.start({ 'background-color': brighterBgColor }).chain(function() {
						fxOut.start({ 'background-color': originalBgColor });
					});
				} else {
					fxIn.start({ 'background-color': this.options.toColor }).chain(function() {
						fxOut.start({ 'background-color': originalBgColor });
					});
				}
			} else {
				fxIn.start({ 'opacity':this.options.toAlpha }).chain(function() {
					fxOut.start({ 'opacity':1 });
				});
			}
		}.bind(this).periodical(this.options.pulselength * 2 + extraTime);
		(function() { $clear(p); }).delay(this.options.pulses * 2 * this.options.pulselength + this.options.pulselength + (this.options.pulses * extraTime));
	}
});
PulsateFx.implement(new Options, new Events);


// my MoreLinkClass
var MoreLinks = new Class({
	initialize: function(slidingElement) {
		var stretcher = $$(slidingElement);
		stretcher.each(function(el, index) {
			el.setStyle('padding-bottom', '2em');
			var toggler = new Element('a', { 'class':'more', 'href':'#' });
			toggler.setText('more...');
			var slider = new Fx.Slide(el);
			toggler.addEvent('click', function(event) {
				this.slide(event, 'toggle', toggler, slider);
			}.bind(this));
			toggler.injectInside(el.parentNode.getPrevious());
			slider.hide();
		}.bind(this));
	},
	slide: function(event, mode, toggler, slider) {
		new Event(event).stop();
		toggler.blur();
		switch (mode) {
			case 'slideIn': {
				slider.slideIn();
				toggler.setText('more...');
			}
			case 'slideOut': {
				slider.slideOut();
				toggler.setText('less...');
			}
			case 'toggle': {
				slider.toggle();
				if (toggler.getText() == 'less...') toggler.setText('more...'); else toggler.setText('less...');
			}
		}
	}
});
MoreLinks.implement(new Options, new Events);


// my AjaxifyFormSubmitClass
var AjaxifyFormSubmit = new Class({
	options: {
		action:'ajaxresponder.php',
		ajaxloadingId:'ajaxloading'
	},
	initialize: function(options) {
		this.setOptions(options);
		$$('form').each(function(el, index) {
			if (!el.hasClass('noAjax')) {
				el.addEvent('submit', function(event) {
					el.action = this.options.action;
					event = new Event(event).stop();
					// height and width of ajaxloading-container should be determined by the image dimensions
					var ajaxloading = new Element('p', { 'id': this.options.ajaxloadingId });
					var responseContainer = $pick(el.getElement('div.formErrorMessage'), new Element('div', { 'class':'formErrorMessage' }));
					var submitButton = el.getElement('input[type=submit]');
					ajaxloading.injectBefore(submitButton);
					submitButton.setStyle('display', 'none');
	
					el.send({ onComplete: function(request) {
						responseContainer.empty();
						if (!(request.test('^Thanks') || request.test('^There'))) {
							var para = document.createElement('p');
							para.appendChild(document.createTextNode('There were errors. Please fill in:'));
							responseContainer.appendChild(para);
							var ulist = document.createElement('ul');
							var lis = request.split('#');
							for (var i = 0; i < lis.length; i++) {
								var li = document.createElement('li');
								li.appendChild(document.createTextNode(lis[i]));
								ulist.appendChild(li);
							}
							responseContainer.appendChild(ulist);
							responseContainer.injectAfter(submitButton);
							submitButton.setStyle('display', '');
						} else {
							responseContainer.empty();
							responseContainer.removeClass('formErrorMessage');
							var para = document.createElement('p');
							para.innerHTML = request;
							responseContainer.appendChild(para);
							submitButton.replaceWith(responseContainer);
						}
						ajaxloading.remove();
					}});
				}.bind(this));
			}
		}.bind(this));
	}
});
AjaxifyFormSubmit.implement(new Options, new Events);
