(function($){
	$.fn.atoz = function(options) {
		
		var defaults = {
			xml_path:"/xml/default.asp",
			buttonID:"atoz",
			atozContainer:"az",
			hoffset:0,
			debug:false
		};
		
		var letters = new Array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
		
		var data = {
			timeout:"",
			links:"",
			isLetter:new RegExp(/^[a-zA-Z]+$/)
		};
		var options = $.extend(defaults, options);
		
		return this.each(function() {
			var $button = $(this);
			
			//load data
			$.ajax({
				type: "GET",
				url: "/xml/default.asp?sid="+options.schoolid+"&type=atoz&id="+options.groupid,
				dataType: "xml",
				success: function(xml) {
					//get json object (and print out the html so i can see it)
					data.links = xml;
					if(options.debug){$.log(data.links);}
					
					buildContainer();
				},
				error: function(request,tStatus,eThrown){
					if(options.debug){$.log("error getting xml..." + eThrown);}
				}
			});
			
			function buildContainer(){
				//create container and position it...
				var $azbox = $(document.createElement("div"))
							.attr("id",options.atozContainer)
							.css({"display":"none"});
							
				var $azheader = $(document.createElement("div"))
								.attr("id","az-header")
								.html("<!-- -->");
								
				var $azfooter = $(document.createElement("div"))
								.attr("id","az-footer");
								
				var $azmid = $(document.createElement("div"))
								.attr("id","az-mid");
				
				var buttonOffset = $button.getTopLeftFromBody();
				if(options.debug){$.log("top:" + buttonOffset.top+", left: "+buttonOffset.left+", hoffset: " + options.hoffset);}
				$azbox.css({"top":buttonOffset.top+$button.height(),"left":buttonOffset.left+options.hoffset});
				
				$("body").append($azbox);
				$azbox.append($azheader).append($azmid).append($azfooter);
				
				var $aztop = $(document.createElement("div"))
								.attr("id","az-top");
								
				$azmid.append($aztop);
								
				var $aztopleft = $(document.createElement("div"))
								.attr("id","az-search-cont")
								.html("<div id='az-search'><div id='fast-find-label'>Fast Find</div><input type='text' id='azff' value=''/><a href='javascript:void(0);' id='az-clear'>clear</a></div>")
								.css({"float":"left"});
								
				var $aztopright = $(document.createElement("div"))
								.attr("id","az-top-right")
								.css({"float":"left"})
								.html("<div id='search-text'>To find a page, simply type the title into the search feature to the left or select a letter of the alphabet.</div>");
								
				$aztop.append($aztopleft).append($aztopright).append($(document.createElement("div")).addClass("clear").html("<!-- -->"));
				
								
				var $azmenu = $(document.createElement("div"))
								.attr("id","az-menu");
								
				$azmid.append($azmenu);
				
				for(var i = 0; i < 26; i++){
					var $azletter = $(document.createElement("a"))
									.attr("id","l_"+i)
									.addClass("letter");
					if(i == 0){$azletter.addClass("on");}
					$azmenu.append($azletter);
				}
				
				var $sitemap = $(document.createElement("a"))
								.attr("id","sitemap")
								.attr("href","/podium/default.aspx?t=115512")
								.html("sitemap");
								
				$azmenu.append($sitemap);
				
				$azmenu.append($(document.createElement("div")).addClass("clear").html("<!-- -->"));
				
				var $azlinkscont = $(document.createElement("div"))
								.attr("id","az-links-cont");
								
				var $azlinks = $(document.createElement("div"))
								.attr("id","az-links");
				
				$azmid.append($azlinkscont);
				
				var $azsearchheader = $(document.createElement("div"))
									.attr("id","az-link-header");
				
				$azlinkscont.append($azsearchheader).append($azlinks);
				
				//add links to the div...
				firstLoad();
				
				buildActions();
			}
				
			function buildActions(){
				//hover for button to show the box.
				var $azbox = $("#"+options.atozContainer);
				//EDIT: if we're on L2 (pdGlobal exsists) we need to find out if we're on the "search" page as the "a-z" button is being used as an L1
				//this is currently one UGLY block of code
				//also adding a class to the A-Z telling us where we are (based on pdGlobal's existence)
				var turnOffButton = true;
				if(typeof pdGlobal != "undefined"){
					$azbox.addClass("L2page");
					if(pdGlobal.currentPages[0]){
						if($button.attr("id")){
							if($button.attr("id").split("_")[1]){
								if(pdGlobal.currentPages[0].id == $button.attr("id").split("_")[1]){
									$button.addClass("on");
									turnOffButton = false;
								}
							}
						}
					}
				} else { $azbox.addClass("nonL2page"); }
				
				//EDIT: unbind any pre-existing hover events on $button to enable functionality when menu has been run on containing ul
				$button
					.unbind('mouseover')
					.unbind('mouseenter')
					.unbind('mouseout')
					.unbind('mouseleave')
					.hover(function(){
						if(options.debug){$.log("button hover");}
						var buttonOffset = $(this).getTopLeftFromBody();
						$azbox.css({"top":buttonOffset.top+$button.height(),"left":buttonOffset.left+options.hoffset});
						
						$azbox.show("fast");
						$(this).addClass("on");
						
					},function(){
						data.timeout = setTimeout(function(){whHideBox()},50);
					});
				//hover for the azbox
				$azbox.hover(function(){
					clearTimeout(data.timeout);
				},function(){
					data.timeout = setTimeout(function(){whHideBox()},50);
				});
				
				function whHideBox(){
					var $azbox = $("#" + options.atozContainer);
					if(turnOffButton){ $button.removeClass("on"); }
					$azbox.hide();
				}	
				
				//click for the clear
				$("#az-clear").click(function(){
					$("#azff").val("");
				});
				
				//click for letters
				$(".letter").click(function(){
					//remove the on state from w/e is on
					$(".letter").removeClass("on");
					$(this).addClass("on");
					$("#azff").val(letters[$(this).attr("id").split("_")[1]]);
					//run search
					azsearch();
				});
				
				$("#azff").keyup(function(event){
					$(".letter").removeClass("on");
					if($(this).val().search(data.isLetter) != -1){
						azsearch();
					}
					
				});
			
			}
			
			//add a's function
			function firstLoad(){
				$("#azff").val(letters[0]);
				$("#l_0").addClass("on");
				azsearch();
			}
			
			//search function
			function azsearch(){
				if(options.debug){$.log("RUN SEARCH!");}
				clearResults();
				var searchVal = $("#azff").val();
				var $azlinks = $("#az-links");
				
				var $azlinkheader = $("#az-link-header");
				$azlinkheader.html(searchVal);
				
				var lcount = 0;
				var foundlinks = false;
				
				if(searchVal.length > 1){
					if(options.debug){$.log("REG EXP TIME!");}
					var searchExp = new RegExp(searchVal,"i");
					$(data.links).find('group').each(function(){
						$(this).find("item").each(function(){
							if($(this).find("title").text().search(searchExp) != -1){
								var target = "";
								if($(this).find("target").text() == "true"){
									target = "target='_blank'";
								}
								$azlinks.append("<div><a href='"+$(this).find("url").text()+"' "+target+">"+$(this).find("title").text()+"</a></div>");
								foundlinks = true;
								if(lcount == 3){
									lcount = 0;
								}else{
									lcount++;
								}
							}
						});
					});
				}else{
					if(options.debug){$.log("find and print one letter");}
					//turn on letter
					for(var l = 0; l < letters.length; l++){
						if(letters[l] == searchVal.toLowerCase()){
							$("#l_"+l).addClass("on");
						}
					}
					$(data.links).find('group').each(function(){
						if($(this).attr("title").toLowerCase() == searchVal.toLowerCase()){
							$(this).find("item").each(function(){
								var target = "";
								if($(this).find("target").text() == "true"){
									target = "target='_blank'";
								}
								$azlinks.append("<div><a href='"+$(this).find("url").text()+"' "+target+">"+$(this).find("title").text()+"</a></div>");
								foundlinks = true;
								if(lcount == 3){
									lcount = 0;
								}else{
									lcount++;
								}
							});
						}
					});
				}
				
				if(!foundlinks){
					$azlinks.append("<div>No pages match your search.  Please try again later.</div>");
				}else{
					checkColumns();
				}
			}	
			
			function clearResults(){
				$("#az-links").html("");
				$("#az-link-header").html("");
			}
			
			function checkColumns(){
				if(options.debug){$.log("CHECK COLUMNS");}
				var $azlinks = $("#az-links");
				var $linkKids = $azlinks.children();
				
				if(options.debug){$.log("kids = " + $azlinks.children().length);}
				var divCount = 0;
				if($linkKids.length%4 == 0){
					divCount = parseInt($linkKids.length/4);
				}else{
					divCount = parseInt($linkKids.length/4)+1;
				}				
				
				$linkKids.slice(0,divCount).wrapAll("<div class='linkcol'></div>");
				$linkKids.slice(divCount,divCount*2).wrapAll("<div class='linkcol'></div>");
				$linkKids.slice(divCount*2,divCount*3).wrapAll("<div class='linkcol'></div>");
				$linkKids.slice(divCount*3).wrapAll("<div class='linkcol'></div>");

			}
			
		});
		
	};
	
})(jQuery);

//for debug/log stuff
jQuery.log = function(message) {
 if(window.console && $.browser.mozilla) {
    console.debug(message);
 }
};