// Instant win module
var instantWin = function () {
	var playElem = null; // Play area
	var fname = null;
	var winner = false;
	var playSwf = null;
	var registerUrl = false;
	
	var popup = new PopUp({windowOptions: {width: 960}});
	var oReq = new Request.HTML({
	    evalScripts: true
	}); // Request object
	
	// Initialize the instantWin module
	function init () {
		var page = '/instant-win/play?'+new Date().getTime();

		if (window.location.href.indexOf('#') !== -1) {
			if (window.location.href.substr(window.location.href.indexOf('#')+1) !== 'iw')
				page = window.location.href.substr(window.location.href.indexOf('#')+1);
		}
		
		playElem = $('instantwin');
		oReq.get(page);
	}
	
	// onSuccess event handler for requests
	function success () {
		update($defined(arguments[2]) ? arguments[2] : arguments[0]);
	}
	oReq.addEvent('onSuccess', success);
	
	// Due to IE problems need to embed flash this way
	function injectPlaySwf () {
		if (Browser.Engine.trident) {
			$('slots').set('html', '<object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="565" height="270" title="blah" id="playswf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param name="movie" value="/static/swf/instantwin.swf" /><param name="quality" value="high" /><param name="flashVars" value="winner='+winner+'" /><embed src="/static/swf/instantwin.swf" FlashVars="winner='+winner+'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="565" height="270"></embed></object>');
			playSwf = $('playswf');
		} else {
			playSwf = new Swiff('/static/swf/instantwin.swf', {
				width: 565,
				height: 270,
				id: 'poop',
				name: 'work',
				attributes: {name: 'work'},
				properties: {
					name: 'work'
				},
				vars: {
					winner: winner
				}
			});

			playSwf.inject($('slots'));
			playSwf = playSwf.toElement();
		}
	}

	function injectClosedFlash() {
		if (Browser.Engine.trident) {
			$('slots').set('html', '<object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="565" height="270" title="blah" id="playswf" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"><param name="movie" value="/static/swf/closedflash.swf" /><param name="quality" value="high" /><param name="flashVars" value="winner='+winner+'" /><embed src="/static/swf/closedflash.swf" FlashVars="winner='+winner+'" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="565" height="270"></embed></object>');
			playSwf = $('playswf');
		} else {
			playSwf = new Swiff('/static/swf/closedflash.swf', {
				width: 565,
				height: 270,
				id: 'poop',
				name: 'work',
				attributes: {name: 'work'},
				properties: {
					name: 'work'
				},
				vars: {
					winner: winner
				}
			});
			
			playSwf.inject($('slots'));
			playSwf = playSwf.toElement();
		}
	}
	
	// Empty slot area and update with html
	function update (html) {
		if (playElem && playElem != null) {
			playElem.empty();
			playElem.innerHTML = html;

			// If slots elem is present inject flash
			var slots = playElem.getElement('#slots');
			if ($defined(slots)) {
				if (slots.hasClass('demo')) {
					var demoswf = new Swiff('/static/swf/homeflash.swf', {
						width: 565,
						height: 270,
						vars: {
							winner: winner
						}
					});
					slots.adopt(demoswf);
				} else if (slots.hasClass('closed')) {
					injectClosedFlash();
				} else {
					injectPlaySwf();
				}
			}

			if (Browser.Engine.trident && Browser.Engine.version < 7) {
				var headings = playElem.getElements('h3');
				headings.each(function (heading) {
					heading.setStyle('behaviour', 'url("/iepngfix.htc")');
				});
			}

			// If the req html has links make links submit asyncronously.
			var links = playElem.getElements('a.ajax');
			if ($defined(links)) {
				links.each(function(link) {
					link.href = 'javascript:instantWin.req.get("'+link.href+'");';
				});
			}

			popup.prepPopElems(popup.getPopElems(playElem));

			// If the req html has forms make forms submit asyncronously.
			var forms = playElem.getElements('form');
			if ($defined(forms)) {
				forms.each(function(form) {
					if (form.hasClass('loginform')) {
						prepLoginForm(form);
					} else if (form.hasClass('registerform')) {
						prepRegisterForm(form);
					} else if (form.hasClass('activationform')) {
						prepActivationForm(form);
					} else if (form.hasClass('claimform')) {
						prepClaimForm(form);
					} else if (form.hasClass('tellfriend')) {
						prepTellFriendForm(form);
					}

					form.set('submit', '1');

					form.getElements('input[type=text]').each(function(input) {
						var label = form.getElement('label[for='+input.get('id') +']');

						if (label && input.get('value').length < 1) {
							label.addClass('hide');
							input.set('value', label.get('text'));

							input.addEvent('focus', function() {
								if (input.get('value') == label.get('text')) {
									input.set('value', '');
								}
							});

							input.addEvent('blur', function() {
								if (input.get('value').length < 1) {
									input.set('value', label.get('text'));
								}
							});
						}
					});
				});
				help.prep();
			}
		}
	}

	function prepTellFriendForm (form) {
		form.set('send', {url: form.get('action'), method: form.get('method'), onSuccess: success});

		var valid = true;

		form.addEvent('submit', function(e) {
			valid = form.getElements('input').map(function (input) {
				var result = true;

				var id = input.get('id');
				var label = form.getElement('label[for='+id+']');
				var value = input.get('value');

				if (id == 'email' || id == 'friendemail') {
					result = /^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/.test(value);
				} else {
					if ($defined(label) && (label.get('text') == value || value.length < 1)) {
						result = false;
					}
				}

				if (!result) {
					input.addClass('error');
				} else {
					input.removeClass('error');
				}

				return result;
			}).every(function(res) {return res;});

			if (valid) {
				form.send();
			}

			return false;
		});
	}

	function prepLoginForm (form) {
		var valid = true;
		
		form.set('send', {url: form.get('action')+'?'+new Date().getTime(), method: form.get('method'), onSuccess: success});
		
		form.addEvent('submit', function() {
			var login = form.getElement('input#login');
			
			if (/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/.test(login.get('value'))) {
				form.send();
			} else {
				login.addClass('error');
			}
			
			return false;
		});
	}
	
	function prepActivationForm (form) {
		var valid = true;

		form.set('send', {url: form.get('action')+'?'+new Date().getTime(), method: form.get('method'), onSuccess: success});

		form.addEvent('submit', function() {
			var login = form.getElement('input#activateemail');

			if (/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/.test(login.get('value'))) {
				form.send();
			} else {
				login.addClass('error');
			}

			return false;
		});
	}

	function prepRegisterForm (form) {
		var valid = true;
		
		$$('#registerform #optin').addEvent('click', updateOptIn);
		$$('#registerform #optin').addEvent('keyup', updateOptIn);
		
		form.set('send', {url: form.get('action'), method: form.get('method'), onSuccess: success});
		
		form.addEvent('submit', function(e) {
			e.preventDefault();
			valid = form.getElements('input').map(function (input) {
				var result = true;
				
				var id = input.get('id');
				var label = form.getElement('label[for='+id+']');
				if (label == null) {
					label = form.getElement('label[for="extra['+id+']"]')
				}
				var value = input.get('value');
				
				switch (id) {
					case 'reg-email':
						if (!/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/.test(value)) {
							result = false;
						}
					case 'reg-fname': case 'reg-lname': case 'reg-postcode': case 'reg-address':
						if (label && label.get('text') == value || value.length < 1) {
							result = false;
						}
					break;
					case 'terms':
						if (!input.get('checked')) {
							if (label) label.addClass('error');
							result = false;
						} else {
							if (label) label.removeClass('error');
						}
					break;
				}
				
				if (!result) {
					input.addClass('error');
				} else {
					input.removeClass('error');
				}
				
				return result;
			}).every(function(res) {return res;});
			
			if (valid) {
				form.send();
			}
			
			return false;
		});
	}

	function prepClaimForm (form) {
		var valid = false;

		form.set('send', {url: form.get('action'), method: form.get('method'), onSuccess: success});

		form.addEvent('submit', function() {
			valid = form.getElements('input').map(function (input) {
				var id = input.get('id');
				var label = form.getElement('label[for='+id+']');
				var value = input.get('value');

				if (id != 'address2') {
					if ($defined(label) && (label.get('text') == value || value.length < 1)) {
						input.addClass('error');
						return false;
					} else {
						input.removeClass('error');
						return true;
					}
				} else {
					return true;
				}
			}).every(function(res) {return res;});

			if (valid) {
				form.send();
			}

			return false;
		});
	}
	
	/*
	 * Function called by flash to get result of user pressing play
	 */
	function play () {
		// Ajax call sent to get result and spins left
		var reqJson = new Request.JSON({
			evalScripts: true,
			url: 'instant-win/play/json?'+new Date().getTime(),
			onSuccess: playSuccess
		});
		reqJson.get();
	}
	
	/*
	 * Request.JSON onSuccess handler passes flash results and updates
	 * token with new plays left
	 */
	function playSuccess (json, text) {
		if ($defined(json)) {
			fname = $('playername').get('text');
			updateToken(json.plays);
			
			Swiff.remote(playSwf, 'sendResult', json.result, json.plays, fname);
		}
	}

	function clearCopy() {
		$$('.copy').setStyle('display', 'none');
	}


	function updateToken (plays) {
		$('plays-left-token').set('html', plays);
	}
	
	function updateOptIn() {
		if ($$('#registerform #optin:checked')[0]) {
			$$('#registerform #iw-optin').set('value', '2075812080');
		} else {
			$$('#registerform #iw-optin').set('value', '');
		}
	}

	function setRegisterUrl(url) {
		registerUrl = url;
	}

	function getRegister() {
		if (registerUrl) {
			this.req.get(registerUrl);
		}
	}

	/*
	 * Returns public methods and properties
	 */
	return {
		init: init,

		// Add time to end of ajax request to stop IE 7 Cacheing
		req: function() {
			return {
				get: function(url) {
					oReq.get(url+'?'+new Date().getTime());
				}
			};
		}(),
		play: play,
		clearCopy: clearCopy,
		setWinner: function(name) {
			winner = name;
		},
		// Function to set the users name
		setName: function (name) {
			fname = name;
		},
		injectClosedFlash: injectClosedFlash,
		setRegisterUrl: setRegisterUrl,
		getRegister: getRegister
	}
}();

window.addEvent('domready', function () {
    instantWin.init();
});