Illustrations

August 24, 2009 Hari Krishnan Leave a comment

These were done for Nidecker snowboard design competition.

'Snow hound' and 'While you were sleeping'

Categories: Uncategorized

How thinking about distant things increase creativity!

Scientific American recently published an article titled “An Easy Way to Increase Creativity”. The author claims creativity is not entirely a personal trait and it can vary depending on the place and situation (I completely agree!), and that it can be stimulated; she then goes on about how dreaming distant and vague things can lead to a better creative mind.

Check it out here.

Categories: Uncategorized

Triumph Daytona Illustration.

June 6, 2009 Hari Krishnan 3 comments

I just now completed an illustration of Trumph Daytona 675, based on a few reference images. I worked very slowly on this one, as I get free time at office; totally it took me 5 days or so working at that pace.

This time no masks or lot of layers for each part; I did it more or less like a painting. The airbrush tool was used extensively. I stopped using a multitude of brushes, as far as I notice I tend to get confused with a lot of brushes in the palette. Instead I found it very comfortable to use the modifier hotkeys (like, s for size, o for opacity etc.) with an airbrush in Alias Studiotools.

I used the reference images to make a somewhat detailed sketch.

Sketch. (Cleck for larger image)

Sketch. (Click for larger image)

Then I decided to paint the panels and the rider first.

The completed illustration. (Click for a larger image.)

The completed illustration. (Click for a larger image.)

I liked how the head lamps and the front wheel and fork turned out to be. Not very happy about the mech-noodle between the rear wheel and the fairing though!

Regards,

Peugeot Jetforce Pencil Sketch and natural media rendering.

April 25, 2009 Hari Krishnan 1 comment

Regards,

Hari

A recent-Mac-convert-designer’s dilemma…

I’m posting after some time now; got busy with the professional work :) .

I decided to replace my 3yr old Dell Inspiron laptop which is nearing its term, with a good desktop. With the right screen hinge broken, panels cracked, and its battery expired; I have no choice but to do so (so much for the famed Dell build quality.. or probably it is just me.. and my carelessness!). I can’t take my laptop to office nor do I bring work home; so a good desktop will fare better for me. Then recently I read about Apple launching its revamped line of desktops. I thought I’ll go for a 24″ iMac.

I got one yesterday (and bootcamped XP into it.. duh!). But I prefer the look and feel of the OS X (and its fast too!) and hoped I would make it my primary OS from now on. But the biggest problem I am facing is the availability of softwares that I use, for the OS X platform. Thankfully the new AutoDesk SketchBook Pro 2009 is available for mac, which I’m evaluating now.

But what about the Adobe trio –Photoshop-Illustrator-InDesign, that I use professionally and personally on PC. It will cost me almost US $1997.00 for CS4 versions of these individually or US $1399.00 if I go for Adobe Creative Suite 4 Design Standard. My company provides me with all the tools that I need for professional work but for my personal work this is a huge sum, I just cannot spend this much. I don’t have an opinion that these softwares are not worth this much, they are; but I can’t afford them right now.

I have tried various open source graphics related softwares like BlenderGimp, Sodipodi, InkScape etc. and I have heard and read a lot about Scribus. I have no doubt that they are all very capable softwares, but what worries me most is that, I am very accustomed to Adobe softwares and over the years I have developed such a flow of executing common tasks and using features in these softwares, I don’t have to worry anymore how to combine or use the features to create the final design. All my work will be on actual design itself, rather than figuring out how to do that in computer. The question is about the work flow which I am comfortable with, or whether I have to adopt a new one if I change to another software.

I have decided to try out the recent versions of Gimp, InkScape and Scribus on my iMac. I’ll try out the following (the recent versions as of today):

When I said try out, I didn’t mean a comprehensive comparison with the Adobe products. Its just that I want to see how much comfortable I will be with these softwares as compared to their pricier alternatives. I will design with them or replicate the designs I’ve done using Adobe products, and share in detail, how they fare. At least that is what I am planning now. I will start off with Scribus to do page layouts or design presentations, print some of them and see how it holds up against the might of InDesign.

Until then..

Yours truly,

Rendering a scooter (MBK Skyline)

February 17, 2009 Hari Krishnan 2 comments

MBK Skyline – with slight modifications..

The rendering was completed without the use of any curves and masks. I just painted on top of a basecolour layer and manually erased out the unwated parts according to the sketch. The handlebar part, wheels and the engine are from an actual photograph.

I rendered the panels next.

Seats and the black plastic parts are actually easier than it looks.

That is the end of the rendering part,  I extracted the wheels, engine etc. from actual photographs.

Regards.

Honda CBR1000RR Fireblade front view rendering with Alias StudioTools 2009

January 21, 2009 Hari Krishnan Leave a comment

I have posted about this one last week. The front view rendering of a sportsbike (Honda 2009 CBR1000RR FireBlade). For this I will illustrate here how I rendered it from a sketch (made from a reference photograph) to the final rendering. The rendering style indicated here is much simpler than the one I tried earlier (find it here).  Here Masks are made for just the boundaries (I believe it is a good idea, since it will keep the edges sharp and clean; moreover we can use the curves later for snapping the brushes along it to give details on the edges).

Here is a snapshot of what I promise by this post.

Alright, here we go..

The first step was to prepare the sketch.

The superbike sketch

The superbike sketch

Clearly I just drew only one half of the sketch. Try experimenting with the canvas brush symmetry feature in Studiotools. It is a very handy tool with bilateral and radial options.

From here onwards I would turn canvas symmetry off while rendering for better performance, and later duplicate all layers and mirror it.

Now lets trace the sketch with some curves and make masks out of it. Then the masks are filled with the base colour (I am using the same colour palette that I made for the last tutorial)

All the painted parts are filled in. The next step would be to give it some form; I roughly stroked in the shades with a solid brush and erased out the unwanted areas. The technique is simple; I assumed a light source straight up above the bike, and every part of the surface which is pointing anywhere upwards (and the light path is unobstructed) is in saturated colour and the ones pointing sideways or downwards have a shade of the red. This bike will have a glossy finish, to simulate that I gave very defined borders between the two shades.

Now that was simple. Next I have to paint in the highlights and for that I made a copy of a brush and the following changes. Here is how I did it.

An oval brush which will follow the stroke direction produces richer more defined strokes than a normal airbrush does. I am going to lay down some strokes with a very light yellow-orange colour first and then mark out the hotspots with white.

The fender is not modified yet, the shape is comparatively complicated. I would rather do the fender with the highlights layer on top of the dark layer. You will see why I did this in a moment.

Lets zoom out a bit. This is how it looks so far.

Now its time to render the intakes; intakes are of black matte plastic. I created two curves here –one that which marks the border and another one for the scoop.  Then I rendered the black part and the intake in different layers, and deleted some part of the intake layer with a soft eraser to make the intake merge with the outer plastic part.

Click the above image to see the intake part in detail (I’ll post a pic with the sketch layer turned off, so you can see better).

The tyre is simple as you can see; I am not going to draw tyre threads (if you want to draw tyre threads, do it after the mirroring the tyre layer; we are going to mirror the entire image later in this case and tyre threads are seldom symmetrical). Just remember to give a shadow below the fender (light comes from up above, right?).

Here is the closeup of the Head lamps (I know it looks nothing like the real one, but since it looks cool anyways, it’s alright). The main reflector part was painted using our aforementioned custom brush. A soft white line indicates the top edge of the glass cover. Now for the gritty curves around the reflector, it can be achieved by changing our brush’s parameters slightly. Create one more copy of the airbrush like we discussed above and double click to bring forward the brush setting window. Adjust the min opacity and max opacity parameters to make the brush more solid — i.e. keep their values as closer but not exactly the same. Go to the Stroke tab and change spacing noise to 1.0. Use this brush to draw some equally spaced arcs around the reflector. Use a soft eraser to finetune.

I created a layer and filled the radiator part with black colour — no details here. The front shocks are easier than it looks. Select the first custom brush that we created and stroke it with mid-grey, then on top of it almost at the middle stroke with bright white to give that highlight. Attenuate the strokes when they almost reach the air intake part.

It would help if you constrain the brush in a straight line. Press the spacebar and you will be presented with a marking menu. At the bottom right corner you can see 3 stroke mode icons. Select the straight line constraint from it. You can go back to free stroke mode by selecting the scribble icon.

The visor has been drawn in. As you can see, I drew part of the tank first and then rendered the visor on top of it on another layer. Then after adjusting the opacity I drew in some highlights on another layer on top (Other wise the layer opacity will affect the highlights also).

Now we are almost ready to mirror the layers. I would recommend you render the handle bar and the rear view before mirroring, however I did it afterwards. Create a backup if you want all layers. Hide all layers which don’t  have anything to do with the bike, like the background, palette layers, sketch layer etc. Hide the visor highlight layer also. Now from the Canvas Layer Editor select Layer>Merge visible.

Duplicate this layer and select Edit>Horizontal Flip. Align the mirrored layer properly and merge the two parts together.

At this point I rendered in the handle bars, rear view mirrors and the shadow of the bike.

Wow and  we are done!

Now you are on your own, paint in some nice backgrounds..

or

Thank you very much for your time!

Rendering Study — Materials

January 14, 2009 Hari Krishnan 2 comments

I did some rendering study on different materials in AliasStudio. This time I rendered different metallic car paints (glossy and plastic will follow), matte metal or aluminium finish and Leather (cream coloured).

Materail study - Red and Olive car paints, Aluminium and Leather (Click to enlarge)

Material study - Red and Olive car paints, Aluminium and Leather (Click to enlarge)

All the materials except for leather is pretty straight forward to render. I used masks to define the boundary and the edges with high contrast; and used airbrush (almost exclusively, other than to fill with a solid colour) to paint.

Leather was rendered first by selecting an appropriate leather texture (which I downloaded freely from Internet), and warping it to form a spherical deformation. Then used dodge and burn tools to shade.

I will explain the process to render textured forms/surfaces, later in detail.

AliasStudio 2D primer.

January 13, 2009 Hari Krishnan Leave a comment

Even though I was very reluctant to move from Photoshop to AliasStudio (any other software for that matter) for 2D sketching and rendering, I had to give it a try, following my colleagues. It is the de-facto design tool at the company, along with the fact that I am under training, compelled me to try the new software out. And now..?! Now I think it is the best software for industrial design (especially the automotive subset of it), that I have used til now.

  1. When coupled with a Cintiq, it is a productivity power house. It just feels like a paper and pencil with undo feature! You twist your canvas (using the Cintiq’s shortcut buttons for good) and just put down your concepts. Sketching or painting on it just feels very natural.
  2. A good collection of tools are available with it; but just the necessary ones. And all tools are tweakable to any extend. Ability to create your own brush and arrange it in a custom palette is really handy.
  3. The marking menu! It is just fast.
  4. Class leading 3D capabilities. Convert your concept sketch in to 3D model from the same software; or component concepts can be rendered on top of 3D models.

There are many differences with Photoshop and I don’t have an opinion that, in general it is better than photoshop; its just that it is better for the job. (CS4 has canvas rotation and Alias style shortcut keys for modifying brush params, but I haven’t tried it yet).

As an exercise, I am planning to render different primitive forms using same material and using different materials. It is an exercise to better myself at design communication. To start with I will render primitive shapes (will keep the lighting condition relatively similar), such as spheres, cubes and cylinders etc. A list of materials, in which I think having a good hand is really helpful, is prepared; and I collected necessary textures for some of them (from free texture sites across the net).

  1. Paint metallic
  2. Plastic Gloss / Paint Gloss
  3. Plastic matte
  4. Metal Chrome
  5. Metal Satin finish/matte
  6. Leather
  7. Rubber

I will post samples as I progress.

Honda Fireblade front view rendering.

January 12, 2009 Hari Krishnan Leave a comment

I completed a front view rendering of Honda CBR Fireblade. (Update: See the tutorial here) In this rendering I adopted a more ’sketchy’ approach rather than trying to make it more realistic. I think it looks better and (i think) took almost 5 hours on a Wacom Cintiq.

Superbike front view rendering with AliasStudio (Click for bigger image).

Superbike front view rendering with AliasStudio (Click for bigger image).

I’ll soon write on how I did this one. May be after explaining the tools that I use, in a bit more detail.

// ==UserScript==
// @name MultiPopup Main Functions File
// @namespace http://www.hesido.com
// @version 2.09
// @date 2005-08-18
// @author Emrah BASKAYA <emrahbaskaya at hesido dot com>
// @description Tooltip Replacement: Replaces Browser Default Tooltips with CSS stylable ones and allows you to customize the information displayed in it and the delay for tooltips.
// @include *
// ==/UserScript==
// Licence Information:
/*
MultiPopup V2.09 Main Functions File
Tooltip Replacement Script
Emrah BASKAYA (hesido – www.hesido.com)
Detailed info can be found at:
http://www.hesido.com

You cannot use this code for commercial purposes without
permission of the author. You are not allowed to earn money
from this script or any work that is derived from this script.

Free to use for non-commercial purposes. A link to www.hesido.com
is most welcome, in a page on your site, if you are using it for your
website.

For other usage options, please contact the author.

Uses some DOM fallback methods as seen on www.quirksmode.org
Code for embedding CSS by D.I.Z.
*/

if (window.addEventListener) window.addEventListener(‘load’, multipopupMain, false);
else if (window.attachEvent) window.attachEvent(‘onload’, multipopupMain);

function multipopupMain(){
if (!document.createElement || !document.getElementsByTagName || !document.getElementById || document.getElementsByTagName(“head”).length == 0) return;

var allowRemotePrefs = true; //Needs to be true to be able to run modules, external preferences and skin
//making this false will almost make Multipopup impenetratable.

// Total Suppression
if (allowRemotePrefs && typeof(mpUSRJS) != “undefined” && mpUSRJS.doNotRun) return;
// Self Supression
if (window.MPwinTriggersActive) return;
// Prerunmodules execution
if (allowRemotePrefs && typeof(mpUSRJS) != “undefined” && typeof(mpUSRJS.preRunModules) != “undefined”) for (var i=0; i<mpUSRJS.preRunModules.length; i++) mpUSRJS.preRunModules[i]();

// pcR->array related to tooltip
// gVr->array that holds generic info
// aOb->array that holds animation info.
var pcR = new Array(), gVr = new Array(), aOb = new Array(), mPu = new Array();

setMPPreferences();

mPu.divIds = ['mpopupc','mpoptop','mpopfill1','mpopbod','mpopfill2','mpopfill3','mpopfill4','mpopbot','mpopfill5','mpopdbl','mpopdblprnt','bmtest'];
mPu.styleObId = “mpopupstyleobjectid”
mPu.revEvals = new Array(null,’”rect(“+(clipYTarget-aOb.clipY)+”px, “+(clipXTarget+aOb.clipX)+”px, “+(clipYTarget+aOb.clipY)+”px, “+(clipYTarget-aOb.clipY)+”px)”‘,’”rect(0px, “+(aOb.clipX*2)+”px, “+(clipYTarget*2)+”px, 0px)”‘,’”rect(0px, “+(aOb.clipX*2)+”px, “+(aOb.clipY*2)+”px, 0px)”‘);
mPu.defDesc = “”,pcR.hvrdObj = null,aOb.objMovd = null,aOb.clipStep = 0,aOb.warpStep = 0;
aOb.popActv = false,aOb.objMovd = false,gVr.activeDelay = mPu.popupDelay;
pcR.actOffsetX = mPu.xOfst, pcR.actOffsetY = mPu.yOfst;
aOb.revInt = new Array(),aOb.prevs = new Array();

// Auto Primary Suppress
gVr.suppress = (typeof(mpUSRJS) != “undefined” && mpUSRJS.suppress && mPu.allowSuppress) ? true : false;

// deb = document.getElementById(‘debug’);
// debb = 0;

mPu.setPopups = function() {
if (mPu.revStyle == 0 || mPu.clipSteps == 0) {gVr.desInstRev = true; mPu.clipSteps = 0}
else {gVr.desInstRev = false;}

gVr.instRev = gVr.desInstRev;

var attList = new Array(), attid = new Array(), patternFound;
if (mPu.useFirefoxForceWrap) eval(‘var forcewrapreg = /([^\\s\\&\\/\\-]{‘+mPu.forceBreakAt+’})/g’);
else eval(‘var forcewrapreg = /([^\\s\\/\\-]{‘+mPu.forceBreakAt+’})/g’);
// eval(‘var forcewrapreg = /([^\\s\\&\\/-]{‘+mPu.forceBreakAt+’})/g’); //Opera
var forcewrapreplace = ‘$1′+mPu.brokenSign;
var zerowidthspacereg = /([\&\/-])/g
var zerowidthreplacer = ‘​$1′
for (var i=0; i<mPu.attDesc.length;i++){
if (mPu.attDUse[i]==true) {attList[attList.length]=mPu.attDesc[i]; attid[attid.length] = i}
}

for (var st=0;st<mPu.tTags.length;st++) {
var targetNodes = document.getElementsByTagName(mPu.tTags[st]);
for (var i=0;i<targetNodes.length;i++) {
var toinsert =”, toaltinsrt = ”, loi, inserter = new Array(), instId = new Array(), iclass = new Array(); altinsertr = new Array(), ainsId = new Array(), iaclass = new Array();
for (var mt=0; mt<attList.length;mt++){
loi = targetNodes[i].getAttribute(attList[mt]);
if ((loi == ” || loi == null) && mPu.attDInhrt[attid[mt]] && targetNodes[i].parentNode && targetNodes[i].parentNode.getAttribute) loi = targetNodes[i].parentNode.getAttribute(attList[mt]);
if (loi == null) loi = ”;
if (loi != ”) {
patternFound = mPu.alertPattern[attid[mt]]!=” && loi.match(mPu.alertPattern[attid[mt]]) != null;
if (mPu.forceWordWrap[attid[mt]]) loi = loi.replace(zerowidthspacereg,zerowidthreplacer).replace(forcewrapreg,forcewrapreplace);
// if (mPu.forceWordWrap[attid[mt]]) loi = loi.replace(forcewrapreg,forcewrapreplace); //Opera
if (mPu.attDPri[attid[mt]] || (patternFound && mPu.alertToPri)) { inserter[inserter.length] = loi; instId[instId.length] = attid[mt]; iclass[iclass.length] = (patternFound) ? mPu.alrtClass : mPu.stnClass;}
if (mPu.attDSec[attid[mt]]) {altinsertr[altinsertr.length] = loi; ainsId[ainsId.length] = attid[mt]; iaclass[iaclass.length] = (patternFound) ? mPu.alrtClass : mPu.stnClass;}
if (mPu.setAttNull[attid[mt]]) targetNodes[i].removeAttribute(attList[mt]);
if (patternFound && mPu.alertToPri && mPu.alertInstant) targetNodes[i].instAlert = true;
}
}
if (inserter.length == 1 && mPu.attDNAWA[instId[0]]) toinsert = ‘<div class=”‘+iclass[0]+’ ‘+mPu.spcClass[instId[0]]+’”>’+inserter[0]+’</div>’;
else for (var kt=0; kt<inserter.length; kt++)
{toinsert += ‘<div class=”‘+iclass[kt]+’ ‘+mPu.spcClass[instId[kt]]+’”><span class=”‘+iclass[kt]+’ ‘+mPu.spcClass[instId[kt]]+’”>’+mPu.attDTitle[instId[kt]]+’</span>’+inserter[kt]+’</div>’;}
if (altinsertr.length == 1 && mPu.attDNAWA[ainsId[0]]) toaltinsrt = ‘<div class=”‘+ iaclass[0]+’ ‘+mPu.spcClass[ainsId[0]]+’”>’+altinsertr[0]+’</div>’;
else for (var kt=0; kt<altinsertr.length; kt++)
{toaltinsrt += ‘<div class=”‘+iaclass[kt]+’ ‘+mPu.spcClass[ainsId[kt]]+’”><span class=”‘+iaclass[kt]+’ ‘+mPu.spcClass[ainsId[kt]]+’”>’+mPu.attDTitle[ainsId[kt]]+’</span>’+altinsertr[kt]+’</div>’;}
if (toinsert !=”" || toaltinsrt !=”") {
if (toinsert !=”") {targetNodes[i].primaryView = toinsert; targetNodes[i].primDpresent = true;}
if (toaltinsrt !=”") {targetNodes[i].secondaryView = toaltinsrt; targetNodes[i].altDpresent = true;}
if (!targetNodes[i].triggersActive) {
if (!addCheckTrigger(targetNodes[i],’mouseover’,writeDescription)) targetNodes[i].onmouseover = writeDescription;
if (!addCheckTrigger(targetNodes[i],’mouseout’,clearDescription)) targetNodes[i].onmouseout = clearDescription;
targetNodes[i].triggersActive = true;
}
}
}
}
}

// Embed Internal Style
if (mPu.useDefStyle) {
if (document.getElementById(mPu.styleObId) != null) document.getElementById(mPu.styleObId).parentNode.removeChild(document.getElementById(mPu.styleObId));
var head = document.getElementsByTagName(“head”)[0];
var CSSstyleObj = document.createElement(“style”);
CSSstyleObj.setAttribute(“type”, ‘text/css’);
CSSstyleObj.id = mPu.styleObId;
CSSstyleObj.innerHTML = mPu.defCSS;
head.appendChild(CSSstyleObj);
}

addTrigger(window,’resize’, sizeUpdate);
addTrigger(window,’keydown’, mpopupKeyReceive);
addTrigger(window,’keyup’, mpopupKeyUpreceive);

window.MPwinTriggersActive = true;

mPu.addPopupDiv = addPopupDiv;
addPopupDiv();
sizeUpdate();
mPu.setPopups();

// Postrun modules execution
if (typeof(mPu.postRunModules) != “undefined”) for (var i=0; i<mPu.postRunModules.length; i++) mPu.postRunModules[i]();

function fixPopupPos() {
pcR.scrolledX = (window.pageXOffset) ? window.pageXOffset : (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : 0;
pcR.scrolledY = (window.pageYOffset) ? window.pageYOffset : (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : 0;
if (!doFixPopupPos()) doFixPopupPos();
}

function doFixPopupPos() {
var yiPos = pcR.ygPos + pcR.actOffsetY; var xiPos = pcR.xgPos + pcR.actOffsetX;
pcR.divHeight = aOb.dHght + pcR.TDdifX; pcR.divWidth = aOb.dWdth + pcR.TDdifX;
var sxEdge = (pcR.actOffsetX>0) ? pcR.width – mPu.edgeBufferZone : xiPos;
var syEdge = (pcR.actOffsetY>0) ? pcR.height – mPu.edgeBufferZone : yiPos;
yiPos = Math.max(Math.min(yiPos, syEdge – pcR.divHeight),0);
xiPos = Math.max(Math.min(xiPos, sxEdge – pcR.divWidth),0);
aOb.yPos = yiPos; aOb.xPos = xiPos;
if (pointColDetect(pcR.xgPos,pcR.ygPos,yiPos,xiPos+pcR.divWidth,yiPos+pcR.divHeight,xiPos,3)) {
pcR.actOffsetX = -pcR.actOffsetX; pcR.actOffsetY = -pcR.actOffsetY;
return false;
} else {
pcR.tDiv.style.top = (aOb.yPos + pcR.scrolledY – gVr.bRCompY) + “px”;
pcR.tDiv.style.left = (aOb.xPos + pcR.scrolledX – gVr.bRCompX) + “px”;
} return true; //Modify Ian
}

function pointColDetect(x,y,top,right,bottom,left,boundary) {
top -= boundary; bottom += boundary; left -= boundary; right += boundary;
if ((x>left&&x<right)&&(y>top&&y<bottom)) return true;
return false;
}

function clrIntrvls() {
for (i=0;i<aOb.revInt.length;i++){window.clearInterval(aOb.revInt[i]);}
aOb.revInt = new Array();
}

function easeInOut(minValue,maxValue,totalSteps,actualStep,powr) {
var delta = maxValue – minValue;
var stepp = minValue+(Math.pow(((1 / totalSteps)*actualStep),powr)*delta);
return Math.ceil(stepp)
}

function mpopupKeyReceive(e) {
if (!e) e = window.event; //Modify Ian
if (pcR.hvrdObj != null && e.ctrlKey && pcR.hvrdObj.altDpresent) {
var hovered = pcR.hvrdObj; doClearDescription(); doWriteDescription(hovered,e.ctrlKey,e.altKey);
}
if (pcR.hvrdObj != null && e.shiftKey) doClearDescription();
}

function mpopupKeyUpreceive(e) {
if (!e) e = window.event; //Modify Ian
if (pcR.hvrdObj != null) {
var hovered = pcR.hvrdObj; doClearDescription(); doWriteDescription(hovered,e.ctrlKey,e.altKey,true);
}
}

function doWriteDescription(elem,ctrlK,altK,nosuppress) {
var tagDescriptPri = ”, tagDescriptAlt = ”

if (elem.primDpresent) tagDescriptPri = elem.primaryView;
if (elem.altDpresent) tagDescriptAlt = elem.secondaryView;

if (altK || elem.instAlert) {gVr.activeDelay = 0;gVr.activeRevStyle = ‘mPu.instRev()’;gVr.instRev = true;}
if (ctrlK) {var tagDescription = tagDescriptAlt; gVr.activeDelay = 0;}
else {var tagDescription = tagDescriptPri;}
if (!gVr.moveTrigger) {addTrigger(document,’mousemove’, movePopup); gVr.moveTrigger = true;}

pcR.hvrdObj = elem;
pcR.reqDesc = (tagDescription != “” && tagDescription != null);

var wpt = mPu.warpSteps > 0;
pcR.bDiv.style.display = ‘none’; pcR.bDiv.style.display = ‘block’;
pcR.hvrdCh = true; pcR.hvrdFirst = true;

if (pcR.reqDesc) {
pcR.cDiv.innerHTML = tagDescription;
pcR.mDiv.innerHTML = tagDescription;
}

aOb.tWidth = pcR.mDiv.offsetWidth;
aOb.tHeight = pcR.mDiv.offsetHeight;

if (!wpt && pcR.reqDesc) {
mPu.setDdivTargetSize(); fixPopupPos();
}

if (aOb.popActv != true) {
if (wpt) pcR.cDiv.style.left = pcR.padComp+’px’;
aOb.revealTimer = window.setTimeout(
function() {
if (pcR.hvrdObj != null) {
if (pcR.hvrdFirst == true && mPu.warpSteps > 0) {
aOb.tPrevHeight = aOb.tHeight; aOb.tPrevWidth = aOb.tWidth;
mPu.setDdivTargetSize(); fixPopupPos();
}
aOb.revealTimer = 0;
if (gVr.suppress && !ctrlK && !altK && !nosuppress) return;
if (gVr.instRev) aOb.revInt[aOb.revInt.length] = window.setInterval(
function() { //Instant Reveal Function
if (aOb.objMovd == true) {
pcR.cDiv.style.width = aOb.tWidth + ‘px’;
pcR.cDiv.style.height = aOb.tHeight + ‘px’;
fixPopupPos();
if (pcR.reqDesc) pcR.tDiv.style.visibility = ‘visible’;
aOb.popActv = true; aOb.clipAnimDone = true; clrIntrvls();
}
},mPu.revInt);
else aOb.revInt[aOb.revInt.length] = window.setInterval(
function() { //Clip Reveal Function
if (aOb.objMovd == true && aOb.clipStep<mPu.clipSteps) {
pcR.divHeight = pcR.tDiv.offsetHeight; pcR.divWidth = pcR.tDiv.offsetWidth;
aOb.clipStep++;
if (aOb.clipStep<mPu.clipSteps) {
var clipYTarget = Math.ceil(pcR.divHeight / 2); var clipXTarget = Math.ceil(pcR.divWidth / 2);
aOb.clipX = easeInOut(0,clipXTarget,mPu.clipSteps,aOb.clipStep,0.333);
aOb.clipY = easeInOut(0,clipYTarget,mPu.clipSteps,aOb.clipStep,0.333);
pcR.tDiv.style.clip = eval(mPu.revEvals[mPu.revStyle]);
}
else pcR.tDiv.style.clip = “rect(auto auto auto auto)”;
if (pcR.reqDesc) pcR.tDiv.style.visibility = ‘visible’;
aOb.popActv = true;
if (pcR.hvrdCh) {
mPu.setDdivTargetSize(); fixPopupPos();
pcR.hvrdCh = false;
}
} else if (aOb.objMovd == true) {aOb.clipAnimDone = true; gVr.instRev = true; clrIntrvls();}
},mPu.revInt)
}
},gVr.activeDelay);
} else if (aOb.clipAnimDone) {
pcR.tDiv.style.clip = “rect(auto auto auto auto)”;
if (pcR.reqDesc) pcR.tDiv.style.visibility = ‘visible’;
else {pcR.tDiv.style.visibility = ‘hidden’; aOb.popActv = false;}
pcR.hvrdFirst = false;
clrIntrvls();

if (wpt) aOb.revInt[aOb.revInt.length] = window.setInterval(
function() { //Warp Animation Function
if (pcR.hvrdCh) {
pcR.cDiv.style.width = aOb.tWidth + ‘px’;
pcR.cDiv.style.height = aOb.tHeight + ‘px’;
pcR.hvrdCh = false;
}
if (aOb.warpStep < mPu.warpSteps) {
aOb.warpStep++;
aOb.heightSet = easeInOut(aOb.tPrevHeight,aOb.tHeight,mPu.warpSteps,aOb.warpStep,0.333)
aOb.widthSet = easeInOut(aOb.tPrevWidth,aOb.tWidth,mPu.warpSteps,aOb.warpStep,0.333)

mPu.setDdivWarpSize();

pcR.cDiv.style.left = aOb.widthSet-aOb.tWidth+pcR.padComp+”px”;
fixPopupPos();
} else clrIntrvls();
},mPu.revInt);
}

window.clearTimeout(aOb.resetDelayTimer); window.clearTimeout(aOb.hidePopupTimer);

}

function doClearDescription() {
window.clearTimeout(aOb.revealTimer);
aOb.hidePopupTimer = window.setTimeout(
function() { //Hide Popup Function
clrIntrvls();
aOb.warpStep = 0;
pcR.tDiv.style.visibility = ‘hidden’;
aOb.objMovd = false; aOb.popActv = false;aOb.clipStep = 0;
removeTrigger(document,’mousemove’, movePopup);
pcR.tDiv.style.top = “0px”;
pcR.tDiv.style.left = “0px”;
pcR.tDiv.style.clip = “rect(auto auto auto auto)”;
aOb.clipAnimDone = false;
gVr.moveTrigger = false;
pcR.actOffsetX = mPu.xOfst, pcR.actOffsetY = mPu.yOfst;
},mPu.hideDelay);
if (aOb.revealTimer == 0) gVr.activeDelay = 0;
pcR.hvrdObj = null;
aOb.resetDelayTimer = window.setTimeout(
function (){ //Reset Delay To Original Values
gVr.activeDelay = mPu.popupDelay;
gVr.instRev = gVr.desInstRev;
},mPu.instPopDur);
aOb.tPrevHeight = aOb.tHeight;
aOb.tPrevWidth = aOb.tWidth;
aOb.prevs[aOb.prevs.length] = aOb.tHeight
if (aOb.warpStep != mPu.warpSteps && aOb.warpStep > 0) {
aOb.tPrevHeight = aOb.heightSet; aOb.tPrevWidth = aOb.widthSet;
}
aOb.warpStep = 0;
}

function movePopup(e) {
if (pcR.hvrdObj != null || aOb.popActv == true) {
if (!e) {e = window.event;} //Modify Ian
pcR.ygPos = e.clientY; pcR.xgPos = e.clientX;
fixPopupPos();
aOb.objMovd = true;
}
}

function sizeUpdate() {
if (self.innerWidth) {
pcR.width = self.innerWidth; pcR.height = self.innerHeight;}
else if (document.documentElement && document.documentElement.clientWidth) {
pcR.width = document.documentElement.clientWidth; pcR.height = document.documentElement.clientHeight;}
else if (document.body) {
pcR.width = document.body.clientWidth; pcR.height = document.body.clientHeight;}
gVr.bRCompX = 0; gVr.bRCompY = 0;
if (document.body.activeStyle(‘position’,'position’) == ‘relative’) {gVr.bRCompX = document.body.offsetLeft; gVr.bRCompY = document.body.offsetTop}
}

function getElementsByClass(targetTag,tagClass) {
var elementList = document.getElementsByTagName(targetTag); var classTag = new Array();
for (var i=0;i<elementList.length;i++) {
if (elementList[i].className == tagClass) classTag[classTag.length] = elementList[i];
}
return classTag;
}

function addPopupDiv() {
tDv = new Array()
var prefix = “”;
var divlen = mPu.divIds.length;
document.body.activeStyle = getActiveStyle;
if (mPu.useDefStyle==true) prefix = “”;
for (var i=0;i<mPu.divIds.length;i++) {
if (document.getElementById(mPu.divIds[i]) != null) document.getElementById(mPu.divIds[i]).parentNode.removeChild(document.getElementById(mPu.divIds[i]));
tDv[i]=document.createElement(‘div’);
if (mPu.divIds[i] != ”) tDv[i].id = prefix + mPu.divIds[i];
tDv[i].activeStyle = getActiveStyle;
}

tDv[0].style.position = ‘absolute’; tDv[10].style.position = ‘absolute’;
tDv[9].style.position = ‘relative’; tDv[0].style.visibility = ‘hidden’;
tDv[10].style.visibility = ‘hidden’; tDv[5].style.overflow = “hidden”;
tDv[6].style.overflow = “hidden”; tDv[10].style.overflow = “hidden”;
tDv[5].style.position = ‘relative’; tDv[6].style.position = ‘absolute’;
tDv[0].style.zIndex = mPu.ttipZIndex;
tDv[1].appendChild(tDv[2]); tDv[3].appendChild(tDv[4]); tDv[4].appendChild(tDv[5]);
tDv[5].appendChild(tDv[6]); tDv[7].appendChild(tDv[8]); tDv[0].appendChild(tDv[1]);
tDv[0].appendChild(tDv[3]); tDv[0].appendChild(tDv[7]); tDv[10].appendChild(tDv[9]);
/* test the box model for compliance */
pcR.bxMcompX = 0; pcR.bxMcompY = 0;
document.body.appendChild(tDv[divlen-1])
tDv[divlen-1].style.padding = “2px”; tDv[divlen-1].style.height = “50px”;
if (tDv[divlen-1].offsetHeight == 50) {
// mPu.warpSteps = 0;
pcR.bxMcompX = parseInt(tDv[5].activeStyle(‘padding-right’,'paddingRight’))+parseInt(tDv[5].activeStyle(‘padding-left’,'paddingLeft’));
pcR.bxMcompY = parseInt(tDv[5].activeStyle(‘padding-top’,'paddingTop’))+parseInt(tDv[5].activeStyle(‘padding-bottom’,'paddingBottom’));
}

document.body.removeChild(tDv[divlen-1]);
document.body.appendChild(tDv[10])
document.body.appendChild(tDv[0]);

for (var i=0;i<divlen-1;i++) {
var bgIm = tDv[i].activeStyle(“background-image”,”backgroundImage”);
if (bgIm.indexOf(“url”) > -1 && mPu.preload == true) preLoadImage(stripURL(bgIm))
}
pcR.cDiv = tDv[6]; pcR.tDiv = tDv[0]; pcR.dDiv = tDv[5];
pcR.mDiv = tDv[9]; pcR.bDiv = tDv[10];

pcR.padComp = parseInt(tDv[5].activeStyle(‘padding-left’,'paddingLeft’));
tDv[6].style.left = pcR.padComp + ‘px’;

// detect firefox bug and set functions accordingly
tDv[5].style.width = “50px”;
tDv[5].style.height = “50px”;
mPu.setDdivWarpSize = (tDv[5].offsetWidth > tDv[1].offsetWidth && tDv[1].activeStyle(‘display’,'display’) != ‘none’ && tDv[7].activeStyle(‘display’,'display’) != ‘none’) ?
function() {
aOb.dHght = aOb.heightSet + pcR.bxMcompY;
aOb.dWdth = aOb.widthSet + pcR.bxMcompX;
pcR.dDiv.style.height = aOb.dHght + “px”;
pcR.dDiv.style.width = aOb.dWdth + “px”;
tDv[1].style.display = ‘none’;tDv[1].style.display = ‘block’;
tDv[7].style.display = ‘none’;tDv[7].style.display = ‘block’;
} :
function() {
aOb.dHght = aOb.heightSet + pcR.bxMcompY;
aOb.dWdth = aOb.widthSet + pcR.bxMcompX;
pcR.dDiv.style.height = aOb.dHght + “px”;
pcR.dDiv.style.width = aOb.dWdth + “px”;
}

mPu.setDdivTargetSize = (tDv[5].offsetWidth > tDv[1].offsetWidth) ?
function() {
pcR.cDiv.style.height = aOb.tHeight + ‘px’;
pcR.cDiv.style.width = aOb.tWidth + ‘px’;
aOb.dHght = aOb.tHeight + pcR.bxMcompY;
aOb.dWdth = aOb.tWidth + pcR.bxMcompX;
pcR.dDiv.style.height = aOb.dHght + “px”;
pcR.dDiv.style.width = aOb.dWdth + “px”;
tDv[1].style.display = ‘none’;tDv[1].style.display = ‘block’;
tDv[7].style.display = ‘none’;tDv[7].style.display = ‘block’;
} :
function() {
pcR.cDiv.style.height = aOb.tHeight + ‘px’;
pcR.cDiv.style.width = aOb.tWidth + ‘px’;
aOb.dHght = aOb.tHeight + pcR.bxMcompY;
aOb.dWdth = aOb.tWidth + pcR.bxMcompX;
pcR.dDiv.style.height = aOb.dHght + “px”;
pcR.dDiv.style.width = aOb.dWdth + “px”;
}

pcR.TDdifX = tDv[0].offsetWidth – tDv[5].offsetWidth;
pcR.TDdifY = tDv[0].offsetHeight – tDv[5].offsetHeight;

}

function getActiveStyle(style,stylecc) {
if (window.getComputedStyle) return window.getComputedStyle(this,null).getPropertyValue(style)
if (this.currentStyle) return eval(“this.currentStyle.”+stylecc)
}

function preLoadImage(imageurl) {var img = new Image();img.src = imageurl;return img;}

function stripURL(s) {
// I’ll later replace this with proper regex.
s = s.substring(s.indexOf(“url(“)+4,s.lastIndexOf(“)”));if (s.indexOf(‘”‘)>-1) s = s.substring(s.indexOf(‘”‘)+1,s.lastIndexOf(‘”‘));return s;
}

function writeDescription(e) {
if (!e) {e = window.event;} //Modify Ian
if (this != e.target) return;
if (!e.shiftKey) doWriteDescription(this,e.ctrlKey,e.altKey,false)
}

function clearDescription(e) {
if (!e) {e = window.event;} //Modify Ian
if (this != e.target) return;
doClearDescription();
}

function addTrigger(elm,eventname,func) {
if (!addCheckTrigger(elm,eventname,func) && elm.attachEvent) elm.attachEvent(‘on’+eventname, func);
}
function addCheckTrigger(elm,eventname,func) {
if (elm.addEventListener) {elm.addEventListener(eventname, func, false); return true;} else return false;
}
function removeTrigger(elm,eventname,func) {
if (!removeCheckTrigger(elm,eventname,func) && elm.detachEvent) elm.detachEvent(‘on’+eventname, func);
}
function removeCheckTrigger(elm,eventname,func) {
if (elm.removeEventListener) {elm.removeEventListener(eventname, func, false); return true;} else return false;
}

//Embedded preferences
function setMPPreferences() {
if (typeof(mpUSRJS) != “undefined” && allowRemotePrefs) mPu = mpUSRJS;
if (typeof(mPu.prefsVersion) == “undefined”) {mPu.noExtPrefs=true;}
mPu.useDefStyle = true;
mPu.popupDelay = 650;
mPu.hideDelay = 85;
mPu.instPopDur = 370;
mPu.attDesc = ['htitle','alt','href','src'];
mPu.attDUse = [true,true,true,true];
mPu.attDPri = [true,false,false,false];
mPu.attDSec = [false,true,true,true];
mPu.setAttNull = [false,false,false,false];
mPu.attDInhrt = [true,false,true,false];
mPu.forceWordWrap = [false, false, true, true];
mPu.stnClass = ‘mpop_cl’;
mPu.alrtClass = ‘mpop_al’;
mPu.spcClass = ['mpop_title','mpop_alt','mpop_href','mpop_src'];
mPu.attDTitle = ['Title:','Alt:','Address:','Source:']
mPu.alertPattern = ['','',/^(\s*javascript\:)/i,'']
mPu.alertToPri = false;
mPu.alertInstant = false;
mPu.attDNAWA = [true,true,false,false];
mPu.xOfst = 15;
mPu.yOfst = 15;
mPu.clipSteps = 3;
mPu.revStyle = 0;
mPu.revInt = 10;
mPu.warpSteps = 10;
mPu.preload = true;
mPu.edgeBufferZone = 32;
mPu.tTags = ["*"];
mPu.ttipZIndex = “9999″;
mPu.autoSelfFocus = true;
mPu.forceBreakAt = 29; //minimum number of chars needed to force a break, is applied to attributes with ‘forcewordwrap’ on.
mPu.brokenSign = ‘<span class=”mpopbrspan”>&raquo;</span><br />’
//new with 2001
mPu.allowSuppress = true;
//version
mPu.embeddedPrefsVersion = 2004;

mPu.defCSS = ‘/* embedded css version 2.02 Skin Name: Minimal Transparent */’
+’#mpopupc, #mpopdblprnt, #mpopupdbl {‘
+’ color: black !important; width: auto !important; height: auto !important;’
+’ padding: 0 !important; margin: 0 !important; position: absolute; top: 0; left: 0;’
+’ background: #EEE none !important; text-align: left !important}’
+’#mpopdblprnt {padding:1px !important; max-width:80% !important;}’
+’#mpopdbl {position: relative;}’
+’#mpopupc, #mpopdbl, #mpopdbl div, #mpopupc div, #mpopbod div, #mpopbod>div>div>div {‘
+’ font: 12px “Trebuchet MS”, Trebuchet, Verdana, Sans-Serif !important;’
+’ border-width: 0 !important; margin: 0; padding: 0; }’
+’#mpopupc {‘
+’background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAABCCAYAAADjVADoAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABuSURBVHja7NAxDQAwCAAwwL%2FGedhPAj5IK6E5%2FV8QpUCECBEiRIgQIUKECBEiRIgQIUKECBEiRIgQIUKECBEiRIgQIUKECBEiECFChAgRIkSIECFChAgRIkSIECFChAgRIkSIECFChIgLVgABBgDHFAROmd3kzgAAAABJRU5ErkJggg%3D%3D) !important;’
+’border: 2px solid #222 !important; opacity: 0.9; padding: 0.2em 0.3em !important;}’
+’#mpoptop {display:none}’
+’#mpopbot {display:none}’
+’#mpopbod {‘
+’ padding:0 !important; margin: 0 !important; border-width: 0 !important;}’
+’#mpopbod>div {‘
+’ padding:0 !important; margin: 0 !important; border-width: 0 !important;}’
+’#mpopbod>div>div {‘
+’ position:relative;’
+’ padding:1px !important; margin: 0 !important; border-width: 0 !important;}’
+’#mpopbod>div>div>div { margin:0 !important; word-wrap: break-word;}’
+’#mpopdbl { max-width: 320px !important; margin: 0 !important; padding: 0 1px !important; word-wrap: break-word;}’
+’#bmtest { top: 0; left: 0; position: absolute; border-width: 0 !important; margin: 0 !important; }’
+’span.mpop_cl, span.mpop_al {‘
+’ font-weight: bold; background-color: #1F2C2F; color: #EAE9DA; font-style: italic;’
+’ font-variant: small-caps; font-size: 90%; padding: 0 0.6em 0 0.3em; margin-right: 0.3em;}’
+’span.mpop_al {background-color: red}’
+’span.mpopbrspan {color: red;}’

;

//not for modification.
mPu.minimumReqPrefsV = 2002;

if (allowRemotePrefs && mPu.setMPPrefsExternal && mPu.minimumReqPrefsV <= mPu.prefsVersion) mPu.setMPPrefsExternal();
else if (!mPu.noExtPrefs) {
if (window.opera&&opera.postError) opera.postError (“Multipopup Error:\nMinimum required prefs version is:”+mPu.minimumReqPrefsV+”\nExternal prefs version installed:”+mPu.prefsVersion+’\n Using internal preferences instead.\nIf you delete the external prefs or update it to the latest, this warning will not be displayed.’);
}

if (allowRemotePrefs && mPu.setRemotePrefs) mPu.setRemotePrefs();

if (typeof(mPu.appendToExistingCSS) != ‘undefined’) {
if (mPu.appendToExistingCSS) mPu.defCSS += mPu.setMPSkinExternal();
else mPu.defCSS = mPu.setMPSkinExternal();
}

}

}