/*
	MODAL WINDOW
	Initial Code: Marc, johnnycache, pixelchutes, horseweapon @ forum.mootools.net
	Revised by Ryan Brooks (rechargemedia.com) to be a bit more usable for form content.
	@TODO : Templating using .substitute in a new class.
	@TODO : Modal Base Class, Profile controls class extend base
*/
var Modal = new Class({
	Implements: [Events, Options],
	options: {
		speed: 0,
		maskOpacity: 0.7,
		maskColor: '#000000',
		width: '801px',
		height: 'auto',
		classPrefix: 'Modal',
		onHide: $empty,
		onShow: $empty,
		onStart: $empty,
		loginForm: $empty,
		placeholderSrc: '/templates/default/images/progress-bar.gif',
		groups: {},
		messages: {
			confirmMessage: 'You have unsaved text. Are you sure you wish to discard it?',
			needLogin: 'You have to be logged in to do that!',
			sessionExpired: 'Your session has expired. Please save your data and login again.',
			requestSessionExpired: 'Your request was sent, but it appears as though your session has expired. Please try again.',
			messageSent: 'Your message was successfully sent!',
			requestSent: 'Your request was successfully sent!',
			requestCancelled: 'Your request was successfully cancelled!',
			reportSent: 'Your report was successfully sent!',
			requestError: 'Your request was sent but an error was encountered: ',
			requestFailure: 'Sorry, your request could not be sent at this time. Please try again later.',
			requestNetworkFailure: 'Sorry, your message could not be sent at this time, possibly due to a network error. Please try again later.',
			inviteSent: 'Your group invitation was successfully sent!'
		}
	},
	getTemplate: function(t)
	{
		switch(t)
		{
			case 'message':
				return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><ul class="dataList"><li class="element-group"><label>To: {userName}</label></li><li class="element-group"><label for="subject" class="required">Subject<strong>*</strong></label> <input type="text" name="subject" id="subject" value="" class="medium" /></li><li class="element-group"><label for="message" class="required">Message<strong>*</strong></label> <textarea name="message" id="message" class="medium"></textarea></li><li class="submit-group"><input type="hidden" name="send_to" value="{userName}" /><button name="save" id="save" type="submit" class="submit">Submit</button></li></ul></form></div><div class="clear-both">';
			break;
			case 'add-friend':
				 return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><p>You\'re about to add <strong>{userName}</strong> to your friends.<br /><br />We\'ll notify them, but it will but up to them to approve or decline the request.</p><ul class="dataList"><li class="element-group"><label for="message" class="optional">Optional Message</label> <textarea name="message" id="message" class="medium"></textarea></li><li class="submit-group"><button name="save" id="save" type="submit" class="submit">Submit</button><input type="hidden" name="send_to" value="{userName}" /></li></ul></form></div><div class="clear-both">';
			break;
			case 'cancel-friend-request':
				 return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><p>Are you sure you want to cancel your friend request with <strong>{userName}</strong>?<br /><br />It might seem a little odd since we have already notified them.</p><ul class="dataList"><li class="submit-group"><button name="save" id="save" type="submit" class="submit">Submit</button><input type="hidden" name="send_to" value="{userName}" /></li></ul></form></div><div class="clear-both">';
			break;
			case 'invite-group-empty':
				return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><p><strong>Whoops!</strong></p><p>You have not created any groups!<br /><br />Would you like to do that <a href="/my/groups/create"><strong>now</strong></a>? </div><div class="clear-both">';
			break;
			case 'invite-group':
				return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><p>You\'re about to invite <strong>{userName}</strong> to one of your groups.<br /><br />We\'ll notify them, but it will but up to them to approve or decline the invitiation.</p><ul class="dataList"><li class="element-group"><label for="invite_to" class="required">Invite To<strong>*</strong></label><select name="invite_to" id="invite_to"><option value="">--Choose a group--</option></select></li><li class="submit-group"><input type="hidden" name="invite_user" value="{userName}" /><button name="save" id="save" type="submit" class="submit">Submit</button></li></ul></form></div><div class="clear-both">';
			break;
			case 'image-invite-group':
				return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><p>You\'re about to invite the image <strong>{imageName}</strong> by <strong>{userName}</strong> to one of your groups.<br /><br />We\'ll notify the member of your photo invitation, however it will be up to the user to approve or decline the request.<br /><br />Please remember that if {userName} is not a member, they will have to join the group as well.</p><ul class="dataList"><li class="element-group"><label for="invite_to" class="required">Invite Image To<strong>*</strong></label><select name="invite_to" id="invite_to"><option value="">--Choose a group--</option></select></li><li class="submit-group"><input type="hidden" name="invite_image" value="{imageId}" /><button name="save" id="save" type="submit" class="submit">Submit</button></li></ul></form></div><div class="clear-both">';
			break;
			case 'add-watchlist':
				return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><ul class="dataList"><li class="element-group"><label for="message" class="required">Notes</label> <textarea name="watchlist_notes" id="watchlist_notes" class="medium"></textarea><p class="form-hint"><em>These are notes you can add to the user, such as why you\'re adding them to your watchlist. These notes are private to you, and not visible to <strong>{userName}</strong>.</em></p></li><li class="submit-group"><input type="hidden" name="watch_user" value="{userName}" /><button name="save" id="save" type="submit" class="submit">Submit</button></li></ul></form></div><div class="clear-both">';
			break;
			case 'remove-watchlist':
				 return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><p>Are you sure you want to stop watching <strong>{userName}</strong>?</p><ul class="dataList"><li class="submit-group"><button name="save" id="save" type="submit" class="submit">Submit</button><input type="hidden" name="watch_user" value="{userName}" /></li></ul></form></div><div class="clear-both">';
			break;
			case 'report-user':
				return '<div class="modalAvatar"><img src="{imageSrc}" alt="" /></div><div class="modalForm"><form method="post" action="#"><p><span class="warning">Warning:</span> You are about to report this user. Have you read our <a href="#"><strong>Reporting Policies</strong></a>?.</p> <ul class="dataList"><li class="element-group"><label for="report_reason" class="required">Reason<strong>*</strong></label><select name="report_reason" id="subject"><option value="">--Choose a reason for reporting--</option><option value="Offensive Language">Offensive Language</option><option value="Inappropriate Comments or Messages">Inappropriate Comments or Messages</option><option value="Offensive Photo(s)">Offensive Photo(s)</option><option value="Unflagged +18 Photo(s)">Unflagged +18 Photo(s)</option><option value="Copyright Infringement">Copyright Infringement</option></select></li><li class="element-group"><label for="message" class="required">Additional Information<strong>*</strong></label> <textarea name="additional_information" id="additional_information" class="medium"></textarea></li><li class="submit-group"><input type="hidden" name="report_user" value="{userName}" /><button name="save" id="save" type="submit" class="submit">Submit</button></li></ul></form></div><div class="clear-both">';
			break;
		}
	},
	bindClickEvents: function()
	{
		$('portfolio-send-message').addEvent(
			'click',
			function()
			{
				window.scrollTo(0, 0);
				var template = this.getTemplate('message').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
				this.show
				(
					new Element('div').set('html', template), {'title': 'Send Message'}
				);
				this.bindMessageListeners();
				return false;
			}.bind(this)
		);
		if($('portfolio-add-friend') != null)
		{
			$('portfolio-add-friend').addEvent(
				'click',
				function()
				{
					window.scrollTo(0, 0);
					var template = this.getTemplate('add-friend').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
					this.show
					(
						new Element('div').set('html', template), {'title': 'Add to Friends'}
					);
					this.bindFriendListeners();
					return false;
				}.bind(this)
			);
		}
		if($('portfolio-cancel-friend-request') != null)
		{
			$('portfolio-cancel-friend-request').addEvent(
				'click',
				function()
				{
					window.scrollTo(0, 0);
					var template = this.getTemplate('cancel-friend-request').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
					this.show
					(
						new Element('div').set('html', template), {'title': 'Cancel Friend Request'}
					);
					this.bindCancelFriendListeners();
					return false;
				}.bind(this)
			);
		}
		$('portfolio-invite-group').addEvent(
			'click',
			function()
			{
				window.scrollTo(0, 0);
				var jrequest = new Request.JSON({
					url: '/my/json/get-groups/', 
					method: 'get',
					onComplete: function(resp){
						if(resp.ResultCount !== '0')
						{
							var template = this.getTemplate('invite-group').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
							this.show
							(
								new Element('div').set('html', template), {'title': 'Invite to Group'}
							);
							$each(resp.Results, function(value, key){
								var option = new Element('option');
								option.setProperty("value", key);
								option.set('html', value); 
								this.message.getElement('select').adopt(option);
							}.bind(this))
							this.bindGroupListeners();
						}
						else
						{
							var template = this.getTemplate('invite-group-empty').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
							this.show
							(
								new Element('div').set('html', template), {'title': 'Invite to Group'}
							);
							$each(resp, function(value, key){
								this.options.groups.key = value;
							}.bind(this))
						}
					}.bind(this)
				}).send();
				return false;
			}.bind(this)
		);
		if($('img-group-invite') != null)
		{
			$('img-group-invite').addEvent(
				'click',
				function()
				{
					window.scrollTo(0, 0);
					var jrequest = new Request.JSON({
						url: '/my/json/get-groups/', 
						method: 'get',
						onComplete: function(resp){
							if(resp.ResultCount !== '0')
							{
								var imageName = $('imageTitle').get('text');
								var imageSrc = $('portfolioImgThumb').get('src');
								var el = $('favorite-image-img');
								var imageId = el.getParent().getChildren('span')[0].get('id');
								var template = this.getTemplate('image-invite-group').substitute(
									{
										imageId: imageId,
										imageName: imageName,
										imageSrc: imageSrc,
										userName: this.options.userName
									}
								);
								this.show
								(
									new Element('div').set('html', template), {'title': 'Invite Image to Group'}
								);
								$each(resp.Results, function(value, key){
									var option = new Element('option');
									option.setProperty("value", key);
									option.set('html', value); 
									this.message.getElement('select').adopt(option);
								}.bind(this))
								this.bindImageInviteListeners();
							}
							else
							{
								var template = this.getTemplate('invite-group-empty').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
								this.show
								(
									new Element('div').set('html', template), {'title': 'Invite Image to Group'}
								);
								$each(resp, function(value, key){
									this.options.groups.key = value;
								}.bind(this))
							}
						}.bind(this)
					}).send();
					return false;
				}.bind(this)
			);
		}
		if($('portfolio-add-watchlist') != null)
		{
			$('portfolio-add-watchlist').addEvent(
				'click',
				function()
				{
					window.scrollTo(0, 0);
					var template = this.getTemplate('add-watchlist').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
					this.show
					(
						new Element('div').set('html', template), {'title': 'Add to Watchlist'}
					);
					this.bindWatchlistListeners();
					return false;
				}.bind(this)
			);
		}
		if($('portfolio-remove-watchlist') != null)
		{
			$('portfolio-remove-watchlist').addEvent(
				'click',
				function()
				{
					window.scrollTo(0, 0);
					var template = this.getTemplate('remove-watchlist').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
					this.show
					(
						new Element('div').set('html', template), {'title': 'Add to Watchlist'}
					);
					this.bindRemoveWatchlistListeners();
					return false;
				}.bind(this)
			);
		}
		$('portfolio-report-user').addEvent(
			'click',
			function()
			{
				window.scrollTo(0, 0);
				var template = this.getTemplate('report-user').substitute({imageSrc: this.options.userAvatar, userName: this.options.userName});
				this.show
				(
					new Element('div').set('html', template), {'title': 'Report User'}
				);
				this.bindReportListeners();
				return false;
			}.bind(this)
		);
	},
	initialize: function(options) {
		this.loginForm = new Element('div');
		this.loginForm.load('/login-raw');
		this.setOptions(options);
		this.isShowing = false;
		this.mask = new Element('div', {
			'class':this.options.classPrefix+'Mask',
			'styles':{
				'position':'absolute',
				'top': 0,
				'left': 0,
				'opacity': 0,
				'z-index': 9999,
				'background-color': this.options.maskColor
			},
			'events': {
				'click':this.hide.bindWithEvent(this)
			}
		});
		this.message = new Element('div',{
			'class':this.options.classPrefix+'Message',
			'styles':{
				'height':this.options.height
			}
		});
		this.title = new Element('div',{
			'class':this.options.classPrefix+'Title'
		});
		this.footer = new Element('div',{
			'class':this.options.classPrefix+'Footer'
		});
		this.close = new Element('div',{
			'class':this.options.classPrefix+'Close'
		}).adopt(new Element('a', {
				'href':'#',
				'text':'Close',
				'events':{
					'click':this.hide.bindWithEvent(this)
				}
		}));
		this.pop = new Element('div', {
			'class':this.options.classPrefix+'Pop',
			'styles':{
				'position': 'absolute',
				'visibility': 'hidden',
				'width': this.options.width,
				'left':'50%',
				'z-index': 10000
			}
		}).adopt(this.title, this.message, this.footer, this.close);
		this.fx = { 
			mask: new Fx.Tween(this.mask, {property: 'opacity', duration: this.options.speed}), 
			slide: new Fx.Tween(this.pop, {property: 'top', duration:this.options.speed}) 
		};
		window.addEvents({
			'keydown': this.hide.bindWithEvent(this),
			'resize': this.update.bindWithEvent(this),
			'scroll': this.update.bindWithEvent(this)
		});
		this.fireEvent('onStart');
	},
	requireLogin: function() {
		var jrequest = new Request.JSON({
			url: '/json/logged-in/', 
			method: 'get',
			onComplete: function(resp){
				if(resp == null) {
					this.setLoggedIn('no');
				} else {
					this.setLoggedIn(resp.loggedIn);
				}
			}.bind(this)
		}).send();
	},
	setLoggedIn: function(response)
	{
		this.loggedIn = response;
	},
	getLoggedIn: function()
	{
		return this.loggedIn;
	},
	show: function(el, options)
	{
		this.fireEvent('onShow');
		this.message.empty();
		var v = this.getLoggedIn();
		if(v == 'no' || v == undefined)
		{
			el.empty();
			el.adopt(this.loginForm);
			$$(this.loginForm.getElements('input[name=redirect]')).set('value', window.location);
			options = {'title': this.options.messages.needLogin};
			this.options.disableEvents = true;
		}
		switch($type(el)) {
			case 'element':
				this.message.adopt(el.clone().cloneEvents(el));
				break;
			case 'string':
				this.message.set('html', el);
				break;
			default:
				return false;
				break;
		}
		if(options && options.title){
			this.title.set('html', options.title);
		}else{
			this.title.empty();
		} 
		if(options && options.width){
			this.pop.setStyle('width',options.width);
		}
		if(options && options.height){
			this.message.setStyle('height',options.height);
		}
		if(!this.isShowing)
		{
			$$('object', 'select').setStyle('visibility', 'hidden');
			$$('body').adopt(this.mask, this.pop);
			this.pop.setStyles({
				'top': window.getScroll().y - this.pop.getSize().y,
				'visibility':'visible',
				'marginLeft': -(this.pop.getSize().x/2)
			});
			this.mask.setStyles({
				'height': window.getSize().y,
				'width': window.getSize().x
			});
			this.fx.mask.start(this.options.maskOpacity);
			this.fx.slide.start(window.getScroll().y + (window.getSize().y/2 - this.pop.getSize().y/2));
			this.isShowing = true;
		}
	},
	hide: function(e) {
		if(e){
			var event = new Event(e);
			if((event.key && event.key != 'esc')||!this.isShowing){
				return;
			}
			event.stop();
		}
		var doConfirm = false;
		var children = [$(this.message).getElements('input[type=text]'), $(this.message).getElements('textarea')];
		$$(children).each(
			function(item)
			{
				if($(item).get('value').clean() != '')
				{
					doConfirm = true;
				}
			}
		);
		if(doConfirm == true)
		{
			if(confirm(this.options.messages.confirmMessage))
			{
				this.isShowing = false;
				$$('object', 'select').setStyle('visibility', 'visible');
				this.fx.slide.cancel();
				this.fx.slide.start(-this.pop.getSize().y).chain(function() {
					this.pop.setStyle('visibility','hidden').dispose();
					this.fx.mask.start(0).chain(function() {
						this.mask.dispose();
						this.fireEvent('onHide');
					}.bind(this));
				}.bind(this));
			}
		}
		else
		{
			this.isShowing = false;
			$$('object', 'select').setStyle('visibility', 'visible');
			this.fx.slide.cancel();
			this.fx.slide.start(-this.pop.getSize().y).chain(function() {
				this.pop.setStyle('visibility','hidden').dispose();
				this.fx.mask.start(0).chain(function() {
					this.mask.dispose();
					this.fireEvent('onHide');
				}.bind(this));
			}.bind(this));
		}
	},
	update: function(e) {
		if(e) e = new Event(e).stop();
		if(this.isShowing) {
			this.fx.slide.cancel();
			var size = window.getSize();
			var scrollSize = window.getScrollSize();
			this.mask.setStyles({
				'height': (size.y > scrollSize.y)?size.y:scrollSize.y,
				'width': size.x
			});
			this.fx.slide.start(window.getScroll().y + (window.getSize().y/2 - this.pop.getSize().y/2))
		}
	},
	validateField: function(el, errMsg)
	{
		try{el.getParent().getElements('p[class=form-errors]').each(function(el) { el.destroy();});}catch(E){}
		var val = el.get('value').clean();
		if(val == '')
		{
			msg = new Element('p', {'class': 'form-errors', 'text': errMsg, 'styles': {'margin-left': '0px'}});
			el.getParent().adopt(msg);
			return false;
		}
		return true;
	},
	bindMessageListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					if(!this.validateField(this.message.getElement('input[name=subject]'), 'Your subject is empty')) return false;
					if(!this.validateField(this.message.getElement('textarea[name=message]'), 'Your msg is empty')) return false;
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/send-message/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else parent.set('text', this.options.messages.messageSent);
							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindFriendListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/friend-request/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else
								{
									parent.set('text', this.options.messages.requestSent);
									$('friend-links').set('html', this.options.friendLinks.cancel);
									this.bindClickEvents();
								}
							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindCancelFriendListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/cancel-friend-request/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else
								{
									parent.set('text', this.options.messages.requestCancelled);
									$('friend-links').set('html', this.options.friendLinks.add);
									this.bindClickEvents();
								}
							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindGroupListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					if(!this.validateField(this.message.getElement('select[name=invite_to]'), 'Your group is empty')) return false;
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/invite-user/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else parent.set('text', this.options.messages.inviteSent);

							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindImageInviteListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					if(!this.validateField(this.message.getElement('select[name=invite_to]'), 'Your group is empty')) return false;
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/invite-image/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else parent.set('text', this.options.messages.inviteSent);

							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindWatchlistListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/watch-user/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else
								{
									parent.set('text', this.options.messages.requestSent);
									$('watchlist-links').set('html', this.options.watchlistLinks.remove);
									this.bindClickEvents();
								}
							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindRemoveWatchlistListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/stop-watching-user/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else
								{
									parent.set('text', this.options.messages.requestSent);
									$('watchlist-links').set('html', this.options.watchlistLinks.add);
									this.bindClickEvents();
								}
							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	},
	bindReportListeners: function(e)
	{
		if(this.options.disableEvents != true)
		{
			this.message.getElement('form').addEvent(
				'submit',
				function(e)
				{
					e.stop();
					this.requireLogin();
					if(this.loggedIn == 'no')
					{
						alert(this.options.messages.sessionExpired);
						return false;
					}
					if(!this.validateField(this.message.getElement('select[name=report_reason]'), 'Your reporting reason is empty')) return false;
					if(!this.validateField(this.message.getElement('textarea[name=additional_information]'), 'Your additional information is empty')) return false;
					msgForm = this.message.getElement('form');
					var parent = this.message.getElement('div[class=modalForm]');
					msgForm.set(
						'send',
						{
							url: '/my/json/report-user/',
							method: 'post',
							link: 'chain',
							onRequest: function()
							{
								parent.getChildren().dispose();
								parent.adopt(new Element('img', {src: this.options.placeholderSrc}));
							}.bind(this),
							onComplete: function(e)
							{
							}.bind(this),
							onSuccess: function(responseText, responseXML)
							{
								var jsonObj = JSON.decode(responseText, true);
								if(!jsonObj) parent.set('text', this.options.messages.requestSessionExpired);
								else if(jsonObj.Error == '1')
								{
									parent.set('text', this.options.messages.requestError + jsonObj.ErrorMsg);
								}
								else parent.set('text', this.options.messages.reportSent);

							}.bind(this),
							onFailure: function(xhr)
							{
								parent.set('text', this.options.messages.requestFailure);
							}.bind(this),
							onException: function(headerName, value)
							{
								parent.set('text', this.options.messages.requestNetworkFailure);
							}.bind(this)
						}
					);
					msgForm.send();
				}.bind(this)
			);
		}
	}
});