
<!-- // Hide

// *** COMMON CROSS-BROWSER COMPATIBILITY CODE ***

var isDOM=document.getElementById?1:0;
var isIE=document.all?1:0;
var isNS4=(navigator.appName=='Netscape'&&!isDOM)?1:0;
var isWin=(navigator.platform.indexOf('Win')!=-1)?1:0;
var isDyn=(isDOM||isIE||isNS4);

function getRef(id, par)
{
 par = !par ? document : (par.navigator?par.document:par);
 return (isIE ? par.all[id] :
  (isDOM ? (par.getElementById?par:par.ownerDocument).getElementById(id) :
  par.layers[id]));
}

function getSty(id, par)
{
 return (isNS4 ? getRef(id, par) : getRef(id, par).style)
}

if (!window.LayerObj) var LayerObj = new Function('id', 'par',
 'this.ref=getRef(id, par); this.sty=getSty(id, par); return this');
function getLyr(id, par) { return new LayerObj(id, par) }

function LyrFn(fn, fc)
{
 LayerObj.prototype[fn] = new Function('var a=arguments,p=a[0]; with (this) { '+fc+' }');
}
LyrFn('x','if (!isNaN(a[0])) sty.left=p; else return parseInt(sty.left)');
LyrFn('y','if (!isNaN(a[0])) sty.top=p; else return parseInt(sty.top)');
LyrFn('vis','sty.visibility=p');
LyrFn('write','if (isNS4) with (ref.document) {write(p);close()} else ref.innerHTML=p');
LyrFn('alpha','var f=ref.filters; if (f) {' +
 'if (sty.filter.indexOf("alpha")==-1) sty.filter+="alpha()"; ' +
 'if (f.length&&f.alpha) f.alpha.opacity=p } else if (isDOM) sty.MozOpacity=(p/100)');


if (!window.page) var page = { win: window, minW: 0, minH: 0, MS: isIE&&!window.opera }

page.winW=function()
 { with (this) return Math.max(minW, MS?win.document.body.clientWidth:win.innerWidth) }
page.winH=function()
 { with (this) return Math.max(minH, MS?win.document.body.clientHeight:win.innerHeight) }

page.scrollX=function()
 { with (this) return MS?win.document.body.scrollLeft:win.pageXOffset }
page.scrollY=function()
 { with (this) return MS?win.document.body.scrollTop:win.pageYOffset }





// *** TIP FUNCTIONS AND OBJECT ***

function tipTrack(evt) { with (this)
{
 // Figure out where the mouse is and call the position function.
 // Also set sX and sY as the scroll position of the document.
 sX = page.scrollX();
 sY = page.scrollY();
 mX = (isIE ? event.clientX + sX : evt.pageX);
 mY = (isIE ? event.clientY + sY : evt.pageY);

 // If we've set tip tracking, call the position function.
 if (tipStick == 1) position();
}}

function tipPosition() { with (this)
{
 if (actTip)
 {
  // Pull the window sizes from the page object.
  // In NS4 we size down the window a little as it includes scrollbars.
  var wW = page.winW()-(isIE?0:15), wH = page.winH()-(isIE?0:15);

  // Pull the compulsory information out of the tip array.
  var t=tips[actTip], tipX=eval(t[0]), tipY=eval(t[1]), tipW=t[2], tipH=t[3], adjY = 1;

  // Add mouse position onto relatively positioned tips.
  if (typeof(t[0])=='number') tipX += mX;
  if (typeof(t[1])=='number') tipY += mY;

  // Check the tip is not within 5px of the screen boundaries.
  if (tipX + tipW + 5 > sX + wW) { tipX = sX + wW - tipW - 5; adjY = 2 }
  if (tipY + tipH + 5 > sY + wH) tipY = sY + wH - (adjY*tipH) - 5;
  if (tipX < sX+ 5) tipX = sX + 5;
  if (tipY < sY + 5) tipY = sY + 5;


  // If the tip is currently invisible, show at the calculated position.
  if (!showTip && (doFades ? !alpha : true))
  {
   xPos = tipX;
   yPos = tipY;
  }

  // Move the actual position towards the calculated by the stickiness factor.
  // Low stickinesses will result in slower catchup times.
  xPos += (tipX - xPos) * tipStick;
  yPos += (tipY - yPos) * tipStick;

  div.x(xPos);
  div.y(yPos);
 }
}}

function tipShow(tipN) { with (this)
{
 if (!isDyn) return;

 // My layer object we use.
 if (!div || !div.ref) div = getLyr(myName + 'Layer');
 if (!div.ref) return;

 // If we're mousing over a different or new tip...
 if (actTip != tipN)
 {
  // Remember this tip number as active, for the other functions.
  actTip = tipN;
  
    // Set tip's onmouseover and onmouseout handlers.
  if (isNS4) div.ref.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
  div.ref.onmouseover = new Function(myName + '.show("' + tipN + '")');
  div.ref.onmouseout = new Function(myName + '.hide()');

  // Stick it somewhere onscreen.
  position();

  // Go through and replace %0% with the array's 0 index, %1% with tips[tipN][1] etc...
  var str = template;
  for (var i=0; i<tips[tipN].length; i++) str = str.replace('%'+i+'%', tips[tipN][i]);
  // Write the proper content... the last <br> strangely helps IE5/Mac...?
  div.write(str + ((document.all && !isWin) ? '<small><br></small>' : ''));
 }

 // For non-integer stickiness values, we need to use setInterval to animate the tip,
 // if it's 0 or 1 we can just use onmousemove to position it.
 clearInterval(trackTimer);
 if (tipStick != parseInt(tipStick)) trackTimer = setInterval(myName+'.position()', 50);

 // Set the showTip flag, as a signal for the fade/position routines.
 showTip = true;

 // Finally either fade in immediately or after a very short delay.
 // The delay is for NS4 to allow it to execute a 'hide' event after this, from a
 // previous mouseout when two tip triggers overlap, because it's a weird browser.
 // So, this show call can cancel a (slightly later) hide. Look, it works, OK? ;).
 clearTimeout(fadeTimer);
 if (isNS4) setTimeout(myName + '.fade()', 1);
 else fade();
}}

function tipHide() { with (this)
{
 if (!isDyn) return;

 // Fade out in 100ms, a larger delay so another mouseover can cancel this fade.
 // This allows the user to mouseover a static tip before its hides.
 clearTimeout(fadeTimer);
 fadeTimer = setTimeout('with (' + myName + ') { showTip=false; fade() }', 200);
}}

function tipFade() { with (this)
{
 // Clear to stop existing fades.
 clearTimeout(fadeTimer);

 // Show it and optionally increment alpha from 0 to 100.
 if (showTip)
 {
  div.vis('visible');
  if (doFades)
  {
   alpha += fadeSpeed;
   if (alpha > 100) alpha = 100;
   div.alpha(alpha);
   // Call this function again shortly, fading tip in further.
   if (alpha < 100) fadeTimer = setTimeout(myName + '.fade()', 50);
   return;
  }
 }

 else
 {
  // Similar to before but counting down and hiding at the end.
  if (doFades && alpha > 0)
  {
   alpha -= fadeSpeed;
   if (alpha < 0) alpha = 0;
   div.alpha(alpha);
   fadeTimer = setTimeout(myName + '.fade()', 50);
   return;
  }
  div.vis('hidden');
  // Clear the active tip flag so it is repositioned next time.
  actTip = '';
  // Stop any sticky-tip tracking if it's invisible.
  clearInterval(trackTimer);
 }
}}

function TipObj(myName)
{
 // Holds the properties the functions above use.
 this.myName = myName;
 this.tips = new Array();
 this.template = '';
 this.actTip = '';
 this.showTip = false;
 this.tipStick = 1;
 this.xPos = this.yPos = this.sX = this.sY = this.mX = this.mY = 0;

 this.track = tipTrack;
 this.position = tipPosition;
 this.show = tipShow;
 this.hide = tipHide;
 this.fade = tipFade;
 
 this.div = null;
 this.trackTimer = 0;
 this.fadeTimer = 0;
 this.alpha = 0;
 this.doFades = true;
 this.fadeSpeed = 10;
}



// *** START EDITING HERE ***

// First, create a new tip object, and pass it its own name so it can reference itself.
var docTips = new TipObj('docTips');
with (docTips)
{
 // Next, set its properties.
 
 // Set some tips to subarrays, tips.name = new Array(X, Y, width, height, text...);
 // The only hard thing is position. If you pass a string, it is evaluated and set as
 // the absolute position of the tip on the page -- you might want to include formulae?
 // Plain numbers specified as positions are offset from the current mouse position.
 // If you're clever, use the page object included with this script in your positioning
 // formulae. Functions include page.winW() and .winH() for the window area dimensions,
 // and page.scrollX() and .scrollY() for the current scroll position.
 
// tips.sTip = new Array(5, 10, 200, 30, 'Something');

tips.LHelp = new Array(5, 10, 270, 50, 'Sign in with your username & password (<b>if you are an existing user</b>) or <b>click</b> on the appropriately indicated <font color="#0000FF"><b>blue</b></font> link. You can use "<b>Forgotten your password</b>" link if you have lost this information.');
tips.FINHelp = new Array(5, 10, 270, 50, 'Kirjaudu käyttäjätunnuksellasi ja salasanallasi (jos sinulla on jo tunnus) tai valitse sopivin kirjautumisvaihtoehto alta. Käytä "<b>Unohtuiko salasana</b>" -vaihtoehtoa, jos olet unohtanut tietosi.');
tips.LFHelp = new Array(5, 10, 270, 50, 'Signez dedans avec votre username et le mot de passe, si vous Ãªtes<br> un utilisateur existant ou choisissez appropriÃ©<br> Engagent le link(s) de dessous. Vous pouvez utiliser avez oubliÃ© le service<br> de mot de passe au cas oÃ¹ vous dÃ©truiriez cette information');
tips.LEHelp = new Array(5, 10, 270, 50, 'Firme adentro con su username y la palabra de paso, si usted es un utilizador existente <br> o elige apropiado firma para arriba conexiones de abajo. el <br> que usted puede utilizar se olvidÃ³ del recurso de la palabra de paso en caso de que usted haya perdido esta informaciÃ³n.');
tips.SocEve = new Array(5, 10, 270, 50, 'GoTo: Social Events');
tips.Search = new Array(5, 10, 270, 50, '<? myexp.Address>');
/*
tips.t3 = new Array(5, 10, 200, 30, 'Sales: Variance to Last Month (ID & OD)');
tips.t5 = new Array(5, 10, 200, 30, 'Activations: Target Achieved');
tips.t6 = new Array(5, 10, 200, 30, 'Bookings: Target Achieved');
tips.t7 = new Array(5, 10, 200, 30, 'Discount: % Discount given over Sales');
tips.t8 = new Array(5, 10, 200, 30, 'Sales Mix: % of 20, 45, 100 Unit Cards');
tips.t9 = new Array(5, 10, 200, 30, 'Receivables: Ratio of 0-120 Days (Card)');
tips.t10 = new Array(5, 10, 200, 30, 'Receivables: Ratio of 120 & Above Days (Card)');
tips.t11 = new Array(5, 10, 200, 30, 'Receivables: Ratio of Opening 2 Ending Balance (Card)');
tips.t12 = new Array(5, 10, 200, 30, 'Receivables: Ratio of Opening 2 Ending Balance (Frenchise)');
tips.t13 = new Array(5, 10, 200, 30, 'KPIs: Per PP Revenue Indoor');
tips.t14 = new Array(5, 10, 200, 30, 'KPIs: Per PP Revenue Outdoor');
tips.t15 = new Array(5, 10, 200, 30, 'KPIs: Payphone per Employee');
tips.t16 = new Array(5, 10, 200, 30, 'KPIs: Net Sales per Card');
tips.t17 = new Array(5, 10, 200, 30, 'KPIs: Sales Ratio to PTCL Bill');
tips.t18 = new Array(5, 10, 200, 30, 'KPIs: Commisioned Lines');
tips.t19 = new Array(5, 10, 200, 30, 'KPIs: NMS vs PTCL');
tips.t20 = new Array(5, 10, 200, 30, 'KPIs: NMS vs MIS');
tips.t21 = new Array(5, 10, 200, 30, 'Sales: Target Achieved Retail');
tips.t22 = new Array(5, 10, 200, 30, 'Sales: Variance to Last Month');
tips.t23 = new Array(5, 10, 200, 30, 'Sales: Target Achieved Corporate');
tips.t24 = new Array(5, 10, 200, 30, 'Sales: Target Achieved Hello Outlets');
tips.t25 = new Array(5, 10, 200, 30, 'Sales Mix: % of Rs. 150, 250, 500 Cards');
tips.t26 = new Array(5, 10, 200, 30, 'Hello CLIs: Increment in # of CLIs (%)');
tips.t27 = new Array(5, 10, 200, 30, 'Sales Breakup: % of Sales at or below 5% Discount');
tips.t28 = new Array(5, 10, 200, 30, 'Receivables: Ratio of 0-120 Days (Retail)');
tips.t29 = new Array(5, 10, 200, 30, 'Receivables: Ratio of 120 & Above Days (Retail)');
tips.t30 = new Array(5, 10, 200, 30, 'Receivables: Ratio of Opening 2 Ending Balance (Corporate)');
tips.t31 = new Array(5, 10, 200, 30, 'Receivables: Ratio of Opening 2 Ending Balance (Retail)');
tips.t32 = new Array(5, 10, 200, 30, 'Mutes: % of 3 Days Mutes');
tips.t33 = new Array(5, 10, 200, 30, 'Complaints via COO Office: % of Feedback Received');
tips.t34 = new Array(5, 10, 200, 30, 'In Time Reports: Operations');
tips.t35 = new Array(5, 10, 200, 30, 'In Time Reports: Technical');
tips.t36 = new Array(5, 10, 200, 30, 'In Time Reports: Software');
tips.t37 = new Array(5, 10, 200, 30, 'In Time Reports: IT Networks');
*/
 // Each tip object must have a string called 'template' that contains some specially-formatted
 // HTML to write to the document. This example is two nested tables, a border and a background.
 // The special bits are the %2%, %3% and so on halfway through. The script goes through and
 // substitutes these for the same index in the arrays above, where 0=X, 1=Y, 2=Width, 3=Height,
 // 4 onwards can be whatever you want (e.g. content). This example sets the width %2% and height
 // %3% of the table, and inserts some content %4%. You might want to use %5% onwards for tip
 // headers or footers or customisable colours... see the next tip object for another example.
 template = '<table bgcolor="#333333" cellpadding="1" cellspacing="0" width="%2%" border="0">' +
  '<tr><td><table bgcolor="#BEC8D1" cellpadding="2" cellspacing="2" width="100%" border="0">' +
  '<tr><td height="%3%" class="tipClass">%4%</td></tr></table></td></tr></table>';

 // False will hide tips instantaneously. Fading only works under IE/Win and NS6+.
 //doFades = false;

 // How fast the transparency changes, higher means faster fades.
 fadeSpeed = 30;

 // Tip stickiness, from 0 to 1, defines how readily the tip follows the cursor. 1 means it
 // follows it perfectly (the default), 0 is a static tip, and decimals are 'floating' tips.
 tipStick = 0.2;
}


// Capture the onmousemove event so tips can follow the mouse. Add in all your tip objects here
// and also any functions from other scripts that need this event (e.g. my DHTML Scroller) too.
if (isNS4) document.captureEvents(Event.MOUSEMOVE);
document.onmousemove = function(evt)
{
 docTips.track(evt);
// staticTip.track(evt);
// stickyTip.track(evt);
 if (isNS4) return document.routeEvent(evt);
}


// A small function that refreshes NS4 on horizontal resize.
var nsWinW = window.innerWidth, nsWinH = window.innerHeight;
function ns4BugCheck()
{
 if (isNS4 && (nsWinW!=innerWidth || nsWinH!=innerHeight)) location.reload()
}

window.onresize = function()
{
 ns4BugCheck();
}


// End Hide -->

