//Windows Live utility namepsace
var WL = function () {
    return {
        onloadEvents: [],
        isReady:false
    }
}();

WL.registerOnloadEvent = function (f) {
    WL.onloadEvents.push(f);
};

WL.runOnloadEvents = function () {
    $.each(WL.onloadEvents, function (i,o) {
        if (typeof WL.onloadEvents[i] == "function") WL.onloadEvents[i]();
    });
};

$(document).ready(function() {
    primaryNav();
    tabs();
    openModal();
    signInModal();
    initPESelect();
//    initToolTips();
    scenarioHover();
    scenarioToggle();
    stripePostListing();
    WL.eventHandler.activate();/* run these last */
    WL.runOnloadEvents();/* run these last */
    
});
/*
var initToolTips = function (selectors) {
    selectors = selectors || 'ul.badges, h4.postTT, a.productTT, a.rssTT, span.flagTT, .badgeTT';
    $(selectors).hoverIntent({
        over: function (e) {
            var $e = $(e.target);
            var newId = 'miclone' + Math.floor(Math.random() * 10000);
            $e.data('miclone',{'id':newId});
            moreInfo($(this), e);
            //console.log($e.data('miclone'));
        },
        out: function (e) {if ($('#moreInfo:visible').length > 0) moreInfo($(this), e)},
        sensitivity: 100,
        interval: 100,
        timeout: 200
     }); 
};
*/

/*
Progressively Enhanced Select Menu
Takes a regular select menu, hides it, builds a custom select widget based on the select options. As options are chosen, the widget updates the hidden select menu and submits the original form.
*/
var initPESelect = function () {
    $('.origSelect').each(function () {
        var $sel = $(this).find('select'), html = ['<div class="peSelect"><div class="peButtonCont"><a href="#" class="peButton">Select one&hellip;</a></div><div class="peSubmitCont"><a href="#" class="scEvent15 cta peSubmit">Go</a></div><ul class="closed">'];
        var temp = $sel.find('option').not('.choose').each(function () {
            html.push('<li><a href="#" title="'+$(this).attr('value')+'" class="peOption">' + $(this).html() + '</a></li>');
        });
        if ($sel.find('option:selected').length == 1)
        html.push('</ul></div>');
        $sel.siblings('input.cta').andSelf().addClass('hidden');
        $sel.after(html.join(''));
        var $selectedOption = $sel.find('option:selected');
        if ($selectedOption.length == 1) $(this).find('.peButton').html($selectedOption.html());
    });
};

WL.eventHandler = {
    activate: function () {
    //return false;
        $(document).bind('click', function (e) {//master click listener
	        if (e.target.className && WL.eventHandler.events != null) {
                var classNames = e.target.className.split(' '), pd = false, keepOpen = [];
                $.each(classNames, function (i,o) {
                    if (WL.eventHandler.events[o]) {
                        var returnData = WL.eventHandler.events[o]($(e.target)), params = typeof returnData == 'undefined'? false: returnData;
                        keepOpen = params? params.keepOpen : [];
                        pd = params && typeof params.pd != 'undefined'? params.pd : true;
                    }
                });
                if (pd) e.preventDefault();
	        }
	        WL.closeMenus(keepOpen);
        }); 
        $(document).bind('keypress', function (e) {
            switch (e.keyCode) {
                case 27://escape key closes open menus
                WL.closeMenus();
            }
        });
    },
    trigger: function (className) {
        WL.eventHandler.events[className]($());
    },
    events: {//reserved class names mapped to functions
        'peButton': function ($e) {
            var $ul = $e.parents('.peSelect').find('ul');
            $ul.toggleClass('closed');
            return {keepOpen: $ul.is(':visible')? $ul:[]};
        },
        'peOption': function ($e) {
            var $parent = $e.parents('.origSelect');
            $parent.find('select option[value=' + $e.attr('title') + ']')[0].selected = true;
            $parent.find('input.cta').val($e.attr('title'));
            $parent.find('a.peButton').html($e.html());
        },
        'peSubmit': function ($e) {
            $e.parents('.origSelect').find('input.cta').trigger('click');
        },
        'preventDefault': function ($e) {
            return {pd:true};
        }
    }
};

WL.closeMenus = function (keepOpen) {
    if (typeof keepOpen == 'undefined' || keepOpen == null) keepOpen = [];
    $('.peSelect ul:visible, #shareThis .hoverCont:visible').not(keepOpen).addClass('closed');
    //moreInfo();
};

var moreInfo = function ($this, e) {
    //display container
    //position moreInfo container
    var $mi = $('#moreInfo'), showArrow = true;
    if ($mi.is(':visible') || e==null) {
        $mi.find('.left, .right').css({marginTop:0});
        $mi.addClass('closed').removeClass('arrowRight').removeClass('arrowLeft').css({top:-9999,left:-9999}).find('.badgesDetail, .badgesCHDetail, .postDetail, .productDetail, .rssDetail, .flagPostDetail').hide();
        $mi.appendTo('#wrapper');
    } else {
        var $e = $(e.target);
        $e = $e.is('ul.badges, h4.postTT')? $e:$e.parents('ul.badges, h4.postTT').length > 0?$e.parents('ul.badges, h4.postTT'):$e.parents('.productTT').length > 0?$e.parents('a.productTT'):$e;
        //add class or populate moreInfo container with data
        var miContent = '';
        if ($e.is('.badges') || $e.is('.badgeTT')) {
            if ($e.is('.ch')) miContent = '.ch';
            else miContent = '.badgesDetail:not(.ch)';
        } else if ($e.is('.productTT')) {
            miContent = '.productDetail';
            //pop data
            $mi.find('.productDetail h3').html($e.attr('rel'));
            $mi.find('.productDetail p').html($e.find('span.description').html());
            
        } else if ($e.is('.postTT')) {
            miContent = '.postDetail';
            //pop data
            var $parent = $e.parents('.body');
            $mi.find('.postDetail .summary').html($parent.find('.summary').html());
            $mi.find('.postDetail .tags').html($parent.find('dd.tags').html());
            $mi.find('.postDetail .views').html($parent.find('dd.views').html());
            $mi.find('.postDetail a.title').html($e.text()).attr({'href':$e.find('a.name').attr('href')});
            $mi.find('.postDetail a.cta').attr({'href':$e.find('a.name').attr('href')});
            $mi.appendTo($e);
            if ($.browser.msie) showArrow = false; //need to determine why IE does not have modal height correct on first hover yet its correct on 2nd hover (seems to be a outerHeight()) issue in the var difference line.. -sf
        } else if ($e.is('.rssTT')) {
            miContent = '.rssDetail';
        } else if ($e.is('.flagTT')) {
            miContent = '.flagPostDetail';
        }
        $mi.find(miContent).show();
        
        var targetPos = $e.offset(), w = $('body').width(), arrowClass = '', miLeft = 0;
        $mi.removeClass('closed');
        if (w/2 - targetPos.left < 0 ) {
            if (showArrow) $mi.addClass('arrowRight');
            miLeft = targetPos.left - $mi.outerWidth();
        } else {
            if (showArrow) $mi.addClass('arrowLeft');
            var postDetailOffset = miContent == '.postDetail'? 50:0;
            miLeft = targetPos.left + $e.outerWidth() -postDetailOffset;
        }
        
        //upon first hover in IE, outerHeight is incorrect. second time hover, outerHeight is correct. Seems outerHeight is originally calculated before content is loaded and then once it has been loaded once, it will display using the proper outerHeight according to the content. -sf
        
        var difference = targetPos.top - $mi.outerHeight() + 50 - $(document).scrollTop();
        var top = difference < 0? $(document).scrollTop():targetPos.top - $mi.outerHeight() + 50;
        var arrowOffset = difference < 0? $mi.outerHeight() - 58 + difference:$mi.outerHeight() - 58;
        $mi.css({top:top,left:miLeft}).find('.left, .right').css({marginTop:arrowOffset < 0? 0:arrowOffset});
        
    }
};

function primaryNav()
{
    var subNav = $('.nav .subNavWrapper');    
    subNav.each(function()
    {
        //apply the rounded background box to the sub navigation
        $(this).wrapInner('<div class="mid"><div class="l"><div class="r"><div class="m">');
        $(this).children('.mid').before('<div class="top"><div class="l"></div><div class="m"></div><div class="r"></div></div>');
        $(this).children('.mid').after('<div class="bottom"><div class="l"></div><div class="m"></div><div class="r"></div></div>');
    });

    var $navDDs = $('#navProducts, #navAction, #navCHAbout, #navCHHowTo');
    $navDDs.hoverIntent({
        over: function () {
            $(this).find('.subNavWrapper').removeClass('closed');
            },
        out: function () {
            $(this).find('.subNavWrapper').addClass('closed');
            },
        sensitivity: 100,
        interval: 100,
	    timeout: 10
    });
}

function tabs()
{
    $('div.tabWrapper div.tabContent').each(function()
    {
        $(this).addClass('closed');
    });
    
    $('ul.tabs:not(.admin) a:first').addClass('current');
    
    $('div.tabWrapper div:first').addClass('open').removeClass('closed');
    
    $('ul.tabs:not(.admin) a').click(
    function()
    {
        $('ul.tabs a').each(function()
        {
            $(this).removeClass('current');            
        });       
        
        $(this).addClass('current');
        
        $('div.tabWrapper div.tabContent').each(function()
        {
            $(this).removeClass('open')
                   .addClass('closed');
        });

        $('div.tabWrapper div' + $(this).attr('href'))
            .toggleClass('open')
            .removeClass('closed');
        return false;
    });
}

/* Scenarios */
function scenarioHover()
{
   $('#scenarioLanding .scenarios').hover(
   function()
   {
      $(this).addClass('hoverOn');
   },
   function()
   {
      $(this).removeClass('hoverOn');
   });
}

function scenarioToggle()
{
   $('#scenarioDetail .desc, #tour .desc').each(
   function()
   {
      $(this).addClass('toggle');
   });
   
   
   $('#scenarioDetail .desc p, #scenarioDetail .desc a, #tour .desc p, #tour .desc a').each(
   function()
   {
      $(this).addClass('closed');
   });
   
   $('#scenarioDetail .toggle, #tour .toggle').click(
   function()
   {
      $(this).children().toggleClass('closed');
      $(this).children('h5').toggleClass('closed').toggleClass('open');
   });
}
/* End Scenarios */
 

function openModal()
{
    $('.advocateBlock .openModal').each(
    function()
    {
        //$(this).find('div#' + this.id.replace('advocateDetail','modalAdvocate'))

        $('.advocateBlock div#' + this.id.replace('advocateDetail','modalAdvocate')) 
        .jqDrag('.jqDrag')
        .jqResize('.jqResize')
        .jqm({
          trigger: '#' + $(this).attr('id'),
          overlay: 0,
          onShow: function(h) {
            /* callback executed when a trigger click. Show notice */
            h.w.slideDown(); 
            },
          onHide: function(h) {
            /* callback executed on window hide. Hide notice, overlay. */
            h.w.slideUp("slow",function() { if(h.o) h.o.remove(); }); }
          });
       });
}
 
// ****************************
// SIGN IN MODAL
// ****************************
function signInModal()
{
    
        $('div#signInModal').jqm();
        
        $('div#signInModal input#login').click( function() {
            var userid = $('div#signInModal input#user_id').val();
            window.location.href = window.location.href + "?login=" + userid; //put live id here
        });
    
}


/* /Explore */
/* Product landing page product detail functionality */
WL.registerOnloadEvent(function () {
    //bind click to products
    WL.eventHandler.events['getProductDetail'] = function ($e) {getProductDetail($e)};
    WL.eventHandler.events['getProductDetailSpan'] = function ($e) {$e = $e.parent(); getProductDetail($e)};
});


WL.ajaxQueue = [];

var getProductDetail = function ($e) {
    $('ul.prodLayout3x a').removeClass('selected');
    if ($e.parents('.worksGreatWith').length == 1) $('ul.prodLayout3x li.' + $e.attr('rel').toLowerCase() + ' a').addClass('selected');
    else $e.addClass('selected');
    
    var ajaxTest = $.ajax({
        beforeSend: function (xhr) {
            $.each(WL.ajaxQueue, function (i,o) {
                WL.ajaxQueue[i].abort();
            });
            WL.ajaxQueue = [];
            WL.ajaxQueue.push(xhr);
        },
        complete: function () {
            WL.ajaxQueue = [];
        },
        data:null,
        dataType:'html',
        url:'/Explore/GetDetail/' + $e.attr('rel'),
        success: function (response) {
            $('.main').html(response);
            //initToolTips('ul.badges, h4.postTT, .worksGreatWith .productTT');
        },
        error: function () {
        
        }
    });
};

var stripePostListing = function () {
    $('.advoPost.apFull > li:nth-child(odd)').addClass('odd');
};