(function($){
	var dynamicArticleList = function(config) {
		var instance = this;
		
		this.handler = '';
		this.currentRequest = {};
		this.additionalData = {};
		this.editMode = false;
		
		this.config = {
			"ajax" : {
				"type" : 'post'
			},
			"callback" : {
				"onbeforerequest" : null,
				"onresponsesuccess" : null,
				"onresponseprocessed" : null
			}
		};
		
		this.containers = {};
		this.triggers = {};
		
		var init = function(config) {
			var config = config || {};
			$.extend(instance.config, config);
		};
		
		this.getTriggerAction = function(trigger) {
			var action = {};
			var trigger = $(trigger);
			var relation = trigger.attr('rel');
			
			if (relation != '') {
				relation = relation.split(':');
				action["action"] = relation[0];
				action["param"] = relation[1];
				action["value"] = relation[2];
			}
			return action;
		};
		
		this.setCurrentRequest = function(request) {
			instance.currentRequest = request;
		};
		this.getCurrentRequest = function() {
			return instance.currentRequest;
		};
		
		this.getContainerRequestData = function() {
			var data = {};
			var i = 0;
			$.each(instance.containers, function(selector, options) {
				data["containers["+i+"][selector]"] = selector;
				$.each(options, function(key, prop){
					data["containers["+i+"]["+key+"]"] = prop;
				});
				++i;
			});
			return data;
		};
		
		this.setAdditionalData = function(data) {
			$.each(data, function(paramKey, params){
				$.each(params, function(key, value){
					instance.additionalData[ paramKey+'['+key+']' ] = value;
				});
			});
		};
		
		this.getAdditionalData = function() {
			return instance.additionalData || {};
		};
		
		this.enableEditMode = function() {
			instance.editMode = true;
		};
		
		this.setHandler = function(path) {
			instance.handler = myty.basePath + '/..' + path;
		};
		
		this.addContainer = function(selector, options) {
			instance.containers[ selector ] = options;
		};
		
		this.removeContainer = function(selector) {
			delete instance.containers[ selector ];
		};
		
		this.addTrigger = function(selector, options) {
			var options = options || {};
			var elements = $(selector);
			if (elements.length) {
				instance.triggers[ selector ] = options;
				instance.bindTriggers();
			}
		};
		
		this.bindTriggers = function() {
			var eventType;
			$.each(instance.triggers, function(selector, options) {
				eventType = options.eventType || 'click';
				$(selector).unbind(eventType);
				$(selector).bind(eventType, function(event) {
					instance.load.call(this, event);
					return false;
				});
			});
				
		};
		
		this.getRequestURL = function() {
			var currentRequest = instance.getCurrentRequest();
			return instance.handler+'?'+$.param(currentRequest);
		};
		
		this.load = function(event) {
			var action = instance.getTriggerAction(this);
			var triggerData = { "action" : action.action };
			triggerData[ action.param ] = action.value;
			if (action.action == 'filter') {
				// special condition for sansibar
				if (action.param == 'country' && action.value != instance.currentRequest.country) {
					delete instance.currentRequest.region;
					delete instance.currentRequest.manufacturer;
				}
				/*if (action.param == 'region' && action.value != instance.currentRequest.region) {
					delete instance.currentRequest.manufacturer;
				}
				if (action.param == 'manufacturer' && action.value != instance.currentRequest.manufacturer) {
					delete instance.currentRequest.region;
				}*/
				if (instance.currentRequest[ action.param ] != action.value) {
					instance.currentRequest[ action.param ] = action.value;
				} else {
					instance.currentRequest[ action.param ] = '';
					triggerData[ action.param ] = '';
				}
			} else if (action.action == 'clear') {
				var newRequest = {};
				var currentRequest = instance.getCurrentRequest();
				newRequest['topic'] = currentRequest.topic;
				instance.setCurrentRequest(newRequest);
			}
			var data = $.extend(
				{},
				instance.getCurrentRequest(),
				triggerData,
				instance.getContainerRequestData(),
				instance.getAdditionalData(),
				{ "ajax" : '1' }
			);
			var ajaxOptions = $.extend(
				instance.config.ajax, {
					"data" : data
				}, {
					"success" : function(response) {
						if (instance.config.callback.onresponsesuccess) {
							instance.config.callback.onresponsesuccess.call(this, response);
						}
						instance.processResults.call(this, response);
					},
					"url" : instance.handler,
					"dataType" : 'json'
				}
			);
			if (instance.config.callback.onbeforerequest) {
				instance.config.callback.onbeforerequest.call(this, instance);
			}
			$.ajax(ajaxOptions);
		};
		
		this.processResults = function(response) {
			if (response.success === true) {
				if (response.containers && response.containers.length) {
					$(response.containers).each(function(idx) {
						var element = $(this.selector);
						var content = this.content || '';
						if (element.length) {
							element.html(content);
						}
					});
					
					instance.bindTriggers();
					if( instance.editMode ) {
						mozile.createEditors(".tyEditable","");
					}
				}
			}
			
			// execute callback
			if (instance.config.callback.onresponseprocessed) {
				instance.config.callback.onresponseprocessed.call(this, response);
			}
		};
		
		// initialize instance
		init(config);
	}
	
	$.extend({"dynamicArticleList" : function(config) { return new dynamicArticleList(config); }});
})(jQuery);
