var goollery = goollery || {};

goollery.init = function() {
  $('#category-list a').
      click(function(e) { e.preventDefault();}).
      mouseup(function(e) { e.preventDefault(); }).
      mousedown(goollery.linkMouseDownCallback);
  $('#about-link, #submit-link').
      click(function(e) { e.preventDefault(); }).
      mouseup(function(e) { e.preventDefault(); }).
      mousedown(goollery.linkMouseDownCallback);
  goollery.preloadArrows();
  $('body').mouseup(function(e) {
    goollery.mouseIsDown_ = false;
  }).mousedown(function(e) {
    goollery.mouseIsDown_ = true;
  });

  $('#left-arrow').mousedown(function(e) {
    goollery.imageSwapHelper(this, goollery.Direction.BACK);
  });
  $('#right-arrow').mousedown(function(e) {
    goollery.imageSwapHelper(this, goollery.Direction.FORWARD);
  });
  $('#up-arrow').mousedown(function(e) {
    goollery.navScrollHelper(this, goollery.Direction.UP);
  });
  $('#down-arrow').mousedown(function(e) {
    goollery.navScrollHelper(this, goollery.Direction.DOWN);
  });
  $('#project-list').scroll(goollery.handleProjectListScroll);
  $('#project-list').trigger(jQuery.Event('scroll'));
};

goollery.mouseIsDown_ = false;

goollery.preloadArrows = function() {
  var arrowImgs = [
    'left-arrow.png',
    'right-arrow.png',
    'left-arrow-active.png',
    'right-arrow-active.png',
    'up-arrow.png',
    'up-arrow-active.png',
    'down-arrow.png',
    'down-arrow-active.png'
  ];
  $('body').append('<img id="img-preloader" style="display:none" />');
  var preloader = $('#img-preloader');
  for (var i = 0; i < arrowImgs.length; ++i) {
    preloader.attr('src', './images/' + arrowImgs[i]);
  }
  $('#img-preloader').remove();
};

goollery.linkMouseDownCallback = function(e) {
	/*new_url = this.href;
	tweetmeme_url = new_url;
	alert(tweetmeme_url);
	*/
  $.historyLoad(this.href.split('#')[1]);
  $('#project-list').trigger(jQuery.Event('scroll'));
};

goollery.handleHashChange = function(hash) {
  if (!hash) { $.historyLoad('recent/' + PROJECTS[0]['title']); }
  hash = unescape(hash);
  if (hash.indexOf('recent') == 0) {
    $('#category-list .selected').removeClass('selected');
    $('#most-recent').addClass('selected');
    goollery.showMostRecentProjects();
    if (hash.indexOf('/') != -1) {
      // We have a project we need to select.
      goollery.highlightProject(hash.split('/')[1]);
    }
  } else if (hash.indexOf('toptwenty') == 0) {
    $('#category-list .selected').removeClass('selected');
    $('#top-twenty').addClass('selected');
    goollery.showTopTwentyProjects();
    
	if (hash.indexOf('/') != -1) {
      // We have a project we need to select.
      goollery.highlightProject(hash.split('/')[1]);
    }
	
  }	else if (hash.indexOf('/') == 0) {
    // We have a /Category/Project deal goin' on.
    var catProjArr = hash.substr(1).split('/');
    var category = catProjArr[0];
    var project = catProjArr.length > 1 ? catProjArr[1] : null;
    goollery.highlightCategory(category);
    if (project) { goollery.highlightProject(project); }
  } else if (hash == 'about' || hash == 'contact' || hash == 'submit') {
    goollery.showMostRecentProjects();
    $('#gallery').hide();
    $('#about').hide();
    $('#submit').hide();
    $('#' + hash).show();
  }
};

goollery.showMostRecentProjects = function() {
  var html = '';
  for (var i = 0; i < PROJECTS.length; ++i) {
    var p = PROJECTS[i];
    html += '<li id="proj_' + p['id'] + '">' +
        '<a href="#recent/' + p['title'] + '">' + p['title'] + '</a></li>';
  }
  $('#project-list').empty().html(html);
  $('#project-list a').
      click(function(e) { e.preventDefault();}).
      mouseup(function(e) { e.preventDefault(); }).
      mousedown(goollery.linkMouseDownCallback);
};

goollery.showTopTwentyProjects = function() {
  var html = '';
  for (var i = 0; i < PROJECTS.length; ++i) {
    var p = PROJECTS[i];
	if (p['hasvideo'] == '1') {
	    html += '<li id="proj_' + p['id'] + '">' + '<a href="#toptwenty/' + p['title'] + '">' + p['title'] + '</a></li>';
	}		
  }
  $('#project-list').empty().html(html);
  $('#project-list a').
      click(function(e) { e.preventDefault();}).
      mouseup(function(e) { e.preventDefault(); }).
      mousedown(goollery.linkMouseDownCallback);
};

goollery.highlightCategory = function(category) {
  var catObj = null;
  for(var i = 0; i < CATEGORIES.length; ++i) {
    var cat = CATEGORIES[i];
    if (cat['name'] == category) {
      catObj = cat;
      break;
    }
  }
  var cat = $('#cat_' + catObj['id']);
  if (cat.hasClass('selected')) {
    // The category is already selected. Do nothing.
    return;
  }
  // Reset the nav to be scrolled back to the top.
  $('#project-list').scrollTop(0);
  // Deselect any current selected category.
  $('#category-list .selected').removeClass('selected');
  cat.addClass('selected');
  goollery.populateProjectList(catObj);
};

goollery.handleProjectListScroll = function(e) {
  e.preventDefault();
  var list = $(this);
  var scrollTop = list.scrollTop();
  scrollTop > 0 ? $('#up-arrow').removeClass('disabled') :
      $('#up-arrow').addClass('disabled');
  // Determine if we're scrolled to the bottom and disable the down arrow
  // accordingly.
  (list.attr('scrollHeight') - list.scrollTop()) <= list.height() ?
      $('#down-arrow').addClass('disabled') :
      $('#down-arrow').removeClass('disabled');
};

goollery.populateProjectList = function(categoryObj) {
  var projectsToAdd = [];
  for (var i = 0; i < PROJECTS.length; ++i) {
    var proj = PROJECTS[i];
    if (proj['category_id'] == categoryObj['id']) {
      projectsToAdd.push(proj);
    }
  }
  var html = '';
  for (var i = 0; i < projectsToAdd.length; ++i) {
    var p = projectsToAdd[i];
    html += '<li id="proj_' + p['id'] + '">' +
        '<a href="#/' + categoryObj['name'] + '/' + p['title'] + '">' +
        p['title'] + '</a></li>';
  }
  $('#project-list').empty().html(html); 
  $('#project-list a').
      click(function(e) { e.preventDefault(); }).
      mouseup(function(e) { e.preventDefault(); }).
      mousedown(goollery.linkMouseDownCallback);
};

goollery.highlightProject = function(project) {
  $('#project-list .selected').removeClass('selected');
  var pObj = null;
  project = project.replace(/\+/g,' ');
  for(var i = 0; i < PROJECTS.length; ++i) {
    var p = PROJECTS[i];
    if (p['title'] == project) {
      pObj = p;
      break;
    }
  }
  var proj = $('#proj_' + pObj['id']);
  proj.addClass('selected');
  if (proj.offset().top >
      ($('#project-list').height() + $('#project-list').scrollTop())) {
    proj.get(0).scrollIntoView(false);
  }
  goollery.showProject(pObj);
};

goollery.showProject = function(pObj) {
  $('#about').hide();
  $('#submit').hide();
  $('#gallery').show();
  var projectAssets = [];
  var projId = pObj['id'];
  for (var i = 0; i < ASSETS.length; ++i) {
    if (ASSETS[i]['project_id'] == projId) {
      projectAssets.push(ASSETS[i]);
    }
  }
  // REALLY simplistic algo for sorting by sort-order.
  // Since there will likely be only 3 or 4 assets, though, whatever.
  var sortedAssets = [];
  for (var i = 0; i < projectAssets.length; ++i) {
    var a = projectAssets[i];
    if (a['sort_order'] == (sortedAssets.length + 1)) {
      sortedAssets.push(a);
    }
  }
  // Don't show arrows for only one asset.
  if (sortedAssets.length > 1) {
    $('#img-arrows').show();
  } else {
    $('#img-arrows').hide();
  }
  $('#img-index').text('1 of ' + sortedAssets.length);
  $('#project-name').text(pObj['title']);
  $('#project-link').attr('href', pObj['url']);
  
  //$('meta[name=title]').attr('content', pObj['title']);
  //$('meta[name=description]').attr('content', pObj['title']);
  
  goollery.renderAssets(sortedAssets);

	var whereTo = location.href;
	var theUrl = whereTo.replace(" ", "%20");
	theUrl = theUrl.replace("#","%23");
	theUrl = whereTo;
	
	var twtTitle  = "Goollery: "+pObj['title'];
	var twtUrl    = location.href;
	var maxLength = 140 - (twtUrl.length + 1);
	if (twtTitle.length > maxLength) {
		twtTitle = twtTitle.substr(0, (maxLength - 3))+'...';
	}

	
	/*
	var oTwitterUrl = 'http://api.bit.ly/v3/shorten?login=pleaseenjoy&apiKey=R_49fa737a3812763f16a92b879fae0456&format=json&longUrl=';
  	var shortUrl = '';
  	$.getJSON(oTwitterUrl + encodeURIComponent(twtUrl),
    function(data){
      shortUrl = data.data[0]; 
      $('#twitter').html(unescape(shortUrl));
    });
	*/
	var twtLink = 'http://twitter.com/home?status='+encodeURIComponent(twtTitle + ' ' + twtUrl);
//document.write('<a href="'+twtLink+'" target="_blank"'+'><img src="tweetthis.gif"  border="0" alt="Tweet This!" /'+'><'+'/a>');

	
	
	
	
  //$('#twitter').html('<a target="_blank" href="http://api.tweetmeme.com/share?url='+theUrl+'"><img src="images/twitter.png" /></a>');
  
  $('#twitter').html('<a target="_blank" href="'+twtLink+'"><img src="images/twitter.png" /></a>');
  
  
 // $('#facebook').html('<a target="_blank" name="fb_share" type="icon" href="http://www.facebook.com/sharer.php?u='+encodeURIComponent(theUrl)+'&t='+encodeURIComponent(twtTitle)+'"><img src="images/facebook.png" /></a>');
 $('#facebook').html('<a target="_blank" href="http://www.facebook.com/sharer.php?u='+encodeURIComponent(theUrl)+'&t='+encodeURIComponent(twtTitle)+'"><img src="images/facebook.png" /></a>');


};

goollery.currentAssets_ = null;

goollery.selectedAsset_ = 1;

goollery.renderAssets = function(sortedAssets) {
  goollery.currentAssets_ = sortedAssets;
  goollery.selectedAsset_ = 1;
  var assetHtml = '';
  var movieTypes = ['mov', 'mp4'];
  for (var i = 0; i < sortedAssets.length; ++i) {
    var a = sortedAssets[i];
    var ext = a['filename'].split('.')[1].toLowerCase();
    var isMovie = jQuery.inArray(ext, movieTypes) != -1;
    var isWebVid = a['filename'].indexOf('http') == 0;

    assetHtml += isWebVid ? goollery.generateWebVidEmbedHtml(a['filename'], a['sort_order']) :
        isMovie ? goollery.generateVideoEmbedHtml(a['filename'], a['sort_order']) :
            '<img id="file_' + a['sort_order'] + '" src="./admin/uploads/' + a['filename'] + '" />';
  }
  $('#images').empty().html(assetHtml);
  $('#images > img').mousedown(function(e) {
    goollery.imageSwapHelper('#right-arrow', goollery.Direction.FORWARD);
  });
  var firstAsset = sortedAssets[0];
  if (!firstAsset) { return; }
  $('#img-subtitle').empty();
  if (firstAsset['subtitle'] != '') {
    $('#img-subtitle').text(' / ' + firstAsset['subtitle']);
  }
  var fixstring1 = firstAsset['description'];
  fixstring1.replace(/\\\'/g, "'");
  
  //fixstring.replace(/Google/g, "fred");
  
  $('#img-description').empty().text(fixstring1);
  goollery.subImageDisplay();
};

goollery.generateVideoEmbedHtml = function(filename, sort_order) {
  var src = './admin/uploads/' + filename;
  return "<div id='file_" + sort_order + "'>" +
      "<object width='550' height='381' classid='clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B' " +
      "codebase='http://www.apple.com/qtactivex/qtplugin.cab'>" +
		  "<param name='src' value='" + src + "'>" + 
		  "<param name='autoplay' value='false'>" +
		  "<param name='controller' value='true'>" +
		  "<embed src='" + src + "' width='550' height='381' autoplay='false' " +
		  "controller='true'	pluginspage='http://www.apple.com/quicktime/download/' " +
		  "bgcolor='FFFFFF'></embed></object></div>"
};

goollery.generateWebVidEmbedHtml = function(url, sort_order) {
  if (url.indexOf('youtube') != -1) {
    return goollery.getYouTubeEmbedHtml(url, sort_order);
  } else if (url.indexOf('vimeo') != -1) {
    goollery.getVimeoEmbedHtml(url, sort_order);
    return '<div id="file_' + sort_order + '"></div>';
  } else if (url.indexOf('flickr') != -1) {
    goollery.getFlickrEmbedHtml(url, sort_order);
    return '<div id="file_' + sort_order + '"></div>';
  }
  return '<b>Unsupported web vid type.</b>';
};

goollery.getVimeoEmbedHtml = function(url, sort_order) {
  var oEmbedUrl = 'http://www.vimeo.com/api/oembed.json?width=550&height=450&';
  $.getJSON(oEmbedUrl + 'url=' + encodeURIComponent(url) + '&callback=?',
    function(data){
      var domId = '#file_' + sort_order;
      $(domId).html(unescape(data.html));
    });
};

goollery.getFlickrEmbedHtml = function(url, sort_order) {
  var oEmbedUrl =
      'http://flickr.com/services/oembed?format=json&width=550&height=450&';
  $.getJSON(oEmbedUrl + 'url=' + encodeURIComponent(url) + '&jsoncallback=?',
    function(data){
      var domId = '#file_' + sort_order;
      $(domId).html(unescape(data.html));
    });
};

goollery.getYouTubeEmbedHtml = function(url, sort_order) {
  var youTubeUrl = url.replace(/watch\?v=/, 'v/');
  return '<div id="file_' + sort_order + '">' +
      '<object width="550" height="450"><param name="movie" value="' +
      youTubeUrl +
      '"></param><param name="allowFullScreen" value="true">' + 
      '</param><param name="allowscriptaccess" value="always">' +
      '</param><embed src="' +
      youTubeUrl + 
      '" type="application/x-shockwave-flash" allowscriptaccess="always" '+
      'allowfullscreen="true" width="550" height="450"></embed></object></div>';
};

goollery.Direction = {
  BACK: -1,
  DOWN: 10,
  FORWARD: 1,
  UP: -10
};

goollery.scrollTimeoutId_ = null;
goollery.scrollIntervalId_ = null;

goollery.navScrollHelper = function(arrowEl, direction) {
  if ($(arrowEl).hasClass('disabled')) { return; }
  goollery.scrollNav(direction);
  if (goollery.scrollTimeoutId_ != null) {
    window.clearTimeout(goollery.scrollTimeoutId_);
  }
  goollery.scrollTimeoutId_ = window.setTimeout(function() {
    if (goollery.scrollIntervalId_ != null) {
      window.clearInterval(goollery.scrollIntervalId_);
    }
    goollery.scrollIntervalId_ =
        window.setInterval(function() {
          goollery.scrollNav(direction);
        }, 50);
  }, 200);
};

goollery.scrollNav = function(direction) {
  // IE will spew back that the mouse is not down, clearing
  // the interval, but thankfully they have repeat mousedown
  // events. Keep this in mind when setting the interval to not
  // use the third argument and simply use a closure. Otherwise
  // in subsequent calls the 'direction' variable will be
  // undefined.
  if (!goollery.mouseIsDown_) {
    if (goollery.scrollIntervalId_ != null) {
      window.clearInterval(goollery.scrollIntervalId_);
      goollery.scrollIntervalId_ = null;
    }
  }
  var list = $('#project-list');
  list.scrollTop(list.scrollTop() + direction);
};

goollery.imageSwapHelper = function(arrowEl, direction) {
  if ($(arrowEl).hasClass('disabled')) { return; }
  $(arrowEl).addClass('disabled');
  var imgN = goollery.selectedAsset_;
  $('#file_' + imgN).fadeOut(100, function(e) {
    $('#file_' + (imgN + direction)).fadeIn(100, function(e) {
      goollery.selectedAsset_ += direction;
      goollery.subImageDisplay();
    })
  });
};

goollery.subImageDisplay = function() {
  if (goollery.selectedAsset_ == 1 && goollery.currentAssets_.length > 1) {
    $('#left-arrow').addClass('disabled');
    $('#right-arrow').removeClass('disabled');
  } else if (goollery.selectedAsset_ == goollery.currentAssets_.length) {
    $('#right-arrow').addClass('disabled');
    $('#left-arrow').removeClass('disabled');
  } else {
    $('#left-arrow').removeClass('disabled');
    $('#right-arrow').removeClass('disabled');
  }
  $('#img-index').text(goollery.selectedAsset_ +
    ' of ' + goollery.currentAssets_.length);
  var a = goollery.currentAssets_[goollery.selectedAsset_ - 1];
  $('#img-subtitle').empty();
  if (a['subtitle'] != '') {
    $('#img-subtitle').text(' / ' + a['subtitle']);
  }
  
  var fixstring = a['description'];
  var fixstringapos = fixstring.replace(/\\'/g, "'");
  var fixstringquote = fixstringapos.replace(/\\"/g, "\"");

  //fixstring.replace(/Google/g, "fred");
  
  $('#img-description').empty().text(fixstringquote);
};