/* Declare a namespace for the site */
var Site = window.Site || {};

/* Create a closure to maintain scope of the '$'
   and remain compatible with other frameworks.  */
(function($) {
	
	//same as $(document).ready();
	$(function() {
		$('#mainImage').not('#clients #mainImage').cycle({
			fx: 'fade',
			speed: 2000,
			timeout: 5000,
			delay: -1000
		});
	
		$('#menuSub > ul > li > a').each(function(i) {
			this.index = i;
			$(this).mouseover(function() {
				$('#mainImage').cycle('pause');
				$('#mainImage').cycle(this.index);
			});
			if($('.solo').length) {
				$(this).click(function() {
					return false;
				});
			}
		});
		
		$('body.list #menuSub').append('<div id="hoverLeft"></div><div id="hoverRight"></div>')
			.mousemove(function(e){
				$('#hoverLeft').css({'left': (e.pageX - this.offsetLeft) - 945 + 'px'});
				$('#hoverRight').css({'left': (e.pageX - this.offsetLeft) + 45 + 'px'});
			})
			.mouseout(function() {
				$('#mainImage').cycle('resume');
		});
		$('body.list #mainImage').mouseover(function() {
				$('#hoverLeft').animate({'left': -810 + 'px'},1000);
				$('#hoverRight').animate({'left': 900 + 'px'},1000);
		});

		$('body.list dt').each(function() {
			if(($(this).offset().top + 22) < $(this).next().offset().top) {
				$(this).addClass('dontLeaveMeHanging');
			}
		});
		
		// tags sort
		$('nav#articleTags > a').sortElements(function(a, b){
		    return $(a).text() > $(b).text() ? 1 : -1;
		});
		
		// tags remove duplicates
		var seen = {};
		$('#index nav#articleTags > a').each(function() {
		    var txt = $(this).text();
		    if (seen[txt]) {
		        $(this).remove();
		    } else {
		        seen[txt] = true;
	        }
	        $(this).click(function() {
	        	$('nav#articleTags > a').removeClass('red');
	        	$(this).addClass('red');
	        	var tag = $(this).text();
	        	$('dd,dt').hide();
	        	$('dd:contains("' + tag + '")').show();
	        	return false;
	        });
		});
		$('#index nav#listSort li:last').click(function() {
			$('#index nav#articleTags').removeClass('hidden').hide().slideDown('normal');
			return false;
		});

	});


	$(window).bind('load', function() {
		
		
	
	});
	
})(jQuery);




/**
 * jQuery.fn.sortElements
 * --------------
 * @param Function comparator:
 *   Exactly the same behaviour as [1,2,3].sort(comparator)
 *   
 * @param Function getSortable
 *   A function that should return the element that is
 *   to be sorted. The comparator will run on the
 *   current collection, but you may want the actual
 *   resulting sort to occur on a parent or another
 *   associated element.
 *   
 *   E.g. $('td').sortElements(comparator, function(){
 *      return this.parentNode; 
 *   })
 *   
 *   The <td>'s parent (<tr>) will be sorted instead
 *   of the <td> itself.
 */
jQuery.fn.sortElements = (function(){
 
    var sort = [].sort;
 
    return function(comparator, getSortable) {
 
        getSortable = getSortable || function(){return this;};
 
        var placements = this.map(function(){
 
            var sortElement = getSortable.call(this),
                parentNode = sortElement.parentNode,
 
                // Since the element itself will change position, we have
                // to have some way of storing its original position in
                // the DOM. The easiest way is to have a 'flag' node:
                nextSibling = parentNode.insertBefore(
                    document.createTextNode(''),
                    sortElement.nextSibling
                );
 
            return function() {
 
                if (parentNode === this) {
                    throw new Error(
                        "You can't sort elements if any one is a descendant of another."
                    );
                }
 
                // Insert before flag:
                parentNode.insertBefore(this, nextSibling);
                // Remove flag:
                parentNode.removeChild(nextSibling);
 
            };
 
        });
 
        return sort.call(this, comparator).each(function(i){
            placements[i].call(getSortable.call(this));
        });
 
    };
 
})();

