(function ($) {
    $.easy = {
        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: 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: function (options) {
            var defaults = {
                selector: '.popup',
                popupId: 'easy_popup',
                preloadText: 'Cargando...',
                errorText: 'Ha ocurrido un problema con su solicitud, por favor haga click fuera de esta ventana para cerrarla.',
                closeText: 'Cerrar'
            };
            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': .7
                    }).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': 'left',
                        'left': '0',
                        'top': '-24px',
                        'color': '#fff',
                        'cursor': 'pointer'
                    });
                    $('#' + options.popupId + ', #' + options.popupId + 'content small').click(function () {
                        remove()
                    })
                })
            })
        },
        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 () {
				if ($(this).attr('href')) {
				  var href = $(this).attr('href').toLowerCase();
				  if (href.indexOf('http://') != - 1 && href.indexOf(hostname) == - 1) {
					  $(this).attr('target', '_blank');
					  $(this).addClass('external')
				  }
                }
            })
        },
        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: 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')
            })
        },
        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: function (options) {
            var defaults = {
                selector: 'form',
                err: 'Requerido',
                errEmail: 'Se requiere un e-mail v&aacute;lido',
                errUrl: 'Se requiere una URL v&aacute;lida',
                errPhone: 'Se requiere un tel&eacute;fono v&aacute;lido',
                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 = /^([0-9]{1,2}|\([0-9]{1,2}\))(-| )?[0-9]{4,7}$/
                    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)
                        }
                    });
                    $('select.required', this).each(function () {
                        check(this)
                    });
                    return valid
                })
            })
        }
    }
})(jQuery);
