

/*Main.js*/

var jump = function(e) {
    //prevent the "normal" behaviour which would be a "hard" jump
    e.preventDefault();
    //Get the target
    var eltId = $(this).attr("href");
    var target = eltId.substring(eltId.indexOf("#"));
    //perform animated scrolling
    $('html,body').animate(
    {
        //get top-position of target-element and set it as scroll target
        scrollTop: $(target).offset().top
        //scrolldelay: 2 seconds
    },1000, function() {
        //attach the hash (#jumptarget) to the pageurl
        location.hash = target;
    });
}
/*
 * Main Javascript file that will handle various events, ajax functionality, cross-browser quirks and other
 * useful scripting.
 *
 */

$(document).ready( function() {
    fixIE();
    addEventHandlers();
    highlightActivePage();
});
function addEventHandlers() {

    var i = 0;
    var overlay = $('#services-overlay a');
    //Image Slideshow on Banner
    $('#slideshow').cycle( {fx : 'fade', timeout: 6000, speed: 2500, before: function() {
            if(i == 0) {
                overlay.eq(0).css({opacity: 1, fontWeight: 'bold'});
                i++;
                return false;
            }
            overlay.eq(i%4).animate({opacity: 1}, 1000, function() {
                $(this).css('font-weight','bold');
                overlay.eq((i-1)%4).css({opacity:0.85, fontWeight: 'normal'});
                i++;
            });
        }});
    $("#news_list").cycle({ fx : 'fade', timeout: 12000, speed: 3500, delay: 2000});

    //Wysiwyg editor for forms
    if($('.wysiwyg').length)
        $('.wysiwyg').wysiwyg();

    //Add tooltips/colorbox for mission link
    if($("#mission_link").length) {
        $('#mission_link').tipTip({maxWidth: '500px', defaultPosition: 'top', delay: 100, content: $("#inline_mission").parent().html()});
        $("#mission_link").colorbox({initialWidth:"50%", initialHeight:"180px", width:"500px", height:"250px", inline:true, href:"#inline_mission", opacity:0.6}); //add colorbox for mission statement
    }

	//Tip-Tip for Offices in footer
	var offices = $("ul#offices li");
	if(offices.length){
		offices.each(function(index) {
			var tooltip = $(".tooltip", $(this)).html();
			$(this).tipTip({
				maxWidth: '200px', 
				defaultPosition: 'right',
				keepAlive: true, 
				delay: 100, 
				content: tooltip
			});
		});
	}

    //target scrolling
    $("a[href^='#']").click(jump);
    
    //Debug Toggle Click Handler
	$('.debug-toggle a').live('click',function(){
		$(this).parent().load(
			$(this).attr('href'),
			function(response, status, xhr) {
				if (status == "error") {
					alert('Sorry, but there was an error with your request: ' + xhr.status + " " + xhr.statusText);
				}
				else{
					window.location.href = unescape(window.location.pathname);
				}
			}
		);
		return false;
	});	
}

function fixIE() {
    if ($.browser.msie) {
        $("#top_nav").addClass("ie_nav_border");
        $("footer").addClass("ie_footer_border");
        $("#left_nav a").hover( function() {
            $(this).toggleClass("ie_left_menu_hover");
        });
        $("#all_projects, #all_news").addClass("ie_all_link");
    }
}

function highlightActivePage() {
    switch(document.title) {
        case "2rw | Firm Overview":
            $("#firm-link, #overview-link").css({'font-weight':'bold','color':'#1F5349'});
            $("#overview-link + ul").slideDown(1200);
            break;
        case "2rw | 'The Bobs'":
            $("#firm-link, #bobs-link").css({'font-weight':'bold','color':'#1F5349'});
            $("#bobs-link + ul").slideDown(1200);
            break;
        case "2rw | Our Services":
            $("#firm-link, #services-link").css({'font-weight':'bold','color':'#1F5349'});
            $("#services-overlay a").attr("href", "").click(function(){return false;}).hover(function(){$(this).css("cursor","default")});
            $("#services-link + ul").slideDown(1200);
            break;
        case "2rw | Professional Society Affiliations and Accreditations":
            $("#firm-link, #accreditations-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        case "2rw | Stewardship":
            $("#firm-link, #stewardship-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        case "2rw | Our Work":
            $("#work-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        case "2rw | News":
            $("#news-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        case "2rw | Press Releases":
            $("#news-link, #press-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        case "2rw | Featured News":
            $("#news-link, #featured-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        case "2rw | Contact":
            $("#contact-link").css({'font-weight':'bold','color':'#1F5349'});
            break;
        default:;
    }
}

/*Sprintf.js*/

/**
 * JavaScript printf/sprintf functions.
 *
 * This code is unrestricted: you are free to use it however you like.
 *
 * The functions should work as expected, performing left or right alignment,
 * truncating strings, outputting numbers with a required precision etc.
 *
 * For complex cases, these functions follow the Perl implementations of
 * (s)printf, allowing arguments to be passed out-of-order, and to set the
 * precision or length of the output based on arguments instead of fixed
 * numbers.
 *
 * See http://perldoc.perl.org/functions/sprintf.html for more information.
 *
 * Implemented:
 * - zero and space-padding
 * - right and left-alignment,
 * - base X prefix (binary, octal and hex)
 * - positive number prefix
 * - (minimum) width
 * - precision / truncation / maximum width
 * - out of order arguments
 *
 * Not implemented (yet):
 * - vector flag
 * - size (bytes, words, long-words etc.)
 *
 * Will not implement:
 * - %n or %p (no pass-by-reference in JavaScript)
 *
 * @version 2007.04.27
 * @author Ash Searle
 */
function sprintf() {
    function pad(str, len, chr, leftJustify) {
        var padding = (str.length >= len) ? '' : Array(1 + len - str.length >>> 0).join(chr);
        return leftJustify ? str + padding : padding + str;

    }

    function justify(value, prefix, leftJustify, minWidth, zeroPad) {
        var diff = minWidth - value.length;
        if (diff > 0) {
            if (leftJustify || !zeroPad) {
                value = pad(value, minWidth, ' ', leftJustify);
            } else {
                value = value.slice(0, prefix.length) + pad('', diff, '0', true) + value.slice(prefix.length);
            }
        }
        return value;
    }

    function formatBaseX(value, base, prefix, leftJustify, minWidth, precision, zeroPad) {
        // Note: casts negative numbers to positive ones
        var number = value >>> 0;
        prefix = prefix && number && {'2': '0b', '8': '0', '16': '0x'}[base] || '';
        value = prefix + pad(number.toString(base), precision || 0, '0', false);
        return justify(value, prefix, leftJustify, minWidth, zeroPad);
    }

    function formatString(value, leftJustify, minWidth, precision, zeroPad) {
        if (precision != null) {
            value = value.slice(0, precision);
        }
        return justify(value, '', leftJustify, minWidth, zeroPad);
    }

    var a = arguments, i = 0, format = a[i++];
    return format.replace(sprintf.regex, function(substring, valueIndex, flags, minWidth, _, precision, type) {
        if (substring == '%%')
            return '%';

        // parse flags
        var leftJustify = false, positivePrefix = '', zeroPad = false, prefixBaseX = false;
        for (var j = 0; flags && j < flags.length; j++)
            switch (flags.charAt(j)) {
                case ' ':
                    positivePrefix = ' ';
                    break;
                case '+':
                    positivePrefix = '+';
                    break;
                case '-':
                    leftJustify = true;
                    break;
                case '0':
                    zeroPad = true;
                    break;
                case '#':
                    prefixBaseX = true;
                    break;
            }

        // parameters may be null, undefined, empty-string or real valued
        // we want to ignore null, undefined and empty-string values

        if (!minWidth) {
            minWidth = 0;
        } else if (minWidth == '*') {
            minWidth = +a[i++];
        } else if (minWidth.charAt(0) == '*') {
            minWidth = +a[minWidth.slice(1, -1)];
        } else {
            minWidth = +minWidth;
        }

        // Note: undocumented perl feature:
        if (minWidth < 0) {
            minWidth = -minWidth;
            leftJustify = true;
        }

        if (!isFinite(minWidth)) {
            throw new Error('sprintf: (minimum-)width must be finite');
        }

        if (!precision) {
            precision = 'fFeE'.indexOf(type) > -1 ? 6 : (type == 'd') ? 0 : void(0);
        } else if (precision == '*') {
            precision = +a[i++];
        } else if (precision.charAt(0) == '*') {
            precision = +a[precision.slice(1, -1)];
        } else {
            precision = +precision;
        }

        // grab value using valueIndex if required?
        var value = valueIndex ? a[valueIndex.slice(0, -1)] : a[i++];

        switch (type) {
            case 's':
                return formatString(String(value), leftJustify, minWidth, precision, zeroPad);
            case 'c':
                return formatString(String.fromCharCode(+value), leftJustify, minWidth, precision, zeroPad);
            case 'b':
                return formatBaseX(value, 2, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'o':
                return formatBaseX(value, 8, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'x':
                return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'X':
                return formatBaseX(value, 16, prefixBaseX, leftJustify, minWidth, precision, zeroPad).toUpperCase();
            case 'u':
                return formatBaseX(value, 10, prefixBaseX, leftJustify, minWidth, precision, zeroPad);
            case 'i':
            case 'd': {
                var number = parseInt(+value);
                var prefix = number < 0 ? '-' : positivePrefix;
                value = prefix + pad(String(Math.abs(number)), precision, '0', false);
                return justify(value, prefix, leftJustify, minWidth, zeroPad);
            }
            case 'e':
            case 'E':
            case 'f':
            case 'F':
            case 'g':
            case 'G': {
                var number = +value;
                var prefix = number < 0 ? '-' : positivePrefix;
                var method = ['toExponential', 'toFixed', 'toPrecision']['efg'.indexOf(type.toLowerCase())];
                var textTransform = ['toString', 'toUpperCase']['eEfFgG'.indexOf(type) % 2];
                value = prefix + Math.abs(number)[method](precision);
                return justify(value, prefix, leftJustify, minWidth, zeroPad)[textTransform]();
            }
            default:
                return substring;
        }
    });
}

sprintf.regex = /%%|%(\d+\$)?([-+#0 ]*)(\*\d+\$|\*|\d+)?(\.(\*\d+\$|\*|\d+))?([scboxXuidfegEG])/g;

/**
 * Trival printf implementation, probably only useful during page-load.
 * Note: you may as well use "document.write(sprintf(....))" directly
 */
function printf() {
    // delegate the work to sprintf in an IE5 friendly manner:
    var i = 0, a = arguments, args = Array(arguments.length);
    while (i < args.length)
        args[i] = 'a[' + (i++) + ']';
    document.write(eval('sprintf(' + args + ')'));
}


