/* GLOBAL variables */

var currentMenu;
var currentSubMenu;

var menuArray = new Array();
var menuServicesArray = new Array();

var w3cDOM = (document.defaultView && document.defaultView.getComputedStyle) ? true : false;

var curOpacity;
var fadeObj;
var fadeObjInterval;
var fadeImgObj;
var fadeImgObjInterval;
var fadeSplashTime = 35;
var fadeIdxTime = 1;
var fadeTextTime = 1;

var splashIdx;

/* do we need a full url */
var addURL = "";

/* Initiliaze Event Handlers OnLoad */
addOnLoadEvent(initMyLib);
document.oncontextmenu = blockEvents;


/* Main Event Handler Setup */
function initMyLib () {
  var href = location.href;
  var vps = /http\:\/\/vps\.visarc/g;
  var r1 = href.match(vps);
  var news = /http\:\/\/news\.visarc/g;
  var r2 = href.match(news);
  if (r1 || r2) {
    addURL = "http://www.visarc.com";
  } else {
    var pageName = location.pathname;
    switch(pageName) {
    case "/" :
    case "/index.html" :
      makeSplash();
      break;
    case "/services/" :
    case "/services/index.html" :
      currentMenu = "services";
      currentSubMenu = "overview";
      getMenu('subMenu');
      makeMenu(menuServicesArray);
      makeIndex('contentOverviewIdx');
      break;
    case "/services/presentation/" :
    case "/services/presentation/index.html" :
      currentMenu = "services";
      currentSubMenu = "presentation";
      getMenu('subMenu');
      makeMenu(menuServicesArray);
      makeGallery('contentPresentationIdx');
      break;
    case "/services/design/" :
    case "/services/design/index.html" :
      currentMenu = "services";
      currentSubMenu = "design";
      getMenu('subMenu');
      makeMenu(menuServicesArray);
      makeGallery('contentDesignIdx');
      break;
    case "/services/performance/" :
    case "/services/performance/index.html" :
      currentMenu = "services";
      currentSubMenu = "performance";
      getMenu('subMenu');
      makeMenu(menuServicesArray);
      makeGallery('contentPerformanceIdx');
      break;
    case "/portfolio/" :
    case "/portfolio/index.html" :
      currentMenu = "portfolio";
      makePortfolio('contentPortfolioIdx8by8');
      break;
    case "/about/":
    case "/about/index.html":
      currentMenu = "about";
      break;
    default:
      currentMenu = "portfolio";
      makeImage('contentPortfolioDisplay');
    }
  }
  //load menu functionality
  getMenu('mainMenu');
  makeMenu(menuArray);
}

/* MAKE AND SETUP MENUS */

//build a list of main menu items
function getMenu(item) {
  var elem = getElemArray(item,'div');
  var counter = 0;
  for (var i = 0; i < elem.length; i++) {
    var id = elem[i].id;
    switch (item) {
    case "mainMenu":
//      if (id != "divider") {
      if (id) {
	menuArray[counter++] = id;
      }
      break;
    case "subMenu":
      menuServicesArray[i] = id;
      break;
    default:
    }
  }
}   
  
//setup each menu item
function makeMenu(name) {
  for (var i = 0; i < name.length; i++) {
    initMenuEvent(name[i]);
  }
}

//add event handlers to each menu item
function initMenuEvent(elemID) {
  addEvent(getDocObj(elemID), "click", menuSetPage, false);
  addEvent(getDocObj(elemID), "mouseover", menuSetPointer, false);
  addEvent(getDocObj(elemID), "mouseout", menuSetText, false);
}


/* MAKE PAGE CONTENT */

//setup the splash image
function makeSplash() {
  setId('contentSplash','contentSplashV');
  var idxElem = getElemArray('contentSplashV','li');
  var splashArray = new Array();
  for (var i = 0; i < idxElem.length; i++) {
    var lj = idxElem[i];
    var ljImgSrc = getObjVal(lj,'img',0,'src');
    var title = getObjVal(lj,'img',0,'alt');
    setImageState(lj,'OFF',ljImgSrc,title);
    splashArray[i] = lj;
  }
  splashIdx = Math.floor(Math.random() * idxElem.length);
  //  setClass(idxElem[splashIdx],'','ON');
  //  setClassOpacity(idxElem[splashIdx],'ON',0);
  //  setImgFade(idxElem[splashIdx],"doFadeSplash()",fadeSplashTime);
  setImgFade(idxElem[splashIdx],"doFadeSplash()",fadeSplashTime,0);
}

//make a display page
function makeImage(name) {
  var newname = name + "V";
  setId(name,newname);
  var idxElem = getElemArray(newname,'li');
  for (var i = 0; i < idxElem.length; i++) {
    var lj = idxElem[i];
    var ljImgSrc = getObjVal(lj,'img',0,'src');
    var title = getObjVal(lj,'img',0,'alt');
    setImageState(lj,'',ljImgSrc,title);
    //    addEvent(lj, 'mouseover', folioSetImgOn, false);  
    //    addEvent(lj, 'mouseout', folioSetImgOff, false);  
    addEvent(lj, 'click', imgSetPage, false);  
  }
}

//setup the portfolio page
function makePortfolio(name) {
  var newname = name + "V";
  setId(name,newname);
  var idxElem = getElemArray(newname,'li');
  for (var i = 0; i < idxElem.length; i++) {
    var lj = idxElem[i];
    var ljImgSrc = getObjVal(lj,'img',0,'src');
    var title = getObjVal(lj,'img',0,'alt');
    setImageState(lj,'',ljImgSrc,title);
    addEvent(lj, 'mouseover', folioSetImgOn, false);  
    addEvent(lj, 'mouseout', folioSetImgOff, false);  
    addEvent(lj, 'click', folioSetPage, false);  
  }
}

function fillWhiteSpace(txt) {
  var searchStr = / /g;
  var replaceStr = "-";
  return txt.replace(searchStr,replaceStr);
}

//setup the gallery pages
function makeGallery(name) {
  var newname = name + "V";
  setId(name,newname);
  var idxElem = getElemArray(newname,'li');
  for (var i = 0; i < idxElem.length; i++) {
    var lj = idxElem[i];
    var ljImgSrc = getObjVal(lj,'img',0,'src');
    var title = getObjVal(lj,'img',0,'alt');
    var divTitle = fillWhiteSpace(title);
    var ljDiv = lj.getElementsByTagName('div')[0];
    ljDiv.id = divTitle + "V";
    setImageState(lj,'',ljImgSrc,title);
    addEvent(lj, 'mouseover', idxSetTextOn, false);
    addEvent(lj, 'mouseout', idxSetTextOff, false);
    addEvent(lj, 'click', idxSetImg, false);  
  }
  var contentTop = getDocObj('contentTop');
  var contentTopDisplay = makeElem('div');
  contentTopDisplay.id = 'contentTopDisplay';
  setClass(contentTopDisplay,'','OFF');
  var contentTopDisplayUl = makeElem('ul');
  contentTopDisplayUl.id = 'contentTopDisplayIdx';
  //  var searchStr = / /g;
  //  var replaceStr = "-";
  for (var i = 0; i < idxElem.length; i++) {
    var lj = idxElem[i];
    var title = getObjVal(lj,'img',0,'alt');

    var newLi = makeElem('li'); 
    newLi.title = title;
    setClass(newLi,'','OFF');
  
    var newImgSrc = fillWhiteSpace(title);
    newImgSrc = "/images/example/" + newImgSrc.toLowerCase() + ".jpg";
    var newImgObj = new Image();
    newImgObj.src = newImgSrc;
    //    setImageState(newLi,'',newImgSrc,title);

    var newImg = makeElem('img');
    newImg.src = newImgObj.src;
    newImg.title = title;
    addText(newLi,newImg); 

/*     var textContent = lj.getElementsByTagName('div')[0].firstChild.nodeValue; */
/*     var textDiv = makeElem('div'); */
/*     textDiv.id = 'captionV'; */
/*     var textH1 = makeElem('h1'); */
/*     var tmpText = makeText(textContent); */
/*     addText(textH1,tmpText); */
/*     addText(textDiv,textH1); */
/*     addText(newLi,textDiv); */

    addText(contentTopDisplayUl,newLi);
    addEvent(newLi, 'click', idxSetImg, false);   

  }
  addText(contentTopDisplay,contentTopDisplayUl);
  addText(contentTop,contentTopDisplay);
}

//setup the index pages
function makeIndex(name) {
  var newname = name + "V";
  setId(name,newname);
  var idxElem = getElemArray(newname,'li');
  for (var i = 0; i < idxElem.length; i++) {
    var lj = idxElem[i];
    var ljImgSrc = getObjVal(lj,'img',0,'src');
    var title = getObjVal(lj,'img',0,'alt');
    setImageState(lj,'',ljImgSrc,title);
    var ljDiv = makeElem('div');
    ljDiv.id = lj.title + "V";
    var ljH1 = makeElem('h1');
    var txt = makeText(lj.title);
    addText(ljH1,txt);
    addText(ljDiv,ljH1);
    addText(lj,ljDiv);
    addEvent(lj, 'mouseover', idxSetTextOn, false);
    addEvent(lj, 'mouseout', idxSetTextOff, false);
    addEvent(lj, 'click', idxSetPage, false);  
  }
}


/* FADE RELATED FUNCTIONS */

//setup
function setFade(obj,func,time,fstart) {
  if (w3cDOM) {
    setOpacity(obj,fstart);
    fadeObj = obj;
    clearInterval(fadeObjInterval);
    fadeObjInterval = setInterval(func,time);
  } else {
    setOpacity(obj,.75);
  }
}

function setImgFade(obj,func,time,fstart) {
  if (w3cDOM) {
    setClassOpacity(obj,'ON',fstart);
    fadeImgObj = obj;
    clearInterval(fadeImgObjInterval);
    fadeImgObjInterval = setInterval(func,time);
  } else {
    setClassOpacity(obj,'ON',1.0);
  }
}

//fade in the splash image
function doFadeSplash() {
  doFadeImg(fadeImgObj,0.01,0.99);
}

//fade in display image over index
function doFadeIdx() {
  doFadeImg(fadeImgObj,0.01,0.99)
}

//fade in text in overview
function doFadeText() {
  doFade(fadeObj,0.01,0.75);
}

//general fade function
function doFade(obj,inc,end) {
  var current = parseFloat(getElementStyle(obj,"opacity"));
  if (current <= end) {
    var fade = current + inc;
    setOpacity(obj,fade);
  } else {
    doFadeStop();
  }
}

function doFadeImg(obj,inc,end) {
  var current = parseFloat(getElementStyle(obj,"opacity"));
  if (current <= end) {
    var fade = current + inc;
    setOpacity(obj,fade);
  } else {
    doFadeImgStop();
  }
}

//stop the fade
function doFadeStop() {
  if (w3cDOM) {
    clearInterval(fadeObjInterval);
  }
}

function doFadeImgStop() {
  if (w3cDOM) {
    clearInterval(fadeImgObjInterval);
  }
}


/* MAIN MENU EVENTS */

//Set page based on menu selection
function menuSetPage(evt) {
  var elem = getElem(evt);
  if (elem) {
    var elemId = elem.id;
    if (memberArray(elemId,menuArray)) {
      location.href = addURL + "/" + elemId + "/";
    } else {
      if (elemId == "overview") {
	location.href = addURL + "/" + currentMenu + "/";
      } else {
	location.href = addURL + "/" + currentMenu + "/" + elemId + "/";
      }
    }
  }
}

//set the mouse pointer
function menuSetPointer(evt) {
  var elem = getElem(evt);
  if (elem) {
    elem.style.cursor = "crosshair";
    menuSetText(evt);
  }
}

//highlight text on mouseover
function menuSetText(evt) {
  var elem = getElem(evt);
  if (elem) {
    var elemId = elem.id;
    if (elemId != currentMenu && elemId != currentSubMenu) {
      var onoff = (elem.className == "textOn") ? "textOff" : "textOn";
      if (memberArray(elemId,menuServicesArray) && currentSubMenu == "overview") {
	var idxElem = getDocObj(elemId + "V");
	if (onoff == "textOn") {
	  //	  setOpacity(idxElem,0);
	  //	  setFade(idxElem,"doFadeText()",fadeTextTime);
	  setFade(idxElem,"doFadeText()",fadeTextTime,0);
	} else {
	  setOpacity(idxElem,0);
	  doFadeStop();
	}
      }
      setClass(elem,'',onoff);
    }
  }
}


/* PORTFOLIO EVENTS */

function imgSetPage(evt) {
  var elem = getElem(evt);
  if (elem) {
    location.href = "/portfolio/";
  }
}

function folioSetPage(evt) {
  var elem = getElem(evt);
  if (elem) {
    var searchStr = / /g;
    var replaceStr = "-";
    var title = elem.title;
    var pageName = title.replace(searchStr,replaceStr); 

    location.href = "/"  + currentMenu + "/" + pageName.toLowerCase() + ".html";
  }
}

//Turn on border for portfolio index image
function folioSetImgOn(evt) { 
  var elem = getElem(evt);
  if (elem) {
    if (elem.title) {
      var searchStr = /idx/g;
      var replaceStr = "portfolio";
      var imgSrc = elem.getElementsByTagName('img')[0].src;
      var newImg = new Image();
      newImg.src = imgSrc.replace(searchStr,replaceStr);
      folioSetImg(elem,'ON');
    }
  }
}

function folioSetImgOff(evt) { 
  var elem = getElem(evt);
  if (elem) {
    if (elem.title) {
      folioSetImg(elem,'');
    }
  }
}
 
function folioSetImg(obj,state) {
  if (state == 'ON') {
    setClass(obj,'',state);
  } else {
    setClass(obj,'',state);
  }
}


/* INDEX IMAGE EVENTS */

// Turn on/off big image
function idxSetImg(evt) {
  var elem = getElem(evt);
  if (elem) {    
    var im = getElemArray('contentTopDisplayIdx','li');
    var state = document.getElementById('contentTopDisplay').className;
    if (state == "OFF") {
      for (var j = 0; j < im.length; j++) { 
	if (elem.title == im[j].title) {
	  //	  alert (j);
	  //	  alert (fillWhiteSpace(elem.title)+"V");
	  var displayImg = im[j].getElementsByTagName('img')[0];
	  //	  alert (displayImg.src);
	  //	  var displayDiv = im[j].getElementsByTagName('div')[0];
	  var contentTop = getDocObj('contentTop');
	  var contentTopDisplay = getDocObj('contentTopDisplay');	  
	  var divHeight = getElementStyle(contentTop,'height');
	  var re = /px/g;
	  var newHeight = parseInt(divHeight.replace(re,''),10);
	  if (w3cDOM) {
	    var imgSize = getImgSize(displayImg);
	    var imgHeight = imgSize[0];
	    var imgWidth = imgSize[1];
	  } else {
	    //	    alert ("IE");	  
	    var imgHeight = imgList[j][2];
	    var imgWidth = imgList[j][1];
	  }
	  //	  alert (imgHeight + " " + imgWidth);
	  var displacement = (newHeight - imgHeight) / 2 + imgHeight;
	  //	  alert (displacement);
	  contentTopDisplay.style['height'] = imgHeight + 2 + "px";
	  contentTopDisplay.style['width'] = imgWidth + 2 + "px";
	  contentTopDisplay.style['bottom'] = displacement + 1 + "px";
/*   	  displayDiv.style['width'] = imgWidth +"px"; */
/* 	  if (w3cDOM) { */
/* 	    setOpacity(displayDiv,.5); */
/* 	  } else { */
/* 	    displayDiv.style['bottom'] = "1px"; */
/* 	  } */

//	  setClassOpacity(im[j],'ON',0.75);
//	  setImgFade(im[j],"doFadeIdx()",fadeIdxTime);
	  setImgFade(im[j],"doFadeIdx()",fadeIdxTime,0.75);
	}
      }
      setIdxDivState('ON','faded');
    } else {
      for (var j = 0; j < im.length; j++) { 
	setClassOpacity(im[j],'OFF',0);
      }
      setIdxDivState('OFF','');
      doFadeStop();
    }      
  }
}

/*     if (document.getElementById('contentTopIdx').className == "faded") { */
/*       idxSetText(elem,'textOff'); */
/*     } else { */

// Turn on name tag on image idexes
function idxSetTextOn(evt) {
  var elem = getElem(evt);
  if (elem) {
    if (elem.title) {
      idxSetText(elem,'textOn');
    }
  }
}

// Turn off name tag on image idexes
function idxSetTextOff(evt) {
  var elem = getElem(evt);
  if (elem) {
    if (elem.title) {
      idxSetText(elem,'textOff');
    }
  }
}

// Turn on/off name tag on image idexes
function idxSetText(obj,state) {
  //  alert(obj.title);
  var objId = getDocObj(fillWhiteSpace(obj.title) + "V");
  //  setOpacity(objId,0);
  if (state == 'textOn') {
    //    setFade(objId,"doFadeText()",fadeTextTime);
    setFade(objId,"doFadeText()",fadeTextTime,0);
  } else {
    setOpacity(objId,0);
    doFadeStop(); 
  }
  if (currentSubMenu == "overview") {
    var subMenuObjId = getDocObj(obj.title);
    setClass(subMenuObjId,'',state);
  }
}

//go to the selected page
function idxSetPage(evt) {
  var elem = getElem(evt);
  if (elem) {
    location.href = "/"  + currentMenu + "/" + elem.title + "/";
  }
}

//set the state for a background image
function setImageState (name,state,imgsrc,title) {
  setClass(name,'',state);
  setStyle(name,'backgroundImage','url(' + imgsrc +')');
  setStyle(name,'backgroundPosition','center');
  setStyle(name,'backgroundRepeat','no-repeat');
  name.title = title;
}

//return the x,y dimensions of an image
function getImgSize(obj) {
  if (w3cDOM) {
    var height = obj.height;
    var width = obj.width;
  } else if (obj.currentStyle) {
    //    alert("IE");
    var re = /px/g;
    var tmpheight = obj.currentStyle['height'];
    //            alert(tmpheight);
    var tmpwidth = obj.currentStyle['width'];
    var height = tmpheight.replace(re,'');
    var width = tmpwidth.replace(re,'');
  }
  return [parseInt(height,10), parseInt(width,10)];
}  

//return the correct modified name
function getCurrentDiv () {
  var lcase = currentSubMenu.charAt(0);
  var ucase = lcase.toUpperCase();
  var re = new RegExp(lcase,"");
  var uname = currentSubMenu.replace(re,ucase);
  return "content" + uname + "IdxV";
} 

//set the state and class for contentTopDisplay
function setIdxDivState(state,classname) {
  setClass('','contentTopDisplay',state);
  //  setClass('',getCurrentDiv(),classname);
  setClass('','contentTopIdx',classname);
}

//set the state and opacity
function setClassOpacity(obj,state,opacity) {
  setClass(obj,'',state);
  setOpacity(obj,opacity);
}


/* GENERAL FUNCTIONS */

//return an element from an event
function getElem(evt) {
  evt = (evt) ? evt : ((window.event) ? window.event : null);
  if (evt) {
    return (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
  }
}

//set object opacity to value
function setOpacity(obj,value) {
  if (w3cDOM) {
    obj.style.opacity = value.toString();
  } else if (obj.currentStyle) {
    obj.style.opacity = value.toString();
    obj.filters["DXImageTransform.Microsoft.Alpha"].Opacity = (value*100).toString();
  }
}

//set object class to value
function setClass(obj,id,value) {
  if (obj) {
    obj.className = value;
  } else {
    document.getElementById(id).className = value;
  }
}

//set obj style to value
function setStyle(obj,name,value) {
  obj.style[name] = value;
}

//set obj id to value
function setId(id,val) {
  document.getElementById(id).id = val;
}

//returns an object
function getDocObj(id) {
  return document.getElementById(id); 
}

//returns an array
function getElemArray(id,tag) {
  return document.getElementById(id).getElementsByTagName(tag);
}

//returns a value
function getObjVal(obj,tag,idx,name) {
  switch (name) {
  case "src":
    return obj.getElementsByTagName(tag)[idx].src;
    break;
  case "alt":
    return obj.getElementsByTagName(tag)[idx].alt;
    break;
  default: {
  }
  }
}

//make an html element
function makeElem(tag) {
  return document.createElement(tag);
}

//make a text node
function makeText(val) {
  return document.createTextNode(val);
}

//add next text to an obj
function addText(obj,val) {
  obj.appendChild(val);
}

// determine if an item is a member of an array
function memberArray(item,ar) {
  for (var i = 0; i < ar.length; i++) {
    if (item == ar[i]) {
      return true;
    }
  }
  return false;
}

/* JavaScript & DHTML Cookbook, 2nd Edition */
/* Recipe 9.1/9.3 */
function addEvent(elem, evtType, func, capture) {
  capture = (capture) ? capture : false;
  if (elem.addEventListener) {
    // WC3
    elem.addEventListener(evtType, func, capture);
  } else if (elem.attachEvent) {
    // IE
    elem.attachEvent("on" + evtType, func);
  } else {
    // for IE/Mac, NN4, and older
    elem["on" + evtType] = func;
  }
}

function removeEvent(elem, evtType, func, capture) {
  capture = (capture) ? capture : false;
  if (elem.removeEventListener) {
    // WC3
    elem.removeEventListener(evtType, func, capture);
  } else if (elem.attachEvent) {
    // IE
    elem.detachEvent("on" + evtType, func);
  } else {
    // for IE/Mac, NN4, and older
    elem["on" + evtType] = null;
  }
}

function addOnLoadEvent(func) {
  if (window.addEventListener || window.attachEvent) {
    addEvent(window,"load", func, false);
  } else {
    var oldQueue = (window.onload) ? window.onload : function() {};
    window.onload = function() {
      oldQueue();
      func();
    }
  }
}

/* JavaScript & DHTML Cookbook, 2nd Edition */
/* Recipe 11.12 */
/* NOTE - jedev: this requires that elem is an element NOT an element ID */
function getElementStyle(elem, CSSStyleProp) { 
  var styleValue, camel; 
  if (elem) { 
    //    if (document.defaultView && document.defaultView.getComputedStyle) { 
    if (w3cDOM) { 
      // W3C DOM version 
      var compStyle = document.defaultView.getComputedStyle(elem, ""); 
      styleValue = compStyle.getPropertyValue(CSSStyleProp); 
    } else if (elem.currentStyle) { 
      // make IE style property camelCase name from CSS version 
      var IEStyleProp = CSSStyleProp; 
      var re = /-\D/; 
      while (re.test(IEStyleProp)) { 
	camel = IEStyleProp.match(re)[0].charAt(1).toUpperCase(); 
	IEStyleProp = IEStyleProp.replace(re, camel); 
      } 
      styleValue = elem.currentStyle[IEStyleProp]; 
    } 
  } 
  return (styleValue) ? styleValue : null; 
}

/* JavaScript & DHTML Cookbook, 2nd Edition */
/* based on 9.5 */
function blockEvents(evt) {
  //  alert ("caught");
  evt = (evt) ? evt : event;
  var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
  //    alert(elem.tagName);
  //  if (elem && elem.tagName && elem.tagName.toLowerCase() == "img") {
  if (elem) {
    if (w3cDOM) {
      evt.preventDefault();
      evt.stopPropagation();
      //      alert("w3cDOM disabled");
    } else {
      event.cancelBubble = true;
      event.returnValue = false;
      //      alert ("ie disabled");
    }
  }
}
