impress/public/javascripts/items/show.js

212 lines
5.6 KiB
JavaScript
Raw Normal View History

var PREVIEW_SWF_ID = 'item-preview-swf',
2010-05-16 17:45:30 -07:00
PREVIEW_SWF = document.getElementById(PREVIEW_SWF_ID),
IMPRESS_HOST = PREVIEW_SWF.getAttribute('data-impress-host'),
speciesList = $('#item-preview a'),
MainWardrobe;
if(console === undefined || console.log === undefined) {
function log() {}
} else {
log = $.proxy(console, 'log');
}
String.prototype.capitalize = function () {
return this.charAt(0).toUpperCase() + this.substr(1);
}
String.prototype.article = function () {
return 'aeiou'.indexOf(this.charAt(0).toLowerCase()) == -1 ? 'a' : 'an'
}
2010-05-16 17:45:30 -07:00
function impressUrl(path) {
return 'http://' + IMPRESS_HOST + path;
}
function LoadError(base_msg) {
this.render = function (args) {
var msg = base_msg, token, article_token;
for(var i in args) {
token = "$" + i;
article_token = token + "_article";
if(msg.indexOf(article_token) != -1) {
msg = msg.replace(article_token, args[i].article());
}
msg = msg.replace(token, args[i]);
}
return "Whoops - we've never seen " + msg + " before! If you have, please " +
"<a href='http://" + IMPRESS_HOST + "'>submit that pet's name</a> as soon as you " +
"get the chance! Thanks!";
}
}
function PetType() {
var pet_type = this;
this.activated = true;
this.deactivate = function (error, args) {
var msg;
this.activated = false;
if(typeof args == 'undefined') args = {};
args.color = this.color_name.capitalize();
args.species = this.species_name.capitalize();
this.deactivation_msg = error.render(args);
if(this == PetType.current) showDeactivationMsg();
var img = this.link.children('img').get(0);
this.link.addClass('deactivated');
img.src = img.src.replace('/1/', '/2/');
}
this.load = function () {
var url = '/species/' + this.species_id + '/color/' + this.color_id + '/pet_type.json',
pet_type = this;
$.ajax({
url: url,
dataType: 'json',
success: function (data) {
pet_type.id = data.id;
pet_type.body_id = data.body_id;
Item.current.load(pet_type);
$.getJSON('/pet_types/' + data.id + '/swf_assets.json', function (assets) {
pet_type.assets = assets;
Preview.update();
});
},
error: function () {
pet_type.deactivate(PetType.LOAD_ERROR);
}
});
}
this.setAsCurrent = function () {
PetType.current = this;
speciesList.filter('.current').removeClass('current');
this.link.addClass('current');
if(this.activated) {
Preview.enable();
this.load();
} else {
showDeactivationMsg();
}
}
function showDeactivationMsg() {
Preview.disable(pet_type.deactivation_msg);
}
}
PetType.all = [];
PetType.LOAD_ERROR = new LoadError("$color_article $color $species");
2010-05-20 18:55:09 -07:00
PetType.createFromLink = function (link) {
var pet_type = new PetType();
pet_type.color_id = link.attr('data-color-id');
pet_type.color_name = link.attr('data-color-name');
pet_type.species_id = link.attr('data-species-id');
pet_type.species_name = link.attr('data-species-name');
pet_type.link = link;
PetType.all.push(pet_type);
return pet_type;
}
2010-05-20 18:55:09 -07:00
function Item() {
this.load = function (pet_type) {
var url = '/' + this.id + '/swf_assets.json?body_id=' + pet_type.body_id,
2010-05-20 18:55:09 -07:00
item = this;
$.getJSON(url, function (data) {
if(data.length) {
item.assets = data;
Preview.update();
} else {
pet_type.deactivate(Item.LOAD_ERROR, {
item: item.name
});
}
2010-05-20 18:55:09 -07:00
})
}
this.setAsCurrent = function () {
Item.current = this;
}
}
Item.LOAD_ERROR = new LoadError("$species_article $species wear a $item");
2010-05-20 18:55:09 -07:00
Item.createFromLocation = function () {
var item = new Item();
item.id = parseInt(document.location.pathname.substr(1));
return item;
}
Preview = new function Preview() {
var assets = [], swf_id, swf, updateWhenFlashReady = false;
this.setFlashIsReady = function () {
swf = document.getElementById(swf_id);
if(updateWhenFlashReady) this.update();
}
this.update = function (assets) {
2010-05-20 18:55:09 -07:00
var assets = [];
if(swf) {
2010-05-20 18:55:09 -07:00
$.each([PetType, Item], function () {
if(this.current.assets) assets = assets.concat(this.current.assets);
});
assets = $.each(assets, function () {
this.local_path = this.local_url;
});
swf.setAssets(assets);
} else {
updateWhenFlashReady = true;
}
}
this.embed = function (id) {
swf_id = id;
swfobject.embedSWF(
impressUrl('/assets/swf/preview.swf'), // URL
id, // ID
2010-05-20 19:05:13 -07:00
'100%', // width
'100%', // height
'9', // required version
impressUrl('/assets/js/swfobject/expressInstall.swf'), // express install URL
{'swf_assets_path': impressUrl('/assets')}, // flashvars
{'wmode': 'transparent', 'allowscriptaccess': 'always'} // params
);
}
this.disable = function (msg) {
$('#' + swf_id).hide();
$('#item-preview-error').html(msg).show();
}
this.enable = function () {
$('#item-preview-error').hide();
$('#' + swf_id).show();
}
}
Preview.embed(PREVIEW_SWF_ID);
2010-05-20 18:55:09 -07:00
PetType.createFromLink(speciesList.eq(Math.floor(Math.random()*speciesList.length))).setAsCurrent();
Item.createFromLocation().setAsCurrent();
Item.current.name = $('#item-name').text();
speciesList.each(function () {
var pet_type = PetType.createFromLink($(this));
$(this).click(function (e) {
e.preventDefault();
pet_type.setAsCurrent();
});
});
MainWardrobe = { View: { Outfit: Preview } };
setTimeout(function () {
$.each(PetType.all, function () {
this.load();
});
}, 5000);