// JavaScript Document
//
// CONSTRUCTION4.ME Primary Javascript
//


var FORM_SUBMITTER = new Class({

	Implements: Options,

	options: {
		successURL: null
	},
	
	initialize: function(errorContainer,form,submitURL,options){
		this.setOptions(options);
		if(this.form = $(form)){
			if(this.errorContainer = $(errorContainer)){
				this.submitURL = submitURL;
				if(!(this.errorListContainer = this.errorContainer.getElement('ul'))){
					this.buildErrorListContainer();
				}
				this.form.addEvent('submit',function(event){
					event.stop();
					this.doSubmit();
				}.bind(this));
				this.errorContainer.set('reveal');
			}
		}
	},
	
	doSubmit: function(){
		new Request.JSON({
			url: this.submitURL,
			onSuccess: function(result){
				if(result.success){
					this.removeErrors();
					this.errorContainer.hide();
					if(this.options.successURL){
						window.location = this.options.successURL;
					}else{
						window.location = result.url;
					}
				}else{
					this.removeErrors();
					result.errors.each(function(error){
						if(label=this.findLabel(error.field)){
							label.getParent().addClass('ERROR');
						}
						new Element('li',{
							'html': error.error
						}).inject(this.errorListContainer);
					}.bind(this));
					this.errorContainer.reveal();
					new Fx.Scroll(window).toElement(this.errorContainer);
				}
			}.bind(this)
		}).post(this.form);
	},
	
	buildErrorListContainer: function(){
		this.errorListContainer = new Element('ul');
		this.errorContainer.adopt(
			new Element('div',{
				'class': 'ERROR'
			}).adopt(
				new Element('h4',{
					'html':'There were errors in the form'
				}),
				new Element('p',{
					'html':'Please correct the fields that are highlighted below:'
				}),
				this.errorListContainer
			)
		);
	},
	
	removeErrors: function(){
		this.errorListContainer.getChildren('li').each(function(el){
			el.dispose();
		});
		this.form.getElements('li.ERROR').each(function(el){
			el.removeClass('ERROR');
		});
	},
	
	findLabel: function(elementName){
		if(element = $(elementName)){
			if(labelFound = element.getPrevious('label')){
				return labelFound;
			}else{
				while (element = element.getParent()){
					if(labelFound = element.getPrevious('label')){
						return labelFound;
					}
				}
			}
		}
	}
});


var SHOW_REMAINING = new Class({

	initialize: function(form){
		if(this.form = $(form)){
			this.form.getElements("*[class*=show_remaining]").each(function(el) {
				this.setMaxLength(el);
			}, this);
		}
	},
	
	setMaxLength: function(el){
		var elp = el.getParent().getPrevious('label');
		el.maxLength = JSON.decode('{'+el.getProperty('rel')+'}').maxlength;
		elp.adopt(
			new Element('br'),
			new Element('span',{
				'class':'REMAINING',
				'html':'(<b>'+((el.value.length<=el.maxLength)?(el.maxLength-el.value.length):0)+'</b> remaining)'
			})
		);
		el.remainingElement = elp.getFirst('span');
		el.remainingCounter = el.remainingElement.getFirst('b');
		el.onkeyup = el.onchange = el.onblur = this.checkMaxLength;
	},
	
	checkMaxLength: function(){
		if (this.value.length > this.maxLength){
			this.remainingElement.addClass('ERROR');
		}else{
			this.remainingElement.removeClass('ERROR');
		}
		this.remainingCounter.firstChild.nodeValue = ((this.value.length<=this.maxLength)?(this.maxLength-this.value.length):0);
	}
});

var Countable = new Class({

	initialize: function(){
		this.E1 = $$('textarea[rel]');
		if(!(this.E1.length)){
			return;
		}else{
			this.setMaxLength();
		}
	},
	
	setMaxLength: function(){
		this.E1.each(function(el){
			var O = JSON.decode('{'+el.getProperty('rel')+'}');
			var CL = el.value.length;
			var ML = O.maxlength;
			var C = el.getPrevious('label');
			C.innerHTML = C.innerHTML+'<br /><span class="REMAINING">(<b>'+((CL<=ML)?(ML-CL):0)+'</b> characters remaining)</span>';
			el.RE = C.getFirst('b');
			el.onkeyup = el.onchange = el.onblur = this.checkMaxLength;
		}.bind(this));
	},
	
	checkMaxLength: function(){
		var CL = this.value.length;
		var O = JSON.decode('{'+this.getProperty('rel')+'}');
		var ML = O.maxlength;
		if (CL > ML){
			this.RE.addClass('countable-over');
		}else{
			this.RE.removeClass('countable-over');
		}
		this.RE.firstChild.nodeValue = ((CL<=ML)?(ML-CL):0);
	}
});


var AB1 = new Class({

	initialize: function(){
		this.E1 = $$('ul[rel]');
		if(!(this.E1.length)){
			return;
		}else{
			this.traverseOptions();
		}
	},
	
	traverseOptions: function(){
		this.E1.each(function(el){
			el1 = el.getChildren('li');
			
			el1.each(function(el2){
				el3 = el2.getFirst('span');
				el4 = el3.getFirst('span');
				if(el5 = el2.getFirst('ul')){
					el4.addClass('toggleControl');
					el4.innerHTML+=' &nabla;';
					var TP = new Element('div',{'class':'togglePanel'}).injectBefore(el5).adopt(el5);
					var FX = new Fx.Slide(TP);
					if(!(el3.hasClass('expanded'))){
						FX.hide();
					}
					el4.addEvent('click', function(){
						FX.toggle();
					});
				}
			}.bind(this));
		}.bind(this));
	}
});

var AB2 = new Class({

	initialize: function(el){
		if(el){
			var F1P = el.getPrevious(); F1P.innerHTML = F1P.innerHTML + ' ';
			var FX1 = new Fx.Slide(el).hide();
			var F1C = new Element('a',{
				'class':'toggleControl',
				'html':'Show / Hide',
				'events':{
					'click':function(){
						FX1.toggle();
					}
				}
			});
			F1C.inject(F1P,'bottom');
		}
	}
});


var C4M_FC = new Class({
	
	initialize: function(){
		this.Z = $$('a.favorite_toggle[rel]');
		if(!(this.Z.length)){
			return;
		}else{
			this.P = new Array('af','rf');
			this.V = new Array('Add to favorites','Remove from favorites');
			this.traverse();
		}
	},
	
	traverse: function(){
		this.Z.each(function(el){
			this.O = JSON.decode('{'+el.getProperty('rel')+'}'); // e.g. rel="{type:b,state:1,index:1}"
			this.E = el;
			this.E.addEvent('click', function(e){
				e.stop();
				var r = new Request.JSON({
					'url': '/ajax/' + this.O.type + this.P[this.O.state] + this.O.index,
					'onComplete': function(jsonObj){
						if(jsonObj.result==true){
							this.O.state = this.O.state==1?0:1;
							this.E.innerHTML = this.V[this.O.state];
						}else{
							alert(jsonObj.message);
						}
					}.bind(this)
				}).send();
			}.bind(this));
		}.bind(this));
	}
});

