﻿/// <reference path="jquery/jquery-vsdoc.js" />

//ExternalLinks - tracking based on http://www.iqcontent.com/blog/2007/02/tracking-documents-and-external-links-in-google-analytics/
(function($) {
    $.fn.extend({
        ExternalLinks : function() {            
            return this.each(function() {
                $(this).click(function() {                    
                    if (this.tagName != 'A') {
                        return false;
                    }
                    
                    var link = String(this);
                    var linkHost = this.hostname;
                    var siteHost = location.host;
                    
		            if (link.match(/^mailto:/i)) 
		            {
		                return HandleMailToLink(this);
		            }
		            else if (linkHost == siteHost) 
		            {
			            if(link.match(/\.(doc.aspx|pdf.aspx|xls.aspx|ppt.aspx|zip.aspx|txt.aspx|vsd.aspx|vxd.aspx|js.aspx|css.aspx|rar.aspx|exe.aspx|wma.aspx|mov.aspx|avi.aspx|wmv.aspx|mp3.aspx)$/)) 
			            {
		                    return HandleDocumentLink(this);
			            }
			            else
			            {
		                    return HandleInternalLink(this);
			            }
		            }
		            else 
		            {
		                return HandleExternalLink(this);
		            }
                });
            });
        
            function HandleMailToLink(anchor)
            {
                var email = anchor.href.substring(7);
                TrackLink('mailto', email);
                
                return true;
            }
            
            function HandleDocumentLink(anchor)
            {
                var doc = CleanURL(anchor.pathname, false);
                TrackLink('download', doc);                
                
                window.open(anchor.href);		            
                return false;
            }
            
            function HandleInternalLink(anchor)
            {             
                window.open(anchor.href);		            
                return false;
            }
            
            function HandleExternalLink(anchor)
            {
                var link = CleanURL(anchor.hostname+'/'+anchor.pathname, true);
                TrackLink('external', link);
                
                window.open(anchor.href);		            
                return false;
            }
            
            function TrackLink(type, virtualPath)
            {
                if (typeof(pageTracker) != 'undefined')
                {
	                var url = CleanURL(window.location.pathname, true);
	                if (url.length == 0)
	                {
	                    url = '/';
	                }
	                var linkStr = CleanURL('/virtual/'+type+url+'/'+virtualPath, true);
	                pageTracker._trackPageview(linkStr);
	            }
            }
            
            function CleanURL(url, end)
            {
	            var url = url.toString();
	            var urlLen = url.length;
            	
	            if (end)
	            {
		            if (url.charAt((urlLen-1))=='/') {
			            url = url.substring(0,(urlLen-1));
			        }
	            }
	            else
	            {
		            if (url.charAt(0)=='/') {
			            url = url.substring(1,urlLen);
			        }
	            }
	            return url;
            }
        }
    });
})(jQuery);

//ImageSwap
(function($) {
    $.fn.extend({
        ImageSwap : function() {                           
            return this.each(function() {
                if (this.tagName != 'IMG' || this.tagName != 'INPUT') {
                    var img = $(this);
                    var origSrc = img.attr('src');
                    var path = origSrc.substring(0, origSrc.lastIndexOf('.'));
                    var ext = origSrc.substring(origSrc.lastIndexOf('.'), origSrc.length);
                    path += '-on';
                    var swapSrc = path + ext;
                        
                    img.data('OrigSrc', origSrc);
                    img.data('SwapSrc', swapSrc); 
                    
                    var preloader = new Image();
                    preloader.src = swapSrc;
                    
                    img.hover(
                        function() {
                            $(this).attr('src', $(this).data('SwapSrc'));
                        },
                        function() {
                            $(this).attr('src', $(this).data('OrigSrc'));
                        }
                    );
                }
            });
        }
    });
})(jQuery);

(function($) {
    $.fn.DefaultValue = function(options) {
        //Build main options before element iteration
        var opts = $.extend({}, $.fn.DefaultValue.defaults, options);
        
        return this.each(function() {
            SetDefault(this, opts);
        });
        
        function SetDefault(obj, opts)
        {
            //We only want to set a default on textboxes, textareas and passwords
		    if(obj.type != 'text' && obj.type != 'password' && obj.type != 'textarea')
		    {
			    return;
			}
			    
            var $obj = $(obj);
            
			//Get the text we are going to use as the default
			var text = opts.Text;
			if (text.length == 0)
			{
			    text = $obj.attr('title');
			    $obj.attr('title', '');
			}
			
			if (text.length > 0)
			{    		
		        //Set value initially if none are specified
                if(obj.value == '' || obj.value == text)
                {
			        obj.value = text;
		        }
		        else
		        {
			        //Other value exists - ignore
			        return;
		        }
        		
		        //Remove values on focus
		        $obj.focus(function() {
			        if(this.value == text || this.value == '')
			        {
				        this.value = '';
				    }
		        });
        		
		        //Place values back on blur
		        $obj.blur(function() {
			        if(this.value == text || this.value == '')
			        {
				        this.value = text;
				    }
		        });
        		
		        //Capture parent form submission
		        //Remove field values that are still default
		        //$(this).parents("form").each(function() {
			        //Bind parent form submit
		        //	$(this).submit(function() {
		        //		if(fld_current.value==text) {
		        //			fld_current.value='';
		        //		}
		        //	});
		        //});
		    }
        }
    };
  
    //Plugin defaults
    $.fn.DefaultValue.defaults = {
        Text: ''
    };
})(jQuery);

function TrackPage(page)
{
    if (typeof(pageTracker) != 'undefined')
    {
        pageTracker._trackPageview(page);
    }
}

//Re-assigns a couple of the ASP.NET validation JS functions to provide a more flexible approach
function UpgradeASPNETValidation()
{
    // Hi-jack the ASP.NET error display only if required
    if (typeof(Page_ClientValidate) != "undefined")
    {
        ValidatorUpdateDisplay = NicerValidatorUpdateDisplay;
        AspPage_ClientValidate = Page_ClientValidate;
        Page_ClientValidate = NicerPage_ClientValidate;
    }
    
    $('span.EditingFormErrorLabel:visible').each(function(){
        AddValidationStatus($(this));
    });
}

function AddValidationStatus(obj)
{
    //if (obj.hasClass('validation'))
    //{
        var vc = obj.parents('div.validationContainer');
        if (vc.length == 0)
        {
            vc = obj.parents('div.formInput');
        }
        vc.addClass('invalid');
    //}
}

function RemoveValidationStatus(obj)
{
    //if (obj.hasClass('validation'))
    //{
        var vc = obj.parents('div.validationContainer');
        if (vc.length == 0)
        {
            vc = obj.parents('div.formInput');
        }
        vc.removeClass('invalid');
    //}
}

//Extends the classic ASP.NET validation
function NicerValidatorUpdateDisplay(val)
{
    var $val = $(val);
    if (val.isvalid)
    {
        $val.hide();        
        if ($val.parent().find('span.EditingFormErrorLabel:visible').length == 0)
        {            
            RemoveValidationStatus($val);
        }
    }
    else
    {
        $val.show();
        AddValidationStatus($val);
    }
}

//Extends classic ASP.NET validation to include parent element styling
function NicerPage_ClientValidate(validationGroup)
{
    var valid = AspPage_ClientValidate(validationGroup);
    if (!valid)
    {
        //$(this).parent().addClass('Invalid');
    }
    else
    {
        //$(this).parent().removeClass('Invalid');
    }
}

function InitNewsletterSignup()
{
    $('div#newsletterSignup input.TextBoxField').DefaultValue({Text: 'Enter your email address'});
    
    var body = $('body');
    if (body.attr('id') == 'HomePage')
    {
        var signup = $('div#newsletterSignup');
        var signupContainer = signup.find('div.container');
        var title = signupContainer.find('h3');
        var form = signupContainer.find('div.signupForm');
        var signupOffset = signup.offset().top;
        
        //Add a class so we know it is now expandable
        signup.addClass('expandable');
        
        //Find out if it is invalid or has been completed already so we can scroll to it, if not we need to hide it by default
        var messages = signup.find('span.EditingFormErrorLabel, p.confirmation');
        if (messages.length > 0)
        {
            $('html').attr({scrollTop: signupOffset});
            signupContainer.addClass('expanded');
            
            //Track confirmations
            var confirmation = signup.find('p.confirmation');
            if (confirmation.length > 0)
            {
                if (typeof(pageTracker) != 'undefined')
                {
	                pageTracker._trackPageview('/newsletter-signup-confirmation');
	            }
            }
        }
        else
        {
            form.hide();
            signupContainer.addClass('collapsed');
        }
        
        //Set up the title to trigger the expand/collapse
        title.click(function(){
            form.slideToggle(500);
            signupContainer.toggleClass('expanded');
            signupContainer.toggleClass('collapsed');
            
            //If it has been expanded we need to scroll to it
            if (signupContainer.hasClass('expanded'))
            {
                $('html').animate({scrollTop: signupOffset}, 500);
            }
        });
    }
}

function GetQueryValue(name)
{
    var query = window.location.search.substring(1);
    var vars = query.split("&");
    for (var i=0;i<vars.length;i++)
    {
        var pair = vars[i].split("=");
        if (pair[0] == name)
        {
            return pair[1];
        }
    }
}

function InitFreeSurvey()
{    
    var requestSurvey = document.getElementById('requestSurvey');
    if (requestSurvey)
    {
        var checkbox = $(requestSurvey).find('span.CheckBoxField input');
        var freeSurvey = GetQueryValue('freesurvey');
        if (freeSurvey == 'true' && !checkbox.is(':checked'))
        {
            checkbox.click();
        }
    }
}

function TrackResourceEvent(action, label)
{
    if (typeof(pageTracker) != 'undefined')
    {
        var category = 'Resource - ' + $('div#productNav ul ul a.CMSListMenuLinkHighlighted').text();
        pageTracker._trackEvent(category, action, label);
    }
}

function InitResourceList()
{
    var resourceGroupTitles = $('div.resourceList h2');
    if (resourceGroupTitles.length > 1)
    {
        resourceGroupTitles.each(function(){
            var title = $(this);
            var resourceList = title.parent();
            var resourceGroup = resourceList.find('div.resourceCategoryGroup');
            
            if (resourceGroup.length > 0)
            {                
                resourceList.addClass('collapsed');        
                resourceGroup.hide();
                
                title.click(function(){
                    resourceGroup.slideToggle(500);
                    resourceList.toggleClass('expanded');
                    resourceList.toggleClass('collapsed');
                    
                    //Track this as an event
                    var action = resourceList.hasClass('expanded') ? 'expanded' : 'collapsed';
                    var label = title.text();                    
                    TrackResourceEvent(action, label);
                });
            }
            
            InitResourceTitles(resourceList.find('div.resourceCategory h3'), title);
        });
    }
    else
    {
        InitResourceTitles($('div.resourceList div.resourceCategory h3'), null);
    }
}

function InitResourceTitles(resourceTitles, heading)
{
    var initTitles = true;
    if (heading == null)
    {
        initTitles = (resourceTitles.length > 1);
    }

    if (initTitles)
    {
        resourceTitles.each(function(){
            var title = $(this);
            var resourceCategory = title.parent();
            var resources = resourceCategory.find('div.resources');
            
            resourceCategory.addClass('collapsed');        
            resources.hide();
            
            title.click(function(){
                resources.slideToggle(500);
                resourceCategory.toggleClass('expanded');
                resourceCategory.toggleClass('collapsed');
                    
                //Track this as an event
                var action = resourceCategory.hasClass('expanded') ? 'expanded' : 'collapsed';
                var label = title.text();
                if (heading != null)
                {
                    label = heading.text() + ' - ' + label;
                }                
                TrackResourceEvent(action, label);
            });
        });
    }
}

function IEFixes()
{
    var body = $('body');
    if (body.hasClass('IE6') || body.hasClass('IE7') || body.hasClass('IE8'))
    {
        $('div#newsList div.article:last-child, div.productCategoryList div.document:last-child, div.office:last-child, div.whitepaper:last-child, div.resourceList div.resourceCategory:last-child').addClass('lastChild');
        
        if (body.hasClass('IE6'))
        {
            $('input.FormButton, div#sectorNav div.menu ul li, div#newsletterSignup h3, div#newsletterSignup input.FormButton, div.resourceList h2, div.resourceList div.resourceCategory h3').hover(function(){ $(this).addClass('hover'); }, function(){ $(this).removeClass('hover'); });
        }
    }
}

function InitPostInstallSurvey()
{
    $('body#PostInstallationSurveyPage div#hearAbout select').change(function(){
        var value = $(this).find('option:selected').attr('value')
        if (value == "Other")
        {
            $('div#hearAboutOther').show();
        }
        else
        {
            $('div#hearAboutOther').hide();
        }
    }).change();
}


var heroCycles = 0;
function InitHomePageHeroes()
{
    var $body = $('body');
    if (!$body.hasClass('Safari'))
    {
        sIFR.replace(dinBold, {
            selector: 'div#heroFeatures h2, div#heroFeatures li span',
            css: [
                '.sIFR-root { background-color: transparent; color: #ffffff; text-align: center; font-size: 18px; }',
                'a { background-color: transparent; color: #ffffff; display: block; text-align: center; text-decoration: none; } a:hover { color: #c64418; }'
            ],
            wmode: 'transparent',
            forceWidth: true,
            fitExactly: true,
            tuneWidth: 10,
            offsetTop: -5,
            ratios: [7, 1.47, 10, 1.43, 18, 1.36, 22, 1.34, 26, 1.32, 29, 1.31, 32, 1.32, 33, 1.3, 37, 1.31, 45, 1.3, 48, 1.29, 51, 1.3, 72, 1.29, 74, 1.28, 75, 1.29, 81, 1.28, 82, 1.29, 1.28]
        });
    }

    var heroTimer = $.timer(1000, function(){
        $('div#heroFeatures div.features').cycle({
            timeout: 6000, 
            speed: 2000,
            pause: 1,
            delay: -1000,
            after: function(){
                if (heroCycles > 2)
                {
                    $('div#heroFeatures div.features').cycle({timeout: 0 });                    
                }
                else
                {
                    if ($(this).hasClass('thirdHero'))
                    {
                        heroCycles++;
                    }
                }
            }
        }).addClass('cycle');
    },
    function(){
        $.clearTimer(heroTimer);    
    });
}

$(document).ready(function() { 
    UpgradeASPNETValidation();   
    InitNewsletterSignup();
    InitFreeSurvey();
    InitResourceList();
    InitPostInstallSurvey();
    InitHomePageHeroes();
    IEFixes();
    
    $('a[rel="external"]').ExternalLinks();
    $('div#siteSearch input.text').DefaultValue();
    $('div#accreditations img, input.image, div.boxFeature p.image img').ImageSwap();
});
