//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 IBM Corporation and others.
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// which accompanies this distribution, and is available at
// http://www.eclipse.org/legal/epl-v10.html
// 
// Contributors:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------

// messages to be externized
// here defines all the I18N specific messages used in the javascripts

var topnav_js_MESSAGE1 = "Дерево еще не загружено.\nПожалуйста, подождите.";
var topnav_js_MESSAGE2 = "Для данной страницы нет страницы '{0}'.\nНажмите другую кнопку навигации. ";
var topnav_js_MESSAGE3 = "Не найдена страница {0}. ";
var topnav_js_MESSAGE_prev = "назад";
var topnav_js_MESSAGE_next = "далее";
var topnav_js_MESSAGE_up = "вверх";
var topnav_js_MESSAGE4 = "Текущего файла нет в дереве. ";
var topnav_js_MESSAGE5 = "Опубликованный сайт уже показан в фреймах";

function formatString(message, replace0)
{
   	return message.replace(/\{0\}/, replace0);
} 

// this script is for the topnav.html
// this is NOT for general use
MSFPhover =
(((navigator.appName == "Netscape") &&
  (parseInt(navigator.appVersion) >= 3 )) ||
  ((navigator.appName == "Microsoft Internet Explorer") &&
  (parseInt(navigator.appVersion) >= 4 )));

  function MSFPpreload(img)
  {
     var a=new Image();
     a.src=img;
     return a;
  }
  
var tour = 0;

function openFirstTour ()
// open the guided tour /haakan 990324
{
if(!tour || tour==null || tour.closed)
    {
      tour = open("./tour/tour.htm","tour_page","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=350,height=700,resizable=yes");
      tour.focus();
    }
    else
    {
      tour.focus();
    }
}

function openTour ()
// open the guided tour /haakan 990324
{
if(!tour || tour==null || tour.closed)
    {
      tour = open("./tour/tour.htm","tour_page","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=350,height=700,resizable=yes");
      tour.focus();
    }
    else
    {
      tour.focus();
    }
}

//Addition by Chinh Vo 03/28/00
 function displayGettingStarted()
 {
 	var pagePattern = /ovu_proc/;
 	var mainPage = window.parent.ory_doc.location;

 	if ( pagePattern.test( mainPage ) ) {
    	if (getCookie("RUP") != "checked") { openFirstTour(); }
	}
	else {
		setTimeout( "displayGettingStarted()", 1000 );
	}
}

function getCookie (name)
{
  var dcookie = document.cookie;
  var cname = name + "=";
  var clen = dcookie.length;
  var cbegin = 0;
  while (cbegin < clen)
  {
    var vbegin = cbegin + cname.length;
    if (dcookie.substring(cbegin, vbegin) == cname)
    {
      var vend = dcookie.indexOf (";", vbegin);
      if (vend == -1)
      {
        vend = clen;
      }
      return unescape(dcookie.substring(vbegin, vend));
    }
    cbegin = dcookie.indexOf(" ", cbegin) + 1;
    if (cbegin == 0)
    {
      break;
    }
  }
  return null;
 }


  var index=null;
  var tour=null;
  var search=null;
  var glossary=null;
  var feedback=null;
  var treeLoaded=false;
  function checkTreeLoaded()
  {
    if(treeLoaded)
    {
      return treeLoaded;
    }

    /*
     if(parent.ory_toc.document.RupPresenterApplet != null
        && parent.ory_toc.document.RupPresenterApplet.isReady())
     {
       treeLoaded = true;
     }
     */
     if(parent.ory_toc.document.RupPresenterApplet != null)
     {
      	var method = typeof parent.ory_toc.document.RupPresenterApplet.isReady;
	 if (method != "undefined") {
		if (parent.ory_toc.document.RupPresenterApplet.isReady())
		{
       			treeLoaded = true;
		}

	  }

     }

     return treeLoaded;
   }


    function showAlertNotLoaded()
    {
      alert(topnav_js_MESSAGE1);
    }

function showStatusNotLoaded()
  {
    //return "The TreeBrowse is not yet loaded!\nPlease wait!";
    return topnav_js_MESSAGE1;
  }

  function showAlertNoPage(text)
  {
     var parentLabel = parent.ory_toc.document.applets.Tree.getParentLabel(parent.ory_doc.document.URL);
     if(parentLabel!="" && parentLabel!=null)
     {
          //alert("There is no '" + text + "' page for this page.\nTry one of the other navigation buttons.");
          alert(formatString(topnav_js_MESSAGE2, text));
     }
     else
     {
         //alert("There is no '" + text + "' page for this page.\nTry one of the other navigation buttons");
         alert(formatString(topnav_js_MESSAGE2, text));
     }
  }

  function showStatusNoPage(text)
  {

     var parentLabel = parent.ory_toc.document.applets.Tree.getParentLabel(parent.ory_doc.document.URL);
     var msg;
     if(parentLabel!="" && parentLabel!=null)
     {
        //msg = "There is no " + text + " page!";
        msg = formatString(topnav_js_MESSAGE3, text);
     }
     else
     {
        //msg = "There is no " + text + " page!";
        msg = formatString(topnav_js_MESSAGE3, text);
     }

     return msg;
  }

  function showParentLabel()
  {
    if(checkTreeLoaded())
    {
      var label = parent.ory_toc.document.applets.Tree.getParentLabel(parent.ory_doc.document.URL);
      var parenturl = parent.ory_toc.document.applets.Tree.getParentUrl(parent.ory_doc.document.URL);

     if(label!="" && label!=null && parenturl!="" && parenturl!=null)
     {
       self.status = label;
     }
     else
     {
       self.status = showStatusNoPage("up");
     }
    }
    else
    {
        self.status = showStatusNotLoaded();
    }
  }

  function showHomeLabel()
  {
    self.status = "В начало";
  }

  function showPreviousLabel()
  {
    if(checkTreeLoaded())
    {
      var label = parent.ory_toc.document.applets.Tree.getPreviousLabel(parent.ory_doc.document.URL);
      var prevurl = parent.ory_toc.document.applets.Tree.getPreviousUrl(parent.ory_doc.document.URL);

     if(label!="" && label!=null && prevurl!="" && prevurl!=null)
     {
       self.status = label;
     }
     else
     {
        self.status = showStatusNoPage("previous");
     }
    }
    else
    {
        self.status = showStatusNotLoaded();
    }
  }

  function showNextLabel()
  {
    if(checkTreeLoaded())
    {
      var label = parent.ory_toc.document.applets.Tree.getNextLabel(parent.ory_doc.document.URL);
      var nexturl = parent.ory_toc.document.applets.Tree.getNextUrl(parent.ory_doc.document.URL);
      if(label!="" && label!=null && nexturl!="" && nexturl!=null)
      {
        self.status = label;
      }
      else
      {
        self.status =  showStatusNoPage("next");
      }
    }
    else
    {
       self.status =  showStatusNotLoaded();
    }
  }

  function loadPrevious()
  {
    if(checkTreeLoaded())
    {
     var newLabel = parent.ory_toc.document.applets.Tree.getPreviousLabel(parent.ory_doc.document.URL);
     var newLocation = parent.ory_toc.document.applets.Tree.getPreviousUrl(parent.ory_doc.document.URL);

     if(newLocation!="" && newLocation!=null)
     {

	if ((newLocation.indexOf("applet")==-1) && (newLocation.indexOf("www")==-1))
	{
		parent.ory_doc.location = newLocation;
	}
	else if (newLocation.indexOf("applet")!=-1)
	{
	 	parent.ory_toc.document.applets.Tree.getAppletPage(newLocation, newLabel);
	}
	else if (newLocation.indexOf("www")!=-1)
	{
		newLocation = parent.ory_toc.document.applets.Tree.getHttpPage(newLocation, newLabel, "Previous");
	}
	      	parent.ory_toc.document.applets.Tree.selectNode(newLocation);
     }
     else
     {
       showAlertNoPage(topnav_js_MESSAGE_prev);
     }
     }
    else
    {
        showAlertNotLoaded();
    }
     return;
  }

  function loadNext()
  {
    if(checkTreeLoaded())
    {
     var newLabel = parent.ory_toc.document.applets.Tree.getNextLabel(parent.ory_doc.document.URL);
     var newLocation = parent.ory_toc.document.applets.Tree.getNextUrl(parent.ory_doc.document.URL);
     if(newLocation!="" && newLocation!=null)
     {

	if ((newLocation.indexOf("applet")==-1) && (newLocation.indexOf("www")==-1))
	{
		parent.ory_doc.location = newLocation;
	}
	else if (newLocation.indexOf("applet")!=-1)
	{
	 	parent.ory_toc.document.applets.Tree.getAppletPage(newLocation, newLabel);
	}
	else if (newLocation.indexOf("www")!=-1)
	{
		newLocation = parent.ory_toc.document.applets.Tree.getHttpPage(newLocation, newLabel, "Next");
	}
       parent.ory_toc.document.applets.Tree.selectNode(newLocation);

     }
     else
     {
        showAlertNoPage(topnav_js_MESSAGE_next);
     }
    }
    else
    {
      showAlertNotLoaded();
    }

     return;
  }

  function loadParent()
  {
    if(checkTreeLoaded())
    {
     var newLocation = parent.ory_toc.document.applets.Tree.getParentUrl(parent.ory_doc.document.URL);
     if(newLocation!="" && newLocation!=null)
     {
       parent.ory_doc.location = newLocation;
       parent.ory_toc.document.applets.Tree.selectNode(newLocation);
     }
     else
     {
       showAlertNoPage(topnav_js_MESSAGE_up);
     }
    }
    else
    {
       showAlertNotLoaded();
    }

     return;
  }

function whereAmI()
  {
    if(checkTreeLoaded())
    {
	var status = parent.ory_toc.document.applets.Tree.selectNode(parent.ory_doc.document.URL);
    	if( status == false )
	{
		alert( topnav_js_MESSAGE4 );
	}
    }
    else
    {
      showAlertNotLoaded();
    }
     return;
  }

  function upArrow()
  {
    if(checkTreeLoaded())
    {
      var newLocation = parent.ory_toc.document.applets.Tree.upArrow();
      if(newLocation!="" && newLocation!=null)
      {
       parent.ory_doc.location = newLocation;
      }
    }
    else
    {
      showAlertNotLoaded();
    }
     return;
  }

  function downArrow()
  {
    if(checkTreeLoaded())
    {
      var newLocation = parent.ory_toc.document.applets.Tree.downArrow();
      if(newLocation!="" && newLocation!=null)
      {
       parent.ory_doc.location = newLocation;
      }

    }
    else
    {
      showAlertNotLoaded();
    }
     return;
  }

    function leftArrow()
  {
    if(checkTreeLoaded())
    {
     parent.ory_toc.document.applets.Tree.leftArrow();
    }
    else
    {
      showAlertNotLoaded();
    }
     return;
  }

    function rightArrow()
  {
    if(checkTreeLoaded())
    {
     parent.ory_toc.document.applets.Tree.rightArrow();
    }
    else
    {
      showAlertNotLoaded();
    }
     return;
  }


function loadTop()
{
  if(parent.frames.length!=0 && parent.frames[1].name=="ory_toc")
  {
     alert(topnav_js_MESSAGE5);
  }
  else
  {
    var expires = new Date();
    expires.setTime (expires.getTime() + (1000 * 20));
    document.cookie = "rup_ory_doc=" + escape (document.URL) +
    "; expires=" + expires.toUTCString() +  "; path=/";

    var new_ory_doc_loc = null;

    for(i=document.links.length-1;i>=0;i--)
    {
       if(document.links[i].href.indexOf("index.htm")!=-1)
       {
         new_ory_doc_loc = document.links[i].href;
         break;
       }
    }

    if(new_ory_doc_loc!=null)
    {
	if( self.name == "ory_doc" )
	{
		window.close();
		window.open( new_ory_doc_loc );
	}
	else
	{
	       	top.location = new_ory_doc_loc;
	}
    }
   }
}


function openOry (page, target)
{
    if(!index || index.closed)
    {
      index = open(page,target,"toolbar=no,directories=no,menubar=no,scrollbars=yes,width=395,height=500,resizable=yes");
    }
    else
    {
      index.focus();
    }
}

function openSearch()
{
    if(!search || search.closed)
    {
      search = open("./applet/search.htm","search_page","toolbar=no,directories=no,menubar=no,scrollbars=no,width=630,height=450,resizable=yes");
    }
    else
    {
      search.focus();
    }
}

function openIndex()
{
   openOry("./index/index.htm","index_win");
}

function openGlossary()
{
 if(!glossary || glossary.closed)
    {
      glossary = open("./process/glossary/index.htm","glossary_win","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=385,height=500,resizable=yes");
    }
    else
    {
      glossary.focus();
    }
}

function printPage()
{
 parent.ory_doc.focus();
 parent.ory_doc.print();
}


function sendFeedback(url)
{
	if ( url == null || url == '' )
	{
		return;
	}
	
	if ( url.indexOf("mailto:") >= 0 )
	{
		sendmail(url);
	}
	else
	{
		
 	    if(!feedback || feedback.closed)
	    {
	      feedback = open(url,"feedback_win","toolbar=no,directories=no,menubar=no,scrollbars=yes,width=600,height=500,resizable=yes");
	    }
	    else
	    {
	      feedback.focus();
	    }
    	}
    	
}


function sendmail(url)
{
	if ( url.indexOf("?subject") == -1 )
	{
		var link=parent.ory_doc.location;
		url = url + '?subject=Feedback: - '+link;
	}
	location.replace(url);
}

//calculates relative path
//path must be all relative from website base or contain full urls
function calculateRelativePath(sourcePath, targetPath)
{
	if (targetPath.indexOf("http:/") != -1)
	{
		return targetPath;
	}

	//replace all '\' with '/'
	sourcePath = sourcePath.replace(/\\/g,"$1/$2");
	targetPath = targetPath.replace(/\\/g,"/");

	//alert("Replace(Source)=>" + sourcePath);
	//alert("Replace(target)=>" + targetPath);


	sourceArray = sourcePath.split("/");
	targetArray = targetPath.split("/");

	var theRelPath = "";

	//loop until we find a difference
	var idx = 0;
	for(idx = 0; idx < sourceArray.length; idx++)
	{
		if (idx > targetPath.length)
		{
			break;
		}

		if (sourceArray[idx] != targetArray[idx])
		{
			break;
		}
	}

	//append the appropriate number of ./
	var maxIdx = sourceArray.length - 1;
	for (var i = idx; i < maxIdx; i++)
	{
		theRelPath = theRelPath + "./";

		//alert("RelPath=>" + theRelPath);
	}

	//append any remaining target path
	while(idx < targetArray.length)
	{
		theRelPath = theRelPath + targetArray[idx++] + "/";
		//alert("RelPath(final)=>" + theRelPath);
	}

	//remove the last path separator
	if (theRelPath.length > 0)
	{
		//alert("RelPath(Trim1)=>" + theRelPath);
		theRelPath = theRelPath.substring(0, (theRelPath.length - 1));
		//alert("RelPath(Trim1)=>" + theRelPath);
	}

	//alert("Return Relative Path => " + theRelPath);

	return theRelPath;
}

function getTreePath()
{
	return buildTreePathLocation();
}

//This method will remove the website base from the url
function calculatCurrentPage(currURL) {

	var theCurrentLocation = document.location.href;
	//replace all '\' with '/'
	theCurrentLocation = theCurrentLocation.replace(/\\/g,"$1/$2");
	currURL = currURL.replace(/\\/g,"$1/$2");

	var sourceArray = theCurrentLocation.split("/");
	var currArray = currURL.split("/");

	var numToRemove = sourceArray.length - 2;
	var idx = 0;
	var theReturnPath = "";
	for (idx = numToRemove; idx < currArray.length; idx++) {
		if (theReturnPath != "") {
			theReturnPath = theReturnPath + "/";
		}
		theReturnPath = theReturnPath + currArray[idx];
	}

	//alert("ArrayTest=>" + currURL + "," + theReturnPath);
	return theReturnPath;
}

//builds tree path
function buildTreePathLocation()
{
	var theDelimiter = "##*";
	var thisPage = "applet/rup_topnav.htm";
	var theLoc = "";



	if(checkTreeLoaded())
	{
		var theCurrentLocation = parent.ory_doc.document.location.href;
		thisPage = calculatCurrentPage(theCurrentLocation);

		//alert("PathName:" + thisPage);

		//alert("Trying to find the path for =>" + theCurrentLocation);

		var thePath = parent.ory_toc.document.RupPresenterApplet.getTreePathArray(theCurrentLocation);

		//alert("The Tree Path: " + thePath);

		thePathString = thePath + "";
    		arrayFromString = thePathString.split(theDelimiter);

		//build the path from the array
		//param 1 = path to icon, param 2 - label, param 3 - path to file
		var counter = 0;
		var theLabel;
		var theRelPath;
		if (arrayFromString.length > 2)
		{
		   theLoc = "";
		   for(var i = 0; i < (arrayFromString.length - 1) ; i++)
		   {
			//it's the icon path
			if (counter < 2)
			{
				if (counter > 0)
				{
					theLoc = theLoc + " &gt; ";
				}

				//alert("Calculating path from(1) " + thisPage + " => " + arrayFromString[i]);

				if (arrayFromString[i].indexOf("\\") == -1 && arrayFromString[i].indexOf("/") == -1)
				{
					if (arrayFromString[i] != "null")
					{
						theRelPath = "applet/images/" + arrayFromString[i];
						theRelPath = calculateRelativePath(thisPage, theRelPath);
					}
					//alert("Modifying Path => " + theRelPath);
				}
				else {
					theRelPath = calculateRelativePath(thisPage, arrayFromString[i]);
				}

				if (theRelPath != "null")
				{
					theLoc = theLoc +
						 "<img border=0 src=\"" +
						 theRelPath  +
						 "\">";
				}

				//alert("the curr path=>" + theLoc);
				counter = 2;
			}
			// it's the label
			else if (counter == 2)
			{
				theLabel = arrayFromString[i];
				counter = 3;
			}
			else if (counter == 3)
			{
				//alert("Calculating path from(3) " + thisPage + " => " + arrayFromString[i]);
				if (arrayFromString[i] != "null")
				{
					theRelPath = calculateRelativePath(thisPage, arrayFromString[i]);
					if (theRelPath != "") {
						theLoc = theLoc +
					 		"<a class=\"hottext\" target=\"ory_doc\" href=\"" +
							 theRelPath +
					 		"\">" +
					 		theLabel +
					 		"<\/a>\n";
					 }
					 else {
					 	theLoc = theLoc +
					 		"<a class=\"hottext\">"  +
					 		theLabel +
					 		"<\/a>\n";
					 }
				}
				else
				{
					theLoc = theLoc +
					 	"<a class=\"hottext\">"  +
					 	theLabel +
					 	"<\/a>\n";
				}
				//alert("the curr path=>" + theLoc);
				counter = 1;
				theRelPath = "null";
				theLabel = "null";
			}
		   }

		//alert("Finished Building => " + theLoc);
		}

	}

	//theLoc = "Current Location&nbsp;&#045;&nbsp;" + theLoc;

	//alert("the Final String=>" + theLoc);

	//document.write(theLoc);
	return theLoc;

}

