$(document.getElementsByTagName('HTML')[0]).addClassName('chairForms');

var chairForms = {
	applyClasses: function(element, classes) {
		var j='cf';
		for (var i=0; i<classes.length; i++) {
			j += '_'+classes[i];
			element.addClassName(j);
		}
		return j;
	},
	init: function(types) {

		chairForms.singleSelects = {
			controls: $$('select').findAll(function(elt){ return (!elt.multiple) && (elt.size <= 1) && (elt.getStyle('display') != 'none'); }),
			buildAvatar: function(ctrl) {
				ctrl.avatar = new Element('div');
				ctrl.baseClass = chairForms.applyClasses(ctrl.avatar,['avatar','select','single']);
				if (ctrl.id) { ctrl.avatar.id = ctrl.id+'_avatar'; }
				if (ctrl.disabled) { ctrl.avatar.addClassName(ctrl.baseClass+'_disabled'); }
				ctrl.display = new Element('span', { 'class': ctrl.baseClass+'_display' });
				ctrl.toggler = new Element('span', { 'class': ctrl.baseClass+'_toggler' }).update('toggle');
				ctrl.optionList = new Element('ul', { 'class': ctrl.baseClass+'_options' });
				ctrl.avatar.insert(ctrl.toggler)
					.insert(ctrl.display)
					.insert(ctrl.optionList);
			},
			buildList: function(ctrl) {
				ctrl.optionList.update();
				ctrl.select('option').each(function(optionElt, index){
					var listElement = new Element('li').update(optionElt.innerHTML).addClassName((index%2)?'even':'odd').observe('click', function() {
						chairForms.singleSelects.setValue(ctrl, index);
						chairForms.singleSelects.displayValue(ctrl);
						ctrl.optionList.hide();
					});
					ctrl.optionList.insert(listElement);
				});
				chairForms.singleSelects.displayValue(ctrl);
			},
			handleEvents: function(ctrl) {
				ctrl.observe('change', function(){
					chairForms.singleSelects.displayValue(ctrl);
				}).observe('focus', function(){
					ctrl.avatar.addClassName(ctrl.baseClass+'_focused');
				}).observe('blur', function(){
					ctrl.avatar.removeClassName(ctrl.baseClass+'_focused');
				});
				ctrl.toggler.observe('click', function(e){
					ctrl.optionList.toggle();
					e.stop();
				});
				document.observe('click', function(){
					ctrl.optionList.hide();
				});
			},
			swap: function(ctrl) {
				ctrl.addClassName('shifted');
				ctrl.optionList.hide();
				ctrl.insert({ after: ctrl.avatar });
			},
			displayValue: function(ctrl) {
				if (ctrl.selectedIndex > -1) {
					ctrl.display.update(ctrl.options[ctrl.selectedIndex].text);
				} else {
					ctrl.display.update('&nbsp;');
				}
			},
			setValue: function(ctrl, index) {
				ctrl.selectedIndex = index;
				if (ctrl.onchange) { ctrl.onchange(); }
			},
			watchRefreshes: function(ctrl) {
				new PeriodicalExecuter(function(){
					var currentOptions = ctrl.textContent || ctrl.innerText;
					if (currentOptions != ctrl.lastOptions) {
						chairForms.singleSelects.buildList(ctrl);
						ctrl.lastOptions = currentOptions;
					}
				}, 0.1);
			},
			posCheck: function() {
				if (chairForms.singleSelects.controls.length <= 0) { return; }
				var ctrl = chairForms.singleSelects.controls[0];
				ctrl.avatar.setStyle({ display: 'inline-block', float: 'none' });
				if ((ctrl.avatar.offsetWidth - ctrl.toggler.offsetLeft - ctrl.toggler.offsetWidth) > 11) {
					$(document.body).addClassName('no_inline_position');
				}
				ctrl.avatar.removeAttribute('style');
			},
			init: function(ctrl) {
				chairForms.singleSelects.buildAvatar(ctrl);
				chairForms.singleSelects.buildList(ctrl);
				chairForms.singleSelects.handleEvents(ctrl);
				chairForms.singleSelects.swap(ctrl);
			}
		};
		
		chairForms.multipleSelects = {
			controls: $$('select').findAll(function(elt){ return (elt.multiple || (elt.size > 1)) && (elt.getStyle('display') != 'none'); }),
			buildAvatar: function(ctrl) {
				ctrl.avatar = new Element('div');
				ctrl.baseClass = chairForms.applyClasses(ctrl.avatar,['avatar','select','multiple']);
				if (ctrl.id) { ctrl.avatar.id = ctrl.id+'_avatar'; }
				if (ctrl.disabled) { ctrl.avatar.addClassName(ctrl.baseClass+'_disabled'); }
				ctrl.optionList = new Element('ul', { 'class': ctrl.baseClass+'_options' });
				ctrl.avatar.insert(ctrl.optionList);
			},
			buildList: function(ctrl) {
				ctrl.optionList.update();
				ctrl.optionListItems = [];
				ctrl.select('option').each(function(optionElt, index) {
					var listElement = new Element('li').update(optionElt.innerHTML).addClassName((index%2)?'even':'odd').observe('click', function(e){
						if (e.ctrlKey && this.hasClassName('selected')) {
							chairForms.multipleSelects.removeValue(ctrl, index);
						} else {
							chairForms.multipleSelects.addValues(ctrl, index, e.ctrlKey);
						}
						chairForms.multipleSelects.displayValues(ctrl, ctrl.optionListItems);
					});
					ctrl.optionList.insert(listElement);
					ctrl.optionListItems.push(listElement);
				});
				chairForms.multipleSelects.displayValues(ctrl, ctrl.optionListItems);
			},
			handleEvents: function(ctrl) {
				ctrl.observe('change',function(){
					chairForms.multipleSelects.displayValues(ctrl, ctrl.optionListItems);
				}).observe('focus', function(){
					ctrl.avatar.addClassName(ctrl.baseClass+'_focused');
				}).observe('blur', function(){
					ctrl.avatar.removeClassName(ctrl.baseClass+'_focused');
				});
			},
			swap: function(ctrl) {
				ctrl.addClassName('shifted');
				ctrl.insert({ after: ctrl.avatar });
			},
			displayValues: function(ctrl, items) {
				for (var i=0;i<ctrl.options.length;i++) {
					if (ctrl.options[i].selected) {
						items[i].addClassName('selected');
					} else {
						items[i].removeClassName('selected');
					}
				}
			},
			addValues: function(ctrl, index, additive) {
				if (!additive) { ctrl.selectedIndex = -1; }
				ctrl.options[index].selected = true;
				if (ctrl.onchange) { ctrl.onchange(); }
			},
			removeValue: function(ctrl, index) {
				ctrl.options[index].selected = false;
				if (ctrl.onchange) { ctrl.onchange(); }
			},
			watchRefreshes: function(ctrl) {
				new PeriodicalExecuter(function(){
					var currentOptions = ctrl.textContent || ctrl.innerText;
					if (currentOptions != ctrl.lastOptions) {
						chairForms.multipleSelects.buildList(ctrl);
						ctrl.lastOptions = currentOptions;
					}
				}, 0.3);
			},
			init: function(ctrl) {
				chairForms.multipleSelects.buildAvatar(ctrl);
				chairForms.multipleSelects.buildList(ctrl);
				chairForms.multipleSelects.handleEvents(ctrl);
				chairForms.multipleSelects.swap(ctrl);
			}
		};
		
		chairForms.radios = {
			controls: $$('input[type="radio"]'),
			init: function(ctrl) {
				
				// construct avatar
				ctrl.avatar = new Element('span');
				ctrl.baseClass = chairForms.applyClasses(ctrl.avatar,['avatar','click','radio']);
				if (ctrl.id) { ctrl.avatar.id = ctrl.id+'_avatar'; }
				if (ctrl.checked) {	ctrl.avatar.addClassName(ctrl.baseClass+'_checked'); }
				if (ctrl.disabled) { ctrl.avatar.addClassName(ctrl.baseClass+'_disabled'); }
				ctrl.insert({ after: ctrl.avatar });

				// handle events
				ctrl.relatedCtrls = chairForms.radios.controls.select(function(elt){ return elt.name == ctrl.name; });
				ctrl.avatar.observe('click', function(e) {
					ctrl.click();
					e.stop();
				});
				ctrl.observe('click', function(e) {
					ctrl.relatedCtrls.each(function(c){ c.avatar.removeClassName(ctrl.baseClass+'_checked'); });
					ctrl.relatedCtrls.find(function(c){ return c.checked; }).avatar.addClassName(ctrl.baseClass+'_checked');
				}).observe('focus', function(){
					ctrl.avatar.addClassName(ctrl.baseClass+'_focused');
				}).observe('blur', function(){
					ctrl.avatar.removeClassName(ctrl.baseClass+'_focused');
				});
				
				// initialise
				ctrl.addClassName('shifted');
				
			}
		};
		
		chairForms.checkboxes = {
			controls: $$('input[type="checkbox"]'),
			init: function(ctrl) {
							
				// construct avatar
				ctrl.avatar = new Element('span');
				ctrl.baseClass = chairForms.applyClasses(ctrl.avatar,['avatar','click','checkbox']);
				if (ctrl.id) { ctrl.avatar.id = ctrl.id+'_avatar'; }
				if (ctrl.checked) {	ctrl.avatar.addClassName(ctrl.baseClass+'_checked'); }
				if (ctrl.disabled) { ctrl.avatar.addClassName(ctrl.baseClass+'_disabled'); }
				ctrl.insert({ after: ctrl.avatar });

				// handle events
				ctrl.avatar.observe('click', function(e) {
					ctrl.click();
					e.stop();
				});
				ctrl.observe('click', function(e) {
					chairForms.checkboxes.checkUncheck(ctrl);
				}).observe('focus', function(){
					ctrl.avatar.addClassName(ctrl.baseClass+'_focused');
				}).observe('blur', function(){
					ctrl.avatar.removeClassName(ctrl.baseClass+'_focused');
				});
				
				// initialise
				ctrl.addClassName('shifted');
				
			},
			checkUncheck: function(ctrl) {
				if (ctrl.checked) {
					ctrl.avatar.addClassName(ctrl.baseClass+'_checked');
				} else {
					ctrl.avatar.removeClassName(ctrl.baseClass+'_checked');
				}
			}
		};
		
		chairForms.files = {
			controls: $$('input[type="file"]'),
			init: function(ctrl) {
				// construct avatar
				ctrl.wrapper = new Element('span');
				ctrl.baseClass = chairForms.applyClasses(ctrl.wrapper,['wrap','file']);
				if (ctrl.id) { ctrl.wrapper.id = ctrl.id+'_wrapper'; }
				if (ctrl.disabled) { ctrl.wrapper.addClassName(ctrl.baseClass+'_disabled'); }
				ctrl.mask = new Element('span', { 'class': ctrl.baseClass+'_mask' });
				ctrl.label = new Element('span', { 'class': ctrl.baseClass+'_label' }).update('click to upload file');
				ctrl.display = new Element('span', { 'class': ctrl.baseClass+'_display' });
				Element.wrap(ctrl, ctrl.mask);
				Element.wrap(ctrl.mask, ctrl.wrapper);
				ctrl.wrapper.insert(ctrl.label).insert(ctrl.display);
				
				// handle events
				ctrl.wrapper.observe('mousemove', function(e) {
					var cursor = {
						x: e.pointerX(),
						y: e.pointerY()
					};
					var box = {
						l: ctrl.wrapper.cumulativeOffset()[0],
						t: ctrl.wrapper.cumulativeOffset()[1]
					};
					box.r = box.l+ctrl.wrapper.offsetWidth;
					box.b = box.t+ctrl.wrapper.offsetHeight;
					if ((cursor.x>box.l) && (cursor.y>box.t) && (cursor.x<box.r) && (cursor.y<box.b)) {
						ctrl.setStyle({
							left: cursor.x-box.l-ctrl.offsetWidth+10+'px',
							top: cursor.y-box.t-ctrl.offsetHeight+10+'px'
						});
					}
				});
				ctrl.observe('change', function(e) {
					ctrl.display.update(ctrl.value.substring(ctrl.value.lastIndexOf('\\')+1));
					ctrl.label.update('uploaded file: ');
				}).observe('focus', function(){
					ctrl.wrapper.addClassName(ctrl.baseClass+'_focused');
				}).observe('blur', function(){
					ctrl.wrapper.removeClassName(ctrl.baseClass+'_focused');
				});
			}
		};
		
		types = types.split('|');
		for (var i=0;i<types.length;i++) {
			chairForms[types[i]].controls.each(chairForms[types[i]].init);
			if (types[i]=='singleSelects') {
				chairForms.singleSelects.posCheck();
			}
		}
		
	}
};

// PlanetRecruit extensions
chairForms.watchSelects = {
	init: function() {
		this.groups = {
			single: $('continent', 'country', 'region', 'salary_minimum', 'salary_rate').compact(),
			multiple: $('desired_continent', 'desired_country', 'desired_region', 'categorySelect', 'typeSelect', 'alertCategory', 'alertJobType').compact()
		};
		if ($('desired_locationsControls')) {
			this.groups.multiple.push($('desired_locationsControls').down('select[name="desired_locations"]'));
		}
		for (var i in this.groups) {
			this.groups[i].each(function(ctrl){
				chairForms[i+'Selects'].watchRefreshes(ctrl);
			})
		}
		if ($('desired_continent')) {
			new Form.Element.Observer('desired_continent', 0.1, function(ctrl,value){
				chairForms.multipleSelects.buildList(ctrl);
			});
		}
	}
};

chairForms.jobTermCheckboxes = {
	correct: function() {
		chairForms.jobTermCheckboxes.terms.each(function(ctrl){
			chairForms.checkboxes.checkUncheck(ctrl);
		});
	},
	init: function() {
		this.terms = $$('#jobtermInput input, #alertFieldJobTerm input').compact();
		this.terms.invoke('observe', 'change', function() {
			setTimeout(chairForms.jobTermCheckboxes.correct, 50);
		}).invoke('observe', 'click', function() {
			setTimeout(chairForms.jobTermCheckboxes.correct, 50);
		});
	}
};

document.observe('dom:loaded',function(){
	chairForms.init('singleSelects|multipleSelects|files|checkboxes|radios');
	chairForms.watchSelects.init();
	chairForms.jobTermCheckboxes.init();
});

