var eny = {
    
    /**
     * @public
     */
    
    init: function() {
        
        this.buttons.init();
        jQuery('.logo').click(function() { jQuery(this).blur(); });
        jQuery('.welcome-to-eny').click(function() {
        	location.href = '/about-us';
        	return false;
        });
        
    },
    
    /**
     * Buttons
     */
    buttons: {
        
        /**
         * @public
         */
         
        init: function() {
            jQuery('button').hover(function() {
                jQuery(this).addClass('ui-state-hover');
            }, function() {
                jQuery(this).removeClass('ui-state-hover');
            });
        }
        
    },
    
    /**
     * Navigation
     */
    navigation: {
        
        /**
         * @private
         */
         
        _moreLink: false,
        _moreSelector: false,
        
        _showMore: function(element) {
            jQuery(this._moreLink).parent().addClass('navbar-more-hover');
            var offset = jQuery(this._moreLink).offset();
            var height = jQuery(this._moreLink).height();
            var top = (jQuery.browser.msie == true && jQuery.browser.version < 8) ? offset.top + height - 6 : offset.top + (height/2);
            var left = (jQuery.browser.msie == true && jQuery.browser.version < 8) ? offset.left - 44 : offset.left - 4;
            if(jQuery('#div-more').length <= 0) {
            	jQuery('body').append('<div id="div-more" style="position:absolute;top:0;left:0;width:100%;height:1000px;display:none;background-color:red;opacity:0;filter: alpha(opacity = 0);"></div>');
            }
            jQuery(this._moreSelector).css({
                top: top,
                left: left
            }).show();
            
            jQuery('#div-more').css({
            	top: top + 15
            }).show();
        },
        
        _hideMore: function(element) {
            jQuery(this._moreLink).parent().removeClass('navbar-more-hover');
            jQuery(this._moreSelector).hide();
            jQuery('#div-more').hide();
        },
        
        /**
         * @public
         */
        
        init: function(moreLink, moreSelector) {
            this._moreLink = moreLink;
            this._moreSelector = moreSelector;
            
            jQuery(this._moreLink + ', ' + this._moreSelector).hover(function() {
                eny.navigation._showMore(this);
            }, function() {
                eny.navigation._hideMore(this);
            });
        }
        
    },
    
    /**
     * Cookies
     */
    cookie: {
        
        /**
         * @public
         */
        
        create: function(name, value, days, path) {
            var expires = "";
            if(!path || path == '') var path = '/';
            
            if(days) {
                var date = new Date();
                date.setTime(date.getTime() + ((days * 86400) * 1000));
                expires = "; expires=" + date.toGMTString();
            }
            
            document.cookie = name + "=" + value + expires + "; path=" + path;
        },
        
        read: function(name) {
            if(document.cookie) {
                var cookies = document.cookie.split(';');
                for(var i = 0; i < cookies.length; i++) {
                    var cookie = jQuery.trim(cookies[i]);
                    if(cookie.substring(0, name.length + 1) == name + '=') {
                        return decodeURIComponent(cookie.substring(name.length + 1));
                    }
                }
            }
            
            return false;
        },
        
        destroy: function(name) {
            this.create(name, "", -1);
        }
        
    },
    
    /**
     * Feature Reviews
     */
    featured: {
        
        /**
         * @private
         */
        _selector: false,
        _interval: 10,
        _paused: false,
        _list: false,
        _index: false,
        _inTransition: false,
        _transition: {
            'show': {
                type: 'slide',
                interval: 500,
                options: {
                    direction: 'right',
                    mode: 'show'
                }
            },
            'hide': {
                type: 'slide',
                interval: 500,
                options: {
                    direction: 'left',
                    mode: 'hide'
                }
            },
            'next': {
                type: 'slide',
                interval: 500,
                options: {
                    direction: 'left',
                    mode: 'show'
                }
            },
            'previous': {
                type: 'slide',
                interval: 500,
                options: {
                    direction: 'right',
                    mode: 'hide'
                }
            }
        },
        
        _getPrefix: function(element) {
            if(jQuery(element).hasClass('previous')) {
                return 'previous';
            }
            else if(jQuery(element).hasClass('next')) {
                return 'next';
            }
            else if(jQuery(element).hasClass('play')) {
                return 'play';
            }
            else if(jQuery(element).hasClass('pause')) {
                return 'pause';
            }
            else {
                return false;
            }
        },
        
        _onHover: function(element) {
            jQuery(element).addClass(this._getPrefix(element) + '-hover');
        },
        
        _offHover: function(element) {
            jQuery(element).removeClass(this._getPrefix(element) + '-hover');
        },
        
        /**
         * @public
         */
        
        init: function(selector) {
            this._selector = selector;
            this._paused = false;
            
            this._list = jQuery(this._selector + ' div');
            
            jQuery(this._selector + ' .controls li').each(function(index, element) {
                switch(element.className) {
                    case 'previous':
                        jQuery(this).click(function() {
                            eny.featured.pause();
                            eny.featured.previous();
                        }).hover(function() {
                            eny.featured._onHover(this);
                        }, function() {
                            eny.featured._offHover(this);
                        });
                    break;
                    
                    case 'next':
                        jQuery(this).click(function() {
                            eny.featured.pause();
                            eny.featured.next();
                        }).hover(function() {
                            eny.featured._onHover(this);
                        }, function() {
                            eny.featured._offHover(this);
                        });
                    break;
                    
                    case 'pause':
                        jQuery(this).click(function() { eny.featured.pause(); }).hover(function() {
                            eny.featured._onHover(this);
                        }, function() {
                            eny.featured._offHover(this);
                        });
                    break;
                    
                    case 'play':
                        jQuery(this).click(function() { eny.featured.resume(); }).hover(function() {
                            eny.featured._onHover(this);
                        }, function() {
                            eny.featured._offHover(this);
                        });
                    break;
                }
            });
            
            this.start();
        },
        
        next: function(auto) {
            if(auto && this._paused || this._inTransition) {
                return false;
            }
            
            // hide current element
            var transition = this._transition.hide;
            this._inTransition = true;
            jQuery(this._list[this._index]).effect(transition.type, transition.options, transition.interval, function() {
                // show next element
                if(eny.featured._index < (eny.featured._list.length - 1)) {
                    eny.featured._index++;
                }
                else {
                    eny.featured._index = 0;
                }
                
                var transition = eny.featured._transition.show;
                jQuery(eny.featured._list[eny.featured._index]).effect(transition.type, transition.options, transition.interval, function() {
                    eny.featured._inTransition = false;
                });
            });
            
            this._timer = setTimeout("eny.featured.next(true);", this._interval * 1000);
        },
        
        previous: function() {
            // hide current element
            var transition = this._transition.previous;
            this._inTransition = true;
            jQuery(this._list[this._index]).effect(transition.type, transition.options, transition.interval, function() {
                // show next element
                if(eny.featured._index > 0) {
                    eny.featured._index--;
                }
                else {
                    eny.featured._index = eny.featured._list.length - 1;
                }
                
                var transition = eny.featured._transition.next;
                jQuery(eny.featured._list[eny.featured._index]).effect(transition.type, transition.options, transition.interval, function() {
                    eny.featured._inTransition = false;
                });
            });
            
            
        },
        
        start: function() {
            this._index = 0;
            this.resume();
        },
        
        pause: function() {
            this._paused = true;
            clearTimeout(this._timer);
            jQuery(this._selector + ' .controls li.pause').hide();
            jQuery(this._selector + ' .controls li.play').show();
        },
        
        resume: function() {
            this._paused = false;
            jQuery(this._selector + ' .controls li.play').hide();
            jQuery(this._selector + ' .controls li.pause').show();
            this._timer = setTimeout("eny.featured.next(true);", this._interval * 1000);
        }
    },
    
    /**
     * Login
     */
    login: {
        
        /**
         * @private
         */
        _selector: false,
        _loginSelector: false,
        
        _validate: function() {
            var response = {};
            var email_filter = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            
            var form = jQuery(this._loginSelector);
            jQuery(form).find(':input').each(function(index, element) {
                switch(element.name) {
                    case 'email':
                        if(element.value.length <= 0) {
                            response['login-email'] = 'missing';
                        }
                        else if(!email_filter.test(element.value)) {
                            response['login-email'] = 'invalid';
                        }
                    break;
                    
                    case 'password':
                        if(element.value.length <= 0) {
                            response['login-password'] = 'missing';
                        }
                        else if(element.value.length > 16) {
                            response['login-password'] = 'invalid';
                        }
                    break;
                }
            });
            
            return (jQuery.param(response).length <= 0) ? true : response;
        },
        
        _invalid: function(invalidData) {
            jQuery.each(invalidData, function(element, error) {
                jQuery('#' + element).addClass('ui-state-error');
                jQuery('.error-messages').show();
                jQuery('#' + element + '-error-' + error).show();
            });
        },
        
        _clearInvalid: function() {
            jQuery(this._registerSelector).find(':input, p').removeClass('ui-state-error');
            jQuery(this._registerSelector).find('.error-messages, .error-messages div').hide();
        },
        
        _success: function() {
            location.reload();
        },
        
        _failure: function() {
            jQuery(this._loginSelector + ' .error-messages, #login-error').show();
        },
        
        /**
         * @public
         */
        init: function(selector) {
            this._selector = selector;
            this._loginSelector = '#login-dialog';
            
            jQuery(this._selector).click(function() {
                eny.login.initDialog();
                return false;
            });
        },
        
        initDialog: function() {
            if(jQuery('#dialogs').length <= 0) {
                jQuery(this._selector).parent().append('<div id="dialogs">');
            }
            
            if(jQuery(this._loginSelector).length <= 0) {
                jQuery('#dialogs').load('/login?decorate=no&dialog=true', function() {
                    jQuery('#dialogs button, #dialogs a[href=/register]').remove();
                    
                    eny.modal.init({
                        selector: eny.login._loginSelector,
                        shadow: true,
                        width: 400,
                        height: 400,
                        buttons: {
                            "Login": function(event, ui) {
                                eny.login.submit();
                            },
                            "Cancel": function(event, ui) {
                                eny.login.cancel();
                            }
                        }
                    });
                    
                    eny.modal.setPriority(eny.login._loginSelector);
                    
                    eny.login.open();
                });
            }
            else {
                this.open();
            }
        },
        
        submit: function() {
            this._clearInvalid();
            
            var isValid = this._validate();
            if(isValid !== true) {
                this._invalid(isValid);
                return false;
            }
            
            var url = jQuery(this._loginSelector).attr('action');
            var data = jQuery(this._loginSelector).serialize();
            
            jQuery.post(url, data, function(data, textStatus) {
                if(textStatus == 'success') {
                    if(data.indexOf('login_success') > -1) {
                        eny.login._success();
                    }
                    else {
                        eny.login._failure();
                    }
                }
                else {
                    eny.login._failure();
                }
            });
        },
        
        cancel: function() {
            this.close();
        },
        
        open: function() {
            this._clearInvalid();
            eny.modal.open(this._loginSelector);
        },
        
        close: function() {
            this._clearInvalid();
            eny.modal.close(this._loginSelector);
        }
        
    },
    
    /**
     * Register
     */
    register: {
        
        /**
         * @private
         */
        _selector: false,
        _registerSelector: false,
        
        _validate: function() {
            var response = {};
            var email_filter = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            
            var form = jQuery(this._registerSelector);
            var gender = false;
            jQuery(form).find(':input').each(function(index, element) {
                switch(element.name) {
                    case 'email':
                        if(element.value.length <= 0) {
                            response['register-email'] = 'missing';
                        }
                        else if(!email_filter.test(element.value)) {
                            response['register-email'] = 'invalid';
                        }
                    break;
                    
                    case 'password':
                        if(element.value.length <= 0) {
                            response['register-password'] = 'missing';
                        }
                        else if(element.value.length > 16) {
                            response['register-password'] = 'invalid';
                        }
                    break;
                    
                    case 'username':
                        if(element.value.length <= 0) {
                            response['register-username'] = 'missing';
                        }
                        else if(element.value.length > 16) {
                            response['register-username'] = 'invalid';
                        }
                    break;
                    
                    case 'gender':
                        if(element.checked) {
                            gender = true;
                        }
                    break;
                    
                    case 'birthyear':
                        if(element.selectedIndex <= 0) {
                            response['register-birthyear'] = 'missing';
                        }
                    break;
                }
            });
            
            if(!gender) {
                response['gender-male'] = 'invalid';
                response['gender-female'] = 'invalid';
                response['register-gender'] = 'invalid';
            }
            
            return (jQuery.param(response).length <= 0) ? true : response;
        },
        
        _invalid: function(invalidData) {
            jQuery.each(invalidData, function(element, error) {
                jQuery('#' + element).addClass('ui-state-error');
                jQuery('.error-messages').show();
                jQuery('#' + element + '-error-' + error).show();
            });
        },
        
        _clearInvalid: function() {
            jQuery(this._registerSelector).find(':input, p').removeClass('ui-state-error');
            jQuery(this._registerSelector).find('.error-messages, .error-messages div').hide();
        },
        
        _success: function() {
            location.reload();
        },
        
        _failure: function() {
            jQuery(this._selector + '.error-messages, #register-error').show();
        },
        
        /**
         * @public
         */
        init: function(selector) {
            this._selector = selector;
            this._registerSelector = '#register-dialog';
            
            jQuery(this._selector).click(function() {
                eny.register.initDialog();
                return false;
            });
        },
        
        initDialog: function() {
            if(jQuery('#dialogs').length <= 0) {
                jQuery(this._selector).parent().append('<div id="dialogs">');
            }
            
            if(jQuery(this._registerSelector).length <= 0) {
                jQuery('#dialogs').load('/register?decorate=no&dialog=yes', function() {
                    jQuery('#dialogs button').remove();
                    
                    eny.modal.init({
                        selector: eny.register._registerSelector,
                        shadow: true,
                        width: 400,
                        height: 500,
                        buttons: {
                            "Register": function(event, ui) {
                                eny.register.submit();
                            },
                            "Cancel": function(event, ui) {
                                eny.register.cancel();
                            }
                        }
                    });
                    
                    eny.modal.setPriority(eny.register._registerSelector);
                    
                    eny.register.open();
                });
            }
            else {
                this.open();
            }
        },
        
        submit: function() {
            this._clearInvalid();
            
            var isValid = this._validate();
            if(isValid !== true) {
                this._invalid(isValid);
                return false;
            }
            
            var url = jQuery(this._registerSelector).attr('action');
            var data = jQuery(this._registerSelector).serialize();
            
            jQuery.post(url, data, function(data, textStatus) {
                if(data.length <= 0 && textStatus == 'success') {
                    eny.register._success(); 
                }
                else if(data.length > 0) {
                	jQuery(eval(data)).each(function(index, item) {
                		switch(item) {
                			case 'duplicate_email':
                				jQuery('#register-email-error-dupe').show();
                				jQuery('#register-email').addClass('ui-state-error');
                			break;
                			
                			case 'duplicate_username':
                				jQuery('#register-username-error-dupe').show();
                				jQuery('#register-username').addClass('ui-state-error');
                			break;
                		}
                	});
                	jQuery('.error-messages').show();
                }
                else {
                    eny.register._failure();
                }
            });
        },
        
        cancel: function() {
            this.close();
        },
        
        open: function() {
            this._clearInvalid();
            eny.modal.open(this._registerSelector);
        },
        
        close: function() {
            this._clearInvalid();
            eny.modal.close(this._registerSelector);
        }
        
    },
    
    /**
     * Send to a Friend
     */
    sendToFriend: {
    
        /**
         * @private
         */
        
        _url: '/sendtofriendmanager',
        _selector: false,
        _successSelector: false,
        
        _send: function() {
            this._clearInvalid();
            
            var isValid = this._validate();
            if(isValid !== true) {
                this._invalid(isValid);
                return false;
            }
            
            var data = jQuery(this._selector + ' form').serialize();
            
            jQuery.post(this._url, data, function(data, textStatus) {
                if(textStatus == 'success' && data.indexOf('send-to-friend-success') > -1) {
                    eny.sendToFriend._success();
                }
                else {
                    eny.sendToFriend._failure();
                }
            });
        },
        
        _cancel: function() {
            this.close();
        },
        
        _success: function() {
            this.close();
            eny.modal.init({
                selector: this._successSelector,
                shadow: true,
                buttons: {
                    "Ok": function(event, ui) {
                        eny.modal.close(eny.sendToFriend._successSelector);
                    }
                }
            });
            eny.modal.open(this._successSelector);
        },
        
        _failure: function() {
            jQuery(this._selector + '.error-messages, #send-error').show();
        },
        
        _validate: function() {
            var response = {};
            var email_filter = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            
            var form = jQuery(this._selector + ' form');
            jQuery(form).find(':input').each(function(index, element) {
                switch(element.name) {
                    case 'content_url':
                        if(element.value.length <= 0) {
                            response.content_url = 'invalid';
                        }
                    break;
                    
                    case 'send_from':
                        if(element.value.length <= 0) {
                            response.send_from = 'missing';
                        }
                        else if(!email_filter.test(element.value)) {
                            response.send_from = 'invalid';
                        }
                    break;
                    
                    case 'send_to':
                        if(element.value.length <= 0) {
                            response.send_to = 'missing';
                        }
                        else if(!email_filter.test(element.value)) {
                            response.send_to = 'invalid';
                        }
                    break;
                }
            });
            
            return (jQuery.param(response).length <= 0) ? true : response;
        },
        
        _invalid: function(invalidData) {
            jQuery.each(invalidData, function(element, error) {
                jQuery('#' + element).addClass('ui-state-error');
                jQuery('.error-messages').show();
                jQuery('#' + element + '-error-' + error).show();
            });
        },
        
        _clearInvalid: function() {
            jQuery(this._selector + ' form').find(':input').removeClass('ui-state-error');
            jQuery(this._selector).find('.error-messages, .error-messages div').hide();
        },
        
        _clearForm: function() {
        	jQuery(this._selector + ' form').find(':input').not('input[name=content_url]').val('');
        },
        
        /**
         * @public
         */
        
        init: function(selector) {
            this._selector = selector;
            this._successSelector = this._selector + '-success';
            
            eny.modal.init({
                selector: this._selector,
                shadow: true,
                width: 400,
                height: 500,
                buttons: {
                    "Send": function(event, ui) {
                        eny.sendToFriend._send();
                    },
                    "Cancel": function(event, ui) {
                        eny.sendToFriend._cancel();
                    }
                }
            });
            
            jQuery('.send-to-friend').click(function() {
                eny.sendToFriend.open();
                
                return false;
            });
            
            eny.modal.setPriority(this._selector);
        },
        
        open: function() {
            this._clearInvalid();
            this._clearForm();
            eny.modal.open(this._selector);
        },
        
        close: function() {
            this._clearInvalid();
            eny.modal.close(this._selector);
        }
    },
    
    /**
     * Disclaimer
     */
    disclaimer: {
        
        /**
         * @private
         */
        
        _selector: false,
        _cookie: {
            name: 'eny-disclaimer',
            value: '1',
            expires: '30'   // days
        },
        
        _isAuthenticated: function() {
            return (eny.cookie.read(this._cookie.name));
        },
        
        _close: function() {
            if(this._isAuthenticated()) {
                return false;
            }
            
            eny.disclaimer.decline();
        },
        
        /**
         * @public
         */
        
        init: function(selector) {
            if(this._isAuthenticated()) {
                return false;
            }
            
            this._selector = selector;
            
            eny.modal.init({
                selector: this._selector,
                overlay: true,
                autoOpen: true,
                width: 500,
                height: 500,
                buttons: {
                    "Accept": function(event, ui) {
                        eny.disclaimer.accept();
                    },
                    "Decline": function(event, ui) {
                        eny.disclaimer.decline();
                    }
                },
                close: function(event, ui) {
                    eny.disclaimer._close();
                }
            });
        },
        
        open: function() {
            eny.modal.open(this._selector);
        },
        
        close: function() {
            eny.modal.close(this._selector);
        },
        
        accept: function() {
            eny.cookie.create(this._cookie.name, this._cookie.value, this._cookie.expires);
            this.close();
        },
        
        decline: function() {
            location.href = 'http://www.google.com';
        }
        
    },
    
    /**
     * Modal Window
     */
    modal: {
        
        /**
         * @private
         */
        
        _modals: [],
        
        _create: function(options) {
            if(this._modals) {
                this._destroy();
            }
            
            var autoOpen = options.autoOpen || false;
            var overlay = options.overlay || false;
            var shadow = options.shadow || false;
            var close = options.close || function() { jQuery('.ui-overlay, .ui-widget-shadow').remove(); };
            var resizable = options.resizable || false;
            var draggable = options.draggable || false;
            var buttons = options.buttons || false;
            var minWidth = options.minWidth || false;
            var minHeight = options.minHeight || false;
            var maxWidth = options.maxWidth || false;
            var maxHeight = options.maxHeight || false;
            var width = options.width || false;
            var height = options.height || 'auto';
            var open = false;
            
            if(overlay && shadow) {
                open = eny.modal._initShadowWithOverlay;
            }
            else if(!overlay && shadow) {
                open = function() {
                    setTimeout("eny.modal._initShadow('" + options.selector + "');", 500);
                };
            }
            
            return jQuery(options.selector).dialog({
                open: open,
                close: close,
                autoOpen: autoOpen,
                modal: overlay,
                resizable: resizable,
                draggable: draggable,
                buttons: buttons,
                minWidth: minWidth,
                minHeight: minHeight,
                maxWidth: maxWidth,
                maxHeight: maxHeight,
                width: width,
                height: height
            });
        },
        
        _destroy: function(selector) {
            if(!selector || !this._modals[selector]) {
                return false;
            }
            
            this._modals[selector].dialog('destroy');
            jQuery('.ui-overlay, .ui-widget-shadow').remove();
        },
        
        _initShadow: function(selector) {
            if(!selector || !this._modals[selector]) {
                return false;
            }
            
            if(jQuery('.ui-widget-shadow').length <= 0) {
                jQuery('body').append('<div class="ui-widget-shadow ui-corner-all">');
            }
            
            selector = selector.replace('#', '');
            selector = selector.replace(' ', '-');
            selector = selector.toLowerCase();
            
            var position = jQuery('.ui-dialog[aria-labelledby=ui-dialog-title-' + selector + ']').offset();
            var width = jQuery('.ui-dialog[aria-labelledby=ui-dialog-title-' + selector + ']').width();
            var height = jQuery('.ui-dialog[aria-labelledby=ui-dialog-title-' + selector + ']').height();
            
            jQuery('.ui-widget-shadow').css({
                'position'  : 'absolute',
                'top'       : position.top,
                'left'      : position.left,
                'width'     : width + 7,
                'height'    : height + 7
            }).show();
        },
        
        _initShadowWithOverlay: function(selector) {
            if(!selector || !this._modals[selector]) {
                return false;
            }
            
            if(jQuery('.ui-overlay').length <= 0) {
                jQuery('.ui-widget-overlay').wrap('<div class="ui-overlay">');
                jQuery('.ui-overlay').append('<div class="ui-widget-shadow ui-corner-all">');
            }
            
            jQuery('.ui-overlay').show();
            
            setTimeout("eny.modal._initShadow('" + selector + "');", 500);
        },
        
        /**
         * @public
         */
        
        init: function(options) {
            if(!options || !options.selector) {
                return false;
            }
            
            this._modals[options.selector] = this._create(options);
        },
        
        open: function(selector) {
            if(!selector || !this._modals[selector]) {
                return false;
            }
            this._modals[selector].dialog('open');
        },
        
        close: function(selector) {
            if(!selector || !this._modals[selector]) {
                return false;
            }
            this._modals[selector].dialog('close');
            jQuery('.ui-overlay, .ui-widget-shadow').remove();
        },
        
        setPriority: function(selector) {
        	if(!selector) return false;
        	
        	jQuery(jQuery(selector).parent().find('.ui-dialog-buttonpane button')[0]).addClass('ui-priority-primary');
        }
        
    }
};

jQuery(document).ready(function() {
    eny.init();
});