/*
 * Valio.mobi
 * Copyright 2011, Valio
 */
log = function(text) {
    log.history = log.history || [];
    log.history.push(arguments);
    if (this.console) {
        console.log(text);
        //console.log( Array.prototype.slice.call(arguments) );
    };
};

var valio_mobi = {
	shopping_list: {},
    cookbook: {},
	ui: {},
	util: {}
};

$(document).bind("mobileinit", function(){
	$.extend(  $.mobile , {
    loadingMessage: "ladataan...",
		pageLoadErrorMessage: "Virhe sivun lataamisessa",
		defaultTransition: 'none'
  });

	$('div').live('pagebeforecreate.onetime', function() {
		$('body').removeClass('c-grade');
		$('div').die('pagebeforecreate.onetime');
	});

	$.mobile.page.prototype.options.backBtnText = "Takaisin";

	$('#recipe_search').live({
		pagecreate: function() {
			valio_mobi.ui.setupSearch('recipe_search');
			$('#recipe_search').die('pagecreate');
		},
		pageshow: function() {
			valio_mobi.ui.scrollToResults();
		}
	});

	$('#product_search').live({
		pagecreate: function() {
			valio_mobi.ui.setupSearch('product_search');
			$('#product_search').die('pagecreate');
		},
		pageshow: function() {
			valio_mobi.ui.scrollToResults();
		}
	});

	$('#shoppinglist').live('pagecreate', function(event) {
		
		if (valio_mobi.shopping_list.setup === undefined) {
			(shopping_list).apply(valio_mobi.shopping_list);
			valio_mobi.shopping_list.parent = valio_mobi;
		};
		valio_mobi.shopping_list.setup();
		//	$('#shoppinglist').die('pagecreate');
	});

	$('.section_recipe').live('pagecreate', function(event) {
		// todo: write a class loader of some sort
		if (valio_mobi.shopping_list.setup === undefined) {
			(shopping_list).apply(valio_mobi.shopping_list);
			valio_mobi.shopping_list.parent = valio_mobi;
		};
		valio_mobi.shopping_list.setupSharing();
		valio_mobi.ui.setupCookbook();
		$('.section_recipe').die('pagecreate');
	});

	$('.section_cookbook').live({
		pagecreate: function() {
			valio_mobi.ui.setupCookbook();
		}
	});
	
});

$(document).ready(function() {
	(ui).apply(valio_mobi.ui);
	(util).apply(valio_mobi.util);
	valio_mobi.ui.addEventListeners();
});

var ui = function() {
	"use strict"

	var me,addAspectBadge,tabChange,updatePortion,passwordRecoveryForm,
			lastSearchText,recipeSearchSetup,productSearchSetup,addToShoppinglist,
			addProductToShoppinglist,login,newAccount,passwordChange,passwordQuality,
			changeTabLeft,changeTabRight,confirmNewAccount;

	me = this;

	addAspectBadge = function(page, content, select) {
		var badge,badge_area,badges=0;
		badge_area = $('#' + page + ' .aspect_badges');
		badge_area.find('.badge').each(function() {
			if ($(this).data('select') == select) {
				$(this).remove();
			};
			badges++;
		});

		if (select == 'productDoesNotContain') {
			content = 'Ei ' + content;
		};

		if (content.substring(content.length - 1) == 'e') {
			content += 'tta';
			content = content.replace(/nen\s/, 'sta ');
		};

		badge = '<div class="badge" data-select="'+select+'"><span onclick="">' + content + '</span></div>';
		badge_area.append(badge);
		if (badges == 0) {
			badge_area.slideDown();
		};
		$('#page').val(1);
	};

	tabChange = function(event) {
		var tab = $(event.currentTarget);
		if (tab.hasClass('active')) {
			return false;
		};

		tab.siblings('.tab').removeClass('active');
		tab.addClass('active');

		tab.siblings('.tab_content').each(function() {
			if ($(this).hasClass('active')) {
				$(this).removeClass('active');
			} else {
				$(this).addClass('active');
			};
		});
	};

	updatePortion = function(event) {
		var add_to,send_sms,link,content,href,ar;
		link = $(event.currentTarget);
		content = link.closest('#content');
		add_to = content.find('#add_to_shoppinglist');
		send_sms = content.find('#send_sms');

		$.post(link.attr('href'), {portionsTitle: $('#portionsTitle').html()}, function(data) {
			content.find('#ingredients').html(data);
			href = add_to.attr('href');
			ar = href.split('/');
			ar.pop();
			href = ar.join('/') + '/' + link.data('portions');
			add_to.attr('href', href);

			href = send_sms.attr('href');
			ar = href.split('/');
			ar.pop();
			href = ar.join('/') + '/' + link.data('portions');
			send_sms.attr('href', href);
		});
		event.preventDefault();
		return false;
	};

	passwordRecoveryForm = function() {
		var form,email = $('#password_recovery_form #email'),
		submit = $('#recover_password');
		if (email.val() == '' || submit.attr('disabled')) {
			return false;
		};

		form = $('#password_recovery_form');
		submit.attr('disabled', 'disabled');

		$.post(form.attr('action'), form.serialize(), function(data) {
			valio_mobi.ui.messageBox(data, 5000);
			submit.removeAttr('disabled');
		});
		return false;
	};

	addToShoppinglist = function(event) {
		var url = $(event.currentTarget).attr('href');
		if(url.match('/profiili/kirjaudu')) {
		  $.mobile.changePage(url, 'slide', false, true);
		  return false;
		}
		$.mobile.pageLoading(false, 'lisätään...');
		$.get(url, function(data) {
			$.mobile.pageLoading(true);
			valio_mobi.ui.messageBox(data);
		});
		
		return false;
	};

	addProductToShoppinglist = function(event) {
		if($(event.currentTarget).attr('href').match('/profiili/kirjaudu')) {
		  $.mobile.changePage($(event.currentTarget).attr('href'), 'slide', false, true);
		  return false;
		}

		var url = $(event.currentTarget).attr('href') + '/message';

		$.mobile.pageLoading(false, 'lisätään...');
		$.get(url, function(data) {
			$.mobile.pageLoading(true);
			valio_mobi.ui.messageBox(data);
		});

		return false;
	};

	login = function(event) {
		var login_form = $('#login_form');
		$.post(login_form.attr('action'), login_form.serialize(), function(data) {
			valio_mobi.ui.messageBox(data, 1500);
			setTimeout(function() {window.location.replace('/');}, 1500);
		});

		event.preventDefault();
		return false;
	};

	newAccount = function(event) {
		var account_form = $('#new_account');
		if ($('#new_account_button').attr('disabled')) {
			return false;
		};

		$('#new_account_button').attr('disabled', 'disabled');

		$.post(account_form.attr('action'), {new_email: $('#new_email').val()}, function(data) {
			if (data != "") {
				valio_mobi.ui.errorBox(data, 2500);
			} else {
				valio_mobi.ui.errorBox('Palvelussa tapahtui virhe. Yritä myöhemmin uudestaan', 3000);
			};

			$('#new_account_button').removeAttr('disabled');
		});

		event.preventDefault();
		return false;
	};

	confirmNewAccount = function(event) {
		var username, password, confirm_password, term_acceptance,
			account_form = $('#new_account_form'), fail = false;
			
		username = $('#username', account_form);
		password = $('#password', account_form);
		confirm_password = $('#confirm_password', account_form);
		term_acceptance = $('#term_acceptance', account_form);

		if (username.val() == '') {
			username.addClass('error');
			fail = true;
		} else {
			username.removeClass('error');
		};
		if (password.val() == '') {
			password.addClass('error');
			fail = true;
		} else {
			password.removeClass('error');
		};
		if (confirm_password.val() == '' || confirm_password.val() !== password.val()) {
			confirm_password.addClass('error');
			fail = true;
		} else {
			confirm_password.removeClass('error');
		};
		if (!term_acceptance.attr('checked')) {
			term_acceptance.addClass('error');
			fail = true;
		} else {
			term_acceptance.removeClass('error');
		}

		if (fail) {
			valio_mobi.ui.errorBox('Tarkista että olet täyttänyt kaikki kentät');
		} else {
			$('#new_account_submit').attr('disabled', 'disabled');

			$.post(account_form.attr('action'), account_form.serialize(), function(data) {
				var message, type;
				type = data.substring(0, data.indexOf('_'));
				message = data.substring(data.indexOf('_') + 1);

				if (type == 'ok') {
					valio_mobi.ui.messageBox(message, 2000);
					setTimeout(function() {$.mobile.changePage(site_url, 'slide', true, true);}, 2000);
				} else {
					valio_mobi.ui.errorBox(message);
				};

				$('#new_account_submit').removeAttr('disabled');
			});
		};

		event.preventDefault();
		return false;
	};

	passwordChange = function(event) {
		var password_form = $('#change_password_form'),
			old_password = $('#old_password'),
			new_password = $('#new_password'),
			confirm_password = $('#confirm_password'),
			fail = false;

		if (old_password.val() == '') {
			old_password.addClass('error');
			fail = true;
		} else {
			old_password.removeClass('error');
		};
		if (new_password.val() == '') {
			new_password.addClass('error');
			fail = true;
		} else {
			new_password.removeClass('error');
		};
		if (confirm_password.val() == ''
		 || confirm_password.val() != new_password.val()) {
			confirm_password.addClass('error');
			fail = true;
		} else {
			confirm_password.removeClass('error');
		};
		
		if (fail) {
			valio_mobi.ui.errorBox('Tarkista että olet täyttänyt kaikki kentät');
		} else {
			$.post(password_form.attr('action'), password_form.serialize(), function(data) {
				valio_mobi.ui.messageBox(data);
			});
		};

		return false;
	};

	passwordQuality = function(event) {

		var p = $(this).val(),
			quality = $(this).siblings('.password_quality'),
			numbers = 0, letters = 0,
			level = 'weak',
			i;

		for (i = 0; i < p.length; i++) {
			if (p.substring(i, i+1).match(/[0-9]/) !== null) {
				numbers++;
			} else {
				letters++;
			};
		};

		if (numbers > 0 && p.length > 1) {
			level = 'fair';
		};
		if (numbers == 0 && p.length >= 6) {
			level = 'fair';
		};
		if (numbers > 0 && letters > 0 && p.length >= 6) {
			level = 'good';
		};

		quality.removeClass('weak').removeClass('fair').removeClass('good');
		quality.addClass(level);
	};

	/* suport for swiping between tabs */
	changeTabLeft = function(event) {
		var prev = $(this).prevAll('.tab_content');

		if (prev.length > 0) {
			$(this).siblings('.tab-a').click();
		};
	};

	changeTabRight = function(event) {
		var next = $(this).nextAll('.tab_content');
		if (next.length > 0) {
			$(this).siblings('.tab-b').click();
		};
	};

	this.setupSearch = function(page) {
		$('#sort').val('');

		if (page == 'recipe_search') {
			if (recipeSearchSetup !== undefined) {
				return;
			} else {
				recipeSearchSetup = true;
			};
		} else if (page == 'product_search') {
			if (productSearchSetup !== undefined) {
				return;
			} else {
				productSearchSetup = true;
			};
		};

		$('#'+ page + ' .aspect_buttons').find('.button').bind('vclick', function(event) {
			var name = $(this).attr('id').substr(7);
			$('#'+name).selectmenu('open');
		});

		$('#' + page + ' .aspect_buttons').find('select').live('change', function() {
			var option = $(this).find('option:selected').html(),
					select = $(this).attr('id');
			
			addAspectBadge(page, option, select);
			me.doSearch(page);
		});

		$('.badge span').live('vclick', function() {
			var select = $(this).parent().data('select');
			$(this).closest('form').find('#'+select).val('');
			$(this).parent().remove();
			$('#page').val(1);

			if (select == 'text') {
				lastSearchText = '';
				$('#' + page + ' #text').val('');
			};

			if ($('#' + page + ' .aspect_badges').children().length > 0
					|| $('#text').val() != '') {
				me.doSearch(page);
			} else {
				$('#' + page + ' .search_results').empty();
			};
		});

		$('#' + page + ' #text').live('blur', function() {
			var text = $('#' + page + ' #text').val();
			if (text != lastSearchText) {
				me.doSearch(page);
				lastSearchText = text;

				if (text != '') {
					addAspectBadge(page, text.charAt(0).toUpperCase() + text.slice(1), 'text');
				} else {
					$('#' + page + ' .aspect_badges').find('.badge').each(function() {
						if ($(this).data('select') == 'text') {
							$(this).remove();
							return false;
						};
					});
				};
			};
		});

		$('#' + page + ' .search_sort').live('change', function() {
			$(this).closest('#recipe_search').find('#sort').val($(this).val());
			me.doSearch(page);
		});
	};

	this.doSearch = function(page) {
		var form = $('#' + page + '.ui-page-active form');
		$.mobile.pageLoading();
		$.post(form.attr('action'), form.serialize(), function(data) {
			$('#' + page + ' .search_results').html(data);
      $('#' + page + ' .result_list').listview();
			$.mobile.pageLoading(true);
		});
	};

	this.scrollToResults = function() {

		var results = $('#previous_results');
		
		if (results.length > 0) {
			$.mobile.silentScroll(results.offset().top - 15);
		};
	};
	
	this.setupCookbook = function() {
		
        $('.add_to_cookbook select')
																	 .die()
																	 .live('change', function() {
            var $uri = $(this).data('uri');
		window.console.log($uri);
		if($uri.match('/profiili/kirjaudu')) {
		  $.mobile.changePage($uri, 'slide', false, true);
		  return false;
		}
            var $val = $(this).val();

						if ($val == -1) {
							return false;
						};

            if ($val != "")
                $uri += '/'+$val;
            $.mobile.pageLoading(false, 'lisätään...');
            $.get($uri, function(data) {
                $.mobile.pageLoading(true);
                valio_mobi.ui.messageBox(data);
            });
        });

        $('form.edit_folders_form button').die('vclick').live('vclick', function(event) {
			var form=$(this).closest('form');
            $.mobile.pageLoading();
			$.post(form.attr('action'), form.serialize(), function(data) {
                $.mobile.pageLoading(true);
				valio_mobi.ui.messageBox(data);
			});
			event.preventDefault();
			return false;
        });
/*
    $('.delete_recipe').unbind('vclick');
		$('.delete_recipe').bind('vclick', function(event) {

            if (confirm('Haluatko varmasti poistaa reseptin?')) {
                var $this = $(this);
                var $uri = $(this).attr('href');
                if ($uri != "") {
                    $.mobile.pageLoading(false, 'poistetaan...');
                    $.get($uri, function(data) {
                        $.mobile.pageLoading(true);
                        valio_mobi.ui.messageBox(data);
                        setTimeout(function() {location.reload()}, 1200);
                    });
                }
            }

			event.preventDefault();
			return false;
        });
*/
		$('.edit_recipe_form .ui-btn').unbind('click').bind('click', function(event) {
			//$(this).closest('.recipe_admin').find('.edit_recipe_select').selectmenu('open');
			event.preventDefault();
			event.stopPropagation();
			return false;
		});

		$('.edit_recipe_select').unbind('blur').bind('blur', function() {
			var url, title_el, title, val = $(this).val(),
				recipe_id = $(this).closest('form').find('.recipe_id').val(),
				folder_id = $(this).closest('form').find('.folder_id').val(),
				recipe = $(this).closest('.search_result');
			log(val);

			if (val == 0) {
				return;
			} else if (val == -1) {
				url = site_url + 'kauppalista/lisaa/resepti/' + recipe_id;
				$.mobile.pageLoading(false, 'lisätään...');
				$.get(url, function(data) {
					$.mobile.pageLoading(true);
					valio_mobi.ui.messageBox(data);
				});
			} else if (val == -2) {
				url = site_url + 'keittokirja/poista/resepti/' + recipe_id;
				if (folder_id !== undefined) {
					url += '/' + folder_id;
				};

				title_el = $(this).closest('#content').find('.header h3');
				log(title_el);
				$.mobile.pageLoading(false, 'poistetaan...');
				$.get(url, function(data) {
					$.mobile.pageLoading(true);
					valio_mobi.ui.messageBox(data, 2000);
					setTimeout(function() {
						$(recipe).slideUp();
						title = title_el.html();
						title_el.html(title.replace(/\((\d+)\)/, function(str, p1) {return '(' + (parseInt(p1, 10) - 1) + ')';}));
					}, 2000);
					
					//setTimeout(function() {location.reload()}, 1200);
				});
			} else {
				/* add to folder */
				url = site_url + 'keittokirja/lisaa/resepti/' + recipe_id + '/' + val;
				
				$.mobile.pageLoading(false, 'lisätään...');
				$.get(url, function(data) {
					$.mobile.pageLoading(true);
					valio_mobi.ui.messageBox(data);
				});
			};
		});
        $('.select_folder_color select').unbind('change').bind('change', function() {
            var $color = $(this).val();
            if ($color != "")
            {
               $(this).closest('.select_folder_color').find('.ui-btn:first').attr('class','')
                    .addClass('ui-btn button folder_color_'+$color);
            }
        });
        $('a.delete_folder').unbind('click');
        $('a.delete_folder').bind('click', function() {
            return confirm('Haluatko varmasti poistaa kansion?');
        });
	};

	// display an auto-fade message box.
	this.messageBox = function( message, delay, isError ) {
		if ( delay === undefined ) {
			delay = 1500;
		};

		$( "div[data-role='message-box']" ).remove();

		var $box = $( "<div class='ui-loader ui-overlay-shadow " + (isError === undefined || !isError?"ui-body-a":"ui-body-e") + " ui-corner-all' data-role='message-box'><h1></h1></div>" );
		$box.find( "h1" ).text( message );
		$box.css({"display": "block", "opacity": 0.96, "top": $(window).scrollTop() + 100})
			.appendTo( $.mobile.pageContainer )
			.delay( delay )
			.fadeOut( 400, function(){$(this).remove();} );
		return $box;
	};

	this.errorBox = function( message, delay ) {
		return this.messageBox( message, delay, true );
	};

	this.addEventListeners = function() {
		$('#recover_password').live('vclick', passwordRecoveryForm);
		$('.tab').live('vclick', tabChange);
		$('input[type="email"]').live('blur', function() {
			valio_mobi.util.validateEmail($(this));
		});
		$('.portion').live('vclick', updatePortion);
		$('#add_to_shoppinglist').live('vclick', addToShoppinglist);
		$('#login_button').live('vclick', login);
		$('#new_account_button').live('vclick', newAccount);
		$('#add_product_to_shoppinglist').live('vclick', addProductToShoppinglist);
		$('#change_password_submit').live('vclick', passwordChange);
		$('#new_password').live('keyup', passwordQuality);
		$('#new_account_submit').live('vclick', confirmNewAccount);
		$('#new_account_form #password').live('keyup', passwordQuality);

		$('.scroll_top').live('vclick', function() {
			$.mobile.silentScroll(0);
			return false;
		});

		$('.tab_content.active').live('swipeleft', changeTabLeft);
		$('.tab_content.active').live('swiperight', changeTabRight);

		/* attach ajax error listener */
		$(document).ajaxError(function(event, jqxhr, settings) {
            $.mobile.pageLoading(true);
			if ( settings.url == site_url + 'profiili/kirjaudu' || settings.url == '/' + form_root + 'profiili/kirjaudu') {
				valio_mobi.ui.errorBox('Väärä sähköpostiosoite tai salasana', 2000);
			} else {
				valio_mobi.ui.errorBox('Virhe tietojen lähetyksessä');
			};
		});
	};
};

var cookbook = function() {
	"use strict"

	this.setup = function() {}
};

var shopping_list = function() {
	"use strict"

	var removeRecipe, updateList, addItem, removeItem, itemBought, shareSMS, 
		sharingSetup;

	removeRecipe = function(event) {
		var link = $(event.currentTarget);

		$.post(link.attr('href'), function(data) {
			$(link).parent().remove();
			$('#list_content').html(data);
		});
		
		event.preventDefault();
		return false;
	};

	addItem = function(event) {
		var text,notes,item = $('#list_add_item');
		text = item.val();
		if (text == '') {
			return false;
		};
		item.attr('disable', true);
		$.post(site_url + "kauppalista/lisaa/oma", {text: text}, function(data) {
			notes = $('#notes');
			if (notes.length == 0) {
				$('#shopping_list').find('.list_bottom').before('<div id="notes" class="group"><div class="line"><h3>Muistiinpanot</h3></div>' + data + '</div>');
			} else {
				notes.append(data);
			};
			item.removeAttr('disable');
			item.val('');
		});
		$('#list_add_item').val('');
		event.preventDefault();
		event.stopPropagation();
		return false;
	};

	removeItem = function(event) {
		var link = $(event.currentTarget);

		$.post(link.attr('href'), function(data) {
			if (link.parent().siblings().length <= 1 && !link.parent().prev().hasClass('header')) {
				link.closest('.group').remove();
			} else {
				link.parent().remove();
			};
		});

		event.preventDefault();
		event.stopPropagation();
		return false;
	};

	itemBought = function(event)
	{
		var state,item = $(event.currentTarget);
		if (!item.hasClass('strikethrough')) {
			item.addClass('strikethrough');
			state = 'true';
		} else {
			item.removeClass('strikethrough');
			state = 'false';
		};

		/* best effort */
		$.post(site_url + 'kauppalista/osta/' + item.parent().attr('id') + '/' + state);
	};

	this.setup = function() {

		$('#shopping_list .recipe .delete').die('vclick', removeRecipe).live('vclick', removeRecipe);
		$('#shopping_list .line .delete').die('vclick', removeItem).live('vclick', removeItem);
		$('#shopping_list .item').die('vclick', itemBought).live('vclick', itemBought);
		$('#list_add').unbind('submit', addItem);
		$('#list_add').submit(addItem);
		$('#list_add_item').unbind('blur', addItem)
		$('#list_add_item').blur(addItem);
		$('#clear_shoppinglist').unbind('click').bind('click', function(event) {
			if (!confirm('Haluatko varmasti tyhjentää kauppalistasi?')) {
				event.preventDefault();
				return false;
			};
		});

		this.setupSharing();
	}

	this.setupSharing = function() {
		if (sharingSetup !== undefined) {
			return;
		} else {
			sharingSetup = true;
		};

		$('#share_shoppinglist_sms').die('pagecreate').live('pagecreate', function() {
			$('#share_sms #submit').attr('disabled', 'disabled');
		});
		$('#share_shoppinglist_email').die('pagecreate').live('pagecreate', function() {
			$('#share_email #submit').attr('disabled', 'disabled');
		});
		$('#share_recipe_email').die('pagecreate').live('pagecreate', function() {
			$('#share_email #submit').attr('disabled', 'disabled');
		});

		$('form.sharing input[type="submit"]').die('vclick').live('vclick', function(event) {
			if ($(this).attr('disabled')) {
				return false;
			};
			var form=$(this).closest('form');
			$.post(form.attr('action'), form.serialize(), function(data) {
				valio_mobi.ui.messageBox(data);
			});
			$(this).attr('disabled', 'disabled');
			event.preventDefault();
			return false;
		})

		$('#phoneNumber').die().live({
			blur: function() {
				if (!valio_mobi.util.validatePhoneNumber($(this))) {
					$('#share_sms #submit').attr('disabled', 'disabled');
				};
			},
			focus: function() {
				$('#share_sms #submit').removeAttr('disabled');
			}
		});

		$('#email').die().live({
			blur: function() {
				if (!valio_mobi.util.validateEmail($(this))) {
					$('#share_email #submit').attr('disabled', 'disabled');
				};
			},
			focus: function() {
				$('#share_email #submit').removeAttr('disabled');
			}
		});

		$('#senderEmail').die().live({
			blur: function() {
				if (!valio_mobi.util.validateEmail($(this))
						|| !valio_mobi.util.validateEmail($('#recipientEmail'), false)) {
					$('#share_email #submit').attr('disabled', 'disabled');
				} else {
					$('#share_email #submit').removeAttr('disabled');
				};
			},
			focus: function() {
				$('#share_email #submit').removeAttr('disabled');
			}
		});
		$('#recipientEmail').die().live({
			blur: function() {
				if (!valio_mobi.util.validateEmail($(this))
						|| !valio_mobi.util.validateEmail($('#senderEmail'), false)) {
					$('#share_email #submit').attr('disabled', 'disabled');
				} else {
					$('#share_email #submit').removeAttr('disabled');
				};
			},
			focus: function() {
				$('#share_email #submit').removeAttr('disabled');
			}
		});
	};
};

var util = function() {
	
	this.validateEmail = function(el, addError) {
		var val,re,pattern;
		val = $(el).val();
		pattern = /((([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?/;
		re = new RegExp(pattern);
		if (re.test(val)) {
			$(el).removeClass('error');
			return true;
		} else {
			if (addError === undefined || addError === true) {
				$(el).addClass('error');
			};
			return false;
		};
	};

	this.validatePhoneNumber = function(el) {
		if ($(el).val() == '') {
			$(el).addClass('error');
			return false;
		} else {
			$(el).removeClass('error');
			return true;
		};
	};
};
