/***
 * GauriSharma.com Global Scripts
 * @author "Shawn MacDonald" <sbpmacdonald@gmail.com>
 */

// Site namespace.
var gs = {

  'CACHE_LIFE': 15,  // minutes

  'FADE_DURATION': 250,

  'NO_EXPIRE': 'NO_EXPIRE',

  'activeFooterLink': null,

  'history': null,

  'cache_': {},

  'isFirstLoad_': true,

  'postRequest_': null,

  'request_': null,

  /**
   * Preload static image files.
   * Inspiration taken from old Macromedia Dreamweaver code.
   */
  'preloadImages': function() {
    var files = gs.preloadImages.arguments;
    for (var i = 0; i < files.length; i++) {
      var image = new Image();
      image.src = 'static/images/' + files[i];
    }
  },

  /**
   * Swap .src and .alt attributes on an image for easy hover highlighting.
   */
  'swapAlt': function(el) {
    if (el == gs.activeFooterLink) {
      return;
    }

    var alt = el.alt;
    el.alt = el.src;
    el.src = alt;
  },

  'load': function(page) {
    gs.history.setToken(page);
  },

  'onNavigate': function(e) {
    if (e.token) {
      gs.view(e.token);
    } else {
      gs.view('blogs');
    }
  },

  'view': function(page) {
    if (gs.isPageCached(page)) {
      gs.swapContent(page);
    } else {
      gs.fetch(page);
    }
  },

  'isPageCached': function(page) {
    if (!(page in gs.cache_)) {
      return false;
    }

    if (gs.cache_[page].timestamp == gs.NO_EXPIRE) {
      return true;
    }

    var cachedAge = (new Date() - gs.cache_[page].timestamp) / 60000;
    if (cachedAge > gs.CACHE_LIFE) {
      // Blow away cached content so we can bring fresh content.
      delete gs.cache_[page];
      return false;
    }

    return true;
  },

  'swapContent': function(page) {
    var contentArea = goog.dom.getElement('gs-content-area');
    var fadeIn = new goog.fx.dom.FadeInAndShow(
        gs.cache_[page].node, gs.FADE_DURATION);
    if (gs.isFirstLoad_) {
      gs.isFirstLoad_ = false;
      goog.dom.appendChild(contentArea, gs.cache_[page].node);

      // Make the first fade in a little slower, a little sexier.
      fadeIn.duration *= 6;
      fadeIn.play();
    } else {
      var fadeOut = new goog.fx.dom.FadeOutAndHide(
          goog.dom.getFirstElementChild(contentArea), gs.FADE_DURATION);
      goog.events.listen(fadeOut, goog.fx.Animation.EventType.END, function() {
        goog.dom.removeChildren(contentArea);
        goog.dom.appendChild(contentArea, gs.cache_[page].node);
        fadeIn.play();
      });
      fadeOut.play();
    }

    gs.setFooterSticky(page);
  },

  'fetch': function(page) {
    if (gs.request_) {
      // Allow only one request.
      return;
    }

    gs.request_ = new goog.net.XhrIo();
    goog.events.listen(gs.request_, goog.net.EventType.COMPLETE, function(e) {
      gs.request_ = null;

      var node = goog.dom.createElement('div');
      if (this.getStatus() == 200) {
        node.innerHTML = this.getResponseText();
        var iter = new goog.dom.NodeIterator(node);
        var child = null;
        while (true) {
          try {
            child = iter.next();
          } catch (e) {
            break;
          }
          if (child.nodeName == 'SCRIPT') {
            try  {
              eval(child.innerText);
            } catch (e) {
              alert('failed: ' + child.innerText);
              alert(e);
            }
          }
        }
      } else {
        var centralContent = goog.dom.createDom(
            'div', {className: 'gs-central-content'},
            goog.dom.createDom('img', {src: '/static/images/404.png'}));
        goog.dom.appendChild(node, centralContent);
      }

      gs.cache_[page] = {
        'timestamp': new Date(),  // now
        'node': node
      };
      gs.swapContent(page);
    });
    gs.request_.send('/_ajax/' + page);

  },

  'setFooterSticky': function(page) {
    if (page.indexOf('portfolio') == 0) {
      page = 'portfolio';
    }

    var footerLink = goog.dom.getElement('gs-' + page + '-footer-link');
    if (footerLink) {
      if (gs.activeFooterLink == footerLink) {
        return;  // do nothing; already active
      }

      if (gs.activeFooterLink && /_pink.png$/.test(gs.activeFooterLink.src)) {
        var tempSrc = gs.activeFooterLink.src;
        gs.activeFooterLink.src = gs.activeFooterLink.alt;
        gs.activeFooterLink.alt = tempSrc;
      }

      if (/_black.png/.test(footerLink.src)) {
        var tempSrc = footerLink.src;
        footerLink.src = footerLink.alt;
        footerLink.alt = tempSrc;
      }

      gs.activeFooterLink = footerLink;
    } else if (gs.activeFooterLink
        && /_pink.png$/.test(gs.activeFooterLink.src)) {
      var tempSrc = gs.activeFooterLink.src;
      gs.activeFooterLink.src = gs.activeFooterLink.alt;
      gs.activeFooterLink.alt = tempSrc;
      gs.activeFooterLink = null;
    }
  },

  'submitContactForm': function() {
    if (gs.postRequest_) {
      // Only allow one request at a time.
      return;
    }

    var requiredFields = ['contact_name', 'contact_email', 'contact_message'];
    var missingRequiredFields = false;
    for (var i = 0; i < requiredFields.length; i++) {
      var field = requiredFields[i];
      var node = goog.dom.getElement(field);
      if (!node) {
        // We're not on the contact page.
        return;
      }

      var warningNode = goog.dom.getElement(field + '_warning');
      if (node.value.trim() == '') {
        missingRequiredFields = true;
        warningNode.style.display = 'block';
      } else {
        // Hide if user has fixed one.
        warningNode.style.display = 'none';
      }
    }
    if (missingRequiredFields) {
      return;
    }

    var fields = {
      'contact_name': '',
      'contact_email': '',
      'contact_phone': '',
      'contact_message': ''
      };

    var content = ''
    var isFirstLoop = true;
    for (var field in fields) {
      var node = goog.dom.getElement(field);
      if (!node) {
        // We're not on the contact page.
        return;
      }
      if (isFirstLoop) {
        isFirstLoop = false;
      } else {
        content += '&';
      }
      content += field + '=' + escape(node.value);
      // Ideally we could just turn the object into a param string, but I don't
      // know how yet.
      //fields[field] = node.value;
    }

    gs.postRequest_ = new goog.net.XhrIo();
    goog.events.listen(gs.postRequest_, goog.net.EventType.COMPLETE, function(e) {
      gs.postRequest_ = null;
      // TODO: set this on the contact page itself in inline javascript
      gs.load('contactthankyou');
    });
    gs.postRequest_.send('/_ajax/contact', 'POST', content);
  },

};

