var ContactTool = new function() { this.general = 0; this.comment = 1; this.post = 2; this.screenshot = 3; this.character = 4; this.video = 5; this.guide = 6; var _dialog; var contexts = { 0: [ // general [1, true], // General feedback [2, true], // Bug report [8, true], // Article misinformation [3, true], // Typo/mistranslation [4, true], // Advertise with us [5, true], // Partnership opportunities [6, true], // Press inquiry [7, true] // Other ], 1: [ // comment [15, function(post) { return ((post.roles & U_GROUP_MODERATOR) == 0); }], // Advertising [16, true], // Inaccurate [17, true], // Out of date [18, function(post) { return ((post.roles & U_GROUP_MODERATOR) == 0); }], // Spam [19, function(post) { return ((post.roles & U_GROUP_MODERATOR) == 0); }], // Vulgar/inappropriate [20, function(post) { return ((post.roles & U_GROUP_MODERATOR) == 0); }] // Other ], 2: [ // forum post [30, function(post) { return (g_users && g_users[post.user] && (g_users[post.user].roles & U_GROUP_MODERATOR) == 0); }], // Advertising [37, function(post) { return (g_users && g_users[post.user] && (g_users[post.user].roles & U_GROUP_MODERATOR) == 0 && (post.roles & U_GROUP_MODERATOR) == 0 && g_users[post.user].avatar == 2); }], // Avatar [31, true], // Inaccurate [32, true], // Out of date [33, function(post) { return (g_users && g_users[post.user] && (g_users[post.user].roles & U_GROUP_MODERATOR) == 0); }], // Spam [34, function(post) { return (g_users && g_users[post.user] && (g_users[post.user].roles & U_GROUP_MODERATOR) == 0 && post.op && !post.sticky); }], // Sticky request [35, function(post) { return (g_users && g_users[post.user] && (g_users[post.user].roles & U_GROUP_MODERATOR) == 0); }], // Vulgar/inappropriate [36, function(post) { return (g_users && g_users[post.user] && (g_users[post.user].roles & U_GROUP_MODERATOR) == 0);}] // Other ], 3: [ // screenshot [45, true], // Inaccurate, [46, true], // Out of date, [47, function(screen) { return (g_users && g_users[screen.user] && (g_users[screen.user].roles & U_GROUP_MODERATOR) == 0); }], // Vulgar/inappropriate [48, function(screen) { return (g_users && g_users[screen.user] && (g_users[screen.user].roles & U_GROUP_MODERATOR) == 0); }] // Other ], 4: [ // character [60, true], // Inaccurate completion data [61, true] // Other ], 5: [ // video [45, true], // Inaccurate, [46, true], // Out of date, [47, function(video) { return (g_users && g_users[video.user] && (g_users[video.user].roles & U_GROUP_MODERATOR) == 0); }], // Vulgar/inappropriate [48, function(video) { return (g_users && g_users[video.user] && (g_users[video.user].roles & U_GROUP_MODERATOR) == 0); }] // Other ], 6: [ // Guide [45, true], // Inaccurate, [46, true], // Out of date, [48, true] // Other ] }; var errors = { 1: LANG.ct_resp_error1, 2: LANG.ct_resp_error2, 3: LANG.ct_resp_error3, 7: LANG.ct_resp_error7 }; var oldHash = null; this.displayError = function(field, message) { alert(message); } this.onShow = function() { if (location.hash && location.hash != '#contact') oldHash = location.hash; if (this.data.mode == 0) location.replace('#contact'); } this.onHide = function() { if (oldHash && (oldHash.indexOf('screenshots:') == -1 || oldHash.indexOf('videos:') == -1)) location.replace(oldHash); else location.replace('#.'); } this.onSubmit = function(data, button, form) { if (data.submitting) return false; for (var i = 0; i < form.elements.length; ++i) form.elements[i].disabled = true; var params = [ 'contact=1', 'mode=' + $WH.urlencode(data.mode), 'reason=' + $WH.urlencode(data.reason), 'desc=' + $WH.urlencode(data.description), 'ua=' + $WH.urlencode(navigator.userAgent), 'appname=' + $WH.urlencode(navigator.appName), 'page=' + $WH.urlencode(data.currenturl) ]; if (data.mode == 0) // contact us { if (data.relatedurl) params.push('relatedurl=' + $WH.urlencode(data.relatedurl)); if (data.email) params.push('email=' + $WH.urlencode(data.email)); } else if (data.mode == 1) // comment params.push('id=' + $WH.urlencode(data.comment.id)); else if (data.mode == 2) // forum post params.push('id=' + $WH.urlencode(data.post.id)); else if (data.mode == 3) // screenshot params.push('id=' + $WH.urlencode(data.screenshot.id)); else if (data.mode == 4) // character params.push('id=' + $WH.urlencode(data.profile.source)); else if (data.mode == 5) // video params.push('id=' + $WH.urlencode(data.video.id)); else if (data.mode == 6) // guide params.push('id=' + $WH.urlencode(data.guide.id)); data.submitting = true; var url = '?contactus'; new Ajax(url, { method: 'POST', params: params.join('&'), onSuccess: function(xhr, opt) { var resp = xhr.responseText; if (resp == 0) { if (g_user.name) alert($WH.sprintf(LANG.ct_dialog_thanks_user, g_user.name)); else alert(LANG.ct_dialog_thanks); Lightbox.hide(); } else { if (errors[resp]) alert(errors[resp]); else alert('Error: ' + resp); } }, onFailure: function(xhr, opt) { alert('Failure submitting contact request: ' + xhr.statusText); }, onComplete: function(xhr, opt) { for (var i = 0; i < form.elements.length; ++i) form.elements[i].disabled = false; data.submitting = false; } }); return false; } this.show = function(opt) { if (!opt) opt = {}; var data = { mode: 0 }; $WH.cO(data, opt); data.reasons = contexts[data.mode]; if (location.href.indexOf('#contact') != -1) data.currenturl = location.href.substr(0, location.href.indexOf('#contact')); else data.currenturl = location.href; var form = 'contactus'; if (data.mode != 0) form = 'reportform'; if (!_dialog) { this.init(); } _dialog.show(form, { data: data, onShow: this.onShow, onHide: this.onHide, onSubmit: this.onSubmit }) } this.checkPound = function() { if (location.hash && location.hash == '#contact') { ContactTool.show(); } } var dialog_contacttitle = LANG.ct_dialog_contactwowhead; this.init = function() { _dialog = new Dialog(); Dialog.templates.contactus = { title: dialog_contacttitle, width: 550, buttons: [['okay', LANG.ok], ['cancel', LANG.cancel]], fields: [ { id: 'reason', type: 'select', label: LANG.ct_dialog_reason, required: 1, options: [], compute: function(field, value, form, td) { $WH.ee(field); for (var i = 0; i < this.data.reasons.length; ++i) { var id = this.data.reasons[i][0]; var check = this.data.reasons[i][1]; var valid = false; if (typeof check == 'function') valid = check(this.extra); else valid = check; if (!valid) continue; var o = $WH.ce('option'); o.value = id; if (value && value == id) o.selected = true; $WH.ae(o, $WH.ct(g_contact_reasons[id])); $WH.ae(field, o); } field.onchange = function() { if (this.value == 1 || this.value == 2 || this.value == 3) { form.currenturl.parentNode.parentNode.style.display = ''; form.relatedurl.parentNode.parentNode.style.display = ''; } else { form.currenturl.parentNode.parentNode.style.display = 'none'; form.relatedurl.parentNode.parentNode.style.display = 'none'; } }.bind(field); td.style.width = '98%'; }, validate: function(newValue, data, form) { var error = ''; if (!newValue || newValue.length == 0) error = LANG.ct_dialog_error_reason; if (error == '') return true; ContactTool.displayError(form.reason, error); form.reason.focus(); return false; } }, { id: 'currenturl', type: 'text', disabled: true, label: LANG.ct_dialog_currenturl, size: 40 }, { id: 'relatedurl', type: 'text', label: LANG.ct_dialog_relatedurl, caption: LANG.ct_dialog_optional, size: 40, validate: function(newValue, data, form) { var error = ''; var urlRe = /^(http(s?)\:\/\/|\/)?([\w]+:\w+@)?([a-zA-Z]{1}([\w\-]+\.)+([\w]{2,5}))(:[\d]{1,5})?((\/?\w+\/)+|\/?)(\w+\.[\w]{3,4})?((\?\w+=\w+)?(&\w+=\w+)*)?/; newValue = newValue.trim(); if (newValue.length >= 250) error = LANG.ct_dialog_error_relatedurl; else if (newValue.length > 0 && !urlRe.test(newValue)) error = LANG.ct_dialog_error_invalidurl; if (error == '') return true; ContactTool.displayError(form.relatedurl, error); form.relatedurl.focus(); return false; } }, { id: 'email', type: 'text', label: LANG.ct_dialog_email, caption: LANG.ct_dialog_email_caption, compute: function(field, value, form, td, tr) { if (g_user.email) { this.data.email = g_user.email; tr.style.display = 'none'; } else { var func = function() { $('#contact-emailwarn').css('display', g_isEmailValid($(form.email).val()) ? 'none' : ''); Lightbox.reveal(); }; $(field).keyup(func).blur(func); } }, validate: function(newValue, data, form) { var error = ''; newValue = newValue.trim(); if (newValue.length >= 100) error = LANG.ct_dialog_error_emaillen; else if (newValue.length > 0 && !g_isEmailValid(newValue)) error = LANG.ct_dialog_error_email; if (error == '') return true; ContactTool.displayError(form.email, error); form.email.focus(); return false; } }, { id: 'description', type: 'textarea', caption: LANG.ct_dialog_desc_caption, width: '98%', required: 1, size: [10, 30], validate: function(newValue, data, form) { var error = ''; newValue = newValue.trim(); if (newValue.length == 0 || newValue.length > 10000) error = LANG.ct_dialog_error_desc; if (error == '') return true; ContactTool.displayError(form.description, error); form.description.focus(); return false; } }, { id: 'noemailwarning', type: 'caption', compute: function(field, value, form, td) { $(td).html('').css('white-space', 'normal').css('padding', '0 4px'); } } ], onInit: function(form) { }, onShow: function(form) { if (this.data.focus && form[this.data.focus]) setTimeout(g_setCaretPosition.bind(null, form[this.data.focus], form[this.data.focus].value.length), 100); else if (form['reason'] && !form.reason.value) setTimeout($WH.bindfunc(form.reason.focus, form.reason), 10); else if (form['relatedurl'] && !form.relatedurl.value) setTimeout($WH.bindfunc(form.relatedurl.focus, form.relatedurl), 10); else if (form['email'] && !form.email.value) setTimeout($WH.bindfunc(form.email.focus, form.email), 10); else if (form['description'] && !form.description.value) setTimeout($WH.bindfunc(form.description.focus, form.description), 10); setTimeout(Lightbox.reveal, 250); } } Dialog.templates.reportform = { title: LANG.ct_dialog_report, width: 550, // height: 360, buttons: [['okay', LANG.ok], ['cancel', LANG.cancel]], fields: [ { id: 'reason', type: 'select', label: LANG.ct_dialog_reason, options: [], compute: function(field, value, form, td) { switch (this.data.mode) { case 1: // comment form.firstChild.innerHTML = $WH.sprintf(LANG.ct_dialog_reportcomment, '' + this.data.comment.user + ''); break; case 2: // forum post var rep = '' + this.data.post.user + ''; if (this.data.post.op) form.firstChild.innerHTML = $WH.sprintf(LANG.ct_dialog_reporttopic, rep); else form.firstChild.innerHTML = $WH.sprintf(LANG.ct_dialog_reportpost, rep); break; case 3: // screenshot form.firstChild.innerHTML = $WH.sprintf(LANG.ct_dialog_reportscreen, '' + this.data.screenshot.user + ''); break; case 4: // character $WH.ee(form.firstChild); $WH.ae(form.firstChild, $WH.ct(LANG.ct_dialog_reportchar)); break; case 5: // video form.firstChild.innerHTML = $WH.sprintf(LANG.ct_dialog_reportvideo, '' + this.data.video.user + ''); break; case 6: // guide form.firstChild.innerHTML = 'Report guide'; break; } form.firstChild.setAttribute('style', ''); $WH.ee(field); var extra; if (this.data.mode == 1) extra = this.data.comment; else if (this.data.mode == 2) extra = this.data.post; else if (this.data.mode == 3) extra = this.data.screenshot; else if (this.data.mode == 4) extra = this.data.profile; else if (this.data.mode == 5) extra = this.data.video; else if (this.data.mode == 6) extra = this.data.guide; $WH.ae(field, $WH.ce('option', { selected: (!value), value: -1 })); for (var i = 0; i < this.data.reasons.length; ++i) { var id = this.data.reasons[i][0]; var check = this.data.reasons[i][1]; var valid = false; if (typeof check == 'function') valid = check(extra); else valid = check; if (!valid) continue; var o = $WH.ce('option'); o.value = id; if (value && value == id) o.selected = true; $WH.ae(o, $WH.ct(g_contact_reasons[id])); $WH.ae(field, o); } td.style.width = '98%'; }, validate: function(newValue, data, form) { var error = ''; if (!newValue || newValue == -1 || newValue.length == 0) error = LANG.ct_dialog_error_reason; if (error == '') return true; ContactTool.displayError(form.reason, error); form.reason.focus(); return false; } }, { id: 'description', type: 'textarea', caption: LANG.ct_dialog_desc_caption, width: '98%', required: 1, size: [10, 30], validate: function(newValue, data, form) { var error = ''; newValue = newValue.trim(); if (newValue.length == 0 || newValue.length > 10000) error = LANG.ct_dialog_error_desc; if (error == '') return true; ContactTool.displayError(form.description, error); form.description.focus(); return false; } } ], onInit: function(form) { }, onShow: function(form) { /* Work-around for IE7 */ var reason = $(form).find("*[name=reason]")[0]; var description = $(form).find("*[name=description]")[0]; if (this.data.focus && form[this.data.focus]) setTimeout(g_setCaretPosition.bind(null, form[this.data.focus], form[this.data.focus].value.length), 100); else if (!reason.value) setTimeout($WH.bindfunc(reason.focus, reason), 10); else if (!description.value) setTimeout($WH.bindfunc(description.focus, description), 10); } } } $(document).ready(this.checkPound); };