(function ($) {
	$.easy = {
		//NAVIGATION
		navigation: function (options) {
			var defaults = {
				selector: '#nav li',
				className: 'over'
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			return $(options.selector).each(function () {
				$(this).hover(function () {
					$('ul:first', this).fadeIn(100);
					$('a:first', this).addClass(options.className)
				},
				function () {
					$('ul', this).hide();
					$('a', this).removeClass(options.className)
				})
			})
		},
		//TOOLTIP
		tooltip: function (options) {
			var defaults = {
				selector: '.tooltip',
				xOffset: 10,
				yOffset: 25,
				clickRemove: false,
				id: 'easy_tooltip',
				content: '',
				useElement: ''
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			var content;
			return $(options.selector).each(function () {
				var title = $(this).attr('title');
				$(this).hover(function (e) {
					content = (options.content != '') ? options.content: title;
					content = (options.useElement != '') ? $('#' + options.useElement).html() : content;
					$(this).attr('title', '');
					if (content != '' && content != undefined) {
						$('body').append('<div id="' + options.id + '">' + content + '</div>');
						$('#' + options.id).css({
							'position': 'absolute',
							'display': 'none'
						}).css('top', (e.pageY - options.yOffset) + 'px').css('left', (e.pageX + options.xOffset) + 'px').fadeIn('fast')
					}
				},
				function () {
					$('#' + options.id).remove();
					$(this).attr('title', title)
				});
				$(this).mousemove(function (e) {
					var x = ((e.pageX + options.xOffset + $(this).width()) < $(window).width()) ? (e.pageX + options.xOffset) : (e.pageX - options.xOffset - $(this).width() - 16);
					$('#' + options.id).css('top', (e.pageY - options.yOffset) + 'px').css('left', (x + 'px'))
				});
				if (options.clickRemove) {
					$(this).mousedown(function (e) {
						$('#' + options.id).remove();
						$(this).attr('title', title)
					})
				}
			})
		},
		
		//POPUP
		popup: function (options) {
			var defaults = {
				selector: '.popup',
				popupId: 'easy_popup',
				preloadText: '<img src="images/loader.gif"/>',
				errorText: 'There has been a problem with your request, please click outside this window to close it.',
				closeText: '<img src="images/close.png"/>'
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			return $(options.selector).each(function () {
				$(this).click(function (e) {
					e.preventDefault();
					if ($.browser.opera) $.support.opacity = true;
					var ie6 = $.browser.msie && $.browser.version.substr(0, 1) < 7;
					var opera95 = $.browser.opera && $.browser.version <= 9.5;
					var w = $(window).width();
					var h = $(document).height();
					var w2 = $(window).width() / 2;
					var h2 = $(window).height() / 2;
					show = function () {
						$('#' + options.popupId + 'preloader').remove();
						if (cw != 0) $('#' + options.popupId + 'content').css('width', cw + 'px');
						if (ch != 0) $('#' + options.popupId + 'content').css('height', ch + 'px');
						set($('#' + options.popupId + 'content'));
						$('img', '#' + options.popupId + 'content').css('visibility', 'visible')
					};
					set = function (obj) {
						$(obj).css({
							'padding': '10px',
							'background': '#fff',
							'color': '#333',
							'text-align': 'left',
							'float': 'left',
							'position': 'fixed',
							'z-index': '10001',
							'visible': 'hidden'
						});
						var left = w2 - $(obj).width() / 2;
						var top = h2 - $(obj).height() / 2;
						$(obj).css({
							'left': left,
							'top': top,
							'display': 'none'
						}).fadeIn('1000');
						if (ie6) $(obj).css({
							'position': 'absolute',
							'top': (top + $(window).scrollTop()) + 'px'
						});
						if (opera95) $(obj).css({
							'position': 'absolute',
							'top': (document.body['clientHeight'] / 2 - $(obj).height() / 2 + $(window).scrollTop()) + 'px'
						})
					};
					if (ie6) $('embed, object, select').css('visibility', 'hidden');
					error = function () {
						$('#' + options.popupId + 'content').text(options.errorText);
						show()
					};
					remove = function () {
						$('#' + options.popupId).remove();
						$('#' + options.popupId + 'content').remove();
						$('#' + options.popupId + 'preloader').remove();
						if (ie6) $('embed, object, select').css('visibility', 'visible')
					};
					$('<div id="' + options.popupId + '"></div>').appendTo('body').css({
						'width': w,
						'height': h,
						'background': '#000',
						'position': 'absolute',
						'top': '0',
						'left': '0',
						'z-index': '10000',
						'opacity': .2
					}).click(function () {
						remove()
					});
					var href = $(this).attr('href');
					var extension = href.substr(href.lastIndexOf('.')).toLowerCase();
					var content;
					var cw = 0;
					var ch = 0;
					var showOk = false;
					$('<div id="' + options.popupId + 'preloader">' + options.preloadText + '</div>').appendTo('body');
					set($('#' + options.popupId + 'preloader'));
					$('<div id="' + options.popupId + 'content"></div>').appendTo('body');
					if ($(this).hasClass('flash')) {
						var flash = '<object width="100%" height="100%"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="' + href + '" /><embed src="' + href + '" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="100%" height="100%"></embed></object>';
						$(flash).appendTo('#' + options.popupId + 'content');
						cw = 600;
						ch = 400;
						showOk = true
					} else {
						if (extension == '.jpg' || extension == '.jpeg' || extension == '.gif' || extension == '.png' || extension == '.bmp') {
							var img = new Image();
							$(img).error(function () {
								error()
							}).css('visibility', 'hidden').appendTo('#' + options.popupId + 'content');
							img.onload = function () {
								show();
								img.onload = function () {}
							};
							img.src = href + '?' + (new Date()).getTime() + ' =' + (new Date()).getTime()
						} else if (href.charAt(0) == '#') {
							$(href).clone().removeClass('hidden').show().appendTo('#' + options.popupId + 'content');
							$.easy.forms('#' + options.popupId + 'content form');
							showOk = true
						} else {
							$('<iframe frameborder="0" scrolling="auto" style="width:100%;height:100%" src="' + href + '" />').appendTo('#' + options.popupId + 'content');
							cw = 900;
							ch = 500;
							showOk = true
						}
					};
					var rel = $(this).attr('rel').split(';');
					$.each(rel, function (i) {
						if (rel[i].indexOf('width') != -1) cw = rel[i].split(':')[1];
						if (rel[i].indexOf('height') != -1) ch = rel[i].split(':')[1]
					});
					if (showOk) show();
					$('<small>' + options.closeText + '</small>').appendTo('#' + options.popupId + 'content').css({
						'position': 'absolute',
						'float': 'right',
						'right': '-10',
						'top': '-15px',
						'color': '#fff',
						'cursor': 'pointer'
					});
					$('#' + options.popupId + ', #' + options.popupId + 'content small').click(function () {
						remove()
					})
				})
			})
		},
		//EXTERNAL
		external: function (options) {
			var defaults = {
				selector: 'a'
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			var hostname = window.location.hostname;
			hostname = hostname.replace('www.', '').toLowerCase();
			return $(options.selector).each(function () {
				var href = $(this).attr('href').toLowerCase();
				if (href.indexOf('http://') != -1 && href.indexOf(hostname) == -1) {
					$(this).attr('target', '_blank');
					$(this).addClass('external')
				}
			})
		},
		//ROTATE
		rotate: function (options) {
			var defaults = {
				selector: '.rotate',
				pause: 5000,
				randomize: false
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			return $(options.selector).each(function () {
				var obj = $(this);
				var length = $(obj).children().length;
				var temp = 0;
				function getRan() {
					var ran = Math.floor(Math.random() * length) + 1;
					return ran
				};
				function show() {
					if (options.randomize) {
						var ran = getRan();
						while (ran == temp) {
							ran = getRan()
						};
						temp = ran
					} else {
						temp = (temp == length) ? 1 : temp + 1
					};
					$(obj).children().hide();
					$(':nth-child(' + temp + ')', obj).fadeIn('slow')
				};
				show();
				setInterval(show, options.pause)
			})
		},
		// JUMP TO ANCHOR
		jump: function (options) {
			var defaults = {
				selector: 'a.jump',
				speed: 1000
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			return $(options.selector).click(function () {
				var target = $($(this).attr('href'));
				var offset = $(target).offset().top;
				$('html,body').animate({
					scrollTop: offset
				},
				1000, 'linear')
			})
		},
		//TOGGLE
		showhide: function (options) {
			var defaults = {
				selector: '.toggle'
			};
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			return $(options.selector).each(function () {
				var target;
				if ($(this).hasClass('prev')) {
					target = $(this).prev().hide()
				} else if ($(this).hasClass('id')) {
					target = $(this).attr('href');
					target = $(target).hide()
				} else {
					target = $(this).next().hide()
				};
				$(this).css('cursor', 'pointer');
				$(this).toggle(function () {
					$(this).addClass('expanded');
					$(target).slideDown()
				},
				function () {
					$(target).slideUp();
					$(this).removeClass('expanded')
				})
			})
		},
		//FORMS
		forms: function (options) {
			var defaults = {
				selector: 'form',
				err: 'This is required',
				errEmail: 'Valid email address is required',
				errUrl: 'URL is required',
				errPhone: 'Phone number is required',
				notValidClass: 'notvalid'
			};
			function check(obj) {
				if ($(obj).val() == '' || checkLabel(obj)) {
					var errormsg = ($(obj).attr('title') != '') ? $(obj).attr('title') : options.err;
					error(obj, errormsg)
				}
			};
			function checkRegEx(obj, type) {
				var regEx, err;
				switch (type) {
				case 'url':
					regEx = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
					err = options.errUrl;
					break;
				case 'phone':
					var regEx = /[\d\s_-]/;
					err = options.errPhone;
					break;
				default:
					regEx = /^[^@]+@[^@]+.[a-z]{2,}$/;
					err = options.errEmail
				};
				var val = $(obj).val();
				if (val.search(regEx) == -1 || checkLabel(obj)) {
					var errormsg = ($(obj).attr('title') != '') ? $(obj).attr('title') : err;
					error(obj, errormsg)
				}
			};
			function checkLabel(obj) {
				var text = $('label[for=' + $(obj).attr('id') + ']').text();
				return (text == $(obj).val())
			};
			function error(obj, errormsg) {
				var parent = $(obj).parent();
				parent.append('<span class="error">' + errormsg + '</span>');
				$('span.error', parent).hide().fadeIn('fast');
				$(obj).addClass(options.notValidClass);
				valid = false
			};
			$('input.label,textarea.label').each(function () {
				var text = $('label[for=' + $(this).attr('id') + ']').text();
				$('label[for=' + $(this).attr('id') + ']').css('display', 'none');
				$(this).val(text);
				$(this).focus(function () {
					if ($(this).val() == text) $(this).val('')
				});
				$(this).blur(function () {
					if ($(this).val() == '') $(this).val(text)
				})
			});
			if (typeof options == 'string') defaults.selector = options;
			var options = $.extend(defaults, options);
			return $(options.selector).each(function () {
				$(this).submit(function () {
					$('.error', this).remove();
					$('.' + options.notValidClass, this).removeClass(options.notValidClass);
					valid = true;
					$(':text.required', this).each(function () {
						if ($(this).hasClass('email')) {
							checkRegEx(this, 'email')
						} else if ($(this).hasClass('url')) {
							checkRegEx(this, 'url')
						} else if ($(this).hasClass('phone')) {
							checkRegEx(this, 'phone')
						} else {
							check(this)
						}
					});
					$(':password.required', this).each(function () {
						check(this)
					});
					$('textarea.required', this).each(function () {
						check(this)
					});
					$(':checkbox.required', this).each(function () {
						if (!$(this).attr('checked')) {
							var errormsg = ($(this).attr('title') != '') ? $(this).attr('title') : options.err;
							error(this, errormsg)
						}
					});
					return valid
				})
			})
		}
	}
})(jQuery);