
// -----------------------------
// DESIGN OH NINE

var show_title = 'UW Design Show 2009';
var current_page, current_frame;
var student, department, project;
var student_full_name;
var default_animation_duration = 300;
var frame_start_offset = 210;

var majors = $H({'vcd': 'Visual Communication Design',
                 'id':  'Industrial Design',
                 'ds':  'Design Studies',
                 'mfa': 'Master of Fine Arts'});

var students = $H({'vcd': ['Simon Bond', 'Andrew Damen', 'Devin Ellis', 'Joey Flynn', 'Drew Hamlin', 'Leonardo Hartomo', 'Callie Hilpert',
                           'Donica Ida', 'Xiang Ling', 'Terry Liu', 'Francis Luu', 'Bridget Meredith', 'Leisha Muraki', 'Mia Pizzuto',
                           'Ivy Sa', 'Carina Skrobecki', 'Yuchi Su', 'Kayla Turner'],
                   'id':  ['Evan Bolten', 'Alice Chen', 'John DeLuna', 'Ben Guthrie', 'Bernadette Havok', 'Mike Horton', 'Calvin Ku',
                           'Kailey Lee', 'Wally Liedke', 'Curtis Ma', 'Michelle LaVasseur', 'Jennifer Margell', 'Brian McAllister', 'Suveer Sharma',
                           'Rina Shin', 'Theara So', 'Eli Stillson', 'Hugh Tompkins IV', 'Loc Trinh'],
                   'ds':  ['Roy Burstein', 'Gretchen Cook', 'Lauren Furgason', 'Brittany Hart', 'Niki Lesniak', 'Stacey Miyahara', 'Matt Myers',
                           'Derrick Ngo', 'Stephanie Savidge', 'Dana Vogt', 'Mathius Walsh'],
                   'mfa': ['Leslie MacNeil Weber', 'Kelly Almon', 'JT Milhoan', 'Sean Douglass', 'Tojo Andrianarivo', 'Erin Williams']});

function debug(x) {
  window.console.log(x.inspect());
}

// -----------------------------
// PAGE MANAGEMENT

setInterval(function listen_for_page_change() {
  var current_path = _current_path();
  if (current_path != current_page)
    go(current_path);
}, 100);

function _current_path() {
  var path = new Array();
  window.location.hash.replace(/#/, '').split('/').each(function(element) {
    if (element)
      path.push(element);
  });
  return path.join('/');
}

function go(page) {
  if (page.nodeType == Node.ELEMENT_NODE)
    page = page.className.split(' ').first();
  
  current_page = page;
  current_frame = 0;
  
  var department = page.split('/').first();
  
  if ($('majors')) {
    var sidebar_selection = (department ? $A($('majors').select('.' + department)).first() : null);
    $('majors').select('.selected').find(function(selected) {
      selected.removeClassName('selected');
    });
    if (sidebar_selection)
      sidebar_selection.addClassName('selected');
  }
  
  window.location.hash = '/' + page;
  load(page);
  _closeDrawer();
}

function load(page) {
  if (!page)
    page = 'home';
  
  var params = '';
  var path = page.split('/');
  if (page != 'home' && path.length && !students.keys().include(path[0])) {
    var department_index = -1, student_index;
    var student = path[0];
    var match = students.values().find(function(department) {
      department_index++;
      student_index = -1;
      var student_match = department.find(function(person) {
        student_index++;
        var name = person.toLowerCase().split(' ');
        return name.first().startsWith(student) || name.last().startsWith(student);
      });
      if (student_match) {
        return student_index;
      }
      
    });
    
    if (match) {
      department = students.keys()[department_index];
      student = students.values()[department_index][student_index].split(' ').first().toLowerCase();
      path = [department, student];
    }
    else {
      unsetTitle();
      $('page').innerHTML = '<p>Missing page content.</p>';
      return;
    }
  }
  if (path.length == 2 || path.length == 3) {
    department = path[0];
    student = path[1];
    project = (path.length == 3 ? path[2] : null);
    page = '_student';
    params = '?department=' + escape(department) + '&student=' + escape(student);
  }
  new Ajax.Request('pages/' + page + '.php' + params,
    {
      method:'get',
      onSuccess: function(transport) {
        Animation($('page')).from('opacity', 0.99).to('opacity', 0).ease(Animation.ease.end).duration(default_animation_duration).go();
        if (page == 'home')
          Animation($('title')).to('opacity', 0).duration(default_animation_duration).hide().go();
        setTimeout(function() {
          $('page').innerHTML = transport.responseText;
          Animation($('page')).from('opacity', 0).to('opacity', 0.99).ease(Animation.ease.start).duration(default_animation_duration).go();
          if (page != 'home')
            Animation($('title')).show().to('opacity', 1).duration(default_animation_duration).go();
          display(page);
        }, default_animation_duration);
      },
      onFailure: function() {
        $('page').innerHTML = '<p>Missing page content.</p>';
      }
    });
}

function display(page) {
  switch (page) {
    case '_student':
      student = $('student').innerHTML;
      student_full_name = students.get(department).find(function(person) {
        return person.toLowerCase().startsWith(student);
      });
      document.title = show_title + ' | ' + student_full_name;
      
      if (project) {
        document.body.scrollLeft = 0;
        setTimeout(function() { scrollToProject(project); }, default_animation_duration);
      }
      else
        scrollToFrame(0);
      setTitle(department, student);
      $('title_action').onmouseout = function() {};
      window.onmousemove = function() { setTitle(department, student); window.onmousemove = ''; }
      $('title_action').onclick = function() {
        scrollToFrame(0);
      };
      Animation($('bio')).to('opacity', 0).duration(0).go();
      Animation($('bio_background')).to('opacity', 0).duration(0).go();
      break;
    default:
      var department_title;
      if (department_title = majors.get(page))
        document.title = show_title + ' | ' + department_title;
      else
        document.title = show_title;
      unsetTitle();
  }
}

// -----------------------------
// TITLE

function setTitle(dept, name) {
  var student_index = 0;
  students.get(dept).find(function(student) {
    student_index++;
    return student.toLowerCase().startsWith(name);
  });
  setTitleOffset(dept, 40 * (student_index - 1));
}

function setTitleOffset(dept, offset) {
  var img = 'images/titles/' + dept + '.png';
  $('title').style.backgroundImage = 'url(' + img + ')';
  $('title').style.backgroundPosition = '0px -' + offset + 'px'; 
}

function unsetTitle() {
  setTitleOffset('default', 0);
  $('title_action').onclick = function() { go(''); };
}

// -----------------------------
// PORTRAITS

function hoverPortrait(portrait, hover) {
  if (hover)
    Animation(portrait).from('opacity', 0).to('opacity', 0.99).duration(250).go();
  else
    Animation(portrait).from('opacity', 0.99).to('opacity', 0).duration(1200).go();
}

// -----------------------------
// PAGERS

window.onkeydown = function(event) {
  if (event.metaKey)
    return true;
  switch (event.keyCode) {
    case 37:
    case 39:
      return false;
  }
}

window.onkeyup = function(event) {
  switch (event.keyCode) {
    case 37: prev(); return false;
    case 39: more(); return false;
  }
}

function scrollToProject(project) {
  var project = $('project_' + project);
  if (project)
    scrollToFrame(parseInt(project.parentNode.id.split('_').last()));
}

function scrollToFrame(frame) {
  if (!$('links'))
    return;
  var frame_element = $('frame_' + frame);
  if (!frame_element)
    frame = 0;
  current_frame = frame;
  var scrollLeft = frame_element ? (frame_element.offsetLeft - frame_start_offset) : 0;
  Animation(document.body).to('scrollLeft', scrollLeft).ease(Animation.ease.both).duration(default_animation_duration).go();
  
  var is_first_view = (frame_element && frame_element.hasClassName('first_view'));
  if (is_first_view || frame <= 2) {
    $('links').select('.selected').first().removeClassName('selected');
    var project_id;
    if (!frame)
      project_id = 'profile';
    else if (frame && !is_first_view && !frame_element.select('h1').length)
      project_id = 1;
    else
      project_id = parseInt(frame_element.select('h1').first().id.split('_').last());
    $('linkto_' + project_id).addClassName('selected');
  }
  
  $('frosted_panel').style.width = is_first_view ? '190px' : '210px';
  if (current_frame)
    $('frosted_panel').show();
  else
    $('frosted_panel').hide();
  
  $('prev').hide();
  if (!$('frame_' + (current_frame + 1))) {
    setTimeout(function() {
      if ($('frame_1'))
        $('rewind').show();
    }, default_animation_duration);
    setTimeout(function() { $('next_person').show(); }, default_animation_duration);
    $('next').hide();
  }
  else {
    $('rewind').hide();
    $('next_person').hide();
    $('next').show();
  }
}

function prev() {
  if (current_frame == 2)
    current_frame = 1;
  scrollToFrame(current_frame - 1);
}

function more() {
  if (!current_frame)
    current_frame = 1;
  scrollToFrame(current_frame + 1);
}

function showPagers() {
  if (!current_frame)
    $('prev').hide();
  else
    $('prev').show();
  Animation($('pagers')).to('opacity', 1).duration(default_animation_duration).go();
}

function hidePagers() {
  Animation($('pagers')).to('opacity', 0).duration(default_animation_duration).go();
}

function goToNextStudent() {
  var department_students = students.get(department);
  var student_index = department_students.indexOf(student_full_name) + 1;
  var departments = students.keys();
  var department_index = departments.indexOf(department);
  
  if (student_index == department_students.length) {
    department_index = departments.indexOf(department) + 1;
    if (department_index == departments.length)
      department_index = 0;
    student_index = 0;
    department_students = students.values()[department_index];
  }
  
  var destination_department = students.keys()[department_index];
  var destination_student = department_students[student_index].split(' ').first().toLowerCase();
  go(destination_department + '/' + destination_student);
}

// -----------------------------
// DRAWER

function drawer(drawer) {
  $('footer').select('.selected').each(function(selected) {
    if (selected != drawer)
      selected.removeClassName('selected');
  });
  if (drawer) {
    $(drawer).toggleClassName('selected');
    var section = drawer.className.split(' ').first();
    var section_page = '_footer/_' + section;
    new Ajax.Request('pages/' + section_page + '.php',
      {
        method:'get',
        onSuccess: function(transport) {
          $('drawer').innerHTML = transport.responseText;
          
          var open = (drawer && drawer.hasClassName('selected'));
          if (!open)
            _closeDrawer();
          else {
            $('drawer').show();
            $('drawer').className = section;
            Animation($('footer')).to('height', '235px').ease(Animation.ease.end).duration(default_animation_duration).go();
            Animation($('autocomplete')).to('bottom', '235px').ease(Animation.ease.end).duration(default_animation_duration).go();
            Animation($('credits_link')).show().to('opacity', '0.6').ease(Animation.ease.end).duration(default_animation_duration).go();
          }
        }
      });
  }
}

function _closeDrawer() {
  Animation($('footer')).to('height', '30px').ease(Animation.ease.end).duration(default_animation_duration).go();
  Animation($('autocomplete')).to('bottom', '30px').ease(Animation.ease.end).duration(default_animation_duration).go();
  Animation($('drawer')).duration(default_animation_duration).hide().go();
  Animation($('credits_link')).to('opacity', '0.01').ease(Animation.ease.end).duration(default_animation_duration).hide().go();
  setTimeout("drawer('');", default_animation_duration);
}

document.onclick = function _closeDrawerOnClick(event) {
  if (parseInt($('footer').style.height) < 100) // Drawer closed 
    return;
  
  var elements = [];
  var node = window.event.srcElement;  
  do {
    if (node.id)
      elements.push(node.id);
  } while(node = node.parentNode);
  if (!elements.include('footer'))
    _closeDrawer();
}

// -----------------------------
// SEARCH

function _setSearchSelection(results, element) {
  if (results.length && results.first().hasClassName('disabled'))
    return false;
  if (element)
    $(element).addClassName('selected');
}

function _clearSearchSelection() {
  var selected = $('autocomplete').select('.selected').first();
  if (selected)
    $(selected).removeClassName('selected');
}

function search(event) {
  var results = $A($('autocomplete').childNodes);
  var selected = $('autocomplete').select('.selected').first();
  
  switch (event.keyCode) {
    case 13: // return
      if (!selected)
        return false;
      selected.onmousedown();
      $('search_field').blur();
    
    case 27: // esc
      $('search_field').value = '';
      $('autocomplete').hide();
      $('autocomplete').innerHTML = '';
      return false;
    
    case 38: // up
      _clearSearchSelection();
      _setSearchSelection(results, selected ? selected.previousSibling : results.last());
      return false;
    
    case 40: // down
      _clearSearchSelection();
      _setSearchSelection(results, selected ? selected.nextSibling : results.first());
      return false;
    
    default:
      _evaluateAutocomplete.defer();
  }
}

function _evaluateAutocomplete() {
  var terms = $('search_field').value.replace(/\./g, '').replace(/-/g, '').escapeHTML().split(' ');
  if (terms == '') {
    $('autocomplete').innerHTML = '';
    $('autocomplete').hide();
    return;
  }
  
  var results = new Array();
  
  var nicknames = $H({'sandbag': [['Joey Flynn']],
                      'cats':    [['Drew Hamlin'], ['Xiang Ling']],
                      'dogs':    [['Donica Ida'], ['Leonardo Hartomo'], ['Simon Bond']],
                      'hater':   [['Simon Bond'], ['Drew Hamlin']],
                      'mauritius': [['Calvin Ku']],
                      'strong guys or something': [['Terry Liu']],
                      'schlopps':   [['Joey Flynn']],
                      '2cdz':       [['Joey Flynn']],
                      'thats it':  [['Simon Bond']],
                      'buddy boy':  [['Simon Bond']],
                      'dog millionaire': [['Simon Bond']],
                      'dv':       [['Dana Vogt']],
                      'robot':    [['Xiang Ling']],
                      'lacrosse': [['Bridget Meredith']],
                      'starbucks': [['Carina Skrobecki']],
                      'christmas': [['Carina Skrobecki']],
                      'pudding':   [['Yuchi Su']],
                      'skateboarder': [['Andrew Damen']],
                      'grandmaster flash':  [['Francis Luu'], ['Joey Flynn'], ['Leonardo Hartomo']],
                      'brew hammerin':  [['Drew Hamlin']],
                      'facebook':  [['Drew Hamlin']],
                      'nard dog': [['Leonardo Hartomo']],
                      'tbaby':   [['Terry Liu']],
                      'tpain':   [['Terry Liu']],
                      'tea bag':  [['Terry Liu']],
                      'jean francois porchez': [['Francis Luu']],
                      'properly served':       [['Leonardo Hartomo']],
                      'yelp':      [['Leonardo Hartomo']],
                      'pineapple': [['Donica Ida'], ['Leisha Muraki']],
                      'roygbiv':	 [['Roy Burstein']],
                      'cent of a woman':	[['Dana Vogt']],
                      'hawaii fiveo':    [['Donica Ida'], ['Leisha Muraki']],
                      'cents and centsability':	[['Leonardo Hartomo']]});
  var nicknames_match = nicknames.get(terms.join(' '));
  if (nicknames_match)
    results = nicknames_match;
  
  students.values().flatten().each(function(student) {
    var words = student.split(' ');
    var matches = words.findAll(function(word) {
      word = word.gsub(/^A-Za-z0-9/, '');
      return terms.find(function(term) {
        term = term.gsub(/^A-Za-z0-9/, '');
        return word.toLowerCase().startsWith(term.toLowerCase());
      });
    });
    if (matches.length)
      results.push(new Array(student, matches));
  });
  
  if (!results.length) {
    $('autocomplete').innerHTML = '<li class="disabled">No match found</li>';
    $('autocomplete').show();
    return;
  }
  
  results = results.map(function(result) {
    var label = ' ' + result[0];
    var matches = result[1];
    if (matches) {
      matches.each(function(match) {
        var matchingTerm = terms.find(function(term) {
          return match.toLowerCase().startsWith(term.toLowerCase());
        });
        label = label.replace(new RegExp('( ' + matchingTerm + ')', 'gi'), "<span>$1</span>");
      });
    }
    label = label.gsub('<span> ', ' <span>');
    label = label.gsub('</span> <span>', ' ').strip();
    
    var result = null;
    var department_index = 0;
    students.values().each(function(department) {
      result = result || department.find(function(student) {
          return (student == label.stripTags());
      });
      if (!result)
        department_index++;
    });
    
    var department = students.keys()[department_index];
    var major = majors.get(department);
    var student_name = label.stripTags().split(' ').first().toLowerCase();
    return '<li onmousedown="go(\'' + department + '/' + student_name + '\');" onmouseover="_clearSearchSelection(); this.addClassName(\'selected\');">' + label + '<div class="major">' + major + '</div></li>';
  });
  
  $('autocomplete').innerHTML = results.inGroupsOf(3).first().join('');
  $('autocomplete').show();
  $($A($('autocomplete').childNodes).first()).addClassName('selected');
}

// -----------------------------
// SHADOWBOX

function play(movie, width, height) {
  Shadowbox.open({ content: movie, player: 'qt', width: width, height: height });
}

function credits() {
  new Ajax.Request('pages/_credits.php',
    {
      method:'get',
      onSuccess: function(transport) {
        _closeDrawer();
        Shadowbox.open({ content: transport.responseText, player: 'html', width: 910, height: 240 });
      },
      onFailure: function() { }
    });
}
