﻿//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() {                  
                if (this.tagName != 'A') {
                    return false;
                }
                
                var link = String(this);
                var linkHost = this.hostname;
                var siteHost = location.host;
                
	            if (link.match(/^mailto:/i)) 
	            {
                    $(this).click(function() {  
		                return HandleMailToLink(this);
                    });
	            }
	            else if (linkHost == siteHost) 
	            {
		            if(link.match(/\.(doc|pdf|xls|ppt|zip|txt|vsd|vxd|js|css|rar|exe|wma|mov|avi|wmv|mp3)$/)) 
		            {
                        ModifyTitleAttribute(this);  
                        $(this).click(function() {  
		                    return HandleDocumentLink(this);
                        });
		            }
		            else
		            {
                        $(this).click(function() {  
	                        return HandleInternalLink(this);
                        });
		            }
	            }
	            else 
	            {
                    ModifyTitleAttribute(this); 
                    $(this).click(function() {  
		                return HandleExternalLink(this);
                    });
		        }
            });
        
            function HandleMailToLink(anchor)
            {
                var email = anchor.href.substring(7);
                TrackLink('email', email);
                
                return true;
            }
            
            function HandleDocumentLink(anchor)
            {
                var doc = CleanURL(anchor.pathname, false);
                TrackLink('documents', 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 linkStr = CleanURL('/'+type+'/'+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;
            }
            
            function ModifyTitleAttribute(anchor)
            {
                var jAnchor = $(anchor);
                var title = $(anchor).attr('title');
                if (title.length > 0)
                {
                    title += ' [opens in a new window]';
                }
                else
                {
                    title += 'Opens in a new window';
                }
                jAnchor.attr('title', title);
            }
        }
    });
})(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.addClass('hasDefault');
			        obj.value = text;
		        }
		        else
		        {
			        //Other value exists - ignore
			        return;
		        }
        		
		        //Remove values on focus
		        $obj.focus(function() {
			        if(this.value == text || this.value == '')
			        {
                        $(this).removeClass('hasDefault');
				        this.value = '';
				    }
		        });
        		
		        //Place values back on blur
		        $obj.blur(function() {
			        if(this.value == text || this.value == '')
			        {
                        $(this).addClass('hasDefault');
				        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);

//Re-assigns a couple of the ASP.NET validation JS functions to provide a more flexible approach
function ModifyASPNETValidation()
{
    //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;
    }
    
    //Add validation statuses to any validation controls that may be visible (i.e. visible when the page loads)
    $('span.validation:visible,span.EditingFormErrorLabel:visible').each(function(){
        AddValidationStatus($(this));
    });
}

function AddValidationStatus(obj)
{
    if (obj.hasClass('validation') || obj.hasClass('EditingFormErrorLabel'))
    {
        //We'll look for a validation container to set the status on
        var vc = obj.parents('div.validationContainer');
        if (vc.length == 0)
        {
            //Fall back to div.formInput
            vc = obj.parents('div.formInput');
        }
        vc.addClass('invalidInput');
    }
}

function RemoveValidationStatus(obj)
{
    if (obj.hasClass('validation') || obj.hasClass('EditingFormErrorLabel'))
    {
        //We'll look for the validation container to remove the status
        var vc = obj.parents('div.validationContainer');
        if (vc.length == 0)
        {
            //Fall back to div.formInput
            vc = obj.parents('div.formInput');
        }
        vc.removeClass('invalidInput');
    }
}

//Extends the classic ASP.NET validation
function NicerValidatorUpdateDisplay(val)
{
    var $val = $(val);
    if (val.isvalid)
    {
        //Hide the validation control
        $val.hide();        
        
        //Remove the validation status if there are no more validaiton controls visible
        if ($val.parent().find('span.validation:visible,span.EditingFormErrorLabel:visible').length == 0)
        {            
            RemoveValidationStatus($val);
        }
    }
    else
    {
        //Show the validation control
        $val.show();
        
        //Add the validation status
        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('invalidInput');
    }
    else
    {
        //$(this).parent().removeClass('invalidInput');
    }
    return valid;
}

function InitFeatureExpanders()
{
    $('div.feature div.expander').each(function(){
        var expander = $(this);
        var title = expander.find('p.title a');
        var content = expander.find('div.expanderContent');
             
        if (content.hasClass('expanded'))
        {
            content.slideDown(0);
            content.removeClass('expanded');
            expander.addClass('expanded');
        }
        else
        {
            expander.addClass('collapsed');
        }       
        
        title.click(function(){
            if (expander.hasClass('collapsed'))
            {
                content.slideDown(200);
                //content.find('input.text').focus();
            }
            else
            {
                content.slideUp(200);
            }
            expander.toggleClass('collapsed');
            expander.toggleClass('expanded');
            return false;
           });  
    });
}

function TrackTabs(tabs)
{
    tabs.each(function(){
        var tabLinks = tabs.find('ul.tabs li a');
        tabLinks.click(function(){
            //Track in GA
            var pathName = location.pathname;
            var tabTitle = $(this).text();
            tabTitle = tabTitle.toLowerCase().replace(' ', '-');
            try
            {
				TrackGAPage(pathName + '/' + tabTitle);
			}
			catch (e) { }
        });
    });
}

function InitTabs()
{
    var tabs = $('div.tabbed');
    tabs.tabs({ cookie: { expires: 30} });
    TrackTabs(tabs);
}

function InitComparisonTables()
{
    var rows = $('table.comparison tr');
    rows.each(function(){
        var row = $(this);
        var cols = row.find('th,td');
        cols.each(function(){
            var col = $(this);
            if (cols.index(col) % 2 != 0)
            {
                col.addClass('alt');
            }
        });
    });
}

$(document).ready(function(){
    //Handle all links with rel = external
    $('a[rel="external"]').ExternalLinks();
    
    $('div#quickSearch input.text').DefaultValue();
    $('div.feature div.subscribeForm input.text').DefaultValue();
    
    //Modify the standard .NET client validation so we can have a bit more control over presentation
    ModifyASPNETValidation();

    InitFeatureExpanders();
    
    InitTabs();
    
    InitComparisonTables();
});

