var EAWC = function(config){
	var eawc = this;
	eawc.config = {};
	$.extend(eawc.config, config);
	
	eawc.init = function(){
		
		eawc.search.init();
		
	}
	
	eawc.search = {
		id : 'eawc-search-box',
		init : function(){
			eawc.search.$ = $('#'+eawc.search.id);
			eawc.search.$.find('.field.select').MomoSelectMenu();
			
			eawc.search.$.find('#default-submit').click(function(){
				eawc.search.submit();
			});
			
			eawc.search.$.find('#map-submit').click(function(){
				eawc.search.submit({DefaultPage:2});
			});
			
			MomoSelectMenus.initAll();
			
		},
		submit : function(args){
			if(!args){ args = {} }
			args.r = 'search';
			args.aid = '{'+eawc.config.aid+'}';
			
			var values = MomoSelectMenus.getAllValues();
			
			if(!values.dep){ return false; }
			
			$.each(values, function(i,v){
				args[i] = v.join(',');
			});
			
			window.location = eawc.config.base+eawc.config.page+'?'+$.param(args);
		}
	}

	
	
	$(eawc.init);
};


var MomoSelectMenus = {
	menus : {},
	push : function(m){
		this.menus[m.getId()] = m;
	},
	getAllValues : function(){
		var valueObj = {};

		$.each(this.menus,function(){
			if(!this.isDisable()){
				$.extend(valueObj,this.val(true));
			}
		});
		
		return valueObj;
	},
	initAll : function(){
	
		$.each(this.menus,function(){
			this.init();
		});

	},
	getMenu : function(id){
		m = this.menus[id];
		return m ? m : null;
	},
	closeAll : function(){
		$.each(this.menus,function(){
			this.close();
		});
	}
};

$.fn.MomoSelectMenu = function(settings){

	var settings = settings;
	
	return this.each(function(){
		var m = new MomoSelectMenu(this, settings);	
		MomoSelectMenus.push(m);
	});
	
};

function MomoSelectMenu(caller, settings){
	var menu = this;
	var $caller = menu.$caller = $(caller);
	
	var settings = jQuery.extend({
		state : {
			loading : 'momo-state-loading',
			open	: 'momo-state-open',
			active	: 'momo-state-active',
			selected: 'momo-state-selected',
			disable : 'momo-state-disable'
		},
		classes : {
			options : 'options',
			slave	: 'slave',
			multiple : 'multiple',
			groupParent : 'option-group-parent',
			disableable : 'disableable'
		},
		master : null
	},settings);
	
	this.getSettings = function(){
		return settings;
	}
	
	this.$options = $caller.find('.'+settings.classes.options);
	this.$currentOptions = null;
	
	menu.isMenuOpen = function(){
		return $caller.hasClass(settings.state.open);
	}
	
	menu.isMultiple = function(){
		return $caller.hasClass(settings.classes.multiple);
	}
	
	menu.isDisable = function(){
		return menu.trigger.$.hasClass(settings.state.disable);
	}

	menu.getId = function(){
		return $caller.attr('id');
	}

	menu.loading = function(state){
		
	}
	
	menu.autoSelect = {
		init : function(){
			var $autoSelectOptions = $('.auto-select-option',$caller);
			$autoSelectOptions.unbind('_deselect_').bind('_deselect_',function(e, initial){
				$(this).removeClass(settings.state.selected);
				$(this).find('.value').html(menu.messages.$.find('.selection_messages .select_all').html());
				if(!initial){
					$(this).siblings('.option').trigger('_deselect_');
				}
			});
			
			$autoSelectOptions.unbind('_select_').bind('_select_',function(e, initial){
				$(this).addClass(settings.state.selected);
				$(this).find('.value').html(menu.messages.$.find('.selection_messages .select_none').html());
				if(!initial){
					$(this).siblings('.option').trigger('_select_');
				}
			});
			
			$autoSelectOptions.unbind('click').bind('click',function(e){
				$autoSelect = $(this);
				if($autoSelect.hasClass(settings.state.selected)){
					$autoSelect.trigger('_deselect_');
				}else{
					$autoSelect.trigger('_select_');
				}
				e.stopPropagation();
			});
			
			$autoSelectOptions.trigger('_deselect_',true);
		}
	}
	
	menu.open = function(){
		MomoSelectMenus.closeAll();
		if(!menu.$currentOptions){ return false; }
		
		$caller
			.removeClass(settings.state.loading)
			.addClass(settings.state.open);
		
		menu.$currentOptions
			.addClass(settings.state.open)
			.show();
		
		return true;
	}
	
	menu.close = function(){
		if(!menu.isMenuOpen()){ return false; }
		if(!menu.$currentOptions){ return false;}
		$caller
			.removeClass(settings.state.loading)
			.removeClass(settings.state.open);
		
		menu.$currentOptions
			.removeClass(settings.state.open)
			.hide();
		return true;
	}
	
	menu.refresh = function(){
		menu.$currentOptions = menu.$options.filter('.'+settings.state.active);
	}
	
	menu.val = function(returnObj){
		if(menu.$currentOptions){
			var $selectedOptions = menu.$currentOptions.find('.option').Option(menu, 'selected');
			var values = $selectedOptions.Option(menu, 'val');
			if(!values){ return false; }
			return returnObj ? menu.processVal(values) : values;
		}
		return false;
	}
	
	menu.processVal = function(values){
		var valuesObj = {};
		var default_key = menu.getId().replace('search-field-','');
		$.each(values,function(i,value){
			key = default_key;
			var sep_index = value.indexOf('|');
			if(sep_index != -1){
				key = value.substring(0,sep_index);
				value = value.substring(sep_index+1);
			}
			if(!$.isArray(valuesObj[key])){
				valuesObj[key]=[];
			}
			value = value.split(',');
			$.each(value,function(i,v){
				valuesObj[key].push(v);
			});
		});
		return valuesObj;
	}
	
	menu.messages = {
		$ : $caller.find('> div.messages')
	}
	
	menu.trigger = {
		$ : $caller.find('> div.trigger'),
		click : function(e){
			if(menu.trigger.$.hasClass(settings.state.disable)){return false;}
			if(menu.isMenuOpen()){
				if(menu.close()){
					menu.trigger.$.removeClass(settings.state.open);
				}
			}else{
				if(menu.open()){
					menu.trigger.$.addClass(settings.state.open);
				}
			}
			e.stopPropagation();
		},
		refreshLabel : function(){
			
			if(menu.trigger.$.hasClass(settings.classes.disableable) && menu.trigger.$.hasClass('dep-'+menu.master.val()) ){
				menu.trigger.$.addClass(settings.state.disable);
			}else{
				menu.trigger.$.removeClass(settings.state.disable);
			}
			
			if(menu.$currentOptions){
				$selected = menu.$currentOptions.find('.option').Option(menu, 'selected');
				total = menu.$currentOptions.find('.option').length;

				if($selected.length == 0){
					msg = 'none';
				}else if($selected.length > 0 && $selected.length < total){
					msg = 'some';
					
				}else if($selected.length == total){
					msg = 'all';
				}else{
					msg = 'default';
				}
			}else{
				msg = 'dependant';
			}
			
			var text = menu.messages.$.find('.selection_messages .'+msg).html();

			if(text.indexOf('[selection:text]') != -1){
				selected_text = [];
				$.each($selected,function(){
					selected_text.push($(this).text())
				});
				
				text = text.replace('[selection:text]',selected_text.join(','));
			}
			
			if(text.indexOf('[selection:no]') != -1){
				text = text.replace('[selection:no]',$selected.length);
			}
			if(text.indexOf('[selection:total]') != -1){
				text = text.replace('[selection:total]',total);
			}
			menu.trigger.$.html(text).removeClass('none').removeClass('some').removeClass('all').removeClass('default').removeClass('dependant').addClass(msg);
		}
		
	}
	
	menu.triggerEvent = function(event){
		$caller.trigger(event);
	}
	
	menu.preInit = function(){
		menu.id = menu.getId();
		menu.$options.find('.option').Option(menu, 'init');
		menu.master = null
		
		if($caller.hasClass(settings.classes.slave)){
			var classes = $caller.attr('class').split(' ');
			var masterclass = null;
			$.each(classes, function(i,v){
				if(v.match(/^master-/)){
					menu.master = MomoSelectMenus.getMenu('search-field-'+v.replace('master-',''));
				}
			});
		}
		
		$caller.bind('beforeChange',function(){
			if(!menu.isMultiple()){
				var $selectedOptions = menu.$currentOptions.find('.option').Option(menu, 'selected');
				$selectedOptions.Option(menu, 'deselect');
			}
		});
		
		$caller.bind('afterChange',function(){
			menu.trigger.refreshLabel();
			
			if(!menu.isMultiple()){
				menu.close();
			}
		});
		
		if(menu.master){
			menu.master.$caller.bind('afterChange',function(){
				classFilter = '.'+menu.master.getId()+'-'+menu.master.val();
				menu.$currentOptions = menu.$options.filter(classFilter);
				menu.trigger.refreshLabel();
			});
		}else{
			menu.$currentOptions = menu.$options;
			menu.$currentOptions.addClass(settings.state.active);
		}
		$(document).bind('click',function(){
			MomoSelectMenus.closeAll();
		});
		menu.trigger.$.click(menu.trigger.click);
		menu.trigger.refreshLabel();
		menu.autoSelect.init();
	}
	
	menu.init = function(){
		if(menu.$currentOptions){
			menu.$currentOptions.find('.option.'+settings.state.selected).trigger('_select_',true);
		}
	}
	
	menu.preInit();
}

$.fn.Option = function(menu, operation){
	
	var methods = {
		select : function($option, initial){
			$option.addClass(settings.state.selected);
			var childsgroup = $option.next('.option-group');
			if(childsgroup.length > 0 && !initial){
				childsgroup.find('> .auto-select-option').trigger('_select_');
			}
			if(initial){
				$parent_group = $option.parent('.option-group');
				$parent_group.prev('.option').trigger('_select_',true);
			}
			childsgroup.show();
			return true;
		},
		deselect : function($option, initial){
			$option.removeClass(settings.state.selected);
			var childsgroup = $option.next('.option-group');
			if(childsgroup.length > 0 && !initial){
				childsgroup.find('> .auto-select-option').trigger('_deselect_');
			}
			childsgroup.hide();
			return true;
		},
		isSelected : function($option){
			return $option.hasClass(settings.state.selected);
		},
		selected : function($option){
			return $option.filter('.'+settings.state.selected);
		},
		val : function($option){
			var values = [];
			$option.each(function(){
				var val = $(this).attr('value');
				if(val&&!/^SKIP\|/.test(val)){
					values.push(val);
				}
			});
			return values.length ? values : false;
		},
		init : function($option){
			$option.each(function(){
				$(this).unbind('_select_').bind('_select_',function(e,initial){
					menu.triggerEvent('beforeChange');
					methods.select($(this),initial);
					menu.triggerEvent('afterChange');
				});
				$(this).unbind('_deselect_').bind('_deselect_',function(e,initial){
					menu.triggerEvent('beforeChange');
					methods.deselect($(this),initial);
					menu.triggerEvent('afterChange');
				});
				$(this).unbind('click').bind('click',function(e){
					$option = $(this);
					if($option.hasClass(settings.state.selected)){
						$option.trigger('_deselect_');
					}else{
						$option.trigger('_select_');
					}
					e.stopPropagation();
				});

			});
			return $option.get();
		}
	}

	var settings = menu.getSettings();

	if(!operation){ operation = 'init'; }
	
	if(methods[operation]){
		return methods[operation]($(this));
	}

}

