var fmngr = {
	aConst : new Object(),
	aOmitable : new Object(),
	aGroup : new Object(),
	omit : false,
	submitUrl : "/",
	setValue : function(key, value, omitable, group) {
		if (value == "") {
			this.unset(key);
			return false;
		}
		if (typeof group === 'string') {
			if (typeof this.aGroup[group] === 'string') {
				// there is already an parameter stored for this group -> unset
				this.unset(fmngr.aGroup[group]);
			}
			// store the new key
			fmngr.aGroup[group] = key;
		}

		if (typeof omitable === 'undefined')
			omitable = true;

		if (typeof omitable === 'boolean') {
			if ( omitable == true ) {
				this.aOmitable[key] = true;
			} else {
				delete this.aOmitable[key];
			}
		}
		this.aConst[key] = value;
	},
	unset : function(key) {
		if (typeof this.aOmitable[key] !== 'undefined')
			delete this.aOmitable[key];

		delete this.aConst[key];
	},
	putValue : function(key, value, omitable, group) {
		var storage = null;
		if ( typeof this.aConst[key] !== 'object' ) {
			storage = new Object();
		} else {
			storage = this.aConst[key];
		}
		storage[value] = true;
		this.setValue(key,storage,omitable,group);
	},
	dropValue : function(key, value) {
		delete this.aConst[key][value];
	},
	clear : function() {
		for (key in this.aConst) {
			this.unset(key);
		}
	},
	setSubmitUrl : function(submitUrl, omit) {
		if (typeof omit === 'boolean' && omit == true)
			this.omit = omit;
		else
			this.omit = false;
		this.submitUrl = submitUrl;
	},
	exportJson : function() {
		var retVal = {};
		for (key in this.aConst) {
			valueBuff = this.aConst[key];
			if ( typeof this.aConst[key] === 'object' ) {
				valueBuff = '';
				for ( keyValue in this.aConst[key] ) {
					valueBuff += keyValue + ',';
				}
				valueBuff = valueBuff.substr(0,valueBuff.length-1)
			}
			retVal[key] = valueBuff;
		}		
		return retVal;
	},
	submit : function(submitUrl, omit) {
		if (!submitUrl)
			submitUrl = this.submitUrl;
		if (this.omit || (typeof omit === 'boolean' && omit == true)) {
			for (key in this.aOmitable) {
				this.unset(key);
			}
		}
		var formtagId = 'submitform-' + new Date().getTime();
		var submitForm = $('<form id="' + formtagId + '" method="GET" action="'
				+ submitUrl + '"></form>');
		var valueBuff = '';
		for (key in this.aConst) {
			valueBuff = this.aConst[key];
			if ( typeof this.aConst[key] === 'object' ) {
				valueBuff = '';
				for ( keyValue in this.aConst[key] ) {
					valueBuff += keyValue + ',';
				}
				valueBuff = valueBuff.substr(0,valueBuff.length-1)
			}
			$('<input name="' + key + '" type="hidden" value="'	+ valueBuff + '"></input>').appendTo(submitForm);
		}
		submitForm.appendTo($(document.body));
		submitForm.submit();
	}
};

var Observable = {
	observerCallbacks : [],
	hasObserver : function() {
		return ( this.observerCallbacks.length > 0 );
	},
	addObserver : function(observerCb) {
		if (typeof observerCb === 'function')
			this.observerCallbacks.push(observerCb);
	},
	removeObserver : function(observerCb) {
		this.observerCallbacks = this.observerCallbacks.filter(function(el) {
			if (el !== observerCb) {
				return el;
			}
		});
	},
	notify : function(o, thisObj) {
		var scope = thisObj || window;
		$(this.observerCallbacks).each( function(ind,val) {
			val.call(scope,o);
		});
	}
};

var merkliste = $.extend( true,{},Observable );
merkliste.aEntities = new Object();
merkliste.request = function(id) {
	if ( typeof id != 'undefined' ) {
		$.getJSON( 
			"/merkliste.json",
			{
				adId : id
			},
			this.cbAction
		);
	}
};
merkliste.cbAction = function (data) {
	if ( typeof data.size !== 'undefined' ) {
	
		if ( typeof data.items !== 'undefined' && typeof data.items.length == 'number' ) {
				data.items.forEach( function(item){
					if ( item.id !== 'undefined' ) {
						if ( item.state == 'a' ) { merkliste.aEntities[item.id] = true; merkliste.notify({'id':item.id,'event':'add','items':data.size}); }
						else if ( item.state == 'r' ) { delete merkliste.aEntities[item.id]; merkliste.notify({'id':item.id,'event':'remove','items':data.size}); }	
					}
				});
		} else if ( data.state !== 'undefined' ) {
			merkliste.aEntities = new Object();
			merkliste.notify( {'event':'clear','items':data.size} );
		}
	}
	
	return;
};
merkliste.clear = function() { this.request('clear'); };
merkliste.add = function(id) { if ( typeof this.aEntities[id] == 'undefined' ) this.request(id); };
merkliste.remove = function(id) { this.request(id); };
