﻿/// <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|pdf|xls|ppt|zip|txt|vsd|vxd|js|css|rar|exe|wma|mov|avi|wmv|mp3)$/)) 
			            {
		                    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 = '/home';
	                }
	                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.FancyDropDown = function(options) {
        //Build main options before element iteration
        var opts = $.extend({}, $.fn.FancyDropDown.defaults, options);
        
        return this.each(function() {
            CreateFancyDropDown(this, opts);
        });
    };
    
    //Private functions
    function CreateFancyDropDown(origDD, opts)
    {
        if (origDD.tagName == 'SELECT')
        {
            var $origDD = $(origDD);
            var selected = $origDD.find("option[selected]");
            var options = $("option", $origDD);
            var origDDId = origDD.id;
            var fancyDDId = origDDId + opts.ddIdSuffix;
            
            //Create the list structure
            var $fancyDD = $('<dl id="' + fancyDDId + '" class="' + opts.ddClass + '"></dl>');
            $fancyDD.append('<dt><a href="#">' + selected.text() + '<span class="value">' + selected.val() + '</span></a></dt>');
            $fancyDD.append('<dd><ul></ul></dd>');
            
            //Add the options
            var itemIndex = -1;
            options.each(function(){                
                itemIndex++;
                var text = $(this).text();
                var value = $(this).val();
                
                var item = $('<li><a href="#">' + $(this).text() + '<span class="value">' + $(this).val() + '</span></a></li>');
                if (value == selected.val())
                {
                    item.addClass('selected');
                }
                if (itemIndex == 0)
                {
                    item.addClass('first');
                }
                if (itemIndex == options.length - 1)
                {
                    item.addClass('last');
                }
                
                $("dd ul", $fancyDD).append(item);
                opts.onItemDataBound(item);
            });
            
            //Hide the original drop down and add the fancy drop down to the page and hide the options by default
            $origDD.after($fancyDD);
            $origDD.hide();
            $('dl#' + fancyDDId + ' dd ul').hide();
            
            //Click event to open the drop down
            $('dl#' + fancyDDId + ' dt a').click(function() {
                var $dt = $(this).parent();
                $dt.hasClass('active') ? $dt.removeClass('active') : $dt.addClass('active');
                $('dl#' + fancyDDId + ' dd ul').toggle();
                return false;
            });
            
            //Click event to hide the drop down if anything but the drop down or its children is clicked
            $(document).bind('click', function(e) {
                var $clicked = $(e.target);
                if (!$clicked.parents().hasClass(opts.ddClass))
                {
                    $('dl#' + fancyDDId + ' dd ul').hide();
                    $('dl#' + fancyDDId + ' dt').removeClass('active');
                }
            }); 

            //Click event for selecting a new option
            $('dl#' + fancyDDId + ' dd ul li a').click(function() {
                var text = $(this).html();
                var dd = $('dl#' + fancyDDId);
                dd.find('dt a').html(text);
                dd.find('dd ul').hide();
                
                var sourceDD = $('select#' + origDDId);
                sourceDD.val($(this).find('span.value').html());
                
                var item = $(this).parent();
                dd.find('dd li.selected').removeClass('selected');
                item.addClass('selected');
                
                dd.find('dt').removeClass('active');
                
                opts.onItemSelected(item);
                return false;
            }); 
            
            opts.onDataBound($fancyDD);
        }
    }
  
    //Plugin defaults
    $.fn.FancyDropDown.defaults = {
        ddIdSuffix: '_FancyDD',
        ddClass: 'fancyDropDown',
        onDataBound: function(dropDown){},
        onItemDataBound: function(item){},
        onItemSelected: function(item){}
    };
})(jQuery);

//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.validation: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.validation: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');
    }
}

$(document).ready(function() {    
    $('a[rel="external"]').ExternalLinks();
    $('div#changeLanguage select').FancyDropDown({
        onDataBound : function(dropDown) {
            var value = dropDown.find('dt a span.value').html();
            var $dt = dropDown.find('dt')
            $dt.attr('class', '');
            $dt.addClass(value);
            dropDown.parent().parent().find('div.formOptions').hide();
        },
        onItemDataBound : function(item) {
            var value = item.find('span.value').html();
            item.addClass(value);
        },
        onItemSelected : function(item) {
            var value = item.find('span.value').html();
            var $dd = item.parents('dl');
            var $dt = $dd.find('dt');
            $dt.attr('class', '');
            $dt.addClass(value);
            $dd.parent().parent().find('div.formOptions input').click();
        }
    });
    UpgradeASPNETValidation();
});


function LaunchHelpPopup(helpId) {
	$('div#' + helpId).removeClass('NotVisible');
	$('div#' + helpId).addClass('MakeVisible');
	return false;
}


function CloseHelpPopup(helpId) {
	$('div#' + helpId).addClass('NotVisible');
	$('div#' + helpId).removeClass('MakeVisible');
	return false;
}
