var FadeStep;
var FadeObj;
var FadeIE;
var FadeVal;
var FadeNumStep;
var FadeInc;

var BlendImg = "";
var BlendToImg;

//=================
// Fade transition.
//=================
function fadeTran(obj,ieFilter,beg,end,numStep) {
   if (obj) {
      FadeStep = 0;
      FadeObj = obj;
      FadeIE = ieFilter;
      FadeVal = beg;
      FadeNumStep = numStep;
      FadeInc = (end - beg) / (numStep - 1);
      obj.style.visibility = "visible";
      fade();
   }
}
function fade() {
   FadeStep += 1;
   if (FadeStep <= FadeNumStep) {
      if (FadeIE) {
         FadeObj.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=" + parseInt(FadeVal) + ")";
      } else {
         FadeObj.style.opacity = FadeVal / 100.1;
      }
      FadeVal += FadeInc;
      window.setTimeout("fade()", 50);

   } else {
      if (BlendImg != "") {
         BlendImg.src = BlendToImg.src;
         var temp = BlendImg.style.zIndex;
         BlendImg.style.zIndex = BlendToImg.style.zIndex;

         BlendToImg.style.zIndex = temp;
         BlendToImg.style.visibility = "hidden";
         BlendImg = "";
      }
   }
}
//==========================
// Generic blend transition.
//==========================
function blendTran(img,toImg) {
   if (img && toImg) {
      BlendImg = img;
      BlendToImg = toImg;
      fadeTran(toImg,false,33,100,3);
   }
}
//=====================
// Blend transition IE.
//=====================
function blendTranIE(img,toSrc,time) {
   if (img) {
      img.style.filter = "progid:DXImageTransform.Microsoft.Fade(duration=" + time + ")";
      img.style.visibility = "visible";
      img.filters[0].apply();
      img.src = toSrc;
      img.filters[0].play();
   }
}
//=================
// Compute bearing.
//=================
function getBearing(x1,y1,x2,y2) {
   var beg,end;
   var bear;
   var xD = x1 - x2;
   var yD = y1 - y2;
   
   if ((Math.abs(xD) < 1) && (Math.abs(yD) < 1)) {
      return "";
   }
   var rad = Math.atan2(yD,xD);
   var deg = rad * (180 / Math.PI) + 90;
   end = "E";

   if (deg > -90 && deg <= 90) {
      beg = "N";
      if (deg > 0) {
         end = "W";
      }
      bear= Math.abs(deg);

   } else {
      beg = "S";
      if (deg < 180) {
         end = "W";
      }
      bear = Math.abs(180 - deg);
   }
   bear = DDToDMS(bear,true,false);
   bear = beg + bear + end;    
   return bear;
}
//===========
// DD to DMS.
//===========
function DDToDMS(dd,addZero,addDecimal) {
   var d = parseInt(dd);
   var dF = Math.abs(dd - d);
   var m = parseInt(dF * 60);
   var s = dF * 3600 - m * 60;

   if (addDecimal) {
      var u = 10
      s = parseInt(s * u + (5/10)) / u;
   } else {
      s = Math.round(s);
   }
   if (addZero) {
      if (d < 10) {
         d = "0" + d;
      }
      if (m < 10) {
         m = "0" + m;
      }
      if (s < 10) {
         s = "0" + s;
      }
   }
   var dms = (d + '\xB0 ' + m + '\' ' + s + '\"');
   return dms;
}
//==============
// Compute area.
//==============
function computeArea(numPnt,x,y) {
   var area = 0;
   var i,j;
   var xjyi, xiyj;
   var xydiff;
   j = numPnt;

   for (i=1; i<=numPnt; i++) {
      xiyj = x[i] * y[j];
      xjyi = x[j] * y[i];
      xydiff = (xiyj - xjyi);
      area += xydiff;
      j = i;
   }
   area = Math.abs(area / 2);
   return area;  
}
//==========================
// Compute 2 point distance.
//==========================
function twoPntDistance(x1,y1,x2,y2) {
   var dist;
   var xD = Math.abs(x1 - x2);
   var yD = Math.abs(y1 - y2);
   dist = Math.sqrt(Math.pow(xD,2) + Math.pow(yD,2));
   return dist;  
}
//==============================
// Compute multi-point distance.
//==============================
function multiPntDistance(numPnt,x,y) {
   var dist = 0;
   var i;
   for (i=1; i<numPnt; i++) {
      dist += twoPntDistance(x[i], y[i], x[i+1], y[i+1]);
   }
   return dist;  
}
//======================
// Get query string arg.
//======================
function getQSArg(name) {
   var qsValue = "";
   var qs = document.location.search.substring(1).toUpperCase();
   var i;
   var nv;
   var pairs = qs.split("&");

   for (i=0; i<pairs.length; i++) {
      nv = pairs[i].split("=");
      if (nv[0] == name.toUpperCase()) {
         qsValue = nv[1];
      }
   }
   return qsValue;
}
//==============
// Set a cookie.
//==============
function setCookie(name, value, years) {
   var nextYear = new Date();
   nextYear.setFullYear(nextYear.getFullYear() + years);
   document.cookie = name + "=" + escape(value) + "; expires=" + nextYear.toGMTString();
}
//===============
// Delete cookie.
//===============
function deleteCookie(name) {
   document.cookie = name + "=" + escape("") + "; expires=" + now();
}
//==============
// Get a cookie.
//==============
function getCookie(name) {
   var value = "";
   var allCookies = document.cookie;
   var begPos = allCookies.indexOf(name);
   
   if (begPos != -1) {
      begPos += name.length + 1;
      var endPos = allCookies.indexOf(";", begPos);
      if (endPos == -1) {
         endPos = allCookies.length;
      }
      value = allCookies.substring(begPos, endPos);
      value = unescape(value);
   }
   return value;
}
//==============
// Current time.
//==============
function now() {
   return new Date().getTime();
}

