/* bba.js                   */
/* 04:Dan O                 */
/* 22 Aug 09                */
/* baldridge-architects.com */

var bba = {

  IMG_DIR : 'statics/img/',
  INDEX : window['INDEX'] || false,

  /* bba main() */
  main : function () { // do this on load
    var eDefault = document.createElement('div'), // in case an elem is not found
        eEasel = document.getElementById('easel') || eDefault,
        eCanvas = document.getElementById('canvas') || eDefault,
        eMural = document.getElementById('mural') || eDefault,
        eDragShield = document.getElementById('dragShield') || eDefault,
        eProject = document.getElementById('project') || eDefault,
        oPanes = {
          nav: Pane('navPane'),
          info: Pane('infoPane')
        },
        eShadowNavImgHold = document.createElement('img'),
        eMinImgHold = document.createElement('img'),
        eMaxImgHold = document.createElement('img'),
        eCurentPane = {},
        aImgs = [],
        eThumbImg = {},
        eCurrentPane = {},
        iPaneZIndex = Number(oPanes['nav'].style.zIndex) || 1010,
        pageTracker = null; // Google Analytics (dynamically loaded)
    if (!bba.INDEX) {
      var iMuralZIndex = oPanes['nav'].thumbs.length;
      for (var eThumbTD, i = 0; eThumbTD = oPanes['nav'].thumbs[i++];) {
        var cImgs = eThumbTD.getElementsByTagName('img');
        if (cImgs.length && (eThumbImg = cImgs.item(0))) { // should be only one
          aImgs[eThumbImg.src] = document.createElement('img');
          aImgs[eThumbImg.src].src = eThumbImg.src.replace(/\.gif$/, '.jpg');
          aImgs[eThumbImg.src].style.zIndex = oPanes['nav'].thumbs.length - i;
          eMural.appendChild(aImgs[eThumbImg.src]);
          bba.registerEvent(eThumbImg, 'click', overlayImage);
          if (oPanes['nav'].thumbs[0] && oPanes['nav'].thumbs[0].getElementsByTagName('img').item(0)) {
            changeCellsBG(oPanes['nav'].thumbs[0].getElementsByTagName('img').item(0));
          }
          if (i == 1) {
            startGoogleAnalyticsaAndLogImage(eThumbImg);
          }
        }
      }
    } else {
      startGoogleAnalyticsaAndLogImage(null);
    }
    bba.registerEvent(window, 'resize', placePanes);
    eShadowNavImgHold.src = bba.IMG_DIR + 'shadow.nav.square.png';
    eMinImgHold.src = bba.IMG_DIR + 'icon.15x15.minimize.png';
    eMaxImgHold.src = bba.IMG_DIR + 'icon.15x15.maximize.png';

    /* bba f()s */
    function overlayImage() {
      var eThumbImg = arguments[0].target || event.srcElement;
      aImgs[eThumbImg.src].style.zIndex = iMuralZIndex++;
      changeCellsBG(eThumbImg);
      logImageAsViewed(eThumbImg);
    }

    function changeCellsBG(eThumbImg) {
      for (var eTD, i = 0; eTD = oPanes['nav'].cells.item(i++);) {
        if (eThumbImg && eThumbImg.className) {
          eTD.style.backgroundColor = eProject.style.color = eThumbImg.className.replace(/^-/, '#');
        }
        eTD.className = eTD.className.replace(/ current/, '');
      }
      eThumbImg.parentNode.className += ' current';
      oPanes['info'].table.style.backgroundColor = eProject.style.color;
    }
    
    function minimizePane() {
      var ePane = (arguments[0].target || event.srcElement).pane;
      for (var eCell, i = 0; eCell = ePane.cells.item(i++);) {
        eCell.style.display = 'none';
      }
      ePane.heads.item(0).style.width = Math.floor(110.5 * ePane.heads.item(0).colSpan) + 'px';
      ePane.shadow.originalSrc = ePane.shadow.src;
      ePane.shadow.src = eShadowNavImgHold.src;
      ePane.minimize.src = eMaxImgHold.src;
      ePane.minimize.title = 'RESTORE';
      bba.releaseEvent(ePane.minimize, 'click', minimizePane);
      bba.registerEvent(ePane.minimize, 'click', maximizePane);
      pageTracker._trackEvent(
        'navPane',
        'minimized',
        location.pathname.replace(/^\/?[\w-_]*\/|\.html/g, '') + ' navPane'
      );
    }
    
    function maximizePane() {
      var ePane = (arguments[0].target || event.srcElement).pane;
      for (var eCell, i = 0; eCell = ePane.cells.item(i++);) {
        try {
          eCell.style.display = 'table-cell';
        } catch (discard) {
          eCell.style.display = 'block';
        }
      }
      ePane.shadow.src = ePane.shadow.originalSrc;
      ePane.minimize.src = eMinImgHold.src;
      ePane.minimize.title = 'MINIMIZE';
      auditControlsCoords(ePane);
      bba.releaseEvent(ePane.minimize, 'click', maximizePane);
      bba.registerEvent(ePane.minimize, 'click', minimizePane);
      pageTracker._trackEvent(
        'navPane',
        'restored',
        location.pathname.replace(/^\/?[\w-_]*\/|\.html/g, '') + ' navPane'
      );
    }

    function placePanes() {
      for (var member in oPanes) {
        //var sLeft = cookie.getValue('left');
        //var sTop = cookie.getValue('top');
        if (parseInt(oPanes[member].x, 10) || parseInt(oPanes[member].y, 10)) {
          oPanes[member].style.left = oPanes[member].x;
          oPanes[member].style.top = oPanes[member].y;
        }
        auditControlsCoords(oPanes[member]);
      }
    }

    function toggleInfoPane() {
      if (oPanes['info'].style.visibility != 'visible') {
        oPanes['info'].style.visibility = 'visible';
        oPanes['info'].style.display = 'block';
        oPanes['info'].style.zIndex = ++iPaneZIndex;
        pageTracker._trackEvent(
          'infoPane',
          'opened',
          location.pathname.replace(/^\/?[\w-_]*\/|\.html/g, '') + ' infoPane'
        );
      } else {
        oPanes['info'].style.visibility = 'hidden';
        oPanes['info'].style.display = 'none';
      }
    }

    function getAncestorByClass(eNode, sClassName) {
      if (eNode && eNode !== document) {
        if (eNode.className != sClassName) {
          return getAncestorByClass(eNode.parentNode, sClassName);
        }
        return eNode;
      }
      return null;
    }

    function getAncestorByTagName(eNode, sTagName) { // returns single ancestor elem
      while (eNode && eNode.tagName && eNode.tagName.toLowerCase() != sTagName.toLowerCase()) {
        eNode = eNode.parentNode;
      }
      return eNode;
    }

    function startDrag(oEvent) {
      var eTarget = arguments[0].target || event.srcElement;
      eCurrentPane = function () {
        while (!eTarget.pane && eTarget !== document.body) {
          eTarget = eTarget.parentNode;
        }
        return eTarget.pane;
      }();
      eCurrentPane.style.zIndex = ++iPaneZIndex;
      eDragShield.style.zIndex = iPaneZIndex - 1; // shield text
      var iBodyScrollX = document.body.scrollLeft || 0,
          iBodyScrollY = document.body.scrollTop || 0;
      var iParentScrollX = document.documentElement.scrollLeft || 0,
          iParentScrollY = document.documentElement.scrollTop || 0;
      var iWindowScrollX = window.scrollX || 0,
          iWindowScrollY = window.scrollY || 0;
      var iWindowOffsetX = window.pageXOffset || 0,
          iWindowOffsetY = window.pageYOffset || 0;
      var iEventClientX = oEvent.clientX || oEvent.pageX || 0,
          iEventClientY = oEvent.clientY || oEvent.pageY || 0;
      eCurrentPane['initCursorX'] = iBodyScrollX + iParentScrollX + iWindowScrollX + iEventClientX;
      eCurrentPane['initCursorY'] = iBodyScrollY + iParentScrollY + iWindowScrollY + iEventClientY;
      eCurrentPane['initX'] = eCurrentPane.offsetLeft;
      eCurrentPane['initY'] = eCurrentPane.offsetTop;
      bba.registerEvent(document, 'mousemove', doDrag);
      bba.registerEvent(document, 'mouseup', stopDrag);
      return true;
    }

    function doDrag(oEvent) {
      var iEventClientX = oEvent.clientX || oEvent.pageX || 0,
          iEventClientY = oEvent.clientY || oEvent.pageY || 0;
      var x = iEventClientX - eCurrentPane['initCursorX'],
          y = iEventClientY - eCurrentPane['initCursorY'];
      eCurrentPane.style.left = eCurrentPane['initX'] + x + 'px';
      eCurrentPane.style.top = eCurrentPane['initY'] + y + 'px';
      eCurrentPane.style.bottom = eCurrentPane.style.right = 'auto'; // if right- or bottom-justified
      oEvent.returnValue = false;
      oEvent.cancelBubble = true;
      if (oEvent.preventDefault) oEvent.preventDefault();
      if (oEvent.stopPropagation) oEvent.stopPropagation();
      return false;
    }

    function stopDrag(oEvent) {
      var iBodyScrollX = document.body.scrollLeft || 0,
          iBodyScrollY = document.body.scrollTop || 0;
      var iParentScrollX = document.documentElement.scrollLeft || 0,
          iParentScrollY = document.documentElement.scrollTop || 0;
      var iWindowScrollX = window.scrollX || 0,
          iWindowScrollY = window.scrollY || 0;
      var iWindowOffsetX = window.pageXOffset || 0,
          iWindowOffsetY = window.pageYOffset || 0;
      var iEventClientX = oEvent.clientX || oEvent.pageX || 0,
          iEventClientY = oEvent.clientY || oEvent.pageY || 0;
      eDragShield.style.zIndex = '-3'; // move back
      bba.releaseEvent(document, 'mousemove', doDrag);
      bba.releaseEvent(document, 'mouseup', stopDrag);
      eCurrentPane.x = eCurrentPane.style.left;
      eCurrentPane.y = eCurrentPane.style.top;
      auditControlsCoords(eCurrentPane);
      pageTracker._trackEvent(
        eCurrentPane.id,
        'dragged',
        location.pathname.replace(/^\/?[\w-_]*\/|\.html/g, '') + ' ' + eCurrentPane.id
      );
      /* reset controls to account for FF3 image-drag feature */
      //var eCurrentPaneParent = eCurrentPane.parentNode;
      //eCurrentPane = eCurrentPaneParent.removeChild(eCurrentPane);
      //eCurrentPaneParent.appendChild(eCurrentPane);
      //cookie.setValue('left', eCurrentPane.style.left);
      //cookie.setValue('top', eCurrentPane.style.top);
    }

    function auditControlsCoords(ePane) {
      var iEaselWidth = parseInt(getRenderedStyle(eEasel, 'width'), 10) || 0,
          iEaselHeight = parseInt(getRenderedStyle(eEasel, 'height'), 10) || 0;
      var iControlsLeft = parseInt(ePane.x, 10) || 0,
          iControlsTop = parseInt(ePane.y, 10) || 0;
      var iControlsWidth = parseInt(getRenderedStyle(ePane, 'width'), 10) || 0,
          iControlsHeight = ePane.offsetHeight || parseInt(getRenderedStyle(ePane, 'height'), 10) || 0;
      var iWindowWidth = window.innerWidth || document.documentElement.clientWidth || 0;
          iWindowHeight = window.innerHeight || document.documentElement.clientHeight || 0;
      var iLeftEdge = Math.ceil((iEaselWidth - iWindowWidth) / 2),
          iRightEdge = Math.floor((iEaselWidth + iWindowWidth) / 2),
          iTopEdge = Math.ceil((iEaselHeight - iWindowHeight) / 2),
          iBottomEdge = Math.floor((iEaselHeight + iWindowHeight) / 2);
      var bChange = false;
      if (iControlsTop > iBottomEdge - iControlsHeight) {
        iControlsTop = iBottomEdge - iControlsHeight;
        bChange = true;
      }
      if (iControlsTop < iTopEdge) {
        iControlsTop = iTopEdge;
        bChange = true;
      }
      if (iControlsLeft > iRightEdge - iControlsWidth) {
        iControlsLeft = iRightEdge - iControlsWidth;
        bChange = true;
      }
      if (iControlsLeft < iLeftEdge) {
        iControlsLeft = iLeftEdge;
        bChange = true;
      }
      if (
           bChange &&
           !(getRenderedStyle(ePane, 'left') == 'auto' ||
           getRenderedStyle(ePane, 'top') == 'auto') // hack for Saf
         ) {
        ePane.style.bottom = ePane.style.right = 'auto'; // if right- or bottom-justified
        ePane.style.left = iControlsLeft + 'px';
        ePane.style.top = iControlsTop + 'px';
      }
    }

    function Pane(sID) {
      var thi$ = document.getElementById(sID) || eDefault;
      thi$.table = thi$.getElementsByTagName('table').item(0) || eDefault;
      thi$.heads = thi$.table.getElementsByTagName('th') || {};
      thi$.cells = thi$.table.getElementsByTagName('td') || {};
      thi$.thumbs = getElementsByClass(thi$.table, 'thumb') || {};
      thi$.shadow = getElementsByClass(thi$, 'shadowPane')[0] || eDefault;
      thi$.info = getElementsByClass(thi$.table, 'linkInfo')[0] || eDefault;
      thi$.minimize = getElementsByClass(thi$, 'iconMin')[0] || eDefault;
      thi$.minimize.pane = thi$;
      thi$.close = getElementsByClass(thi$, 'iconClose')[0] || eDefault;
      thi$.close.pane = thi$;
      thi$.x = null;
      thi$.y = null;
      bba.registerEvent(thi$.minimize, 'click', minimizePane);
      bba.registerEvent(thi$.close, 'click', toggleInfoPane);
      bba.registerEvent(thi$.info, 'click', toggleInfoPane);
      var sLeft = getRenderedStyle(thi$, 'left');
      var sTop = getRenderedStyle(thi$, 'top');
      if (parseInt(sLeft, 10)) {
        thi$.x = sLeft;
      }
      if (parseInt(sTop, 10)) {
        thi$.y = sTop;
      }
      thi$.style.left = sLeft;
      thi$.style.top = sTop;
      auditControlsCoords(thi$);
      for (var eHead, i = 0; eHead = thi$.heads.item(i++);) {
        eHead.pane = thi$;
        bba.registerEvent(eHead, 'mousedown', startDrag);
      }
      return thi$;
    }

    function getElementsByClass(eNode, sClass) { // returns array of descendant elems
      var aElemsFound = null;
      if (eNode) {
        var i = 0, eChild, aElemsFound = arguments[2] || [];
        while (eChild = eNode.childNodes[i++]) {
          aElemsFound = (getElementsByClass(eChild, sClass, aElemsFound));
          if (eChild.className && eChild.className.match('(^| )' + sClass + '($| )')) {
            aElemsFound.push(eChild);
          }
        }
      }
      return aElemsFound;
    }

    function getOffsetPosition(eElem) { // future use
      var oPositions = { x:0, y:0, found:false };
      while (eElem = eElem.offsetParent) {
        if (eElem === document.body) {
          oPositions.found = true;
          break;
        }
        oPositions['x'] += eElem.offsetLeft;
        oPositions['y'] += eElem.offsetTop;
      }
      return oPositions;
    }

    function getElemNodeAncestor(eArg) {
      while (eArg.nodeType != 3 && eArg !== document) {
        eArg = eArg.parentNode;
      }
      return eArg;
    }

    function nodeIsOrContainsNode(oParent, oNode) {
      if (oNode === oParent) {
        return true;
      } else if (oNode !== document.documentElement){
        return nodeIsOrContainsNode(oParent, oNode.parentNode);
      }
      return false;
    }

    function getRenderedStyle(eElem, sPropArg) { // currentStyle.pixelLeft IE?
      var sPropVal = '';
      if (document.defaultView) {
        sPropVal = window.getComputedStyle(eElem, null).getPropertyValue(sPropArg);
      } else if (eElem.currentStyle) {
        sPropVal = eElem.currentStyle[sPropArg];
      }
      return sPropVal;
    }

    function logImageAsViewed(eThumbImg) { // track images viewed using Google Analytics
      if (eThumbImg && pageTracker) {
        var aMatch = eThumbImg.src.match(/\/([\w\.]+).gif$/) || ['',''];
        pageTracker._trackEvent(
          'images viewed by project',
          aMatch[1].split('.')[0],
          aMatch[1].replace(/\./g, ' ')
        );
      }
    }

    function startGoogleAnalyticsaAndLogImage(eThumbImg) {
      var iTimeoutMS = 100;
      var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
      var eScript = document.createElement('script');
      eScript.src = gaJsHost + 'google-analytics.com/ga.js';
      eScript.type = 'text/javascript';
      document.documentElement.firstChild.appendChild(eScript);
      setTimeout(checkGoogleAnalyticsLoaded, iTimeoutMS);
      function checkGoogleAnalyticsLoaded() {
        try {
          pageTracker = _gat._getTracker('UA-10776069-1');
          pageTracker._trackPageview();
          logImageAsViewed(eThumbImg); // first image automatic
        } catch (error) {
          iTimeoutMS += 100; // if GA slow, wait longer
          setTimeout(checkGoogleAnalyticsLoaded, iTimeoutMS);
        }
      }
    }
  }, /* END main() */

  registerEvent : function(a_oElem, a_sType, a_oHandler) { // x-browser event registrar reformer
    if (a_oElem.addEventListener) {
      registerEvent = function(a_oElem, a_sType, a_oHandler) {
        a_oElem.addEventListener(a_sType, a_oHandler, false);
      }
    } else if (a_oElem.attachEvent) {
      registerEvent = function(a_oElem, a_sType, a_oHandler) {
        a_oElem.attachEvent('on' + a_sType, a_oHandler);
      }
    } else {
      registerEvent = function() {
        a_oElem['on' + a_sType] = a_oHandler;
      }
    }
    registerEvent(a_oElem, a_sType, a_oHandler);
  },

  releaseEvent : function(a_oElem, a_sType, a_oHandler) { // reforms default event destroyer
    a_oElem = a_oElem || {};
    if (a_oElem.removeEventListener) {
      releaseEvent = function(a_oElem, a_sType, a_oHandler) {
        a_oElem.removeEventListener(a_sType, a_oHandler, false);
      }
    } else if (a_oElem.attachEvent) {
      releaseEvent = function(a_oElem, a_sType, a_oHandler) {
        a_oElem.detachEvent('on' + a_sType, a_oHandler);
      }
    } else {
      releaseEvent = function() {
        a_oElem['on' + a_sType] = null;
      }
    }
    releaseEvent(a_oElem, a_sType, a_oHandler);
  },
  
  /* Dan Obenhaus */
  /* 18 August 2008 */
  /* 18 March 2009: IE7 */
  /* all-purpose cookie object for easy date, path, domain, and ssl setting */
  /* 
  USAGE: 
    cookie.setValue(name, value [, expiry] [, path] [, domain] [, secureFlag]);
    cookie.getValue(name);
    - expiry example: "January 1, 2010" & other forms allowed
  */
  cookie : {
    GENERIC_NAME : 'bba',
    NEXT_YEAR : new Date(new Date().getTime() + 31536000000),
    setValue : function(sNameArg, sValueArg, sExpiresArg, sPathArg, sDomainArg, bSecureArg) {
      sNameArg = sNameArg || this.GENERIC_NAME;
      sValueArg = sValueArg || '';
      sExpiresArg = isNaN(new Date(sExpiresArg).getTime()) ? this.NEXT_YEAR : sExpiresArg;
      sPathArg = sPathArg || '';
      sDomainArg = sDomainArg || '';
      if (!sDomainArg && document.domain != 'localhost' && document.domain != '127.0.0.1') {
        sDomainArg = document.domain;
      }
      bSecureArg = bSecureArg || false;
      return this.writeCookie(sNameArg, sValueArg, sExpiresArg, sPathArg, sDomainArg, bSecureArg);
    },
    getValue : function(sNameArg) {
      sNameArg = sNameArg || this.GENERIC_NAME;
      return this.readCookie(sNameArg);
    },
    writeCookie : function(sNameArg, sValueArg, sExpiresArg, sPathArg, sDomainArg, bSecureArg) {
      document.cookie = (
        sNameArg + '=' + escape(sValueArg) +
        (sExpiresArg ? ';expires=' + new Date(sExpiresArg).toGMTString() : '') +
        (sPathArg ? ';path=' + sPathArg : '') +
        (sDomainArg ? ';domain=' + sDomainArg : '') +
        (bSecureArg ? ';secure' : '')
      );
      return unescape(document.cookie);
    },
    readCookie : function(sNameArg) {
      var aRxResults = [];
      var xValue = new RegExp();
      var sKey = '';
      xValue.compile(sNameArg + '=([^;|$]*)');
      aRxResults = xValue.exec(document.cookie);
      if (aRxResults && aRxResults[1]) {
        sKey = unescape(aRxResults[1]);
      }
      return sKey;
    }
  }
}

bba.registerEvent(window, 'load', bba.main);
