var AND = 0;
var OR = 1;





var productfinder = function () {
	
	var visibleList = {};
	var hiddenList = {};
	var products = {};
	var productsPrice = new Array();
	var currentSettings = {};
	var settingsType = {};
	var urlPrefix = '';
	/*var productsJsonUrl = 'personal/ajax/productfinderProducts?productfinder=';
	var compareUrl = 'personal/compare/';*/
	var productsJsonUrl = 'ajax/productfinderProducts?productfinder=';
	var compareUrl = 'compare/';
	var productFinder = '';
	var animationSpeed = 400;
	
	function init(baseurl, finder_id){
		
		//hide content after page load for SEO
		//$('#product_list').hide();
		
		productFinder = finder_id; 
		
		var ie6 = main.detectIE6();
		if (ie6) {
			$('#td').parent().parent().attr('width',380);
		};
		
		if (baseurl){
			compareUrl = baseurl + compareUrl;
			productsJsonUrl = baseurl + productsJsonUrl + finder_id;
		};
		
		getProducts();
		
		$('.compare_link_href').click( function () {
			var newurl = getProductsLinksUrl();
			$(this).attr('href',newurl);
		});


		$(".productfilter_option input").each( function () {
			if (currentSettings[this.name] == undefined) {
				currentSettings[this.name] = {};
			};
			currentSettings[this.name][this.id] = false;
			$(this).click( function () {
					var state = this.checked ? false : true;
					currentSettings[this.name][this.id] = this.checked;
					checkAllProducts(this.name);
					refreshView(true);
					saveSettings(productFinder);
			});
			$(this).siblings('p').click( function () {
				var $checkbox = $(this).siblings('input:checkbox');
				var name = $checkbox.attr('name');
				var id = $checkbox.attr('id');
				var state = !$checkbox.is(':checked');
				
				if (!$checkbox.is(':disabled'))
				{
					$checkbox.attr('checked', state);
					currentSettings[name][id] = state;
					checkAllProducts(name);
					refreshView(true);
					saveSettings(productFinder);
				}
			});
		});
		getSettings(productFinder);
		getSettingsFromUrl();
	};
	
	function addGroupType(key,value){
		settingsType[key] = value;
	};
	
	function getSettingsFromUrl(){
		var url = window.location.href;
		var pa = url.split('#');
		
		if (pa[1] != undefined){
			var options = pa[1].split(',');
			if (options.length > 1){
				for (var i = 0; i < options.length; i++){
					var s = se[i].split(':');
					var group = s[0];
					var name = s[1];
					
					if (name != undefined && group != null) {
						currentSettings[group][name] = true;
						$('#' + name).attr('checked', 'checked');
					};
				};
			} else {

				var s = pa[1].split(':');
				var group = s[0];
				var name = s[1];
				
				if (name != undefined && group != null) {
					currentSettings[group][name] = true;
					$('#' + name).attr('checked', 'checked');
				};
			};
		};
	};
	
	function getProducts(){
		$.getJSON(productsJsonUrl, function(data){
				products = data;
				$('#preloader').fadeIn(animationSpeed);
				for (var i in products){	
					if (products[i].price == 'null'){
						products[i].price = 0;
					}
					productsPrice.push({id : i, price : products[i].price});
				};
				checkAllProducts();
				refreshView(true);
			}	
        );
	};
	
	function refreshView(bool){
		try {
			$('#preloader').fadeIn(animationSpeed, function () {
				
				$('#product_list').fadeOut(animationSpeed, function () {
					setTimeout( function () {
						buildHTML();
					}, 600);
				});
				$({counter : 0}).animate({counter : visibleList.size}, {
					duration : 600,
					step : function () {
				   		$('#preloader #counter span').text( Math.round(this.counter) );
					}
				});
			});
			if (bool) refreshSettingsView();
		}
		catch(e){
			console.log(e);
		}
	};
	
	function buildHTML(){
		var html = "";
		var j = 0;
		var count = productsPrice.length;
		for (var i = 0; i < count; i++){
			var extra_class = '';
			var filter = '';
			
			if(hiddenList.items[productsPrice[i].id] != undefined){
				filter = 'style="display:none;"';
			}
			else {
				extra_class = " productfinder_result_" + j % 4;
				j++;
			};
				
			var jObj = $('#'+productsPrice[i].id);
			html += '<div id="'+productsPrice[i].id+'" class="productfinder_result white left'+extra_class+'" '+filter+' >'+jObj.html()+'</div>';
		};
		
		html += '<div class="clearline"></div>';
		$('#product_list').html(html);
		$('#result_count').html(visibleList.size);
		
		$('#product_list').fadeIn(450, function () {
			$('#preloader').fadeOut(450, function () {
				$(this).find('p').text('0');
			});
		});
	};
	
	function sortPriceAsc(a,b) {
		return b.price1 - a.price1;
	};
	
	function sortPriceDesc(a,b) {
		return a.price1 - b.price1;
	};
	
	function sortPrice(dir, obj){
		
		var $this = $(obj);
		$('div').removeClass('buttonsort_link_act');
		$this.parent().addClass('buttonsort_link_act');
		
		dir ? productsPrice.sort(sortPriceAsc) : productsPrice.sort(sortPriceDesc);
		
		refreshView(false);
		
	};
	
	function compareAND(group,product){
        var ret = true;
        var none = true;
        
        for (var compPoint in group){
            if (group[compPoint]) none = false;
        
            if(group[compPoint] && product[compPoint]=="0"){
            	ret = false;
            	//return false;
            }
        }
        return (ret || none);    
    };
	
	function isEmpty(group){
		 var ret = true;
		 for (var compPoint in group){
			 if (group[compPoint]) ret = false;
		 }
		 return ret;
	};
    
    function compareOR(group,product){
        var ret = true;
        
        for (var compPoint in group){

            if (group[compPoint]) ret = false;
        
            if(group[compPoint] && product[compPoint]=="1"){

            	return true;
            }
        }
        
        
        return ret;
    };

    function checkAllProducts(groupname){
        listArray = arrangeList(currentSettings);
		
		visibleList = listArray.visible;
        hiddenList = listArray.hidden;
        
        //might happen with the OR groups (very rare)
        if (visibleList.size == 0){
        	for ( var i in currentSettings[groupname]){
        		var elem = document.getElementById(i);
        		$(elem).removeAttr('checked');
        		currentSettings[groupname][i] = false;
        		checkAllProducts();
        	}
        };
    };
	
	function refreshSettingsView(){
		var newSettings = clone(currentSettings);
		
		for(var group in currentSettings){
			var groupObj = currentSettings[group];
		
			for (var option in groupObj){
				if (!groupObj[option]){
					var elem = document.getElementById(option);
					
					$(elem).removeAttr('disabled').siblings('p').removeClass('disabled');
					
					//newSettings = currentSettings;
					newSettings[group][option] = true;
					
					newList = arrangeList(newSettings);
					
					newSettings[group][option] = false;
					
					if (newList.visible.size == 0){
						$(elem).attr('disabled','disabled').siblings('p').addClass('disabled');
					}
					
					else if (settingsType[group] == OR && newList.visible.size == visibleList.size && !isEmpty(groupObj)){
						$(elem).attr('disabled','disabled').siblings('p').addClass('disabled');
					};
				};
			};
		};
	};
	
	
	function arrangeList(settings){
		var ret = { visible : { items : {}, size : 0 }, hidden : { items : {}, size : 0 } };
		
		for(var i in products){
			
            var isValid = true;
			
			for(j in settings){
				if (settingsType[j] == OR) {
					
					if (!compareOR(settings[j],products[i])) {
                    	isValid = false;
                    	
						break;
					};
				}
				else {
					if (!compareAND(settings[j],products[i])) {
                    	isValid = false;
						break;
					};
				};
			};
			
			if (isValid){
				ret.visible.items[i] = products[i];
				ret.visible.size++;	
			}
			else {
				ret.hidden.items[i] = products[i];
				ret.hidden.size++;
			};
			
		};
		return ret;
	};
	
	function saveSettings(name){
		var isMultiple = false;
		var ret = '';
		for(group in currentSettings){
			isMultiple = true;
			for (i in currentSettings[group]){
				if (currentSettings[group][i]){
					ret += group + ':' + i +',';
				};
			};
		};
		
		if (isMultiple) {
			ret = ret.slice(0, -1);
		};
		cookieObject.add(name,ret);
	};
	
	function getSettings(name){
		var settings = cookieObject.get(name);
		
		if (settings == null) return 0;
		
		var se = settings.split(',');
		
		for (var i=0; i<se.length; i++){
			var s = se[i].split(':');
			var group = s[0];
			var name = s[1];
			
			if (name != undefined && group != undefined) {
				currentSettings[group][name] = true;
				$('#' + name).attr('checked', 'checked');
			};
		};
	};
	
	function clone (obj) {
	  var objectClone = {};
	  
	  for (var property in obj) 
	  	if (typeof obj[property] == 'object') {
	  		objectClone[property] = clone(obj[property]);
	  	}
	  	else {
	  		objectClone[property] = obj[property];
	  	};
	  return objectClone;
	};
	
	function getProductsLinksUrl(){
		var ret = compareUrl;
		var isFirst = true;
		var isMultiple = false;
		var isEmpty = false;
		
		$('.compare_check').each( function () {
			if (this.checked) {
				isEmpty = true;
				var pr = this.id.split('-');
				var pr_id = pr[1];
				
				if (isFirst) {
					ret += pr_id + '/#products=';
					isFirst = false;
				}
				else {
					ret += pr_id + ',';
					isMultiple = true;
				};
			};
		});
		
		if (isMultiple) {
			ret = ret.slice(0, -1);
		};
		if (!isEmpty) {
			ret += 'empty';
		}
		return ret;
	};
	
	function setSelectedProduct(e) {
		var inputs = jQuery("INPUT[type='checkbox']:checked"); 

		var filteredInputs = new Array();
		for(var i=0;i<inputs.length;i++) {
			if(inputs[i].id.indexOf('product-') == 0) {
				filteredInputs.push(inputs[i]);
			}
		}
		if(filteredInputs.length > 3) {
			showBalloon(e, 'threeSelectedMessage');
			return false;
		}
		jQuery('.checkboxButton').hide();
		var products = '';
		for(var i=0;i<filteredInputs.length;i++) {
			jQuery('#'+filteredInputs[i].id+'-button').show();
			products += filteredInputs[i].id.substring(8, filteredInputs[i].id.length) +',';			
		}
		products = products.substring(0, products.length-1);
		jQuery('#selectedProducts').val(products);
		return true;
	};
	
	function goToProductCompare(productCompareUrl) {
		var selectedProducts = jQuery('#selectedProducts').val();
		var arr = selectedProducts.split(',');
		var queryStringPart = ''; 
		for(var i=0;i<arr.length;i++) {
			queryStringPart += '&product'+(i+1)+'='+arr[i];
		}
		location.href = productCompareUrl+queryStringPart;
	};	
	
	function showBalloon(e, id) {
		jQuery('#'+id).show();
		jQuery('#'+id).css('left', (mouseX(e)+10)+'px');
		jQuery('#'+id).css('top', (mouseY(e)+10)+'px');
	}

	function mouseX(evt) {
		if (evt.pageX) return evt.pageX;
		else if (evt.clientX)
		   return evt.clientX + (document.documentElement.scrollLeft ?
		   document.documentElement.scrollLeft :
		   document.body.scrollLeft);
		else return null;
	};
	
	function mouseY(evt) {
	if (evt.pageY) return evt.pageY;
	else if (evt.clientY)
	   return evt.clientY + (document.documentElement.scrollTop ?
	   document.documentElement.scrollTop :
	   document.body.scrollTop);
		else return null;
	};	
	
	function emulateCheck(elem,event){
		
		//;)
		
		var $checkbox = $(elem).siblings('input');
		var state = $checkbox.is(':checked') ? false : true;
		
		//toggle state of checkbox
		$checkbox.attr('checked', state);
		
		//disables text selection on click event
		if ($.browser.mozilla) {
			$(this).css('MozUserSelect','none');
			
		} else if ($.browser.msie) {
			$(this).bind('selectstart', function () { return false; });
			
		} else {
			$(this).mousedown( function () { return false; });
		}
		
		if (!productfinder.setSelectedProduct(event)){
			$checkbox.attr('checked', false);
		}
		
	};
	
	
	
	
	return {
		init : init,
		products : products,
		currentSettings : currentSettings,
		refreshView : refreshView,
		sortPrice : sortPrice,
		addGroupType : addGroupType,
		setSelectedProduct : setSelectedProduct,
		goToProductCompare : goToProductCompare,
		emulateCheck:emulateCheck
	};
}();


