/*jslint devel: true, browser: true, sloppy: true, vars: true, white: true, maxerr: 50, indent: 4 */
/*global jQuery: false, $: false, Modernizr: false, getTwitters: false, testFont */

/**
 * North Rock Communications JS
 * http://northrock.bm/
 *
 * @author Tyler Rooney
 * @copyright 2011 North Rock Communications
 */
(function (window) {

    var nr = window.nr = window.nr || {};

    /**
     * nr.Nav
     * 
     * Modern browsers fades. Oldie hides.
     * 
     * @uses jQuery.hoverIntent
     */
    nr.Nav = (function() {
        var oldIE = ($('html.oldie').length === 1);
        
        var overFade = function(e) {
            $(e.currentTarget).children('.subnav').fadeIn(175);
        }
        var outFade = function(e) {
            $(e.currentTarget).children('.subnav').fadeOut(125);
        };
        
        var overShow = function(e) {
            $(e.currentTarget).children('.subnav').show();
        };
        var outHide = function(e) {
            $(e.currentTarget).children('.subnav').hide();
        };
        
        $("#nav .item").hoverIntent({
            sensitivity: 7,
            interval: 125,
            timeout: 50,
            over: (oldIE ? overShow : overFade),
            out: (oldIE ? outHide : outFade)
        });
    })();

    /**
     * nr.Fixes
     *
     * Fixing various issues
     */
    nr.Fixes = ((function() {
        
        // Add first-child class
        $(function(){
            $('th:first-child, td:first-child').addClass('first');
        });

        // IE7 doesn't respect of fancy buttons
        $('.ie7 .search input[type=submit]').val('');


    })());

    /**
     * nr.TwitterFeed
     *
     * The homepage twitter feed
     * 
     * @uses Modernizr
     * @users TwitterJS 
     */
    nr.Twitter = (function() {
        
        var containerEl = null;
        var tweetsEl = null;
        
        var bindHandlers = function() {
            $('.next', containerEl).click(next);
            $('.prev', containerEl).click(prev);
        };
        
        var next = function() {
            var tweet = $('ul li', tweetsEl).first().detach();
            $('ul', tweetsEl).append(tweet);
        };
        
        var prev = function() {
            var tweet = $('ul li', tweetsEl).last().detach();
            $('ul', tweetsEl).prepend(tweet);
        };
        
        return {
            init: function() {
                
                // Bind elements
                containerEl = $('#twitter-feed');
                tweetsEl = $('#tweets', containerEl);
                
                Modernizr.load({
                    test: tweetsEl[0],
                    yep: 'http://twitterjs.googlecode.com/svn/trunk/src/twitter.min.js',
                    complete: function() {
                        if (tweetsEl[0]) {
                            try {
                                nr.Twitter.run();
                            } catch(e) {
                                tweetsEl.empty().append('<ul><li><p>Whoops! Twitter feed unavailable. Please check back later!</p></li></p>');
                            }
                        }
                    }
                });
            }, 
            run: function() {
                // Create twitter feed
                getTwitters(tweetsEl.attr('id'), {
                    id: 'hellobermuda',
                    count: 5,
                    enableLinks: true,
                    ignoreReplies: true,
                    newwindow: true,
                    clearContents: true,
                    template: '<p>%text%</p>',
                    callback: bindHandlers // setup handlers
                });             
            }
        };
        

        
    })();

    


    /**
     * nr.Forms namespace
     * 
     * @uses Modernizr
     * @uses jQuery.validationEngine
     */
    nr.Forms = {
        init: function() {

            Modernizr.load({
                test: $('form.validate')[0],
                yep: [
                    '/js/libs/validation/languages/jquery.validationEngine-en.js',
                    '/js/libs/validation/jquery.validationEngine.js',
                    '/js/libs/validation/css/validationEngine.jquery.css'
                ],
                complete: function() {
                    if ($('form#sign-up')[0]) {
                        nr.Forms.SignUp();
                    }
                    if ($('form#call-back')[0]) {
                        nr.Forms.CallBack();
                    }
	                if ($('form#phone-listing')[0]) {
		                nr.Forms.PhoneListing();
	                }
                }
            });

        }
    };
    
    /**
    * nr.Forms.SignUp
    */
    nr.Forms.SignUp = function() {

        var formEl = $('#sign-up');
        var cancelEl = $('form .cancel');
        var directions = $('fieldset.directions');
        var accessTypes = $('.access-types');
        var watchInternet = $('#SignUpsInternet');
        var watchWimax = $('#SignUpsHomePhone, #SignUpsAccessTypeWireless');


        formEl.validationEngine({
            scroll: false
        });

        cancelEl.click(function() {
            if (confirm('Are you sure?')) {
                formEl.validationEngine('hideAll');
                return history.go(-1);
            }
        });

        formEl.change(function() {
            // Internet
            if (watchInternet.is(':checked') && !accessTypes.is(':visible')) {
                accessTypes.slideDown();
            }
            if (!watchInternet.is(':checked') && accessTypes.is(':visible')) {
                accessTypes.slideUp();
                accessTypes.find('input').attr('checked', false);
            }
            // Wimax Site Visit
            if (watchWimax.is(':checked') && !directions.is(':visible')) {
                directions.slideDown();
            }
            if (!watchWimax.is(':checked') && directions.is(':visible')) {
                formEl.validationEngine('hideAll');
                directions.slideUp();

            }
        });
            
    };

    /**
    * nr.Forms.CallBack
    */
    nr.Forms.CallBack = function() {

        var formEl = $('#call-back');
	    var cancelEl = $('form .cancel');

        formEl.validationEngine({
            scroll: false
        });

        cancelEl.click(function() {
            if (confirm('Are you sure?')) {
                formEl.validationEngine('hideAll');
                return history.go(-1);
            }
        });
            
    };

	/**
	 * nr.Forms.PhoneListing
	 */
	nr.Forms.PhoneListing = function () {

		var formEl = $('#phone-listing');
		var cancelEl = $('form .cancel');
		var listingDetailsEl = $('.listing-details');
		var listingToggleEl = $('#PhoneListingsListed');

		formEl.validationEngine({
			scroll:false
		});

			if (listingToggleEl.attr('checked')) {
				listingDetailsEl.show();
			} else {
				listingDetailsEl.hide();
			}

		listingToggleEl.click(function() {
			listingDetailsEl.toggle();
		});


		cancelEl.click(function () {
			if (confirm('Are you sure? Your listing will remain unchanged')) {
				formEl.validationEngine('hideAll');
				window.location = 'http://' + document.location.host + '/';
				return false;
			}
		});

	};




    /**
     * nr.Chat
     *
     * Handles ProviderSupport.com chat functionality
     * 
     * @uses ProvideSupport (tracking pixel)
     */
    nr.Chat = ((function() {
        
        /**
       * Link to tracking image from ProvideSupport. Status of chat is determined
       * by the width of the image:
       *     2 pixels -- chat is online
       *     1 pixel -- chat is offline
       */
        var PROVIDE_SUPPORT_LINK = "http://image.providesupport.com/online-presence-image/northrock";
        
        var online = false; // Status of chat reps
        var poll = null; // setInterval handler

        var buttonsOnline = function() {
            var el = $('.chat');
            if (!el.hasClass('text-link')) {
                el.removeClass('chat-offline').children('.sprite').remove();
            } else {
                el.removeClass('chat-offline').parent().removeClass('invisible');
            }
        };

        var buttonsOffline = function() {
            var el = $('.chat');
            if (!el.hasClass('text-link')) {
                var sprite = $('<span class="sprite">Offline</span>');
                el.addClass('chat-offline').append(sprite);
            } else {
                el.addClass('chat-offline').parent().addClass('invisible');
            }
        };

        var pollStatus = function() {
            var trackingPixel = new Image();
            trackingPixel.src = PROVIDE_SUPPORT_LINK + '?t=' + (new Date()).getTime();
            trackingPixel.onload = function() {
                (online = (trackingPixel.width === 2)) ? buttonsOnline() : buttonsOffline();
                //console.log(['nr.Chat.status', online, 'trackingPixel', trackingPixel.width]);
            }
        };

        return {
            init: function() {
                var chatEl = $('.chat, a[href*="/support/chat"]');
                
                if (!chatEl[0]) return;
                
                pollStatus();
                this.startPoll();

                chatEl.click(function(e){
                    console.log('click');
                    e.preventDefault();
                    e.stopImmediatePropagation();
                    if (online) {
                        console.log('open');
                        nr.Chat.openChat();
                    }
                });
                
            },
            openChat: function() {
                window.open('http://messenger.providesupport.com/messenger/northrock.html','1317061258888','width=680,height=460,toolbar=0,menubar=0,location=1,status=0,scrollbars=1,resizable=1,left=0,top=0');
            },
            startPoll: function() {
                poll = setInterval(pollStatus, (10000));
            },
            stopPoll: function() {
                poll = clearInterval(poll);
            },
            buttonsOnline: buttonsOnline,
            buttonsOffline: buttonsOffline
        };
    })());


    /**
     * nr.Unicode
     *
     * Checks that the default font supports a wide-range of Unicode
     * characters like ✓ or ©. If not, try some alternative fonts.
     * Otherwise perform character replacement
     */
    nr.Unicode = ((function() {
        var CHAR_UNSUPPORTED = 0;      // Replace characters
        var CHAR_SUPPORTED = 1;    // Large range of unicode characters supported
        var CHAR_UPDATE_FONT = 2; // Fall back to alternate unicode font

        var COOKIE_NAME = 'CHAR_SUPPORT_V1';
        var ALTERNATE_FONT = 'Arial Unicode MS';

        var validateCharacter = function() {
            var compare = (document.getElementById('char-to-check').offsetWidth === document.getElementById('not-renderable').offsetWidth);
            return !compare;
        };
        
        var validateFont = function() {
            return testFont(ALTERNATE_FONT);
        };
        

        return {
           init: function() {
               var testCharState = null;
               
               if (typeof $.cookie(COOKIE_NAME) === 'string') {
                   testCharState = parseInt($.cookie(COOKIE_NAME),10); // Note we parse to integer
               } else {
                   testCharState = this.check();
                   $.cookie({COOKIE_NAME: testCharState}, {path: '/'});
               }

               switch (testCharState) {
                   case CHAR_UNSUPPORTED:
                       $('.check').html('X');
                       break;
                    case CHAR_UPDATE_FONT:
                        $('html').addClass('altUnicodeFont');
                        break;
                    case CHAR_SUPPORTED:
                    default:
                         // do nothing
               }

           },
           check: function() {
               if (validateCharacter()) 
                   return CHAR_SUPPORTED;

               if (validateFont()) 
                   return CHAR_UPDATE_FONT;

               return CHAR_UNSUPPORTED;
           }
        };

    })());


    /**
     * nr.Effects
     *
     * Animates the fills on the highspeed / wireless service pages
     */
    nr.Effects = (function() {

        /**
       *  Determines if the element is within window's viewport
       */
        function isInView(el, allowPartial) {
            var windowTop = $(window).scrollTop();
            var windowBot = windowTop + $(window).height();

            var elTop = $(el).offset().top;
            var elBot = elTop + $(el).height();

            var isVisible = (allowPartial === true)
                ? ((elBot >= windowTop) && (elTop <= windowBot) && (elBot <= windowBot) &&  (elTop >= windowTop))
                : ((elBot >= windowTop) && (elTop <= windowBot));

            return isVisible;
        }
        
        function animateFills(detailsEl) {
             $('.fill', detailsEl).each(function (i, el) {
                var w = $(el).width();
                $(el).width('0').animate({
                    width: w
                }, 2500);
            });   
        }
        
        return {
            init: function () {
                var detailsEl = $('.details');
                
                if (detailsEl.length < 1) 
                    return;
                
                if (isInView(detailsEl)) {
                    animateFills(detailsEl);
                    return;
                }
                    
                $(document).bind('scroll.Effects', function () {
                    if (isInView(detailsEl)) {
                        $(document).unbind('scroll.Effects');
                        animateFills(detailsEl);
                    }
                        
                });
            }
        };
    }());
    
    nr.EasterEggs = (function(){
        
        var konami = function() {
            var kkeys = [], konami = "38,38,40,40,37,39,37,39,66,65";
            $(document).keydown(function (e) {
                kkeys.push(e.keyCode);
                if (kkeys.toString().indexOf(konami) >= 0) {
                    $(document).unbind('keydown', arguments.callee);
                    var kanye = $('<img id="kanye" src="/img/fun/kanye.png" />');
                    $('body').append(kanye);        
                }
            });     
        };
        
        return {
            init: function() {
                konami();
            }
        }
        
    }());
    
    /**
    * nr.SocialMedia
    * 
    * @uses Facebook JS SDK
    */
    nr.SocialMedia = (function() {
        
        var facebook = function() {
            (function(d, s, id) {
              var js, fjs = d.getElementsByTagName(s)[0];
              if (d.getElementById(id)) {return;}
              js = d.createElement(s); js.id = id;
              js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
              fjs.parentNode.insertBefore(js, fjs);
            }(document, 'script', 'facebook-jssdk'));
        };

        return {
            init: function() {
                if($('.like-buttons').length >= 1) {
                    facebook();
                }
            }
        }
    })();


    /**
    * Initialize things in the nr namespace
    * 
    * If nr.{whatever}.init() exists, intialize it
    */
    for (var namespace in nr) {
        if (nr.hasOwnProperty(namespace) && typeof nr[namespace] === 'object' && typeof nr[namespace].init === 'function') {
            //console.log('nr.' + namespace + '.init');
            nr[namespace].init();
        }
    }

    return nr;

})(window);
