//$Id: jquery.objectlist.js,v 1.1.2.20 2010/05/18 13:11:45 koh Exp $

/**
 * objectlist jquery plugin.
 */

// put the def into a $-enabled closure
(function($) {

	/**
	 * Add objectlist to jquery
	 */
	$.fn.objectlist = function(initOptions) {
		 
		var WAIT_ICON_HTML = "&nbsp;&nbsp;<img border='0' src='" + MUSSAM.url({'url' : '/images/loader.gif'}) +"' class='wait_icon_loader'/>";
		//
		// objectlist enabler/constructor
		//
		/**
		 * initialize objectlist
		 */
		var initObjectList = function($this) {
			var defaultOptions = {
//					pageSize:  MUSSAM.getMussamPageSize()		
			};
			
			//$data($this).pageNo = 1;
			$data($this).pageNo = MUSSAM.getJSPInfo('pageNo') || 1;
			
			$data($this).currentSortField = MUSSAM.DEFAULT_SORT_LIST;
			$data($this).sortDirection = 0; // 0 = ascending, 1 = decending
			$data($this).showMuseum = true;
			
			MUSSAM.writeLogDebug("list.initObjectList()");
			$this.data('options', $.extend(defaultOptions, initOptions));

			if (initOptions.mussamPageSizeElementId) {
				MUSSAM.writeLogDebug("initObjectList() - pageSizeSelect element "+ initOptions.mussamPageSizeElementId);
				var psElm = document.getElementById(initOptions.mussamPageSizeElementId);
				if (psElm) {
					$(psElm).bind('change', function(eventObj) { pageSizeSelectHandler($this, eventObj); return false; } );
				} else{
					MUSSAM.writeLogError("initObjectList() - no pageSize element with id: "+initOptions.mussamPageSizeElementId);
				}					
			} else {
				MUSSAM.writeLogWarn("initObjectList() - No pageSizeSelect element specified");
			}
			
			return showMe($this);				
		};

		 //
		 // get/set
		 //
		 
		 /**
		  * Return pageNo as a number
		  */
		 var getPageNo = function($this) {
				//return 1*$this.data('pageNo');
				return 1*$data($this).pageNo;
		 };
			
		 /**
		  * Return pageNo as a number
		  */
		 var setPageNo = function($this, newPageNo) {				
				$data($this).pageNo = 1 * newPageNo;
		 };
			
		 /**
		  * Return pageCount as a number
		  */
		 var getPageCount = function($this) {
				//return 1*$this.data('pageCount');
				return 1*$data($this).pageCount;
		 };
		 
		 /**
		  * Selects the version of showMe to use, based on the showMe parameter in the options.
		  */
		 var showMe = function($this) {
			 MUSSAM.writeLogDebug("list.showMe() start");
			 if($data($this).options && $data($this).options.showMe) {
				 var showMeFunction = $data($this).options && $data($this).options.showMe;
				 MUSSAM.writeLogDebug("list.showMe() - found showMe: " + showMeFunction);
				 
				 // Add your showMe function here
				 if("showMeGeneral" == showMeFunction) {
					 return showMeGeneral($this);
				 } else if("showMeAttached" == showMeFunction) {
					 return showMeAttached($this);
				 } else if("showMeAdvanced" == showMeFunction) {
					 return showMeAdvanced($this);
				 } else if("showMeEmne" == showMeFunction) {
				   return showMeEmne($this);
				 } else if("showMePeriode" == showMeFunction) {
           return showMePeriode($this);
         } else if("showMeGeografisk" == showMeFunction) {
           return showMeGeografisk($this);
         } else {
					 MUSSAM.writeLogError("list.showMe() - unknown showMe context: " + showMeFunction);
				 }
			 } else {
				 MUSSAM.writeLogError("list.showMe() - required parameter 'showMe' is NOT present in the options");
			 }
		 }
		 
		 //
		 // Formatting
		 //
		 
		 
 /**
  *  START OF - showMeGeneral 
  */
		 
		 /**
		  * Generate mixed searchform
		  */
		 var generateMixedSearch = function($this) {
			 	
			 var ihtml = '<div class="search">\n';
			 ihtml += '  <h2>' + MUSSAM.message('mussam.forside.soeg.' + $data($this).options.listType + '.overskrift') + '</h2>\n';
			 ihtml += '  <fieldset>\n';
			 ihtml += '    <legend></legend>\n';
			 ihtml += '    <form>';
			 ihtml += '      <input id="mixedText" name="mixed" class="field" type="text" value="' + $data($this).options.mixed + '" />\n';
//			 ihtml += '      <input style="width:45px;" onclick="reSearch(\'' + $data($this).options.queryString + '\', document.getElementById(\'mixed\').value)" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';												
			 ihtml += '      <input style="width:45px;" id="reSearchButton" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';
			 ihtml += '    </form>';												
			 ihtml += '  </fieldset>\n';
			 ihtml += '</div>\n';			 
			 
			 $('#searchBoxMixed').html(ihtml );
			 
			 // Add click event handler to redo a search with new mixed
			 $("#reSearchButton").click( function(eventObj) { reSearch($this, eventObj); return false; } );
			 
			 return $this;
		 };
		 
		 /**
		  * Changes the mixed text, and issues a new search
		  */
	     function reSearch($this, eventObj) {
	    	 $data($this).options.mixed = $('#mixedText').attr('value');
	    	 showMeGeneral($this);
	     }
		    
		 /**
		  * Issues a lucene search, which returns a JSON formatted result
		  */
		 var showMeGeneral = function($this) {
			MUSSAM.writeLogDebug("list.showMeGeneral()");
			generateMixedSearch($this);
			$this.html(MUSSAM.message('mussam.search.liste.wait'));
			$this.append($(WAIT_ICON_HTML));
			var $orgThis = $this;
			
			$.post(
				MUSSAM.url({'url' : '/search/ForsideSearch.action', 'event' : 'jsonMixedSearch'}),
				{ queryString: $data($this).options.queryString,
					mixed: $data($this).options.mixed,
	    	  searchText: $data($this).options.searchText,
	    	  'pageSize' : MUSSAM.getMussamPageSize()
	    	},
				function(jsonData) {
						MUSSAM.writeLogDebug("Event jsonMixedSearch returned"); // +jsonData
						$orgThis.data('listData', jsonData);
						$orgThis.data('pageCount', Math.ceil(jsonData.hitsReturned / MUSSAM.getMussamPageSize() ));
						//$data($orgThis).pageNo = 1;
						$data($orgThis).pageNo = MUSSAM.getJSPInfo('pageNo') || 1; 
						
						showPage($orgThis);
				},
				"json"
			);
			return $this;
		};
/**
 *  END OF - showMeGeneral 
 */
 
 /**
  * START OF - showMeEmne
  */
  
  /**
   * Issues a lucene search, which returns a JSON formatted result
   */
  var showMeEmne = function($this) {
   MUSSAM.writeLogDebug("list.showMeEmne() stedregistrantGruppeKode="+$data($this).options.stedregistrantGruppeKode+", searchText="+$data($this).options.searchText);
   //generateMixedSearch($this);
   $this.html(MUSSAM.message('mussam.search.liste.wait'));
   $this.append($(WAIT_ICON_HTML));
   var $orgThis = $this;
   
   $.post(
     MUSSAM.url({'url' : '/search/EmneSearch.action', 'event' : 'jsonMixedSearch'}),
     { stedregistrantGruppeKode: $data($this).options.stedregistrantGruppeKode,
    	 mixed: $data($this).options.mixed,
    	 searchText: $data($this).options.searchText,
   	  'pageSize' : MUSSAM.getMussamPageSize()    	
     },
     function(jsonData) {
         MUSSAM.writeLogDebug("Event jsonMixedSearch returned"); // +jsonData
         if(jsonData.totalHits > 1000 || $data($this).options.mixed > ''){
           EmneGenerateMixedSearch($this);
         }
         $orgThis.data('listData', jsonData);
         $orgThis.data('pageCount', Math.ceil(jsonData.hitsReturned / MUSSAM.getMussamPageSize() ));
         //$data($orgThis).pageNo = 1;
         $data($orgThis).pageNo = MUSSAM.getJSPInfo('pageNo') || 1;
         
         showPage($orgThis);
     },
     "json"
   );
   return $this;
 };
 
  /**
      * Generate mixed searchform
      */
     var EmneGenerateMixedSearch = function($this) {
        
       var ihtml = '<div class="search">\n';
       ihtml += '  <h2>' + MUSSAM.message('mussam.emne.soeg.overskrift') + '</h2>\n';
       ihtml += '  <fieldset>\n';
       ihtml += '    <legend></legend>\n';
       ihtml += '    <form>';
       ihtml += '      <input id="mixedText" name="mixed" class="field" type="text" value="' + $data($this).options.mixed + '" />\n';
//       ihtml += '      <input style="width:45px;" onclick="reSearch(\'' + $data($this).options.queryString + '\', document.getElementById(\'mixed\').value)" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';                        
       ihtml += '      <input style="width:45px;" id="reSearchButton" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';                       
       ihtml += '    </form>';
       ihtml += '  </fieldset>\n';
       ihtml += '</div>\n';      
       
       $('#searchBoxMixed').html(ihtml );
       
       // Add click event handler to redo a search with new mixed
       $("#reSearchButton").click( function(eventObj) { emneReSearch($this, eventObj); return false; } );
       
       return $this;
     };
     
     /**
      * Changes the mixed text, and issues a new search
      */
       function emneReSearch($this, eventObj) {
         $data($this).options.mixed = $('#mixedText').attr('value');
         showMeEmne($this);
       }
 
 /**
  * END OF - showMeEmne
  */
  
  
 /**
  * START OF - showMePeriode
  */
  
  /**
   * Issues a lucene search, which returns a JSON formatted result
   */
  var showMePeriode = function($this) {
   MUSSAM.writeLogDebug("list.showMePeriode()");
   //generateMixedSearch($this);
   $this.html(MUSSAM.message('mussam.search.liste.wait'));
   $this.append($(WAIT_ICON_HTML));
   var $orgThis = $this;
   
   $.post(
     MUSSAM.url({'url' : '/search/PeriodeSearch.action', 'event' : 'jsonMixedSearch'}),
     { 
    	 periodeStartAar: $data($this).options.periodeStartAar,
    	 periodeSlutAar: $data($this).options.periodeSlutAar,
    	 mixed: $data($this).options.mixed,
    	 searchText: $data($this).options.searchText,
   	  'pageSize' : MUSSAM.getMussamPageSize()
  	 },
     function(jsonData) {
         MUSSAM.writeLogDebug("Event jsonMixedSearch returned"); // +jsonData
         if(jsonData.totalHits > 1000 || $data($this).options.mixed > ''){
           periodeGenerateMixedSearch($this);
         }
         $orgThis.data('listData', jsonData);
         $orgThis.data('pageCount', Math.ceil(jsonData.hitsReturned / MUSSAM.getMussamPageSize() ));
         //$data($orgThis).pageNo = 1;
         $data($orgThis).pageNo = MUSSAM.getJSPInfo('pageNo') || 1;
         
         showPage($orgThis);
     },
     "json"
   );
   return $this;
 };
 
  /**
      * Generate mixed searchform
      */
     var periodeGenerateMixedSearch = function($this) {
        
       var ihtml = '<div class="search">\n';
       ihtml += '  <h2>' + MUSSAM.message('mussam.emne.soeg.overskrift') + '</h2>\n';
       ihtml += '  <fieldset>\n';
       ihtml += '    <legend></legend>\n';
       ihtml += '    <form>';
       ihtml += '      <input id="mixedText" name="mixed" class="field" type="text" value="' + $data($this).options.mixed + '" />\n';
//       ihtml += '      <input style="width:45px;" onclick="reSearch(\'' + $data($this).options.queryString + '\', document.getElementById(\'mixed\').value)" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';                        
       ihtml += '      <input style="width:45px;" id="reSearchButton" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';
       ihtml += '    </form>';                       
       ihtml += '  </fieldset>\n';
       ihtml += '</div>\n';      
       
       $('#searchBoxMixed').html(ihtml );
       
       // Add click event handler to redo a search with new mixed
       $("#reSearchButton").click( function(eventObj) { periodeReSearch($this, eventObj); return false; } );
       
       return $this;
     };
     
     /**
      * Changes the mixed text, and issues a new search
      */
       function periodeReSearch($this, eventObj) {
         $data($this).options.mixed = $('#mixedText').attr('value');
         showMePeriode($this);
       }
 
 /**
  * END OF - showMePeriode
  */  
  
  
   /**
  * START OF - showMeGeografisk
  */
  
  /**
   * Issues a lucene search, which returns a JSON formatted result
   */
  var showMeGeografisk = function($this) {
   MUSSAM.writeLogDebug("list.showMeGeografisk()");
   //generateMixedSearch($this);
   $this.html(MUSSAM.message('mussam.search.liste.wait'));
   $this.append($(WAIT_ICON_HTML));
   var $orgThis = $this;
   
   $.post(
     MUSSAM.url({'url' : '/search/GeografiskSearch.action', 'event' : 'jsonMixedSearch'}),
     { 
    	 kommunenummer: $data($this).options.kommunenummer,
    	 mixed: $data($this).options.mixed,
   	   searchText: $data($this).options.searchText,
   	   'pageSize' : MUSSAM.getMussamPageSize()
    	},
     
     function(jsonData) {
         MUSSAM.writeLogDebug("Event jsonMixedSearch returned"); // +jsonData
         if(jsonData.totalHits > 1000 || $data($this).options.mixed > ''){
           GeografiskGenerateMixedSearch($this);
         }
         $orgThis.data('listData', jsonData);
         $orgThis.data('pageCount', Math.ceil(jsonData.hitsReturned /  MUSSAM.getMussamPageSize() ));
         //$data($orgThis).pageNo = 1;
         $data($orgThis).pageNo = MUSSAM.getJSPInfo('pageNo') || 1;
         
         showPage($orgThis);
     },
     "json"
   );
   return $this;
 };
 
  /**
      * Generate mixed searchform
      */
     var GeografiskGenerateMixedSearch = function($this) {
        
       var ihtml = '<div class="search">\n';
       ihtml += '  <h2>' + MUSSAM.message('mussam.emne.soeg.overskrift') + '</h2>\n';
       ihtml += '  <fieldset>\n';
       ihtml += '    <legend></legend>\n';
       ihtml += '    <form>';
       ihtml += '      <input id="mixedText" name="mixed" class="field" type="text" value="' + $data($this).options.mixed + '" />\n';
//       ihtml += '      <input style="width:45px;" onclick="reSearch(\'' + $data($this).options.queryString + '\', document.getElementById(\'mixed\').value)" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';                        
       ihtml += '      <input style="width:45px;" id="reSearchButton" name="searchMixed" value="' + MUSSAM.message('mussam.knap.soeg') + '" class="button" type="submit" />\n';
       ihtml += '    </form>';                       
       ihtml += '  </fieldset>\n';
       ihtml += '</div>\n';      
       
       $('#searchBoxMixed').html(ihtml );
       
       // Add click event handler to redo a search with new mixed
       $("#reSearchButton").click( function(eventObj) { geografiskReSearch($this, eventObj); return false; } );
       
       return $this;
     };
     
     /**
      * Changes the mixed text, and issues a new search
      */
       function geografiskReSearch($this, eventObj) {
         $data($this).options.mixed = $('#mixedText').attr('value');
         showMeGeografisk($this);
       }
 
 /**
  * END OF - showMeGeografisk
  */  
		
		/**
		  *  START OF - showMeAdvanced 
		  */
		 /**
		  * Issues a lucene search, which returns a JSON formatted result
		  */
		 var showMeAdvanced = function($this) {
			MUSSAM.writeLogDebug("list.showMeAdvanced() - queryParams: "+$data($this).options.queryParams);
			$this.html(MUSSAM.message('mussam.search.liste.wait'));
			$this.append($(WAIT_ICON_HTML));
			var $orgThis = $this;
			$.post(
				MUSSAM.url({'url' : '/search/AdvancedSearch.action', 'event' : 'jsonAdvancedSearch'}),
				{
					queryParams: $data($this).options.queryParams,
	    	  'pageSize' : MUSSAM.getMussamPageSize()
	    	 },
				function(jsonData) {
						MUSSAM.writeLogDebug("Event jsonMixedSearch returned"); // +jsonData
						$orgThis.data('listData', jsonData);
						$orgThis.data('pageCount', Math.ceil(jsonData.hitsReturned /  MUSSAM.getMussamPageSize() ));
						//$data($orgThis).pageNo = 1;
						$data($orgThis).pageNo = MUSSAM.getJSPInfo('pageNo') || 1;
						
						showPage($orgThis);
				},
				"json"
			);
			return $this;
		};

		/**
		 *  END OF - showMeAdvanced 
		 */

		
		
		/**
		  *  START OF - showMeTilknyttede 
		  */
				 
				 /**
				  * Issues a database search, which returns a JSON formatted result
				  */
				 var showMeAttached = function($this) {
					MUSSAM.writeLogDebug("list.showMeAttached()");
					$this.html(MUSSAM.message('mussam.general.liste.wait'));
					$this.append($(WAIT_ICON_HTML));
					var $orgThis = $this;
					
					$.post(
						MUSSAM.url({'url' : '/Tilknyttede.action', 'event' : 'fetchAttached'}),
						{ 
							parentType: $data($this).options.parentType,
							parentId: $data($this).options.parentId,
							listType: $data($this).options.listType,
			    	  'pageSize' : MUSSAM.getMussamPageSize()
			    	 },
						function(jsonData) {
								MUSSAM.writeLogDebug("Event fetchTilknyttede returned " + jsonData); // +jsonData
								$orgThis.data('listData', jsonData);
								$orgThis.data('pageCount', Math.ceil(jsonData.hitsReturned / MUSSAM.getMussamPageSize() ));
								//$data($orgThis).pageNo = 1;
								$data($orgThis).pageNo = MUSSAM.getJSPInfo('pageNo') || 1;
								
								showPage($orgThis);
						},
						"json"
					);
					return $this;
				};
		/**
		 *  END OF - showMeTilknyttede 
		 */
				
		
		/**
		 * Displays the current page (pageNo).
		 * The current page number determines a subset of objects which are to be displayed. 
		 * The data for these objects is fetched as JSON data and then the returnPageHtml() method is called.  
		 */
		var showPage = function($this) {
			MUSSAM.writeLogDebug("list.showPage() - pageNo=" + getPageNo($this)+", pageCount="+getPageCount($this));
			var $orgThis = $this; // save the object for reuse in the getJSON callback
			
			// museumList column is optional, check if it was supplied by the object list.
			if(!$data($this).listData['museumList']) {
				$data($this).showMuseum = false;				
			}
			
			if($data($this).listData.hitsReturned > 0) {
				var csvObjectList = "";

				if($data($this).sortDirection == 0) {
					var startIdx = Math.max(0, (getPageNo($this)-1) * MUSSAM.getMussamPageSize());
					var endIdx = Math.min($data($this).listData.hitsReturned, startIdx + MUSSAM.getMussamPageSize());
					for(i=startIdx; i<endIdx; i++) {
						csvObjectList += $data($this).listData[$data($this).currentSortField][i] + ",";
					}
				} else {
					var startIdx = Math.min($data($this).listData.hitsReturned, (($data($this).listData.hitsReturned - (getPageNo($this)-1) * MUSSAM.getMussamPageSize()) - 1));
					var endIdx = Math.max(0, startIdx - MUSSAM.getMussamPageSize());
					for(i=startIdx; i>=endIdx; --i) {
 						csvObjectList += $data($this).listData[$data($this).currentSortField][i] + ",";
					}
				}
								
				
				MUSSAM.writeLogDebug("list.showPage() NOW POSTING pageNo=" + getPageNo($this));
				$.post(
						MUSSAM.url({'url' : '/search/ObjectLoader.action'}),
						{ objectList : csvObjectList,
							pageSize :  MUSSAM.getMussamPageSize(),
							pageNo: getPageNo($this)
						},
						function(jsonData) {
						  if(getPageCount($orgThis) > 1) {//Add paging-info above the list.
                $orgThis.html(returnPagingElm($orgThis));
                $orgThis.append(formatPageHtml($orgThis, jsonData, startIdx, endIdx));
              }else{//if paging is not needed, we just set the HTML.
                $orgThis.html(formatPageHtml($orgThis, jsonData, startIdx, endIdx));
              }
							addSortClickHandlersformatHeader($orgThis);
							if(getPageCount($orgThis) > 1) {
								$orgThis.append(returnPagingElm($orgThis));
							}
						},
						"json"
				);
			} else {
				formatInfoSection($this);
				$orgThis.html(MUSSAM.message('mussam.search.liste.empty'));				
			}
			return $this;
		};

		
		var addSortClickHandlersformatHeader = function($this) {
			$("#betegnelseList").click( function(eventObj) { sortClickHandler($this, eventObj); return false; } );
			$("#stedList").click( function(eventObj) { sortClickHandler($this, eventObj); return false; } );
			$("#periodeList").click( function(eventObj) { sortClickHandler($this, eventObj); return false; } );
			
			if($data($this).showMuseum) {
				$("#museumList").click( function(eventObj) { sortClickHandler($this, eventObj); return false; } );
			}
		}
		
		/**
		 * Fills out the header info elements with content (searchText and hitCount).
		 */
		var formatInfoSection = function($this) {
			if ($data($this).options && $data($this).options.searchTextElementId) {
				var $searchTextElm = $('#'+$data($this).options.searchTextElementId);
				if ($searchTextElm) {
					$searchTextElm.html(MUSSAM.message('mussam.search.liste.searchText') + "<span class='searchText'>"+$data($this).listData.searchText+"</span>");
				}
			}
 
		 if ($data($this).options && $data($this).options.headerInfoElementId) {
			var $headerInfo = $('#'+$data($this).options.headerInfoElementId);
			if ($headerInfo) {
				$headerInfo.html(MUSSAM.message('mussam.search.liste.hitcount', $data($this).listData.hitsReturned, $data($this).listData.totalHits));
			}
		 }

		}
		
		/**
		 * Renders the html for the list.
		 */
		var formatPageHtml = function($this, jsonData, startIdx, endIdx) {
			formatInfoSection($this);
//			var ihtml = '<h2>'+MUSSAM.message("mussam.search.liste.overskrift") + '</h2>\n';
//      ihtml += MUSSAM.message("mussam.search.liste.prefix")+'\n';
			var ihtml = '<table class="result">\n';
			ihtml += "<tr>"
				+ "<th>Billede</th>"
				+ formatSortLinkElm($this, "betegnelseList", "Beskrivelse")
        + formatSortLinkElm($this, "periodeList", "Periode")
				+ formatSortLinkElm($this, "stedList", "Sted");
			if($data($this).showMuseum) {
				ihtml += formatSortLinkElm($this, "museumList", "Museum")
			}
			ihtml +="</tr>\n";
					
			
			for (var i=0; i<jsonData.length ; i++) {
				// Look up objectType and objectId in the list we have
				if($data($this).sortDirection == 0) {
					var listObject = $data($this).listData[$data($this).currentSortField][startIdx + i];
				} else {
					var listObject = $data($this).listData[$data($this).currentSortField][startIdx - i];
				}
				var listObjectSplit = listObject.split(":");
				
				var tdClass = i % 2 == 0 ? 'dark' : 'light';
				
				var betegnelse = jsonData[i].betegnelse != null ? jsonData[i].betegnelse : "tom betegnelse";
				var beskrivelse = jsonData[i].beskrivelse != null ? jsonData[i].beskrivelse : "tom beskrivelse";
				if (beskrivelse.length > 110) {
					beskrivelse = beskrivelse.substring(0,110) + "...";
				}
//				if(betegnelse.length > 20) { //Primitive way to split the string, might have to be done smarter
//					betegnelseStart = betegnelse.substring(0,20);
//					betegnelseEnd = betegnelse.substring(20, betegnelse.length);
//				} else {
//					betegnelseStart = betegnelse;
//					betegnelseEnd = "";
//				}
				var periodeTekst = jsonData[i].periodeTekst || "";
				var periodeTitle = jsonData[i].periodeTitle || "";
				
				var sted = jsonData[i].sted != null ? jsonData[i].sted : "tomt sted"; 
				var museumNavn = jsonData[i].museum != null ? jsonData[i].museum : "tomt navn"; 
				var museumId = jsonData[i].museumId != null ? jsonData[i].museumId : "tomt-id";
				var objectId = MUSSAM.strFirstLowerCase(listObjectSplit[0] + "Id");
				var primaerBillede = "";
				if(jsonData[i].primaerId != "") {
					if(jsonData[i].mimeType == "image/jpeg"){
						primaerBillede = "<img src='" + MUSSAM.url({'url' : '/VisMIMEtypeobjekt.action'}) + "?maxWidth=60&mimetypeobjektId=" + jsonData[i].primaerId + "' >";
					}else if(jsonData[i].mimeType == "application/pdf"){
						primaerBillede = "<img src='" + MUSSAM.url({'url' : '/images/grafikelementer/PDF_ikon_final.gif'}) + "' >";
					}
					//primaerBillede = "tom";
				} 
				ihtml += "<tr>"
							+"<td class='"+tdClass+"'>"+ primaerBillede +"</td>"
							+"<td class='"+tdClass+"'><a href='" + MUSSAM.url({'url' : 'Vis' + listObjectSplit[0] + '.action?'}) + objectId + "=" + listObjectSplit[1] + "'>" + betegnelse +"</a><br>" + beskrivelse + "</td>"
              +"<td class='"+tdClass+"' title='" + periodeTitle + "'>"+ periodeTekst +"</td>";
							+"<td class='"+tdClass+"'>"+ sted +"</td>";
				if($data($this).showMuseum) {
					  ihtml += "<td class='"+tdClass+"'><a href='" + MUSSAM.url({'url' : 'VisMuseum.action', parameters : {'museumId' : museumId } }) + "'>"+ museumNavn +"</a></td>"
				}
					  ihtml +="</tr>\n";
			}
			ihtml += "</table>\n";

			return ihtml;
		};
		
		/**
		 * Returns a jquery element for a page link (including the callback for the click event handler).
		 */
		var formatPageLinkElm = function($this, pageNo, prefix, linkText, postfix) {
			var $pageLinkElm = $("<span>"+prefix+"</span>"+"<a href='#"+pageNo+"' alt='"+pageNo+"'>"+linkText+"</a>"+"<span>"+postfix+"</span>");
			$pageLinkElm.click( function(eventObj) { pageClickHandler($this, eventObj); return false; } );			
			$pageLinkElm.wrap("<span class='page'></span>");
			
			return $pageLinkElm;
		};

		/**
		 * Returns a jquery element for a sort header (including the callback for the click event handler).
		 */
		var formatSortLinkElm = function($this, sortField, headerText) {
			var sortFix = "";
			if($data($this).currentSortField == sortField) {
				if($data($this).sortDirection == 0) {
					//sortFix = " - asc -";					
					sortFix = "<img src='" + MUSSAM.url({'url' : '/images/knapper/pilned.gif'}) + "' alt='" + sortField + "'>"
				} else {
					//sortFix = " - desc -";
					sortFix = "<img src='"+ MUSSAM.url({'url' : '/images/knapper/pilop.gif'}) + "' alt='" + sortField + "'>"
				}
			} 
			var $sortLinkElm = "<th><a href='#" + sortField + "' id='" + sortField + "' alt='" + sortField + "'>" + headerText + sortFix + "</a></th>";
			
			return $sortLinkElm;
		};

		/**
		 *  Returns a jquery element for paging.
		 */
		var returnPagingElm = function($this) {
			MUSSAM.writeLogDebug("list.returnPagingElm() - pageNo="+getPageNo($this)+", pageCount="+getPageCount($this));
			var $pagingElm = $("<div class='paging'></div>");
				
			if (getPageNo($this)>1) {
				$pagingElm.append(formatPageLinkElm($this, 1, '', '&lt;&lt;&nbsp;' + MUSSAM.message('mussam.paging.first'), '&nbsp;&nbsp;'));		
				$pagingElm.append(formatPageLinkElm($this, getPageNo($this)-1, '', '&lt;&nbsp;' +  MUSSAM.message('mussam.paging.previous'), '&nbsp;'));
			}
			
			var startPageNo = Math.max(1, getPageNo($this) - 5);
			var endPageNo = Math.min(getPageCount($this), getPageNo($this) + 5);
			for (var i=startPageNo; i<getPageNo($this); i++) {
				$pagingElm.append(formatPageLinkElm($this, i, '', i, '&nbsp;'));
			}
						
			$pagingElm.append("<span class='page'><b>"+getPageNo($this)+"&nbsp;</b></span>");
			var overStart = 1+(1*getPageNo($this));
			for (var j=overStart; j<=endPageNo; j++) {
				$pagingElm.append(formatPageLinkElm($this, j, '', j, '&nbsp;'));
			}

			if (getPageNo($this)<getPageCount($this)) {
				$pagingElm.append(formatPageLinkElm($this, getPageNo($this)+1, '',  MUSSAM.message('mussam.paging.next') + '&nbsp;&gt;', '&nbsp;'));
				$pagingElm.append(formatPageLinkElm($this, getPageCount($this), '&nbsp;&nbsp;',  MUSSAM.message('mussam.paging.last') + '&nbsp;&gt;&gt;', ''));
			}

			$pagingElm.wrapAll("<div class='paging'></div>");
			return $pagingElm;
		};

		//
		// GUI - Event handlers
		//
		
		var pageClickHandler = function($this, eventObj) {			
			var pageNo = $(eventObj.target).attr('alt');
			MUSSAM.writeLogInfo("list.pageClickHandler - clicked on page"+pageNo);
			if (pageNo > 0) {
				$data($this).pageNo = pageNo;
				showPage($this);
			}
		};
		
		/**
		 * Function that changes sort field and sort direction
		 */
		var sortClickHandler = function($this, eventObj) {			
			var sortClicked = $(eventObj.target).attr('alt');
			MUSSAM.writeLogInfo("list.sortClickHandler - clicked on sort: " + sortClicked);
			
			if($data($this).currentSortField == sortClicked) {
				if($data($this).sortDirection == 0) {
					$data($this).sortDirection = 1;
				} else {
					$data($this).sortDirection = 0;
				}
			} else {			
				$data($this).currentSortField = sortClicked;
			}
			$data($this).pageNo = 1; // when sorting, we start from page 1 again
			
			showPage($this);
		};

		var pageSizeSelectHandler = function($this, eventObj) {
			var value = eventObj.target.options[eventObj.target.selectedIndex].value;
		
			var topOfPageIndex = MUSSAM.getMussamPageSize() * ($data($this).pageNo-1);
			MUSSAM.writeLogDebug("pageSizeSelectHandler() - selected "+value+ ", topOfPageIndex="+topOfPageIndex);
			MUSSAM.setMussamPageSize(value); // now set page size to new value
			$data($this).pageCount = Math.ceil($data($this).listData.hitsReturned / MUSSAM.getMussamPageSize() );

			var newPageNo = Math.floor( topOfPageIndex /  MUSSAM.getMussamPageSize() ) + 1  ; 
			setPageNo($this, newPageNo)	;
			
			MUSSAM.writeLogDebug("pageSizeSelectHandler() before calling showPage");
			showPage($this);
			MUSSAM.writeLogDebug("pageSizeSelectHandler() - set to page no="+newPageNo);
		}
		
		//
		// Misc
		//
		/**
		 * Shortcut method for the .data() method. 
		 * Instead of
		 * 		$('#foo').data('bar', 'foobar');
		 * you can write:
		 * 		$data("#foo").bar = "foobar";
		 * 
		 * It also works with jquery-enabled elements:
		 *   $data(myJQElm).boo = 'far';
		 */
		var $data = function(param) {
	    var node = $(param)[0];
	    var id = $.data(node);
	    $.cache[id] = $.cache[id] || {};
	    $.cache[id].node = node;
	    return $.cache[id];
	  };
	  
		// 
		// jquery enabling - Loop through each matching element
		// 
		return this.each(function() {
				initObjectList($(this));
			}
		);
	};	

					
		
	
	
})(jQuery);
	
	
