function bitfield(field,array) {
  var result = "";
  for (var i=0; ((i < field.length) && (field.length == array.length)); i++) {
    result = result + array[i] + ((field.substr(i,1) == '1') ? "=yes" : "=no") + ((i+1 < field.length) ? "," : "");
  }
  return result;
}

/* open a popup-window with any content */
function openPopup(url,windowname,topPosition,leftPosition,width,height,flags) {
   var popUpSwitches = new Array("location","menubar","scrollbars","status","resizable","toolbar");
   flags = bitfield(flags,popUpSwitches)

   // URL Korrektur um JavaScript Security Error zu vermeiden
   // gleichen Hostnamen von PopUp und Opener
   var startIndex = url.indexOf("//");
   if (startIndex >= 0) {
      var newUrl = url.substring(0, startIndex);

      url = url.substring(startIndex+2, url.length);
      startIndex = url.indexOf("/");
      url = url.substring(startIndex, url.length);

      var first = newUrl.concat("//");
      var second = first.concat(window.location.host);
      var third = second.concat(url);
      url = third;
   }

   var newwin = window.open(url,windowname,"top="+topPosition+",left="+leftPosition+",width="+width+",height="+height+flags);
   newwin.focus(self);
}

/* Link to open a popup-window with any content */
function popUp(url,windowname,style)
{
var standard = "top=20,left=200,resizable=no,status=no,toolbar=no,menubar=no,location=no";
if (style=="pro" || style=="int" || style=="sef") var size = ",scrollbars=yes,width=600,height=500";
else if (style=="poi") var size = ",scrollbars=yes,width=500,height=480";
else if (style=="pri") var size = ",scrollbars=yes,width=685,height=600";
else if (style=="cms") var size = ",scrollbars=yes,width=500,height=400";
else if (style=="loc") var size = ",scrollbars=no,width=305,height=355";
else if (style== "profile")
{
var size = ",scrollbars=no,width=200,height=60";
}
newwin = window.open(url,windowname,standard+""+size);
newwin.focus(self);
}
/* Function to open a popup-window with any content */
function popUpWindow(url,title,style,topPosition,leftPosition,width,height)
{
var standard = ",resizable=no,status=no,toolbar=no,menubar=no,location=no";
if (style=="pro" || style=="int" || style=="sef") var size = ",scrollbars=yes,width=600,height=500";
else if (style=="poi") var scrollbar = ",scrollbars=yes";
else if (style=="pri") var scrollbar = ",scrollbars=yes";
else if (style=="cms") var scrollbar = ",scrollbars=yes";
else if (style=="loc") var scrollbar = ",scrollbars=no";
else if (style== "profile") var scrollbar = ",scrollbars=no";
else if (style== "partner") var scrollbar = ",scrollbars=yes";
var layout = "top="+topPosition+",left="+leftPosition+standard+scrollbar+",width="+width+",height="+height;
//var result = decodeApostrophe(url);
var result = url;
newwin = window.open(result,title,layout);
newwin.focus(self);
}
/* Function to open a popup-window with any content */
function popUpEventWindow(url,title,style,topPosition,leftPosition,width,height)
{
var urlTokens = url.split("&");
var fromDate  = urlTokens[10];
var toDate    = urlTokens[11];
var splitDate = fromDate.split("=");
splitDate     = splitDate[1].split(".");
var splitDay  = toDate.split("=");
var baseDay   = splitDate[0];
if (baseDay.charAt(0) == '0')
baseDay = baseDay.charAt(1);
var baseMonth = splitDate[1];
if (baseMonth.charAt(0) == '0')
baseMonth = baseMonth.charAt(1);
var baseYear = eval('20'+splitDate[2]);
var strFromDate = splitDate[0]+"."+splitDate[1]+".20"+splitDate[2];
var newDate = gregDate(1*splitDay[1]+1*getDaysSince1980(baseYear, baseMonth, baseDay));
if (1*newDate[0] < 10)
newDate[0] = "0"+newDate[0];
if (1*newDate[1] < 10)
newDate[1] = "0"+newDate[1];
var strToDate = newDate[0]+"."+newDate[1]+".20"+newDate[2];
var newURL = "";
for (index = 0; index < urlTokens.length; index++)
{
if (urlTokens[index].search(/DateFrom.+/) != -1)
{
newURL = newURL+"DateFrom="+strFromDate+"&";
}
else if (urlTokens[index].search(/DateTo.+/) != -1)
{
newURL = newURL+"DateTo="+strToDate+"&";
}
else
{
newURL = newURL+urlTokens[index]+"&";
}
}
popUpWindow(newURL,title,style,topPosition,leftPosition,width,height);
}
/* Function to open a popup-window with any content */
function popUpHotelWindow(url,title,style,topPosition,leftPosition,width,height)
{
var urlTokens = url.split("&");
var fromDate  = urlTokens[2];
var toDate    = urlTokens[4];
var splitDate = fromDate.split("=");
splitDate     = splitDate[1].split(".");
var splitDay  = toDate.split("=");
var baseDay   = splitDate[0];
if (baseDay.charAt(0) == '0')
baseDay = baseDay.charAt(1);
var baseMonth = splitDate[1];
if (baseMonth.charAt(0) == '0')
baseMonth = baseMonth.charAt(1);
var baseYear = eval('20'+splitDate[2]);
var strFromDate = splitDate[0]+"."+splitDate[1]+".20"+splitDate[2];
var newDate = gregDate(1*splitDay[1]+1*getDaysSince1980(baseYear, baseMonth, baseDay));
if (1*newDate[0] < 10)
newDate[0] = "0"+newDate[0];
if (1*newDate[1] < 10)
newDate[1] = "0"+newDate[1];
var strToDate = newDate[0]+"."+newDate[1]+".20"+newDate[2];
var newURL = "";
for (index = 0; index < urlTokens.length; index++)
{
if (urlTokens[index].search(/CheckIn.+/) != -1)
{
newURL = newURL+"CheckIn="+strFromDate+"&";
}
else if (urlTokens[index].search(/CheckOut.+/) != -1)
{
newURL = newURL+"CheckOut="+strToDate+"&";
}
else
{
newURL = newURL+urlTokens[index]+"&";
}
}
popUpWindow(newURL,title,style,topPosition,leftPosition,width,height);
}

/* Function to open a popup-window with any content */
function popUpSBBTravelWindow(form){
  var fromDate = form.CheckIn.value;
  var numberNights = form.Nights.value;

  if(fromDate.indexOf(",") != -1){
    var splitDate = fromDate.split(",");
    splitDate = splitDate[1].split(".");
  }else{
    var splitDate     = fromDate.split(".");
  }

  var baseDay   = splitDate[0];
  if (baseDay.charAt(0) == '0')
     baseDay = baseDay.charAt(1);
  var baseMonth = splitDate[1];
  if (baseMonth.charAt(0) == '0')
     baseMonth = baseMonth.charAt(1);
  if(splitDate[2] < 100){
    var baseYear = eval('20'+splitDate[2]);
    var strFromDate = splitDate[0]+"."+splitDate[1]+".20"+splitDate[2];
  }
  else{
    var baseYear = splitDate[2];
    var strFromDate = splitDate[0]+"."+splitDate[1]+"."+splitDate[2];
  }

  var newDate = gregDate(1*numberNights+1*getDaysSince1980(baseYear, baseMonth, baseDay));
  if (1*newDate[0] < 10)
     newDate[0] = "0"+newDate[0];
  if (1*newDate[1] < 10)
     newDate[1] = "0"+newDate[1];
  var strToDate = newDate[0]+"."+newDate[1]+".20"+newDate[2];

  form.CheckIn.value = strFromDate;
  form.CheckOut.value = strToDate;
}

/* Show Calendar or Servicedays in Popup */
function openCalendar(url,windowname,journeystatus){
var standard = "scrollbars=no,resizable=no,status=no,toolbar=no,menubar=no,location=no";
if (windowname=="Verkehrstage")
{var size = ",width=320,height=420";} else {var size = ",width=320,height=360";}
newwin = window.open(url,windowname+""+journeystatus,standard+""+size);
}
/* Set Date by JavaScript */
function getjsDate(type){
var ndate = new Date();
var t = ndate.getDate();
var m = 1+(1*ndate.getMonth());
var g = "g"+ndate.getYear();
var j = g.substring(3,5);
if(t<10) t = "0"+t;
if(m<10) m = "0"+m;
if(j<10) j = "0"+1*j;
if(type=="full")
{var date = t+"."+m+"."+j; return date;}
else
{var date = new Array(t,m,j); return date;}
}
function checkWeekday(count,journeyType,returnDateOnly){
var getcDate = eval("document.formular.REQ"+journeyType+"JourneyDate.value.toLowerCase();");
if(getcDate == ""){var nix = 0;} else
if((getcDate.length > 2) || (getcDate.indexOf("+")!= -1)) /* Abfrage auf '+' ben&#246;tigt ??? */
{changeDate(count,journeyType,returnDateOnly);}
else
{doWeekday(journeyType,getcDate,returnDateOnly);}
}
function useOutwardDate(wDay)
{
var getcDate = eval("document.formular.REQ0JourneyDate.value.toLowerCase();");
var reg = eval("/^ *("+wDay+")\, */");
var cDate = getcDate.replace(reg,"");
var date = cdate.split(".");
return date;
}
function doWeekday(journeyType,getcDate,returnDateOnly){
var wDayOri = eval("document.formular.wDayExt"+journeyType+".value;");
var wDay = eval("document.formular.wDayExt"+journeyType+".value.toLowerCase();");
if(journeyType == 0 && returnDateOnly == "yes")
{var dateField = getjsDate('field');}
else if(journeyType == 1 && returnDateOnly == "yes")
{var dateField = useOutwardDate(wDay);}
else /* if(journeyType == 1 && returnDateOnly == "no") */
{var dateField = getjsDate('field');}
var reg = eval("/^ *("+wDay+") */");
var test = getcDate.match(reg);
if(test!=null)
{
var days = getDaysSince1980((1*("20"+dateField[2])),(1*dateField[1]),(1*dateField[0]));
var cwd = (wDay.substr((3*(1*days%7)),2));
var nwd = test[0];
var nwdidx  = (wDay.indexOf(test[0])/3);
var cwdidx  = (wDay.indexOf(cwd)/3);
if(nwdidx < cwdidx)
{nwdidx = nwdidx + 7 - cwdidx;}
else
{nwdidx = nwdidx - cwdidx;}
var newDay = nwdidx;
var gDate = gregDate(1*newDay+1*(getDaysSince1980((1*("20"+dateField[2])),(1*dateField[1]),(1*dateField[0]))));
var days = (1*+newDay+1*getDaysSince1980((1*("20"+dateField[2])),(1*dateField[1]),(1*dateField[0])));
setNewDate(journeyType,gDate,getcDate,wDayOri,days);
}
}
/* Get and Calculate new date */
function changeDate(count,journeyType,returnDateOnly){
var wDay = eval("document.formular.wDayExt"+journeyType+".value;");
var getcDate = eval("document.formular.REQ"+journeyType+"JourneyDate.value;");
var reg = eval("/^ *("+wDay+")\, */");
if(getcDate=="" && journeyType==1 && returnDateOnly=="no")  {var getcDate = getjsDate('full');}
if(getcDate=="" && journeyType==1 && returnDateOnly=="yes") {var getcDate = eval("document.formular.REQ0JourneyDate.value;");}
var cDate = getcDate.replace(reg,"");
var ctg = 1*(cDate.substring(0,cDate.indexOf(".")));
var cmt = 1*(cDate.substring((cDate.indexOf(".")+1),cDate.lastIndexOf(".")));
var cjr = (cDate.substring((cDate.lastIndexOf(".")+1),cDate.length));
if(ctg=="" || cmt=="" || cjr=="")
{/* NIX */}
else
{
if(cjr.length==4){cjr = cjr.substring(2,4);};
if(cjr.length==1){cjr = "0"+cjr;};
var gDate = gregDate(1*count+1*(getDaysSince1980((1*("20"+cjr)),cmt,ctg)));
var days = (1*count+1*(getDaysSince1980((1*("20"+cjr)),cmt,ctg)));
setNewDate(journeyType,gDate,cDate,wDay,days);
}
}
function setNewDate(journeyType,gDate,cDate,wDay,days)
{
var nwd = (wDay.substr((3*(1*days%7)),2));
if(gDate[0]<10){gDate[0]="0"+gDate[0];}
if(gDate[1]<10){gDate[1]="0"+gDate[1];}
var nDate = nwd+", "+gDate[0]+"."+gDate[1]+"."+gDate[2];
if(nDate.indexOf("NaN")!=-1) var nDate = cDate;
eval("document.formular.REQ"+journeyType+"JourneyDate.value =\""+nDate+"\";");
}
function getDaysSince1980(y, m, d){
var daysInMonth = new Array(0,31,59,90,120,151,181,212,243,273,304,334);
var returnDays = (y-1980)*365;
returnDays    += (y-1980+3)/4;
returnDays    += daysInMonth[m-1];
if(m>2 && isLeapYear(y)==true) returnDays ++;
returnDays += 1*d;
returnDays = parseInt(returnDays);
return returnDays;
}
function isLeapYear(y){if((y%4)==0 && (y%100)!=0 || (y%400)==0) return true;}
function gregDate(daysSince1980){
var daysSince1980 = parseInt(daysSince1980);
var daysInMonth = new Array(0,31,59,90,120,151,181,212,243,273,304,334);
var daysInYear = 366;
var years      = 0;
var february_29;
var n = 11;
if(daysSince1980 < 0) daysSince1980 = 0;
while(daysSince1980> daysInYear){
years ++;
daysSince1980 -= daysInYear;
if((years%4)==0) {daysInYear = 366;} else {daysInYear = 365;}
}
if((years%4)==0 && daysSince1980>=60)
{february_29 = true; daysSince1980 --;} else
{february_29 = false;}
while(n>0 && daysInMonth[n]>=daysSince1980) n--;
if(february_29==true && daysSince1980 == 59) daysSince1980 ++;
var d = (daysSince1980-daysInMonth[n]);
var m = n+1;
var ty = (years + 1980).toString();
var y = ty.substring(2,4);
var gDate = new Array(d,m,y);
return gDate;
}
/* get current time and calculate new time */
function changeTime(count,journeyType)
{
var getTime = eval("document.formular.REQ"+journeyType+"JourneyTime.value;");
var jsTime = getTime.split(":");
var jsHours = jsTime[0];
var jsMinutes = jsTime[1];
var jsNewHours = (1*jsHours) + (1*count);
if(jsNewHours >= 24)
jsNewHours -= 24;
else if(jsNewHours <0)
jsNewHours += 24;
var newTime = "\""+jsNewHours +":"+jsMinutes+"\"";
var output = "document.formular.REQ"+journeyType+"JourneyTime.value ="+newTime;
eval(output);
}
/* insert as plan text the date in x days based on baseDate. */
function insertNewDate (baseDate, dayIncrement)
{
var splitDate = baseDate.split(".");
var baseDay   = splitDate[0];
if (baseDay.charAt(0) == '0')
baseDay = baseDay.charAt(1);
var baseMonth = splitDate[1];
if (baseMonth.charAt(0) == '0')
baseMonth = baseMonth.charAt(1);
var baseYear = eval('20'+splitDate[2]);
var days = getDaysSince1980(baseYear, baseMonth, baseDay);
days += dayIncrement;
var newDate = gregDate(1*days);
if (newDate[0] < 10)
newDate[0] = "0"+newDate[0];
if (newDate[1] < 10)
newDate[1] = "0"+newDate[1];
var strDate = newDate[0]+"."+newDate[1]+".20"+newDate[2];
document.write(strDate);
}
function decodeApostrophe (string)
{
var tokens = string.split("***");
var length = tokens.length;
var result = "";
var index;
if (length > 1)
{
for (index = 0; index < length; index++)
{
result += tokens[index];
result += "%27";
}
}
else
{
result = string;
}
return result;
}
function encodeApostrophe (string)
{
var tokens = string.split("%27");
var length = tokens.length;
var result = "";
var index;
for (index = 0; index < length; index++)
{
result += tokens[index];
result += "***";
}
return result;
}

/* Returns the absolute x-position of element el */
function absLeft(el) {
    return (el.offsetParent)?
        el.offsetLeft+absLeft(el.offsetParent) : el.offsetLeft;
}

/* Returns the absolute y-position of element el */
function absTop(el) {
    return (el.offsetParent)?
        el.offsetTop+absTop(el.offsetParent) : el.offsetTop;
}

/* Removes the div with id "tipDiv" if mouseEvent is outside this div. */
function tooltipActiveMouseMove( mouseEvent )
{
    if ( !mouseEvent )
        mouseEvent = window.event;

    var tipDiv = document.getElementById( "tipDiv" );
    var tipFrame = document.getElementById( "tipFrame" );

    var tipX1 = absLeft( tipDiv );
    var tipY1 = absTop( tipDiv );

    var tipX2 = tipX1 + tipDiv.offsetWidth;
    var tipY2 = tipY1 + tipDiv.offsetHeight;

    scrollPos = getScrollPos();

    var evX = mouseEvent.clientX + scrollPos.x;
    var evY = mouseEvent.clientY + scrollPos.y;

    if ( (evX < tipX1) || (evX > tipX2 ) ||
         (evY < tipY1) || (evY > tipY2 ) )
        {
        document.onmousemove = null;
        document.body.removeChild( tipDiv );

        if ( tipFrame )
            document.body.removeChild( tipFrame );
        }
}

/* Returns the window's width */
function getWindowWidth()
{
    if (self.innerWidth) // all except Explorer
        {
        return self.innerWidth;
        }
    else if (document.documentElement && document.documentElement.clientWidth)
   // Explorer 6 Strict Mode
        {
        return document.documentElement.clientWidth;
        }
    else if (document.body) // other Explorers
        {
   return document.body.clientWidth;
        }
}

/* Returns the window's height */
function getWindowHeight()
{
    if (self.innerHeight) // all except Explorer
        {
   return self.innerHeight;
        }
    else if (document.documentElement && document.documentElement.clientHeight)
   // Explorer 6 Strict Mode
        {
        return document.documentElement.clientHeight;
        }
    else if (document.body) // other Explorers
        {
   return document.body.clientHeight;
        }
}

// returns the scroll left and top for the browser viewport.
function getScrollPos() {
   if ( document.body.scrollTop != undefined ) {   // IE model
      var ieBox = document.compatMode != "CSS1Compat";
      var cont = ieBox ? document.body : document.documentElement;
      return { x : cont.scrollLeft, y : cont.scrollTop };
   }
   else {
      return { x : window.pageXOffset, y : window.pageYOffset };
   }
}
/*
   Shows a tooltip at position "mouseEvent".
   The content is taken from "tip".
   Creates a div with id "tipDiv".

   If "linkText" is defined, the function tries to find an "a" tag, that
   is the target of the mouse event. If an "a"-tag is found and has an "href"
   link the link will be included at the bottom of the tooltip with link's
   text = "linkText".
*/
function tooltip( mouseEvent, tip, linkText )
{
    if ( !mouseEvent )
        mouseEvent = window.event;

    var tipElem = document.getElementById( tip );

    var tipContent = tipElem.innerHTML;

    var tipDiv = document.getElementById( "tipDiv" );
    var tipFrame = document.getElementById( "tipFrame" );

    // Remove old tooltip:
    if ( tipDiv )
        {
        document.body.removeChild( tipDiv );
        }
    if ( tipFrame )
        {
        document.body.removeChild( tipFrame );
        }

    tipDiv = document.createElement( "div" );

    scrollPos = getScrollPos();

    //    alert( "scroll position " + scrollPos.x + "/" + scrollPos.y );

    tipDiv.setAttribute( "id", "tipDiv" );
    tipDiv.className = "tooltip";

    tipDiv.style.display="block";
    tipDiv.style.padding="5px";
    tipDiv.style.visibility="visible";

    document.body.appendChild( tipDiv );

    tipDiv.innerHTML = tipContent;

    if ( undefined != linkText )
        {
        var targetLink = mouseEvent.target;
        if ( !targetLink )
            {
            targetLink = mouseEvent.srcElement;
            }

        while ( targetLink && ((targetLink.nodeName != "A") && (targetLink.nodeName != "a") ))
            {
            targetLink = targetLink.parentNode;
            }

        if( targetLink && (undefined != targetLink.href) )
            {
            tipDiv.innerHTML += "<div>"
                + "<a href=\""
                + targetLink.href
                + "\" >"
                + linkText
                + "</a></div>" ;
            }
        }

    tipDiv.style.top  = mouseEvent.clientY + 5 + scrollPos.y - tipDiv.offsetHeight + "px";
    tipDiv.style.left = mouseEvent.clientX - 5 + scrollPos.x + "px";

    // Exploder hack to hide selects behind the tooltip
    if ( navigator.appName.search(/Explorer/) != -1 )
        {
        tipFrame = document.createElement( "iframe" );

        tipFrame.setAttribute( "id", "tipFrame" );
        tipFrame.setAttribute( "src", "about:blank" );
        tipFrame.setAttribute( "scrolling", "no" );
        tipFrame.setAttribute( "frameborder", "0" );

        tipFrame.style.top    = tipDiv.style.top;
        tipFrame.style.left   = tipDiv.style.left;
        tipFrame.style.width  = tipDiv.offsetWidth;
        tipFrame.style.height = tipDiv.offsetHeight;


        tipFrame.style.position = "absolute";
        tipFrame.style.zIndex = 254;

        document.body.appendChild( tipFrame );
        }

    document.onmousemove = tooltipActiveMouseMove;
}
