/**
*	Requires:
*	../styles/share.css
**/

// Send to a Friend
Share = {
	// parameters is to add any extra needed 
	// variables to post to share.php - must be in object notation
	parameters: {},
	shareContainer: null,
	containerChildren: null,
	charCountMax: 250,
	shareConfirmation: false,
	showingView: null,
	movieFinished: false,
	hidden: 1,
	shown: 0,
	inputDefaults: [],
	defaultsSet: false,
	shareId: 101,
	shareSendAgainSet: false,
	
	initOptions: function(args) {
		this.options = Object.extend({
			controller: $('moviecontroller'),
			sharecontainer: $('sharecontainer'),
			shareformid: 'shareform',
			sharetoggles: $$('.sharetoggle'),
			rnameinput: $('sharername'),
			remailinput: $('shareremail'),
			rname: $('rnametext'),
			snameinput: $('sharesname'),
			semailinput: $('sharesemail'),
			sname: $('snametext'),
			messageinput: $('sharemessage'),
			messagecharcount: $('sharecharcount'),
			message: $('sharepreviewmessage'),
			formsubmit: $('sendformsubmit'),
			sendingbtn: $('sendingbtn'),
			defaultShareMessageContainer: $('defaultShareMessage')
		}, args[0] || {});

		this.shareToggles = this.options.sharetoggles;
		this.shareContainer = this.options.sharecontainer;
		this.shareFormId = this.options.shareformid;
		this.shareForm = $(this.shareFormId);
		this.rNameInput = this.options.rnameinput;
		this.rEmailInput = this.options.remailinput;
		this.rName = this.options.rname;
		this.sNameInput = this.options.snameinput;
		this.sEmailInput = this.options.semailinput;
		this.sName = this.options.sname;
		this.messageInput = this.options.messageinput;
		this.messageCharCount = this.options.messagecharcount;
		this.message = this.options.message;
		this.formSubmit = this.options.formsubmit;
		this.sendingBtn = this.options.sendingbtn;
		
		var defaultShareMessageContainer = this.options.defaultShareMessageContainer;
		this.setDefaultMessage(defaultShareMessageContainer.innerHTML);
		//defaultShareMessageContainer.parentNode.removeChild(defaultShareMessageContainer);
		var shareBackMessage = $('shareBackMessage');
		if(shareBackMessage) this.setBackMessage(shareBackMessage.innerHTML);
		
	},
	
	toggleVideo: function() {
		var title = this.trackingDescription();
		var pageurl = window.location.href;
		AC.Tracking.trackPage({pageName: title, prop6: title, prop4: pageurl});
		
		this.initOptions(arguments);
		
		var controller = this.options.controller;
		this.toggleView(controller);
	},
	
	addValidation: function() {
		this.valid = new Validation(this.shareFormId, { onSubmit: false, onFormValidate: this.processForm.bind(this) });
		Validation.addAllThese([
			['required', 'This is a required field.', function (v) {
				$('shareform').enable();
				return !Validation.get('IsEmpty').test(v);
			}],
			['validate-email', 'Valid email address required.<br />Example: steve@mac.com', function (v) {
				$('shareform').enable();
				return Validation.get('IsEmpty').test(v) || /\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v)
			}]	
		]);
		
		Event.observe(this.shareForm, 'submit', function(evt) {
			Event.stop(evt);

			this.formSubmit.hide();
			this.sendingBtn.show();

			this.shareForm.disable();

			this.valid.validate();	
		}.bindAsEventListener(this));
		
		this.validationAdded = true;
	},
	
	toggleView: function(controller) {

			if(this.shown == 0) {
				this.shown = 1;
				this.hidden = 0;
				if($('main') && !$('main').hasClassName('shareactive')) $('main').addClassName('shareactive');
				if(controller) {
					controller.Stop();
					if(controller.controllerPanel.hasClassName('active')) controller.controllerPanel.removeClassName('active');
				}
				if(!this.validationAdded) this.addValidation();
				else this.valid.reset();
				this.buildForm();
				this.shareToggles[this.hidden].setStyle({visibility:'hidden'});
				new Effect.Appear(this.shareToggles[this.shown], {duration: 0.3});
			} else if(this.shown == 1) {
				this.shown = 0;
				this.hidden = 1;
				if($('main') && $('main').hasClassName('shareactive')) $('main').removeClassName('shareactive');
				if(controller && !controller.controllerPanel.hasClassName('active')) controller.controllerPanel.addClassName('active');
				this.shareToggles[this.hidden].hide();
				this.shareToggles[this.shown].setStyle({visibility: 'visible'});
				if(controller && controller.movie) {
					controller.movie.style.zIndex = "10000";
					if(!$('moviecontainer').hasClassName('loading')) {
						setTimeout(controller.Play.bind(controller), 100);
					}
				}
			}

	},
	
	updateCharCount: function(evt) {
		this.messageCharCount.innerHTML = this.charCountMax - this.messageInput.value.length;
	},
	
	buildForm: function() {
		if(this.shareConfirmation && this.shareForm) {
			this.shareForm.show();
			this.shareConfirmation.hide();
		}

		this.rName.innerHTML = this.rNameInput.value;
		this.sName.innerHTML = this.sNameInput.value;
		this.message.innerHTML = this.messageInput.value;
		
		this.setInputDefaults();
		this.updateCharCount();
		
		Event.observe(this.rNameInput, 'keyup', function(evt) {
			this.previewInput(this.rNameInput, this.rName);
		}.bind(this));
		Event.observe(this.sNameInput, 'keyup', function(evt) {
			this.previewInput(this.sNameInput, this.sName);
		}.bind(this));
		
		Event.observe(this.messageInput, 'keydown', function(evt) {
			var keyCode = (typeof evt.which !== "undefined") ? evt.which : evt.keyCode;
		    
			if(keyCode != 37 && keyCode != 38 && keyCode != 39 && keyCode != 40 && keyCode != 8) {
				if((this.messageInput.value.length) === this.charCountMax ) {
					if(evt.preventDefault) evt.preventDefault();
					else evt.returnValue = false;
				}
				else {
				
					if(this.messageInput.selectionStart) { 
						var endPos = this.messageInput.selectionEnd;
					}
					
					this.messageInput.focus();
					if(this.messageInput.selectionStart) {
						this.messageInput.selectionEnd = endPos;
					}
				}	
			}
			
		}.bind(this), false);
		
		Event.observe(this.messageInput, 'keyup', function(evt) {
			this.previewInput(this.messageInput, this.message);
			this.updateCharCount();
		}.bind(this));
		
		Event.observe(window, 'unload', function(evt) {
			this.inputDefaults.each(function(elem) {
				$(elem.id).value = elem.value;
			}.bind(this));
		}.bind(this));
	},
	
	setDefaultMessage: function(value) {
		//Only do it once
		if(!this._defaultMessage) {
			this.messageInput.value = value;
			this._defaultMessage = value;
		}
	},
	defaultMessage: function() {
		return this._defaultMessage;
	},
	
	setBackMessage: function(value) {
		$('backtovideoMessage').innerHTML = value;
	},
	backMessage: function() {
		return $('backtovideoMessage').innerHTML;
	},
	
	setInputDefaults: function() {
		if(!this.defaultsSet) {
			 $$('#shareform .default').each(function(elem) {
				this.inputDefaults.push({
					id: elem.id,
					value: elem.value
				});
			}.bind(this));
		
			this.inputDefaults.each(function(elem, i) {
				this.inputDefaults[elem.id] = elem;
			}.bind(this));

			// empty fields on enter
			$$('#shareform .default').each(function(field, i) {
				Event.observe(field, 'focus', function() { 
					if(field.hasClassName('default')) { 
						field.removeClassName('default');
						field.value = '';
					}
				});
				Event.observe(field, 'blur', function() {
					if(field.value == '')  {
						field.value = this.inputDefaults[i].value;
						if(!field.hasClassName('default')) field.addClassName('default');
						if(field == this.sNameInput) this.previewInput(field, this.sName);
						if(field == this.rNameInput) this.previewInput(field, this.rName);
					}
				}.bind(this));
			}.bind(this));
		
			this.defaultsSet = true;
		}
	},
	
	previewInput: function(formEl, previewEl) {
		if(previewEl.innerText) previewEl.innerText = formEl.value;
		else {
			// for Firefox 2
			var elText = document.createTextNode(formEl.value);
			previewEl.innerHTML = "";
			previewEl.appendChild(elText);
		}
	},
	
	trackingDescription : function() {
		if(!this._trackingDescription) {
			var trackingDescriptionMeta = document.getElementsByName("TrackingDescription")[0];
			var trackingDescription = trackingDescriptionMeta.getAttribute("content");
			if(!trackingDescription || trackingDescription.length === 0) {
				trackingDescription = AC.Tracking.pageName();
			}
			this._trackingDescription = trackingDescription;
		}
		return this._trackingDescription;
	},
	prop3ForTrackedEventNamed : function(userEventName) {
		return (this.trackingDescription()+" - "+userEventName);
	},
	buildConfirmation: function() {
		this.shareSendAgain = $('sharesendagain');
		this.shareConfirmation = $('shareconfirmation');
		if(!this.shareSendAgainSet) {
			var trackEventName = "Share: Send to another friend";
			Event.observe(this.shareSendAgain, 'click', function(evt) {
				Event.stop(evt);
				this.trackingDescription();
				AC.Tracking.trackClick({prop3: this.prop3ForTrackedEventNamed(trackEventName)}, $('sharesendagain'), 'o', trackEventName);
				this.previewInput(this.rNameInput, this.rName);
				new Effect.Fade(this.shareConfirmation);
				new Effect.Appear(this.shareForm, {duration: 0.3});
			}.bind(this));
			this.shareSendAgainSet = true;
		}
	},
	
	processForm: function(result, form) {
		if(!result) {
			this.sendingBtn.hide();
			this.formSubmit.show();
		}
		if(result) {
			var trackEventName = "Share: Send Email";
			AC.Tracking.trackClick({prop3: this.prop3ForTrackedEventNamed(trackEventName)}, $('sendingbtn'), 'o', trackEventName);

			var subject = $F(form['rname']) + ", " + $F(form['sname']) + " has sent you a video.";

			var params = form.serialize().toQueryParams();

			if(this.rNameInput.hasClassName('default')) params.rname = '';
			if(this.sNameInput.hasClassName('default')) params.sname = '';
			
			params['shareId'] = this.shareId;
			params['geo'] = "uk";
			Object.extend(params, this.parameters);
			
			if (typeof(params.copy) === 'undefined') params.copy = false;
			else params.copy = true;

			this.sendReq(params);
			
		}
	},
	
	acknowledgeComplete: function() { 
		try {
			new Effect.Fade(this.shareForm, {
				afterFinish: function(obj) {
					this.rNameInput.value = "";
					this.rEmailInput.value = "";

					this.rNameInput.value = this.inputDefaults[this.rNameInput.id].value;
					if(!this.rNameInput.hasClassName('default')) this.rNameInput.addClassName('default');
					
					this.rEmailInput.value = this.inputDefaults[this.rEmailInput.id].value;
					if(!this.rEmailInput.hasClassName('default')) this.rEmailInput.addClassName('default');		
					
					this.sendingBtn.hide();
					this.formSubmit.show();
					
					$('shareform').enable();
							
				}.bind(this)
			});
			
			this.buildConfirmation();
			new Effect.Appear(this.shareConfirmation, {duration: 0.3});
			
		} catch(e) {} 
	},

	sendReq: function(params) {
		var sharePhpUrl = params.sharePhpUrl || '/global/scripts/share.php';
		var send = new Ajax.Request(sharePhpUrl, {
			method: 'POST', 
			parameters: params, 
			
			onComplete: this.acknowledgeComplete.bind(this)
		})
	}

};
