//---------------------------------------------------------------------------------------------------------------------------
//TIPSTER.JS
//---------------------------------------------------------------------------------------------------------------------------

//---------------------------------------------------------------------------------------------------------------------------
//Achmad Firwany's JavaScript Library for External Link (called from any HTML page)
//Copyright(C) 2000 - Achmad Firwany. All intellectual property rights world wide reserved.
//
//---------------------------------------------------------------------------------------------------------------------------

//TIPSTER
//Copyright(C) 2000 - 2008 - TESQscape - FINE - Achmad Firwany & Angus Turnbull.
//USAGE: 
//<div id="docTipLayer" style="position: absolute; z-index: 1000; visibility: hidden; left: 0px; top: 0px; width: 10px"></div>
//<div id="staticTipLayer" style="position: absolute; z-index: 1000; visibility: hidden; left: 0px; top: 0px; width: 10px"></div>
//<div id="nestTipLayer" style="position: absolute; z-index: 1000; visibility: hidden; left: 0px; top: 0px; width: 10px"></div>
//<div id="stickyTipLayer" style="position: absolute; z-index: 1000; visibility: hidden; left: 0px; top: 0px; width: 10px"></div>
//<tag onMouseOver="docTip.show('here')" onMouseOut="docTip.hide()">
//<!-- TIPSTER v3.0 - by Angus Turnbull - http://www.twinhelix.com - Visit for more scripts! -->
//<script language="javascript"><!--
// *** 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 isOp=window.opera?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) :
(isNS4 ? par.layers[id] : null));
}
//
function getSty(id, par)
{
var r=getRef(id, par);
return r?(isNS4?r:r.style):null;
}
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],px=isNS4||isOp?0:"px"; ' + 'with (this) { '+fc+' }');
}
LyrFn('x','if (!isNaN(p)) sty.left=p+px; else return parseInt(sty.left)');
LyrFn('y','if (!isNaN(p)) sty.top=p+px; else return parseInt(sty.top)');
LyrFn('w','if (p) (isNS4?sty.clip:sty).width=p+px; ' + 'else return (isNS4?ref.document.width:ref.offsetWidth)');
LyrFn('h','if (p) (isNS4?sty.clip:sty).height=p+px; ' + 'else return (isNS4?ref.document.height:ref.offsetHeight)');
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,d=(p==null); if (f) {' +
'if (!d&&sty.filter.indexOf("alpha")==-1) sty.filter+=" alpha(opacity="+p+")"; ' +
'else if (f.length&&f.alpha) with(f.alpha){if(d)enabled=false;else{opacity=p;enabled=true}} }' +
'else if (isDOM) sty.MozOpacity=d?"":p+"%"');
//
var CSSmode=document.compatMode;
CSSmode=(CSSmode&&CSSmode.indexOf('CSS')!=-1)||isDOM&&!isIE||isOp?1:0;
//
if (!window.page) var page = { win: window, minW: 0, minH: 0, MS: isIE&&!isOp, db: CSSmode?'documentElement':'body' }
//
page.winW=function() { with (this) return Math.max(minW, MS?win.document[db].clientWidth:win.innerWidth) }
page.winH=function() { with (this) return Math.max(minH, MS?win.document[db].clientHeight:win.innerHeight) }
page.scrollY=function() { with (this) return MS?win.document[db].scrollTop:win.pageYOffset }
page.scrollX=function() { with (this) return MS?win.document[db].scrollLeft:win.pageXOffset }
//
// *** TIP FUNCTIONS AND OBJECT ***
function tipTrack(evt, always)
{ with (this){
// Reference the correct event object.
evt=evt?evt:window.event;
// Figure out the mouse co-ordinates and call the position function.
// Also set sX and sY as the scroll position of the document.
sX = page.scrollX();
sY = page.scrollY();
mX = isNS4 ? evt.pageX : sX + evt.clientX;
mY = isNS4 ? evt.pageY : sY + evt.clientY;
// If we've set tip tracking, call the position function.
if (tipStick == 1) position();}}
//
function tipPosition(forcePos)
{ with (this){
// Can't position a tip if there isn't one available...
if (!actTip) return;
// Pull the window sizes from the page object.
// In NS 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=div.w(), tipH=div.h(), 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.
// Also do this if we're passed the 'forcePos' parameter.
if ((!showTip && (doFades ? !alpha : true)) || forcePos)
{
xPos = tipX;
yPos = tipY;
}
// Otherwise move the tip towards the calculated position 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;
// If this tip is nested, call the 'show' function of its parent too.
if (tips[tipN].parentObj) tips[tipN].parentObj.show(tips[tipN].parentTip);
// My layer object we use.
if (!div) div = getLyr(myName + 'Layer');
// IE4 requires a small width set otherwise tip divs expand to full body size.
if (isDOM) div.sty.width = 'auto';
// 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 for static tips.
if (tipStick == 0)
{
if (isNS4) div.ref.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
div.ref.onmouseover = new Function('evt', myName + '.show("' + tipN + '"); ' +
'if (isNS4) return this.routeEvent(evt)');
div.ref.onmouseout = new Function('evt', myName + '.hide(); ' +
'if (isNS4) return this.routeEvent(evt)');
}
// Place it somewhere onscreen - pass true to force a complete reposition.
position(true);
// 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);
// Finally either fade in immediately or after 'showDelay' milliseconds.
// NS4 must always delay by a small amount as sometimes hide events come before show events
// 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.
clearTimeout(fadeTimer);
if (showDelay || isNS4)
fadeTimer = setTimeout('with ('+myName+') { showTip = true; fade() }', showDelay + 10);
else { showTip = true; fade() }
}}
//
function tipHide() { with (this)
{
// We've got to be a DHTML-capable browser that has a tip currently active.
if (!isDyn || !actTip) return;
// If the mouse position is within the tip boundaries, we know NS4 is telling us stories
// as often it makes hide events unaccompanied by overs or in a weird order.
// Only applies to static tips that we want the user to mouseover...
if (isNS4 && tipStick==0 && xPos<=mX && mX<=xPos+div.w() && yPos<=mY && mY<=yPos+div.h())
return;
// If this tip is nested, call the 'hide' function of its parent too.
if (tips[actTip].parentObj) tips[actTip].parentObj.hide();
// Fade out after a 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() }', hideDelay);
}}
//
function tipFade() { with (this)
{
// Clear to stop existing fades.
clearTimeout(fadeTimer);
// Show it and optionally increment alpha from minAlpha to maxAlpha or back again.
if (showTip)
{
div.vis('visible');
if (doFades)
{
alpha += fadeSpeed;
if (alpha > maxAlpha) alpha = maxAlpha;
div.alpha(alpha);
// Call this function again shortly, fading tip in further.
if (alpha< maxAlpha) fadeTimer = setTimeout(myName + '.fade()', 50);
}
}
else
{
// Similar to before but counting down and hiding at the end.
if (doFades && alpha > minAlpha)
{
alpha -= fadeSpeed;
if (alpha< minAlpha) alpha = minAlpha;
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.showDelay = 50;
this.hideDelay = 250;
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 = this.fadeTimer = 0;
this.alpha = 0;
this.doFades = true;
this.minAlpha = 0;
this.maxAlpha = 100;
this.fadeSpeed = 10;
}
//
// *** START EDITING HERE ***
// This script is object orientated. That means we create 'tip objects', with a collection
// of settings, a template to display tips, and a list of tips to show in that template.
// Here are some examples:
// First, create a new tip object, and pass it its own name so it can reference itself.
var docTip = new TipObj('docTip');
with (docTip)
{
// Next, set its properties like the tips it will display.
// We organise tips in arrays like so: tips.name = new Array(X, Y, width, text, ....);
// The first two parameters, X and Y, are the distances of the tip from the mouse cursor position
// if they're set as numbers. If they're strings (with quotes ''), the script calculates them as
// formulae and ignores the mouse position. They are the only compulsory parameters.
// So that means you can use the page object included with this script for fancy positioning
// effects. Functions include page.winW() and page.winH() for the window area dimensions,
// and page.scrollX() and page.scrollY() for the current scroll position -- see the examples.
tips.subdomain = new Array(5, 15, 200, 'Get your<b>subdomain</b> and ...<br /><u>URL redirection</u> for FREE<br /><hr />... http://www.you.firwany.com');
tips.here = new Array(0, -35, 175, 'You are here');
tips.welcome = new Array(35, -35, 150, 'Welcome to Our Site ...');
tips.siteurl = new Array(5, 5, 175, 'Our other web site address');
tips.siteinfo = new Array(5, 5, 200, 'Our other web site description');
tips.home = new Array(25, -35, 150, 'Our HomePage ...');
tips.about = new Array(25, -35, 150, 'About Us ...');
tips.partners = new Array(25, -35, 150, 'Our Business Partners ...');
tips.portfolio = new Array(25, -35, 200, 'Our Products and Our Clients ...');
tips.contact = new Array(25, -35, 150, 'Contact Us ...');
tips.news = new Array(-50, -225, 150, 'Internet and Web News ...<br /><hr />Science<br />Technology<br />Computer<br />Control<br />Communication<br />Internet<br />World Wide Web<br />Design<br />Programming<br/>Development<br />Etc. . . .');
tips.webpage = new Array(25, -50, 250, 'Link to other web pages of this web site<br />using the same window or new windows');
tips.website = new Array(25, -50, 200, 'Link to other web sites ...<br />without leaving our web site');
tips.ratesite = new Array(5, 5, 150, 'Rate our site<br />in SearchIndonesia');

// This next tip uses a formula to position the tip 110 pixels from the right edge of the screen.
tips.curpage = new Array('page.scrollX() + page.winW() - 110', -20, 150, '< You are here<br /> [active web page ]');
tips.newpage = new Array('page.scrollX() + page.winW() - 110', -20, 150, '< Select a web page');
// Now, set the appearance and style of the tips displayed by this tip object.
// 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. These correspond to values we
// set in the tip.tipName arrays above -- %0% is the X value, %1% is Y, and %2% onwards are
// whatever other info we have in there (width, text etc...). This example sets the width %2%
// of the table, and inserts some content which is the text %3%.
// You might want to put extra information in the arrays above, and use %4%, %5% onwards in the
// template for tip headers, footers, customisable colours etc... see the next tip object for
// another example.
template = '<table bgcolor="#003366" cellpadding="1" cellspacing="0" width="%2%" border="0">' +
'<tr><td><table bgcolor="#6699CC" cellpadding="3" cellspacing="0" width="100%" border="0" style="font-family: arial,helvetica,tahoma,verdana; font-size: 12px">' +
'<tr><td class="tipClass">%3%</td></tr></table></td></tr></table>';
// Finally, you can set some optional properties to customise the behavious of this object.
// How much of a delay do you want between pointing and action? Defaults are:
//showDelay = 50;
//hideDelay = 200;
// False will hide tips instantaneously. Fading only works under IE/Win and NS6+.
//doFades = false;
// You can change the minimum and maximum opacity percentages, defaults:
//minAlpha = 0;
//maxAlpha = 100;
// How fast the transparency changes (between 1 and 100), higher means faster fades.
//fadeSpeed = 10;
// 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;
}
// Here's one illustrating a decimal tipStick value so it tags along behind the cursor.
var stickyTip = new TipObj('stickyTip');
with (stickyTip)
{
//
tips.bizname = new Array(-50, 25, 250, 'Our business trademark ...');
tips.bizline = new Array(-50, 25, 250, 'Our business lines...');
//
tips.link = new Array(0, 0, 250, 'We can put your hypertext here');
tips.adbanner_left = new Array(0, 0, 250, 'We can put your ad banner here');
tips.adbanner_right = new Array('page.scrollX() + page.winW() - 110', -20, 250, '< We can put your ad banner here');
tips.solution = new Array(20, -20, 200, 'your one-stop outsourcing<br />for cybernetic total solution<br />and turn-key IT project!');
tips.partners = new Array(20, -20, 150, 'our web business partners<br />worldwide ...');
tips.let = new Array(50, -50, 250, 'Let us create your web site<br />and promote it worldwide ...');
//
tips.ebook = new Array(20, -20, 250, 'you can download our e-books ...');
tips.email = new Array(20, -20, 250, 'create your profesional e-mail ...');
tips.emarketing = new Array(20, -20, 250, 'get the power of e-marketing ...');
tips.ebroadcasting = new Array(20, -20, 250, 'get the power of e-broadcasting ...');
tips.ebusiness = new Array(20, -20, 250, 'you can do e-business in the web ...');
tips.ecommerce = new Array(20, -20, 250, 'build your own e-commerce web site...');
tips.estore = new Array(20, -20, 250, 'visit our e-store ...');
//
template = '<table bgcolor="#CCCC00" cellpadding="1" cellspacing="0" width="%2%" border="0">' +
'<tr><td><table bgcolor="#FFFF00" cellpadding="4" cellspacing="0" width="100%" border="0" style="font-family: arial,helvetica,tahoma,verdana; font-size: 12px">' +
'<tr><td align="center" class="tipClass">%3%</td></tr></table></td></tr></table>';
tipStick = 0.2;
}
// Here's a second tip object. Feel free to delete it, but be sure to remove it from the
// onmousemove event section below and its DIV from the body of the page if you do!
// I've included a tip header here in this template, %3% is the header text and %4% is
// now the main text. As you can see you can basically format your tips any way you want.
// This tip also includes mouse event handlers to show a second-level tip, just like in
// the body of the page below, so you can nest tips within tips.
var staticTip = new TipObj('staticTip');
with (staticTip)
{
//
tips.webmaster = new Array(0, 20, 200, '<b>WebMaster Resources</b>',
'-<a href="javascript:alert(\'WebMaster Resources ...\')">WebMaster</a> -<br />' +
'-<a href="#" name="nest1trig" onmouseover="nestTip.show(\'nest1\')" onmouseout="nestTip.hide()">' +
'HTML Resources &gt;</a> -<br />' +
'-<a href="#" name="nest2trig" onmouseover="nestTip.show(\'nest2\')" onmouseout="nestTip.hide()">' +
'javascript Resources &gt;</a> -<br />');
tips.webdesign = new Array(75, -75, 200, '<b>Web Site Design by:</b>',
'<a href="javascript:alert(\'Web template Design by TESQscape\')">TESQcape</a><br />' +
'<a target="_blank" href="http://www.TESQscape.com/">TESQscape Design Studio</a><br />');
tips.javaprogram = new Array(0, 0, 200, '<b>Java Script Programs by:</b>',
'<a href="javascript:alert(\'Java Script Programs by TESQscape and FINE\')">TESQscape and FINE</a><br />' +
'<a target="_blank" href="http://willmaster.com/">William Bontrager</a><br />' +
'<a target="_blank" href="http://www.twinhelix.com/">Angus Turnbull</a><br />');
template = '<table bgcolor="#000000" cellpadding="0" cellspacing="0" width="%2%" border="0">' +
'<tr><td><table cellpadding="3" cellpadding="0" width="100%" border="0" style="font-family: arial,helvetica,tahoma,verdana; font-size: 12px">' +
'<tr><td bgcolor="#336699" align="center" height="18" class="tipClass">%3%</td></tr>' +
'<tr><td bgcolor="#0099CC" align="center" height="*" class="tipClass">%4%</td></tr>' +
'</table></td></tr></table>';
tipStick = 0;
}
// Here's another example tip object -- multilevel static tips within tips...
var nestTip = new TipObj('nestTip');
with (nestTip)
{
tips.nest1 = new Array(100, -20, 200,
'<a href="javascript:alert(\'HTML programming ...\')">for HTML Programmers</a>');
// If you're using nested tips, for each tip you have to tell the script its parent tip
// object and tip name within that object, so it knows to sync their showing and hiding.
tips.nest1.parentObj = staticTip;
tips.nest1.parentTip = 'webmaster';
// This tip is positioned via formulae based on its parent tip's position...
tips.nest2 = new Array('staticTip.xPos + 201', 'staticTip.yPos + 53', 200,
'<a href="javascript:alert(\'javascript Programming\')">for JavaScrpit Programmers</a>');
tips.nest2.parentObj = staticTip;
tips.nest2.parentTip = 'webmaster';
template = '<table bgcolor="#000000" cellpadding="1" cellspacing="0" width="%2%" border="0">' +
'<tr><td><table bgcolor="#00CCFF" cellpadding="3" cellspacing="0" width="100%" border="0" style="font-family: arial,helvetica,tahoma,verdana; font-size: 12px">' +
'<tr><td class="tipClass">%3%</td></tr></table></td></tr></table>';
tipStick = 0;
}
// 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)
{
// Add or remove all your tip objects from here!
docTip.track(evt);
stickyTip.track(evt);
staticTip.track(evt);
nestTip.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();
}
//--></script>
//
//-------------------------------------------------------------------------------------------------------------------------

//NOWAY
//Copyright(C) 2000 - Achmad Firwany.
//USAGE: <body onload="noway();">
//<script language="javascript"><!--
//var popup=" . . . Welcome to our site . . . \n\n (C) 2000-2005 - Achmad Firwany ";
//
function noway(go)
{
if (document.all)
{
if (event.button == 2)
{
alert(popup);
return false;
}
}
if (document.layers)
{
if (go.which == 3)
{
alert(popup);
return false;
}
}
}
if (document.layers)
{
document.captureEvents(Event.MOUSEDOWN);
}
document.onmousedown=noway;
// --></script>
//-------------------------------------------------------------------------------------------------------------------------
