//Z.DHTML
//Z WORLD
//CONTACT www.zexe.net
//VARIABLES DE COMPORTAMENT:
//sempre entre limits 1 i 50 aprox..
var camina=10 //defecte 10
var neteja=7 //defecte 5
var vola=10 //defecte 10
var nervis=10 //defecte 10
/////REMOTE
remoteDir="http://www.zexe.net/Z/";
var z;
var zimages;
function fly(lay){
this.lay=new DynLayer(lay);
this.update=flyUpdate;
this.zstatus="quiet";
this.fly=flyFly;
this.walk=flyWalk;
this.ztarget=0;
this.walkim=true;
this.ang=0;
}
function flyUpdate(){
//en qualsevol cas si s'apropa volar a un altre lloc
dd=mouseP.distance(new point(this.lay.x,this.lay.y));
//status=this.zstatus;
if(dd<50 && (this.zstatus=="quiet" || this.zstatus=="walk") ){
//nomes el 50% dels temps..
if(Math.random()<0.5) return;
//empaitada...
this.fly();
return;
}
switch (this.zstatus){
case "quiet":
if(Math.random()*100<(camina/10.0)){
//alert("walk");
this.walk();
break;
}
if(Math.random()*100<(neteja/20.0)){
this.zstatus="clean";
break;
}
setImage(0,getDir(this.ang));
if(Math.random()*1000<(vola/2+nervis/5.0)){
this.fly();
break;
}
break;
case "clean":
if(this.walkim==true){
setImage(3,getDir(this.ang));
}else{
setImage(4,getDir(this.ang));
}
this.walkim=!this.walkim;
if(Math.random()*100<2){
this.zstatus="quiet";
}
break;
case "fly":
//moure cap a ztarget.. rapid
cp=new point(this.lay.x,this.lay.y);
ang=this.ztarget.angle(cp);
dd=this.ztarget.distance(cp);
//this.ang=ang;
pnext=cp.polar(ang+(dd/1000),100);
this.lay.moveTo(pnext.x,pnext.y);
if(cp.distance(this.ztarget)<100){
this.zstatus="quiet";
this.lay.moveTo(this.ztarget.x,this.ztarget.y);
}
break;
case "walk":
cp=new point(this.lay.x,this.lay.y);
ang=this.ztarget.angle(cp);
if(this.walkim==true){
setImage(1,getDir(this.ang));
}else{
setImage(2,getDir(this.ang));
}
this.walkim=!this.walkim;
pnext=cp.polar(ang,10);
this.lay.moveTo(pnext.x,pnext.y);
if(cp.distance(this.ztarget)<12){
if(Math.random()*100<(nervis)){
this.walk();
}else{
this.zstatus="quiet";
}
}
break;
}
}
function flyFly(){
//look for a new point in the screen...
this.ztarget=new point( Math.round(Math.random()*windowW),Math.round(Math.random()*windowH) );
ang=(new point(this.lay.x,this.lay.y)).angle(this.ztarget);
this.ang=ang;
setImage(0,getDir(ang));
this.zstatus="fly";
}
function setImage(n,ang){
if(ang==1) ang=2;
if(ang==5) ang=4;
if(ang==7) ang=8;
if(ang==11) ang=10;
//nomes si realment la ha carregat
if(zimages[n][ang].complete)
GetImageFromLayer("z","zimg").src=zimages[n][ang].src;
}
function isOut(p){
if (p.x<0 || p.x>windowW) return true;
if (p.y<0 || p.y>windowH) return true;
return false;
}
function flyWalk(){
out=true;
while(out){
this.ztarget=new point(this.lay.x+Math.random()*100-50,this.lay.y+Math.random()*100-50 );
out=isOut(this.ztarget);
}
ang=(new point(this.lay.x,this.lay.y)).angle(this.ztarget);
this.ang=ang;
setImage(1,getDir(ang));
this.zstatus="walk";
}
function incAngle(ang,inc){
res=ang+inc;
if( res>Math.PI*2) res=res-Math.PI*2;
if( res<0 ) res=res+Math.PI*2;
return res;
}
function update(){
z.update();
setTimeout("update()",40);
}
var windowH,windowW;
function WindowDims(){
if (!document.all) {
windowW=window.innerWidth;
windowH=window.innerHeight;
}else{
windowW=document.body.clientWidth;
windowH=document.body.clientHeight;
}
}
function DynMouseMove(x,y){
mouseP.x=x;
mouseP.y=y;
if(z){
ang=(new point(z.lay.x,z.lay.y)).angle(mouseP);
//status=getDir(ang);
}
}
function GetImageFromLayer(idLayer,nameImage){
if(is.ns5){
return document.getElementById(nameImage);
}
if (!document.all) {
return document.layers[idLayer].document.images[nameImage]
}else{
return document.all[idLayer].document.images[nameImage]
}
}
/////////class point
function point(x,y){
this.x=x;
this.y=y;
//methods
this.distance=pointDistance;
this.polar=pointPolar;
this.angle=pointAngle;
this.toString=pointToString;
this.rounds=pointRound;
}
function pointToString(){
return (this.x+":"+this.y);
}
function pointDistance(p2){
return Math.sqrt( (this.x-p2.x)*(this.x-p2.x)+(this.y-p2.y)*(this.y-p2.y) );
}
//gets a new point from the current given a degree and module..
function pointPolar(angle,mod){
return( new point( this.x+Math.sin(angle)*mod, (this.y+Math.cos(angle)*mod)) );
}
function pointAngle(p2){
xx=this.x-p2.x;
yy=-this.y+p2.y;
if(xx==0 && yy>0) return 0;
if(xx==0 && yy<0) return Math.PI;
res=-Math.atan(-yy/xx)+Math.PI/2;
if(xx<0 ) return (res+Math.PI);
return res;
}
function getDir(ang){
res=Math.round( ((ang*12)/(Math.PI*2))-0.5 );
res=res-12;
if ( res==-12 ) res=0;
return(Math.abs(res) );
}
function getDir2(ang){
res=Math.round( ((ang*12)/(Math.PI*2))-0.5 );
res=res-12;
if ( res==-12 ) res=0;
res=res+6;
if (res>12) res=res-12;
return(Math.abs(res) );
}
function pointRound(){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
return new point(this.x,this.y);
}
var mouseP;
function init(){
zimages=new Array(5);
//carregar totes les imatges..
//això pot portar un cert temps...
//son 60 imatges en total!
for(i=0;i<5;i++){
zimages[i]=new Array(12);
for(j=0;j<12;j++){
if(j!= 1 && j!= 5 && j!=7 && j!= 11 ){
zimages[i][j]=new Image();
ii=i+1;
zimages[i][j].src=remoteDir+"images/M"+ii+"_"+j+".gif";
}
}
}
initMouseEvents();
WindowDims();
z=new fly("z");
//z.lay.moveTo(100,100);
//z.lay.moveTo(Math.round(windowW/2)-20,Math.round(windowH/2)-40);
z.lay.moveTo(Math.round( Math.random()*(windowW-40) )+20,Math.round( Math.random()*(windowH-40) )+20);
mouseP=new point(0,0);
setTimeout("update()",40);
}
function openzexe(){
var w=open('http://www.zexe.net');
}
///Dynlayer functions
function DynLayer(id,nestref,frame) {
if (!is.ns5 && !DynLayer.set && !frame) DynLayerInit()
this.frame = frame || self
if (is.ns) {
if (is.ns4) {
if (!frame) {
if (!nestref) var nestref = DynLayer.nestRefArray[id]
if (!DynLayerTest(id,nestref)) return
this.css = (nestref)? eval("document."+nestref+".document."+id) : document.layers[id]
}
else this.css = (nestref)? eval("frame.document."+nestref+".document."+id) : frame.document.layers[id]
this.elm = this.event = this.css
this.doc = this.css.document
}
else if (is.ns5) {
this.elm = document.getElementById(id)
this.css = this.elm.style
this.doc = document
}
this.x = this.css.left
this.y = this.css.top
this.w = this.css.clip.width
this.h = this.css.clip.height
}
else if (is.ie) {
this.elm = this.event = this.frame.document.all[id]
this.css = this.frame.document.all[id].style
this.doc = document
this.x = this.elm.offsetLeft
this.y = this.elm.offsetTop
this.w = (is.ie4)? this.css.pixelWidth : this.elm.offsetWidth
this.h = (is.ie4)? this.css.pixelHeight : this.elm.offsetHeight
}
this.id = id
this.nestref = nestref
this.obj = id + "DynLayer"
eval(this.obj + "=this")
}
function DynLayerMoveTo(x,y) {
if (x!=null) {
this.x = x
if (is.ns) this.css.left = this.x
else this.css.pixelLeft = this.x
}
if (y!=null) {
this.y = y
if (is.ns) this.css.top = this.y
else this.css.pixelTop = this.y
}
}
function DynLayerMoveBy(x,y) {
this.moveTo(this.x+x,this.y+y)
}
function DynLayerShow() {
this.css.visibility = (is.ns4)? "show" : "visible"
}
function DynLayerHide() {
this.css.visibility = (is.ns4)? "hide" : "hidden"
}
DynLayer.prototype.moveTo = DynLayerMoveTo
DynLayer.prototype.moveBy = DynLayerMoveBy
DynLayer.prototype.show = DynLayerShow
DynLayer.prototype.hide = DynLayerHide
DynLayerTest = new Function('return true')
// DynLayerInit Function
function DynLayerInit(nestref) {
if (!DynLayer.set) DynLayer.set = true
if (is.ns) {
if (nestref) ref = eval('document.'+nestref+'.document')
else {nestref = ''; ref = document;}
for (var i=0; i 0) {
eval(divname.substr(0,index)+' = new DynLayer("'+divname+'","'+nestref+'")')
}
if (ref.layers[i].document.layers.length > 0) {
DynLayer.refArray[DynLayer.refArray.length] = (nestref=='')? ref.layers[i].name : nestref+'.document.'+ref.layers[i].name
}
}
if (DynLayer.refArray.i < DynLayer.refArray.length) {
DynLayerInit(DynLayer.refArray[DynLayer.refArray.i++])
}
}
else if (is.ie) {
for (var i=0; i 0) {
eval(divname.substr(0,index)+' = new DynLayer("'+divname+'")')
}
}
}
return true
}
DynLayer.nestRefArray = new Array()
DynLayer.refArray = new Array()
DynLayer.refArray.i = 0
DynLayer.set = false;
/////////////////
function initMouseEvents() {
document.onmousedown = mouseDown
document.onmousemove = mouseMove
document.onmouseup = mouseUp
if (is.ns) document.captureEvents(Event.MOUSEDOWN | Event.MOUSEMOVE | Event.MOUSEUP)
}
function mouseDown(e) {
if ((is.ns && e.which!=1) || (is.ie && event.button!=1)) return true
var x = (is.ns)? e.pageX : event.x+document.body.scrollLeft
var y = (is.ns)? e.pageY : event.y+document.body.scrollTop
if (is.ns && e.target!=document) routeEvent(e)
if (Scroll && ScrollTestActive()) return false
else if (Drag && drag.mouseDown(x,y)) return false
else return DynMouseDown(x,y)
}
function mouseMove(e) {
var x = (is.ns)? e.pageX : event.x+document.body.scrollLeft
var y = (is.ns)? e.pageY : event.y+document.body.scrollTop
if (is.ns && e.target!=document) routeEvent(e)
if (Scroll && ScrollTestActive()) return false
else if (Drag && drag.mouseMove(x,y)) return false
else return DynMouseMove(x,y)
}
function mouseUp(e) {
var x = (is.ns)? e.pageX : event.x+document.body.scrollLeft
var y = (is.ns)? e.pageY : event.y+document.body.scrollTop
if (is.ns && e.target!=document) routeEvent(e)
if (Drag && drag.mouseUp(x,y)) return false
else return DynMouseUp(x,y)
}
// overwrite these functions in your html source to do other mouse handling
function DynMouseDown(x,y) {return true}
//function DynMouseMove(x,y) {return true}
function DynMouseUp(x,y) {return true}
// include drag.js and/or scroll2.js after this file to overwrite these variables
Drag = null
Scroll = null
// BrowserCheck Object
function BrowserCheck() {
var b = navigator.appName
if (b=="Netscape") this.b = "ns"
else if (b=="Microsoft Internet Explorer") this.b = "ie"
else this.b = b
this.version = navigator.appVersion
this.v = parseInt(this.version)
this.ns = (this.b=="ns" && this.v>=4)
this.ns4 = (this.b=="ns" && this.v==4)
this.ns5 = (this.b=="ns" && this.v==5)
this.ie = (this.b=="ie" && this.v>=4)
this.ie4 = (this.version.indexOf('MSIE 4')>0)
this.ie5 = (this.version.indexOf('MSIE 5')>0)
this.min = (this.ns||this.ie)
}
is = new BrowserCheck()
function clicamosca(){
//alert("Bien!");
}