/* $Id: class_event.js 9 2009-01-11 06:03:21Z john $ */

// Required Language vars: 3000080,3000081,3000082,3000083,3000084,3000085,3000093,3000097,3000153,3000154,3000170,3000219,3000223,3000225,3000229,2000198,21000199,21000200

SocialEngineAPI.Event = new Class(
		{

			// Class
			Implements : [ Options ],

			// Properties
			Base : {},

			options : {
				'ajaxURL' : 'event_ajax.php',
				'ajaxMethod' : 'post',
				'ajaxSecure' : false,

				'defaultView' : false
			},

			eventExists : false,

			eventInfo : {},

			userRank : 0,

			IsMember : false,

			IsMemberWaiting : false,

			currentConfirmID : 0,

			currentInvites : false,

			visibleTab : 0,

			inviteCounter : {
				'totalInvited' : 0,
				'select' : true
			},

			rsvpLanguageVars : {
				'-1' : 3000080,
				'0' : 3000081,
				'1' : 3000082,
				'2' : 3000083,
				'3' : 3000084,
				'4' : 3000085
			},

			// Initialize
			initialize : function(eventInfo, options) {
				var bind = this;

				// Options
				if ($type(options) == "object") {
					if ($type(options.defaultView) && options.defaultView == '')
						delete options.defaultView;

					this.setOptions(options);
				}

				// Event info stuff
				if (eventInfo && $type(eventInfo) == "object") {
					this.eventExists = eventInfo.event_exists;
					delete eventInfo.event_exists;

					this.IsMember = eventInfo.is_member;
					delete eventInfo.is_member;

					this.IsMemberWaiting = eventInfo.is_member_waiting;
					delete eventInfo.is_member_waiting;

					this.UserRank = eventInfo.user_rank;
					delete eventInfo.user_rank;

					this.eventInfo = eventInfo;
				}

				// Load currently visible tab
				var currentVisibleTab = Cookie.read('eventVisibleTab');

				if (this.options.defaultView)
					currentVisibleTab = this.options.defaultView;
				else if (!$type(currentVisibleTab) || !currentVisibleTab)
					currentVisibleTab = 'profile';

				window.addEvent('domready', function() {
					if ($('event_tab_table'))
						bind.loadProfileTab(currentVisibleTab);
				});

			},

			// Profile Tabs
			loadProfileTab : function(tabName) {
				var bind = this;
				$('event_tab_table').getElements('.event_tab').each(
						function(tabElement) {
							if (tabElement.id == 'event_tabs_' + tabName) {
								if (!tabElement.hasClass('event_tab_active'))
									tabElement.addClass('event_tab_active');

								$('event_' + tabName).style.display = "block";
								Cookie.write('eventVisibleTab',
										bind.visibleTab = tabName);
							} else {
								if (tabElement.hasClass('event_tab_active'))
									tabElement.removeClass('event_tab_active');

								var otherTabName = tabElement.id.replace(
										'_tabs_', '_');
								$(otherTabName).style.display = "none";
							}
						});
			},

			// Delete
			deleteShow : function(eventID) {
				this.currentConfirmID = (eventID || this.eventInfo.event_id);
				TB_show(
						this.Base.Language.Translate(3000093),
						'#TB_inline?height=100&width=300&inlineId=confirmeventdelete',
						'', 1);
			},

			deleteConfirm : function() {
				eventID = this.currentConfirmID;

				// Remove Smoothbox
				TB_remove();
	
				// Ajax
				var bind = this;
				var request = new Request.JSON(
					{
						'method' : 'post',
						'url' : this.options.ajaxURL,
						'data' : {
							'task' : 'eventdelete',
							'event_id' : eventID
						},
						'onComplete' : function(responseObject) {
							// alert($type(window.redirectOnDelete) + ' ' +
							// $type(parent.window.redirectOnDelete) + ' ' +
							// $type(parent.redirectOnDelete));

							if ($type(responseObject) != "object"
									|| !responseObject.result
									|| responseObject.result == "failure") {
								alert(bind.Base.Language.Translate(3000153));
							}

							else {
								// event, user_event_edit - Redirect on delete
								if ($type(window.redirectOnDelete) == "function") {
									window.redirectOnDelete();
								}

								// user_event - Remove row
								bind.removeRow(eventID);

								// user_event - Fix that calendar
								var eventMonthShow = $('seEventMonthShow_' + eventID);
								if (eventMonthShow) {
									var eventMonthDay = eventMonthShow.title;
									var eventCellElement = $('event_cell' + eventMonthDay);
									eventMonthShow.destroy();

									// Fix color
									if (eventCellElement
											&& eventCellElement.className != 'event_cell3'
											&& !eventCellElement
													.getElements('a').length) {
										$('event_cell' + eventMonthDay).className = 'event_cell1';
									}
								}
							}
						}
					});

				request.send();
	
				// Reset
				currentConfirmDeleteID = 0;
			},

			// Accept Request
			memberAccept : function(userID) {
				// Ajax
				var bind = this;
				var request = new Request.JSON( {
					'method' : 'post',
					'url' : this.options.ajaxURL,
					'data' : {
						'task' : 'eventmemberaccept',
						'event_id' : this.eventInfo.event_id,
						'user_id' : userID
					},
					'onComplete' : function(responseObject) {
						if ($type(responseObject) != "object"
								|| !responseObject.result
								|| responseObject.result == "failure") {
							alert(bind.Base.Language.Translate(3000153));
						}

						else {
							// Refresh window, at least for now
							if (document.event_members_form)
								document.event_members_form.submit();
							else
								window.location.reload(false);
						}
					}
				});

				request.send();
			},

			// Deny Request
			memberReject : function(userID) {
				// Ajax
				var bind = this;
				var request = new Request.JSON( {
					'method' : 'post',
					'url' : this.options.ajaxURL,
					'data' : {
						'task' : 'eventmemberreject',
						'event_id' : this.eventInfo.event_id,
						'user_id' : userID
					},
					'onComplete' : function(responseObject) {
						if ($type(responseObject) != "object"
								|| !responseObject.result
								|| responseObject.result == "failure") {
							alert(bind.Base.Language.Translate(3000153));
						}

						else {
							// Refresh window, at least for now
							if (document.event_members_form)
								document.event_members_form.submit();
							else
								window.location.reload(false);
						}
					}
				});

				request.send();
			},

			// Deny Request
			memberDelete : function(userID) {
				this.currentConfirmID = userID;
				TB_show(
						this.Base.Language.Translate(3000154),
						'#TB_inline?height=100&width=300&inlineId=confirmeventmemberdelete',
						'', 1);
			},

			memberDeleteConfirm : function() {
				userID = this.currentConfirmID;

				// Ajax
				var bind = this;
				var request = new Request.JSON( {
					'method' : 'post',
					'url' : this.options.ajaxURL,
					'data' : {
						'task' : 'eventmemberdelete',
						'event_id' : this.eventInfo.event_id,
						'user_id' : userID
					},
					'onComplete' : function(responseObject) {
						if ($type(responseObject) != "object"
								|| !responseObject.result
								|| responseObject.result == "failure") {
							alert(bind.Base.Language.Translate(3000153));
						}
	
						else {
							// Refresh window, at least for now
							if (document.event_members_form)
								document.event_members_form.submit();
							else
								window.location.reload(false);
						}
					}
				});
	
				request.send();
			},

			// Cancel Invite
			memberCancel : function(userID) {
				this.currentConfirmID = userID;
				TB_show(
						this.Base.Language.Translate(3000223),
						'#TB_inline?height=100&width=300&inlineId=confirmeventmembercancel',
						'', 1);
			},

			memberCancelConfirm : function() {
				userID = this.currentConfirmID;

				// Ajax
				var bind = this;
				var request = new Request.JSON( {
					'method' : 'post',
					'url' : this.options.ajaxURL,
					'data' : {
						'task' : 'eventmembercancel',
						'event_id' : this.eventInfo.event_id,
						'user_id' : userID
					},
					'onComplete' : function(responseObject) {
						if ($type(responseObject) != "object"
								|| !responseObject.result
								|| responseObject.result == "failure") {
							alert(bind.Base.Language.Translate(3000153));
						}
	
						else {
							// Refresh window, at least for now
							if (document.event_members_form)
								document.event_members_form.submit();
							else
								window.location.reload(false);
						}
					}
				});
	
				request.send();
			},
	
			// Invite
			memberInvitePopulate : function(eventID) {
				// Ajax
				var bind = this;
				var request = new Request.JSON( {
					'method' : 'post',
					'url' : this.options.ajaxURL,
					'data' : {
						'task' : 'getfriends',
						'event_id' : this.eventInfo.event_id
					},
					'onComplete' : function(responseObject) {
						if ($type(responseObject) != "object"
								|| !responseObject.result
								|| responseObject.result == "failure") {
							alert(bind.Base.Language.Translate(3000153));
						}

						else {
							bind.memberInviteShow(eventID,
									$H(responseObject.friends));
						}
					}
				});

				request.send();
			},

			memberInviteShow : function(eventID, friendsObject) {
				this.currentConfirmID = eventID;
				this.currentInvites = new Array();

				// Remove any existing friends
				$('invite_friendlist').empty();
	
				// Generate HTML
				var bind = this;
				var friends_num = $A(friendsObject.getKeys()).length;
				var i = 0;
	
				if (friends_num != 'undefined' && friends_num > 0) {
					friendsObject
							.each(function(userDisplayName, userID) {
								var newDiv = new Element("div", {
									'id' : 'friend_div_' + userID
								});
								var newCheckbox = new Element(
										"input",
										{
											'type' : 'checkbox',
											'id' : 'friend_link_' + userID,
											'name' : 'invites[]',
											'value' : userID,
											'class' : 'checkbox',
											'onchange' : 'parent.SocialEngine.Event.memberInviteUpdate(this.value, this.checked);'
										}).inject(newDiv);
	
								var newLabel = new Element("label", {
									'for' : 'friend_link_' + userID,
									'html' : userDisplayName
								}).inject(newDiv);
	
								newDiv.inject($('invite_friendlist'));
								i++;
							});
	
					if (i > 0) {
						$('inviteForm').show();
						$('noFriends').hide();
						$('inviteResults').hide();
					} else {
						$('inviteForm').hide();
						$('noFriends').show();
						$('inviteResults').hide();
					}
				}
	
				else {
					$('inviteForm').hide();
					$('noFriends').show();
					$('inviteResults').hide();
				}
	
				TB_show(
						this.Base.Language.Translate(3000225),
						'#TB_inline?height=350&width=450&inlineId=eventmemberinvite',
						'', 1);
			},
	
			memberInviteUpdate : function(userID, state) {
				// alert(userID + ', ' + state);
				state = (state ? true : false);
				if (state && !this.currentInvites.contains(userID)) {
					this.currentInvites.include(userID);
					this.inviteCounter.totalInvited = this.inviteCounter.totalInvited + 1;
				}
				else if (!state && this.currentInvites.contains(userID)) {
					this.currentInvites.erase(userID);
					this.inviteCounter.totalInvited = this.inviteCounter.totalInvited - 1;
				}
				
				this.updateInviteCounter();
			},
	
			memberInviteSend : function() {
				// Ajax
				var bind = this;
				var request = new Request.JSON(
						{
						'method' : 'post',
						'url' : this.options.ajaxURL,
						'data' : {
							'task' : 'eventmemberinvite',
							'event_id' : this.eventInfo.event_id,
							'invites' : this.currentInvites
						},
						'onComplete' : function(responseObject) {
							if ($type(responseObject) != "object"
									|| !responseObject.result
									|| responseObject.result == "failure") {
								alert(bind.Base.Language.Translate(3000153));
							}

							else {
								// Show invites sent
								$('inviteResults').innerHTML = bind.Base.Language.TranslateFormatted(3000229, [ responseObject.invites_sent ]);
								$('inviteForm').hide();
								$('noFriends').hide();
								$('inviteResults').show();

								(function() {
									if (document.event_members_form)
										document.event_members_form.submit();
									else
										setTimeout('window.parent.TB_remove()', 5000);
								}).delay(500);
							}
						}
					});

				request.send();
			},

			// RSVP
			rsvpShow : function(eventID) {
				this.currentConfirmID = (eventID || this.eventInfo.event_id);
				TB_show(
						this.Base.Language.Translate(3000097),
						'#TB_inline?height=120&width=350&inlineId=confirmeventrsvp',
						'', 1);
			},

			rsvpConfirm : function(eventRsvp) {
				eventID = (this.currentConfirmID || this.eventInfo.event_id);

				// Remove Smoothbox
				if ($('TB_overlay'))
					TB_remove();
	
				// Ajax
				var bind = this;
				var request = new Request.JSON(
					{
						'method' : 'post',
						'url' : this.options.ajaxURL,
						'data' : {
							'task' : 'eventrsvp',
							'event_id' : eventID,
							'event_rsvp' : eventRsvp
						},
						'onComplete' : function(responseObject) {
							if ($type(responseObject) != "object"
									|| !responseObject.result
									|| responseObject.result == "failure") {
								alert(bind.Base.Language.Translate(3000153));
							}

							else {
								// event - Switch profile buttons (for join)
								if ($('eventProfileMenuLeave')) {
									// Show leave button for all but leader
									if (bind.UserRank < 3)
										$('eventProfileMenuLeave').show();
									// Show invite button if allowed
									if (bind.eventInfo.event_invite)
										$('eventProfileMenuInvite').show();
									// $('eventProfileMenuRSVP').style.display =
									// '';
								}

								// event - Save success messages
								if ($('seEventProfileRSVPSuccess')) {
									$('seEventProfileRSVPSuccess').show();
									$('seEventProfileRSVPSuccess')
											.slide('hide').slide('in');
									(function() {
										$('seEventProfileRSVPSuccess').slide(
												'show').slide('out');
									}).delay(2000);
								}

								// user_event - Switch buttons (for join)
								var el = $('seEvent_' + eventID);
								if (el) {
									// User should never be able to join an
									// invite only event through the user_event
									// page
									if (elJoin = el.getElement('#seEventUserOptionJoin'))
										elJoin.hide();
									if (elRsvp = el.getElement('#seEventUserOptionRsvp')) 
										elRsvp.show();
									if (elLeave = el.getElement('#seEventUserOptionLeave'))
										elLeave.show();
									if (elAccept = el.getElement('#seEventStatusAccept'))
										elAccept.hide();
									if (elRSVP = el.getElement('#seEventStatusRSVP'))
										elRSVP.show();
								}

								// user_event - Update response
								if ($('seEventRSVP_' + eventID)) {
									$('seEventRSVP_' + eventID).setProperty('text', bind.Base.Language
											.Translate(bind.rsvpLanguageVars[eventRsvp]));
								}
								if ($('seEventAccept_' + eventID)) {
									$('seEventAccept_' + eventID).setProperty('text', bind.Base.Language
											.Translate(bind.rsvpLanguageVars[eventRsvp]));
								}
								
								if (responseObject.openidconnect_feed_story){
									var r = responseObject;
									r.openidconnect_feed_story.data = JSON.decode(r.openidconnect_feed_story.data);
									openidconnect_facebook_publish_stream( r.openidconnect_feed_story.story_type,
																		 r.openidconnect_feed_story.data,
																		 r.openidconnect_feed_story.user_prompt,
																		 r.openidconnect_feed_story.user_message
																		);
								}
							}
						}
					});

				request.send();
	
				// Reset
				this.currentConfirmID = 0;
			},
	
			// Leave
			leaveShow : function(eventID) {
				this.currentConfirmID = (eventID || this.eventInfo.event_id);
				TB_show(
						this.Base.Language.Translate(3000219),
						'#TB_inline?height=100&width=300&inlineId=confirmeventleave',
						'', 1);
			},

			leaveConfirm : function() {
				eventID = this.currentConfirmID;

				// Remove Smoothbox
				TB_remove();
	
				// Ajax
				var bind = this;
				var request = new Request.JSON(
						{
						'method' : 'post',
						'url' : this.options.ajaxURL,
						'data' : {
							'task' : 'eventleave',
							'event_id' : eventID
						},
						'onComplete' : function(responseObject) {
							if ($type(responseObject) != "object"
									|| !responseObject.result
									|| responseObject.result == "failure") {
								alert(bind.Base.Language.Translate(3000153));
							}

							else {
								// event - Show/hide profile menu icons
								if ($('eventProfileMenuLeave')) {
									if (bind.eventInfo.event_inviteonly) {
										$('eventProfileMenuRequest').show();
										$('eventProfileMenuRSVP').hide();
									} else {
										$$('.seEventProfileRSVP')
												.each(
														function(radioElement) {
															radioElement.checked = false;
														});
									}
									$('eventProfileMenuInvite').hide();
									$('eventProfileMenuLeave').hide();
								}

								// user_event - Remove event row
								bind.removeRow(eventID);

								// user_event - Fix that calendar
								var eventMonthShow = $('seEventMonthShow_' + eventID);
								if (eventMonthShow) {
									var eventMonthDay = eventMonthShow.title;
									var eventCellElement = $('event_cell' + eventMonthDay);
									eventMonthShow.destroy();

									// Fix color
									if (eventCellElement
											&& eventCellElement.className != 'event_cell3'
											&& !eventCellElement
													.getElements('a').length) {
										$('event_cell' + eventMonthDay).className = 'event_cell1';
									}
								}
							}
						}
					});

				request.send();
	
				// Reset
				this.currentConfirmID = 0;
			},
	
			// Cancel
			cancelShow : function(eventID) {
				this.currentConfirmID = (eventID || this.eventInfo.event_id);
				TB_show(
						this.Base.Language.Translate(3000170),
						'#TB_inline?height=100&width=300&inlineId=confirmeventrequestcancel',
						'', 1);
			},

			cancelConfirm : function() {
				eventID = this.currentConfirmID;

				// Remove Smoothbox
				TB_remove();
	
				// Ajax
				var bind = this;
				var request = new Request.JSON(
						{
						'method' : 'post',
						'url' : this.options.ajaxURL,
						'data' : {
							'task' : 'eventrequestcancel',
							'event_id' : eventID
						},
						'onComplete' : function(responseObject) {
							if ($type(responseObject) != "object"
									|| !responseObject.result
									|| responseObject.result == "failure") {
								alert(bind.Base.Language.Translate(3000153));
							}

							else {
								// event - Show/hide profile menu icons
								if ($('eventProfileMenuRequest')) {
									$('eventProfileMenuRequest').show();
									$('eventProfileMenuCancel').hide();
								}

								// user_event - Remove event row
								bind.removeRow();

								// user_event - Fix that calendar
								var eventMonthShow = $('seEventMonthShow_' + eventID);
								if (eventMonthShow) {
									var eventMonthDay = eventMonthShow.title;
									var eventCellElement = $('event_cell' + eventMonthDay);
									eventMonthShow.destroy();

									// Fix color
									if (eventCellElement
											&& eventCellElement.className != 'event_cell3'
											&& !eventCellElement
													.getElements('a').length) {
										$('event_cell' + eventMonthDay).className = 'event_cell1';
									}
								}
							}
						}
					});

				request.send();
	
				// Reset
				this.currentConfirmID = 0;
			},
	
			// Join
			join : function(eventID, eventRSVP) {
				if (!eventID)
					eventID = this.eventInfo.event_id;

				// Remove Smoothbox - for month view, might mess things up?
				if ($('TB_overlay'))
					TB_remove();

				// Ajax
				var bind = this;
				var request = new Request.JSON(
						{
							'method' : 'post',
							'url' : this.options.ajaxURL,
							'data' : {
								'task' : 'eventjoin',
								'event_id' : eventID
							},
							'onComplete' : function(responseObject) {
								if ($type(responseObject) != "object"
										|| !responseObject.result
										|| responseObject.result == "failure") {
									alert(bind.Base.Language.Translate(3000153));
								}

								else {
									// event - Switch profile buttons
									if ($('eventProfileMenuLeave')) {
										if (bind.eventInfo.event_inviteonly) {
											$('eventProfileMenuRequest').hide();
											$('eventProfileMenuCancel').show();
										}

										else {
											$('eventProfileMenuLeave').show();
											$('eventProfileMenuRSVP').show();
											if (bind.eventInfo.event_invite)
												$('eventProfileMenuInvite').show();
										}
									}

									// user_event - Switch buttons
									else if ($('seEvent_' + eventID)) {
										// User should never be able to join an
										// invite only event through the
										// user_event page
										$('seEvent_' + eventID).getElement(
												'.seEventUserOptionJoin').hide();
										$('seEvent_' + eventID).getElement(
												'.seEventUserOptionRsvp').show();
										$('seEvent_' + eventID).getElement(
												'.seEventUserOptionLeave').show();
										$('seEvent_' + eventID).getElement(
												'.seEventStatusAccept').hide();
										$('seEvent_' + eventID).getElement(
												'.seEventStatusRSVP').show();
									}

									// Send RSVP if set
									if ($type(eventRSVP)) {
										bind.rsvpConfirm(eventRSVP);
									}
								}
							}
						});

				request.send();

				// Reset
				this.currentConfirmID = 0;
			},

			// Request
			request : function(eventID) {
				if (!eventID)
					eventID = this.eventInfo.event_id;

				// Ajax
				var bind = this;
				var request = new Request.JSON(
						{
							'method' : 'post',
							'url' : this.options.ajaxURL,
							'data' : {
								'task' : 'eventrequestsend',
								'event_id' : eventID
							},
							'onComplete' : function(responseObject) {
								if ($type(responseObject) != "object"
										|| !responseObject.result
										|| responseObject.result == "failure") {
									alert(bind.Base.Language.Translate(3000153));
								}

								else {
									// event - Switch profile buttons
									if ($('eventProfileMenuRequest')) {
										$('eventProfileMenuRequest').hide();
										$('eventProfileMenuCancel').show();
									}
								}
							}
						});

				request.send();

				// Reset
				this.currentConfirmID = 0;
			},

			removeRow : function(eventID) {
				if (eventRow = $('seEvent_' + eventID)) {
					var prevRow = eventRow.getPrevious('tr'),
						nextRow = eventRow.getNext('tr'),
						firstRow = $$('#eventTable tr:first-child');
						prevRowIsTitle = prevRow && !prevRow.get('id');
						nextRowIsTitle = nextRow && !nextRow.get('id');
					
					// Destroy event row
					eventRow.destroy();
					
					// Destroy th if no more events for the date
					if ( (prevRowIsTitle && nextRowIsTitle) || (prevRowIsTitle && !nextRow) )
						prevRow.destroy();
						
					// Mark first row with first class
					if (firstRow)
						firstRow.setProperty('class', 'first');
					
					// Show no event message
					if (!$$('#eventTable tr').length && $('seEventNullMessage'))
						$('seEventNullMessage').show();
				}
			},

			// Invite dialog finctions
			doCheckAll : function() {
				var bind = this;
				
				$('invite_friendlist').getElements('input[type=checkbox]').each(function(el) {
					if (bind.inviteCounter.select && !el.checked) {
						el.checked = true;
						bind.memberInviteUpdate(el.value, true);
					}
					else if (!bind.inviteCounter.select && el.checked) {
						el.checked = false;
						bind.memberInviteUpdate(el.value, false);
					}
				});
				
				if (!bind.inviteCounter.select) { 
					bind.inviteCounter.select = true; 
					$('eventMemberInviteSelectAll').setProperty('html', bind.Base.Language.Translate(21000199));
				}
				else {
					bind.inviteCounter.select = false; 
					$('eventMemberInviteSelectAll').setProperty('html', bind.Base.Language.Translate(21000200));
				}
			},
			
			updateInviteCounter : function() {
				// inject notice box and update counter
				var inviteCounter = $('inviteCounter'),
					txt = '| (<b>' + this.inviteCounter.totalInvited + '</b>) friends selected',
					txterr = this.Base.Language.Translate(2000198);
				
				if (!inviteCounter) {
					var notice = new Element("span", {
						'id': 'inviteCounter',
						'html': txt,
						'style': 'margin:0 0 0 5px'
					});
					notice.inject($('invite_header'));
					$('memberInviteSendButton').erase('disabled');
				}
				// no user selected
				else if (this.inviteCounter.totalInvited == 0) {
					inviteCounter.set('html', txterr);
					inviteCounter.addClass('formError');
					$('memberInviteSendButton').setAttribute('disabled', 'disabled');
				}
				// update counter
				else {
					inviteCounter.set('html', txt);
					inviteCounter.set('class', '');
					$('memberInviteSendButton').erase('disabled');
				}
				
				$('formError').hide();
				window.parent.TB_syncSize(document.body);
			}
		});