/*
Copyright (c) 2009, Geomatics and Cartographic Research Centre, Carleton 
University. All rights reserved.

Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions are met:

 - Redistributions of source code must retain the above copyright notice, 
   this list of conditions and the following disclaimer.
 - Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.
 - Neither the name of the Geomatics and Cartographic Research Centre, 
   Carleton University nor the names of its contributors may be used to 
   endorse or promote products derived from this software without specific 
   prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
POSSIBILITY OF SUCH DAMAGE.

$Id: olkit_ContDisplayFormatter.js 5264 2010-01-27 01:50:34Z glennbrauen $
*/
/*
 * Formatter for contribution displays
 */
function olkit_ContDisplayFormatter(aoOptions,dbSearchEngine_) {
	var options = {
		contribTableClassBase: "contrib" /* modified as needed to create columns */
		,contributionAddClick: function(placeId, key){ alert('Not supported'); }
		,contribMediaClick: function(key, path){ alert('Not supported'); }
		,contributionDeleteClick: function(key,placeId){ alert('Not supported'); }
		,contributionUpdateClick: function(key,placeId){ alert('Not supported'); }
		,showRespondLink: false /* offer a response link in the display */
		,showContribInfoIcons: false
		,keysAreStrings: false
		,showContribAuthor: true
		,iconPath: 'olkit-jslib/images/' // in case, olkit-jslib moves around relative to the base of the app
	};
	if( aoOptions ) {
		options = $.extend({}, options, aoOptions);
	};

	function log() {
		if (typeof(window.console) != 'undefined' && null != window.console && null != window.console.log) {
			try { window.console.log.apply(window.console,arguments); }
            	catch(e) {};
		};
	};

	var dbSearchEngine = dbSearchEngine_;
	
	
	var extensionType_basic = "basic";
	var extensionType_startRelated = "start_related";
	var extensionType_contRelated = "cont_related";
	var extensionType_endRelated = "end_related";
	function classExtensions(base, type, lastRow) {
		var ret;
		
		if (extensionType_basic == type || extensionType_startRelated == type) {
			ret = [ base+'_fullwidth '+base+'_solid_top_border' ];
		} else {
			ret = [
				base+'_left '+base+'_center_marker',
				base+'_right '+base+'_dashed_top_border' ];
		}
		
		/*
		 * only do bottom borders on table entries if this is the last entry in the table.
		 */
		if (lastRow) {
			for (var j=0; j<ret.length; j++) {
				ret[j] += ' '+base+'_solid_bottom_border';
			}
		}
		return(ret);
	}
	
	function isMediaFileDefined(cont) {
		var mediaType = null;
	
		if (null != cont.filename && "" != cont.filename) {
			if (null != cont.mimetype && "" != cont.mimetype) {
				var mimeClass = cont.mimetype.split("/");
				if ("image" === mimeClass[0] ||
					"video" === mimeClass[0] ||
					"audio" === mimeClass[0]) {
					mediaType = mimeClass[0];
				}
			} else {
				alert("defined filename but no mimetype set: "+cont.id);
			}
		}
		return(mediaType);
	}
	
	function getMediaIconClassExtension(type) {
		return("_entry_"+type+"_icon");	
	}

	function getAltTagFromMediaType(type) {
		return("a contributed "+type+" file");
	}
	
	function formatKey(key) {
		if (true == options.keysAreStrings) {
			return("'"+key+"'");
		} else {
			return(key);
		}
	};
	
	function getContributorLabel(contribution) {
		if( null == contribution || null == contribution.contributor ) {
			return('by <span class="'+options.contribTableClassBase+'_entry_contributor_unknown">Unknown</span>');
		};
		if( contribution.contributor.anonymous ) {
			return('by <span class="'+options.contribTableClassBase+'_entry_contributor_guest">Guest</span>');
		};
		if( contribution.contributor.display ) {
			return('by <span class="'+options.contribTableClassBase+'_entry_contributor_name">'+contribution.contributor.display+'</span>');
		};
		return('by <span class="'+options.contribTableClassBase+'_entry_contributor_unknown">Unknown</span>');
	};
	   
	function getLastContributorLabel(contribution) {
		if (null == contribution || null == contribution.lastContributor) {
			return('Unknown');
		};
		if (contribution.lastContributor.anonymous) {
			return('Guest');
		};
		if (contribution.lastContributor.display) {
			return(contribution.lastContributor.display);
		};
		return('Unknown');
	};
	
	function formatFileSize(value_) {
		var _1M = 1048576;
		var _1K = 1024;
		
		if (value_ > _1M) {
			return('' + (value_ / _1M).toFixed(1) + '<br/>MBytes');
		} else if (value_ > _1K) {
			return('' + (value_ / _1K).toFixed(1) + '<br/>KBytes');
		}
		return('' + value_ + '<br/>Bytes');
	}
	   
	return {
		/*
		 * cont      : the contribution
		 * parms:
		 * - key     : key for element (caller must be able to use this key to identify element - used in onclick)   
		 * - rowType : basic, start_related, cont_related, end_related
		 * lastRow   : boolean - true => this contribution is the last row; false otherwise
		 */
		formatAsTR : function(cont, parms, lastRow) {
				var classExts = classExtensions(options.contribTableClassBase+"_entry", parms.rowType, lastRow);
				var mediaType;
				
				var isDeleteAllowed = false;
				var isUpdateAllowed = false;
		    	if( $.NUNALIIT_AUTH ) {
					isDeleteAllowed = $.NUNALIIT_AUTH.isDeleteAllowed();
					if (null != cont.contributor) {
						isUpdateAllowed = $.NUNALIIT_AUTH.isUpdateAllowed(cont.contributor.display);
					} else {
						// allows admin updating, even if no contributor info stored with contribution
						isUpdateAllowed = $.NUNALIIT_AUTH.isUpdateAllowed('');
					}
		    	};
				
				// Result is a tr element
				var htmlElem = $('<tr class="'+options.contribTableClassBase+'"></tr>');
				
				if (extensionType_basic == parms.rowType || extensionType_startRelated == parms.rowType) {
					var tdElem = $('<td colspan="2" class="'+classExts[0]+'"></td>');
					htmlElem.append(tdElem);
				} else {
					var tdElem = $('<td class="'+classExts[0]+'"><img src="' + options.iconPath + 'comment_relation.png" alt="related comment marker"/></td>');
					htmlElem.append(tdElem);

					var tdElem = $('<td class="'+classExts[1]+'"></td>');
					htmlElem.append(tdElem);
				}
				
				// title and media icon/thumbnail, if appropriate
				mediaType = isMediaFileDefined(cont);
				if (null != mediaType) {
					var htmlString = 
						'<div class="contrib_entry_media_icon_wrapper">' +
							'<div class="'+options.contribTableClassBase+'_entry_media_icon '+
								options.contribTableClassBase+getMediaIconClassExtension(mediaType)+'"'+
								' alt="'+getAltTagFromMediaType(mediaType)+'">'+
							'</div>';
					if (typeof cont.file_size != 'undefined' && cont.file_size > 0) {
						htmlString += formatFileSize(cont.file_size);
					}
					htmlString += '</div>';
					var mediaIconDiv = $(htmlString);
					mediaIconDiv.click(function(){
						options.contribMediaClick(parms.key,dbSearchEngine.getRelMediaPath());
					});
					tdElem.append(mediaIconDiv);
				} else if (true == options.showContribInfoIcons) { // what's the purpose of this????
					var mediaIconDiv = $('<div class="'+options.contribTableClassBase+'_entry_info_icon"'+
						' alt="'+getAltTagFromMediaType(mediaType)+'"></div>');
					mediaIconDiv.click(function(){
						options.contribMediaClick(parms.key,dbSearchEngine.getRelMediaPath());
					});
					tdElem.append(mediaIconDiv);
				}

				// Title
				var titleElem = $('<p class="'+options.contribTableClassBase+'_entry_title">'+cont.title+'</p>');
				tdElem.append(titleElem);
				
				// Contributor
				if (true == options.showContribAuthor) {
					var contributorElem = $('<p class="'+options.contribTableClassBase+'_entry_contributor">'+
						getContributorLabel(cont)+'</p>');
					tdElem.append(contributorElem);
				}
				
				// Notes
				if (null != cont.notes && "" != cont.notes) {
					var notesElem = $('<p class="'+options.contribTableClassBase+'_entry_comment">'+cont.notes+'</p>');
					tdElem.append(notesElem);
				}
				
				// last edit info - stick it at the bottom of the note
				if (null != cont.lastContributor && null != cont.last_edit_timestamp) {
					var lastEditElem = $('<p class="'+options.contribTableClassBase+'_entry_last_edit">'+
						'Last edited by '+getLastContributorLabel(cont)+':'+
						cont.last_edit_timestamp + '</p>');
					tdElem.append(lastEditElem);
				} else if (null != cont.lastContributor) {
					var lastEditElem = $('<p class="'+options.contribTableClassBase+'_entry_last_edit">'+
						'Last edited by '+getLastContributorLabel(cont)+'</p>');
					tdElem.append(lastEditElem);
				}
				
				// Link div
				var linkDiv = $('<div class="contrib_entry_link_group"></div>');
				tdElem.append(linkDiv);
				// Response link
				if (true == options.showRespondLink) {
					if (extensionType_basic == parms.rowType || extensionType_startRelated == parms.rowType) {
						var respLinkElem = $('<a class="'+options.contribTableClassBase+'_entry_link" href="javascript:Respond">respond</a>');
						respLinkElem.click(function(){
							options.contributionAddClick(cont.place_id, parms.key);
							return false;
						});
						linkDiv.append(respLinkElem);
					}
				}
				
				// Update link
				if( isUpdateAllowed ) {
					var updateLinkElem = $('<a class="'+options.contribTableClassBase+'_entry_link" href="javascript:Update">update</a>');
					updateLinkElem.click(function(){
						options.contributionUpdateClick(parms.key,cont.place_id);
						return false;
					});
					linkDiv.append(updateLinkElem);
				};
				
				// Delete link
				if( isDeleteAllowed ) {
					var deleteLinkElem = $('<a class="'+options.contribTableClassBase+'_entry_link" href="javascript:Delete">delete</a>');
					deleteLinkElem.click(function(){
						options.contributionDeleteClick(parms.key,cont.place_id);
						return false;
					});
					linkDiv.append(deleteLinkElem);
				};
				
				return htmlElem;
			},

		getExtensionType_basic : function() {
				return(extensionType_basic);
			},
			
		getExtensionType_startRelated : function() {
				return(extensionType_startRelated);
			},

		getExtensionType_contRelated : function() {
				return(extensionType_contRelated);
			},
			
		getExtensionType_endRelated : function() {
				return(extensionType_endRelated);
			}			
	};
}
