diff options
Diffstat (limited to 'site/app/webroot/js/addons.js')
-rw-r--r-- | site/app/webroot/js/addons.js | 873 |
1 files changed, 18 insertions, 855 deletions
diff --git a/site/app/webroot/js/addons.js b/site/app/webroot/js/addons.js index ec3b2f6..2f23003 100644 --- a/site/app/webroot/js/addons.js +++ b/site/app/webroot/js/addons.js @@ -122,17 +122,8 @@ function fixPlatformLinks(versionID, name) { // hide incompatible installs var others = installs.not(".platform-ALL,.platform-"+platform); others.hide(); - others.each(function() { - var expParents = $(this).parents('.exp-loggedout, .exp-confirmed'); - if ($(expParents).length) - $(expParents).hide(); - else - $(this).hide(); - }); - - + if (installs.length == others.length) { - outer.find(".exp-loggedout").hide(); outer.append($('<p class="not-avail"></p>').append(sprintf(addOnNotAvailableForPlatform, name, platform))); } @@ -206,21 +197,10 @@ function addCompatibilityHints(addonID, versionID, fromVer, toVer, showVersionLi cloned.hide(); outer.after(cloned); - // wrap and gray out buttons - // skip experimental confirmation dialogs - $(links).each(function () { - - var exp_confirm = $(this).parents('.exp-loggedout'); - if (exp_confirm.length) { - $(exp_confirm).find('.exp-confirm-install').hide(); - return; - } - - // gray out button - var mydiv = document.createElement('div'); - mydiv.setAttribute('class', 'exp-loggedout'); - outer.wrapInner(mydiv); - }); + // gray out button + var mydiv = document.createElement('div'); + mydiv.setAttribute('class', 'exp-loggedout'); + outer.wrapInner(mydiv); // remove link var url = links.attr('href'); @@ -229,8 +209,6 @@ function addCompatibilityHints(addonID, versionID, fromVer, toVer, showVersionLi links.removeAttr("title"); links.css('cursor', 'default'); links.parent().css('float', 'none'); - // freeze button - links.attr('frozen', 'true'); // determine "all versions" page url if (url.indexOf('downloads') > 0) @@ -273,7 +251,6 @@ function removeCompatibilityHint(versionID) { orig.prev().remove(); // show original buttons orig.attr('id', 'install-'+versionID); - orig.show(); return true; @@ -331,184 +308,6 @@ function emailLink(obj, lp, hp) { cont.replaceChild(a, cont.lastChild); } -var translation_box = { - switchLocale: function(tab, locale) { - var translationBox = $(tab).parent().parent().parent(); - if (translationBox.find('.translation-deletelocale').size() > 0) { - return; - } - translationBox.find('.selected').removeClass('selected'); - $(tab).addClass('selected'); - translationBox.find('.' + locale).addClass('selected'); - this.checkDeleteButton(translationBox); - translationBox.find('.translation-area .input.selected').trigger('onchange'); - translationBox.find('.' + locale).focus(); - }, - - checkDeleteButton: function(translationBox) { - var defaultLocale = translationBox.find('.translation-area').attr('defaultLocale'); - var selectedLocale = translationBox.find('.translation-tab.selected').text(); - if (selectedLocale == defaultLocale || selectedLocale == '') { - translationBox.find('.translation-button.remove').hide(); - } - else { - translationBox.find('.translation-button.remove').show(); - } - }, - - checkLength: function(field, max) { - var translationBox = $(field).parent().parent(); - translationBox.find('.translation-maxlength.selected span').text(field.value.length); - - if (field.value.length > max) { - translationBox.find('.translation-maxlength.selected').addClass('over'); - translationBox.addClass('errors'); - } - else { - translationBox.find('.translation-maxlength.selected').removeClass('over'); - - if (translationBox.find('.translation-area .over').size() == 0) { - translationBox.removeClass('errors'); - } - } - }, - - addTab: function(button) { - var translationBox = $(button).parent().parent().parent(); - if (translationBox.find('.translation-deletelocale').size() > 0) { - return; - } - - if (translationBox.find('.translation-tab').hasClass('new')) { - translationBox.find('.selected').removeClass('selected'); - translationBox.find('.new').addClass('selected'); - return; - } - - var tab = '<div class="translation-tab selected new" onclick="translation_box.switchLocale(this, \'new\');"></div>'; - translationBox.find('.selected').removeClass('selected'); - translationBox.find('.translation-tabs').append(tab); - translationBox.find('.translation-area').append($('.translation-newlocale-container').html()); - - // Remove existing translations from available dropdown - translationBox.find('.translation-tab:not(.new)').each(function(index, item) { - translationBox.find('.translation-newlocale select option[value="' + $(item).text() + '"]').remove(); - }); - this.checkDeleteButton(translationBox); - }, - - addLocale: function(button, addToAll) { - var translationBox = $(button).parent().parent().parent().parent().parent(); - var thisBox = translationBox; - if (addToAll == true) { - translationBox = translationBox.parent(); - } - - var locale = thisBox.find('select').val(); - var localeName = thisBox.find('select option:selected').text(); - - var tab = '<div class="translation-tab selected" title="' + localeName + '" onclick="translation_box.switchLocale(this, \'' + locale + '\');">' + locale + '</div>'; - - translationBox.find('.input.' + locale + '.deleted').remove(); - translationBox.find('.translation-area:not(:has(.' + locale + '))').each(function(index, item) { - var itemID = $(item).attr('itemID'); - var field = 'data[' + $(item).attr('table') + ']' + (itemID != null ? '[' + itemID + ']' : '') + '[' + $(item).attr('field') + '][' + locale + ']'; - $(item).parent().find('.selected').removeClass('selected'); - - var fieldType = $(item).find('.input')[0].tagName.toLowerCase(); - var style = $(item).find('.input').attr('style'); - - if (fieldType == 'textarea') { - var fieldHTML = '<textarea class="input ' + locale + ' selected" name="' + field + '" style="' + style + '"'; - var maxLength = $(item).find('.input').attr('maxLength'); - if (maxLength) { - fieldHTML += ' maxLength="' + maxLength + '" onkeyup="translation_box.checkLength(this, ' + maxLength + ');" onchange="translation_box.checkLength(this, ' + maxLength + ');"'; - var afterHTML = '<div class="translation-maxlength ' + locale + ' selected">' + $(item).find('.translation-maxlength').html() + '</div>'; - } - fieldHTML += '></textarea>'; - } - else if (fieldType == 'input') { - var fieldHTML = '<input type="text" class="input ' + locale + ' selected" value="" name="' + field + '" style="' + style + '" />'; - var afterHTML = ''; - } - $(item).append(fieldHTML).append(afterHTML); - translationBox.find('.translation-area .input.selected').trigger('onchange'); - - $(item).parent().find('.translation-tabs').append(tab); - }); - - thisBox.find('.new').remove(); - this.checkDeleteButton(translationBox); - thisBox.find('.translation-area .selected').focus(); - }, - - confirmRemove: function(button) { - var translationBox = $(button).parent().parent().parent(); - - if (translationBox.find('.translation-deletelocale').size() > 0) { - return; - } - - translationBox.find('.translation-area .input.selected').hide(); - - translationBox.find('.translation-area .input:first').before($('.translation-deletelocale-container').html()); - translationBox.find('.translation-deletelocale').css('width', translationBox.css('width')); - }, - - removeLocale: function(button) { - var translationBox = $(button).parent().parent().parent().parent().parent(); - var locale = translationBox.find('.translation-row .selected').text(); - translationBox.find('.translation-tab:contains(' + locale + ')').remove(); - translationBox.find('.translation-area .input.' + locale).val(''); - translationBox.find('.translation-area .input.' + locale).addClass('deleted'); - translationBox.find('.translation-area .input.' + locale).removeClass('selected'); - - translationBox.find('.translation-maxlength.' + locale).remove(); - - translationBox.find('.translation-deletelocale').remove(); - translationBox.find('.translation-area .input').removeClass('confirm-delete'); - - var defaultLocale = translationBox.find('.translation-area').attr('defaultLocale'); - translationBox.find('.translation-tab:contains(' + defaultLocale + ')').addClass('selected'); - translationBox.find('.translation-area .' + defaultLocale).addClass('selected'); - this.checkDeleteButton(translationBox); - }, - - cancelRemove: function(button) { - var translationBox = $(button).parent().parent().parent().parent().parent(); - translationBox.find('.translation-deletelocale').remove(); - translationBox.find('.translation-area .input').removeClass('confirm-delete'); - translationBox.find('.translation-area .input.selected').show(); - translationBox.find('.translation-area .input.selected').focus(); - }, - - cancelAdd: function(button) { - var translationBox = $(button).parent().parent().parent().parent().parent(); - translationBox.find('.translation-tabs .new').remove(); - translationBox.find('.translation-newlocale').remove(); - - var defaultLocale = translationBox.find('.translation-area').attr('defaultLocale'); - translationBox.find('.translation-tab:contains(' + defaultLocale + ')').addClass('selected'); - translationBox.find('.translation-area .' + defaultLocale).addClass('selected'); - this.checkDeleteButton(translationBox); - }, - - showHelp: function(button) { - var translationBox = $(button).parent().parent(); - if (translationBox.prev('.translation-help').size() > 0) { - return; - } - translationBox.before($('.translation-help-container').html()); - translationBox.prev('.translation-help').slideDown('slow'); - }, - - hideHelp: function(button) { - var helpBox = $(button).parent().parent().parent().parent(); - helpBox.slideUp('normal', function() { - helpBox.remove(); - }); - } -}; /** * sprintf() implementation for Javascript @@ -603,6 +402,7 @@ function sprintf() return str; } + /* ### jQuery Star Rating Plugin v2.0 - 2008-03-12 ### By Diego A, http://www.fyneworks.com, diego@fyneworks.com @@ -671,7 +471,7 @@ $.fn.rating = function(settings) { // loop through each matched element - var radioButtons = $(this).find('input[type=radio]'); + var radioButtons = $(this).find('input[@type=radio]'); $(this).empty(); $(this).removeClass('degrade'); @@ -1065,76 +865,6 @@ $.fn.collection = function(options) { })(jQuery); /*# AVOID COLLISIONS #*/ -function confirmExpInstall(div) { - $(div).removeClass('exp-loggedout'); - $(div).addClass('exp-confirmed'); - var bt = $(div).find('.install-button a'); - - var href = $(bt).attr('href'); - if (href && href.match(/(policy|\.xml|\.xpi|\.jar)/)) { - if (href.match(/collection_id/)) { - href += '&confirmed'; - } else { - href += '?confirmed'; - } - $(bt).attr('href', href); - } - - var tmp = $(bt).attr('engineURL'); - if (tmp && tmp.match(/\.xml/)) { - if (tmp.match(/collection_id/)) { - tmp += "&confirmed"; - } else { - tmp += "?confirmed"; - } - $(bt).attr('engineURL', tmp); - } - - $(bt).removeAttr('frozen'); -} - -function unconfirmExpInstall(div) { - $(div).removeClass('exp-confirmed'); - $(div).addClass('exp-loggedout'); - var bt = $(div).find('.install-button a'); - - var href = $(bt).attr('href'); - if (href) { - href = href.replace(/\?confirmed/, '').replace(/&confirmed/,''); - $(bt).attr('href', href); - } - var tmp = $(bt).attr('engineURL'); - if (tmp) { - tmp = tmp.replace(/\?confirmed/, '').replace(/&confirmed/,''); - $(bt).attr('engineURL', tmp); - } - - $(bt).attr('frozen', 'true'); -} - -$(document).ready(function() { - $('.exp-confirm-install input').each(function () { - var div = $(this).parents('.exp-loggedout, .exp-confirmed'); - if (this.checked) - confirmExpInstall(div); - else - unconfirmExpInstall(div); - }); - $('.exp-confirm-install input').change(function (e) { - var div = $(this).parents('.exp-loggedout, .exp-confirmed'); - if (this.checked) { - confirmExpInstall(div); - } else { - unconfirmExpInstall(div); - } - }); -}); -function initExpConfirm(versionId) { - var outer = $('#install-'+ versionId); - $(outer).find('.exp-confirm-install').show(); - $(outer).find('.exp-loggedout .install-button').show(); -} - /** * jQuery rollover reveal widget * lorchard@mozilla.com @@ -1172,8 +902,7 @@ function initExpConfirm(versionId) { var option_defaults = { reveal_delay: 250, - dismiss_delay: 1000, - enable_rollover: true + dismiss_delay: 500 }; return { @@ -1185,22 +914,21 @@ function initExpConfirm(versionId) { var that = this; this.options = $.extend({}, option_defaults, options); - this.root = $(el); - this.to_reveal = this.root.find('.to-reveal'); + // Assign a unique ID to the element if none found. + if (!el.id) el.id = 'el-' + + (new Date()).getTime() + '-' + + parseInt(1000 * Math.random()); + + this.root = '#'+el.id; + this.to_reveal = $(this.root_id).find('.to-reveal'); // Wire up the event handlers for significant elements of // the widget. - this.root + $(this.root) .find('.activator') .click(function() { that.toggle(); return false; }) - .mouseover(function() { - if (!that.options.enable_rollover) return; - that.schedule('reveal'); that.cancel('dismiss'); - }) - .mouseout(function() { - if (!that.options.enable_rollover) return; - that.cancel('reveal'); that.schedule('dismiss'); - }) + .mouseover(function() { that.schedule('reveal'); that.cancel('dismiss'); }) + .mouseout(function() { that.cancel('reveal'); that.schedule('dismiss'); }) .end() .find('.to-reveal') .mouseover(function() { that.cancel('dismiss'); }) @@ -1263,568 +991,3 @@ function initExpConfirm(versionId) { }(); })(jQuery); - -/** - * jQuery utility for PHP's nl2br equivalent in JavaScript, - * along with the inverse method br2nl - * fwenzel@mozilla.com - */ -;if(jQuery) (function($){ - $.nl2br = function(input) { - return input.replace(/\n/g, '<br/>'); - } - $.br2nl = function(input) { - return input.replace(RegExp('<br\s*/?>', 'g'), "\n"); - } -})(jQuery); - -/** - * jQuery plugin to delay execution of a callback by x milliseconds - * fwenzel@mozilla.com - */ -;if(jQuery) (function($){ - $.fn.delay = function(msec, callback) { - return this.each(function() { - $(this).animate({opacity: 1.0}, msec, callback); - }); - } -})(jQuery); - -/** - * jQuery plugin to fade out, then remove an element - * fwenzel@mozilla.com - */ -;if(jQuery) (function($){ - $.fn.fadeRemove = function() { - return this.each(function() { - $(this).fadeOut('normal', function(){ - $(this).remove(); - }); - }); - } -})(jQuery); - - -// make a call to Urchin, for tracking download button clicks -function urchinDownloadTrackingEvent(path_to_download) { - urchinTracker(path_to_download); // actual -// alert(path_to_download); // debug -} - -// attach a mousedown handler for Urchin, see urchinDownloadTrackingEvent() -function installButtonAttachUrchin(button) { - // don't attach urchin to buttons that just link to a EULA page - if($(button).attr('isEULAPageLink')) return false; - - $(button).mousedown(function (e) { - if ($(this).attr('frozen') == 'true') return false; - urchinDownloadTrackingEvent($(this).attr('href')); - }); -} - -// attach javascript install methods to an install button -// e.g. install(), addEngine() -function installButtonAttachInstallMethod(button) { - - var method = $(button).attr('jsInstallMethod'); - - $(button).click(function (e) { - if ($(this).attr('frozen') == 'true') return false; - - if (method == 'browser_app_addon_install') - return install(e, $(this).attr('addonName'), $(this).attr('addonIcon'), $(this).attr('addonHash')); - else if (method == 'search_engine_install') - return addEngine($(this).attr('engineURL')); - }); -} - -$(document).ready(function() { - $('p.install-button a').each(function () { - installButtonAttachUrchin(this); - installButtonAttachInstallMethod(this); - }); -}); - -/** - * bandwagon: fire a custom refresh event for bandwagon extension - * @return void - */ -function bandwagonRefreshEvent() { - var bandwagonSubscriptionsRefreshEvent = document.createEvent("Events"); - bandwagonSubscriptionsRefreshEvent.initEvent("bandwagonRefresh", true, false); - document.dispatchEvent(bandwagonSubscriptionsRefreshEvent); -} - -/** Collections edit page **/ -var collections_edit = { - /** - * initialize collections edit page - */ - init: function() { - $('#coll-edit .jsonly').show(); - - this.tabs_init(); - this.nickname_init(); - this.icon_init(); - this.user_init(); - this.addon_init(); - this.addon_comment_init(); - - $('#delete-coll').click(function(){ // delete button - $(this).hide(); - $('#delete-confirm').show(); - }); - $('#delete-coll-noscript').change(function() { - if ($(this).is(':checked')) { - $('#delete-warning').fadeIn(); - $('#submitbutton').val(collections_edit_submit_deletecollection); - } else { - $('#delete-warning').fadeOut(); - $('#submitbutton').val(collections_edit_submit); - } - }); - $('#saved_success').delay(10000, function(){$(this).fadeRemove()}); // "saved" success message - }, - - /** - * initialize tabbed layout - */ - tabs_init: function() { - $("#coll-edit > ul") - .tabs() - .bind('tabsselect', function(e, ui, tab) { - window.location.hash = '#'+$(tab.panel).attr('id'); - }); - }, - - /** - * initialize nickname check UI - */ - nickname_init: function() { - this.nickname_old = $('#CollectionNickname').val(); // save original nickname - $('#nick-avail').click(this.nickname_check); - $('#CollectionNickname') - .blur(this.nickname_check) - .keypress(function(e) { - if (e.which == KEYCODE_ENTER) { - collections_edit.nickname_check(); - e.preventDefault(); - } - }) - .keyup(function(e) { - if (e.which!=KEYCODE_ENTER) { - collections_edit.nickname_checked = false; - collections_edit.nickname_showButton(); - } - }); - }, - /** - * check if a nickname is already taken - */ - nickname_check: function() { - if (collections_edit.nickname_checked) - return true; - else - collections_edit.nickname_checked = true; - - var name = $.trim($('#CollectionNickname').val()); - $('#CollectionNickname').val(name); - if (name == collections_edit.nickname_old) { // nickname unchanged - collections_edit.nickname_showLabel('available'); - return true; - } - if (name.length > 0) { - $('#CollectionNickname').siblings('img').show(); - $.getJSON(jsonURL+'/nickname', {nickname: name}, function(data) { - $('#CollectionNickname').siblings('img').hide(); - $('#nick-avail').hide(); - if (data.nickname) $('#CollectionNickname').val(data.nickname); - if (data.error) { - var msg = $('<span class="error">'+data.error_message+'</span>'); - msg.insertAfter($('#CollectionNickname')); - msg.delay(3000, function() { - $(this).fadeRemove(); - collections_edit.nickname_checked = false; - collections_edit.nickname_showButton(); - }); - $('#CollectionNickname').select(); - } else { - collections_edit.nickname_showLabel(data.taken ? 'taken' : 'available'); - } - }); - } else { - $('#nick-avail') - .hide() - .siblings('span').hide(); - } - return true; - }, - /** - * show nickname check result - */ - nickname_showLabel: function(classname) { - $('#nick-avail') - .hide() - .siblings('span').hide() - .filter('.'+classname).show(); - }, - /** - * show/hide button to initiate nickname check - */ - nickname_showButton: function() { - $('#nick-avail').siblings('span').hide(); - if ($('#CollectionNickname').val().length > 0) { - $('#nick-avail').show(); - } else { - $('#nick-avail').hide(); - } - }, - - /** - * Initialize icon upload UI - */ - icon_init: function() { - $('#icon_replace').click(this.icon_replace); - $('#icon_remove').click(this.icon_delete); - $('#icon>a.cancel').click(this.icon_reset); - this.icon_reset(); - }, - /** - * initialize/reset icon upload UI - */ - icon_reset: function() { - var icondiv = $('#icon'); - if (icondiv.children('img').length == 0) return false; - icondiv.children('input:file,.toberemoved,.cancel').hide(); - icondiv.children('.replaceremove').show(); - $('#IconDelete').remove(); - return false; - }, - /** - * remove icon - */ - icon_delete: function() { - var icondiv = $('#icon'); - if (icondiv.children('img').length == 0) return false; - icondiv.children('input:file,.replaceremove').hide(); - icondiv.children('.cancel,.toberemoved').show(); - if ($('#IconDelete').length == 0) - icondiv.append('<input type="hidden" id="IconDelete" name="data[Icon][delete]" value="1"/>'); - return false; - }, - /** - * replace an existing icon - */ - icon_replace: function() { - var icondiv = $('#icon'); - if (icondiv.children('img').length == 0) return false; - icondiv.children('input:file,.cancel').show(); - icondiv.children('.replaceremove,.toberemoved').hide(); - return false; - }, - - /** - * initialize addon-related UI - */ - addon_init: function() { - $('#addonname').autocomplete(collURL+'/addonLookup', { - minChars: 2, - max: 0, - formatItem: function(row) { return '<img src="' + row[2] + '"/> ' + row[0]; }, - formatResult: function(row) { return row[0]+' ['+row[1]+']'; }, - extraParams: { timestamp: null } - }); - $('#addonname').keypress(function(e){ - if (e.which == KEYCODE_ENTER) { - $('#addon-add').click(); - return false; - } - return true; - }); - - $('#addon-add').click(function() { - var name = /\[(\d+)\]/.exec($('#addonname').val()); - if (undefined == name || name.length != 2) return false; - collections_edit.addon_add(name[1]); - return true; - }); // button - }, - /** - * show an add-on in the UI - */ - addon_show: function(id, name, iconurl, date, publisher, comment, editable, ontop) { - var div = $('<div class="coll-addon" id="addon-'+id+'"/>'); - var tpl = $('#addon-new'); // template - - var idfield = tpl.children('input:hidden').clone(); - idfield.val(id); - div.append(idfield); - - var p = tpl.children('p').clone(); - p.find('img').attr('src', iconurl); - p.find('.name').text(name); - p.find('.added').html(sprintf(p.find('.added').text(), date, publisher)); - div.append(p); - if (editable) div.append(tpl.children('.removeaddon').clone(true)); - if (!ontop) { - $('#currentaddons').append(div); - } else { - $('#currentaddons #addon-new').after(div); - } - collections_edit.addon_comment_show(id, comment, editable); - $('#currentaddons').show(); - }, - /** - * add a new add-on to this collection - */ - addon_add: function(id) { - $.post(jsonURL+'/addon/add', { - sessionCheck: $('#collections>div.hsession>input[name=sessionCheck]').val(), - collection_id: collection_id, - addon_id: id - }, function(data) { - if (data.error) { - var msg = $('<span class="error">'+data.error_message+'</span>'); - $('#addon-add').after(msg); - msg.delay(2000, function(){ $(this).fadeRemove(); }); - $('#addonname').select(); - } else { - collections_edit.addon_show(data.id, data.name, data.iconURL, - data.date, data.publisher, '', 1, 1); - $('#addonname').val(''); - } - return true; - }, 'json'); - }, - /** - * remove an add-on from the collection - */ - addon_delete: function() { - var idstring = $(this).parent().attr('id'); - var id = idstring.substr(idstring.lastIndexOf('-')+1); - $.post(jsonURL+'/addon/del', { - sessionCheck: $('#collections>div.hsession>input[name=sessionCheck]').val(), - collection_id: collection_id, - addon_id: id - }, function(data) { - if (data.error) { - alert(data.error_message); - } else { - $('#addon-'+data.id).fadeRemove(); - if ($('#currentaddons').children('div:visible').length==0) $('#currentaddons').hide(); - } - return true; - }, 'json'); - return false; - }, - - /** - * initialize comment-related UI - */ - addon_comment_init: function() { - var tpl = $('#addon-new'); - tpl.children('a.removeaddon').click(this.addon_delete); - tpl.children('a.addlink').click(this.addon_comment_add); - tpl.find('a.editlink').click(this.addon_comment_edit); - tpl.find('a.deletelink').click(function() { - var container = $(this).parent().parent(); - var idstring = container.attr('id'); - var addonid = idstring.substr(idstring.lastIndexOf('-')+1); - collections_edit.addon_comment_save(addonid, ''); - return false; - }); - tpl.find('.editbox>input:button').click(function() { // save - var comment = $(this).siblings('textarea').val(); - var container = $(this).parent().parent(); - var idstring = container.attr('id'); - var addonid = idstring.substr(idstring.lastIndexOf('-')+1); - collections_edit.addon_comment_save(addonid, comment); - return false; - }); - }, - /** - * show a publisher comment in the UI - */ - addon_comment_show: function(addonid, comment, editable) { - var div = $('#addon-'+addonid); - var tpl = $('#addon-new'); - if (comment.length > 0) { - div.append(tpl.children('blockquote').clone().html($.nl2br(comment))); - if (editable) div.append(tpl.children('.editdelete').clone(true)); - } else { - if (editable) div.append(tpl.children('.addlink').clone(true)); - } - }, - /** - * add a new publisher comment in the UI - */ - addon_comment_add: function() { - var editbox = $('#addon-new>.editbox').clone(true); - $(this).parent().append(editbox); - $(this).remove(); - editbox.children('textarea').focus(); - return false; - }, - /** - * edit an existing publisher comment in the UI - */ - addon_comment_edit: function() { - var comment = $(this).parent().siblings('blockquote'); - var editbox = $('#addon-new>.editbox').clone(true); - editbox.children('textarea').html($.br2nl(comment.html())); - $(this).parent().parent().append(editbox); - $(this).parent().remove(); - comment.remove(); - editbox.children('textarea').select(); - return false; - }, - /** - * save/remove a publisher comment - */ - addon_comment_save: function(addonid, comment) { - $.post(jsonURL+'/addon/savecomment', { - sessionCheck: $('#collections>div.hsession>input[name=sessionCheck]').val(), - collection_id: collection_id, - addon_id: addonid, - comment: comment - }, function(data) { - var addonid = /addon_id=(\d+)/.exec(this.data)[1]; - var container = $('#addon-'+addonid); - if (data.error) { - var msg = $('<div class="error">'+data.error_message+'</div>'); - container.append(msg); - msg.delay(2000, function(){ $(this).fadeRemove(); }); - } else { - container.children('blockquote,.addlink,.editdelete,.editbox').remove();// wipe old UI - collections_edit.addon_comment_show(addonid, data.comment, true); // show comment - } - return true; - }, 'json'); - }, - - /** - * initialize user-related UI - */ - user_init: function() { - $('#publishers>input:text,#managers>input:text').keypress(function(e) { - if (e.which == KEYCODE_ENTER) { - $(this).siblings('input:button').click(); - return false; - } - return true; - }); - $('#publishers>input:button,#managers>input:button').click(collections_edit.user_check); - }, - /** - * add a user to this collection - */ - user_check: function() { - var role = $(this).parent().attr('id'); - var email = $('#'+role+'>:text').val(); - if (email.length==0) return; - - $(this).siblings('img').show(); - $.post(jsonURL+'/user/add', { - sessionCheck: $('#collections>div.hsession>input[name=sessionCheck]').val(), - collection_id: collection_id, - role: role, - email: email - }, function(data) { - var role = /role=(\w+)/.exec(this.data)[1]; - $('#'+role+'>img').hide(); - if (data.error) { - var msg = $('<li class="error">'+data.error_message+'</li>'); - $('#'+role+'>ul').append(msg); - msg.delay(2000, function(){ $(this).fadeRemove(); }); - $('#'+role+'>input:text').select(); - } else { - collections_edit.user_add(role, data.id, data.email); - $('#'+role+'>input:text').val('').focus(); - } - return true; - }, 'json'); - }, - /** - * show a user in this collection's user list - */ - user_add: function(role, id, email) { - $('#'+role).siblings('input:radio[value=0]').attr('checked', 'checked'); - $('#'+role+'>ul').append('<li>' - +'<input type="hidden" name="'+role+'[]" value="'+id+'"/>' - +email+' <a href="#" onclick="collections_edit.user_remove(this);return false;">Remove</a>' - +'</li>'); - }, - /** - * remove a user from this collection - */ - user_remove: function(link) { - var id = $(link).siblings('input:hidden').val(); - $.post(jsonURL+'/user/del', { - sessionCheck: $('#collections>div.hsession>input[name=sessionCheck]').val(), - role: $(link).parent().parent().parent().attr('id'), - collection_id: collection_id, - user_id: id - }, function(data) { - var role = /role=(\w+)/.exec(this.data)[1]; - if (data.error) { - var msg = $('<li class="error">'+data.error_message+'</li>'); - $('#'+role+'>ul').append(msg); - msg.delay(2000, function(){ $(this).fadeRemove(); }); - $('#'+role+'>input:text').select(); - } else { - $('#'+role+' input:hidden[value='+data.id+']').parent().fadeRemove(); - } - return true; - }, 'json'); - } -} - -/** Addons Display page */ -var addons_display = { - /** - * initialization - */ - init: function(options) { - this.options = options; - $('.stars').rating({readOnly:(!options.loggedIn)}); - $('.rollover-reveal').rolloverReveal({ enable_rollover: false }); - - $('#coll_publish input:submit').click(this.coll_publish); - }, - - /** - * publish an add-on to a collection - */ - coll_publish: function() { - var coll_uuid = $('#coll_publish option:selected').val(); - if (!coll_uuid) - return false; - else if (coll_uuid == 'new') - return true; - var addon_id = $('#coll_publish input[name=\'data[addon_id]\']').val(); - - $.post(addons_display.options.jsonURL+'/addon/add', { - sessionCheck: $('#coll_publish div.hsession>input[name=sessionCheck]').val(), - collection_uuid: coll_uuid, - addon_id: addon_id - }, function(data) { - if (data.error) { - var msg = $('<div class="error">'+data.error_message+'</div>'); - $('#coll_publish>input:submit').after(msg); - msg.delay(3000, function(){ $(this).fadeRemove(); }); - } else { - var coll_uuid = $('#coll_publish option:selected'); - var msg = $('<div>' - +sprintf(addons_display_collection_publish_success, - data.name, '<a href="' - +addons_display.options.collViewURL+coll_uuid.val() - +'">'+coll_uuid.text()+'</a>') - +'</div>'); - $('#coll_publish input:submit').after(msg); - msg.delay(10000, function(){ $(this).fadeRemove(); }); - coll_uuid.remove(); - } - }, 'json'); - return false; - } -} |