(function($){
	$.fn.create_annual_fund = function(options) {
		var	defaults = {
			xml_path:"/xml/af.asp",
			css_path:"/css/af.css",
			horizontal:false,
			errMsg:"Annual fund currently not avalible, please check back later.",
			html:false,
			afBarOnTop:true,
			dropDecimals:false,
			transWindowOverlay:false,
			useTop:true,
			useBottom:true,
			IEadjust:7,
			callback:null
		},
		options = $.extend(defaults, options);

		return this.each(function() {
			var obj = $(this);
			if($(this).html().length > 0){
				var data;
				$.ajax({
					type: "GET",
					url: options.xml_path+"?groupid="+$(this).html(),
					dataType: "xml",
					success: function(xml) {
						$(xml).find('af').each(function(){
							data = {
								current:$(this).find("current").text(),
								goal:$(this).find("goal").text(),
								start:$(this).find("start").text(),
								end:$(this).find("end").text(),
								asof:$(this).find("asof").text(),
								part_current:$(this).find("part_current").text(),
								part_lyear:$(this).find("part_lyear").text(),
								part_goal:$(this).find("part_goal").text()
							};
						});
					},
					error: function(request,tStatus,eThrown){
						obj.html(options.errMsg);
						if($.isFunction(options.callback)){ options.callback(obj); }
						if(window.console && window.console.firebug){ console.log("error on annual fund xml request: request='"+request+"', tStatus='"+tStatus+"', eThrown='"+eThrown+"'"); }
					},
					complete: function() {
						if(parseInt(data.goal)>0){
							$("<link rel='stylesheet' type='text/css' href='"+options.css_path+"'/>").appendTo("head");
								if(options.html){ obj.load(options.html); }
								else{
									var	$afCont = $("<div>").attr("id","af_container");
										if($.browser.msie){ $afCont.addClass("lay"); }

									var	$barCont = $("<div>").attr("id","bar_container"),
										$afEmptyBack = $("<div>").attr("id","empty_background").html("<!-- -->"),
										$barGraph = $("<div>").attr("id","bar_graph").html("<!-- -->"),
										$afBar = $("<div>").attr("id","af_bar").addClass("lay"),
										$barBlank = $("<div>").addClass("barPiece").css("float","left").html("<!-- -->"),
										$clear = $("<div>").css("clear","both").html("<!-- -->");
											$barBlank.clone().attr("id",((options.horizontal)?"left":"top")).appendTo($afBar);
											$barBlank.clone().attr("id","mid").appendTo($afBar);
											$barBlank.clone().attr("id",((options.horizontal)?"right":"btm")).appendTo($afBar);
											$clear.clone().appendTo($afBar);

									if(options.transWindowOverlay){ $barCont.append($afEmptyBack).append($afBar).append($barGraph); }
									else{ $barCont.append($afBar); }

									if(options.afBarOnTop){ $barCont.appendTo($afCont); }

									var $dataCont = $("<div>").attr("id","data_container"),
										$header = $("<div>").addClass("af-header"),
										$data = $("<div>").addClass("data");
										var $goal = $clear.clone().attr("id","goal");
											$header.clone().html("Goal&nbsp;").appendTo($goal); $data.clone().appendTo($goal);
											$goal.append($clear.clone()).appendTo($dataCont);
										var $current = $clear.clone().attr("id","current");
											$header.clone().html("Current&nbsp;").appendTo($current); $data.clone().appendTo($current);
											$current.append($clear.clone()).appendTo($dataCont);
										var $start = $clear.clone().attr("id","start");
											$header.clone().html("Fund Start Date:").appendTo($start); $data.clone().appendTo($start);
											$start.append($clear.clone()).appendTo($dataCont);
										var $end = $clear.clone().attr("id","end");
											$header.clone().html("End Date:").appendTo($end); $data.clone().appendTo($end);
											$end.append($clear.clone()).appendTo($dataCont);
										var $asof = $clear.clone().attr("id","asof");
											$header.clone().html("As Of:").appendTo($asof); $data.clone().appendTo($asof);
											$asof.append($clear.clone()).appendTo($dataCont);
										var $part_current = $clear.clone().attr("id","part_current");
											$header.clone().html("Current Participation:").appendTo($part_current); $data.clone().appendTo($part_current);
											$part_current.append($clear.clone()).appendTo($dataCont);
										var $part_lyear = $clear.clone().attr("id","part_lyear");
											$header.clone().html("Last Year Participation:").appendTo($part_lyear); $data.clone().appendTo($part_lyear);
											$part_lyear.append($clear.clone()).appendTo($dataCont);
										var $part_goal = $clear.clone().attr("id","part_goal");
											$header.clone().html("Participation Goal:").appendTo($part_goal); $data.clone().appendTo($part_goal);
											$part_goal.append($clear.clone()).appendTo($dataCont);
										$afCont.append($dataCont);
									
									if(!options.afBarOnTop){ $barCont.appendTo($afCont); }
									obj.html($afCont);
								}

								//this timer and $.load mess is here to ensure the elements have fully loaded before we try to grab heights/widths
								var checkTimer = false;
								$("#af_bar", obj).load(function(){ if(checkTimer){ clearTimeout(checkTimer); checkTimer = false; doBarAndData(); } });
								checkTimer = setTimeout(function(){ if($("#af_bar", obj).height()>0 || $("#af_bar", obj).width()>0){ doBarAndData(); } },1500);
								function doBarAndData(){
									if(options.horizontal){
										var	leftWidth = $("#left", obj).width(),
											rightWidth = $("#right", obj).width(),
											barWidth = $("#af_bar", obj).width(),
											midWidth = barWidth * (data.current/data.goal);
										$(".barPiece").css("height",$("#af_bar", obj).css("height"));
										if(parseInt(data.current) >= parseInt(data.goal)){ $("#mid", obj).width(barWidth - leftWidth - rightWidth); }
										else{ $("#mid", obj).width(midWidth - rightWidth); }
									}else{
										var	barHeight = $("#af_bar", obj).height(),
											topHeight = $("#top", obj).height(),
											btmHeight = $("#btm", obj).height(),
											midHeight = barHeight * (data.current/data.goal);
										//$("#af_bar", obj).css("top",Math.floor(($("#bar_container", obj).height() - barHeight -((options.transWindowOverlay)?topHeight:0)))+"px");
										if(parseInt(data.current) >= parseInt(data.goal)){
											$("#af_bar #top", obj).css("top","0");
											if(options.useTop || options.useBottom){ $("#af_bar #mid", obj).css("height",(Math.floor(barHeight - ((options.useTop)?topHeight:0) - ((options.useBottom)?btmHeight:0))+"px")); }
											else{ $("#af_bar #mid", obj).css("height",$("#af_bar", obj).css("height")); }
										}else{
											if(options.useTop){
												$("#af_bar #top", obj).css("top",Math.floor(barHeight - midHeight - Math.floor(topHeight/2))+"px");
												$("#af_bar #mid", obj).css("top",Math.floor(barHeight - midHeight - Math.floor(topHeight/2))+"px");
											} else { $("#af_bar #mid", obj).css("top",Math.floor(barHeight - midHeight)+"px"); }
											$("#af_bar #mid", obj).css("height",(Math.floor(midHeight - ((options.useBottom)?btmHeight:0))+2+"px"));
											$("#af_bar", obj).css("display","block");
										}
									}

									if(data.current){ $("#current .data", obj).html(data.current).formatCurrency({dropDecimals:options.dropDecimals}); }
									else{ $("#current", obj).css("display","none"); }

									if(data.goal){ $("#goal .data", obj).html(data.goal).formatCurrency({dropDecimals:options.dropDecimals}); }
									else{ $("#goal", obj).css("display","none"); }

									if(data.start){ $("#start .data", obj).html(data.start); }
									else{ $("#start", obj).css("display","none"); }

									if(data.end){ $("#end .data", obj).html(data.end); }
									else{ $("#end", obj).css("display","none"); }

									if(data.asof){ $("#asof .data", obj).html(data.asof); }
									else{ $("#asof", obj).css("display","none"); }

									if(data.part_current){ $("#part_current .data", obj).html(data.part_current+"%"); }
									else{ $("#part_current", obj).css("display","none"); }

									if(data.part_lyear){ $("#part_lyear .data", obj).html(data.part_lyear+"%"); }
									else{ $("#part_lyear", obj).css("display","none"); }

									if(data.part_goal){ $("#part_goal .data", obj).html(data.part_goal+"%"); }
									else{ $("#part_goal", obj).css("display","none"); }

									if($.isFunction(options.callback)){ options.callback(obj); }
								}

						}else{
							obj.html(options.errMsg);
							if(window.console && window.console.firebug){ console.log("annual fund plugin error: no data returned"); }
							if($.isFunction(options.callback)){ options.callback(obj); }
						}
					}
				});
			}else{
				obj.html(options.errMsg);
				if(window.console && window.console.firebug){ console.log("annual fund plugin error: no or bad group id passed"); }
			}
		});
	};
})(jQuery);

//clipped jquery.formatCurrency-1.0.0.min.js in its entirety (http://code.google.com/p/jquery-formatcurrency/)
//added in non-existent (but falsely advertised) dropDecimals option (evidently they removed this feature July 13, 2009 but left it in the documentation)
(function($){$.formatCurrency={};$.formatCurrency.regions=[];$.formatCurrency.regions[""]={symbol:"$",positiveFormat:"%s%n",negativeFormat:"(%s%n)",decimalSymbol:".",digitGroupSymbol:",",groupDigits:true,dropDecimals:false};$.fn.formatCurrency=function(destination,settings){if(arguments.length==1&&typeof destination!=="string"){settings=destination;destination=false}var defaults={name:"formatCurrency",colorize:false,region:"",global:true};defaults=$.extend(defaults,$.formatCurrency.regions[""]);settings=$.extend(defaults,settings);if(settings.region.length>0){settings=$.extend(settings,getRegionOrCulture(settings.region))}return this.each(function(){$this=$(this);var num="0";num=$this[$this.is("input, select, textarea")?"val":"html"]();var trimRegex=new RegExp("[^\\d"+settings.decimalSymbol+"-]","g");num=num.replace(trimRegex,"");if(settings.decimalSymbol!="."){num=num.replace(settings.decimalSymbol,".")}if(isNaN(num)){num="0"}var isPositive=(num==(num=Math.abs(num)));num=Math.floor(num*100);var cents=num%100;num=Math.floor(num/100).toString();if(cents<10){cents="0"+cents}if(settings.groupDigits){for(var i=0;i<Math.floor((num.length-(1+i))/3);i++){num=num.substring(0,num.length-(4*i+3))+settings.digitGroupSymbol+num.substring(num.length-(4*i+3))}}num=num+((settings.dropDecimals)?"":settings.decimalSymbol+cents);var format=isPositive?settings.positiveFormat:settings.negativeFormat;var money=format.replace(/%s/g,settings.symbol);money=money.replace(/%n/g,num);if(!destination){destination=$this}else{destination=$(destination)}destination[destination.is("input, select, textarea")?"val":"html"](money);if(settings.colorize){destination.css("color",isPositive?"black":"red")}})};$.fn.toNumber=function(settings){var defaults=$.extend({name:"toNumber",region:"",global:true},$.formatCurrency.regions[""]);settings=jQuery.extend(defaults,settings);if(settings.region.length>0){settings=$.extend(settings,getRegionOrCulture(settings.region))}return this.each(function(){var method=$(this).is("input, select, textarea")?"val":"html";var trimRegex=new RegExp("[^\\d"+settings.decimalSymbol+"-]","g");$(this)[method]($(this)[method]().replace(trimRegex,""))})};$.fn.asNumber=function(settings){var defaults=$.extend({name:"asNumber",region:"",parse:true,parseType:"Float",global:true},$.formatCurrency.regions[""]);settings=jQuery.extend(defaults,settings);if(settings.region.length>0){settings=$.extend(settings,getRegionOrCulture(settings.region))}settings.parseType=validateParseType(settings.parseType);var method=$(this).is("input, select, textarea")?"val":"html";var trimRegex=new RegExp("[^\\d"+settings.decimalSymbol+"-]","g");var num=$(this)[method]().replace(trimRegex,"");if(!settings.parse){return num}if(num.length==0){num="0"}if(settings.decimalSymbol!="."){num=num.replace(settings.decimalSymbol,".")}return window["parse"+settings.parseType](num)};function getRegionOrCulture(region){var regionInfo=$.formatCurrency.regions[region];if(regionInfo){return regionInfo}else{if(/(\w+)-(\w+)/g.test(region)){var culture=region.replace(/(\w+)-(\w+)/g,"$1");return $.formatCurrency.regions[culture]}}return null}function validateParseType(parseType){switch(parseType.toLowerCase()){case"int":return"Int";case"float":return"Float";default:throw"invalid parseType"}}})(jQuery);
