summaryrefslogtreecommitdiffstats
path: root/extensions/REMO
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/REMO')
-rw-r--r--extensions/REMO/Config.pm34
-rw-r--r--extensions/REMO/Extension.pm230
-rw-r--r--extensions/REMO/template/en/default/bug/create/comment-mozreps.txt.tmpl95
-rw-r--r--extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl57
-rw-r--r--extensions/REMO/template/en/default/bug/create/comment-remo-it.txt.tmpl79
-rw-r--r--extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl73
-rw-r--r--extensions/REMO/template/en/default/bug/create/create-mozreps.html.tmpl247
-rw-r--r--extensions/REMO/template/en/default/bug/create/create-remo-budget.html.tmpl295
-rw-r--r--extensions/REMO/template/en/default/bug/create/create-remo-it.html.tmpl294
-rw-r--r--extensions/REMO/template/en/default/bug/create/create-remo-swag.html.tmpl323
-rw-r--r--extensions/REMO/template/en/default/bug/create/create-remo-swag.xml.tmpl104
-rw-r--r--extensions/REMO/template/en/default/bug/create/created-mozreps.html.tmpl38
-rw-r--r--extensions/REMO/template/en/default/bug/create/created-remo-budget.html.tmpl27
-rw-r--r--extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl40
-rw-r--r--extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl37
-rw-r--r--extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl243
-rw-r--r--extensions/REMO/web/js/form_validate.js21
-rw-r--r--extensions/REMO/web/js/swag.js60
-rw-r--r--extensions/REMO/web/styles/moz_reps.css53
19 files changed, 2350 insertions, 0 deletions
diff --git a/extensions/REMO/Config.pm b/extensions/REMO/Config.pm
new file mode 100644
index 000000000..625e2afd9
--- /dev/null
+++ b/extensions/REMO/Config.pm
@@ -0,0 +1,34 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the REMO Bugzilla Extension.
+#
+# The Initial Developer of the Original Code is Mozilla Foundation
+# Portions created by the Initial Developer are Copyright (C) 2011 the
+# Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# Byron Jones <glob@mozilla.com>
+# David Lawrence <dkl@mozilla.com>
+
+package Bugzilla::Extension::REMO;
+use strict;
+
+use constant NAME => 'REMO';
+
+use constant REQUIRED_MODULES => [
+];
+
+use constant OPTIONAL_MODULES => [
+];
+
+__PACKAGE__->NAME;
diff --git a/extensions/REMO/Extension.pm b/extensions/REMO/Extension.pm
new file mode 100644
index 000000000..ed1792f99
--- /dev/null
+++ b/extensions/REMO/Extension.pm
@@ -0,0 +1,230 @@
+# -*- Mode: perl; indent-tabs-mode: nil -*-
+#
+# The contents of this file are subject to the Mozilla Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is the REMO Bugzilla Extension.
+#
+# The Initial Developer of the Original Code is Mozilla Foundation
+# Portions created by the Initial Developer are Copyright (C) 2011 the
+# Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# Byron Jones <glob@mozilla.com>
+# David Lawrence <dkl@mozilla.com>
+
+package Bugzilla::Extension::REMO;
+use strict;
+use base qw(Bugzilla::Extension);
+
+use Bugzilla::Constants;
+use Bugzilla::Util qw(trick_taint trim detaint_natural);
+use Bugzilla::Token;
+use Bugzilla::Error;
+
+our $VERSION = '0.01';
+
+sub page_before_template {
+ my ($self, $args) = @_;
+ my $page = $args->{'page_id'};
+ my $vars = $args->{'vars'};
+
+ if ($page eq 'remo-form-payment.html') {
+ _remo_form_payment($vars);
+ }
+}
+
+sub _remo_form_payment {
+ my ($vars) = @_;
+ my $input = Bugzilla->input_params;
+
+ my $user = Bugzilla->login(LOGIN_REQUIRED);
+
+ if ($input->{'action'} eq 'commit') {
+ my $template = Bugzilla->template;
+ my $cgi = Bugzilla->cgi;
+ my $dbh = Bugzilla->dbh;
+
+ my $bug_id = $input->{'bug_id'};
+ detaint_natural($bug_id);
+ my $bug = Bugzilla::Bug->check($bug_id);
+
+ # Detect if the user already used the same form to submit again
+ my $token = trim($input->{'token'});
+ if ($token) {
+ my ($creator_id, $date, $old_attach_id) = Bugzilla::Token::GetTokenData($token);
+ if (!$creator_id
+ || $creator_id != $user->id
+ || $old_attach_id !~ "^remo_form_payment:")
+ {
+ # The token is invalid.
+ ThrowUserError('token_does_not_exist');
+ }
+
+ $old_attach_id =~ s/^remo_form_payment://;
+ if ($old_attach_id) {
+ ThrowUserError('remo_payment_cancel_dupe',
+ { bugid => $bug_id, attachid => $old_attach_id });
+ }
+ }
+
+ # Make sure the user can attach to this bug
+ if (!$bug->user->{'canedit'}) {
+ ThrowUserError("remo_payment_bug_edit_denied",
+ { bug_id => $bug->id });
+ }
+
+ # Make sure the bug is under the correct product/component
+ if ($bug->product ne 'Mozilla Reps'
+ || $bug->component ne 'Budget Requests')
+ {
+ ThrowUserError('remo_payment_invalid_product');
+ }
+
+ my ($timestamp) = $dbh->selectrow_array("SELECT NOW()");
+
+ $dbh->bz_start_transaction;
+
+ # Create the comment to be added based on the form fields from rep-payment-form
+ my $comment;
+ $template->process("pages/comment-remo-form-payment.txt.tmpl", $vars, \$comment)
+ || ThrowTemplateError($template->error());
+ $bug->add_comment($comment, { isprivate => 0 });
+
+ # Attach expense report
+ # FIXME: Would be nice to be able to have the above prefilled comment and
+ # the following attachments all show up under a single comment. But the longdescs
+ # table can only handle one attach_id per comment currently. At least only one
+ # email is sent the way it is done below.
+ my $attachment;
+ if (defined $cgi->upload('expenseform')) {
+ # Determine content-type
+ my $content_type = $cgi->uploadInfo($cgi->param('expenseform'))->{'Content-Type'};
+
+ $attachment = Bugzilla::Attachment->create(
+ { bug => $bug,
+ creation_ts => $timestamp,
+ data => $cgi->upload('expenseform'),
+ description => 'Expense Form',
+ filename => scalar $cgi->upload('expenseform'),
+ ispatch => 0,
+ isprivate => 0,
+ mimetype => $content_type,
+ });
+
+ # Insert comment for attachment
+ $bug->add_comment('', { isprivate => 0,
+ type => CMT_ATTACHMENT_CREATED,
+ extra_data => $attachment->id });
+ }
+
+ # Attach receipts file
+ if (defined $cgi->upload("receipts")) {
+ # Determine content-type
+ my $content_type = $cgi->uploadInfo($cgi->param("receipts"))->{'Content-Type'};
+
+ $attachment = Bugzilla::Attachment->create(
+ { bug => $bug,
+ creation_ts => $timestamp,
+ data => $cgi->upload('receipts'),
+ description => "Receipts",
+ filename => scalar $cgi->upload("receipts"),
+ ispatch => 0,
+ isprivate => 0,
+ mimetype => $content_type,
+ });
+
+ # Insert comment for attachment
+ $bug->add_comment('', { isprivate => 0,
+ type => CMT_ATTACHMENT_CREATED,
+ extra_data => $attachment->id });
+ }
+
+ $bug->update($timestamp);
+
+ if ($token) {
+ trick_taint($token);
+ $dbh->do('UPDATE tokens SET eventdata = ? WHERE token = ?', undef,
+ ("remo_form_payment:" . $attachment->id, $token));
+ }
+
+ $dbh->bz_commit_transaction;
+
+ # Define the variables and functions that will be passed to the UI template.
+ $vars->{'attachment'} = $attachment;
+ $vars->{'bugs'} = [ new Bugzilla::Bug($bug_id) ];
+ $vars->{'header_done'} = 1;
+ $vars->{'contenttypemethod'} = 'autodetect';
+
+ my $recipients = { 'changer' => $user };
+ $vars->{'sent_bugmail'} = Bugzilla::BugMail::Send($bug_id, $recipients);
+
+ print $cgi->header();
+ # Generate and return the UI (HTML page) from the appropriate template.
+ $template->process("attachment/created.html.tmpl", $vars)
+ || ThrowTemplateError($template->error());
+ exit;
+ }
+ else {
+ $vars->{'token'} = issue_session_token('remo_form_payment:');
+ }
+}
+
+sub post_bug_after_creation {
+ my ($self, $args) = @_;
+ my $vars = $args->{vars};
+ my $bug = $vars->{bug};
+ my $template = Bugzilla->template;
+
+ if (Bugzilla->input_params->{format}
+ && Bugzilla->input_params->{format} eq 'remo-swag')
+ {
+ # If the attachment cannot be successfully added to the bug,
+ # we notify the user, but we don't interrupt the bug creation process.
+ my $error_mode_cache = Bugzilla->error_mode;
+ Bugzilla->error_mode(ERROR_MODE_DIE);
+
+ my $attachment;
+ eval {
+ my $xml;
+ $template->process("bug/create/create-remo-swag.xml.tmpl", {}, \$xml)
+ || ThrowTemplateError($template->error());
+
+ $attachment = Bugzilla::Attachment->create(
+ { bug => $bug,
+ creation_ts => $bug->creation_ts,
+ data => $xml,
+ description => 'Remo Swag Request (XML)',
+ filename => 'remo-swag.xml',
+ ispatch => 0,
+ isprivate => 0,
+ mimetype => 'text/xml',
+ });
+ };
+ if ($@) {
+ warn "$@";
+ }
+
+ if ($attachment) {
+ # Insert comment for attachment
+ $bug->add_comment('', { isprivate => 0,
+ type => CMT_ATTACHMENT_CREATED,
+ extra_data => $attachment->id });
+ $bug->update($bug->creation_ts);
+ }
+ else {
+ $vars->{'message'} = 'attachment_creation_failed';
+ }
+
+ Bugzilla->error_mode($error_mode_cache);
+ }
+}
+
+__PACKAGE__->NAME;
diff --git a/extensions/REMO/template/en/default/bug/create/comment-mozreps.txt.tmpl b/extensions/REMO/template/en/default/bug/create/comment-mozreps.txt.tmpl
new file mode 100644
index 000000000..5e1275e0b
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/comment-mozreps.txt.tmpl
@@ -0,0 +1,95 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the REMO Bugzilla Extension.
+ #
+ # The Initial Developer of the Original Code is the Mozilla Foundation
+ # Portions created by the Initial Developers are Copyright (C) 2011 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s): Byron Jones <glob@mozilla.com>
+ #%]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+First Name:
+[%+ cgi.param('first_name') %]
+
+Last Name:
+[%+ cgi.param('last_name') %]
+
+Under 18 years old:
+[%+ IF cgi.param('underage') %]Yes[% ELSE %]No[% END %]
+
+Sex:
+[%+ cgi.param('sex') %]
+
+City:
+[%+ cgi.param('city') %]
+
+Country:
+[%+ cgi.param('country') %]
+
+Local Community:
+[% IF cgi.param('community') %]
+[%+ cgi.param('community') %]
+[% ELSE %]
+-
+[% END %]
+
+IM:
+[% IF cgi.param('im') %]
+[%+ cgi.param('im') %]
+[% ELSE %]
+-
+[% END %]
+
+Mozillians.org Account:
+[% IF cgi.param('mozillian') %]
+[%+ cgi.param('mozillian') %]
+[% ELSE %]
+-
+[% END %]
+
+References:
+[% IF cgi.param('references') %]
+[%+ cgi.param('references') %]
+[% ELSE %]
+-
+[% END %]
+
+Currently Involved with Mozilla:
+[% IF cgi.param('involved') %]
+[%+ cgi.param('involved') %]
+[% ELSE %]
+-
+[% END %]
+
+When First Contributed:
+[% IF cgi.param('firstcontribute') %]
+[%+ cgi.param('firstcontribute') %]
+[% ELSE %]
+-
+[% END %]
+
+Languages Spoken:
+[%+ cgi.param('languages') %]
+
+How did you lean about Mozilla Reps:
+[%+ cgi.param('learn') %]
+
+What motivates you most about joining Mozilla Reps:
+[%+ cgi.param('motivation') %]
+
+Comments:
+[% IF cgi.param('comments') %]
+[%+ cgi.param('comments') %]
+[% ELSE %]
+-
+[% END %]
diff --git a/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl b/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl
new file mode 100644
index 000000000..40b08331b
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl
@@ -0,0 +1,57 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # This template has no interface.
+ #
+ # Form variables from a bug submission (i.e. the fields on a template from
+ # enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
+ # pull out various custom fields and format an initial Description entry
+ # from them.
+ #%]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+Requester info:
+
+Requester: [% cgi.param('firstname') %] [%+ cgi.param('lastname') %]
+Profile page: [% cgi.param('profilepage') %]
+Event page: [% cgi.param('eventpage') %]
+Event hosted by a Firefox Student Ambassador(s)?: [% cgi.param('ambassador_hosted') %]
+Main audience of the event are Firefox Student Ambassadors: [% cgi.param('ambassador_audience') %]
+Mentor Email: [% cgi.param('mentoremail') %]
+Paypal Account: [% cgi.param('paypal') %]
+Country You Reside: [% cgi.param('country') %]
+Advance payment needed: [% IF cgi.param('advancepayment') %]Yes[% ELSE %]No[% END %]
+
+Budget breakdown:
+
+Total amount requested in $USD: [% cgi.param('budgettotal') %]
+Costs per service:
+Service 1: [% cgi.param('service1') %] Cost: [% cgi.param('cost1') %]
+Service 2: [% cgi.param('service2') %] Cost: [% cgi.param('cost2') %]
+Service 3: [% cgi.param('service3') %] Cost: [% cgi.param('cost3') %]
+Service 4: [% cgi.param('service4') %] Cost: [% cgi.param('cost4') %]
+Service 5: [% cgi.param('service5') %] Cost: [% cgi.param('cost5') %]
+
+Additional costs: (add comment box)
+[% cgi.param('costadditional') %]
+
+[%+ cgi.param("comment") IF cgi.param("comment") %]
+
diff --git a/extensions/REMO/template/en/default/bug/create/comment-remo-it.txt.tmpl b/extensions/REMO/template/en/default/bug/create/comment-remo-it.txt.tmpl
new file mode 100644
index 000000000..7e95dd017
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/comment-remo-it.txt.tmpl
@@ -0,0 +1,79 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+Name:
+[%+ cgi.param('name') %]
+
+Mozillians.org Profile:
+[%+ cgi.param('mozillian') %]
+
+Reps Profile:
+[%+ cgi.param('reps') || "-" %]
+
+Community Name:
+[%+ cgi.param('community') %]
+
+[% FOREACH item = cgi.param('items') %]
+[% IF item == "apps_email" || item == "domain" || item == "ssl" %]
+[% IF item == "apps_email" %]
+[% domain_title = domain_title _ ":: Google Apps Emails\n" %]
+[% END %]
+[% IF item == "domain" %]
+[% domain_title = domain_title _ ":: Domain Name\n" %]
+[% END %]
+[% IF item == "ssl" %]
+[% domain_title = domain_title _ ":: SSL\n" %]
+[% END %]
+[% END %]
+[% END %]
+
+[% FOREACH item = cgi.param('items') %]
+[% IF item == "hosting" %]
+:: Hosting
+
+Expected visits per month:
+[%+ cgi.param('hosting_visits') %]
+
+What will run on the hosting:
+[%+ cgi.param('hosting_running') %]
+
+Hosting data:
+[%+ cgi.param('hosting_data') || "-" %]
+
+[% ELSIF (item == "apps_email" || item == "domain" || item == "ssl")
+ && domain_title %]
+[% domain_title FILTER html %]
+[% domain_title = "" %]
+Domain Name:
+[%+ cgi.param('domain_name') %]
+
+[% ELSIF item == "discourse" %]
+:: Discourse Category
+
+Category Names:
+[%+ cgi.param('discourse_names') %]
+
+Moderators:
+[%+ cgi.param('discourse_mods') %]
+
+Background Hex Code:
+[%+ cgi.param('discourse_bg') || "-" %]
+
+[% ELSIF item == "other" %]
+:: Other
+
+[%+ cgi.param('other_value') %]
+
+[% END %]
+[% END %]
+
+Comments:
+[%+ cgi.param('comments') || "-" %]
diff --git a/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl b/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl
new file mode 100644
index 000000000..ef7419dc9
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl
@@ -0,0 +1,73 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # This template has no interface.
+ #
+ # Form variables from a bug submission (i.e. the fields on a template from
+ # enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
+ # pull out various custom fields and format an initial Description entry
+ # from them.
+ #%]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+Requester info:
+
+First name: [% cgi.param('firstname') %]
+Last name: [% cgi.param('lastname') %]
+Profile page: [% cgi.param('profilepage') %]
+Event name: [% cgi.param('eventname') %]
+Event page: [% cgi.param('eventpage') %]
+Estimated attendance: [% cgi.param('attendance') %]
+Event hosted by a Firefox Student Ambassador(s)?: [% cgi.param('ambassador_hosted') %]
+Main audience of the event are Firefox Student Ambassadors: [% cgi.param('ambassador_audience') %]
+
+Shipping details:
+
+Ship swag before: [% cgi.param('cf_due_date') %]
+
+First name: [% cgi.param("shiptofirstname") %]
+Last name: [% cgi.param("shiptolastname") %]
+Address line 1: [% cgi.param("shiptoaddress1") %]
+Address line 2: [% cgi.param("shiptoaddress2") %]
+City: [% cgi.param("shiptocity") %]
+State/Region: [% cgi.param("shiptostate") %]
+Postal code: [% cgi.param("shiptopcode") %]
+Country: [% cgi.param("shiptocountry") %]
+Phone: [% cgi.param("shiptophone") %]
+[%+ IF cgi.param("shiptoidrut") %]Custom reference: [% cgi.param("shiptoidrut") %][% END %]
+
+Addition information for delivery person:
+[%+ cgi.param('shipadditional') %]
+
+Swag requested:
+
+Stickers: [% IF cgi.param('stickers') %]Yes[% ELSE %]No[% END %]
+Buttons: [% IF cgi.param('buttons') %]Yes[% ELSE %]No[% END %]
+Lanyards: [% IF cgi.param('lanyards') %]Yes[% ELSE %]No[% END %]
+T-shirts: [% IF cgi.param('tshirts') %]Yes[% ELSE %]No[% END %]
+Roll-up banners: [% IF cgi.param('rollupbanners') %]Yes[% ELSE %]No[% END %]
+Horizontal banner: [% IF cgi.param('horizontalbanner') %]Yes[% ELSE %]No[% END %]
+Booth cloth: [% IF cgi.param('boothcloth') %]Yes[% ELSE %]No[% END %]
+Pens: [% IF cgi.param('pens') %]Yes[% ELSE %]No[% END %]
+Other: [% IF cgi.param('otherswag') %][% cgi.param('otherswag') %][% ELSE %]No[% END %]
+
+[%+ cgi.param("comment") IF cgi.param("comment") %]
+
diff --git a/extensions/REMO/template/en/default/bug/create/create-mozreps.html.tmpl b/extensions/REMO/template/en/default/bug/create/create-mozreps.html.tmpl
new file mode 100644
index 000000000..e3ab50f80
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/create-mozreps.html.tmpl
@@ -0,0 +1,247 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the REMO Bugzilla Extension.
+ #
+ # The Initial Developer of the Original Code is the Mozilla Foundation
+ # Portions created by the Initial Developers are Copyright (C) 2011 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s): Byron Jones <glob@mozilla.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Reps - Application Form"
+ style_urls = [ "extensions/REMO/web/styles/moz_reps.css" ]
+%]
+
+[% USE Bugzilla %]
+[% mandatory = '<span class="mandatory" title="Required">*</span>' %]
+
+<script type="text/javascript">
+var Dom = YAHOO.util.Dom;
+
+function mandatory(ids) {
+ result = true;
+ for (i in ids) {
+ id = ids[i];
+ el = Dom.get(id);
+
+ if (el.type.toString() == "checkbox") {
+ value = el.checked;
+ } else {
+ value = el.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
+ el.value = value;
+ }
+
+ if (value == '') {
+ Dom.addClass(id, 'missing');
+ result = false;
+ } else {
+ Dom.removeClass(id, 'missing');
+ }
+ }
+ return result;
+}
+
+function underageWarning (el) {
+ if (el.checked) {
+ Dom.removeClass('underage_warning', 'bz_default_hidden');
+ Dom.get('submit').disabled = true;
+ }
+ else {
+ Dom.addClass('underage_warning', 'bz_default_hidden');
+ Dom.get('submit').disabled = false;
+ }
+}
+
+function submitForm() {
+ if (!mandatory([ 'first_name', 'last_name', 'sex', 'city', 'country',
+ 'languages', 'learn', 'motivation', 'privacy' ])
+ ) {
+ alert('Please enter all the required fields.');
+ return false;
+ }
+
+ Dom.get('short_desc').value =
+ "Application Form: " + Dom.get('first_name').value + ' ' + Dom.get('last_name').value;
+
+ return true;
+}
+
+</script>
+
+<noscript>
+<h1>Javascript is required to use this form.</h1>
+</noscript>
+
+<h1>Mozilla Reps - Application Form</h1>
+
+<p>
+ If you have questions while completing this form, please contact the
+ <a href="mailto:reps-council@lists.mozilla.org">Reps Council</a> for
+ assistance.
+</p>
+
+<form method="post" action="post_bug.cgi" id="tmRequestForm">
+<input type="hidden" name="product" value="Mozilla Reps">
+<input type="hidden" name="component" value="Mentorship">
+<input type="hidden" name="bug_severity" value="normal">
+<input type="hidden" name="rep_platform" value="All">
+<input type="hidden" name="priority" value="--">
+<input type="hidden" name="op_sys" value="Other">
+<input type="hidden" name="version" value="unspecified">
+<input type="hidden" name="groups" value="mozilla-reps">
+<input type="hidden" name="format" value="[% format FILTER html %]">
+<input type="hidden" name="created-format" value="[% format FILTER html %]">
+<input type="hidden" name="comment" id="comment" value="">
+<input type="hidden" name="short_desc" id="short_desc" value="">
+<input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table id="reps-form">
+
+<tr class="odd">
+ <th>First Name:[% mandatory FILTER none %]</th>
+ <td><input id="first_name" name="first_name" size="40" placeholder="John"></td>
+</tr>
+
+<tr class="even">
+ <th>Last Name:[% mandatory FILTER none %]</th>
+ <td><input id="last_name" name="last_name" size="40" placeholder="Doe"></td>
+</tr>
+
+<tr class="odd">
+ <th>Are you under 18 years old?:</th>
+ <td>
+ <input type="checkbox" id="underage" name="underage"
+ value="1" onclick="underageWarning(this);"><br>
+ </td>
+</tr>
+
+<tr id="underage_warning" class="odd bz_default_hidden">
+ <td colspan="2">
+ Mozilla Reps program is not currently accepting people under 18 years old.
+ Sorry for the inconvenience. In the meantime please check with your local Mozilla
+ group for other contribution opportunities
+ </td>
+</tr>
+
+<tr class="even">
+ <th>Sex:[% mandatory FILTER none %]</th>
+ <td>
+ <select id="sex" name="sex">
+ <option value="Male">Male</option>
+ <option value="Female">Female</option>
+ <option value="Other">Other</option>
+ </select>
+ </td>
+</tr>
+
+<tr class="odd">
+ <th>City:[% mandatory FILTER none %]</th>
+ <td><input id="city" name="city" size="40" placeholder="Your city"></td>
+</tr>
+
+<tr class="even">
+ <th>Country:[% mandatory FILTER none %]</th>
+ <td><input id="country" name="country" size="40" placeholder="Your country"></td>
+</tr>
+
+<tr class="odd">
+ <th>Local Community you participate in:</th>
+ <td><input id="community" name="community" size="40" placeholder="Name of your community"></td>
+</tr>
+
+<tr class="even">
+ <th>IM (specify service):</th>
+ <td><input id="im" name="im" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <th>Mozillians.org Account:</th>
+ <td><input id="mozillian" name="mozillian" size="40"></td>
+</tr>
+
+<tr class="even">
+ <th colspan="2">
+ References:
+ </th>
+</tr>
+<tr class="even">
+ <td colspan="2">
+ <textarea id="references" name="references" rows="4"
+ placeholder="Add contact info of people referencing you."></textarea>
+ </td>
+</tr>
+
+<tr class="odd">
+ <th colspan="2">
+ How are you involved with Mozilla?
+ </th>
+</tr>
+<tr class="odd">
+ <td colspan="2">
+ <textarea id="involved" name="involved" rows="4" placeholder="Add-ons, l10n, SUMO, QA, ..."></textarea>
+ </td>
+</tr>
+
+<tr class="even">
+ <th>
+ When did you first start contributing to Mozilla?
+ </th>
+ <td><input id="firstcontribute" name="firstcontribute" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <th>Languages Spoken:[% mandatory FILTER none %]</th>
+ <td><input id="languages" name="languages" size="40"></td>
+</tr>
+
+<tr class="even">
+ <th>How did you learn about Mozilla Reps?[% mandatory FILTER none %]</th>
+ <td><input id="learn" name="learn" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <th colspan="2">What motivates you most about joining Mozilla Reps?[% mandatory FILTER none %]</th>
+</tr>
+<tr class="odd">
+ <td colspan="2"><textarea id="motivation" name="motivation" rows="4"></textarea></td>
+</tr>
+
+<tr class="even">
+ <th colspan="2">Comments:</th>
+</tr>
+<tr class="even">
+ <td colspan="2"><textarea id="comments" name="comments" rows="4"></textarea></td>
+</tr>
+
+<tr class="odd">
+ <th>
+ I have read the
+ <a href="http://www.mozilla.com/en-US/privacy-policy" target="_blank">Mozilla Privacy Policy</a>:[% mandatory FILTER none %]
+ </th>
+ <td><input id="privacy" type="checkbox"></td>
+</tr>
+
+<tr class="even">
+ <td>&nbsp;</td>
+ <td align="right">
+ <input id="submit" type="submit" value="Submit" onclick="return submitForm()">
+ </td>
+</tr>
+
+</table>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/template/en/default/bug/create/create-remo-budget.html.tmpl b/extensions/REMO/template/en/default/bug/create/create-remo-budget.html.tmpl
new file mode 100644
index 000000000..6e393612c
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/create-remo-budget.html.tmpl
@@ -0,0 +1,295 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Reps Budget Request Form"
+ style_urls = [ 'extensions/REMO/web/styles/moz_reps.css' ]
+ javascript_urls = [ 'extensions/REMO/web/js/form_validate.js',
+ 'js/util.js',
+ 'js/field.js' ]
+ yui = [ 'autocomplete', 'calendar' ]
+%]
+
+[% IF user.in_group("mozilla-reps") %]
+
+<p>These requests will only be visible to the person who submitted the request,
+any persons designated in the CC line, and authorized members of the Mozilla
+Rep team.</p>
+
+<script language="javascript" type="text/javascript">
+function trySubmit() {
+ var firstname = document.getElementById('firstname').value;
+ var lastname = document.getElementById('lastname').value;
+ var eventpage = document.getElementById('eventpage').value;
+ var shortdesc = 'Budget Request - ' + firstname + ' ' + lastname + ' - ' + eventpage;
+ document.getElementById('short_desc').value = shortdesc;
+ document.getElementById('cc').value = document.getElementById('mentoremail').value;
+ return true;
+}
+
+function validateAndSubmit() {
+ var alert_text = '';
+ if(!isFilledOut('firstname')) alert_text += "Please enter your first name\n";
+ if(!isFilledOut('lastname')) alert_text += "Please enter your last name\n";
+ if(!isFilledOut('profilepage')) alert_text += "Please enter a Mozilla Reps profile page.\n";
+ if(!isFilledOut('eventpage')) alert_text += "Please enter an event page address.\n";
+ if(!isFilledOut('cf_due_date')) alert_text += "Please enter an event date.\n";
+ if(!isFilledOut('ambassador_hosted')) alert_text += "Please select whether this event is hosted by ambassadors.\n";
+ if(!isFilledOut('ambassador_audience')) alert_text += "Please select whether this event's main audience is ambassadors.\n";
+ if(!isFilledOut('mentoremail')) alert_text += "Please enter a valid [% terms.Bugzilla %] email for mentor.\n";
+ if(!isFilledOut('country')) alert_text += "Please enter a valid value for country.\n";
+ if(!isFilledOut('budgettotal')) alert_text += "Please enter the total budget for the event.\n";
+ if(!isFilledOut('service1') || !isFilledOut('cost1')) alert_text += "Please enter at least one service and cost value.\n";
+
+ //Everything required is filled out..try to submit the form!
+ if(alert_text == '') {
+ return trySubmit();
+ }
+
+ //alert text, stay here on the pagee
+ alert(alert_text);
+ return false;
+}
+</script>
+
+<h1>Mozilla Reps - Budget Request Form</h1>
+
+<p>
+ If your request is Community IT related please file it
+ <a href="https://bugzilla.mozilla.org/enter_bug.cgi?product=Mozilla%20Reps;component=Community%20IT%20Requests">here</a>.
+</p>
+
+<p>
+ <span class="required_star">*</span> - <span class="required_explanation">Required Fields</span>
+</p>
+
+<form method="post" action="post_bug.cgi" id="swagRequestForm" enctype="multipart/form-data"
+ onSubmit="return validateAndSubmit();">
+
+ <input type="hidden" name="format" value="remo-budget">
+ <input type="hidden" name="created-format" value="remo-budget">
+ <input type="hidden" name="product" value="Mozilla Reps">
+ <input type="hidden" name="component" value="Budget Requests">
+ <input type="hidden" name="rep_platform" value="All">
+ <input type="hidden" name="op_sys" value="Other">
+ <input type="hidden" name="priority" value="--">
+ <input type="hidden" name="version" value="unspecified">
+ <input type="hidden" name="bug_severity" id="bug_severity" value="normal">
+ <input type="hidden" name="short_desc" id="short_desc" value="">
+ <input type="hidden" name="cc" id="cc" value="">
+ <input type="hidden" name="groups" value="mozilla-reps">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table id="reps-form">
+
+<tr class="odd">
+ <th class="field_label required">First Name:</th>
+ <td>
+ <input type="text" name="firstname" id="firstname" value="" size="40" placeholder="John">
+ </td>
+</tr>
+
+<tr class="even">
+ <th class="field_label required">Last Name:</th>
+ <td>
+ <input type="text" name="lastname" id="lastname" value="" size="40" placeholder="Doe">
+ </td>
+</tr>
+
+<tr class="odd">
+ <th class="field_label required">Mozilla Reps Profile Page:</th>
+ <td>
+ <input type="text" name="profilepage" id="profilepage"
+ value="" size="40" placeholder="https://reps.mozilla.org/u/JohnDoe">
+ </td>
+</tr>
+
+<tr class="even">
+ <th class="field_label required">Event Page:</th>
+ <td>
+ <input type="text" name="eventpage" id="eventpage"
+ value="" size="40" placeholder="https://reps.mozilla.org/e/TestEvent">
+ </td>
+</tr>
+
+<tr class="odd">
+ <th class="field_label required">Event Date:</th>
+ <td>
+ <input name="cf_due_date" size="20" id="cf_due_date" value=""
+ onchange="updateCalendarFromField(this)">
+ <button type="button" class="calendar_button"
+ id="button_calendar_cf_due_date"
+ onclick="showCalendar('cf_due_date')">
+ <span>Calendar</span>
+ </button>
+ <div id="con_calendar_cf_due_date"></div>
+ <script type="text/javascript">
+ createCalendar('cf_due_date')
+ </script>
+ </td>
+</tr>
+
+<tr class="even">
+ <th class="field_label required">
+ Is this event being hosted by a<br>Firefox Student Ambassador(s)?:
+ </th>
+ <td>
+ <select id="ambassador_hosted" name="ambassador_hosted">
+ <option value="">Select One</option>
+ <option value="Yes">Yes</option>
+ <option value="No">No</option>
+ </select>
+ </td>
+</tr>
+
+<tr class="odd">
+ <th class="field_label required">
+ Is the main audience of this event<br>Firefox Student Ambassadors?:
+ </th>
+ <td>
+ <select id="ambassador_audience" name="ambassador_audience">
+ <option value="">Select One</option>
+ <option value="Yes">Yes</option>
+ <option value="No">No</option>
+ </select>
+ </td>
+</tr>
+
+<tr class="even">
+ <th class="field_label required">[% terms.Bugzilla %] Email of Your Mentor:</th>
+ <td>
+ [% INCLUDE global/userselect.html.tmpl
+ id => "mentoremail"
+ name => "mentoremail"
+ value => ""
+ size => 40
+ %]
+ </td>
+</tr>
+
+<tr class="odd">
+ <th class="field_label">Paypal Account Email:</th>
+ <td>
+ <input type="text" name="paypal" id="paypal"
+ value="" size="40" placeholder=""><br>
+ <span style="font-size: smaller;">
+ * Currently, you CANNOT make payments using other online payment services.</span>
+ </td>
+</tr>
+
+<tr class="even">
+ <th class="field_label required">Country You Reside:</th>
+ <td>
+ <input type="text" name="country" id="country"
+ value="" size="40" placeholder="USA">
+ </td>
+</tr>
+
+<tr class="odd">
+ <th class="field_label">Is advance payment needed?</th>
+ <td>
+ <input type="checkbox" name="advancepayment" id="advancepayment" value="1">
+ </td>
+</tr>
+
+<tr class="even">
+ <td><!--spacer-->&nbsp;</td>
+ <td><!--spacer-->&nbsp;</td>
+</tr>
+
+<tr class="odd">
+ <th colspan="2" class="field_label">Budget Request:</th>
+</tr>
+
+<tr class="odd">
+ <th class="field_label required">Total amount requested in $USD:</th>
+ <td>
+ <input type="text" name="budgettotal" id="budgettotal" value="" size="40">
+ </td>
+ </tr>
+
+<tr class="odd">
+ <th colspan="2" class="field_label">Costs per service:</th>
+</tr>
+
+<tr class="odd">
+ <td colspan="2">
+ <table>
+ <tr>
+ <th class="field_label required">Service 1:</th>
+ <td><input type="text" id="service1" name="service1" size="30"></td>
+ <th class="field_label required">Cost 1:</th>
+ <td><input type="text" id="cost1" name="cost1" size="30"></td>
+ </tr>
+ <tr>
+ <th class="field_lable">Service 2:</th>
+ <td><input type="text" id="service2" name="service2" size="30"></td>
+ <th class="field_lable">Cost 2:</th>
+ <td><input type="text" id="cost2" name="cost2" size="30"></td>
+ </tr>
+ <tr>
+ <th class="field_lable">Service 3:</th>
+ <td><input type="text" id="service3" name="service3" size="30"></td>
+ <th class="field_lable">Cost 3:</th>
+ <td><input type="text" id="cost3" name="cost3" size="30"></td>
+ </tr>
+ <tr>
+ <th class="field_lable">Service 4:</th>
+ <td><input type="text" id="service4" name="service4" size="30"></td>
+ <th class="field_lable">Cost 4:</th>
+ <td><input type="text" id="cost4" name="cost4" size="30"></td>
+ </tr>
+ <tr>
+ <th class="field_lable">Service 5:</th>
+ <td><input type="text" id="service5" name="service5" size="30"></td>
+ <th class="field_lable">Cost 5:</th>
+ <td><input type="text" id="cost5" name="cost5" size="30"></td>
+ </tr>
+ </table>
+ </td>
+</tr>
+
+<tr class="odd">
+ <th colspan="2" class="field_label">Additional costs:</th>
+</tr>
+
+<tr class="odd">
+ <td colspan="2">
+ <textarea id="costadditional" name="costadditional" rows="5" cols="50"></textarea>
+ </td>
+</tr>
+
+<tr class="even">
+ <td>&nbsp;</td>
+ <td align="right">
+ <input type="submit" id="commit" value="Submit Request">
+ </td>
+</tr>
+
+</table>
+
+</form>
+
+<p style="font-weight:bold;">
+ Budget requests received less than 3 weeks before the targeted launch date of the
+ event/activity in question will automatically be rejected (exceptions can be made
+ but only with council approval). This 3-week “buffer” guarantees that each budget
+ request undergoes the same thorough selection process.
+</p>
+
+<p>
+ Thanks for contacting us.
+</p>
+
+[% ELSE %]
+ <p>Sorry, you do not have access to this page.</p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/template/en/default/bug/create/create-remo-it.html.tmpl b/extensions/REMO/template/en/default/bug/create/create-remo-it.html.tmpl
new file mode 100644
index 000000000..a1085ae97
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/create-remo-it.html.tmpl
@@ -0,0 +1,294 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ onload = "init()"
+ title = "Community IT Request"
+ style_urls = [ "extensions/REMO/web/styles/moz_reps.css" ]
+%]
+
+[% USE Bugzilla %]
+[% mandatory = '<span class="mandatory" title="Required">*</span>' %]
+
+<script type="text/javascript">
+var Dom = YAHOO.util.Dom;
+
+function mandatory(elements) {
+ result = true;
+ for (i in elements) {
+ element = elements[i];
+
+ if (typeof(element) == "object") {
+ missing = true;
+ for (j = 0; j < element.length; j++) {
+ if (element[j].checked) {
+ missing = false;
+ break;
+ }
+ }
+
+ if (missing) {
+ Dom.addClass(element[0].name, 'missing');
+ } else {
+ Dom.removeClass(element[0].name, 'missing');
+ }
+ } else {
+ el = Dom.get(element);
+ value = el.value.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
+ el.value = value;
+
+ if (value == '') {
+ Dom.addClass(element, 'missing');
+ result = false;
+ } else {
+ Dom.removeClass(element, 'missing');
+ }
+ }
+ }
+ return result;
+}
+
+function submitForm() {
+ fields = [ 'name', 'mozillian', 'community', document.forms.f.items ];
+ if (Dom.get('item_hosting').checked) {
+ fields.push('hosting_visits');
+ fields.push('hosting_running');
+ }
+ if (Dom.get('item_domain').checked
+ || Dom.get('item_apps_email').checked
+ || Dom.get('item_ssl').checked
+ ) {
+ fields.push('domain_name');
+ }
+ if (Dom.get('item_discourse').checked) {
+ fields.push('discourse_names');
+ fields.push('discourse_mods');
+ }
+ if (Dom.get('item_other').checked) {
+ fields.push('other_value');
+ }
+
+ if (!mandatory(fields)) {
+ alert('Please enter all the required fields.');
+ return false;
+ }
+
+ Dom.get('short_desc').value =
+ "IT Request: " + Dom.get('community').value + ' (' + Dom.get('name').value + ')';
+ return true;
+}
+
+function setItemVisibility() {
+ if (Dom.get('item_hosting').checked) {
+ Dom.removeClass('hosting', 'bz_default_hidden');
+ } else {
+ Dom.addClass('hosting', 'bz_default_hidden');
+ }
+ if (Dom.get('item_domain').checked
+ || Dom.get('item_apps_email').checked
+ || Dom.get('item_ssl').checked
+ ) {
+ var title = [];
+ if (Dom.get('item_apps_email').checked)
+ title.push('Google Apps Email');
+ if (Dom.get('item_domain').checked)
+ title.push('Domain');
+ if (Dom.get('item_ssl').checked)
+ title.push('SSL');
+ Dom.get('domain_title').innerHTML = title.join(', ');
+ Dom.removeClass('domain', 'bz_default_hidden');
+ } else {
+ Dom.addClass('domain', 'bz_default_hidden');
+ }
+ if (Dom.get('item_discourse').checked) {
+ Dom.removeClass('discourse', 'bz_default_hidden');
+ } else {
+ Dom.addClass('discourse', 'bz_default_hidden');
+ }
+ if (Dom.get('item_other').checked) {
+ Dom.removeClass('other', 'bz_default_hidden');
+ } else {
+ Dom.addClass('other', 'bz_default_hidden');
+ }
+}
+
+function init() {
+ items = document.forms.f.items;
+ for (i = 0; i < items.length; i++) {
+ YAHOO.util.Event.on(items[i], 'click', setItemVisibility);
+ }
+ setItemVisibility();
+}
+
+</script>
+
+<noscript>
+<h1>Javascript is required to use this form.</h1>
+</noscript>
+
+<h1>Community IT Request</h1>
+
+<form method="post" action="post_bug.cgi" id="tmRequestForm" name="f">
+<input type="hidden" name="product" value="Mozilla Reps">
+<input type="hidden" name="component" value="Community IT Requests">
+<input type="hidden" name="bug_severity" value="normal">
+<input type="hidden" name="rep_platform" value="All">
+<input type="hidden" name="priority" value="--">
+<input type="hidden" name="op_sys" value="Other">
+<input type="hidden" name="version" value="unspecified">
+<input type="hidden" name="groups" value="mozilla-reps">
+<input type="hidden" name="format" value="[% format FILTER html %]">
+<input type="hidden" name="comment" id="comment" value="">
+<input type="hidden" name="short_desc" id="short_desc" value="">
+<input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table id="reps-form">
+
+<tr class="odd">
+ <th>Your Name:[% mandatory FILTER none %]</th>
+ <td><input id="name" name="name" size="40" value="[% user.name FILTER html %]"></td>
+</tr>
+
+<tr class="even">
+ <th>Mozillians.org Profile:[% mandatory FILTER none %]</th>
+ <td><input id="mozillian" name="mozillian" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <th>Reps Profile (if applicable):</th>
+ <td><input id="reps" name="reps" size="40"></td>
+</tr>
+
+<tr class="even">
+ <th>Your Community's Name:[% mandatory FILTER none %]</th>
+ <td><input id="community" name="community" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <th>
+ Items Requesting:[% mandatory FILTER none %]
+ </th>
+ <td>
+ <div id="items">
+ <div>
+ <input type="checkbox" name="items" value="hosting" id="item_hosting">
+ <label for="item_hosting">Hosting</label>
+ </div>
+ <div>
+ <input type="checkbox" name="items" value="apps_email" id="item_apps_email">
+ <label for="item_apps_email">Google Apps Emails</label>
+ </div>
+ <div>
+ <input type="checkbox" name="items" value="domain" id="item_domain">
+ <label for="item_domain">Domain</label>
+ </div>
+ <div>
+ <input type="checkbox" name="items" value="discourse" id="item_discourse">
+ <label for="item_discourse">Discourse Category</label>
+ </div>
+ <div>
+ <input type="checkbox" name="items" value="ssl" id="item_ssl">
+ <label for="item_ssl">SSL</label>
+ </div>
+ <div>
+ <input type="checkbox" name="items" value="other" id="item_other">
+ <label for="item_other">Other</label>
+ </div>
+ </div>
+ </td>
+</tr>
+
+<tbody id="hosting">
+<tr class="even">
+ <th colspan="2">Hosting</th>
+</tr>
+<tr class="odd">
+ <th>Expected visits per month:[% mandatory FILTER none %]</th>
+ <td><input id="hosting_visits" name="hosting_visits" size="40"></td>
+</tr>
+<tr class="odd">
+ <th>What will run on the hosting?:[% mandatory FILTER none %]</th>
+ <td><textarea id="hosting_running" name="hosting_running" class="small"></textarea></td>
+</tr>
+<tr class="odd">
+ <th>Data:</td>
+ <td>
+ Any data we can use to help choose the best solution (traffic graphs etc).<br>
+ <textarea id="hosting_data" name="hosting_data" class="small"></textarea>
+ </td>
+</tr>
+</tbody>
+
+<tbody id="domain">
+<tr class="even">
+ <th colspan="2" id="domain_title">Domain</th>
+</tr>
+<tr class="odd">
+ <th>Domain Name:[% mandatory FILTER none %]</th>
+ <td><input id="domain_name" name="domain_name" size="40"></td>
+</tr>
+</tbody>
+
+<tbody id="discourse">
+<tr class="even">
+ <th colspan="2">Discourse Category</th>
+</tr>
+<tr class="odd">
+ <th>Discourse Category Names:[% mandatory FILTER none %]</th>
+ <td><input id="discourse_names" name="discourse_names" size="40"></td>
+</tr>
+<tr class="odd">
+ <th>Moderators:[% mandatory FILTER none %]</th>
+ <td><input id="discourse_mods" name="discourse_mods" size="40"></td>
+</tr>
+<tr class="odd">
+ <th>Hex code of background of category tag:</th>
+ <td><input id="discourse_bg" name="discourse_bg" size="40"></td>
+</tr>
+</tbody>
+
+<tbody id="other">
+<tr class="even">
+ <th colspan="2">Other Item</th>
+</tr>
+<tr class="odd">
+ <th>Other:[% mandatory FILTER none %]</th>
+ <td><input id="other_value" name="other_value" size="40"></td>
+</tr>
+</tbody>
+
+<tr class="even">
+ <th colspan="2">
+ Other Comments
+ </th>
+</tr>
+<tr class="even">
+ <td colspan="2">
+ Please explain why you'd like the hosting, and anything else this form does not include.<br>
+ <textarea id="comments" name="comments" rows="4"></textarea>
+ </td>
+</tr>
+
+<tr class="even">
+ <td colspan="2">
+ <input id="submit" type="submit" value="Submit" onclick="return submitForm()">
+ </td>
+</tr>
+
+<tr class="even">
+ <td width="35%">&nbsp;</td>
+ <td width="65%">&nbsp;</td>
+</tr>
+
+</table>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/template/en/default/bug/create/create-remo-swag.html.tmpl b/extensions/REMO/template/en/default/bug/create/create-remo-swag.html.tmpl
new file mode 100644
index 000000000..076faef24
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/create-remo-swag.html.tmpl
@@ -0,0 +1,323 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Reps Swag Request Form"
+ javascript_urls = [ 'extensions/REMO/web/js/swag.js',
+ 'extensions/REMO/web/js/form_validate.js',
+ 'js/field.js',
+ 'js/util.js' ]
+ style_urls = [ "extensions/REMO/web/styles/moz_reps.css" ]
+ yui = [ 'calendar' ]
+%]
+
+[% IF !user.in_group("mozilla-reps") %]
+ <p>Sorry, you do not have access to this page.</p>
+ [% RETURN %]
+[% END %]
+
+
+<p>These requests will only be visible to the person who submitted the request,
+any persons designated in the CC line, and authorized members of the Mozilla Rep team.</p>
+
+<script language="javascript" type="text/javascript">
+function trySubmit() {
+ var eventname = document.getElementById('eventname').value;
+ var shortdesc = 'Swag Request - ' + eventname;
+ document.getElementById('short_desc').value = shortdesc;
+ return true;
+}
+
+function validateAndSubmit() {
+ var alert_text = '';
+ if(!isFilledOut('firstname')) alert_text += "Please enter your first name\n";
+ if(!isFilledOut('lastname')) alert_text += "Please enter your last name\n";
+ if(!isFilledOut('profilepage')) alert_text += "Please enter your Mozilla Reps profile page\n";
+ if(!isFilledOut('eventname')) alert_text += "Please enter your event name\n";
+ if(!isFilledOut('eventpage')) alert_text += "Please enter the event page.\n";
+ if(!isFilledOut('attendance')) alert_text += "Please enter the estimated attendance.\n";
+ if(!isFilledOut('ambassador_hosted')) alert_text += "Please select whether this event is hosted by ambassadors.\n";
+ if(!isFilledOut('ambassador_audience')) alert_text += "Please select whether this event's main audience is ambassadors.\n";
+ if(!isFilledOut('shiptofirstname')) alert_text += "Please enter the shipping first name\n";
+ if(!isFilledOut('shiptolastname')) alert_text += "Please enter the shipping last name\n";
+ if(!isFilledOut('shiptoaddress1')) alert_text += "Please enter the ship to address\n";
+ if(!isFilledOut('shiptocity')) alert_text += "Please enter the ship to city\n";
+ if(!isFilledOut('shiptocountry')) alert_text += "Please enter the ship to country\n";
+ if(!isFilledOut('shiptopcode')) alert_text += "Please enter the ship to postal code\n";
+ if(!isFilledOut('shiptophone')) alert_text += "Please enter the ship to contact number\n";
+
+ //Everything required is filled out..try to submit the form!
+ if(alert_text == '') {
+ return trySubmit();
+ }
+
+ //alert text, stay here on the pagee
+ alert(alert_text);
+ return false;
+}
+
+</script>
+
+<h1>Mozilla Reps - Swag Request Form</h1>
+
+<form method="post" action="post_bug.cgi" id="swagRequestForm" enctype="multipart/form-data"
+ onSubmit="return validateAndSubmit();">
+
+ <input type="hidden" name="format" value="remo-swag">
+ <input type="hidden" name="product" value="Mozilla Reps">
+ <input type="hidden" name="component" value="Swag Requests">
+ <input type="hidden" name="rep_platform" value="All">
+ <input type="hidden" name="op_sys" value="Other">
+ <input type="hidden" name="priority" value="--">
+ <input type="hidden" name="version" value="unspecified">
+ <input type="hidden" name="bug_severity" id="bug_severity" value="normal">
+ <input type="hidden" name="short_desc" id="short_desc" value="">
+ <input type="hidden" name="groups" value="mozilla-reps">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table id="reps-form">
+
+<tr class="odd">
+ <td><strong>First Name: <span style="color: red;" title="Required">*</span></strong></td>
+ <td>
+ <input type="text" name="firstname" id="firstname" placeholder="John" size="40">
+ </td>
+</tr>
+
+<tr class="even">
+ <td><strong>Last Name: <span style="color: red;" title="Required">*</span></strong></td>
+ <td>
+ <input type="text" name="lastname" id="lastname" placeholder="Doe" size="40">
+ </td>
+</tr>
+
+<tr class="odd">
+ <td>
+ <strong>Mozilla Reps Profile Page:
+ <span style="color: red;" title="Required">*</span></strong>
+ </td>
+ <td>
+ <input type="text" name="profilepage" id="profilepage" size="40">
+ </td>
+</tr>
+
+<tr class="even">
+ <td><strong>Event Name: <span style="color: red;" title="Required">*</span></strong></td>
+ <td>
+ <input type="text" name="eventname" id="eventname" size="40">
+ </td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Event Page: <span style="color: red;" title="Required">*</span></strong></td>
+ <td>
+ <input type="text" name="eventpage" id="eventpage" size="40">
+ </td>
+</tr>
+
+<tr class="even">
+ <td><strong>Estimated Attendance: <span style="color: red;" title="Required">*</span></strong></td>
+ <td>
+ <select id="attendance" name="attendance">
+ <option value="1-50">1-50</option>
+ <option value="51-200">51-200</option>
+ <option value="201-500">201-500</option>
+ <option value="501-1000+">501-1000+</option>
+ </select>
+ </td>
+</tr>
+
+<tr class="odd">
+ <td>
+ <strong>Is this event being hosted by a<br>Firefox Student Ambassador(s)?:
+ <span style="color: red;" title="Required">*</span></strong>
+ </td>
+ <td>
+ <select id="ambassador_hosted" name="ambassador_hosted">
+ <option value="">Select One</option>
+ <option value="Yes">Yes</option>
+ <option value="No">No</option>
+ </select>
+ </td>
+</tr>
+
+<tr class="even">
+ <td>
+ <strong>Is the main audience of this event<br>Firefox Student Ambassadors?:
+ <span style="color: red;" title="Required">*</span></strong>
+ </td>
+ <td>
+ <select id="ambassador_audience" name="ambassador_audience">
+ <option value="">Select One</option>
+ <option value="Yes">Yes</option>
+ <option value="No">No</option>
+ </select>
+ </td>
+</tr>
+
+<tr class="odd">
+ <td><!--spacer-->&nbsp;</td>
+ <td><!--spacer-->&nbsp;</td>
+</tr>
+
+<tr class="even">
+ <td colspan="2"><strong>Shipping Details:</strong></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Ship Before:</strong>
+ <td>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default,
+ field = bug_fields.cf_due_date
+ value = default.cf_due_date,
+ editable = 1,
+ no_tds = 1
+ %]
+ </td>
+</tr>
+
+<tr class="even">
+ <td><strong>First Name: <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptofirstname" id="shiptofirstname" placeholder="John" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Last Name: <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptolastname" id="shiptolastname" placeholder="Doe" size="40"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>Address Line 1: <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptoaddress1" id="shiptoaddress1" placeholder="123 Main St." size="40"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Address Line 2:</strong></td>
+ <td><input name="shiptoaddress2" id="shiptoaddress2" size="40"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>City: <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptocity" id="shiptocity" size="40" placeholder="Anytown"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>State/Region (if applicable):</strong></td>
+ <td><input name="shiptostate" id="shiptostate" placeholder="CA" size="40"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>Country: <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptocountry" id="shiptocountry" placeholder="USA" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Postal Code: <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptopcode" id="shiptopcode" placeholder="90210" size="40"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>Phone (including country code): <span style="color: red;" title="Required">*</span></strong></td>
+ <td><input name="shiptophone" id="shiptophone" placeholder="919-555-1212" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Custom Reference<br>
+ (Fiscal or VAT-number, if known):</strong><br><small>(if your country requires this)</small>
+ </td>
+ <td><input name="shiptoidrut" id="shiptoidrut" size="40"></td>
+</tr>
+
+<tr class="even">
+ <td colspan="2">
+ <strong>Addition information for delivery person:</strong><br>
+ <textarea id="shipadditional" name="shipadditional" rows="4"></textarea>
+ </td>
+</tr>
+
+<tr class="odd">
+ <td><!--spacer-->&nbsp;</td>
+ <td><!--spacer-->&nbsp;</td>
+</tr>
+
+<tr class="even">
+ <td colspan="2"><strong>Swag Requested:</strong></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Stickers:</strong></td>
+ <td><input type="checkbox" id="stickers" name="stickers" value="1"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>Buttons:</strong></td>
+ <td><input type="checkbox" id="buttons" name="buttons" value="1"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Lanyards:</strong></td>
+ <td><input type="checkbox" id="lanyards" name="lanyards" value="1"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>T-Shirts:</strong></td>
+ <td><input type="checkbox" id="tshirts" name="tshirts" value="1"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Roll-Up Banners:</strong></td>
+ <td><input type="checkbox" id="rollupbanners" name="rollupbanners" value="1"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>Horizontal Banner:</strong></td>
+ <td><input type="checkbox" id="horizontalbanner" name="horizontalbanner" value="1"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Booth Cloth:</strong></td>
+ <td><input type="checkbox" id="boothcloth" name="boothcloth" value="1"></td>
+</tr>
+
+<tr class="even">
+ <td><strong>Pens:</strong></td>
+ <td><input type="checkbox" id="pens" name="pens" value="1"></td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Other:</strong> (please specify)</td>
+ <td><input type="text" id="otherswag" name="otherswag" size="40"></td>
+</tr>
+
+<tr class="even">
+ <td>&nbsp;</td>
+ <td align="right">
+ <input type="submit" id="commit" value="Submit Request">
+ </td>
+</tr>
+
+</table>
+
+<p>
+ Quantities of different swag items requested that will actually be shipped
+ depend on stock availability and number of attendees. Mozilla cannot guarantee
+ that all items requested will be in stock at the time of shipment and you will
+ be notified in case an item cannot be shipped. Please request swag at least 1
+ month before desired delivery date.
+</p>
+
+<p>
+ <strong><span style="color: red;">*</span></strong> - Required field<br />
+ Thanks for contacting us.
+ You will be notified by email of any progress made in resolving your request.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/template/en/default/bug/create/create-remo-swag.xml.tmpl b/extensions/REMO/template/en/default/bug/create/create-remo-swag.xml.tmpl
new file mode 100644
index 000000000..4308bc5ac
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/create-remo-swag.xml.tmpl
@@ -0,0 +1,104 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+<?xml version="1.0" [% IF Param('utf8') %]encoding="UTF-8" [% END %]standalone="yes" ?>
+<!DOCTYPE remoswag [
+<!ELEMENT remoswag (firstname,
+ lastname,
+ wikiprofile,
+ eventname,
+ wikipage,
+ attendance,
+ shipping,
+ swagrequested)>
+<!ELEMENT firstname (#PCDATA)>
+<!ELEMENT lastname (#PCDATA)>
+<!ELEMENT wikiprofile (#PCDATA)>
+<!ELEMENT eventname (#PCDATA)>
+<!ELEMENT wikipage (#PCDATA)>
+<!ELEMENT attendance (#PCDATA)>
+<!ELEMENT shipping (shipbeforedate,
+ shiptofirstname,
+ shiptolastname,
+ shiptoaddress1,
+ shiptoaddress2,
+ shiptocity,
+ shiptostate,
+ shiptopcode,
+ shiptocountry,
+ shiptophone,
+ shiptoidrut,
+ shipadditional)>
+<!ELEMENT shipbeforedate (#PCDATA)>
+<!ELEMENT shiptofirstname (#PCDATA)>
+<!ELEMENT shiptolastname (#PCDATA)>
+<!ELEMENT shiptoaddress1 (#PCDATA)>
+<!ELEMENT shiptoaddress2 (#PCDATA)>
+<!ELEMENT shiptocity (#PCDATA)>
+<!ELEMENT shiptostate (#PCDATA)>
+<!ELEMENT shiptopcode (#PCDATA)>
+<!ELEMENT shiptocountry (#PCDATA)>
+<!ELEMENT shiptophone (#PCDATA)>
+<!ELEMENT shiptoidrut (#PCDATA)>
+<!ELEMENT shipadditional (#PCDATA)>
+<!ELEMENT swagrequested (stickers,
+ buttons,
+ posters,
+ lanyards,
+ tshirts,
+ rollupbanners,
+ horizontalbanner,
+ boothcloth,
+ pens,
+ otherswag)>
+<!ELEMENT stickers (#PCDATA)>
+<!ELEMENT buttons (#PCDATA)>
+<!ELEMENT posters (#PCDATA)>
+<!ELEMENT lanyards (#PCDATA)>
+<!ELEMENT tshirts (#PCDATA)>
+<!ELEMENT rollupbanners (#PCDATA)>
+<!ELEMENT horizontalbanners (#PCDATA)>
+<!ELEMENT boothcloth (#PCDATA)>
+<!ELEMENT pens (#PCDATA)>
+<!ELEMENT otherswag (#PCDATA)>]>
+<remoswag>
+ <firstname>[% cgi.param('firstname') FILTER xml %]</firstname>
+ <lastname>[% cgi.param('lastname') FILTER xml %]</lastname>
+ <wikiprofile>[% cgi.param('wikiprofile') FILTER xml %]</wikiprofile>
+ <eventname>[% cgi.param('eventname') FILTER xml %]</eventname>
+ <wikipage>[% cgi.param('wikipage') FILTER xml %]</wikipage>
+ <attendance> [% cgi.param('attendance') FILTER xml %]</attendance>
+ <shipping>
+ <shipbeforedate>[% cgi.param('cf_due_date') FILTER xml %]</shipbeforedate>
+ <shiptofirstname>[% cgi.param("shiptofirstname") FILTER xml %]</shiptofirstname>
+ <shiptolastname>[% cgi.param("shiptolastname") FILTER xml %]</shiptolastname>
+ <shiptoaddress1>[% cgi.param("shiptoaddress1") FILTER xml %]</shiptoaddress1>
+ <shiptoaddress2>[% cgi.param("shiptoaddress2") FILTER xml %]</shiptoaddress2>
+ <shiptocity>[% cgi.param("shiptocity") FILTER xml %]</shiptocity>
+ <shiptostate>[% cgi.param("shiptostate") FILTER xml %]</shiptostate>
+ <shiptopcode>[% cgi.param("shiptopcode") FILTER xml %]</shiptopcode>
+ <shiptocountry>[% cgi.param("shiptocountry") FILTER xml %]</shiptocountry>
+ <shiptophone>[% cgi.param("shiptophone") FILTER xml %]</shiptophone>
+ <shiptoidrut>[% cgi.param("shiptoidrut") FILTER xml %]</shiptoidrut>
+ <shipadditional>[% cgi.param('shipadditional') || '' FILTER xml %]</shipadditional>
+ </shipping>
+ <swagrequested>
+ <stickers>[% (cgi.param('stickers') ? 1 : 0) FILTER xml %]</stickers>
+ <buttons>[% (cgi.param('buttons') ? 1 : 0) FILTER xml %]</buttons>
+ <posters>[% (cgi.param('posters') ? 1 : 0) FILTER xml %]</posters>
+ <lanyards>[% (cgi.param('lanyards') ? 1 : 0) FILTER xml %]</lanyards>
+ <tshirts>[% (cgi.param('tshirts') ? 1 : 0) FILTER xml %]</tshirts>
+ <rollupbanners>[% (cgi.param('rollupbanners') ? 1 : 0) FILTER xml %]</rollupbanners>
+ <horizontalbanner>[% (cgi.param('horizontalbanner') ? 1 : 0) FILTER xml %]</horizontalbanner>
+ <boothcloth>[% (cgi.param('boothcloth') ? 1 : 0) FILTER xml %]</boothcloth>
+ <pens>[% (cgi.param('pens') ? 1 : 0) FILTER xml %]</pens>
+ <otherswag>[% cgi.param('otherswag') || '' FILTER xml %]</otherswag>
+ </swagrequested>
+</remoswag>
diff --git a/extensions/REMO/template/en/default/bug/create/created-mozreps.html.tmpl b/extensions/REMO/template/en/default/bug/create/created-mozreps.html.tmpl
new file mode 100644
index 000000000..a8a3ca112
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/created-mozreps.html.tmpl
@@ -0,0 +1,38 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the REMO Bugzilla Extension.
+ #
+ # The Initial Developer of the Original Code is the Mozilla Foundation
+ # Portions created by the Initial Developers are Copyright (C) 2011 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s): Byron Jones <glob@mozilla.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Reps - Application Form"
+
+%]
+
+<h1>Thank you!</h1>
+
+<p>
+Thank you for submitting your Mozilla Reps Application Form. A Mozilla Rep
+mentor will contact you shortly at your bugzilla email address.
+</p>
+
+<p style="font-size: x-small">
+Reference: <a href="show_bug.cgi?id=[% id FILTER uri %]">#[% id FILTER html %]</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/template/en/default/bug/create/created-remo-budget.html.tmpl b/extensions/REMO/template/en/default/bug/create/created-remo-budget.html.tmpl
new file mode 100644
index 000000000..62430bf9c
--- /dev/null
+++ b/extensions/REMO/template/en/default/bug/create/created-remo-budget.html.tmpl
@@ -0,0 +1,27 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Reps Budget Request Form"
+%]
+
+<h1>Thank you!</h1>
+
+<p>
+ Your budget request has been successfully submitted. Please make sure to
+ follow-up with your mentor so (s)he can verify your request. CC him/her
+ on the [% terms.bug %] if needed.
+</p>
+
+<p style="font-size: x-small">
+ Reference: <a href="show_bug.cgi?id=[% id FILTER uri %]">#[% id FILTER html %]</a>
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl
new file mode 100644
index 000000000..200e678be
--- /dev/null
+++ b/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl
@@ -0,0 +1,40 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the REMO Extension
+ #
+ # The Initial Developer of the Original Code is the Mozilla Foundation
+ # Portions created by the Initial Developers are Copyright (C) 2011 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Byron Jones <bjones@mozilla.com>
+ # David Lawrence <dkl@mozilla.com>
+ #%]
+
+[% IF error == "remo_payment_invalid_product" %]
+ [% title = "Mozilla Reps Payment Invalid Bug" %]
+ You can only attach budget payment information to [% terms.bugs %] under
+ the product 'Mozilla Reps' and component 'Budget Requests'.
+
+[% ELSIF error == "remo_payment_bug_edit_denied" %]
+ [% title = "Mozilla Reps Payment Bug Edit Denied" %]
+ You do not have permission to edit [% terms.bug %] '[% bug_id FILTER html %]'.
+
+[% ELSIF error == "remo_payment_cancel_dupe" %]
+ [% title = "Already filed payment request" %]
+ You already used the form to file
+ <a href="[% urlbase FILTER html %]attachment.cgi?id=[% attachid FILTER uri %]&action=edit">
+ attachment [% attachid FILTER uri %]</a>.<br>
+ <br>
+ You can either <a href="[% urlbase FILTER html %]page.cgi?id=remo-form-payment.html">
+ create a new payment request</a> or [% "go back to $terms.bug $bugid" FILTER bug_link(bugid) FILTER none %].
+
+[% END %]
diff --git a/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl b/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl
new file mode 100644
index 000000000..95c0af6e8
--- /dev/null
+++ b/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl
@@ -0,0 +1,37 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the REMO Extension
+ #
+ # The Initial Developer of the Original Code is the Mozilla Foundation
+ # Portions created by the Initial Developers are Copyright (C) 2011 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Dave Lawrence <dkl@mozilla.com>
+ #%]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+Mozilla Reps Payment Request
+----------------------------
+
+Requester info:
+
+First name: [% cgi.param('firstname') %]
+Last name: [% cgi.param('lastname') %]
+Wiki user profile: [% cgi.param('wikiprofile') %]
+Event wiki page: [% cgi.param('wikipage') %]
+Budget request [% terms.bug %]: [% cgi.param('bug_id') %]
+Have you already received payment for this event? [% IF cgi.param('receivedpayment') %]Yes[% ELSE %]No[% END %]
+
+[%+ cgi.param("comment") IF cgi.param("comment") %]
+
diff --git a/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl b/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl
new file mode 100644
index 000000000..0f5f206d3
--- /dev/null
+++ b/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl
@@ -0,0 +1,243 @@
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the REMO Extension
+ #
+ # The Initial Developer of the Original Code is the Mozilla Foundation
+ # Portions created by the Initial Developers are Copyright (C) 2011 the
+ # Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s):
+ # Dave Lawrence <dkl@mozilla.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Reps Payment Form"
+ style_urls = [ 'extensions/REMO/web/styles/moz_reps.css' ]
+ javascript_urls = [ 'extensions/REMO/web/js/form_validate.js',
+ 'js/util.js',
+ 'js/field.js' ]
+ yui = ['connection', 'json']
+%]
+
+<script language="javascript" type="text/javascript">
+
+var bug_cache = {};
+
+function validateAndSubmit() {
+ var alert_text = '';
+ if(!isFilledOut('firstname')) alert_text += "Please enter your first name\n";
+ if(!isFilledOut('lastname')) alert_text += "Please enter your last name\n";
+ if(!isFilledOut('wikiprofile')) alert_text += "Please enter a wiki user profile.\n";
+ if(!isFilledOut('wikipage')) alert_text += "Please enter a wiki page address.\n";
+ if(!isFilledOut('bug_id')) alert_text += "Please enter a valid [% terms.bug %] id to attach this additional information to.\n";
+ if(!isFilledOut('expenseform')) alert_text += "Please enter an expense form to upload.\n";
+ if(!isFilledOut('receipts')) alert_text += "Please enter a receipts file to upload.\n";
+
+ if (alert_text) {
+ alert(alert_text);
+ return false;
+ }
+
+ return true;
+}
+
+function togglePaymentInfo (e) {
+ var div = document.getElementById('paymentinfo');
+ if (e.checked == false) {
+ div.style.display = 'block';
+ }
+ else {
+ div.style.display = 'none';
+ }
+}
+
+function getBugInfo (e, div) {
+ var bug_id = e.value;
+ div = document.getElementById(div);
+
+ if (!bug_id) {
+ div.innerHTML = "";
+ return true;
+ }
+
+ div.style.display = 'block';
+
+ if (bug_cache[bug_id]) {
+ div.innerHTML = bug_cache[bug_id];
+ e.disabled = false;
+ return true;
+ }
+
+ e.disabled = true;
+ div.innerHTML = 'Getting [% terms.bug %] info...';
+
+ YAHOO.util.Connect.setDefaultPostHeader('application/json', true);
+ YAHOO.util.Connect.asyncRequest(
+ 'POST',
+ 'jsonrpc.cgi',
+ {
+ success: function(res) {
+ var bug_message = "";
+ data = YAHOO.lang.JSON.parse(res.responseText);
+ if (data.error) {
+ bug_message = "Get [% terms.bug %] failed: " + data.error.message;
+ }
+ else if (data.result) {
+ if (data.result.bugs[0].product !== 'Mozilla Reps'
+ || data.result.bugs[0].component !== 'Budget Requests')
+ {
+ bug_message = "You can only attach budget payment " +
+ "information to [% terms.bugs %] under the product " +
+ "'Mozilla Reps' and component 'Budget Requests'.";
+ }
+ else {
+ bug_message = "[% terms.Bug %] " + bug_id + " - " + data.result.bugs[0].status +
+ " - " + data.result.bugs[0].summary;
+ }
+ }
+ else {
+ bug_message = "Get [% terms.bug %] failed: " + res.responseText;
+ }
+ div.innerHTML = bug_message;
+ bug_cache[bug_id] = bug_message;
+ e.disabled = false;
+ },
+ failure: function(res) {
+ if (res.responseText) {
+ div.innerHTML = "Get [% terms.bug %] failed: " + res.responseText;
+ }
+ }
+ },
+ YAHOO.lang.JSON.stringify({
+ version: "1.1",
+ method: "Bug.get",
+ id: bug_id,
+ params: {
+ ids: [ bug_id ],
+ include_fields: [ 'product', 'component', 'status', 'summary' ]
+ }
+ })
+ );
+}
+
+</script>
+
+<h1>Mozilla Reps - Payment Form</h1>
+
+<form method="post" action="page.cgi" id="paymentForm" enctype="multipart/form-data"
+ onSubmit="return validateAndSubmit();">
+<input type="hidden" id="id" name="id" value="remo-form-payment.html">
+<input type="hidden" id="token" name="token" value="[% token FILTER html %]">
+<input type="hidden" id="action" name="action" value="commit">
+
+<table id="reps-form">
+
+<tr class="odd">
+ <td width="25%"><strong>First Name: <span style="color: red;">*</span></strong></td>
+ <td>
+ <input type="text" name="firstname" id="firstname" value="" size="40" placeholder="John">
+ </td>
+</tr>
+
+<tr class="even">
+ <td><strong>Last Name: <span style="color: red;">*</span></strong></td>
+ <td>
+ <input type="text" name="lastname" id="lastname" value="" size="40" placeholder="Doe">
+ </td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Wiki user profile:<span style="color: red;">*</span></strong></td>
+ <td>
+ <input type="text" name="wikiprofile" id="wikiprofile" value="" size="40" placeholder="JohnDoe">
+ </td>
+</tr>
+
+<tr class="even">
+ <td><strong>Event wiki page: <span style="color: red;">*</span></strong></td>
+ <td>
+ <input type="text" name="wikipage" id="wikipage" value="" size="40">
+ </td>
+</tr>
+
+<tr class="odd">
+ <td><strong>Budget request [% terms.bug %]: <span style="color: red;">*</span></strong></td>
+ <td>
+ <input type="text" name="bug_id" id="bug_id" value="" size="40"
+ onblur="getBugInfo(this,'bug_info');")>
+ </td>
+</tr>
+
+<tr class="odd">
+ <td colspan="2">
+ <div id="bug_info" style="display:none;"></div>
+ </td>
+</tr>
+
+<tr class="even">
+ <td colspan="2">
+ <strong>Have you already received payment for this event?</strong>
+ <input type="checkbox" name="receivedpayment" id="receivedpayment" value="1"
+ onchange="togglePaymentInfo(this);" checked="true">
+ <div id="paymentinfo" style="display:none;">
+ Please send an email to William at mozilla.com with all the information below:<br>
+ <br>
+ Payment information:<br>
+ Bank name:<br>
+ Bank address: <br>
+ IBAN:<br>
+ Swift code/BIC:<br>
+ Additional bank details (if necessary):
+ </div>
+ </td>
+</tr>
+
+<tr class="odd">
+ <td colspan="2">
+ <strong>Expense form and scanned receipts/invoices:</strong>
+ </td>
+</tr>
+
+<tr class="odd">
+ <td>Expense Form: <span style="color: red;">*</span></td>
+ <td><input type="file" id="expenseform" name="expenseform" size="40"></td>
+</tr>
+
+<tr class="odd">
+ <td valign="top">Receipts File: <span style="color: red;">*</span></td>
+ <td>
+ <input type="file" id="receipts" name="receipts" size="40"><br>
+ <font style="color:red;">
+ Please black out any bank account information included<br>
+ on receipts before attaching them.
+ </font>
+ </td>
+</tr>
+
+<tr class="even">
+ <td>&nbsp;</td>
+ <td align="right">
+ <input type="submit" id="commit" value="Submit Request">
+ </td>
+</tr>
+
+</table>
+
+</form>
+
+<p>
+ <strong><span style="color: red;">*</span></strong> - Required field<br>
+ Thanks for contacting us.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/REMO/web/js/form_validate.js b/extensions/REMO/web/js/form_validate.js
new file mode 100644
index 000000000..6c8fa6f07
--- /dev/null
+++ b/extensions/REMO/web/js/form_validate.js
@@ -0,0 +1,21 @@
+/**
+ * Some Form Validation and Interaction
+ **/
+//Makes sure that there is an '@' in the address with a '.'
+//somewhere after it (and at least one character in between them
+
+function isValidEmail(email) {
+ var at_index = email.indexOf("@");
+ var last_dot = email.lastIndexOf(".");
+ return at_index > 0 && last_dot > (at_index + 1);
+}
+
+//Takes a DOM element id and makes sure that it is filled out
+function isFilledOut(elem_id) {
+ var str = document.getElementById(elem_id).value;
+ return str.length>0 && str!="noneselected";
+}
+
+function isChecked(elem_id) {
+ return document.getElementById(elem_id).checked;
+}
diff --git a/extensions/REMO/web/js/swag.js b/extensions/REMO/web/js/swag.js
new file mode 100644
index 000000000..3b69bbab8
--- /dev/null
+++ b/extensions/REMO/web/js/swag.js
@@ -0,0 +1,60 @@
+/**
+ * Swag Request Form Functions
+ * Form Interal Swag Request Form
+ * dtran
+ * 7/6/09
+ **/
+
+
+function evalToNumber(numberString) {
+ if(numberString=='') return 0;
+ return parseInt(numberString);
+}
+
+function evalToNumberString(numberString) {
+ if(numberString=='') return '0';
+ return numberString;
+}
+//item_array should be an array of DOM element ids
+function getTotal(item_array) {
+ var total = 0;
+ for(var i in item_array) {
+ total += evalToNumber(document.getElementById(item_array[i]).value);
+ }
+ return total;
+}
+
+function calculateTotalSwag() {
+ document.getElementById('Totalswag').value =
+ getTotal( new Array('Lanyards',
+ 'Stickers',
+ 'Bracelets',
+ 'Tattoos',
+ 'Buttons',
+ 'Posters'));
+
+}
+
+
+function calculateTotalMensShirts() {
+ document.getElementById('mens_total').value =
+ getTotal( new Array('mens_s',
+ 'mens_m',
+ 'mens_l',
+ 'mens_xl',
+ 'mens_xxl',
+ 'mens_xxxl'));
+
+}
+
+
+function calculateTotalWomensShirts() {
+ document.getElementById('womens_total').value =
+ getTotal( new Array('womens_s',
+ 'womens_m',
+ 'womens_l',
+ 'womens_xl',
+ 'womens_xxl',
+ 'womens_xxxl'));
+
+}
diff --git a/extensions/REMO/web/styles/moz_reps.css b/extensions/REMO/web/styles/moz_reps.css
new file mode 100644
index 000000000..216bdd234
--- /dev/null
+++ b/extensions/REMO/web/styles/moz_reps.css
@@ -0,0 +1,53 @@
+#reps-form {
+ width: 700px;
+ border-spacing: 0px;
+ border: 4px solid #e0e0e0;
+}
+
+#reps-form th, #reps-form td {
+ padding: 5px;
+ vertical-align: top;
+}
+
+#reps-form .even th, #reps-form .even td {
+ background: #e0e0e0;
+}
+
+#reps-form th {
+ text-align: left;
+}
+
+#reps-form textarea {
+ font-family: Verdana, sans-serif;
+ font-size: small;
+ width: 590px;
+}
+
+#reps-form textarea.small {
+ width: 295px;
+}
+
+#reps-form .mandatory {
+ color: red;
+ font-size: 80%;
+}
+
+#reps-form .missing {
+ box-shadow: #FF0000 0 0 1.5px 1px;
+}
+
+#reps-form .hidden {
+ display: none;
+}
+
+#reps-form .subTH {
+ padding-left: 2em;
+}
+
+#reps-form .missing {
+ background: #FFC1C1;
+}
+
+.yui-calcontainer {
+ z-index: 2;
+}