/**
 * Boat-filter
 * @author Alexander Johansson <alexander.johansson@sitedirect.se>
 * @copyright Copyright (c) 2010, SiteDirect
 */
var BoatFilter = new Class ({
	initialize: function(formId, boatData) {
	    this.formId = formId;
	    this.formObj = $(formId);
		
		
		this.boatData = boatData;
		this.filters = $H();
		
		//console.log(this.boatData);
		// Bind onchange-events to all the input and hook inputs to boats
		this.formObj.getElements('input').each(this.hookBoats.bind(this));
		
		if (Browser.Engine.trident) { // preload swap-images if ie...
			this.boatData.each(function(item, index, array) {
				var myImage = new Image;
				myImage.src = $(item.element).getLast('img').src;
				
			}, this);
		}
		//this.inputClick(); // If any input was checked by cookies this show/hides them
							
	},
	hookBoats : function(element) {
	
		var filter = element.name.split('_');
		
		var type = filter[0];
		var code = filter[1];
		var value = filter[2]; 
		
		var checked = element.checked;
		
		
		if (!(this.filters[code] instanceof Array))
			this.filters[code] = new Array();
		
		// Identifier for this filter-checkbox
		var filterId = element.name;
		
		// Array for all boats that the input affect	
		element.affects = new Array();
		
		// Hook boats to the inputs
		this.boatData.each(function(item, index, array) {
			var hook = false;
			item.properties.each(function(props) {
				var itemVal = props[code];
				if (this['validate_' + type](itemVal, value))
					hook = true;
			},this);
			

			if (hook) {
			
				// Array for all inputs that the boat-item depends on
				if (!(item.dependsOn instanceof Hash)) {
					item.dependsOn = $H();
				}
				if (!(item.dependsOn[code] instanceof Array)) {
					item.dependsOn[code] = new Array();
				}
				
				item.dependsOn[code].include(value);
				
				// Array for all boats that the input affect					
				element.affects.include(item);
				
				
			}
			 
		}, this);
		
		$(element).getNext('span').set('text','(' + element.affects.length + ')');
		
		 
		element.addEvent('click', this.inputClick.pass(element,this));
		
		if (Cookie.read(this.formId + "_" + filterId)) {
			// Cookie support:
			//element.checked = true;
			//this.filters[code].include(value);
			
		}
	},
	validate_num : function(itemVal, value) {
		// The num is either in format "X" or "X-Y"
		var values = value.split('-');
		
		minValue = Number(values[0]);
		maxValue = values[1] ? Number(values[1]) : minValue;
		
				
		return (itemVal >= minValue && itemVal <= maxValue);
		
	},
	
	validate_str : function(itemVal, value) {
		return (itemVal === value)
		
	},
	
	validate_notEmpty : function(itemVal, value) {
		//console.log(itemVal, value);
		return (itemVal && itemVal.length > 0)
		
	},
	inputClick : function(element) {
		
		if (element) {
			var filterId = element.name;
			var filter = element.name.split('_');
			
			var type = filter[0];
			var code = filter[1];
			var value = filter[2]; 
			if (element.checked) {
				this.filters[code].include(value);
				Cookie.write(this.formId + "_" + filterId, element.checked);
			} else {
				this.filters[code].erase(value);
				Cookie.dispose(this.formId + "_" + filterId);
			}
			// Save cookie to next reload
			
		}
		//console.log(this.filters);
		
		//console.log(this.boatData);
		
		// Go through all boats
		this.boatData.each(function(boatItem) {
			var show = true; // Show the boat per default.
			
			// Compare to the active filters
			this.filters.each(function(values, code) {
				// Compare to the active filters
				if (values.length > 0)  { // If the filter is active
					// See if the boat is in the filter
					
					if (boatItem.dependsOn instanceof Hash && boatItem.dependsOn[code] instanceof Array) {
						
						var found = false;
						//console.log(boatItem.dependsOn[code])
						boatItem.dependsOn[code].each(function(v) {
							if (values.contains(v))
								found = true;
						},this);
						
						if (!found)												
							show = false;
					} else {
						show = false;
					}
				}
				
			},this);
			
			if (show) {
				this.show(boatItem.element);
				//console.log(boatItem);
			} else {
				this.hide(boatItem.element);
			}
		},this);
		
			
		
	},
	show : function( element ) {
		 //console.log("fade in " + element);
		if (!Browser.Engine.trident) {
			$(element).fade('in');
		} else {
			$(element).getLast('img').setStyle('display','none');;
			$(element).getFirst('img').setStyles({display:'inline', visibility: 'visible'});
		}
	},
	hide : function( element ) {
		 //console.log("fade out " + element);	
		if (!Browser.Engine.trident) {
			$(element).fade(0.3);
		} else {
			$(element).getFirst('img').setStyle('display','none');;
			$(element).getLast('img').setStyles({display:'inline', visibility: 'visible'});;
		}
	}

}); 