BSA Logo
BSAとは?

BSA(The Business Software Alliance/ビジネス・ソフトウェア・アライアンス)は、世界中のソフトウェア企業を代表する業界団体であると共に、不正なソフトウェアの使用の取り締まりを行っています。BSAは、会員およびその顧客を支援するため、不正なソフトウェア使用のリスクに対する認識を高め、ライセンス遵守を促進し、世界中でソフトウェア導入を推進しています。

BSA の主な活動内容は?

正規ソフトウェアの使用促進、企業向けの教育活動、違反行為の調査と対応。

ソフトウェアの違法コピー・乱用とは?

無許諾、偽造、または違法に配布されたソフトウェアを使用する行為を指します。

なぜBSA に報告すべきなのか?

BSAへの報告は、公正な競争環境の維持、知的財産の保護、そして高品質かつ安全なソフトウェアの使用促進につながります。

BSA に報告することで、最高100万円の報奨金を受け取ることができるほか、
ご希望の慈善団体に寄付することも可能です。

報告対象の企業・団体

*は入力必須項目です

エンドユーザー
会社の種類を選択してください
会社名は必須です
日本
国を選択してください
都道府県を選択してください
市を選択してください
住所は必須です
郵便番号は必須です

ソフトウェア情報

ソフトウェア #1
Please select a software title
Please select number of installed software
Please select number of purchased software
Please select number of desktop computers

クリックしてファイルを選択するか、ここにドラッグ&ドロップしてください。

連絡先

⚠️ 重要: ご入力いただいた報告内容をBSAにて確認後、BSAから委託を受けた弁護士より、メールアドレス宛に連絡させていただきます。ご提供いただいた情報は厳重に機密保持されますのでご安心ください。
ソフトウェアのタイトルを選択してください
インストール済みソフトウェアの数を選択してください
海賊版ソフトウェアの数を選択してください
Please select number of desktop computers
`; softwareContainer.appendChild(softwareEntry); // Initialize Select2 for new dropdowns $(softwareEntry).find('.select2-dropdown').select2({ placeholder: function () { return $(this).data('placeholder') || 'Select an option'; }, allowClear: false, width: '100%' }).on('select2:open', function (e) { setTimeout(function () { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } }, 100); }); // Add validation to new fields const newFields = softwareEntry.querySelectorAll('select[required]'); newFields.forEach(field => { const errorDiv = field.nextElementSibling; $(field).on('select2:select select2:unselect', function () { validateField(field, errorDiv, getErrorMessage(field.name)); }); }); // Scroll to new entry softwareEntry.scrollIntoView({ behavior: 'smooth', block: 'center' }); } // Global function to remove software entry window.removeSoftwareEntry = function (button) { const entry = button.closest('.software-entry'); const allEntries = document.querySelectorAll('.software-entry'); if (allEntries.length > 1) { // Destroy Select2 instances before removing $(entry).find('.select2-dropdown').select2('destroy'); entry.remove(); renumberSoftwareEntries(); } else { alert('少なくとも一つのソフトウェアエントリが必要です。'); } }; function renumberSoftwareEntries() { const entries = document.querySelectorAll('.software-entry'); entries.forEach((entry, index) => { const number = index + 1; const title = entry.querySelector('h5'); title.textContent = `ソフトウェア名 #${number}`; // Update field names const fields = entry.querySelectorAll('select[name^="software"], select[name^="desktop"]'); fields.forEach(field => { const baseName = field.name.split('_')[0]; field.name = `${baseName}_${number}`; }); }); softwareCounter = entries.length; } // Form validation const form = document.querySelector('form'); const staticRequiredFields = [ { name: 'companyName', message: '会社名は必須です' }, // Company name is required { name: 'companyType', message: '会社の種類を選択してください' }, // Please select a company type { name: 'country', message: '国を選択してください' }, // Please select a country { name: 'address', message: '住所は必須です' }, // Address is required { name: 'city', message: '市を選択してください' }, // Please select a city { name: 'prefecture', message: '都道府県を選択してください' }, // Please select a prefecture/state { name: 'postalCode', message: '郵便番号は必須です' } // Postal code is required ]; function getErrorMessage(fieldName) { const errorMessages = { softwareName: 'ソフトウェアタイトルを選択してください', // Please select a software title softwareInstalled: 'インストールされているソフトウェアの数を選択してください', // Please select number of installed software softwarePirated: '海賊版ソフトウェアの数を選択してください', // Please select number of pirated software desktopComputers: 'デスクトップコンピュータの数を選択してください' // Please select number of desktop computers }; const baseName = fieldName.split('_')[0]; return errorMessages[baseName] || ''; } // Real-time validation for static fields staticRequiredFields.forEach(field => { const element = form.querySelector(`[name="${field.name}"]`); if (element) { const errorDiv = element.nextElementSibling; if (element.tagName === 'SELECT') { $(element).on('select2:select select2:unselect', function () { validateField(element, errorDiv, field.message); }); } else { element.addEventListener('blur', () => validateField(element, errorDiv, field.message)); element.addEventListener('input', () => { if (element.value.trim()) { clearError(element, errorDiv); } }); } } }); // Real-time validation for initial software fields const initialSoftwareFields = document.querySelectorAll('#software-container select[required]'); initialSoftwareFields.forEach(field => { const errorDiv = field.nextElementSibling; $(field).on('select2:select select2:unselect', function () { validateField(field, errorDiv, getErrorMessage(field.name)); }); }); function validateField(element, errorDiv, message) { const value = element.value ? element.value.trim() : ''; if (!value) { showError(element, errorDiv, message); return false; } else { clearError(element, errorDiv); return true; } } function showError(element, errorDiv, message) { if (element.tagName === 'SELECT') { $(element).next('.select2-container').find('.select2-selection').addClass('field-error'); } else { element.classList.add('field-error'); } if (errorDiv && errorDiv.classList.contains('error-message')) { errorDiv.textContent = message; errorDiv.classList.remove('d-none'); } } function clearError(element, errorDiv) { if (element.tagName === 'SELECT') { $(element).next('.select2-container').find('.select2-selection').removeClass('field-error'); } else { element.classList.remove('field-error'); } if (errorDiv && errorDiv.classList.contains('error-message')) { errorDiv.classList.add('d-none'); } } // Force re-initialize Select2 for any missed dropdowns after delays setTimeout(function () { console.log('Running delayed Select2 check...'); $('select.select2-dropdown').each(function () { if (!$(this).hasClass('select2-hidden-accessible')) { console.log('Late initialization for:', $(this).attr('name')); $(this).select2({ placeholder: $(this).data('placeholder') || 'Select an option', allowClear: false, width: '100%', theme: 'bootstrap-5' }).on('select2:open', function (e) { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } setTimeout(function () { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } }, 50); setTimeout(function () { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } }, 150); }); } }); console.log('Delayed initialization complete'); }, 500); // Additional fallback for software fields specifically setTimeout(function () { console.log('Running software-specific Select2 check...'); $('#software-container select').each(function () { if (!$(this).hasClass('select2-hidden-accessible')) { console.log('Software field late init:', $(this).attr('name')); $(this).select2({ placeholder: $(this).data('placeholder') || 'Select an option', allowClear: false, width: '100%', theme: 'bootstrap-5' }).on('select2:open', function (e) { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } setTimeout(function () { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } }, 50); setTimeout(function () { const searchField = document.querySelector('.select2-search__field'); if (searchField) { searchField.focus(); } }, 150); }); } }); }, 1000); // Form submission validation form.addEventListener('submit', function (e) { console.log('!!!!!') let isValid = validateForm(e, form); if (isValid) sendForm(e, form); }); $('#submit_button').on('click', (e) => { console.log('!!!!!') let isValid = validateForm(e, form); if (isValid) sendForm(e, form); }) function validateForm(e, form) { e.preventDefault(); let isValid = true; // Validate static fields staticRequiredFields.forEach(field => { const element = form.querySelector(`[name="${field.name}"]`); if (element) { const errorDiv = element.nextElementSibling; if (!validateField(element, errorDiv, field.message)) { isValid = false; } } }); // Validate all software fields const allSoftwareFields = document.querySelectorAll('#software-container select[required]'); allSoftwareFields.forEach(field => { const errorDiv = field.nextElementSibling; if (!validateField(field, errorDiv, getErrorMessage(field.name))) { isValid = false; } }); console.log('submission valid: ', isValid) if (isValid) { // Show success message // alert('Thank you for your report! We will review it and contact you if additional information is needed.'); // Optionally scroll to top or redirect // window.scrollTo({ top: 0, behavior: 'smooth' }); } else { // Scroll to first error const firstError = form.querySelector('.field-error'); const firstSelect2Error = form.querySelector('.select2-selection.field-error'); if (firstError || firstSelect2Error) { const errorElement = firstError || firstSelect2Error; errorElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); if (firstError && firstError.focus) { firstError.focus(); } } // Show validation summary alert('アスタリスク(*)で印された必須項目をすべて入力してください'); } return isValid; } async function sendForm(e, form) { e.preventDefault(); // stop normal form submission const formData = new FormData(form); // grab all form fields const params = new URLSearchParams(window.location.search); params.set('submit', '1'); try { const response = await fetch(`/r/report/japan.aspx?${params.toString()}`, { method: 'POST', body: formData, }); if (!response.ok) { throw new Error(`Server error: ${response.status}`); } const result = await response.text(); console.log('Server response:', result); if (result == 'Submission successful'){ window.location = '/r/report/japan_thankyou.aspx' }else{ document.querySelector('#error_output').style.display = 'block' } } catch (err) { console.error('Fetch error:', err); document.querySelector('#error_output').style.display = 'block' } } }); $(document).ready(() => { const fileInput = document.getElementById("ImageFiles"); const dropArea = document.getElementById("ImageFiles_drop-area"); fileInput.addEventListener("change", handleFileSelect, false) const uuid2 = self.crypto.randomUUID(); document.getElementById("ImageFiles_guid").value = uuid2; // Intercept file drop and transfer to hidden input dropArea.addEventListener("drop", (e) => { const newFiles = Array.from(e.dataTransfer.files); const existingFiles = Array.from(fileInput.files); const combinedFiles = [...existingFiles, ...newFiles]; // Build a new DataTransfer to hold all files const dataTransfer = new DataTransfer(); combinedFiles.forEach(file => dataTransfer.items.add(file)); fileInput.files = dataTransfer.files; // alert('1'); fileInput.dispatchEvent(new Event("change")); }); });