
/**
 * Javascript, das vom f3:table-Tag benutzt wird.
 * 
 * ?nderungen an den Javscript-Funktionen sollten immer nur zusammen
 * mit ?nderungen am Tag einher gehen
 * 
 * Diese Implementierung benutzt jquery 1.4 und h?her
 */
function F3Table(prefixString, parameter){
		
		this.prefix = prefixString;
		this.params = parameter;
		//alert(" new TableObject DeleteUrl: "+parameter.deleteUrl);
		
		// API
		this.editObject = function(id){
			this.tableEdit(this.getParams({id:id}));
		}
		this.deleteObject = function(id){
			this.tableConfirmDelete(this.getParams({id:id}));
		}
	
		this.orderTable = function(col, dir){
			this.tableOrder(this.getParams({sortcol:col, sortdir: dir}));
		}
	
		this.showPage = function(page){
			this.tableShowPage(this.getParams({page:page}));
		}
		
		this.showItemsPerPage = function(co){
			this.tableItemsPerPage(this.getParams({itemsPerPage: co}));
		}
	
		
		
		// ----------------------------------------------------------
		// private functions
		
		this.getParams = function(otherParams){
//			alert("OtherParams before merge: "+listParams(otherParams,"\n"));
//			alert("params before merge: "+listParams(this.params,"\n"));

			//			var params =  {
//				formId: '${formId}',
//				pane: '${panename}Pane',
//				url: '${ACTION_ROOT}${table.td.listUrl}',
//				deleteUrl: '${ACTION_ROOT}${table.td.rowDeleteUrl}',
//				editUrl: '${ACTION_ROOT}${table.td.rowEditUrl}',
//				editPane: '${table.td.rowEditPane}',
//				confirmDeleteMessage: '<spring:message code="table.confirm.deletion"/>',
//					
//					
//			};
			jQuery.extend(true, otherParams, this.params);
			
//			alert("OtherParams after merge: "+listParams(otherParams, "\n"));

			return otherParams;
		}
			
	/**
	 * Edit-Link einer Zeile ist aufgerufen worden
	 */
	this.tableEdit = function(params){

		// ist eine url angegeben oder nur eine pane?
		var url = params.editUrl;
		var pane = params.editPane;
		if(url != null){
			// id an die URL anh?ngen
			url += (url.indexOf("?") > -1 ? "&" : "?");
			url += "id="+params.id;
	
			if(pane != null){
				// in die Edit-Pane laden
				$.ajax({
		  			url: url,
		  			cache: false,
		  			success: function(html){
		  				$("#"+pane).html(html);
		  			}
				});
			}
			else {
				// im Browser-Fenster laden
				window.location.href=url;
			}
		}
		else if(pane != null){
			// nur eine pane angegben. Das interpretieren 
			// wir als Modal-Dialog
			openModal(pane+"Container", pane, "id="+params.id);
		}
	}

	
	/**
	 * L?sst sich die Message best?tigen. Wenn der Nutzer best?tigt,
	 * wird der ?bergebene Value in das ?bergeben Form-Feld geschrieben
	 * und die Table-Form wird an die ?bergebene Url submitted
	 */
	this.tableConfirmDelete = function(params) {		
		if (confirm(params.confirmDeleteMessage)) {
			this.setValueOfField("_rowid",params.id); // deletantId setzen
			params.url = params.deleteUrl; // deleteUrl aufrufen
			//alert("This: "+this+" Delete-URL: "+params.url+" delete-id: "+params.id);
			this.tableReload(params); // deleteUrl aufrufen und table neu laden
		}
	}
	
	/**
	 * Table sortieren
	 */
	this.tableOrder = function(params){
		this.setValueOfField("_sortcol",params.sortcol);
		this.setValueOfField("_sortdir",params.sortdir);
		
		this.tableReload(params);
	}
	
	/**
	 * Eine Seite weiter bl?ttern
	 * @param params
	 * @return
	 */
	this.tableShowPage = function(params){
		
		this.setValueOfField("_page",params.page);
		this.tableReload(params);
	}
	
	/**
	 * Die Anzahl der dargestellten Zeilen ?ndern
	 * @param params
	 * @return
	 */
	this.tableItemsPerPage = function(params){

		this.setValueOfField("_itemsPerPage",params.itemsPerPage);
		this.tableReload(params);
	}


	
	/**
	 * L?dt die Tabelle neu
	 * Ruft die Tableform dazu ?ber Ajax oder 
	 * als normalen HttpRequest auf
	 * @param params
	 * @return
	 */
	this.tableReload = function(params){

		
		// Success-Callback. Standard oder Custom?
		/*var successCallback = afterSubmitSuccess;
		if(params.successCallback != null){
			successCallback = params.successCallback;
		}
		*/
		
		// Ajax oder synchrones Http?
		if(params.useAjax){
			var pane = this.params.pane;
			// Wenn keine pane angegeben ist, dann suchen wir eine
			// indem wir den ersten ancestor der Form nehmen, der die 
			// Klasse markerTableContainer hat 
			if(pane != null && typeof pane == "string" && pane.length > 0){
				pane = "#"+pane;
			}
			else {
				pane = $("#"+params.formId).parents('.markerTableContainer').first();
			}
			$("#"+params.formId).ajaxSubmit({
						error: function(xhr, cause, ex){alert("Es ist ein Fehler aufgetreten! "+cause);},
			        	success:function(html){afterSubmitSuccess(pane, html)}, 
						url:params.url
					}); 
			 return false; 
		}
		else {
			// plain submit
			form= $("#"+params.formId);
			form.action=params.url;
			form.submit();
		}
	}
	
	/**
	 * Setzt das value-Attribut eines Input-Feldes
	 * @param fieldid
	 * @param value
	 * @return
	 */
	this.setValueOfField = function(fieldId, value){
		$("#"+this.prefix+fieldId).attr("value",value);
	}
	
	
	/**
	 * Standard -Callback f?r Table Reload. 
	 * Packt das zur?ckgegeben HTML in die 
	 */
	function afterSubmitSuccess(pane, html){
		//alert("after submit "+$(pane).size());
		$(pane).html(html);
	}
	 
	/**
	 * Helper-Methode, die die Parameter anzeigt
	 * @param params
	 * @return
	 */
	function listParams(params, cr){
		
		s = "params --"+cr;
	    for (key in params)
	    {
	          s+= key+":"+params[key] + cr;
	    }
	    return s;
	}
}	
//	alert("f3Table.js loaded");
