			$(function(){
				var addMessage_selectedIcon = null;
				var addMessage_selectedColour = null;
				var resizeTimeout = null;
				var lastFromID = -1;
				var lastDirection = 'backward';
				var firstID = 9999999;
				var lastID = 9999999;
				var savingMessage = false;
	
				function saveMessage(){
					if(savingMessage){ return; }
					
					$('#addMessage-msgs').removeClass('error notice');
					
					var message = {
						icon: addMessage_selectedIcon,
						colour: addMessage_selectedColour,
						author: $.trim($('#name').val()),
						dedication:  $.trim($('#dedication').val()),
						location: $.trim($('#location').val()),
						text: $.trim($('#message').val())
					};

					if(message.author.length == 0 || message.location.length == 0 || message.text.length == 0){
						$('#addMessage-msgs').addClass('error').html('Please fill in required fields').fadeIn();
						return;
					}
	
					if(!message.icon){ $('#addMessage-msgs').addClass('error').html('Select an icon').fadeIn(); return; }
					if(!message.colour){ $('#addMessage-msgs').addClass('error').html('Select a colour').fadeIn(); return; }
	
					message.text = message.text.replace(new RegExp( "\\n", "g" ), '¬');

					savingMessage = true;

					$.post('/pages/ajaxCalls.aspx?serverAction=saveMessage', message, function(result){
						if(result.error){
							alert(result.error);
						}else if(result.hasPosted){
							$('#addMessage-msgs').addClass('error').html('You have already posted a message.').fadeIn();
						}else{
							$('#addMessage-form').fadeOut(function(){
								$('#addMessage-thanks').fadeIn();
							});
						}
						setTimeout(function(){
							savingMessage = false;
						}, 5000);
					}, 'json');
				}
				function rateMessage(messageId, type, callback){
					$.post('/pages/ajaxCalls.aspx?serverAction=rateMessage', {id:messageId, type:type}, function(result){
						if(result.error){
							alert(result.error);
						}else{
							if(callback){ callback(result.alreadyRated); }
						}
					}, 'json');
				}
				
				function fetchMessages(fromID, direction, callback){
					var maxCount = parseInt(messagesAccommodated.h*messagesAccommodated.v);
	
					$.getJSON('/pages/ajaxCalls.aspx?serverAction=loadMessages&fromID='+fromID+'&maxCount='+maxCount+'&direction='+direction, function(messages){
						if(messages.error){
							alert("Whoops! We there was a problem loading messages. Please refresh and try again");
						}else{
							if(!messages.length){
								$("#dialog").modal({
									onOpen: function (dialog) {
										dialog.overlay.show();
										dialog.container.show();
										dialog.data.html('<div class="viewMessage" style="text-align:center;">There are no '+(direction=='forward'?'newer messages at this time':'older messages')+'</div>');
										dialog.data.show();
										dialog.container.animate({
											height: dialog.data.outerHeight()+'px'
										});
										/*dialog.overlay.fadeIn('fast', function () {
											dialog.container.fadeIn('fast');
											dialog.data.html('<div class="viewMessage" style="text-align:center;">There are no '+(direction=='forward'?'newer messages at this time':'older messages')+'</div>');
											dialog.container.animate({
												height: dialog.data.outerHeight()+'px'
											}, function(){
												dialog.data.fadeIn();
											});
										});*/
									},
									closeHTML: '<a href="#" title="Close" class="modal-close">x</a>',
									position: [150]
								});
								return;
							}
							firstID = messages[0].ID;
							lastID = messages[messages.length-1].ID;
							$('#newer:hidden').show('fast');
							if(callback){
								callback($.fixDates(messages));
							}
						}
					});
					lastFromID = fromID;
					lastDirecton = direction;
				}

			
				/* RENDER MESSAGES */
				var settings = {
					messageDim : {
						width: 170,
						height: 130
					},
					messagesMargin : {
						h : 40,
						v : 10
					}
				};
				var availableSpace = {
					width: 0,
					height: 0
				};
				var messagesAccommodated = {
					h : 0,
					v : 0
				}
				function refreshAvailableSpace(){
					availableSpace = {
						width: $(window).width()-(settings.messagesMargin.h*2),
						height: $(window).height()-$('#footer').outerHeight()-$('#header').outerHeight()-(settings.messagesMargin.v*2)
					};
					if($.browser.msie && $.browser.version=="6.0"){ availableSpace.height += parseInt($('#footer').outerHeight()/2);}
					messagesAccommodated = {
						h : parseInt(availableSpace.width/settings.messageDim.width),
						v : parseInt(availableSpace.height/settings.messageDim.height)
					};

				}
				function handleResize(){
					refreshAvailableSpace();
					$('#messages').width(availableSpace.width).height(availableSpace.height);
				}
				function resizeAndLoad(firstLoad){
					handleResize();
					fetchMessages(lastID+1, lastDirection, function(messages){
						renderMessages(messages);
						if(firstLoad){ $('#newer').hide(); };
					});
				}
				function renderMessages(messages){
					$('#messages *').remove();
					var i = 0;
					for(var v=0; v<messagesAccommodated.v; v++){
						var row = $('<tr></tr>');
						for(var h=0; h<messagesAccommodated.h; h++){
							row.append('<td>'+
									   		(messages.length > i ?
												'<div messageID="'+messages[i].ID+'" class="message'+(messages[i].Dedication.length?' message-withDedication':'')+'">' +
													'<div class="messagePin" style="background-position:-'+(rand(4)*60)+'px -'+(rand(4)*60)+'px;"></div>' +
													'<div class="messageContent '+messages[i].Colour+'">' +
														'<div class="messageContent-padding">' +
															'<div class="messageContent-maxHeight">' +
																(messages[i].Dedication.length? '<span class="dedication"><small>To</small> '+messages[i].Dedication+'</span>' : '') +
																'<span class="author"><small>From</small> '/*+messages[i].ID+' '*/+messages[i].Author+', '+messages[i].AuthorLocation+'</span>' +
																'<span class="timestamp">'+messages[i].Timestamp.ToShortStringWithTime()+'</span>' +
															'</div>' +
														'</div>' +
													'</div>' +
												'</div>'
											: '&nbsp;') +
									'</td>');
							i++;
						}
						$('#messages').append(row);
					}
					$('#messages div.message').click(function(){
						var messageID = $(this).attr('messageID');
						$("#dialog").modal({
							onOpen: function (dialog) {
								dialog.overlay.fadeIn('fast', function () {
									dialog.container.fadeIn('fast');
									dialog.data.show();
									dialog.data.html('<div style="padding:10px;">Loading...</div>');
									$.getJSON('/pages/ajaxCalls.aspx?serverAction=loadMessage&id='+messageID, function(message){
										message = $.fixDates(message);
										var html = '' +
										'<div class="viewMessage">' +
											'<div class="viewMessage-icon messageIcon-'+message.Icon+'"></div>' +
											(message.Dedication.length ? '<p>To <strong>'+message.Dedication+'</strong></p>' : '') +
											'<p class="messageBody">'+message.Text+'</p>' +
											'<span>'+message.Author+', '+message.AuthorLocation+' on '+message.Timestamp.ToStringWithTime()+'</span>' +
											'<br clear="all" />' +
										'</div>' +
										'<div class="rateMessage">&nbsp;' +
											'<a href="javascript:void(0);" messageID="'+message.ID+'" class="abuse-link">Report inappropriate content</a>' +
										'</div>'
										dialog.data.html(html).hide();

										if(dialog.data.height() > 500){
											dialog.data.find('p.messageBody').addClass('longText');
										}
										
										dialog.container.animate({
											height: dialog.data.height()+'px'
										}, function(){
											dialog.data.fadeIn();
										});
									});
								});
							},
							closeHTML: '<a href="#" title="Close" class="modal-close">x</a>',
							autoResize : true,
							maxHeight  : 500,
							position: [50]
						});
					});
				}
				
				$(window).resize(function(){
					clearTimeout(resizeTimeout);
					resizeTimeout = setTimeout(function(){
						resizeAndLoad();
					}, 300);
				});
				resizeAndLoad(true);

				$('#older').click(function(){
					fetchMessages(firstID, 'backward', function(messages){
						renderMessages(messages);
					});
				});
				$('#newer').click(function(){
					fetchMessages(lastID, 'forward', function(messages){
						renderMessages(messages);
					});
				});
					   
				/* ADD MESSAGE DIALOG */
				function addMessageDialog(){
					if(getCookie('cookiesEnabled').length == 0){
						alert('You must have cookies enabled to post a message');
						return;
					}
					addMessage_selectedIcon = null;
					addMessage_selectedColour = null;
					$('#name').val('');
					$('#location').val('');
					$('#dedication').val('');
					$('#message').val('');

					$("#addMessage").modal({
						onOpen: function (dialog) {
							dialog.overlay.fadeIn('fast', function () {
								dialog.container.fadeIn('fast');
								
								dialog.container.animate({
									height: dialog.data.outerHeight()+'px'
								}, function(){
									dialog.data.fadeIn();
								});
							});
						},
						closeHTML: '<a href="#" title="Close" class="modal-close">x</a>',
						maxHeight  : 500,
						position: [50]
					});
				}
				$('#header-nav-addMessage').click(function(){
					addMessageDialog();
					return false;
				});
				
				/* add message - icons */
				for(var i=0; i<icons.length; i++){
					$('#addMessage-icons').append($('<div class="messageIcon messageIcon-'+icons[i]+'" icon="'+icons[i]+'"></div>'));
				}
				$('#addMessage-icons div').click(function(){
					$('#addMessage-icons div').removeClass('selected');
					$(this).addClass('selected');
					addMessage_selectedIcon = $(this).attr('icon');
				});
				
				/* add message - colours */
				for(var i=1; i<6; i++){
					$('#addMessage-colours').append($('<div class="messageColour-'+i+'" colour="messageColour-'+i+'"></div>'));
				}
				$('#addMessage-colours div').click(function(){
					$('#addMessage-colours div').removeClass('selected');
					$(this).addClass('selected');
					addMessage_selectedColour = $(this).attr('colour');
				});

				$('a.abuse-link').live('click', function(){
					var clickedLink = $(this);
					rateMessage($(this).attr('messageID'), 'dislike', function(alreadyRated){
						clickedLink.fadeOut(function(){
							var thanks = $('<span style="display:none; float:right;"">'+(alreadyRated?'You have previously reported this message':'Thank you for your feedback') +'</span>');
							clickedLink.parent().append(thanks);
							thanks.fadeIn();
						});
					});
				});

				$('#saveMessage').click(function(){
					saveMessage();
				});
		   });