(function ($) {
$.fn.register = function(options) {
	var opts = $.extend($.fn.register.defaults, options);
	return this.each(function(){
		
		var $widget = $(this);
		var filter = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
		
		function checkCharacters (ev, el) {
			var code = ev.which;
			var c = String.fromCharCode(ev.which);
			
			var tolong = false;
			// get msg elem to show when test fails
			var msgID = el.attr("rt_message");
			var msgText = el.attr("rt_text");
			var msgLength = el.attr("rt_length");
		
			if (msgLength) {
			    if (el.length >= msgLength) {
    			    //msgText = "A maximum of " + msgLength + " characters allowed."; 
			    msgText = _VARS.max_len_warning_text.max + msgLength + _VARS.max_len_warning_text.chars;
    			    tolong = true;
    			}
			}

			// don't filter control keys (FF sets charCode to 0 for function keys)
			var keySafe = ((ev.charCode == 0) || (ev.ctrlKey || ev.altKey) || (code < 32));
		
			// get the regex ruleset; don't filter if it's empty
			var reStr = el.attr("rt_allowed");
			keySafe = (keySafe || reStr == "");

			// test the regex rule
			var legalChars = new RegExp(reStr);
			var keySafe = (keySafe || legalChars.test(c));
		
			if (tolong) {
		    	keySafe = false;
			}
			
			if (!keySafe) {
				// show/hide the fail msg
				$('#' + msgID).empty().html(msgText);
				$('#' + msgID).show();
				 
				// eat event
				if (ev.preventDefault) ev.preventDefault();
				if (ev.returnValue) ev.returnValue = false;
				return false;
			}
			$('#' + msgID).hide();
			return true;
		}
		
		function login_redirect () {
			var returnTo = opts.returnTo;
			
			if (returnTo.indexOf('user_register') >= 0) {
				returnTo = '/index.php';
			}
			
			// Make sure it's the absolute path
			if(returnTo.substring(0,1) != "/" && returnTo.substring(0,4) != "http") {
				returnTo = "/" + returnTo;
			}
			
			window.location.replace(returnTo);
			return true;
		}

		function displayErrorMsg (el, msg) {
			$('#' + el).empty().html(msg);
			$('#' + el).show();
		}

		function processForm(el, form, url) {
			var fields = "";
		 	fields = $(form).serialize();
			fields += '&callBack=' + opts.callBack;

			$('#rs_ErrMsg').empty();
			$(el).hide();
			$('#rs_Busy').show();

			$.post(url,fields,function(data) {
				processResponce(data,el); 
			});
		}

		function processResponce (data, el) {
			if (data.match(/Success/)) {
				login_redirect();
				return true;
			}

			$('#rs_ErrMsg').html(data).show();
			$('#rs_Busy').hide();
			$(el).slideDown('fast');

			if  (el == '#rs_joinNowDiv') {
				$('#password1').val('');
				$('#password2').val('');
			}

		}  // processResponce()

		function validateForm(el) {
			var fieldName = el.attr('name');
			var fieldVal  = el.val();
			var errField  = el.attr('rt_message');
				
			if ((el.attr('type') != 'checkbox') &&  fieldVal == '') {
				displayErrorMsg(errField, _VARS.validateForm.blank);
				return false;
			} 

			switch (fieldName) {
				case 'name':
					if ($('#nameChecked').val() != fieldVal && errField) {
						$('#nameChecked').val(fieldVal);
						$.get('/user_register_check.php',"n=" + fieldVal + "&checkfield=true",function(data) {
							if (!fieldChecked(data,errField, _VARS.validateForm.user_name + fieldVal + _VARS.validateForm.already_taken)) return false;
						});
					}
					break;
				case 'password1':
					if (fieldVal.length < 4) {
						displayErrorMsg(errField, _VARS.validateForm.passwords_len);
						return false;
					}
					break;
				case 'password2':
					if ($('#password1').val() != fieldVal) {
						displayErrorMsg(errField, _VARS.validateForm.passwords_match);
						return false;
					}
					break;
				case 'email':
					if (!filter.test(fieldVal)) {
						displayErrorMsg(errField, _VARS.validateForm.valid_email);
						return false;
					}
					var checkEmail = $(el).attr('rt_checkEmail');
					checkEmail = true;
					if ($('#emailChecked').val() != fieldVal && checkEmail) {
						$('#emailChecked').val(fieldVal);
						$.get('/user_register_check.php',"e=" + fieldVal + "&checkfield=true",function(data) {
							if (!fieldChecked(data,errField, _VARS.validateForm.email + fieldVal + _VARS.validateForm.in_use)) return false;
						});
					}
					break;
				case 'email2':
					if (!filter.test(fieldVal)) {
						displayErrorMsg(errField, _VARS.validateForm.valid_email);
						return false;
					}
					if ($('#email').val() != fieldVal) {
						displayErrorMsg(errField, _VARS.validateForm.emails_match);
						return false;
					}
					break;
				case 'UA':
					if ($('#UA').attr('checked') == false) {
						displayErrorMsg(errField, _VARS.validateForm.agreement);
						return false;
					}
					break;
				default:
					break;		
			}
			$('#' + errField).hide();
			return true;
		}

		function fieldChecked (data, el, msg) {
		    if (data.match(/SUCCESS/) && (data.indexOf(1) > 0)) {
				$('#' + el).html(msg);
				$('#' + el).show();
				return false;
	    	}
			$('#' + el).hide();
			return true;
		}
		
		this.init = function() {
			$widget.jqm({modal: true});
			$widget.draggable();
			
			if( $("#returnTo").length ) {
				// Set the returnTo value
				opts.returnTo = $("#returnTo").val();
			}
			
			$('#joinSubmit').click(function() {
				var pass = false;
				$('#nameChecked').val('');
				$('#emailChecked').val('');
				$('#joinNowForm input:text, #joinNowForm input:password, #joinNowForm input:checkbox').each(function() {
					if (!validateForm($(this))) {
						pass = false;
						return false;
					}
					else pass = true; 
				});
				if (pass)
					processForm('#rs_joinNowDiv','#joinNowForm','/user_register_confirm_modal.php');
			});

			$('#signInSubmit').click(function () {
				processForm('#rs_signInDiv','#signInForm','/user_login_confirm_modal.php');
			});

			$('#back').click(function() {
				wipeClean();
				hideErrors();
				$('#rs_joinNowDiv').hide();
				$('#rs_signInDiv').slideDown('fast');
				setModalTitle($widget,'<h1>' + opts.title + '</h1>');
			});

			$('#signInLink, .signinlink').click(function(){
				prepModal($widget, '<h1>' + opts.title + '</h1>');
				$('#rs_joinNowDiv').hide();
				$('#rs_signInDiv').show();
				$widget.jqmShow();
				return false;
			});


           

			if (opts.modalReg) {
				$('#showJoin').click(function () {
					wipeClean();
					hideErrors();
					$('#rs_signInDiv').hide();
					$('#rs_joinNowDiv').slideDown('fast');
					setModalTitle($widget,'<h1>' + _VARS.register_init.modal_title + '</h1>');
				});

				$('#joinNowLink').click(function(){
					prepModal($widget,'<h1>' + _VARS.register_init.modal_title + '</h1>');
					$('#rs_signInDiv').hide();
					$('#rs_joinNowDiv').show();
					$widget.jqmShow();
					return false;
				});
			}

			$('#joinNowForm input:text,#joinNowForm input:password').blur(function() {
				validateForm($(this));
			});

			$('#username').keypress(function (ev) {
				checkCharacters(ev, $(this));
			});

			$('#email').keypress(function (ev) {
				checkCharacters(ev, $(this));
			});

			$('#signInForm').keypress(function(ev) {
				if (ev.which == 13) {
					$('#signInSubmit').click();
					return false;
				}
			});

			$('#joinNowForm').keypress(function(ev) {
				if (ev.which == 13) {
					$('#joinSubmit').click();
					return false;
				}
			});

			$(document).keypress(function(ev) {
				if (ev.charCode == 27)
					$widget.jqmHide();
			});
		}
		this.init();
	});	
};
$.fn.openPrompt = function(options) {
	options = $.extend($.fn.register.defaults, options);
	$widget = $('#'+ options.obj);
	prepModal($widget,'<h1>'+ options.title + '</h1>', options.wipeClean);
	if (options.openSign) { 
		$('#rs_signInDiv').show();
		$('#rs_joinNowDiv').hide();
	}
	else {
		$('#rs_joinNowDiv').show();
		$('#rs_signInDiv').hide();
	}
		
	$widget.jqmShow();
	return false;
};

$.fn.openJoinNow = function(options) {
	options = $.extend($.fn.register.defaults, options);
	var widget = $('#'+ options.obj);
	prepModal(widget, '<h1>'+ options.title + '</h1>');
	if (options.openSign) { 
		$('#rs_signInDiv').show();
		$('#rs_joinNowDiv').hide();
	}
	else {
		$('#rs_joinNowDiv').show();
		$('#rs_signInDiv').hide();
	}

	$('#uid').val(options.uid);
	$('#currEmail').val(options.currEmail);
	$('#currentEmail').html(options.currEmail);
	
	if (options.backLink === 'hide')
	{
		$('#backLink').addClass('hidden');
	}

	if (options.newUpsellTxt !== '')
	{
		$('#rs_upSell').html(options.newUpsellTxt);
	}
	
	if (options.upSellTxt === 'show')
	{
		$('#rs_upSell').removeClass('hidden');
	}
	
	widget.jqmShow();
	return false;
}

function prepModal (obj, title, wc) {
	// Making the last var optional:
	var wipe_clean = wc || $.fn.register.defaults.wipeClean;
	
	$('#rs_Busy').hide();
	hideErrors();
	if(wipe_clean)
	{
		wipeClean();
	}
	setModalTitle(obj, title);
} // prepModal()

function setModalTitle (obj, title) {
	obj.find('#jqmTitleText').html(title);
} // setModalTitle()

function wipeClean () {
	$('#register_signin input:text,#register_signin input:password').each(function() {
		$(this).val('');
	});
	$('.inlineMsg').hide();
} // wipeClean()
		
function hideErrors () {
	$('#rs_ErrMsg').empty().hide();
} // hideErrors()

$.fn.register.defaults = {
	returnTo:		'/index.php',
	title:		_VARS.register_defaults.title,
	obj:			'register_signin',
	openSign:		true,
	callBack:		'',
	modalReg:		true,
	wipeClean:	true
};
})(jQuery); 
