var LinkHighlighting = {
	Init : function ()
	{
		
		SynNavigation.Init();
		LinkHighlighting.HighlightSublink ();
	}
    
	,HighlightSublink : function ()
	{
		var docUrl = document.location.href.toLowerCase();
		
		var links = document.getElementsByTagName("A");
		for (var i=0; i < links.length; i++)
		{
			var link  = links[i];
			if (!link.href && !link.getAttribute("href2")) return;
			var linkUrl = (link.href && !link.href.endsWith ("#") ? link.href : link.getAttribute("href2"));
			if (!linkUrl) continue;
			if (docUrl.indexOf (linkUrl.toLowerCase()) >= 0)
			{
				link.className = (link.className? link.className + " " : "") + "selected"; 
			}
		}
	}
}
var SynNavigation = {
	Current : null
	,HidingTimer: null
	,Init : function ()
	{
		var container = document.getElementById("main");
		
		if (!container || container.tagName !="UL") return;
		var menuIndex = 0;
		for (var i=0; i < container.childNodes.length; i++)
		{
			var item = container.childNodes[i];
			if (item.tagName != "LI") continue;
			
			item.menuIndex = menuIndex;
			sU.Events.Add(item.firstChild, "onmouseover",SynNavigation.Show);
			sU.Events.Add(item.firstChild, "onmouseout",SynNavigation.StartHiding);
            
			menuIndex++;
         
		}
		//sU.Events.Add(container, "onmouseout",SynNavigation.StartHiding);
	}
	,Show : function (e)
	{
        
		SynNavigation.StopHiding(e);
		//Hide the current
		if (SynNavigation.Current)
			SynNavigation.Current.style.left= "-999em";
		
		var item = e.srcElement || e.target;		
		if (!item) return;
		while (item && item.tagName!="LI")
		{
			item = item.parentNode;
		}
		if (!item) return;
		
		var subMenu = document.getElementById ("top-submenu-" + item.menuIndex);
		
		if (subMenu)
		{
		
		 	subMenu.style.display = "block";
			var pos = $(item).position();
			var left = pos.left-10;
			var top = pos.top + 7;
			
			//Fixes for different browsers
			if ($.browser.msie && ($.browser.version == "6.0" || $.browser.version == "7.0"))
			{
				left = left - 40;
				top = top + 11;
			}
			
			subMenu.style.left = String(left) + "px";
			subMenu.style.top = String(top) + "px";
			
		/*
		
	        var subMenus = item.parentNode.getElementsByTagName ("UL");
	        if (!subMenus || subMenus.length == 0) return;
	         var subMenu  = subMenus[0];
			
		*/	
			//subMenu.style.left= "-10px";
			SynNavigation.Current = subMenu;
			if (!subMenu.getAttribute("init"))
			{
				sU.Events.Add(subMenu, "onmouseout",SynNavigation.StartHiding);
				sU.Events.Add(subMenu, "onmouseover",SynNavigation.StopHiding);
				subMenu.setAttribute("init", true);
			}
		}
	}	
	,Hide : function (e)
	{
		if (SynNavigation.Current)
			SynNavigation.Current.style.display = "none";//left= "-999em";
		SynNavigation.Current = null;
		if (SynNavigation.HidingTimer )
		{
			window.clearTimeout (SynNavigation.HidingTimer);
			SynNavigation.HidingTimer  = null;
		}
	}
	,StartHiding: function (e)
	{
		SynNavigation.HidingTimer = window.setTimeout(SynNavigation.Hide, 500);
	}
	,StopHiding: function (e)
	{
		if (SynNavigation.HidingTimer )
		{
			window.clearTimeout(SynNavigation.HidingTimer);
			SynNavigation.HidingTimer = null;
		
		}
	}
}
var SynUtils = {
	Debug : false
	,Init : function ()
	{
	    SynUtils.Debug = (document.location.search || " ").toLowerCase().indexOf("debug") > 0;
	}
	,alert : function (txt)
	{
		if (SynUtils.Debug) alert (txt);
	}
	,getTagAndType : function (o, case_sensitive)
	{
		var ignoreCase = !case_sensitive;
		var tt = new Object();
		tt.tag = null;
		tt.type = null;
		if(o==null) return tt;
		if(o.tagName!=null)
			tt.tag = (ignoreCase?o.tagName.toLowerCase():o.tagName);
		if(o.type!=null)
			tt.type = (ignoreCase?o.type.toLowerCase():o.type);
		return tt;
	}
	,alert$: function (obj)
	{
		var keys = [];
		var maxLength = 0;
		
		for (var a in obj)
		{
			keys[keys.length]=a;
			var strValue = "";
			try
			{
				try {
					strValue = obj[a].toString();
				}
				catch (err){
					try
					{
						strValue = String (obj[a]);
					}catch (err2){
						strValue="unavailable";
					}
				}
				if(strValue == "") continue;
				
				if(a =="innerHTML" || a=="outerHTML" || a=="innerText" || a=="outerText") { continue;}
				if( strValue.indexOf("function ")==0 || strValue.indexOf("function(")==0)
					strValue = "[ FUNCTION ]";
					
				var str = String(a) + ": " + strValue;
				if(str.length>maxLength) maxLength = str.length;
			}catch (err2) {}
			
		}
	
		keys.sort();
		if(maxLength>50) maxLength = 50;
		var res = "";
		var cellsPerRow = 0;
		for (var k in keys)
		{
			
			//No inner or outer html
			var strKey = new String(keys[k]);
			var strValue  = "";
			try
			{
				strValue = obj[keys[k]].toString();
			}catch (err){
				try
				{
					strValue = String (obj[keys[k]]);
				}catch (err2){
					strValue="unavailable";
				}
			}
			if(strValue == null) strValue = "null";
			else if(strValue == "") strValue = "";
			if(strKey=="innerHTML" || strKey =="outerHTML" || strKey=="innerText" || strKey=="outerText") { continue;}
			if( strValue.indexOf("function ")==0 || strValue.indexOf("function(")==0)
				strValue = "[ FUNCTION ]";
			var textLength = (strKey + ": " + strValue).length;
			var spaces = "";
			var countSpaces = maxLength - (strKey + ": " + strValue).length;
			for (var s=0; s < countSpaces; s++) spaces+=" ";
				spaces+="\t";
				
			res+= strKey + ": " + strValue;
			cellsPerRow++;
			if (cellsPerRow >=3 )
			{
				res+="\r\n";
				cellsPerRow =0;
			}
			else
				res+=spaces;
			
		}
		if (SynUtils.Debug)
			alert (res);
		
	}
	,BrowserDetect: function ()
    {
        var debug =  (document.location.href.indexOf("debug")>=0)
        var ua =   navigator.userAgent.toLowerCase() ;
        var msie = ua.indexOf ("msie")>=0;
        var ie6 = ua.indexOf("msie 6")>=0;
        var ie7 = ua.indexOf("msie 7")>=0;
        var backCompat= (document.compatMode =="BackCompat");
        
        var htmlClassName = (msie ? " msie ": " mozilla ")+ (ie6 ? " ie6 ": "") + (ie7 ? " ie7 ":"")+ (backCompat? " back-compat-css ": "");
        var htmlElement = document.getElementsByTagName ("HTML");
        if (htmlElement && htmlElement.length>0) htmlElement = htmlElement[0];
        else htmlElement = null;
        if(htmlElement)
            htmlElement.className += htmlClassName;
            
       // if (debug) alert (htmlElement.className);
    }
	,$arr : function (objects)
	{
		if (SynUtils.GetInstanceName (objects)!="Array")
		objects = [objects];
	
		return objects;
	}
	
	,GetInstanceName : function (o)
	{
		if(o==null) return null;
		if(!o.constructor) return typeof(o);
		var c = o.constructor;
		c = c.toString();
							
		var res = SynUtils.GetFunctionName (c);//regExp.exec(c);
		if (res!=null) return res;
		
		return typeof(o);
	}
	,GetFunctionName :function  (functionDeclaration)
	{
		if (!functionDeclaration) return null;
		
		var regExp = new RegExp(/function[ ]+([a-zA-Z0-9.]+)[ \(\r\n]+/); //function FunctionName ...
		regExp.ignoreCase = false;
		
		var res = regExp.exec(functionDeclaration);
		
		if(res!=null && res[1]!=null)
		{
			return res[1];
		}
		else 
		{
			if (new RegExp(/function\b/ig).test (functionDeclaration))
				return functionDeclaration.replace(/\n/gi, ' ').replace(/\t/gi, '');// "anonymous";
			else
				return null;
		}
	}

	,Events : {
		Add:  function (objectsArray, eventsArray, handler, delayInMilliseconds)
		{
			if(!eventsArray || !objectsArray || !handler) return;
		
			//modify event_name
			objectsArray = SynUtils.$arr(objectsArray);
				
			eventsArray = SynUtils.$arr(eventsArray);
			
			for (var e=0; e < eventsArray.length; e++)
			{	
				var event_name = eventsArray [e];
				if(event_name.toLowerCase().startsWith("on"))
					event_name = event_name.substr(2);
					
				for (var i=0; i < objectsArray.length; i++)
				{
					var object = objectsArray [i];
					if(!object) continue;
					if(document.all)
						object.attachEvent("on" + event_name, handler);
					else
						object.addEventListener(event_name, handler, false);
				}
			}
		},
	
		Remove : function (objectsArray, eventsArray, handler)
		{
			if(!objectsArray) return;
			if(!eventsArray) return;
			//modify event_name
			objectsArray = SynUtils.$arr(objectsArray);
				
			eventsArray = SynUtils.$arr(eventsArray);
			
			for (var e=0; e < eventsArray.length; e++)
			{	
				var event_name = eventsArray [e];
				
					
				//modify event_name
				if(event_name.toLowerCase().startsWith("on"))
					event_name = event_name.substr(2);
			
				for (var i=0; i < objectsArray.length; i++)
				{
					var object = objectsArray [i];
					if(document.all)
						object.detachEvent("on" + event_name, handler);
					else
						object.removeEventListener(event_name, handler, false);
				}
			}
		}
		,Fire : function(objectsArray, eventsArray)
		{
			if(!objectsArray) return;
			if(!eventsArray) return;
			//modify event_name
			objectsArray = SynUtils.$arr(objectsArray);
				
			eventsArray = SynUtils.$arr(eventsArray);
			
			for (var e=0; e < eventsArray.length; e++)
			{	
				var event_name = eventsArray [e];
				
					
				//modify event_name
				if(event_name.toLowerCase().startsWith("on"))
					event_name = event_name.substr(2);
			
				for (var i=0; i < objectsArray.length; i++)
				{
					var object = objectsArray [i];
					
					if(document.all || !document.createEvent)
					{
						object.fireEvent("on" + event_name);
					}
					else
					{
						var events = "Events";
						//Check the event type
						event_name = event_name.toLowerCase();
						if (event_name.indexOf("click")>=0 
							|| event_name.indexOf("mouse")>=0)
							events = "MouseEvents";
						else if (event_name.indexOf("key")>=0 
							|| event_name.indexOf("cut")>=0)
							events = "KeyEvents";
						
						var evt = document.createEvent(events);
						evt.initEvent(event_name, true, true);
						object.dispatchEvent(evt);
					}
				}
			}
		}
	}		
}
//Extend prototypes
String.prototype.startsWith = function (txt, ignoreCase)
{
	if(ignoreCase==null) ignoreCase = true;
	if(txt==null) return false;
	if(txt.length>this.length) return false;
	if(ignoreCase)
	{
		return (this.toLowerCase().indexOf(txt.toLowerCase())==0);
	}
	else
		return (this.indexOf(txt)==0);
	
};
String.prototype.endsWith = function  (txt, ignoreCase)
{
	if(txt==null) return false;
	if(txt.length>this.length) return false;
	if(ignoreCase)
	{
		return (this.toLowerCase().substr(this.length-txt.length)==txt.toLowerCase());
	}
	else
		return (this.substr(this.length-txt.length)==txt);
	
}

//Alias
var lh = LinkHighlighting;
var sU = SynUtils;

sU.Events.Add(window, "load", function () {sU.Init(); lh.Init();});
SynUtils.BrowserDetect();
