
function is_in_dropdown(event) {
		if (!event.relatedTarget || !event.relatedTarget.getTag) return false;
		var tag = event.relatedTarget.getTag();
		if (tag == "a"  || tag == "ul") {
				return !(event.relatedTarget.getParent().getParent().getAttribute("id"));
				//return !(event.relatedTarget.getParent().getParent().hasClass("dropdown")); // buggy fix // buggy fix
		} else if (tag == "li")
				return !(event.relatedTarget.getParent().getParent().getParent().getAttribute("id"));
		return false;
} 
		    
var Cursor = new Class({
				initialize: function(menu) {
						this.menu = menu;
						this.create_cursor();
						this.install_handlers();
						this.move_to(this.current_menu_item);
				},

				create_cursor: function () {
						var lis = this.menu.getElementsByTagName("LI");
						var menu_items = [];
						for (var i=0;i<lis.length;i++) {
								a = $(lis[i].getElementsByTagName("A")[0]);
								if (a.hasClass('s')) menu_items[menu_items.length] = a;
						}
						if (menu_items.length==1) {
								this.current_menu_item = menu_items[0];
								this.original_size = this.current_menu_item.getSize();
								this.original_position = this.current_menu_item.getPosition();
						} else {
								this.current_menu_item = null;
								this.not_used_yet = true;
								//var any_menu_item = this.menu.getElements("LI A")[0];
								// var any_menu_item = this.menu.getChildren()[0].getChildren()[0];
								/* this.original_size = any_menu_item.getSize();
									 this.original_position = any_menu_item.getPosition();
									 this.original_position.x = - this.original_size.size.x; */
						}

						this.cursor = new Element("DIV", {'class':'cursor'});
						this.cursor.injectBefore(this.menu);
						this.cursor.setStyles({'position':'absolute'});
						if (this.current_menu_item) {
								this.cursor.setStyles({'width':this.original_size.size.x,
														'height':this.original_size.size.y,
														'left':this.original_position.x, 
														'top':this.original_position.y});
						} else {
								var any_menu_item = this.menu.getChildren()[0].getChildren()[0];
								var size = any_menu_item.getSize();
								var position = any_menu_item.getPosition();
								this.cursor.setStyles({'width': size.size.x,
														'height': size.size.y,
														'left': position.x, 
														'top': position.y, 'opacity':0});
						}
						this.fx = new Fx.Styles(this.cursor);
				},

				install_handlers: function () {
						//debug("Installing handlers");
						var menu_items = this.menu.getElementsByTagName("LI");
						for (var i=0; i<menu_items.length; i++) {
								var menu_item = $(menu_items[i]);
								if (!menu_item || menu_item.getParent().getAttribute("id")!=this.menu.getAttribute("id")) {
										continue;
								}
								var a = menu_item.getElementsByTagName("A")[0];
								a.addEvent("mouseover", this.move);
								a.addEvent("mouseout", this.reset);
								a.fx = new Fx.Styles(a, {'duration':300});
								a.moving_menu = this;
						}
				},
			
				move_to: function (target) {
						var cursor = this.cursor;
						var size = null;
						var position = null;
						if (target) {
								size = target.getSize();
								position = target.getPosition();
						} else {
								size = this.original_size;
								position = this.original_position;
						}

						if (target && this.not_used_yet) {
								this.not_used_yet = false;
								cursor.setStyles({'width':size.size.x, 'height':size.size.y,
														'left':position.x, 'top':position.y, 'opacity':0});
						}
						this.fx.stop();
						if (size)
								this.fx.start({'width':size.size.x, 'height':size.size.y,
														'left':position.x, 'top':position.y, 'opacity':1});
						if (target) {
								target.fx.stop();
								target.fx.start({'color':'#fff'});
						}
						if (this.current_menu_item && target!=this.current_menu_item) {
								this.current_menu_item.fx.stop();
								this.current_menu_item.fx.start({'color':'#000'});
						}
				},
				reset_dropdown: function(e) {
						function _get_menu_link_parent (target) {
								// find containing dropdown (toplevel)
								while (target.getTag() != "ul" 
											 || target.hasClass("side-dropdown")) {
										target = target.getParent();
										if (target.menu_parent)
												target = target.menu_parent;
								}
								// find related link
								target = target.getParent().getElementsByTagName("A")[0];
								return target;
						}
						var event = new Event(e);
						var target = event.target;
						if (is_in_dropdown(event)) return;
						target = _get_menu_link_parent(target);
						if (target.moving_menu.current_menu_item) {
								target.moving_menu.move_to(target.moving_menu.current_menu_item);
						} else {
								target.moving_menu.fx.stop();
								//target.moving_menu.fx.start({'width':"0px", 'height':"0px"});
								target.moving_menu.fx.start({'opacity':0});
						}
				
						if (target != target.moving_menu.current_menu_item) {
								target.fx.stop();
								target.fx.start({'color':'#000'});
						}
				},


				reset: function(e) {
						var event = new Event(e);
						var target = event.target;
						if (is_in_dropdown(event) || !target) return;
						target.moving_menu.reset_target(target); // cant use this
				},


				reset_target: function(target) {
						if (target.moving_menu.current_menu_item) {
								target.moving_menu.move_to(target.moving_menu.current_menu_item);
						} else {
								target.moving_menu.fx.stop();
								//target.moving_menu.fx.start({'width':"0px", 'height':"0px"});
								target.moving_menu.fx.start({'opacity':0});
						}
						if (target != target.moving_menu.current_menu_item) {
								target.fx.stop();
								target.fx.start({'color':'#000'});
						}
				},

				check_dropdown_events: function (li) {
						if (li.getElementsByTagName("ul").length==0) return;
						var ul = li.getElementsByTagName("ul")[0];
						if (ul.installed) return;
						//ul.addEvent("mouseover", this.move_dropdown);
						ul.addEvent("mouseout", this.reset_dropdown);
						ul.installed = true; 
				},
				move: function (e) {
						var event = new Event(e);
						var target = event.target;
						target.moving_menu.check_dropdown_events(target.getParent());
						target.moving_menu.move_to(target);
				},
				move_dropdown: function (e) {
						var event = new Event(e);
						var target = event.target;
						//if (is_in_dropdown(event)) return;
						while (target.getTag() != "ul")
								target = target.getParent();
						target = target.getParent().getElementsByTagName("A")[0];
						target.moving_menu.move_to(target);
				} 

		});
var StillCursor = Cursor.extend({
			
				move_to: function (target) {
						var cursor = this.cursor;
						var size = null;
						var position = null;
						if (target) {
								size = target.getSize();
								position = target.getPosition();
						} else {
								size = this.original_size;
								position = this.original_position;
						}

						if (target ) {
								cursor.setStyles({'width':size.size.x, 'height':size.size.y,
																	'left':position.x, 'top':position.y, 'opacity':0});
						}
						this.fx.stop();
						if (size)
								this.fx.start({'width':size.size.x, 'height':size.size.y,
														'left':position.x, 'top':position.y, 'opacity':1});
						if (target) {
								target.fx.stop();
								target.fx.start({'color':'#fff'});
						}
						if (this.current_menu_item && target!=this.current_menu_item) {
								this.current_menu_item.fx.stop();
								this.current_menu_item.fx.start({'color':'#000'});
						}
				} 
		});

function install_moving_menu(menu) {
		//debug("Installing moving cursor on "+menu);
		var cursor = null;
		if (!menu) return;
		if (menu.id=="menu")
				cursor = new StillCursor(menu);
		else
				cursor = new Cursor(menu);
}
