(function($){
	$.fn.extend({
		activities : function(parameters){						
					
			var defaults = {
				container : null,
				display: 'list',
				source : {
					//server: 'http://localhost:8080'
					//server: 'http://test.netblast.no' 
					server: 'http://intranet1.ekbo.de'					
				},
				dimensions : {},
				maxelements: null, //null means no limit.
				order: {
					key: 'date',
					direction: "asc"	
				},
				parameters : {
					module: 'activity',
					callback : 'activities',
					validation : new Date().getTime()+"STRONG",
					organizations : null,
					broadcast : false,
					archive : '14',	
					category : {
						type: '',
						categories: []
					},
					from : new Date().getTime(),
					to: new Date(new Date().getFullYear()+1,1,1).getTime(),
					date : {					
						from : {
							year : new Date().getFullYear(),
							month: new Date().getMonth(),
							day: new Date().getDate()
						},
						to : {
							year : new Date().getFullYear()+1,
							month: new Date().getMonth(),
							day: new Date().getDate()						
						}
					},
					pagination: {
						size: -1,
						page: 0
					},
					format:'jsonp'				
				}					
			};
				
			//Combine the incoming parameters with the defaults
			var options = $.extend(true,defaults,parameters);
			//Setting the container
			options.container = this;
			

			//Draw result
			return this.each(function(){
				var self = $(this);				
								
				//ADD META DATA; IF AVAILABLE
				var o = $.metadata ? $.extend(true,options,self.metadata()) : options;
				o.container = self;
				
				$.log(o);
				
				$.fn.activities.result(o);
			});
		}
	});	
	
	$.fn.activities.result = function(options) {
			
		var elements = jQuery("<div />").addClass("elements").appendTo(options.container);		
		if($.fn.busy) $(elements).busy();						
		var url = options.source.server + '/panorama/injection?' + $.parameterize(options.parameters) + '&jsoncallback=?';
		
		jQuery.getJSON(url,function(data){
				
			if(data && data.value){				
				switch(options.display){
					case 'list' : {
						list(elements,options,data);
						break;	
					}	
					case 'table' : {
						table(elements,options,data);
						break;	
					}
				}																				
			} else {
				$(elements).html("<p>Invalid data</p>");						
			}
			if($.fn.finished) $(elements).finished();
		});			
	}
	
	$.fn.activities.formatDate = function(milliseconds) {			
		try {
			var date = new Date(milliseconds);			
			return (date.getDate() < 10 ? "0"+date.getDate() : date.getDate()) +
				   "."+
				   ((date.getMonth()+1) < 10 ? "0"+(date.getMonth()+1) : (date.getMonth()+1))+
				   "."+
				   date.getFullYear();			
			
		} catch(ex){
			$.log("Error [formatDate("+milliseconds+")] "+ex);
			return;	
		}
	}
	
	$.fn.activities.formatTime = function(milliseconds) {			
		try {
			var date = new Date(milliseconds);			
			return (date.getHours() < 10 ? "0"+date.getHours() : date.getHours()) +":"+ (date.getMinutes() < 10 ? "0"+date.getMinutes() : date.getMinutes());	
			
		} catch(ex){
			$.log("Error [formatTime("+milliseconds+")] "+ex);
			return;	
		}
	}
	
			
	function details(options,element){		
		var win = window.open(options.source.server+"/panorama/activity/activity/details.zul?activity="+element.id+"&perspective=data","Details","toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no, width=500, height=600");
		win.focus();		
	}
	
	function list(container, options, data){
	
		$.log("result: "+options.parameters.organizations);		
		
		
		$(container).empty();
		
		if(data.value.details.size == 0){
			$(container).html("<p>No entries</p>");
			return;
		}
		
		jQuery.each(data.value.activities,function(index,element){	
													
			//IF MAX ELEMENTS IS NULL OR IF ITS NOT NULL; KEEP INDEX BELOW MAX INDEX		
			if(!options.maxelements || (options.maxelements && index < parseInt(options.maxelements))) {				
				var title = jQuery("<h3/>").html('<a href="javascript:void(0);">'+element.name+'</a>').click(function(){details(options,element)});														
				var date = formatDate(getDateAndTime(element),element);
				var city = element.city;
				
				var byline = "<span class=\"by-line\">"+date+(city!=""?", "+city:"")+"</span>";																					
				var description = "<p>"+element.shortdescription+"</p>";
				jQuery("<div/>").addClass("element").html(description).prepend(title).prepend(byline).appendTo(container);				
			} else {
				return;
			}
		});		
	}
	
	$.fn.activities.order = function(data,column,container,options){
		
		var key = $(column).attr("key");
		var direction = $(column).attr("direction");
		
		options.order.key = key;
	
		
		data.value.activities.sort(function(a,b){
	
			
			switch(key){
				case "name" : {
					var compA = a.name.toUpperCase();
					var compB = b.name.toUpperCase();					
					break;	
				}
				case "date" : {
					var compA = a.start;
					var compB = b.start;
					break;	
				}
				case "time" : {
					var compA = a.start;
					var compB = b.start;
					break;	
				}
			}
			
			switch(direction.toUpperCase()){
				case "ASC" : {		
					//SET THE INVERSE, TO MAKE IT CHANGEABLE
					options.order.direction = "desc";
					return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
					break;	
				} 
				
				case "DESC" : {					
					//SET THE INVERSE, TO MAKE IT CHANGEABLE
					options.order.direction = "asc";
					return 	(compA > compB) ? -1 : (compA < compB) ? 1 : 0;
					break;
				}				
			}			
		});

		
		switch(options.display){
			case 'list' : {				
				list(container,options,data);
				break;	
			}	
			case 'table' : {
				table(container,options,data);
				break;	
			}
		}
	}
	
	function table(container, options, data){

		$(container).empty();

		if(data.value.details.size == 0){
			$(container).html("<p>No entries</p>");
			return;
		}

		var table, thead, tfoot, tr, td, th, content;

		table = $("<table/>").attr({'cellspacing':'0','cellpadding':'0'}).addClass("netblast-activity-result");
		thead = $("<thead/>");
		tbody = $("<tbody/>");
		tfoot = $("<tfoot/>");				

		//HEAD
		table.append(thead);

		tr = $("<tr/>");

		th = $("<th/>").attr('key','date').text(data.value.labels.date);
		tr.append(th);
		
		th = $("<th/>").text(data.value.labels.time);
		tr.append(th);
		
		th = $("<th/>").attr('key','name').text(data.value.labels.activity);
		tr.append(th);
		
		th = $("<th/>").text(data.value.labels.location);
		tr.append(th);
		
		$("th[key]",tr).each(function(index,element){						
			
			if($(element).attr("key") == options.order.key){
				$(element).attr("direction",options.order.direction).addClass(options.order.direction);
			} else {
				$(element).attr("direction","asc");	
			}								
				
			$(element)
				.click(
					function(){
						$.fn.activities.order(data,$(this),container,options);
					})
				.css("cursor","pointer")
				.attr("title","Sort");
				
			$(element).addClass('sortable');
		});
		
		thead.append(tr);
		
		
		//FOOT
		table.append(tfoot);
		
		tr = $("<tr/>");
		
		td = $("<td/>").attr("colspan",4).text(data.value.labels.found+": "+data.value.activities.length);
		tr.append(td);
		
		tfoot.append(tr);
		
		//BODY
		table.append(tbody);
		
		$.each(data.value.activities,function(index,element){
			
			//$.log("["+index+"]");
			//$.log(element);
			
			tr = $("<tr/>").mouseenter(function(){$(this).addClass("hover");}).mouseleave(function(){$(this).removeClass("hover");}).click(function(){details(options,element)});
			
			if(element.start || element.end){
				var startdate = element.start != "" ? $.fn.activities.formatDate(element.start) : "";
				var enddate = element.end != "" ? ( startdate != "" ? '<br/>'+$.fn.activities.formatDate(element.end) : '' ) : '';				
			} else {
				var startdate = element.startdate != "" ? element.startdate : '';
				var enddate = element.enddate != "" ? ( startdate != "" ? '<br/><br/>'+element.enddate : '' ) : '';
			}
			
			td = $("<td/>").addClass("date").html(startdate+enddate);
			tr.append(td);
			
			if(element.start || element.end){
				var starttime = element.start != "" ? $.fn.activities.formatTime(element.start) : "";
				var endtime = element.end != "" ? ( starttime != "" ? '<br/>'+$.fn.activities.formatTime(element.end) : '' ) : '';				
			} else {
				var starttime = element.starttime != "" ? element.starttime : '';
				var endtime = element.endtime != "" ? ( starttime != "" ? '<br/><br/>'+element.endtime : '' ) : '';
			}
			
			
			td = $("<td/>").addClass("time").html(starttime+endtime);
			tr.append(td);
			
			var name = element.name != "" ? '<strong>'+element.name+'</strong>' : '';
			var description = element.shortdescription != "" ? ( name != '' ? '<br />'+element.shortdescription : element.shortdescription ) : '';
			
			td = $("<td/>").addClass("activity").html(name+description);
			tr.append(td);			
			
			var address1 = element.address1 != "" ? element.address1 : "";
			var address2 = element.address2 != "" ? (address1 != "" ? "<br/>"+element.address2 : "") : "";			
			var addresses = address1+address2;			
			var postalcodeandcity = element.postalcode != "" ? (element.city != "" ? element.postalcode +" " +element.city : element.postalcode) : "";						
			var location = element.location != "" ? "<strong>"+data.value.labels.location+": </strong>"+element.location : "";
			
			
			
			var address = addresses;
			address += (address != "" ? "<br />"+postalcodeandcity : "");
			address += (address != "" ? "<br />"+location : "");	
								
			td = $("<td/>").addClass("address").html(address);
			tr.append(td);
			
			$("td:odd",tr).addClass("odd");
			$("td:even",tr).addClass("even");
									
			
			tbody.append(tr);
		});
		
		$("tr:odd",tbody).addClass("odd");
		$("tr:even",tbody).addClass("even");
		
		container.append(table);
		
		/*var table = jQuery("<table/>").attr({'cellspacing':'0','cellpadding':'0'});
		var thead = jQuery("<thead/>");                
		var row = jQuery("<tr/>");
	
		var cell = jQuery("<td/>").addClass("ziffer").text("#");
		row.append(cell);
				
					cell = jQuery("<td/>").addClass("name").text("Name");
					row.append(cell);            
		
					table.append(thead.append(row));                
	
					jQuery.each(data.value,function(index,element){                    
																
						row = jQuery("<tr/>");
						if(index%2==0){
							row.addClass("odd");
						} else {
							row.addClass("even");
						}     
	
						cell = jQuery("<td/>").addClass("even ziffer").text(element.filename);
						row.append(cell);
	
						cell = jQuery("<td/>").addClass("odd").text(element.label);
						row.append(cell);                    
	
						row.click(function(){
							options.parameters.ziffer = jQuery(".ziffer",this).text().split(' ').join(''); 
							options.parameters.callback = 'gemeinde';														
							$.fn.pfa.ziffer(options);																					
						});
	
						table.append(row.append(cell));
	
						$.log(element);
					}); 
					
					var tfoot = jQuery("<tfoot/>");
					tfoot.append(jQuery("<tr/>").append($("<td/>").attr("colspan","2").text("Gefunden: "+data.value.length)));
					table.append(tfoot);
					result.append(table).finished();
				*/
		
	}		
	
	function getDateAndTime(activity){
		
		if(activity.start){
			
			return new Date(activity.start);
			
		} else {
				
			var months = new Array("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec");				
							
			var startDate = activity.startdate == "" ? false : activity.startdate.split(".");	
			var startTime = activity.starttime == "" ? false : activity.starttime.split(":");															
					
			var date = new Date();
			
			date.setDate(startDate[0]);
			date.setMonth($.inArray(startDate[1],months));
			date.setFullYear(startDate[2]);		
			
			if(startTime) {
				date.setHours(startTime[0],startTime[1],0,0);
			}			
			
			return date;	
		}
	}
	
	function formatDate(date, element){
		var labels = {
			de : {
				hour : 'Uhr',
				weekDays : ["So","Mo","Di","Mi","Do","Fr","Sa"]
			},
			en : {
				hour : 'Hour',
				weekDays : ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]
			}
		};
		
		var output = "";
		
		//WEEKDAY
		output += labels.de.weekDays[date.getDay()]+" ";	
		
		//DATE AND MONTH
		output += date.getDate()+"."+(date.getMonth()+1);
		
		if(element.starttime && element.starttime != ""){
			//TIME
			output += ", " + (date.getHours()+1)+(date.getMinutes() != 0 ? "."+date.getMinutes() : "") +" "+labels.de.hour;
		}
		return output;			
	}
})(jQuery);