Prepmart Premium Unlocker & PDF Exporter

Remove subscription popups, unlock premium features, remove ads, and export pages to PDF in A4 format

Size

13.0 KB

Version

1.1.1

Created

Nov 15, 2025

Updated

about 1 month ago

1// ==UserScript==
2// @name		Prepmart Premium Unlocker & PDF Exporter
3// @description		Remove subscription popups, unlock premium features, remove ads, and export pages to PDF in A4 format
4// @version		1.1.1
5// @match		https://*.prepmart.in/*
6// @icon		https://prepmart.in/prepmart-favicon.png?1763199057
7// @require		https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.10.1/html2pdf.bundle.min.js
8// ==/UserScript==
9(function() {
10    'use strict';
11
12    console.log('Prepmart Premium Unlocker & PDF Exporter - Extension loaded');
13
14    // Utility function to debounce
15    function debounce(func, wait) {
16        let timeout;
17        return function executedFunction(...args) {
18            const later = () => {
19                clearTimeout(timeout);
20                func(...args);
21            };
22            clearTimeout(timeout);
23            timeout = setTimeout(later, wait);
24        };
25    }
26
27    // Remove subscription popup and overlays
28    function removeSubscriptionPopup() {
29        console.log('Removing subscription popups...');
30        
31        // Remove subscription modal
32        const subscriptionPopup = document.querySelector('#subscriptionPopup');
33        if (subscriptionPopup) {
34            subscriptionPopup.remove();
35            console.log('Subscription popup removed');
36        }
37
38        // Remove modal backdrops
39        const backdrops = document.querySelectorAll('.modal-backdrop');
40        backdrops.forEach(backdrop => {
41            backdrop.remove();
42            console.log('Modal backdrop removed');
43        });
44
45        // Remove any modal-open class from body
46        document.body.classList.remove('modal-open');
47        document.body.style.overflow = '';
48        document.body.style.paddingRight = '';
49    }
50
51    // Remove sign-in prompts and login modals
52    function removeSignInPrompts() {
53        console.log('Removing sign-in prompts...');
54        
55        // Common selectors for login/signin elements
56        const loginSelectors = [
57            '[id*="login"]',
58            '[id*="signin"]',
59            '[class*="login"]',
60            '[class*="signin"]',
61            '[class*="auth-modal"]',
62            '[class*="sign-in"]',
63            'div[role="dialog"][aria-labelledby*="login"]',
64            'div[role="dialog"][aria-labelledby*="signin"]'
65        ];
66
67        loginSelectors.forEach(selector => {
68            const elements = document.querySelectorAll(selector);
69            elements.forEach(el => {
70                // Check if it's a modal or popup
71                if (el.classList.contains('modal') || el.classList.contains('popup') || 
72                    el.getAttribute('role') === 'dialog') {
73                    el.remove();
74                    console.log('Sign-in element removed:', selector);
75                }
76            });
77        });
78    }
79
80    // Remove ads and banners
81    function removeAdsAndBanners() {
82        console.log('Removing ads and banners...');
83        
84        const adSelectors = [
85            '[id*="ad"]',
86            '[class*="advertisement"]',
87            '[class*="banner"]',
88            '[class*="promo"]',
89            '[class*="sponsored"]',
90            'iframe[src*="ads"]',
91            'iframe[src*="doubleclick"]',
92            'div[class*="ad-"]',
93            'aside[class*="ad"]',
94            '.google-ad',
95            '.ad-container',
96            '.banner-ad'
97        ];
98
99        adSelectors.forEach(selector => {
100            const elements = document.querySelectorAll(selector);
101            elements.forEach(el => {
102                // Only remove if it looks like an ad (not part of main content)
103                const text = el.textContent.toLowerCase();
104                if (text.includes('advertisement') || text.includes('sponsored') || 
105                    el.offsetHeight < 300 && el.querySelector('iframe')) {
106                    el.style.display = 'none';
107                    console.log('Ad/Banner hidden:', selector);
108                }
109            });
110        });
111    }
112
113    // Unlock premium features and remove question limits
114    function unlockPremiumFeatures() {
115        console.log('Unlocking premium features...');
116        
117        // Remove any blur effects on content
118        const blurredElements = document.querySelectorAll('[style*="blur"]');
119        blurredElements.forEach(el => {
120            el.style.filter = 'none';
121            el.style.webkitFilter = 'none';
122            console.log('Removed blur effect');
123        });
124
125        // Remove overlay locks
126        const overlays = document.querySelectorAll('[class*="overlay"], [class*="lock"], [class*="premium"]');
127        overlays.forEach(overlay => {
128            if (overlay.style.position === 'absolute' || overlay.style.position === 'fixed') {
129                overlay.remove();
130                console.log('Removed premium overlay');
131            }
132        });
133
134        // Enable disabled elements
135        const disabledElements = document.querySelectorAll('[disabled], [class*="disabled"]');
136        disabledElements.forEach(el => {
137            el.removeAttribute('disabled');
138            el.classList.remove('disabled');
139        });
140
141        // Remove question limit warnings
142        const limitWarnings = document.querySelectorAll('[class*="limit"], [class*="quota"]');
143        limitWarnings.forEach(warning => {
144            const text = warning.textContent.toLowerCase();
145            if (text.includes('limit') || text.includes('quota') || text.includes('reached')) {
146                warning.remove();
147                console.log('Removed limit warning');
148            }
149        });
150    }
151
152    // Add PDF download button
153    function addPDFDownloadButton() {
154        console.log('Adding PDF download button...');
155        
156        // Check if button already exists
157        if (document.querySelector('#prepmart-pdf-download-btn')) {
158            return;
159        }
160
161        // Create download button
162        const downloadBtn = document.createElement('button');
163        downloadBtn.id = 'prepmart-pdf-download-btn';
164        downloadBtn.innerHTML = '<i class="fa fa-download"></i> Download PDF';
165        downloadBtn.style.cssText = `
166            position: fixed;
167            bottom: 30px;
168            right: 30px;
169            z-index: 9999;
170            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
171            color: white;
172            border: none;
173            padding: 15px 25px;
174            border-radius: 50px;
175            font-size: 16px;
176            font-weight: bold;
177            cursor: pointer;
178            box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
179            transition: all 0.3s ease;
180            display: flex;
181            align-items: center;
182            gap: 10px;
183        `;
184
185        // Add hover effect
186        downloadBtn.addEventListener('mouseenter', () => {
187            downloadBtn.style.transform = 'scale(1.05)';
188            downloadBtn.style.boxShadow = '0 6px 20px rgba(0, 0, 0, 0.4)';
189        });
190
191        downloadBtn.addEventListener('mouseleave', () => {
192            downloadBtn.style.transform = 'scale(1)';
193            downloadBtn.style.boxShadow = '0 4px 15px rgba(0, 0, 0, 0.3)';
194        });
195
196        // Add click handler for PDF download
197        downloadBtn.addEventListener('click', async () => {
198            console.log('PDF download initiated...');
199            
200            // Show loading state
201            const originalText = downloadBtn.innerHTML;
202            downloadBtn.innerHTML = '<i class="fa fa-spinner fa-spin"></i> Generating PDF...';
203            downloadBtn.disabled = true;
204
205            try {
206                // Get the main content area - try multiple selectors
207                let contentElement = document.querySelector('#questionaire') || 
208                                   document.querySelector('main') || 
209                                   document.querySelector('.container') || 
210                                   document.querySelector('#content') || 
211                                   document.body;
212
213                console.log('Content element selected:', contentElement.tagName, contentElement.id || contentElement.className);
214
215                // Create a wrapper div with proper styling
216                const wrapper = document.createElement('div');
217                wrapper.style.cssText = `
218                    width: 210mm;
219                    padding: 20px;
220                    background: white;
221                    color: black;
222                    font-family: Arial, sans-serif;
223                    font-size: 14px;
224                    line-height: 1.6;
225                `;
226
227                // Clone the content
228                const clonedContent = contentElement.cloneNode(true);
229
230                // Remove unwanted elements from clone
231                const unwantedSelectors = [
232                    '#prepmart-pdf-download-btn',
233                    'script',
234                    'nav',
235                    'header',
236                    'footer',
237                    '.modal',
238                    '.popup',
239                    '[class*="advertisement"]',
240                    'iframe',
241                    '.alert-div'
242                ];
243
244                unwantedSelectors.forEach(selector => {
245                    const elements = clonedContent.querySelectorAll(selector);
246                    elements.forEach(el => el.remove());
247                });
248
249                // Apply inline styles to preserve formatting
250                const allElements = clonedContent.querySelectorAll('*');
251                allElements.forEach(el => {
252                    try {
253                        const computedStyle = window.getComputedStyle(el);
254                        el.style.color = computedStyle.color || 'black';
255                        el.style.backgroundColor = computedStyle.backgroundColor;
256                        el.style.fontSize = computedStyle.fontSize;
257                        el.style.fontWeight = computedStyle.fontWeight;
258                        el.style.padding = computedStyle.padding;
259                        el.style.margin = computedStyle.margin;
260                        el.style.border = computedStyle.border;
261                    } catch (e) {
262                        // Skip elements that can't be styled
263                        console.log('Could not style element:', e);
264                    }
265                });
266
267                wrapper.appendChild(clonedContent);
268
269                // Configure PDF options for A4 size
270                const opt = {
271                    margin: [10, 10, 10, 10],
272                    filename: `prepmart-${Date.now()}.pdf`,
273                    image: { type: 'jpeg', quality: 0.98 },
274                    html2canvas: { 
275                        scale: 2,
276                        useCORS: true,
277                        logging: true,
278                        letterRendering: true,
279                        allowTaint: true,
280                        backgroundColor: '#ffffff'
281                    },
282                    jsPDF: { 
283                        unit: 'mm', 
284                        format: 'a4', 
285                        orientation: 'portrait' 
286                    },
287                    pagebreak: { mode: ['avoid-all', 'css', 'legacy'] }
288                };
289
290                // Generate PDF
291                console.log('Starting PDF generation...');
292                await html2pdf().set(opt).from(wrapper).save();
293                
294                console.log('PDF generated successfully');
295                
296                // Show success message
297                downloadBtn.innerHTML = '<i class="fa fa-check"></i> Downloaded!';
298                setTimeout(() => {
299                    downloadBtn.innerHTML = originalText;
300                    downloadBtn.disabled = false;
301                }, 2000);
302
303            } catch (error) {
304                console.error('PDF generation failed:', error);
305                downloadBtn.innerHTML = '<i class="fa fa-exclamation-triangle"></i> Failed';
306                setTimeout(() => {
307                    downloadBtn.innerHTML = originalText;
308                    downloadBtn.disabled = false;
309                }, 2000);
310            }
311        });
312
313        document.body.appendChild(downloadBtn);
314        console.log('PDF download button added');
315    }
316
317    // Main initialization function
318    function init() {
319        console.log('Initializing Prepmart Premium Unlocker...');
320        
321        // Remove subscription popup immediately
322        removeSubscriptionPopup();
323        
324        // Remove sign-in prompts
325        removeSignInPrompts();
326        
327        // Remove ads and banners
328        removeAdsAndBanners();
329        
330        // Unlock premium features
331        unlockPremiumFeatures();
332        
333        // Add PDF download button
334        addPDFDownloadButton();
335    }
336
337    // Run on page load
338    if (document.readyState === 'loading') {
339        document.addEventListener('DOMContentLoaded', init);
340    } else {
341        init();
342    }
343
344    // Watch for dynamic content changes
345    const observer = new MutationObserver(debounce(() => {
346        removeSubscriptionPopup();
347        removeSignInPrompts();
348        removeAdsAndBanners();
349        unlockPremiumFeatures();
350    }, 500));
351
352    // Start observing
353    observer.observe(document.body, {
354        childList: true,
355        subtree: true
356    });
357
358    console.log('Prepmart Premium Unlocker - Fully initialized');
359
360})();
Prepmart Premium Unlocker & PDF Exporter | Robomonkey