
Array.prototype.clone = function() {
	var c = new Array();
	for (var key in this)
		if (typeof this[key] == 'array')
			c[key] = this[key].clone();
		else
			c[key] = this[key];
	return c;
}

/* RESTRICTIONMANAGER */

function RestrictionManager(baseUrl) {
	this.baseUrl = baseUrl;
	this.buildBubble();
}

RestrictionManager.prototype = {
	
	restrictions: new Array,
	datumMultipleSelect: false,
	ajaxEnabled: false,
	
	setBaseUrl: function(url) {
		this.baseUrl = baseUrl;
	},
	
	addRestriction: function(category, value) {
		if (!this.hasRestriction(category, value)) this.restrictions.push(new Restriction(category, value));
		if (category == 'datum') {
		} else {
			$("#calendar-options #calendar-" + category + " a:contains('" + value + "')").addClass('active');
		}               
	},
	
	removeRestriction: function(category, value) {
		i = this.getRestrictionIndex(category, value)
		if (i !== false) {
			this.restrictions.splice(i, 1);
		}
	},
	
	hasRestriction: function(category, value) {
		return (this.getRestrictionIndex(category, value) !== false);
	},
	
	getRestrictionIndex: function(category, value) {
		for (var i=0; i<this.restrictions.length; i++) {
			if ((this.restrictions[i].category == category) && (this.restrictions[i].value == value)) return i;
		}
		return false;
	},

	hasRestrictions: function() {
		return this.restrictions.length > 0;
	},
	
	getRestrictions: function(category) {
		if (!category) return this.restrictions.clone();
		else return this.filterRestrictions(this.restrictions, category);
	},
	
	filterRestrictions: function(restrictions, category) {
		var res = new Array();
		for (var i=0; i < restrictions.length; i++) {
			if (restrictions[i].category == category) {
				res.push(restrictions[i]);
			}
		}
		return res;
	},

	getURL: function() {
		var restrictions = this.getRestrictions();
		return this.createRestrictionUrl(restrictions);
	},
	
	createDatumUrl: function(datum) {
		var restrictions = this.getRestrictions();
		var newRestrictions = new Array;
		var wasSelected = false;
		var selectedDates = 0;
		if (restrictions) {
			for (var i = 0; i < restrictions.length; i++) {
				if (restrictions[i].category != 'datum') {
					newRestrictions.push(restrictions[i]);
				} else {
					if (restrictions[i].value != datum) {
						if (this.datumMultipleSelect) newRestrictions.push(restrictions[i]);
						selectedDates++;
					} else {
						wasSelected = true;
					}
				}
			}
		}
		if (!wasSelected || selectedDates > 1) newRestrictions.push(new Restriction("datum", datum));
		return this.createRestrictionUrl(newRestrictions);
	},
	
	createRestrictionUrl: function(restrictions) {
		var url = this.baseUrl;
		var categories = ["datum", "rubrik", "ort"];
		for (var n in categories) {
			var currentRestrictions = this.filterRestrictions(restrictions, categories[n]);
			if (currentRestrictions.length) {
				url += categories[n] + ':';
				for (var i=0; i<currentRestrictions.length; i++) url += encodeURI(currentRestrictions[i].value) + ';';
				url = url.substring(0,url.length-1) + '/';
			}
		}
		return url;
	},
	
	buildBubble: function() {
		if (!this.ajaxEnabled) return;
		var restrictionManager = this;
		$('#calendar-feature').append('<div id="calendar-bubble" style="display: none;"><img src="' + WFD_STATIC_COMMON + 'img/calendar-bubble-close.png" id="calendar-bubble-close" alt="Close" title="Kalender schließen" /><h4>Gefundene Veranstaltungen:</h4><div id="calendar-content-container"></div></div>');
		$('#calendar-bubble-close').click(function() {
			restrictionManager.hideBubble();
			$('#calendar-bubble-container').html('');
		});
	},
	
	showBubble: function() {
		$('#calendar-bubble').fadeIn();
	},

	hideBubble: function() {
		$('#calendar-bubble').fadeOut();
	},
	
	query: function() {
		$('#calendar-content-container').addClass('pending');
		$.ajax({
			dataType: 'html',
			url: this.getURL(),
			success: function(data) {
				$('#calendar-content-container').removeClass('pending').html(data);
			}
		});
	},
	
	attachToCalenderWidget: function(widget) {
		if (!this.ajaxEnabled) return;
		var restrictionManager = this;
		widget.selectEvent.subscribe(function(x,d) {
			for(var i=0; i<d[0].length; i++) {
				restrictionManager.addRestriction('datum', d[0][i][0] + '-' + (d[0][i][1] < 10? '0' : '') + d[0][i][1] + '-' + (d[0][i][2].length == 1 ? '0' : '') + d[0][i][2]);
			}
			restrictionManager.query();
		});
		widget.deselectEvent.subscribe(function(x,d) {
			for(var i=0; i<d.length; i++) {
				restrictionManager.removeRestriction('datum', d[i][0] + '-' + (d[i][1] < 10 ? '0' : '') + d[i][1] + '-' + (d[i][2].length == 1 ? '0' : '') + d[i][2]);
			}
			restrictionManager.query();
		});
	},
	
	attachToSelectionList: function(ul) {
		if (!this.ajaxEnabled) return;
		var restrictionManager = this;
		ul.click(function() {
			$(this).parent('li').toggleClass('active');
			
			var category = $(this).parent().parent().attr('id').substring(9);
			
			var value = $(this).text();
			
			if($(this).is('.active')) {
				restrictionManager.addRestriction(category,value);
			} else {
				restrictionManager.removeRestriction(category,value);
				$(this).get(0).blur();
			}
		
			restrictionManager.query();
			if (restrictionManager.hasRestrictions()) {
				restrictionManager.showBubble();
				restrictionManager.query();
			} else {
				restrictionManager.hideBubble();
			}
			
			return false;
		});
	},
	
	attachToPager: function(pager) {
		if (!this.ajaxEnabled) return;
		/* TODO, war vormals nur ein "die nächsten 20" Link
		function initPrevNextNav() {
			$('.prev-next-nav a').click(function() {
				$('#calendar-content-container').addClass('pending');
				$.ajax({
					dataType: 'html',
					url: $(this).attr('href'),
					success: function(data) {
						$('#calendar-content-container').removeClass('pending').html(data);
						initPrevNextNav();
					}
				});
				return false;
			});
		} */
	}
	
}

/* CALENDARRESTRICTION */

function Restriction(category, value) {
	this.category = category;
	this.value = value;
}
