DEBUG = false;
//DEBUG = true;

if (DEBUG) {
  document.writeln('<pre id="debug"></pre>');
  debug_pre = $('debug');
  debug_pre.setStyle("position", "absolute");
  debug_pre.setStyle("background", "white");
  debug_pre.setStyle("z-index", "100");
}

function debug (text) {
		if (DEBUG) debug_pre.appendText(text+"\r\n");
// 		ts = new Date().getTime()/1000;
// 		if (DEBUG && typeof(console) != "undefined" && console.log) console.log(ts+":"+text);
}

debug("Dropdown init");

function inhibit_link(a) {
    a.addEvent("click", function (e) { e = new Event(e); e.target.setAttribute("href", "#"); e.stopPropagation(); e.stop();}); 
    a.setStyle("cursor", "default");
}
function extract_links_from_html(html) {
  var d = new Element("document");
  d.innerHTML = html;
  debug("DOC:" + d);
  debug("Uls:" + d.getElementsByTagName("ul").length);
  var submenu = null;
  var uls = d.getElementsByTagName("ul");
  for (var i=0; i<uls.length; i++) {
    var ul = uls[i];
    if (ul.getAttribute("id") == "submenu") {
      submenu = ul;
      break;
    }
  }
  if (!submenu) {
    debug("ERROR: submenu not found");
    return;
  } 
  var lis = submenu.getElementsByTagName("li");
  debug("Submenu found, "+lis.length+" children");
  var links = [];
  for (var i=0; i<lis.length;i++) {
    links[links.length] = $(lis[i].getElementsByTagName("A")[0]);
  }
  return links;
  //return $(submenu).getElementsByTagName("A");
}

function extract_elements_from_html(html) {
  d = new Element("document");
  d.innerHTML = html;
  return d.getElements(".projectcche_list");
}

function _get_top_menu_link_parent (target) {
		// find containing dropdown (toplevel)
		while (target && !target.hasClass("with-side-dropdown")) {
				if (target.menu_parent)
						target = target.menu_parent;
				else
						target = target.getParent();
		}
		return target;
}

function _fix_url(url) {
   // IE converts links to absolute - let's revoke this work  
		var lang = (""+window.location).match(/http:\/\/.*?\/(.*?)\/.*/)[1];
		debug("Lang:"+lang);
    if (window.ie) {
      var current_base = ""+window.location;
      current_base = current_base.replace(/[^/]*.htm/ , "");
      // remove 2 levels (so ad hoc..)
      current_base = current_base.replace(/([^/]*)\/([^/]*)\/$/ , "");
      debug("Base url:"+current_base);
      url = url.replace(current_base, "../");
    }
		url = url.replace(/^(\.\.\/)*/, "/"+lang+"/");
		debug("To:"+url);
		return url;
}
function _fix_link(link) {
    var url = link.getAttribute("href");
    if (url.match(".*\.htm")) {
				link.setAttribute("href", _fix_url(url));
		}
		return link;
}

function _finalize_children_li(el) {
  var lis = el.getElementsByTagName("LI");
  for (var i=0; i<lis.length; i++)
    emulate_hover(lis[i]);
}

function _finalize_li(li) {
  emulate_hover(li);
	_finalize_children_li(li);
  debug("Inhibiting link");
  a = li.getElementsByTagName("a")[0];

  if (typeof(IFInterface) == "undefined") /* check if we are in admin interface */
     inhibit_link(a);
}

var ALPHABETIC_CATEGORIES = ['category27'];
var ALPHABETIC_DIVISIONS = [["a", "b"], ["c", "d"], ["e", "g"], ["h", "l"], 
														["m", "p"], ["q", "u"], ["v", "z"]];


function _filter_links_by_alpha_range(links, alpha_range) {
		var matching_links = [];
		for (var i=0;i<links.length;i++) {
				link = $(links[i]);
				var link_text = link.getText();
				var link_fl = link_text.charAt(0); // first letter
				debug("Link: "+link+", text="+link_text+", letter="+link_fl);
				if (link_fl.toLowerCase()>=alpha_range[0].toLowerCase()
						&& link_fl.toLowerCase()<=alpha_range[1].toLowerCase()) {
						matching_links.push(link);
				}
		} 
		return matching_links;
}

function populate_with_links_alphabetically(li, links) {

  li.getParent().addClass("dropdown");
  li.addClass("with-side-dropdown");

  ul = new Element("UL");

	// go through all groups
	for (var i=0;i<ALPHABETIC_DIVISIONS.length;i++) {
			var alpha_range = ALPHABETIC_DIVISIONS[i];

			debug("--- range: "+alpha_range);
			mli = new Element("LI");
			link = new Element("A", {'class':'alpha-range'});
			link.setText(alpha_range[0].toUpperCase()+" - "+alpha_range[1].toUpperCase());
			link.injectInside(mli);
			mli.injectInside(ul);
			
			sub_links = _filter_links_by_alpha_range(links, alpha_range);
			if (!sub_links) continue;
			debug("Links: "+sub_links);

			// create a sub-sub-menu
			var sub_ul = new Element("UL", {'class':'side-dropdown'});
			for (j=0;j<sub_links.length;j++) {
					sub_link = _fix_link(sub_links[j]);
					sub_li = new Element("li");
					sub_link.injectInside(sub_li);
					sub_li.injectInside(sub_ul);
			}
			
			if (0) {
					sub_ul.injectInside(mli);
			} else {
					
					sub_ul.setStyles({"display":"none", "position":"absolute"});
					sub_ul.injectInside(document.body);
					_finalize_children_li(sub_ul);
					mli.submenu = sub_ul;
					sub_ul.menu_parent = mli;



					// todo: refacto
					mli.addEvent("mouseover", function (e) {
									var menu_coords = this.getCoordinates();
									this.submenu.setStyles({'top':menu_coords.top, 'left':menu_coords.left+menu_coords.width});
									this.submenu.setStyle("display", "block");

							});
					mli.addEvent("mouseout", function (e) {
									e = new Event(e); 
									debug("MOUSEOUT mli: "+e.relatedTarget);
									if (!is_child(e.relatedTarget, this))
											this.submenu.setStyle("display", "none");
							});

					// do as if the ul was a real child in the hierarchy
					sub_ul.addEvent("mouseout", function (e) {
									e = new Event(e);
									debug("MOUSEOUT mli: "+e.relatedTarget);
									if (!is_child(e.relatedTarget, this))
											this.setStyle("display", "none");
									if (!is_child(e.relatedTarget, this.menu_parent)) {
											this.menu_parent.removeClass("over");

											var top_menu = _get_top_menu_link_parent(this);
											if (top_menu && !is_child(e.relatedTarget, top_menu)) {
													top_menu.removeClass("over");
													var a = top_menu.getElementsByTagName("A")[0];
													a.moving_menu.reset_target(a);
											}

									}
							});
			}
		}

  ul.injectInside(li);
	_finalize_li(li);

}

function populate_with_links(li, links) {
	if (ALPHABETIC_CATEGORIES.contains(li.id)) {
			return populate_with_links_alphabetically(li, links);
	}
  li.getParent().addClass("dropdown");
  ul = new Element("UL");

  for (var i=0;i<links.length;i++) {
		link = _fix_link(links[i]);
    mli = new Element("LI");
    link.injectInside(mli);
    mli.injectInside(ul);
		ul.parent_menu = mli;
  } 

  ul.injectInside(li);
	_finalize_li(li);

}

function populate_dropdown_from_linked_page(li) {
  if (!li) return;
  function _callback(answer) {
    debug("Answer received from "+this.li.innerHTML);
		links = extract_links_from_html(this.response.text);
    debug("Links:"+links);
    populate_with_links(this.li, links);
  }
  //a = li.getElements("A")[0];
  //a = li.getElementsByTagName("A")[0];
  // a = li.getChildren()[0];
  a = li.getElementsByTagName("a")[0];
  var target_url = a.getAttribute("href");
  debug("Populate from link: "+target_url);
  var xhr = new Ajax(target_url, {method: 'get', onSuccess: _callback});
  xhr.li = li;
  xhr.request();
}

function populate_dropdown_from_elements(li, elements) {
  links = [];
  for (var i=0; i<elements.length; i++) {
		element = elements[i];
    debug("Working on element:"+element);		
    debug("Number of h2:"+ element.getElementsByTagName("h2").length);		
    if (element.getElementsByTagName("h2").length == 0)
      continue;
    //element_title = element.getElements("h2")[0].getText();
    element_title = element.getElementsByTagName("h2")[0].innerHTML;
    //element_url = element.getElements("a")[0].getAttribute("href");
    element_url = element.getElementsByTagName("a")[0].getAttribute("href");
    if (!element_title.search(/\d+/)==0) {
      debug("New link :"+element_title);
      a = new Element("A", {'href':element_url});
      a.innerHTML = element_title;
      links[links.length] = a;
    } else {
      debug("Skipping year link :"+element_title);
    }
  }
  populate_with_links(li, links);
}

function populate_dropdown_from_elements_in_linked_page(li) {
  if (!li) return;
  function _callback(answer) {
    debug("Answer received from "+this);
    elements = extract_elements_from_html(this.response.text);
    debug("Elements:"+elements);
    function get_project_title(e) {
       h2s = e.getElementsByTagName("h2");
       if (h2s.length) return h2s[0].innerHTML;
       else return "";
    }
    function alpha_sort(e1, e2) {
      // TODO : optimize
      if (get_project_title(e1)>get_project_title(e2))
        return 1;
      else if (get_project_title(e1)<get_project_title(e2))
        return -1;
      else
        return 0;
    }
    filtered_elements = [];
    for (var i=0;i<elements.length; i++) {
      if (get_project_title(elements[i]).length>1)
        filtered_elements[filtered_elements.length] = elements[i];
    }
    filtered_elements.sort(alpha_sort);
    debug("Sorted:"+filtered_elements);
    populate_dropdown_from_elements(this.li, filtered_elements);
  }
  //a = li.getElements("A")[0];
  a = li.getChildren()[0];
  target_url = a.getAttribute("href");
  debug("Populate from elements in link: "+target_url);
  var xhr = new Ajax(target_url, {method: 'get', onSuccess: _callback});
  xhr.li = li;
  xhr.request();
}

function is_child(el, parent) {
		debug("is_child ? "+el+"<"+parent);
		if (!el) return false;
		while (el && el.getParent) {
				if (el == parent) return true;
				debug(" while "+el);
				if (el.menu_parent) {
						debug("shortcut:"+el.menu_parent);
						return el.menu_parent == parent ||
								is_child(el.menu_parent, parent) || 
								is_child(el.getParent(), parent);
				}
				el = el.getParent();
		}
		return false;
}

function emulate_hover(li) {
 li.addEvent("mouseover", function (e) { this.addClass("over"); });
 li.addEvent("mouseout", function (e) { e = new Event(e); if (e.relatedTarget == this || !is_child(e.relatedTarget, this)) this.removeClass("over"); });
 if (1 && li.getElementsByTagName("ul").length) { // add an event to the dropdown ul too (if present) to prevent a bug on IE
   ul = li.getElementsByTagName("ul")[0];
   ul.addEvent("mouseover", function (e) { this.getParent().fireEvent("mouseover", e); });
   ul.addEvent("mouseout", function (e) { this.getParent().fireEvent("mouseout", e); });
 }
 debug("hover emul :"+li);
}


function special_fix() {
  function inhibit_menu(li) {
    a = li.getElementsByTagName("a")[0];
    if (typeof(IFInterface) == "undefined") 
     inhibit_link(a);
  }
  if ($('category32')) inhibit_menu($('category32'));
  if ($('category31')) inhibit_menu($('category31'));
  if ($('category27')) inhibit_menu($('category27'));

}
special_fix();
