var __json = null;

if ( typeof JSON !== "undefined" ) {

     __json = JSON;

}

var browser = jQuery.browser;

var JSON = {

    parse: function( text ) {
		if ( __json !== null ) {

			return __json.parse( text );

		}

		if ( browser.gecko ) {

			return new Function( "return " + text )();

		}

		return eval( "(" + text + ")" )

	}

};     

var loadingOperations = 0;

/* Price range cache */
var priceRangeCacheArray = new Array();

/* Area range cache */
var areaRangeCacheArray = new Array();

/* Checkbox items blocks cache */
var filterBlocksCacheArray = new Array();

/* Search components cache */
var serachComponentsCacheArray = new Array();

/* Districts cache Array */
var districtsCacheArray = new Array();

/* Offes search form submit */
$(function() {	
	$('#offersSearchForm').submit(function() {
		/* Disable sending locality text */
		if (($('input[name=locality]').val() == '') || ($('input[name=locality]').val() == 'Zadejte město, okres, nebo kraj')) {
			$('input[name=locality]').attr('disabled','disabled');
		}
	});		
});

$(function() {
	var selectedTab = 0;
	
	 switch ($('#showType').val()) {
		case 'gallery':
			selectedTab = 1;
			break;
		
		case 'map':
			selectedTab = 2;
			break;
		
		default:
			
			break;
	}
	var disabledArr = Array();
	
	$("#searchResults #tabs li").each(function(i){
		if ($(this).hasClass("disabled")){
			disabledArr[i] = i;
		}
		i = i+1;
	});
	
	if ($('#selectedTabIndex').length > 0) {
		if ($('#selectedTabIndex').html() >= 0) {
			var tempIndex = $('#selectedTabIndex').html();
			if (!isNaN(tempIndex) && tempIndex >= 0) {
				selectedTab = tempIndex;
			}
		}
	}
	
	var $tabs = $("#searchResults #tabs").tabs({
		fx: {opacity: 'toggle'},
		selected: selectedTab,
		disabled: disabledArr
	});
		
	/* Price range */
	$('input.estateTypeHome, input.categoryHome').click(function() {
		
		$('.loading').addClass('start');
		
		var estateTypeId = parseInt($('input.estateTypeHome:checked').val());
		estateTypeId = (isNaN(estateTypeId)) ? 0 : estateTypeId;		
		
		var categoryId = parseInt($('input.categoryHome:checked').val());
		categoryId = (isNaN(categoryId)) ? 0 : categoryId; 

		updateLoading(true);
		
		offerSearch.updatePriceRange(estateTypeId, categoryId);
		
	});	
	
	/* Area range, search components */
	$('input[name=estateType]').click(function() {
		
		var updateLoadingAndArea = true;
		
		var estateTypeId = parseInt($('input[name=estateType]:checked').val());
		estateTypeId = (isNaN(estateTypeId)) ? 0 : estateTypeId;		

		updateLoading(true);
		offerSearch.updateAreaRange(estateTypeId);
		
		addSearchComponents('default');
	});	
		
	initFilter();
	
});

function addSearchComponents(filterType) {
	
	var estateTypeId = parseInt($('input[name=estateType]:checked').val());
	estateTypeId = (isNaN(estateTypeId)) ? 0 : estateTypeId;		
			
	$('#components').html('');
	$('#components').hide();
	
	$('.componentBlocks').remove();
	
	if (filterType != 'box') {
		updateLoading(true);
	}
	
	offerSearch.addSearchComponents(estateTypeId, filterType);
}

function initFilter() {
	
	/* Add filter block */
	$('.addFilter, .addBoxFilter').unbind('click').click(function() {	
	
		var filterType = 'default';
		
		if ($(this).hasClass('addBoxFilter')) {
			filterType = 'box';
		}
		
		var type = $(this).attr('rel');
		
		var title = $(this).text();

		if (!($('#' + type).length > 0)) { 
			offerSearch.addFilter(type, title, filterType);
		} else {
			var elem = $('#' + type).clone(true);
			$('#' + type).remove();
			$('#filterBlocks').before(elem);
			if (filterType == 'box') {
				elem.show(300); 
			} else {
				elem.show();
			}
		}
		
		/* Hide filter label */
		$(this).hide();
		
		/* Hide main title */
		if (!($('#components .addFilter:visible').length > 0)) {
			$('#components label.main').hide();
		}
		
		return false;		
	});
	
	$(".minus").unbind('click').click(function(e){
		
		/* Reset selection */
		$(this).parent().parent().find(':input').each(function() {
			if ($(this).attr('type') == 'text') {
				$(this).val('');
			}			
			if ($(this).is(':checked')) {
				$(this).removeAttr('checked');
			}			
			if ($(this).is(':selected')) {
				$(this).removeAttr('selected');
			}
		});
		
		/* Hide filter block */ 	
		$(this).parent().parent().hide();		

		/* Show filter label */ 	
		var identifier = $(this).parent().parent().attr('id');
		$('a[rel=' + identifier + ']').show();
		
		/* Hide main title */
		if ($('#components').length > 0) {
			$('#components label.main').show();
		}
				
		return false;
	});
}

function updateLoading(increase) {
	
	if (increase) {
		loadingOperations++;
	} else {
		loadingOperations--;
	}
	
	if (loadingOperations > 0) {
		$('.loading').stop().css({opacity: 1}, 500).fadeIn(100);
	} else {
		$('.loading').stop().fadeOut(500);
	}	
}

function addDistrict(district) {
	
	offerSearch.addDistrict(district);
}

function removeDistrict(district) {

	offerSearch.removeDistrict(district);
}

var offerSearch = {

	/* Settings */	
	settings : {
		debug : false,
		priceRangeCache : true,
		areaRangeCache : true,
		checkboxItemsBlocksCache : true,
		serachComponentsCache : true,
		districtsCache : true
	},
	
	/* Update price range */
	updatePriceRange : function (estateTypeId, categoryId) {
		
		currentData = new Object();
		if (this.settings.priceRangeCache) {
			currentData = priceRangeCacheArray[estateTypeId + ' - ' + categoryId];
		}
		
		if (this.settings.debug && this.settings.priceRangeCache) {
			console.log('Price range cache data (' + estateTypeId + ' - ' + categoryId + ')');
			console.log(priceRangeCacheArray);
		}
		
		if (this.settings.priceRangeCache && currentData && typeof currentData == 'object') {
			this.updateRangeSelectData('price', currentData.items);
			updateLoading(false);
			return;
		}
		
		$.ajax({				
			type: 'GET',
		    url: '/ajax/offers/',
		    data: {ajaxAction : 'priceRange', estateType : estateTypeId, category : categoryId},
		    async: true,
		    dataType: 'xml',
		    success: function(response){
		    	try {
					var data = JSON.parse($('data', response).text());
					var result = $('result', response).text();
					
					if (result == 1) {
						offerSearch.updateRangeSelectData('price', data.items);
						priceRangeCacheArray[estateTypeId + ' - ' + categoryId] = data;
													
					} else {
						
					}
				} catch (e) {
					// ERROR					
				}
				updateLoading(false);
		    },
		    error: function(){
		    	try{
		    	
			    } catch (e){
	            
			    }
			    updateLoading(false);
			    return false;
		    }
		});			
				
		return;
	},
	
	/* Update area range filter */
	updateAreaRange : function(estateTypeId) {
		
		currentData = new Object();
		if (this.settings.areaRangeCache) {
			currentData = areaRangeCacheArray[estateTypeId + ']'];
		}
		
		if (this.settings.debug && this.settings.areaRangeCache) {
			console.log('Area range cache data (' + estateTypeId + ']' + ')');
			console.log(areaRangeCacheArray);
		}
		
		if (this.settings.areaRangeCache && currentData && typeof currentData == 'object') {
			this.updateRangeSelectData('area', currentData.items);	
			updateLoading(false);
			return;
		}
		
		$.ajax({
			type: 'GET',
		    url: '/ajax/offers/',
		    data: {ajaxAction : 'areaRange', estateType : estateTypeId},
		    async: true,
		    dataType: 'xml',
		    success: function(response){
		    	try {
					var data = JSON.parse($('data', response).text());
					var result = $('result', response).text();
					
					if (result == 1) {
						offerSearch.updateRangeSelectData('area', data.items);
						areaRangeCacheArray[estateTypeId + ']'] = data; 
					} else {
						
					}
				} catch (e) {
					// ERROR					
				}
				updateLoading(false);
		    },
		    error: function(){
		    	try{
		    	
			    } catch (e){
	            
			    }
			    updateLoading(false);
			    return false;
		    }
		});
				
		return;
	},
	
	/* Update range select data */
	updateRangeSelectData : function(target, items) {
		if (this.settings.debug) {
			console.log(target + ' items');
			console.log(items);
		}
		if (items && (items.length > 0)) {
			$('select[name=' + target + 'From], select[name=' + target + 'To]').html('');
			for (var i = 0; i < items.length; i++) {
				var option = $('<option></option>').val(items[i]).text(items[i]);
				
				if (i == 0) {
					option.attr('selected', 'selected');
				}				
				$('select[name=' + target + 'From]').append(option);					
			}
			
			for (var j = 0; j < items.length; j++) {
				var option = $('<option></option>').val(items[j]).text(items[j]);
				
				if (j == (items.length - 1)) {
					option.attr('selected', 'selected');
				}				
				$('select[name=' + target + 'To]').append(option);					
			}
			initSliders(target);
		}
	},
	
	addFilter : function(type, title, filterType) {
		
		if (this.settings.debug) {
			console.log(filterBlocksCacheArray);
		}
		
		if (this.settings.checkboxItemsBlocksCache) {
			var currentData = filterBlocksCacheArray[type];
			if (typeof currentData != 'undefined') {
				if (filterType == 'box') {
					/* Offer filter adding */
					var xData = $(currentData).hide();
					$('#filterBlocks').before(xData);
					$('#' + type).show(300);
					initOptionBlocks();
				} else {
					/* Default filter adding */
					$('#filterBlocks').before(data);
				}
				initFilter();
				updateLoading(false);				
				return;
			}
		}

		$.ajax({
			type: 'GET',
		    url: '/ajax/offers/',
		    data: { ajaxAction : 'addFilter', identifier : type, filterType : filterType, title : encodeURIComponent(title) },
		    async: true,
		    dataType: 'xml',
		    success: function(response){
		    	try {
					var data = $('data', response).text();
					var result = $('result', response).text();
					
					if (result == 1) {
						if (filterType == 'box') {
							/* Offer filter adding */
							var xData = $(data).hide();
							$('#filterBlocks').before(xData);
							$('#' + type).show(300);
							initOptionBlocks();
						} else {
							/* Default filter adding */
							$('#filterBlocks').before(data);
						}
						filterBlocksCacheArray[type] = data;
						initFilter();
					} else {
						
					}				
				} catch (e) {
					// ERROR					
				}
				updateLoading(false);
		    },
		    error: function(){
		    	try{
		    	
			    } catch (e){
	            
			    }
			    updateLoading(false);
			    return false;		    	
		    }
		});

		return;
	},
	
	addSearchComponents : function(estateTypeId, filterType) {
		
		if (this.settings.debug) {
			console.log('Search components');
			console.log(serachComponentsCacheArray);
		}
		
		if (this.settings.serachComponentsCache) {
			var currentData = serachComponentsCacheArray[estateTypeId];
			if (typeof currentData != 'undefined') {
				$('#components').html(currentData);
				$('#components').slideDown(300);
				updateLoading(false);
				initFilter();
				return;
			}
		}

		$.ajax({
			type: 'GET',
		    url: '/ajax/offers/',
		    data: {ajaxAction : 'addSearchComponents', estateType : estateTypeId, filterType : filterType},
		    async: true,
		    dataType: 'xml',
		    success: function(response){
		    	try {
					var data = $('data', response).text();
					var result = $('result', response).text();
					
					if (result == 1) {						
						$('#components').html(data);
						$('#components').slideDown(300);										
						serachComponentsCacheArray[estateTypeId] = data;
						initFilter();
					} else {
						
					}
				} catch (e) {
					// ERROR					
				}
				updateLoading(false);
		    },
		    error: function(){
		    	try{
		    	
			    } catch (e){
	            
			    }
			    updateLoading(false);
			    return false;
		    }
		});
		return;
	},
		
	addDistrict : function(district) {
		
		if (this.settings.debug) {
			console.log('Districts');
			console.log(districtsCacheArray);
		}
		var currentData = districtsCacheArray;

		if (!(this.settings.districtsCache && (currentData.length > 0))) {
			
			$.ajax({
				type: 'GET',
			    url: '/ajax/offers/',
			    data: {ajaxAction : 'addDistricts'},
			    async: true,
			    dataType: 'xml',
			    success: function(response){
			    	try {
						var data = JSON.parse($('data', response).text());
						var result = $('result', response).text();

						if (result == 1) {
							if (data.length > 0) {
								for ( var i = 0; i < data.length; i++) {
									districtsCacheArray[data[i]['district']] = data[i];
								}
							}
							
							if (districtsCacheArray.length > 0) {
								if (typeof district == 'object') {
									if (district.length > 0) {
										for ( var i = 0; i < district.length; i++) {
											offerSearch.addAutoSuggestBlock(districtsCacheArray[district[i]]);
										}
									}
								} else {
									offerSearch.addAutoSuggestBlock(districtsCacheArray[district]);
								}				
							}							
						} else {
							
						}
					} catch (e) {
						// ERROR
					}
			    },
			    error: function(){
			    	try{
			    	
				    } catch (e){

				    }
				    return false;
			    }
			});
		} else {
			if (districtsCacheArray.length > 0) {
				if (typeof district == 'object') {
					if (district.length > 0) {
						for ( var i = 0; i < district.length; i++) {
							this.addAutoSuggestBlock(districtsCacheArray[district[i]]);
						}
					}
				} else {
					this.addAutoSuggestBlock(districtsCacheArray[district]);
				}				
			}
		}
		
		return;		
	},
	
	addAutoSuggestBlock : function(data) {

		var typeIdentifier = 'city';
		
		type = parseInt(data['type']);
		
		switch (type) {
			case 1:
				typeIdentifier = 'region';
				break;
	
			case 2:
				typeIdentifier = 'district';
				break;
				
			default:
				break;
		}
		
		if ($('#' + typeIdentifier + data[typeIdentifier]).length > 0) {
			return;
		}
				
		var item = $('<li class="as-selection-item" id="as-selection-' + data['value'] + '">' + data['name'] + '</li>').click(function(){
			$('.as-selections').children().removeClass("selected");
			$(this).addClass("selected");
        });		
		
		var close = $('<a class="as-close">&times;</a>').click(function(){
				offerSearch.removeDistrict(data[typeIdentifier]);
				$('.as-values').val($('.as-values').val().replace(data['value'] + ",", ""));
				$('.as-input').focus();
				return false;
		});
		
		var inpt = $('<input type="hidden" />')
			.addClass(typeIdentifier)
			.attr('id', typeIdentifier + data[typeIdentifier])
			.attr('name', typeIdentifier + '[]')
			.val(data[typeIdentifier]);
		
		$('li.as-original').before(item.append(close).append(inpt));
		$('.as-values').val($('.as-values').val() + data['value'] + ',');
		
		autoSuggestInput.reset();
	},
	
	removeDistrict : function(district) {

		if (typeof district == 'object') {
			/* Prague districts */
			if (district.length > 0) {
				for (var i = 0; i < district.length; i++) {
					$('#district' + district[i]).parent().remove();
				}
			}
		} else {
			/* District */
			$('#district' + district).parent().remove();
		}
		
		autoSuggestInput.reset();
	}
}
