jQuery.jGlideMenu = {
	useDropShadow:new Boolean(),
	useDragDrop:new Boolean(),
	defaultScrollSpeed:new Number(0),
	defaultScrollBackSpeed:new Number(0),
	slideRight:new Boolean(),
	useSmoothScrolling:new Boolean(),
	easeFx:new String(''),
	closeLinkMarkUp:new String(''),
	menuShowFx:new String(''),
	menuHideFx:new String(''),
	tileWidth:new Number(0),
	tileInset:new Number(0),
	itemsToDisplay:new Number(8),
	useTileURL:new Boolean(),
	tileSource:new String(''),
	URLParams:new Object(),
	loadImage:new String(''),
	loadImageStyle:new Object(),
	initialTile:new String(''),
	alertOnError:new Boolean(),
	captureLinks:new Boolean(),
	imagePath:new String(),
	tileCount:new Number(0),
	animation:new Boolean(),
	helperImage:new Boolean(),
	currentElement:new Object(),
	currentElementID:new String(''),
	hasDragDropSupport:new Boolean(),
	hasShadowSupport:new Boolean(),
	displayToggle:new Boolean(),
	tileScrollPosition:new Array(),
	smoothScrollTimer:new Array(),
	mouseHover:new Boolean(),
	demoMode:new Boolean(),
	initialize:function(o){
		return this.each(function(){
			jQuery.jGlideMenu.animation=false;
			jQuery.jGlideMenu.helperImage=false;
			jQuery.jGlideMenu.hasDragDropSupport=false;
			jQuery.jGlideMenu.hasShadowSupport=false;
			jQuery.jGlideMenu.tileCount=0;
			jQuery.jGlideMenu.displayToggle=false;
			jQuery.jGlideMenu.mouseHover=false;
			jQuery.jGlideMenu.demoMode=false;
			jQuery.jGlideMenu.currentElement=jQuery(this);
			if(this.id)
				jQuery.jGlideMenu.currentElementID=this.id;
				var s={
					itemsToDisplay:11,
					tileInset:7,
					tileWidth:225,
					useDropShadow:false,
					slideRight:true,
					useDragDrop:true,
					useSmoothScrolling:true,
					useTileURL:false,
					defaultScrollSpeed:250,
					defaultScrollBackSpeed:250,
					tileSource:'myTiles',
					URLParams:{},
					closeLinkMarkUp:'Close',
					menuShowFx:'fadeIn',
					menuHideFx:'fadeOut',
					easeFx:'linear',
					loadImage:'/images/mathhelp/ajax.gif',
					initialTile:'tile_001',
					alertOnError:false,
					captureLinks:true,
					loadImageStyle:{'position':'absolute','bottom':'10px','left':'10px','z-index':'999'},
					imagePath:'/images/mathhelp/',
					demoMode:false};
					if(o)
						jQuery.extend(s,o);
						jQuery.jGlideMenu.checkFeatures();
						if(s.closeLinkMarkUp.length<1)s.closeLinkMarkUp='x Close';
						if(parseInt(s.itemsToDisplay)<1)s.itemsToDisplay=1;
						if(s.initialTile.length<0)jQuery.jGlideMenu.errorTrap('Invalid Configuration');
						for(i in s)jQuery.jGlideMenu[i]=s[i];
							if(jQuery.jGlideMenu.useTileURL==false&&jQuery.jGlideMenu.tileSource.length>0){
								jQuery(jQuery.jGlideMenu.tileSource).css('display','none');
								jQuery(jQuery.jGlideMenu.currentElement).children().not(jQuery.jGlideMenu.tileSource).remove();
							} else
								jQuery(jQuery.jGlideMenu.currentElement).html('');
								jQuery(jQuery.jGlideMenu.currentElement).append('<div class="jGM_header"><a href="#">'+jQuery.jGlideMenu.closeLinkMarkUp+'</a></div>').append('<div class="jGM_wrapper" id="jGM_wrapper_'+this.id+'"></div>');
								var img=document.createElement('img');
								img.src=jQuery.jGlideMenu.loadImage;
								img.style.display='none';
								img.id='jGM_helper'+jQuery.jGlideMenu.currentElementID;
								jQuery(jQuery.jGlideMenu.currentElement).append(img);
								jQuery('img#'+img.id).css(jQuery.jGlideMenu.loadImageStyle);
								jQuery.jGlideMenu.helperImage=true;
								if(jQuery.jGlideMenu.hasDragDropSupport==true&&jQuery.jGlideMenu.useDragDrop==true){
									if(jQuery.isFunction(jQuery('body').Draggable))
										jQuery(this).Draggable({handle:'.jGM_header'});
									else
										jQuery(this).draggable({handle:'.jGM_header'});
								}
								if(jQuery.jGlideMenu.hasShadowSupport==true&&jQuery.jGlideMenu.useDropShadow==true){
									if(jQuery.isFunction(jQuery('body').dropShadow))
										jQuery(this).dropShadow();
									else
										jQuery(this).shadow({color:'#cccccc'});
								}
								jQuery(jQuery.jGlideMenu.currentElement).find('div.jGM_header a').bind('click',function(){if(jQuery.jGlideMenu.displayToggle==true)return false;jQuery.jGlideMenu.toggleDisplay(true);return false;});
								jQuery(this).hover(function(){jQuery.jGlideMenu.mouseHover=true;},function(){jQuery.jGlideMenu.mouseHover=false;});
								jQuery(document).keydown(function(e){
									return true;
									/*var key=e.charCode?e.charCode:e.keyCode?e.keyCode:0;
									if(key==32&&jQuery.jGlideMenu.mouseHover==false){
										jQuery.jGlideMenu.toggleDisplay();
										return;
									}
									if(jQuery.jGlideMenu.mouseHover==false)
										return false;
										switch(key){
											case 37:break;
											case 38:break;
											case 39:break;
											case 40:break;
											case 13:break;
											case 32:jQuery.jGlideMenu.toggleDisplay();
											return;break;
										}*/
									}
								);
								jQuery.jGlideMenu.loadTile(jQuery.jGlideMenu.initialTile,jQuery.jGlideMenu.URLParams);
							}
						);
					},
	toggleDisplay:function(r){
		jQuery.jGlideMenu.displayToggle=true;
		jQuery.jGlideMenu.mouseHover==false;
		if(jQuery(jQuery.jGlideMenu.currentElement).css('display')=='block')
			var toggle_value=0;
		else
			var toggle_value=1;
		jQuery(jQuery.jGlideMenu.currentElement).animate({opacity:toggle_value},'slow',function(){
			if(r==true){
				jQuery.jGlideMenu.scrollToTile(0,jQuery.jGlideMenu.defaultScrollBackSpeed);
				jQuery.jGlideMenu.tileScrollPosition[0]=0;
			}
			if(toggle_value>0)
				jQuery(this).css('display','block');
			else
				jQuery(this).css('display','none');
				jQuery.jGlideMenu.displayToggle=false;
			}
		);
	},
	checkFeatures:function(){
		jQuery.jGlideMenu.hasDragDropSupport=jQuery.isFunction(jQuery('body').Draggable);
		if(jQuery.jGlideMenu.hasDragDropSupport==false)
			jQuery.jGlideMenu.hasDragDropSupport=jQuery.isFunction(jQuery('body').draggable);
			jQuery.jGlideMenu.hasShadowSupport=jQuery.isFunction(jQuery('body').dropShadow);
			if(jQuery.jGlideMenu.hasShadowSupport==false)
				jQuery.jGlideMenu.hasShadowSupport=jQuery.isFunction(jQuery('body').shadow);
				return;
	},
	parseURL:function(u){
		if(!$j.browser.msie){
			return u;
		}
		if(u.indexOf('#tile_')<0){
			return u;
		}
		var bits=u.split('#');
		return'#'+bits[(bits.length-1)];
	},
	countTiles:function(){
		jQuery.jGlideMenu.tileCount=parseInt(jQuery('div.jGM_tile').size());
	},
	loadTile:function(u,p){
		var ptr=document.createElement('div');
		var ctr=jQuery.jGlideMenu.tileCount+1;ptr.id='jGM_tile_'+jQuery.jGlideMenu.currentElementID+'_'+ctr;
			if(jQuery.jGlideMenu.slideRight==true)
				var off=jQuery.jGlideMenu.tileWidth*jQuery.jGlideMenu.tileCount+jQuery.jGlideMenu.tileInset;
			else
				var off=jQuery.jGlideMenu.tileWidth*jQuery.jGlideMenu.tileCount*-1+jQuery.jGlideMenu.tileInset;
		jQuery('#jGM_wrapper_'+jQuery.jGlideMenu.currentElementID).append(ptr);
		jQuery('#'+ptr.id).addClass('jGM_tile').css({top:0,left:off+'px',height:'800px',width:'210px',position:'absolute',overflow:'hidden',margin:0,padding:0,border:0,display:'block'});
		var tmpl='<div style="height:100%;margin:0;border:0;width:100%;padding:0;text-align:center;">'+'<h3>Missing Tile</h3><p>Unable to locate the requested Tile</p></div>';
		if(jQuery.jGlideMenu.useTileURL==false){
			if(jQuery('ul#'+u).size()<1){
				jQuery.jGlideMenu.errorTrap('Invalid Tile Request');
				return false;
			}
			var title=jQuery('ul#'+u).attr('title');
			var desc=jQuery('ul#'+u).attr('alt');
			var items=jQuery('ul#'+u+' li').size();
			var links=[];
			var id = '';
			var tooltip = '';
			jQuery('ul#'+u+' li').each(function(){
				if(jQuery('a',this).size()>0){
					var className = jQuery('a',this).attr('class');
					className = (!className? '':className);
					id = jQuery('a',this).attr('id');
					id = (!id? '':'math_'+id);
					tooltip = jQuery('a',this).attr('title');
					tooltip = (!tooltip? '':tooltip);
					links[links.length]=[jQuery('a',this).attr('href'),jQuery('a',this).text(),1,className,id,tooltip];
				}else{
					var style = jQuery(this).attr('style');
					style = (!style? '':style);
					id = jQuery(this).attr('id');
					id = (!id? '':'math_'+id);
					tooltip = jQuery(this).attr('title');
					tooltip = (!tooltip? '':tooltip);
					links[links.length]=[jQuery(this).attr('rel'),jQuery(this).text(),0,style,id,tooltip];
				}
				}
			);
		var tmpl=jQuery.jGlideMenu.buildTile(title,desc,links);
		} else {
			if(jQuery.jGlideMenu.tileSource.length<1){
				jQuery.jGlideMenu.errorTrap('Invalid AJAX Request');
				return false;
			}
		var mon='img#jGM_helper'+jQuery.jGlideMenu.currentElementID;
		jQuery(mon).ajaxStart(function(){
			jQuery(this).animate({opacity:'show'},'fast');
		}).ajaxStop(function(){
			jQuery(this).animate({opacity:'hide'},'slow');
		});
		p.tile=u;
		jQuery.ajax({type:"POST",url:jQuery.jGlideMenu.tileSource,data:p,async:false,success:function(xhtml){
			jQuery('body').append('<div id="jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile+'" style="display:none;">'+xhtml+'</div>');
			if(jQuery('#jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile+' ul#'+u).size()<1){
				jQuery.jGlideMenu.errorTrap('AJAX: Invalid Tile Request');
				return false;
			}
			var title=jQuery('#jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile+' ul#'+u).attr('title');
			var desc=jQuery('#jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile+' ul#'+u).attr('alt');
			var items=jQuery('#jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile+' ul#'+u+' li').size();
			var links=[];jQuery('#jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile+' ul#'+u+' li').each(function(){
				if(jQuery('a',this).size()>0){
					var className = jQuery('a',this).attr('class');
					className = (!className? '':className);
					var id = jQuery('a',this).attr('id');
					id = (!id? '':'math_'+id);
					var tooltip = jQuery('a',this).attr('title');
					tooltip = (!tooltip? '':tooltip);
					links[links.length]=[jQuery('a',this).attr('href'),jQuery('a',this).text(),1,className,id,tooltip];
				}else{
					var style = jQuery(this).attr('style');
					style = (!style? '':style);
					var id = jQuery(this).attr('id');
					id = (!id? '':'math_'+id);
					var tooltip = jQuery(this).attr('title');
					tooltip = (!tooltip? '':tooltip);
					links[links.length]=[jQuery(this).attr('rel'),jQuery(this).text(),0,style,id,tooltip];
				}
			}
			);
			jQuery('#jGM_temp_'+jQuery.jGlideMenu.currentElementID+p.tile).remove();
			tmpl=jQuery.jGlideMenu.buildTile(title,desc,links);
			jQuery(mon).ajaxStart(function(){}).ajaxStop(function(){});
		},
			error:function(rslt){
				jQuery.jGlideMenu.errorTrap('Invalid AJAX Tile Request');
				jQuery(mon).ajaxStart(function(){}).ajaxStop(function(){});
			}
		});
		}
		jQuery('#'+ptr.id).html(tmpl);
		jQuery('#'+ptr.id+' div.jGM_content a').bind('click',function(){
			var target='';
			target=jQuery.jGlideMenu.parseURL(jQuery(this).attr('href'));
			if(target.length<1){
				return false;
			}
			if(target.substr(0,1)=='#'){
				if(jQuery.jGlideMenu.animation==true)
					return false;
					var dest=target.substr(1,target.length-1);
					jQuery.jGlideMenu.loadTile(dest,jQuery.jGlideMenu.URLParams);
					return false;
				} else {
					if(jQuery.jGlideMenu.demoMode){
						window.location.href=target;
					} else {
						alert('Navigation Requestion: '+target);
						}
					if(jQuery.jGlideMenu.captureLinks==true)
						return false;
				}
			return true;
			}
		);
		jQuery.jGlideMenu.countTiles();
		if(jQuery.jGlideMenu.tileCount>1){
			jQuery('#'+ptr.id).append('<div class="jGM_back"><a href="#"><img src="/images/mathhelp/mathhelp_menu_back.png" border="0" /></a></div>');
			jQuery('#'+ptr.id+' div.jGM_back').bind('click',function(){
															if(jQuery.jGlideMenu.animation==true)
																return false;
															jQuery.jGlideMenu.scrollToTile((ctr-1),
															jQuery.jGlideMenu.defaultScrollBackSpeed);
															return false;
														}
			);
			if(jQuery.jGlideMenu.tileCount>2){
				jQuery('#'+ptr.id).append('<div class="jGM_reset"><a href="#"><img src="/images/mathhelp/mathhelp_menu_home.png" border="0" /></a></div>');
				jQuery('#'+ptr.id+' div.jGM_reset').bind('click',function(){
																if(jQuery.jGlideMenu.animation==true)
																	return false;
																jQuery.jGlideMenu.scrollToTile(1,jQuery.jGlideMenu.defaultScrollBackSpeed);
																return false;
															}
				);
			}
		}
		jQuery.jGlideMenu.tileScrollPosition[ctr]=0;
		jQuery.jGlideMenu.drawPagers(ptr.id,jQuery('#'+ptr.id+' .jGM_content a').size());
		if(jQuery.jGlideMenu.useSmoothScrolling==false){
			jQuery('#'+ptr.id+' .jGM_pager a').click(function(){
													var dir=1;
													if(jQuery(this).attr('rel')=='Up')dir=0;
														jQuery.jGlideMenu.scrollItems(dir);
													}
			);
		} else {
			jQuery('#'+ptr.id+' .jGM_pager a').hover(function(){
													var dir=1;
													if(jQuery(this).attr('rel')=='Up')
														dir=0;
														jQuery.jGlideMenu.smoothScrollTimer[jQuery.jGlideMenu.tileCount]=window.setInterval('jQuery.jGlideMenu.scrollItems('+dir+')',250);
													},
													function(){
													window.clearInterval(jQuery.jGlideMenu.smoothScrollTimer[jQuery.jGlideMenu.tileCount]);
													}
												);
		}
		jQuery.jGlideMenu.scrollToTile(ctr,jQuery.jGlideMenu.defaultScrollSpeed);
	},
	scrollItems:function(d){
		var x='#jGM_tile_'+jQuery.jGlideMenu.currentElementID+'_'+jQuery.jGlideMenu.tileCount;
		var s=jQuery(x+' .jGM_content a');
		var c=jQuery.jGlideMenu.tileScrollPosition[jQuery.jGlideMenu.tileCount];
		if(c<=0&&d==0)
			return;
		if(c+jQuery.jGlideMenu.itemsToDisplay>=jQuery(s).size()&&d==1)
			return;
		if(d==0)
			jQuery.jGlideMenu.tileScrollPosition[jQuery.jGlideMenu.tileCount]--;
		else
			jQuery.jGlideMenu.tileScrollPosition[jQuery.jGlideMenu.tileCount]++;
		jQuery(s).show();
		jQuery(x+' .jGM_content').children('a:lt('+jQuery.jGlideMenu.tileScrollPosition[jQuery.jGlideMenu.tileCount]+')').hide();
		jQuery.jGlideMenu.drawPagers(x.substr(1,x.length),jQuery(s).size());
	},
	drawPagers:function(p,c){
		jQuery('#'+p+' .jGM_pager').find('a').each(function(){
													if(jQuery(this).attr('rel')=='Up'){
														if(jQuery.jGlideMenu.tileScrollPosition[jQuery.jGlideMenu.tileCount]>0)
															jQuery(this).css('display','block');
														else
															jQuery(this).css('display','none');
													} else {
														if(jQuery.jGlideMenu.tileScrollPosition[jQuery.jGlideMenu.tileCount]+jQuery.jGlideMenu.itemsToDisplay<jQuery('#'+p+' .jGM_content a').size())
															jQuery(this).css('display','block');
														else 
															jQuery(this).css('display','none');
														}
													}
											);
	},
	cleanTiles:function(n){
		var start=n+1;
		var stop=jQuery.jGlideMenu.tileCount;
		if(n>=stop)
			return false;
		for(var i=start;i<=stop;i++){
			jQuery('#jGM_tile_'+jQuery.jGlideMenu.currentElementID+'_'+i).remove();
			jQuery.jGlideMenu.tileScrollPosition[i]=0;
		}
		jQuery.jGlideMenu.countTiles();
		return;
	},
	scrollToTile:function(n,s){
		jQuery.jGlideMenu.countTiles();
		var t=jQuery.jGlideMenu.tileCount;
		if(n>t)
			n=t;
		if(n<1)
			n=1;
		if(!s)
			s=jQuery.jGlideMenu.defaultScrollSpeed;
			var b=(jQuery.jGlideMenu.tileWidth*n)-jQuery.jGlideMenu.tileWidth;
			var a=(jQuery.jGlideMenu.slideRight==true)?b*-1:b;
			jQuery.jGlideMenu.animation=true;
			jQuery('div#jGM_wrapper_'+jQuery.jGlideMenu.currentElementID).animate({'left':a},s,jQuery.jGlideMenu.easeFx,function(){
																														if(n<t)
																															jQuery.jGlideMenu.cleanTiles(n);
																																if(a!=0)
																																	a+='px';
																																jQuery(this).css({'left':a});
																																jQuery.jGlideMenu.animation=false;
																														}
																							);
	},
	buildTile:function(t,d,l){
		if(jQuery.jGlideMenu.imagePath.length>1&&jQuery.jGlideMenu.imagePath.substr(-1,1)!='/')
			jQuery.jGlideMenu.imagePath+='/';
			var template=new String('');
			template='<div class="jGM_cats"><h1>'+t+'</h1><hr><p class="jGM_desc">'+d+'</p></div>';
			template+='<div class="jGM_pager"><a href="#" rel="Up" title="Scroll Up" style="display:none"><img src="'+jQuery.jGlideMenu.imagePath+'arrow_up.gif" alt="Scroll Up"/></a></div>';
			template+='<div class="jGM_content">';
			for(var i=0;i<l.length;i++){
				var hash=(l[i][2]==1)?'':'#';
				var type=(l[i][2]==1)? ( l[i][3] && l[i][3] != ''? ' class="'+l[i][3]+'"': ''):' class="jGM_more"';
				var style =( l[i][2]==1? '' : (l[i][3] && l[i][3] != '' ? ' style="'+l[i][3]+'"' : ''));
				var id = (l[i][4]!=''? ' id="'+l[i][4]+'"':'');
				var tooltip = (l[i][5]!=''? ' title="'+l[i][5]+'"':'');
				template+='<a href="'+hash+l[i][0]+'"'+type+style+id+tooltip+'>'+l[i][1]+'</a>';
			}
			template+='</div>';
			template+='<div class="jGM_pager"><a href="#" rel="Down" title="Scroll Down" style="display:none"><img src="'+jQuery.jGlideMenu.imagePath+'arrow_dn.gif" alt="Scroll Up"/></a></div>';
			return template;
	},
	errorTrap:function(m){
		if(jQuery.jGlideMenu.alertOnError==true)
			alert(m);
			return;
	}
}
jQuery.fn.jGlideMenu=jQuery.jGlideMenu.initialize;
jQuery.fn.jGlideMenuToggle=jQuery.jGlideMenu.toggleDisplay;
jQuery.fn.reverse=function(){
	return this.pushStack(this.get().reverse(),arguments);
};
jQuery.fn.setTile = jQuery.jGlideMenu.loadTile;
