CINXE.COM
Crossref Status
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <!-- force IE browsers in compatibility mode to use their most aggressive rendering engine --> <meta charset="utf-8"> <title>Crossref Status</title> <meta name="description" content="Welcome to Crossref's home for real-time and historical data on system performance."> <!-- Mobile viewport optimization --> <meta name="HandheldFriendly" content="True"> <meta name="MobileOptimized" content="320"> <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0"> <!-- Time this page was rendered - http://purl.org/dc/terms/issued --> <meta name="issued" content="1732336067"> <!-- Mobile IE allows us to activate ClearType technology for smoothing fonts for easy reading --> <meta http-equiv="cleartype" content="on"> <!-- Le fonts --> <style> @font-face { font-family: 'proxima-nova'; src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaLight-f0b2f7c12b6b87c65c02d3c1738047ea67a7607fd767056d8a2964cc6a2393f7.eot?host=status.crossref.org'); src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaLight-f0b2f7c12b6b87c65c02d3c1738047ea67a7607fd767056d8a2964cc6a2393f7.eot?host=status.crossref.org#iefix') format('embedded-opentype'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaLight-e642ffe82005c6208632538a557e7f5dccb835c0303b06f17f55ccf567907241.woff?host=status.crossref.org') format('woff'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaLight-0f094da9b301d03292f97db5544142a16f9f2ddf50af91d44753d9310c194c5f.ttf?host=status.crossref.org') format('truetype'); font-weight:300; font-style:normal; } @font-face { font-family: 'proxima-nova'; src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegular-366d17769d864aa72f27defaddf591e460a1de4984bb24dacea57a9fc1d14878.eot?host=status.crossref.org'); src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegular-366d17769d864aa72f27defaddf591e460a1de4984bb24dacea57a9fc1d14878.eot?host=status.crossref.org#iefix') format('embedded-opentype'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegular-2ee4c449a9ed716f1d88207bd1094e21b69e2818b5cd36b28ad809dc1924ec54.woff?host=status.crossref.org') format('woff'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegular-a40a469edbd27b65b845b8000d47445a17def8ba677f4eb836ad1808f7495173.ttf?host=status.crossref.org') format('truetype'); font-weight:400; font-style:normal; } @font-face { font-family: 'proxima-nova'; src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegularIt-0bf83a850b45e4ccda15bd04691e3c47ae84fec3588363b53618bd275a98cbb7.eot?host=status.crossref.org'); src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegularIt-0bf83a850b45e4ccda15bd04691e3c47ae84fec3588363b53618bd275a98cbb7.eot?host=status.crossref.org#iefix') format('embedded-opentype'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegularIt-0c394ec7a111aa7928ea470ec0a67c44ebdaa0f93d1c3341abb69656cc26cbdd.woff?host=status.crossref.org') format('woff'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaRegularIt-9e43859f8015a4d47d9eaf7bafe8d1e26e3298795ce1f4cdb0be0479b8a4605e.ttf?host=status.crossref.org') format('truetype'); font-weight:400; font-style:italic; } @font-face { font-family: 'proxima-nova'; src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaSemibold-09566917307251d22021a3f91fc646f3e45f8d095209bcd2cded8a1979f06e54.eot?host=status.crossref.org'); src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaSemibold-09566917307251d22021a3f91fc646f3e45f8d095209bcd2cded8a1979f06e54.eot?host=status.crossref.org#iefix') format('embedded-opentype'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaSemibold-86724fb2152613d735ba47c3f47a9ad2424b898bea4bece213dacee40344f966.woff?host=status.crossref.org') format('woff'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaSemibold-cf3e4eb7fbdf6fb83e526cc2a0141e55b01097e6e1abfd4cbdc3eda75d183f74.ttf?host=status.crossref.org') format('truetype'); font-weight:500; font-style:normal; } @font-face { font-family: 'proxima-nova'; src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaBold-622ea489d20e12e691663f83217105e957e2d3d09703707d40155a29c06cc9d9.eot?host=status.crossref.org'); src: url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaBold-622ea489d20e12e691663f83217105e957e2d3d09703707d40155a29c06cc9d9.eot?host=status.crossref.org#iefix') format('embedded-opentype'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaBold-c8dc577ff7f76d2fc199843e38c04bb2e9fd15889421358d966a9f846c2ed1cd.woff?host=status.crossref.org') format('woff'), url('https://dka575ofm4ao0.cloudfront.net/assets/ProximaNovaBold-27177fe9242acbe089276ee587feef781446667ffe9b6fdc5b7fe21ad73e12f3.ttf?host=status.crossref.org') format('truetype'); font-weight:700; font-style:normal; } </style> <link rel="shortcut icon" type="image/x-icon" href="//dka575ofm4ao0.cloudfront.net/pages-favicon_logos/original/29864/UJ0M0ItGTX6M3u0guLUD" /> <link rel="shortcut icon" href='//dka575ofm4ao0.cloudfront.net/pages-favicon_logos/original/29864/UJ0M0ItGTX6M3u0guLUD'> <link rel="alternate" type="application/atom+xml" href="https://status.crossref.org/history.atom" title="Crossref Status History - Atom Feed"> <link rel="alternate" type="application/rss+xml" href="https://status.crossref.org/history.rss" title="Crossref Status History - RSS Feed"> <!-- Canonical Link to ensure that only the custom domain is indexed when present --> <link rel="canonical" href="https://status.crossref.org"> <meta name="_globalsign-domain-verification" content="y_VzfckMy4iePo5oDJNivyYIjh8LffYa4jzUndm_bZ"/> <link rel="alternate" type="application/atom+xml" title="ATOM" href="https://status.crossref.org/history.atom" /> <!-- Le styles --> <link rel="stylesheet" media="screen" href="https://dka575ofm4ao0.cloudfront.net/packs/0.8826066e0f95dc57bbe6.css" /> <link rel="stylesheet" media="all" href="https://dka575ofm4ao0.cloudfront.net/assets/status/status_manifest-260e48dd9b8c9b04e8d6c6286f76aecb8ac22f273beea6dba3eee902141bcbfe.css" /> <script src="https://dka575ofm4ao0.cloudfront.net/assets/jquery-3.5.1.min-729e416557a365062a8a20f0562f18aa171da57298005d392312670c706c68de.js"></script> <script> window.pageColorData = {"blue":"#3EB1C8","border":"#D8D2C4","body_background":"#FFFFFF","font":"#4F5858","graph":"#3EB1C8","green":"#00AB84","light_font":"#242323","link":"#017698","orange":"#FFA300","red":"#E74C3C","yellow":"#FFC72C","no_data":"#B3BAC5"}; </script> <style> /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ /* BODY BACKGROUND */ body, .layout-content.status.status-api .section .example-container .example-opener .color-secondary, .grouped-items-selector, .layout-content.status.status-full-history .history-nav a.current, div[id^="subscribe-modal"] .modal-footer, div[id^="subscribe-modal"], div[id^="updates-dropdown"] .updates-dropdown-section, #uptime-tooltip .tooltip-box { background-color:#FFFFFF; } #uptime-tooltip .pointer-container .pointer-smaller { border-bottom-color:#FFFFFF; } /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ /* PRIMARY FONT COLOR */ body.status, .color-primary, .color-primary:hover, .layout-content.status-index .status-day .update-title.impact-none a, .layout-content.status-index .status-day .update-title.impact-none a:hover, .layout-content.status-index .timeframes-container .timeframe.active, .layout-content.status-full-history .month .incident-container .impact-none, .layout-content.status.status-index .incidents-list .incident-title.impact-none a, .incident-history .impact-none, .layout-content.status .grouped-items-selector.inline .grouped-item.active, .layout-content.status.status-full-history .history-nav a.current, .layout-content.status.status-full-history .history-nav a:not(.current):hover, div[id^="subscribe-modal"] .modal-header .close, .grouped-item-label, #uptime-tooltip .tooltip-box .tooltip-content .related-events .related-event a.related-event-link { color:#4F5858; } .layout-content.status.status-index .components-statuses .component-container .name { color:#4F5858; color:rgba(79,88,88,.8); } /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ /* SECONDARY FONT COLOR */ small, .layout-content.status .table-row .date, .color-secondary, .layout-content.status .grouped-items-selector.inline .grouped-item, .layout-content.status.status-full-history .history-footer .pagination a.disabled, .layout-content.status.status-full-history .history-nav a, #uptime-tooltip .tooltip-box .tooltip-content .related-events #related-event-header { color:#242323; } /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ /* BORDER COLOR */ body.status .layout-content.status .border-color, hr, .tooltip-base, .markdown-display table, div[id^="subscribe-modal"], #uptime-tooltip .tooltip-box { border-color:#D8D2C4; } div[id^="subscribe-modal"] .modal-footer, .markdown-display table td { border-top-color:#D8D2C4; } .markdown-display table td + td, .markdown-display table th + th { border-left-color:#D8D2C4; } div[id^="subscribe-modal"] .modal-header, #uptime-tooltip .pointer-container .pointer-larger { border-bottom-color:#D8D2C4; } #uptime-tooltip .tooltip-box .outage-field { /* Generate the background-color for the outage-field from the css_body_background_color and css_border_color. For the default background (#ffffff) and default css_border_color (#e0e0e0), use the luminosity of the default background with a magic number to arrive at the original outage-field background color (#f4f5f7). I used the formula Target Color = Color * alpha + Background * (1 - alpha) to find the magic number of ~0.08. For darker css_body_background_color, luminosity values are lower so alpha trends toward becoming transparent (thus outage-field background becomes same as css_body_background_color). */ background-color: rgba(216,210,196,0.31); /* outage-field border-color alpha is inverse to the luminosity of css_body_background_color. That is to say, with a default white background this border is transparent, but on a black background, it's opaque css_border_color. */ border-color: rgba(216,210,196,0.0); } /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ /* CSS REDS */ .layout-content.status.status-index .status-day .update-title.impact-critical a, .layout-content.status.status-index .status-day .update-title.impact-critical a:hover, .layout-content.status.status-index .page-status.status-critical, .layout-content.status.status-index .unresolved-incident.impact-critical .incident-title, .flat-button.background-red { background-color:#E74C3C; } .layout-content.status-index .components-statuses .component-container.status-red:after, .layout-content.status-full-history .month .incident-container .impact-critical, .layout-content.status-incident .incident-name.impact-critical, .layout-content.status.status-index .incidents-list .incident-title.impact-critical a, .status-red .icon-indicator, .incident-history .impact-critical, .components-container .component-inner-container.status-red .component-status, .components-container .component-inner-container.status-red .icon-indicator { color:#E74C3C; } .layout-content.status.status-index .unresolved-incident.impact-critical .updates { border-color:#E74C3C; } /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ /* CSS ORANGES */ .layout-content.status.status-index .status-day .update-title.impact-major a, .layout-content.status.status-index .status-day .update-title.impact-major a:hover, .layout-content.status.status-index .page-status.status-major, .layout-content.status.status-index .unresolved-incident.impact-major .incident-title { background-color:#FFA300; } .layout-content.status-index .components-statuses .component-container.status-orange:after, .layout-content.status-full-history .month .incident-container .impact-major, .layout-content.status-incident .incident-name.impact-major, .layout-content.status.status-index .incidents-list .incident-title.impact-major a, .status-orange .icon-indicator, .incident-history .impact-major, .components-container .component-inner-container.status-orange .component-status, .components-container .component-inner-container.status-orange .icon-indicator { color:#FFA300; } .layout-content.status.status-index .unresolved-incident.impact-major .updates { border-color:#FFA300; } /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ /* CSS YELLOWS */ .layout-content.status.status-index .status-day .update-title.impact-minor a, .layout-content.status.status-index .status-day .update-title.impact-minor a:hover, .layout-content.status.status-index .page-status.status-minor, .layout-content.status.status-index .unresolved-incident.impact-minor .incident-title, .layout-content.status.status-index .scheduled-incidents-container .tab { background-color:#FFC72C; } .layout-content.status-index .components-statuses .component-container.status-yellow:after, .layout-content.status-full-history .month .incident-container .impact-minor, .layout-content.status-incident .incident-name.impact-minor, .layout-content.status.status-index .incidents-list .incident-title.impact-minor a, .status-yellow .icon-indicator, .incident-history .impact-minor, .components-container .component-inner-container.status-yellow .component-status, .components-container .component-inner-container.status-yellow .icon-indicator, .layout-content.status.manage-subscriptions .confirmation-infobox .fa { color:#FFC72C; } .layout-content.status.status-index .unresolved-incident.impact-minor .updates, .layout-content.status.status-index .scheduled-incidents-container { border-color:#FFC72C; } /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ /* CSS BLUES */ .layout-content.status.status-index .status-day .update-title.impact-maintenance a, .layout-content.status.status-index .status-day .update-title.impact-maintenance a:hover, .layout-content.status.status-index .page-status.status-maintenance, .layout-content.status.status-index .unresolved-incident.impact-maintenance .incident-title, .layout-content.status.status-index .scheduled-incidents-container .tab { background-color:#3EB1C8; } .layout-content.status-index .components-statuses .component-container.status-blue:after, .layout-content.status-full-history .month .incident-container .impact-maintenance, .layout-content.status-incident .incident-name.impact-maintenance, .layout-content.status.status-index .incidents-list .incident-title.impact-maintenance a, .status-blue .icon-indicator, .incident-history .impact-maintenance, .components-container .component-inner-container.status-blue .component-status, .components-container .component-inner-container.status-blue .icon-indicator { color:#3EB1C8; } .layout-content.status.status-index .unresolved-incident.impact-maintenance .updates, .layout-content.status.status-index .scheduled-incidents-container { border-color:#3EB1C8; } /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ /* CSS GREENS */ .layout-content.status.status-index .page-status.status-none { background-color:#00AB84; } .layout-content.status-index .components-statuses .component-container.status-green:after, .status-green .icon-indicator, .components-container .component-inner-container.status-green .component-status, .components-container .component-inner-container.status-green .icon-indicator { color:#00AB84; } /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ /* CSS LINK COLOR */ a, a:hover, .layout-content.status-index .page-footer span a:hover, .layout-content.status-index .timeframes-container .timeframe:not(.active):hover, .layout-content.status-incident .subheader a:hover { color:#017698; } .flat-button, .masthead .updates-dropdown-container .show-updates-dropdown, .layout-content.status-full-history .show-filter.open { background-color:#017698; } /* CUSTOM COLOR OVERRIDES FOR UPTIME SHOWCASE */ .components-section .components-uptime-link { color: #242323; } .layout-content.status .shared-partial.uptime-90-days-wrapper .legend .legend-item { color: #242323; opacity: 1; } .layout-content.status .shared-partial.uptime-90-days-wrapper .legend .legend-item.light { color: #242323; opacity: 1; } .layout-content.status .shared-partial.uptime-90-days-wrapper .legend .spacer { background: #242323; opacity: 1; } </style> <!-- custom css --> <!-- polyfills --> <script crossorigin="anonymous" src="https://cdnjs.cloudflare.com/polyfill/v3/polyfill.js"></script> <!-- Le HTML5 shim --> <!--[if lt IE 9]> <script src="//html5shim.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <!-- injection for static --> </head> <body class="status index status-none"> <div class="layout-content status status-index starter"> <div class="masthead-container basic"> <div class="masthead has-logo"> <div class="logo-container"> <a href="https://www.crossref.org"><img alt="Page logo" src="//dka575ofm4ao0.cloudfront.net/pages-transactional_logos/retina/29864/XlR0JhjoTQSzOp1NpaqF" /></a> </div> <div class="updates-dropdown-container" data-js-hook="updates-dropdown-container"> <a href="#" data-js-hook="show-updates-dropdown" id="show-updates-dropdown" class="show-updates-dropdown" aria-label="Subscribe to updates" aria-expanded="false" aria-haspopup="dialog" role="button"> </a> <!-- Accessibility guidelines for tabs: https://www.w3.org/TR/wai-aria-practices-1.1/examples/tabs/tabs-1/tabs.html --> <div class="updates-dropdown" data-js-hook="updates-dropdown" id="updates-dropdown" style="display:none"> <div class="updates-dropdown-nav nav-items-7" role="tablist" aria-label="Subscribe to updates"> <a href="#updates-dropdown-email" aria-controls="updates-dropdown-email" aria-label="Subscribe via email" role="tab" aria-selected="true" id="updates-dropdown-email-btn"> <span class="icon-container email"> </a> <a href="#updates-dropdown-slack" aria-controls="updates-dropdown-slack" aria-label="Subscribe via slack" role="tab" id="updates-dropdown-slack-btn"> <span class="icon-container slack"> </a> <a href="#updates-dropdown-webhook" aria-controls="updates-dropdown-webhook" aria-label="Subscribe via webhook" role="tab" id="updates-dropdown-webhook-btn"> <span class="icon-container webhook"> </a> <a href="#updates-dropdown-twitter" aria-controls="updates-dropdown-twitter" aria-label="Subscribe via twitter" role="tab" id="updates-dropdown-twitter-btn"> <span class="icon-container twitter"> </a> <a href="#updates-dropdown-support" aria-controls="updates-dropdown-support" aria-label="Contact support" role="tab" id="updates-dropdown-support-btn"> <span class="icon-container support"> </a> <a href="#updates-dropdown-atom" aria-controls="updates-dropdown-atom" aria-label="Subscribe via RSS" role="tab" id="updates-dropdown-atom-btn"> <span class="icon-container rss"> </a> <button data-js-hook="updates-dropdown-close" aria-label="Close subscribe form" id="updates-dropdown-close-btn"> x </button> </div> <div class="updates-dropdown-sections-container"> <div class="updates-dropdown-section email" id="updates-dropdown-email" style="display:none" role="tabpanel" aria-labelledby="updates-dropdown-email-btn"> <div class="directions"> Get email notifications whenever Crossref <strong>creates</strong>, <strong>updates</strong> or <strong>resolves</strong> an incident. </div> <form id="subscribe-form-email" action="/subscriptions/new-email" accept-charset="UTF-8" data-remote="true" method="post"> <input type="hidden" name="email_otp_verify_flow" id="email_otp_verify_flow" value="false" autocomplete="off" /> <!-- make sure not to put cookie values in here since this gets cached --> <label for="email">Email address:</label> <input name="email" id="email" type="text" class="full-width" data-js-hook="email-notification-field" autocomplete="email"> <input name="email_otp_auth_token" type='hidden' id="email-otp-token-field"> <div class="opt-container-section" id="email-otp-container", style="display:none" > <label for="email-otp">Enter OTP:</label> <input name="otp" id="email-otp" type="text" value="" class="prepend full-width"> <p id="email-otp-timer">Resend OTP in: <span id="email-otp-countdown"></span> seconds </p> <p id="resend-email-otp"> Didn't receive the OTP? <a href="#" id="resend-email-otp-btn" >Resend OTP </a> </p> </div> <input type="hidden" name="captcha_error" id="captcha_error" value="false" autocomplete="off" /> <input type="submit" value="Subscribe via Email" class="flat-button full-width g-recaptcha" id="subscribe-btn-email" data-disabled-text="Subscribing..." data-sitekey=6LdTS8AUAAAAAOIbCKoCAP4LQku1olYGrywPTaZz data-callback="submitNewEmailSubscriber" data-error-callback="emailSubscriberCaptchaError" > <div class="terms_and_privacy_information bottom small"><div class="privacy_policy_information small">By subscribing you agree to our <a target="_blank" rel="noopener" href="https://www.crossref.org/privacy/">Privacy Policy</a>.</div> This site is protected by reCAPTCHA and the Google <a target="_blank" rel="noopener" href="https://policies.google.com/privacy">Privacy Policy</a> and <a target="_blank" rel="noopener" data-js-hook="captcha-terms-of-service-link" href="https://policies.google.com/terms">Terms of Service</a> apply.</div> </form> </div> <div class="updates-dropdown-section slack" id="updates-dropdown-slack" style="display:none" role="tabpanel" aria-labelledby="updates-dropdown-slack-btn"> <div class="directions"> Get incident updates and maintenance status messages in Slack. </div> <a value="Subscribe via Slack" class="flat-button full-width" id="subscribe-btn-slack" data-disabled-text="Subscribing..." data-revert-on-success="true" style="margin-top:.75rem" href="https://subscriptions.statuspage.io/slack_authentication/kickoff?page_code=cpl595mrvlzp">Subscribe via Slack</a> <div class="terms_and_privacy_information bottom small">By subscribing you acknowledge our <a target="_blank" rel="noopener" href="https://www.crossref.org/privacy/">Privacy Policy</a>. In addition, you agree to the Atlassian <a target="_blank" rel="noopener" href="https://www.atlassian.com/legal/cloud-terms-of-service">Cloud Terms of Service</a> and acknowledge Atlassian's <a target="_blank" rel="noopener" href="https://www.atlassian.com/legal/privacy-policy">Privacy Policy</a>.</div> </div> <div class="updates-dropdown-section webhook" id="updates-dropdown-webhook" style="display:none" role="tabpanel" aria-labelledby="updates-dropdown-webhook-btn"> <div class="directions"> Get webhook notifications whenever Crossref <strong>creates</strong> an incident, <strong>updates</strong> an incident, <strong>resolves</strong> an incident or <strong>changes</strong> a component status. </div> <form id="subscribe-form-webhook" action="/subscriptions/webhook.json" accept-charset="UTF-8" data-remote="true" method="post"> <div class="control-group"> <div class="controls"> <label for="endpoint-webhooks">Webhook URL:</label> <input type="text" name="endpoint" id="endpoint-webhooks" data-js-hook="endpoint" class="full-width" aria-describedby="url-help-block" /> <p class="help-block" id="url-help-block">The URL we should send the webhooks to</p> </div> </div> <div class="control-group"> <div class="controls"> <label for="email-webhooks">Email address:</label> <input type="text" name="email" id="email-webhooks" data-js-hook="email" class="full-width" aria-describedby="email-help-block" /> <p class="help-block" id="email-help-block">We'll send you email if your endpoint fails</p> </div> </div> <input type="hidden" name="captcha_error" id="captcha_error" value="false" autocomplete="off" /> <input type="submit" value=Subscribe To Notifications class="flat-button full-width g-recaptcha" id="subscribe-btn-webhook" data-disabled-text="Subscribing..." data-sitekey=6LcQ-b0UAAAAAJjfdwO_-ozGC-CzWDj4Pm1kJ2Ah data-callback="submitNewWebhookSubscriber" data-error-callback="webhookSubscriberCaptchaError"> <div class="terms_and_privacy_information bottom small"><div class="privacy_policy_information small">By subscribing you agree to our <a target="_blank" rel="noopener" href="https://www.crossref.org/privacy/">Privacy Policy</a>.</div> This site is protected by reCAPTCHA and the Google <a target="_blank" rel="noopener" href="https://policies.google.com/privacy">Privacy Policy</a> and <a target="_blank" rel="noopener" data-js-hook="captcha-terms-of-service-link" href="https://policies.google.com/terms">Terms of Service</a> apply.</div> </form> </div> <div class="updates-dropdown-section twitter" id="updates-dropdown-twitter" style="display:none" role="tabpanel" aria-labelledby="updates-dropdown-twitter-btn"> <a href="https://twitter.com/CrossrefSupport" class="twitter-follow-button" data-show-count="false" data-show-screen-name="true" data-width="59px">Follow @CrossrefSupport</a> or <a href="https://twitter.com/CrossrefSupport" target="_blank">view our profile</a>. <style> .twitter-follow-button { margin-bottom: -6px; } </style> <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script> </div> <div class="updates-dropdown-section support" id="updates-dropdown-support" style="display:none" role="tabpanel" aria-labelledby="updates-dropdown-support-btn"> Visit our <a target="_blank" href="https://support.crossref.org">support site</a>. </div> <div class="updates-dropdown-section atom" id="updates-dropdown-atom" role="tabpanel" aria-labelledby="updates-dropdown-atom-btn"> Get the <a href="https://status.crossref.org/history.atom" target="_blank">Atom Feed</a> or <a href="https://status.crossref.org/history.rss" target="_blank">RSS Feed</a>. </div> </div> </div> </div> <script> $(function () { const phoneNumberInput = $('#phone-number'); const errorDiv = $('#sms-atl-error') if(errorDiv.length){ function checkSelectedCountry() { const selectedCountry = $('#phone-country').val(); const isOtpEnabled = $('#phone-number-country-code').attr('data-otp-enabled') === 'true'; const form = document.getElementById('subscribe-form-sms'); form.action = '/subscriptions/new-sms'; const isOtpFlow = document.getElementById('otp_verify_flow'); document.getElementById('otp-container').style.display = "none"; if(false && selectedCountry === 'sg') { // Replace 'SG' with the actual value representing Singapore in your select tag phoneNumberInput.prop('disabled', true); errorDiv.html(`Due to new Singapore government regulations, we're currently not supporting text subscriptions in Singapore.<a href="https://community.atlassian.com/t5/Statuspage-articles/Attention-SMS-notifications-will-be-disabled-on-August-1st-2023/ba-p/2424398" target="_blank"> Learn more.</a> <br> Select another method to subscribe.`); } else { phoneNumberInput.prop('readonly', false); errorDiv.html(''); if(false){ if(isOtpEnabled){ document.getElementById('subscribe-btn-sms').value = "Send OTP"; } else { isOtpFlow.value = false; document.getElementById('subscribe-btn-sms').value = "Subscribe via Text Message"; } } } } $('#phone-country').on('change', checkSelectedCountry); checkSelectedCountry(); } }); document.addEventListener('DOMContentLoaded', function() { const dropdown = document.querySelector('#phone-number-country-code .phone-country'); if (dropdown){ const wrapperDiv = document.getElementById('phone-number-country-code'); const selectedOption = dropdown.options[dropdown.selectedIndex]; const otpEnabled = selectedOption.getAttribute('data-otp-enabled'); wrapperDiv.setAttribute('data-otp-enabled', otpEnabled); dropdown.addEventListener('change', function() { const selectedOption = dropdown.options[dropdown.selectedIndex]; const otpEnabled = selectedOption.getAttribute('data-otp-enabled'); wrapperDiv.setAttribute('data-otp-enabled', otpEnabled); }); } }); var countdownTimer; var resendBtn = document.getElementById('resend'); var timer = document.getElementById('timer'); var form = document.getElementById('subscribe-form-sms'); var RESEND_TIMER = 30; $(function() { $('#subscribe-form-sms').on('ajax:success', function(e, data, status, xhr){ const form = this; const action = form.getAttribute('action'); if (data.type === 'success' && data.otp_flow === true) { document.getElementById('subscriber_code').value = data.subscriber_code document.getElementById('otp-container').style.display = "block"; $('#phone-number').prop('readonly', true); var display = document.getElementById('countdown'); disableResend(); startTimer(RESEND_TIMER, display) document.getElementById('subscribe-btn-sms').value = "Verify OTP and Subscribe"; document.getElementById('otp_verify_flow').value = true; form.action = '/subscriptions/verify-otp'; } else if (data.type === 'success' && action.includes('verify')){ document.getElementById('otp-container').style.display = "none"; $('#phone-number').val('').prop('readonly', false); $('#otp').val(''); document.getElementById('subscribe-btn-sms').value = "Send OTP"; document.getElementById('otp_verify_flow').value = false; form.action = '/subscriptions/new-sms'; SP.currentPage.updatesDropdown.hide(); } }); $("#btn-subcriber-change-number").on('click', () => { document.getElementById('otp-container').style.display = "none"; $('#phone-number').prop('readonly', false); document.getElementById('subscribe-btn-sms').value = "Send OTP"; form.action = '/subscriptions/new-sms'; return false }) $('#resend-otp-btn').on('click', function(e) { e.preventDefault(); let phoneNumber = $('#phone-number').val(); let countryCode = $('.phone-country').val(); $.ajax({ type: 'POST', url: "/subscriptions/new-sms", data: { phone_number: phoneNumber, phone_country: countryCode, type: 'resend' }, }).done(function(data) { var messageOptions = (data.type !== undefined && data.type !== null) ? { cssClass: data.type } : {}; HRB.utils.notify(data.text, messageOptions); var display = document.getElementById('countdown'); disableResend(); timer.style.display = "none" if (data.type === 'success') { startTimer(RESEND_TIMER, display); } }) }); }) function startTimer(duration, display){ var timer = duration, seconds; clearInterval(countdownTimer); countdownTimer = setInterval(function () { seconds = parseInt(timer % 60, 10); display.textContent = seconds; if(--timer < 0){ enableResend(); clearInterval(countdownTimer); } }, 1000); disableResend(); } function enableResend(){ resendBtn.style.display = "block"; timer.style.display = "none" } function disableResend(){ resendBtn.style.display = "none"; timer.style.display = "block" } $(function() { $('#subscribe-form-email').on('submit', function() { var tokenField = document.getElementById('email-otp-token-field'); let page_code = "cpl595mrvlzp" let key = keyForEmailOtpToken($('#email').val(), page_code); tokenField.value = localStorage.getItem(key); }); }); var emailOtpCountdownTimer; var emailOtpResendBtn = document.getElementById('resend-email-otp'); var emailOtpTimer = document.getElementById('email-otp-timer'); var emailOtpForm = document.getElementById('subscribe-form-email'); var EMAIL_OTP_RESEND_TIMER = 600; $(function() { $('#subscribe-form-email').on('ajax:success', function(e, data, status, xhr){ const form = this; const action = form.getAttribute('action'); if (data.type === 'success' && data.email_otp_verify_flow === true) { document.getElementById('email-otp-container').style.display = "block"; var display = document.getElementById('email-otp-countdown'); display.textContent = EMAIL_OTP_RESEND_TIMER; disableEmailOtpResend(); startEmailOtpTimer(EMAIL_OTP_RESEND_TIMER, display) document.getElementById('subscribe-btn-email').value = "Verify OTP and Subscribe"; document.getElementById('email_otp_verify_flow').value = true; form.action = '/subscriptions/verify-email-otp'; } else if (data.type === 'success' && action.includes('verify')){ let email = $('#email') let page_code = "cpl595mrvlzp" let key = keyForEmailOtpToken(email.val(), page_code); localStorage.setItem(key, data.email_otp_auth_token); document.getElementById('email-otp-container').style.display = "none"; email.val('').prop('readonly', false); $('#email-otp').val(''); document.getElementById('subscribe-btn-email').value = "Send OTP"; document.getElementById('email_otp_verify_flow').value = false; form.action = '/subscriptions/new-email'; SP.currentPage.updatesDropdown.hide(); } }); $('#resend-email-otp-btn').on('click', function(e) { e.preventDefault(); let email = $('#email').val(); $.ajax({ type: 'POST', url: "/subscriptions/new-email", data: { email: email }, }).done(function(data) { var messageOptions = (data.type !== undefined && data.type !== null) ? { cssClass: data.type } : {}; HRB.utils.notify(data.text, messageOptions); if (data.type === 'success') { var display = document.getElementById('email-otp-countdown'); display.textContent = EMAIL_OTP_RESEND_TIMER; disableEmailOtpResend(); emailOtpTimer.style.display = "none" startEmailOtpTimer(EMAIL_OTP_RESEND_TIMER, display); } }) }); }) function startEmailOtpTimer(duration, display){ var timer = duration, seconds; clearInterval(emailOtpCountdownTimer); emailOtpCountdownTimer = setInterval(function () { seconds = parseInt(timer, 10); display.textContent = seconds; if(--timer < 0){ enableEmailOtpResend(); clearInterval(emailOtpCountdownTimer); } }, 1000); disableEmailOtpResend(); } function enableEmailOtpResend(){ emailOtpResendBtn.style.display = "block"; emailOtpTimer.style.display = "none" } function disableEmailOtpResend(){ emailOtpResendBtn.style.display = "none"; emailOtpTimer.style.display = "block" } function keyForEmailOtpToken(email, pageCode) { return email + '|' + pageCode+ '|SUBSCRIBE_VIA_EMAIL'; } </script> <div class="clearfix"></div> </div> </div> <!-- this is outside of the .container so that the cover photo can go full width on mobile --> <div class="container"> <div class="unresolved-incidents"> <div class="unresolved-incident impact-none"> <div class="incident-title font-large"> <a class="whitespace-pre-wrap actual-title with-ellipsis" href="/incidents/p3wgb1753jyv">Degraded performance of some of our reports and email notifications</a> <a data-toggle="modal" role="button" class="subscribe" id="btn-subscribe-modal-p3wgb1753jyv" href="#subscribe-modal-p3wgb1753jyv">Subscribe</a> </div> <div class="updates font-regular"> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">Search within the browsable title list - <a target="_blank" href="https://www.crossref.org/titleList/">https://www.crossref.org/titleList/</a> - has been restored. We do, however, have minor issues with: depositor reports, the csv download in the browsable title list, DOI crawler report, and our Schematron report. Our technical team continues to work on a fix for these other reports. - IF</span> <br> <small><span class="ago" data-datetime-unix="1732047881000"></span>Nov <var data-var='date'>19</var>, <var data-var='year'>2024</var> - <var data-var='time'>20:24</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">We are continuing to work on a fix for this issue.</span> <br> <small><span class="ago" data-datetime-unix="1732025099000"></span>Nov <var data-var='date'>19</var>, <var data-var='year'>2024</var> - <var data-var='time'>14:04</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">We are continuing to work on a fix for this issue.</span> <br> <small><span class="ago" data-datetime-unix="1731079527000"></span>Nov <var data-var='date'>08</var>, <var data-var='year'>2024</var> - <var data-var='time'>15:25</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">Search within the browsable title list - <a target="_blank" href="https://www.crossref.org/titleList/">https://www.crossref.org/titleList/</a> - is currently broken. We also still have minor issues with: depositor reports, the csv download in the browsable title list, DOI crawler report, and our Schematron report. Our technical team is investigating. - IF</span> <br> <small><span class="ago" data-datetime-unix="1730470381000"></span>Nov <var data-var='date'>01</var>, <var data-var='year'>2024</var> - <var data-var='time'>14:13</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">The PubMed IDs search functionality in the Simple Text Query form - <a target="_blank" href="https://apps.crossref.org/SimpleTextQuery/">https://apps.crossref.org/SimpleTextQuery/</a> - has been fixed. We still have some minor problems with: depositor reports, the csv download in the browsable title list, DOI crawler report, and our Schematron report. Our technical team continues to work on fixes for these other reports. - IF</span> <br> <small><span class="ago" data-datetime-unix="1730306373000"></span>Oct <var data-var='date'>30</var>, <var data-var='year'>2024</var> - <var data-var='time'>16:39</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">We are continuing to work on a fix for this issue.</span> <br> <small><span class="ago" data-datetime-unix="1729523640000"></span>Oct <var data-var='date'>21</var>, <var data-var='year'>2024</var> - <var data-var='time'>15:14</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">The browsable title list - <a target="_blank" href="https://www.crossref.org/titleList/">https://www.crossref.org/titleList/</a> - is now available. We're still working to fully restore a few other reports/tools: refreshing the data within the conflict reports and the PubMed IDs search functionality in the Simple Text Query form. -IF</span> <br> <small><span class="ago" data-datetime-unix="1727791687000"></span>Oct <var data-var='date'>01</var>, <var data-var='year'>2024</var> - <var data-var='time'>14:08</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">Our technical team has fixed the issues with submission log emails. All members should now be receiving submission log emails for their submissions. In addition, our team has fixed depositor reports (for journals, books, and series). <br /><br />We're still working to fully restore a few other reports/tools: browsable title list, conflict reports, and the PubMed IDs search functionality in the Simple Text Query form. -IF</span> <br> <small><span class="ago" data-datetime-unix="1727116032000"></span>Sep <var data-var='date'>23</var>, <var data-var='year'>2024</var> - <var data-var='time'>18:27</var> UTC</small> </div> <div class="update"> <strong>Update</strong> - <span class="whitespace-pre-wrap">We are continuing to work to fully restore all of our reports (e.g., browsable title list, conflict reports, depositor reports). In addition, we have identified errors with submission logs being sent as a result of your deposits. These errors are also related to our database migration earlier this week. <br /><br />We are still processing your deposits. Submission processing is not broken; it is only the missing emails that are an issue. We are working to fix the bug resulting in missing emailed submission logs. As an alternative, you can always use our admin tool to review your recent submissions. Follow these directions: <a target="_blank" href="https://www.crossref.org/documentation/register-maintain-records/verify-your-registration/submission-queue-and-log/#00143">https://www.crossref.org/documentation/register-maintain-records/verify-your-registration/submission-queue-and-log/#00143</a> -IF</span> <br> <small><span class="ago" data-datetime-unix="1726848340000"></span>Sep <var data-var='date'>20</var>, <var data-var='year'>2024</var> - <var data-var='time'>16:05</var> UTC</small> </div> <div class="update"> <strong>Identified</strong> - <span class="whitespace-pre-wrap">As a result of our database migration - <a target="_blank" href="https://status.crossref.org/incidents/v3k2t9f3jdcw">https://status.crossref.org/incidents/v3k2t9f3jdcw</a> - some of our reports (e.g., browsable title list, conflict reports, depositor reports) have not yet been fully restored. Our technical team is working to fully restore those reports now.</span> <br> <small><span class="ago" data-datetime-unix="1726595736000"></span>Sep <var data-var='date'>17</var>, <var data-var='year'>2024</var> - <var data-var='time'>17:55</var> UTC</small> </div> </div> </div> <div class="modal hide fade modal-open-incident-subscribe" id="subscribe-modal-p3wgb1753jyv" style="display: none" data-js-hook="incident-subscription-modal" role="dialog" aria-labelledby="incident-subscription-dialog-header" aria-describedby="incident-subscription-dialog-description" aria-modal="true"> <form class="modal-content" id="subscribe-form-p3wgb1753jyv" action="/subscriptions/incident.json" accept-charset="UTF-8" data-remote="true" method="post"> <input type="hidden" name="incident_code" id="incident_code" value="p3wgb1753jyv" autocomplete="off" /> <div class="modal-header"> <a href="#" data-dismiss="modal" class="close" data-js-hook="incident-modal-close" aria-label="close" role="button">×</a> <h4 id="incident-subscription-dialog-header"> Subscribe to Incident </h4> </div> <div class="modal-body"> <p style="margin-bottom:25px" id="incident-subscription-dialog-description"> Subscribe to updates for <strong>Degraded performance of some of our reports and email notifications</strong> via email. You'll receive email notifications when incidents are updated. </p> <div class="control-group"> <label for="email-p3wgb1753jyv">VIA EMAIL:</label> <div class="controls"> <input type="text" name="email" id="email-p3wgb1753jyv" data-js-hook="email" class="full-width" /> </div> </div> </div> <div class="modal-footer incident-subscribe"> <!-- tests fail if static width isn't present ¯\_(ツ)_/¯ --> <button name="button" type="submit" class="flat-button cpt-button incident-subscribe-btn-captcha" id="subscribe-btn-p3wgb1753jyv" onclick="submitCaptchaIncidentSubscribe(event)">Subscribe to Incident</button> <input type="hidden" name="captcha_error" id="captcha_error" value="false" autocomplete="off" /> <input type="hidden" name="g-recaptcha-response" id="g-recaptcha-response" value="false" autocomplete="off" /> <div class="terms_and_privacy_information left small"><div class="privacy_policy_information small">By subscribing you agree to our <a target="_blank" rel="noopener" href="https://www.crossref.org/privacy/">Privacy Policy</a>.</div> This site is protected by reCAPTCHA and the Google <a target="_blank" rel="noopener" href="https://policies.google.com/privacy">Privacy Policy</a> and <a target="_blank" rel="noopener" data-js-hook="captcha-terms-of-service-link" href="https://policies.google.com/terms">Terms of Service</a> apply.</div> </div> </form> </div> <script> $(function () { const phoneNumberInputIncident = $('#phone-number-p3wgb1753jyv'); const phoneCountrySelect = $('#phone-country-p3wgb1753jyv'); const errorDiv = $('#sms-atl-error-p3wgb1753jyv'); const phoneCountryDiv = $('#phone-number-code-p3wgb1753jyv'); if(errorDiv.length){ function checkSelectedCountry() { const selectedCountry = phoneCountrySelect.val(); const isOtpEnabled = phoneCountryDiv.attr('data-otp-enabled') === 'true'; if(false && selectedCountry === 'sg') { // Replace 'SG' with the actual value representing Singapore in your select tag phoneNumberInputIncident.prop('disabled', true); errorDiv.html(`Due to new Singapore government regulations, we're currently not supporting text subscriptions in Singapore.<a href="https://community.atlassian.com/t5/Statuspage-articles/Attention-SMS-notifications-will-be-disabled-on-August-1st-2023/ba-p/2424398" target="_blank"> Learn more.</a> <br> Select another method to subscribe.`); } else { phoneNumberInputIncident.prop('readOnly', false); errorDiv.html(''); if(false){ $('#btn-change-number-incident-p3wgb1753jyv').css('display', 'none'); $('#resend-otp-p3wgb1753jyv').css('display', 'none'); $('#timer-incident-p3wgb1753jyv').css('display', 'none'); if(isOtpEnabled){ $('#otp-container-incident-p3wgb1753jyv').css('display', 'block'); $('#btn-subcriber-send-otp-p3wgb1753jyv').css('display', 'block'); } else { $('#otp-container-incident-p3wgb1753jyv').css('display', 'none'); $('#btn-subcriber-send-otp-p3wgb1753jyv').css('display', 'none'); } } } } phoneCountrySelect.on('change', checkSelectedCountry); checkSelectedCountry(); } }); document.addEventListener('DOMContentLoaded', function() { const dropdowns = document.querySelectorAll('.phone-country-dropdown'); if (dropdowns.length > 0) { dropdowns.forEach(function(dropdown) { const dropdownId = dropdown.id; const incidentCode = dropdownId.split('-').pop(); const wrapperDiv = $('#phone-number-code-' + incidentCode); function updateOtpEnabledAttribute() { const selectedOption = dropdown.options[dropdown.selectedIndex]; const otpEnabled = selectedOption.getAttribute('data-otp-enabled'); wrapperDiv.attr('data-otp-enabled', otpEnabled); } dropdown.addEventListener('change', updateOtpEnabledAttribute); updateOtpEnabledAttribute(); }); } }); var countdownTimers = {}; var phoneNumberInputIncident = $('#phone-number-p3wgb1753jyv'); var RESEND_TIMER = 30; $(function() { $('#subscribe-form-p3wgb1753jyv').on('ajax:success', function(e, data, status, xhr){ var $form = $(this); var formId = $form.attr('id'); var incidentCode = formId.split('-').pop(); $('#btn-change-number-incident-' + incidentCode).css('display', 'block'); if ( $('#btn-change-number-incident-'+ incidentCode).css('display') !== 'none') { $('#btn-change-number-incident-'+ incidentCode).css('display', 'none'); $('#btn-subcriber-send-otp-'+ incidentCode).css('display', 'block'); $('#otp-container-incident-'+ incidentCode).css('display', 'block'); $('#resend-otp-'+ incidentCode).css('display', 'none'); $('#timer-incident-'+ incidentCode).css('display', 'none'); $('#phone-number-' + incidentCode).prop('readOnly', false); $('#otp-field-' + incidentCode).val('').prop('disabled', true); } if(countdownTimers){ clearInterval(countdownTimers[incidentCode]); } }); $('#btn-change-number-incident-p3wgb1753jyv').on('click', function (e) { var incidentCode = $(this).data('incident-code'); showSendOTP(incidentCode); return false; }); $('#btn-subcriber-send-otp-p3wgb1753jyv').on('click', function (e) { let incidentCode = $(this).data('incident-code'); let phoneNumber = $('#phone-number-' + incidentCode).val(); let countryCode = $('#phone-country-' + incidentCode).val(); let incidentCodeField = $('#incident-code-' + incidentCode).val(); sendOtpRequest(phoneNumber, countryCode, incidentCodeField, function (data, status) { var messageOptions = (data.type !== undefined && data.type !== null) ? { cssClass: data.type } : {}; HRB.utils.notify(data.text, messageOptions); e.preventDefault(); if (data.type === 'success') { showChangeNumber(incidentCode); } }); }); $('#resend-otp-p3wgb1753jyv').on('click', function(e) { let incidentCode = $(this).data('incident-code'); let phoneNumber = $('#phone-number-' + incidentCode).val(); let countryCode = $('#phone-country-' + incidentCode).val(); let incidentCodeField = $('#incident-code-' + incidentCode).val(); sendOtpRequest(phoneNumber, countryCode, incidentCodeField, function (data, status) { var messageOptions = (data.type !== undefined && data.type !== null) ? { cssClass: data.type } : {}; HRB.utils.notify(data.text, messageOptions); e.preventDefault(); disableResendIncident(incidentCode); if (data.type === 'success') { var display = $('#countdown-incident-' + incidentCode); startTimerIncident(RESEND_TIMER, display, incidentCode ); } }); }); }) function sendOtpRequest(phoneNumber, countryCode, incidentCode, onSuccess) { $.ajax({ type: 'POST', url: "/subscriptions/new-sms", data: { phone_number: phoneNumber, phone_country: countryCode, incident_code: incidentCode, type: 'resend' }, }).done(onSuccess); } function showChangeNumber(incidentCode) { $('#btn-change-number-incident-' + incidentCode).css('display', 'block'); $('#btn-subcriber-send-otp-' + incidentCode).css('display', 'none'); $('#otp-field-' + incidentCode).val('').prop('disabled', false); $('#phone-number-' + incidentCode).prop('readOnly', true); $('#resend-otp-'+ incidentCode).css('display', 'block'); var display = $('#countdown-incident-' + incidentCode); startTimerIncident(RESEND_TIMER, display, incidentCode) } function showSendOTP(incidentCode) { $('#btn-change-number-incident-' + incidentCode).css('display', 'none'); $('#btn-subcriber-send-otp-' + incidentCode).css('display', 'block'); $('#otp-field-' + incidentCode).val('').prop('disabled', true); $('#phone-number-' + incidentCode).prop('readOnly', false); $('#resend-otp-'+ incidentCode).css('display', 'none'); $('#timer-incident-'+ incidentCode).css('display', 'none'); clearInterval(countdownTimers[incidentCode]); } function startTimerIncident(duration, display, incidentCode){ var timerIncident = duration, seconds; clearInterval(countdownTimers[incidentCode]); countdownTimers[incidentCode] = setInterval(function () { seconds = parseInt(timerIncident % 60, 10); display.text(seconds); $('#timer-incident-'+ incidentCode).css('display', 'block'); if(--timerIncident < 0){ enableResendIncident(incidentCode); clearInterval(countdownTimers[incidentCode]); } }, 1000); disableResendIncident(incidentCode); } function enableResendIncident(incidentCode){ $('#resend-otp-' + incidentCode).css('color', ''); $('#resend-otp-' + incidentCode).css('pointer-events', ''); $('#timer-incident-'+ incidentCode).css('display', 'none'); } function disableResendIncident(incidentCode){ $('#resend-otp-' + incidentCode).css('color', 'grey'); $('#resend-otp-' + incidentCode).css('pointer-events', 'none'); } </script> </div> <div class="components-section font-regular"> <div class="components-container one-column"> <div class="component-container border-color is-group "> <div data-component-id="wfc3h4k2rth9" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle APIs" tabindex="0"></span> <span> APIs </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="3jv6xnqp3f8w" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Public REST API </span> <span class="tooltip-base tool" title="The REST API enables flexible programmatic access to search and filter our metadata and/or match references. The Public REST API is a public, open, and free API for all anonymous users. Note that we recommend you be &quot;polite&quot; and self-identify as described in the &quot;Etiquette&quot; section of the API documentation: https://api.crossref.org">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="pksrvbkgbkzc" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Polite REST API </span> <span class="tooltip-base tool" title="The REST API enables programmatic access to search and filter our metadata and/or match references. The Polie REST API is a public, open, and free API for all self-identified users, as described in the “Etiquette” section of the API documentation: https://api.crossref.org">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="g77d2lbpzmr8" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> OAI-PMH </span> <span class="tooltip-base tool" title="The OAI-PMH (version 2) service enables the distribution of metadata in XML as as documented at http://www.openarchives.org/OAI/openarchivesprotocol.html">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="nk0jf8yh7268" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> XML API </span> <span class="tooltip-base tool" title="The XML API provides legacy support for bulk DOI matching. For more information: https://support.crossref.org/hc/en-us/articles/213420726-XML-API">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="0r11kc58qvlm" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Event Data Query API </span> <span class="tooltip-base tool" title="A collaborative initiative by Crossref and DataCite, Event Data (https://www.eventdata.crossref.org/) meets a growing community need by offering transparency around the way interactions with scholarly research occur online, outside of publisher platforms.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="35yq5psptdt3" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> OpenURL </span> <span class="tooltip-base tool" title="The OpenURL service provides an API for use by library link resolvers. For more information: https://support.crossref.org/hc/en-us/articles/214880143-OpenURL">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="c0jjcqzx7921" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Crossmark dialog server </span> <span class="tooltip-base tool" title="The service that supports the Crossmark pop-up box on members&apos; websites. For more information on Crossmark: https://www.crossref.org/get-started/crossmark/">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="crq4q7p82fq6" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Public content negotiation </span> <span class="tooltip-base tool" title="Provides DOI content negotiation (public pool) as described at https://crosscite.org/docs.html">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="ns2qhjt4q8nm" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Polite content negotiation </span> <span class="tooltip-base tool" title="Provides DOI content negotiation (polite pool) as described at https://crosscite.org/docs.html">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="x27yf6fn3pkq" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle Metadata Plus" tabindex="0"></span> <span> Metadata Plus </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="d2ykv6f21lh0" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Plus REST API </span> <span class="tooltip-base tool" title="The REST API enables flexible programmatic access to search and filter our metadata and/or match references. The Plus REST API provides enhanced support and features to Metadata Plus subscribers who are using the API for production services. For more information: https://api.crossref.org">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="b73cj9t024v3" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Plus OAI-PMH </span> <span class="tooltip-base tool" title="The OAI-PMH (version 2) service enables the distribution of metadata in XML as documented at http://www.openarchives.org/OAI/openarchivesprotocol.html. This is the Plus version of the OAI-PMH that provides enhanced support and features for Metadata Plus subscribers.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="cw8mgsvk4x92" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> XML Snapshots </span> <span class="tooltip-base tool" title="Metadata Plus snapshots provide access to all our 100 million plus metadata records in a single file, providing an easy way to retrieve an up-to-date copy of our records. Snapshots are available for Metadata Plus service users. The files are made available via a /snapshots route in the REST API which offers a compressed .tar file (tar.gz) containing the full extract of the metadata corpus in XML format.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="wjcp2bfyx5pf" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> JSON Snapshots </span> <span class="tooltip-base tool" title="Metadata Plus snapshots provide access to all our 100 million plus metadata records in a single file, providing an easy way to retrieve an up-to-date copy of our records. Snapshots are available for Metadata Plus service users. The files are made available via a /snapshots route in the REST API which offers a compressed .tar file (tar.gz) containing the full extract of the metadata corpus in JSON format.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="k5xgxb69dpt6" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Plus content negotiation </span> <span class="tooltip-base tool" title="Provides DOI content negotiation (plus pool) as described at https://crosscite.org/docs.html">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="q2ts4b91tvn8" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Key Manager </span> <span class="tooltip-base tool" title="Crossref Key Manager (https://manage.crossref.org/keys) is our tool that allows our Metadata Plus users to begin to create and manage Metadata Plus API Keys.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="6hzcgtyfdp8r" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle Content Registration" tabindex="0"></span> <span> Content Registration </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="gcj97v0nfx8m" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Admin tool </span> <span class="tooltip-base tool" title="The Crossref admin tool (https://doi.crossref.org/), also known as the deposit queue or the submission system, where members deposit metadata, manage their accounts and more.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="4lkrfd60ktjj" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Test admin tool </span> <span class="tooltip-base tool" title="Crossref’s system for testing deposits and integrations (http://test.crossref.org/).">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="zt7fspnlk7v9" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Web deposit form </span> <span class="tooltip-base tool" title="The Crossref web deposit form (https://www.crossref.org/webDeposit/) is our most reliable helper tool for registering journal, book, conference, report, and dissertation content. Within the form, members complete the various fields which results in XML formatted to the Crossref schema being produced for registration.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="7f2pgryjq51v" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Record registration form </span> <span class="tooltip-base tool" title="The Crossref record registration form (https://manage.crossref.org/records) is our newest helper tool for registering grants and journal (still in beta) content. Within the form, members complete the various fields which results in XML formatted to the Crossref schema being produced for registration.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="ngh9ygt2w0lm" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle Metadata files" tabindex="0"></span> <span> Metadata files </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="b5gkdj7ccls1" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Open Funder Registry </span> <span class="tooltip-base tool" title="The 4-6-weekly updated files for the Open Fudber Registry (RDF and CSV) available from https://gitlab.com/crossref/open_funder_registry.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="h8671l48694q" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Retraction Watch </span> <span class="tooltip-base tool" title="The Retraction Watch data file, updated daily, available from the Labs API for now (and since Sept 2023) at https://api.labs.crossref.org/data/retractionwatch">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="l6d3spjx943w" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Annual public data files </span> <span class="tooltip-base tool" title="The full metadata file produced annually and made publically available via Academic Torrents (https://academictorrents.com/browse.php?search=Crossref)">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="0x7bkssghvr5" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle Sites" tabindex="0"></span> <span> Sites </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="6tb4w0wgxbsh" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Crossref website </span> <span class="tooltip-base tool" title="Crossref’s website - crossref.org">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="xg2dvr09jkh7" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Crossref support </span> <span class="tooltip-base tool" title="Our zendesk instance for opening and reviewing support tickets - support.crossref.org">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="ppj5qvff0vv4" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Metadata search </span> <span class="tooltip-base tool" title="Metadata search - search.crossref.org - is Crossref’s primary user interface for searching and filtering our millions of records for journal articles, books, standards, datasets and more">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="cqh3mrqgcl0j" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Participation reports </span> <span class="tooltip-base tool" title="Participation Reports (https://www.crossref.org/members/prep/) allow publishers a centralized dashboard to view overall metadata in the Crossref system.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="53ph7q640c81" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle External dependencies" tabindex="0"></span> <span> External dependencies </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="lxbbddw28q01" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Handle servers </span> <span class="tooltip-base tool" title="The system that points a DOI at the online location of the content">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="twjmb6y8f9ct" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Monitoring of iThenticate can be seen at https://turnitin.statuspage.io. </span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="qk3hk51j204c" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> AWS cloudfront </span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="jtw3b7zhxqhk" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle Meta" tabindex="0"></span> <span> Meta </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="lk6st82c1xl0" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> deliberately-unreliable server </span> <span class="tooltip-base tool" title="A Crossref test server that is *deliberately* unreliable and used for testing the uptime monitoring system.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <div data-component-id="s2ryhzb1xd3y" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Demo Auth </span> <span class="tooltip-base tool" title="Demo component">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> <div class="component-container border-color is-group "> <div data-component-id="wqtxckd91rt6" class="component-inner-container status-green " data-component-status="operational" data-js-hook="component-group-opener"> <span class="name"> <span class="fa group-parent-indicator color-secondary font-small fa-plus-square-o" role="button" aria-expanded="false" aria-label="Toggle Beta" tabindex="0"></span> <span> Beta </span> </span> <span class="component-status tool" title="Groups take on the status of their most degraded child component or service. Click to see the status of the individual children." > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> <!-- children components --> <div class="child-components-container "> <div data-component-id="cyqs00k58gfq" class="component-inner-container status-green " data-component-status="operational" data-js-hook=""> <span class="name"> Metadata Manager </span> <span class="tooltip-base tool" title="Metadata Manager (https://www.crossref.org/metadatamanager/) allows you to register your content and your references in one go - and it highlights any issues as you go along, rather than having to wait for a report.">?</span> <span class="component-status " title="" > Operational </span> <span class="tool icon-indicator fa fa-check" title="Operational"></span> </div> </div> </div> </div> <div class="component-statuses-legend font-small"> <div class="legend-item status-green"> <span class="icon-indicator fa fa-check"></span> Operational </div> <div class="legend-item status-yellow"> <span class="icon-indicator fa fa-minus-square"></span> Degraded Performance </div> <div class="legend-item status-orange"> <span class="icon-indicator fa fa-exclamation-triangle"></span> Partial Outage </div> <div class="breaker"></div> <div class="legend-item status-red"> <span class="icon-indicator fa fa-times"></span> Major Outage </div> <div class="legend-item status-blue"> <span class="icon-indicator fa fa-wrench"></span> Maintenance </div> </div> </div> <div class="custom-metrics-container" id="custom-metrics-container"> <div class="timeframes-container"> <a class="font-largest no-link" id="system-metrics" href="#system-metrics">System Metrics</a> <a href="#" class="timeframe color-secondary font-regular border-color" data-js-hook="data-time-period-toggle" data-time-period="month">Month</a> <a href="#" class="timeframe color-secondary font-regular border-color" data-js-hook="data-time-period-toggle" data-time-period="week"><span class="translation_missing" title="translation missing: en.week">Week</span></a> <a href="#" class="timeframe active color-secondary font-regular border-color" data-js-hook="data-time-period-toggle" data-time-period="day">Day</a> </div> <div class="metrics-container"> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Public REST API Response Time </div> <div data-js-hook="metrics-display-current-kkcl3l2w1k32" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-kkcl3l2w1k32" data-js-hook= "metrics-display-graph-container-kkcl3l2w1k32"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Public REST API Uptime </div> <div data-js-hook="metrics-display-current-2l4wm83n5bpd" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-2l4wm83n5bpd" data-js-hook= "metrics-display-graph-container-2l4wm83n5bpd"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Polite REST API Response Time </div> <div data-js-hook="metrics-display-current-3122vmhj0chr" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-3122vmhj0chr" data-js-hook= "metrics-display-graph-container-3122vmhj0chr"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Polite REST API Uptime </div> <div data-js-hook="metrics-display-current-9f1zz945w0gv" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-9f1zz945w0gv" data-js-hook= "metrics-display-graph-container-9f1zz945w0gv"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Plus REST API Response Time </div> <div data-js-hook="metrics-display-current-40d7lxm77wf1" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-40d7lxm77wf1" data-js-hook= "metrics-display-graph-container-40d7lxm77wf1"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Plus REST API Uptime </div> <div data-js-hook="metrics-display-current-j0d1l03hpcbd" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-j0d1l03hpcbd" data-js-hook= "metrics-display-graph-container-j0d1l03hpcbd"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Plus OAI-PMH Response Time </div> <div data-js-hook="metrics-display-current-vkx4n1vnxzzq" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-vkx4n1vnxzzq" data-js-hook= "metrics-display-graph-container-vkx4n1vnxzzq"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Plus OAI-PMH Uptime </div> <div data-js-hook="metrics-display-current-rh2qd45j3vpb" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-rh2qd45j3vpb" data-js-hook= "metrics-display-graph-container-rh2qd45j3vpb"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> OpenURL Response Time </div> <div data-js-hook="metrics-display-current-ldmy9zgxv6dt" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-ldmy9zgxv6dt" data-js-hook= "metrics-display-graph-container-ldmy9zgxv6dt"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> OpenURL Uptime </div> <div data-js-hook="metrics-display-current-g4rzkwn2mg7b" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-g4rzkwn2mg7b" data-js-hook= "metrics-display-graph-container-g4rzkwn2mg7b"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Public Content Negotiation Response Time </div> <div data-js-hook="metrics-display-current-x2wv8gvqrd3f" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-x2wv8gvqrd3f" data-js-hook= "metrics-display-graph-container-x2wv8gvqrd3f"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Public Content Negotiation Uptime </div> <div data-js-hook="metrics-display-current-7x9k0z26dpnd" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-7x9k0z26dpnd" data-js-hook= "metrics-display-graph-container-7x9k0z26dpnd"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Polite Content Negotiation Response Time </div> <div data-js-hook="metrics-display-current-0lxghhs7c4jf" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-0lxghhs7c4jf" data-js-hook= "metrics-display-graph-container-0lxghhs7c4jf"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Polite Content Negotiation Uptime </div> <div data-js-hook="metrics-display-current-pr30hw1d51sw" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-pr30hw1d51sw" data-js-hook= "metrics-display-graph-container-pr30hw1d51sw"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Plus Content Negotiation Response Time </div> <div data-js-hook="metrics-display-current-42tslwwms8jh" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-42tslwwms8jh" data-js-hook= "metrics-display-graph-container-42tslwwms8jh"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Plus Content Negotiation Uptime </div> <div data-js-hook="metrics-display-current-cj13bqcc15pw" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-cj13bqcc15pw" data-js-hook= "metrics-display-graph-container-cj13bqcc15pw"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Crossmark Response Time </div> <div data-js-hook="metrics-display-current-fzz502d9jcsf" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-fzz502d9jcsf" data-js-hook= "metrics-display-graph-container-fzz502d9jcsf"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Crossmark Uptime </div> <div data-js-hook="metrics-display-current-nv43pwgg5hw1" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-nv43pwgg5hw1" data-js-hook= "metrics-display-graph-container-nv43pwgg5hw1"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Event Data Query API Response Time </div> <div data-js-hook="metrics-display-current-dvpyfyfdvdz5" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-dvpyfyfdvdz5" data-js-hook= "metrics-display-graph-container-dvpyfyfdvdz5"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Event Data Query API Uptime </div> <div data-js-hook="metrics-display-current-n3c6y947q8kn" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-n3c6y947q8kn" data-js-hook= "metrics-display-graph-container-n3c6y947q8kn"></div> </div> </div> <div class="metric border-color"> <div class="metric-meta font-large"> <div class="metric-name color-primary"> Crossref Metadata Search Response Time </div> <div data-js-hook="metrics-display-current-vl1rbnc8xsq2" class="metric-average color-secondary"><span class="translation_missing" title="translation missing: en.fetching">Fetching</span></div> </div> <div class="metrics-display-graph"> <div class="graph-container" id="metrics-display-graph-container-vl1rbnc8xsq2" data-js-hook= "metrics-display-graph-container-vl1rbnc8xsq2"></div> </div> </div> </div> </div> <div class="incidents-list format-expanded"> <a class="font-largest no-link" id="past-incidents" href="#past-incidents">Past Incidents</a> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">23</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported today.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">22</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">21</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">20</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular "> <div class="date border-color font-large">Nov <var data-var="date">19</var>, <var data-var="year">2024</var></div> <div class="incident-container"> <div class="incident-title impact-maintenance font-large"> <a class="whitespace-pre-wrap" href="/incidents/vkcjg9vnv8w2">19 November - weekly maintenance, release v0.212.0</a> </div> <div class="updates-container"> <!-- postmortem --> <!-- incident updates --> <div class="update font-regular completed"> <strong>Completed</strong> - <span class="whitespace-pre-wrap">The scheduled maintenance has been completed.</span> <br> <small> Nov <var data-var='date'>19</var>, <var data-var='time'>16:33</var> UTC </small> </div> <div class="update font-regular in progress"> <strong>In progress</strong> - <span class="whitespace-pre-wrap">Scheduled maintenance is currently in progress. We will provide updates as necessary.</span> <br> <small> Nov <var data-var='date'>19</var>, <var data-var='time'>15:00</var> UTC </small> </div> <div class="update font-regular scheduled"> <strong>Scheduled</strong> - <span class="whitespace-pre-wrap">We will be undergoing scheduled maintenance - release v0.212.0 - on Tuesday, 19 November from 1500 to 1700 UTC. Our members may experience delays in deposit system admin tool (doi.crossref.org) processing. Deposits submitted during this time will be stored and processed after the maintenance has been completed. - IF</span> <br> <small> Nov <var data-var='date'>18</var>, <var data-var='time'>18:18</var> UTC </small> </div> </div> </div> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">18</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">17</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">16</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">15</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">14</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular "> <div class="date border-color font-large">Nov <var data-var="date">13</var>, <var data-var="year">2024</var></div> <div class="incident-container"> <div class="incident-title impact-maintenance font-large"> <a class="whitespace-pre-wrap" href="/incidents/gd6ds8qpzgtm">13 November - weekly maintenance, release v0.211.0</a> </div> <div class="updates-container"> <!-- postmortem --> <!-- incident updates --> <div class="update font-regular completed"> <strong>Completed</strong> - <span class="whitespace-pre-wrap">The scheduled maintenance has been completed.</span> <br> <small> Nov <var data-var='date'>13</var>, <var data-var='time'>16:35</var> UTC </small> </div> <div class="update font-regular in progress"> <strong>In progress</strong> - <span class="whitespace-pre-wrap">Scheduled maintenance is currently in progress. We will provide updates as necessary.</span> <br> <small> Nov <var data-var='date'>13</var>, <var data-var='time'>15:00</var> UTC </small> </div> <div class="update font-regular scheduled"> <strong>Scheduled</strong> - <span class="whitespace-pre-wrap">We will be undergoing scheduled maintenance - release v0.211.0 - on Wednesday, 13 November from 1500 to 1700 UTC. Our members may experience delays in deposit system admin tool (doi.crossref.org) processing. Deposits submitted during this time will be stored and processed after the maintenance has been completed. - IF</span> <br> <small> Nov <var data-var='date'>12</var>, <var data-var='time'>14:02</var> UTC </small> </div> </div> </div> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">12</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">11</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date">10</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> <div class="status-day font-regular no-incidents"> <div class="date border-color font-large">Nov <var data-var="date"> 9</var>, <var data-var="year">2024</var></div> <p class="color-secondary">No incidents reported.</p> </div> </div> <div class="page-footer border-color font-small"> <a href="/history" class="history-footer-link"><span style="font-family:arial">←</span> Incident History</a> <span class="color-secondary powered-by"><a class="color-secondary" target="_blank" rel="noopener noreferrer nofollow" href="https://www.atlassian.com/software/statuspage?utm_campaign=status.crossref.org&utm_content=SP-notifications&utm_medium=powered-by&utm_source=inapp">Powered by Atlassian Statuspage</a></span> </div> </div> </div> <!-- custom metrics stuff --> <script src="https://dka575ofm4ao0.cloudfront.net/assets/status_manifest-6a7ae3a8e2e1b1e1d9466495faa0851c3f5fff938743f6501c900aa2a8792e8c.js"></script> <div id="cpt-notification-container"></div> <!-- all of the content_for stuff --> <script src="https://dka575ofm4ao0.cloudfront.net/assets/register_subscription_form-589b657fec607087fc5c740c568270907310bc4f6aaa20256e70f01b103025ca.js"></script> <script type="text/javascript"> $(function() { SP.currentPage.registerSubscriptionForm('email'); SP.currentPage.registerSubscriptionForm('webhook'); }); $(function() { SP.currentPage.registerSubscriptionForm('p3wgb1753jyv'); }) </script> <script src="https://dka575ofm4ao0.cloudfront.net/assets/status_common-c1b99d73ee7ab0fea796bd170723c1daac1381095a7dd7501a38ce6f333d86b3.js"></script> <script> SP.pollForChanges('/api/v2/status.json'); </script> <script> $(function() { $('.tool').tooltipster({ animationDuration: 100, contentAsHTML: true, delay: 100, theme: 'tooltipster-borderless', functionInit: function (instance, helper) { var $origin = $(helper.origin), dataOptions = $origin.attr('data-tooltip-config'); if (dataOptions){ dataOptions = JSON.parse(dataOptions); $.each(dataOptions, function(name, option){ instance.option(name, option); }); } } }); // clicks on first tab in subscribe popout since we won't know which is first // upon construction in the ruby code $('.updates-dropdown-nav > a').eq(0).click(); // twitter follow button needs some margin $('.twitter-follow-button').css('margin-right', '6px'); }); $(function() { // open/close component groups HRB.utils.djshook('component-group-opener').on('click', function() { var groupParentIndicator = $(this).find('.group-parent-indicator'); groupParentIndicator.toggleClass('fa-plus-square-o').toggleClass('fa-minus-square-o').end().parent().toggleClass('open'); toggleGroup(groupParentIndicator) }); }); $(function() { HRB.utils.djshook('component-group-opener').on('keydown', function(event) { if (event.key !== "Enter" && event.key !== " ") { return; } event.preventDefault() var groupParentIndicator = $(this).find('.group-parent-indicator'); groupParentIndicator.toggleClass('fa-plus-square-o').toggleClass('fa-minus-square-o').end().parent().toggleClass('open'); toggleGroup(groupParentIndicator) }); }); function toggleGroup(groupParentIndicator) { var isOpen = groupParentIndicator.attr('aria-expanded') if (isOpen == 'false') { groupParentIndicator.attr('aria-expanded', 'true'); } else { groupParentIndicator.attr('aria-expanded', 'false'); } } $(function() { $(document).on('ajax:complete', '.modal.in', function(e) { // Close the active modal. $('.modal.in').modal('hide'); }); }); </script> <script src="https://dka575ofm4ao0.cloudfront.net/assets/vendor/highstock.min-a7181c8f093438143dae37524f8463a97e2503789bc322732d3141f2c00c1c1a.js"></script> <script> //<![CDATA[ String.prototype.commafy = function () { return this.replace(/(^|[^\w.])(\d{4,})/g, function($0, $1, $2) { return $1 + $2.replace(/\d(?=(?:\d\d\d)+(?!\d))/g, "$&,"); }); } Number.prototype.commafy = function () { return String(this).commafy(); } $(function() { SP.currentPage.numberToDecimalPlaces = function(num, dec) { if (dec == 0) { return Math.round(num).commafy(); } newnum = num.toFixed(dec) var finalValue; // this gets rid of the 100.000% thing if (num == parseInt(newnum)) finalValue = Math.round(num); else finalValue = newnum; return finalValue.commafy(); } SP.currentPage.getDataForTimePeriod = function(period) { $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/kkcl3l2w1k32/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-kkcl3l2w1k32') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-kkcl3l2w1k32'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Public REST API Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Public REST API Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Public REST API Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-kkcl3l2w1k32').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Public REST API Response Time', data : metricDataPoints['jvvzfxcblc9p'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/2l4wm83n5bpd/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-2l4wm83n5bpd') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-2l4wm83n5bpd'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Public REST API Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Public REST API Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Public REST API Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-2l4wm83n5bpd').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Public REST API Uptime', data : metricDataPoints['l2l6g7hystyr'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/3122vmhj0chr/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-3122vmhj0chr') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-3122vmhj0chr'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Polite REST API Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Polite REST API Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Polite REST API Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-3122vmhj0chr').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Polite REST API Response Time', data : metricDataPoints['8xwgc1vt1xm7'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/9f1zz945w0gv/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-9f1zz945w0gv') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-9f1zz945w0gv'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Polite REST API Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Polite REST API Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Polite REST API Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-9f1zz945w0gv').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Polite REST API Uptime', data : metricDataPoints['jtgwj07zgfrb'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/40d7lxm77wf1/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-40d7lxm77wf1') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-40d7lxm77wf1'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Plus REST API Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Plus REST API Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Plus REST API Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-40d7lxm77wf1').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Plus REST API Response Time', data : metricDataPoints['40xcvldf19kf'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/j0d1l03hpcbd/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-j0d1l03hpcbd') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-j0d1l03hpcbd'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Plus REST API Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Plus REST API Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Plus REST API Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-j0d1l03hpcbd').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Plus REST API Uptime', data : metricDataPoints['m1q53tct7rsq'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/vkx4n1vnxzzq/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-vkx4n1vnxzzq') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-vkx4n1vnxzzq'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Plus OAI-PMH Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Plus OAI-PMH Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Plus OAI-PMH Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-vkx4n1vnxzzq').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Plus OAI-PMH Response Time', data : metricDataPoints['wt6tkh2ltf7v'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/rh2qd45j3vpb/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-rh2qd45j3vpb') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-rh2qd45j3vpb'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Plus OAI-PMH Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Plus OAI-PMH Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Plus OAI-PMH Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-rh2qd45j3vpb').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Plus OAI-PMH Uptime', data : metricDataPoints['9l3427sq214r'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/ldmy9zgxv6dt/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-ldmy9zgxv6dt') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-ldmy9zgxv6dt'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>OpenURL Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>OpenURL Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>OpenURL Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-ldmy9zgxv6dt').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'OpenURL Response Time', data : metricDataPoints['nbwz3ydd3ryp'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/g4rzkwn2mg7b/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-g4rzkwn2mg7b') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-g4rzkwn2mg7b'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>OpenURL Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>OpenURL Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>OpenURL Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-g4rzkwn2mg7b').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'OpenURL Uptime', data : metricDataPoints['bctt3lkxcgtl'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/x2wv8gvqrd3f/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-x2wv8gvqrd3f') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-x2wv8gvqrd3f'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Public Content Negotiation Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Public Content Negotiation Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Public Content Negotiation Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-x2wv8gvqrd3f').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Public Content Negotiation Response Time', data : metricDataPoints['j1wjgn5ghvct'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/7x9k0z26dpnd/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-7x9k0z26dpnd') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-7x9k0z26dpnd'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Public Content Negotiation Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Public Content Negotiation Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Public Content Negotiation Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-7x9k0z26dpnd').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Public Content Negotiation Uptime', data : metricDataPoints['41w5zhh3pswy'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/0lxghhs7c4jf/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-0lxghhs7c4jf') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-0lxghhs7c4jf'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Polite Content Negotiation Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Polite Content Negotiation Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Polite Content Negotiation Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-0lxghhs7c4jf').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Polite Content Negotiation Response Time', data : metricDataPoints['qtdq52h2pgw7'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/pr30hw1d51sw/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-pr30hw1d51sw') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-pr30hw1d51sw'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Polite Content Negotiation Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Polite Content Negotiation Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Polite Content Negotiation Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-pr30hw1d51sw').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Polite Content Negotiation Uptime', data : metricDataPoints['1ytr8d9ghhph'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/42tslwwms8jh/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-42tslwwms8jh') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-42tslwwms8jh'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Plus Content Negotiation Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Plus Content Negotiation Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Plus Content Negotiation Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-42tslwwms8jh').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Plus Content Negotiation Response Time', data : metricDataPoints['py93f9pkf71j'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/cj13bqcc15pw/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-cj13bqcc15pw') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-cj13bqcc15pw'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Plus Content Negotiation Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Plus Content Negotiation Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Plus Content Negotiation Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-cj13bqcc15pw').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Plus Content Negotiation Uptime', data : metricDataPoints['yhhn9xbyqpz7'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/fzz502d9jcsf/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-fzz502d9jcsf') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-fzz502d9jcsf'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Crossmark Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Crossmark Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Crossmark Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-fzz502d9jcsf').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Crossmark Response Time', data : metricDataPoints['41jw8tq1k36j'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/nv43pwgg5hw1/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-nv43pwgg5hw1') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-nv43pwgg5hw1'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Crossmark Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Crossmark Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Crossmark Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-nv43pwgg5hw1').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Crossmark Uptime', data : metricDataPoints['xcybc0zxy7jb'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/dvpyfyfdvdz5/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-dvpyfyfdvdz5') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-dvpyfyfdvdz5'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Event Data Query API Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Event Data Query API Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Event Data Query API Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-dvpyfyfdvdz5').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Event Data Query API Response Time', data : metricDataPoints['76w5kkgjhm53'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/n3c6y947q8kn/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-n3c6y947q8kn') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-n3c6y947q8kn'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Event Data Query API Uptime</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Event Data Query API Uptime</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Event Data Query API Uptime</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 3 ) + '%'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-n3c6y947q8kn').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, tickPositions: [0.0, 50.0, 100.0], min: 0.0, startOnTick: false, max: 100.0, endOnTick: false, }, series : [ { name : 'Event Data Query API Uptime', data : metricDataPoints['4rd6d9q4pyy1'], tooltip: { valueSuffix: '%' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); $.ajax({ type: "GET", // this line must be end up with "//status.*" type of URLs (no protocol, just leading slashes). customers use SSL through us or by offloading with // cloudflare or something like it and the request.protocol the server sees is different than what the browser sees url: "//status.crossref.org/metrics-display/vl1rbnc8xsq2/_.json".replace('_', period) }).done(function(metricsDisplay, textStatus, xhr) { var summary = metricsDisplay.summary , $metricSummaryLabel = HRB.utils.djshook('metrics-display-current-vl1rbnc8xsq2') , $graphContainer = HRB.utils.djshook('metrics-display-graph-container-vl1rbnc8xsq2'); var errorMsg = null; if(summary === "unavailable") { errorMsg = 'We\'re having issues retrieving data for <strong>Crossref Metadata Search Response Time</strong>.</div>'; } else if(summary) { // we need to do a basic check to make sure we have any data at all var hasDataRollupsAvailable = false; for(var h = 0; h < metricsDisplay.metrics.length; h++) { if(metricsDisplay.metrics[h].data.length > 0) { hasDataRollupsAvailable = true; break; } } if(!hasDataRollupsAvailable) { errorMsg = "Oops! No data has been indexed for <strong>Crossref Metadata Search Response Time</strong> for this time period yet."; } } else { errorMsg = "Failed to load. <strong>Crossref Metadata Search Response Time</strong>"; } if(errorMsg !== null) { $metricSummaryLabel.text("--"); // display -- instead of number $graphContainer.html('<div class="small" style="text-align:center;">' + errorMsg + '</div>'); // removed .parent().find('.metric-meta').remove() so name still shows $graphContainer.removeAttr("style"); return; } $graphContainer.show(); $graphContainer.attr("style", "height: 120px"); // set style after error message removed it // proceed since we have data $metricSummaryLabel.text(SP.currentPage.numberToDecimalPlaces(summary['mean'], 0 ) + ' ms'); var metricDataPoints = {} , intervalMsec = metricsDisplay.period.interval * 1000; var startingBucketMsec = parseInt((new Date()).getTime() / intervalMsec) * intervalMsec; for(var h = 0; h < metricsDisplay.metrics.length; h++) { metricDataPoints[metricsDisplay.metrics[h].metric.id] = [] var data = metricsDisplay.metrics[h].data , currentBucketMsec = startingBucketMsec; for(var i = metricsDisplay.period.count; i > 0; i--) { // loop over the data and pull out the data point with the following characteristics // -> closest to currentBucketMsec // -> without being greater than currentMsecBucket // -> without being more than 1 intervalMsec bucket away var valueToUse = null; for(var j = data.length - 1; j >= 0; j--) { var currentTimestampMsec = data[j].timestamp * 1000; if(currentTimestampMsec <= currentBucketMsec && currentTimestampMsec > (currentBucketMsec - intervalMsec)) { valueToUse = data[j].value; // console.log("Using ts:" + currentTimestampMsec + " with value:" + valueToUse + " for bucket:" + currentBucketMsec); break; } } // local time var offset = -1 * (new Date()).getTimezoneOffset() * 60 * 1000; metricDataPoints[metricsDisplay.metrics[h].metric.id].push([currentBucketMsec + offset, valueToUse]) currentBucketMsec -= intervalMsec; } metricDataPoints[metricsDisplay.metrics[h].metric.id].reverse(); } // set Global options Highcharts.setOptions({ lang: { thousandsSep: ',' } }); $('#metrics-display-graph-container-vl1rbnc8xsq2').highcharts('StockChart', { plotOptions : { series : { animation : false, color : '#3EB1C8', connectNulls: false }, }, chart : { backgroundColor: '#FFFFFF' }, title : { text: '', style: { display: 'none', } }, credits : { enabled : false }, exporting : { enabled : false }, rangeSelector : { enabled : false }, scrollbar : { enabled : false }, navigator : { enabled : false }, xAxis: { gridLineColor : 'rgba(216,210,196,.8)', labels: { style : { color: '#242323' } }, lineColor: '#D8D2C4', }, yAxis: { gridLineColor : 'rgba(216,210,196,.5)', labels: { align: 'left', x: 5, y: 3, style : { color: '#242323' }, enabled : true }, showLastLabel: true, min: 0.0, startOnTick: false, tickPixelInterval: 40, }, series : [ { name : 'Crossref Metadata Search Response Time', data : metricDataPoints['j58zdbf0ggvm'], tooltip: { valueSuffix: ' ms' }, enableMouseTracking : ($(window).outerWidth() > 480) && true } ], tooltip: { borderWidth: 0, enabled: ($(window).outerWidth() > 480) && true, headerFormat: "<span style='font-size: 10px'>{point.key} </span>", hideDelay: 300, pointFormat: "<span style='color:{point.color}'>●</span> <b>{point.y}</b><br/>", positioner: function() { return {x: 0, y: 0 }; }, shadow: false, shape: "square", split: false } }); }); } var $timePeriodToggles = HRB.utils.djshook('data-time-period-toggle'); SP.currentPage.activeTimePeriodToggle = function(period) { $timePeriodToggles.removeClass('active'); $timePeriodToggles.filter('[data-time-period="' + period + '"]').addClass('active'); } SP.currentPage.getAndDisplayInitialChartData = function() { if (window.location.hash == '#week') { SP.currentPage.getDataForTimePeriod('week'); SP.currentPage.activeTimePeriodToggle('week'); } else if (window.location.hash == '#month') { SP.currentPage.getDataForTimePeriod('month'); SP.currentPage.activeTimePeriodToggle('month'); } else { SP.currentPage.getDataForTimePeriod('day'); SP.currentPage.activeTimePeriodToggle('day'); } } $timePeriodToggles.on('click', function() { var newPeriod = $(this).attr('data-time-period'); SP.currentPage.activeTimePeriodToggle(newPeriod); SP.currentPage.getDataForTimePeriod(newPeriod); window.location.hash = newPeriod; return false; }); SP.currentPage.getAndDisplayInitialChartData(); }) //]]> </script> <script> /** INITIALIZATION **/ var recaptchaIds = {} // Unfortunately there's no unique selectors on the parent divs that recaptcha adds. The first unique selector // is the iframe rendered 2 levels deep. So this waits until the iframes are added to the page, then finds // the parent div and sets the z index so that it'll render above our modals & dropdowns from the start. function setZIndex(captchaCount, startTime) { // bail after 10s just in case so we don't do this forever if something whaky happens if (new Date() - startTime > 10000) { return; } var iframes = document.querySelectorAll('iframe[title="recaptcha challenge"]'); if (iframes.length != captchaCount) { setTimeout(function() { setZIndex(captchaCount, startTime); }, 500); } for (var i = 0; i < iframes.length; i++) { // incident subscribe modal is 1050, so this has to be above that iframes[i].parentElement.parentElement.style.zIndex = "1100"; } } function updateCaptchaIframeTitle(captchaCount, startTime, updates=0) { if (new Date() - startTime > 10000 || captchaCount === updates) { return; } var iframesWithTitle = document.querySelectorAll('iframe[title="recaptcha challenge expires in two minutes"]'); if (iframesWithTitle.length != captchaCount) { setTimeout(function() { updateCaptchaIframeTitle(captchaCount, startTime, iframesWithTitle.length + updates); }, 500); } for (var i = 0; i < iframesWithTitle.length; i++) { iframesWithTitle[i].title = "recaptcha"; } } function addIncidentCaptcha() { var incidentCaptcha = document.createElement('div'); incidentCaptcha.setAttribute('id', 'subscribe-incident-recaptcha'); incidentCaptcha.setAttribute('class', 'g-recaptcha'); incidentCaptcha.setAttribute('data-sitekey', '6LcZ-b0UAAAAAENi956aWzynTT2ZJ80dGU3F80Op'); incidentCaptcha.setAttribute('data-callback', 'submitIncidentSubscriberSuccess'); incidentCaptcha.setAttribute('data-error-callback', 'submitIncidentSubscriberError'); incidentCaptcha.setAttribute('data-size', 'invisible'); document.body.appendChild(incidentCaptcha); var incidentCode = document.createElement('input'); incidentCode.setAttribute('type', 'hidden'); incidentCode.setAttribute('id', 'submit_incident_code'); document.body.appendChild(incidentCode); } var onloadCallback = function() { // if there is an incident, then add incident captcha element if (document.getElementsByClassName('modal-open-incident-subscribe').length > 0) { addIncidentCaptcha(); } var captchas = document.getElementsByClassName("g-recaptcha"); for(var i = 0; i < captchas.length; i++) { var elId = captchas[i].id; recaptchaIds[elId] = grecaptcha.enterprise.render(elId); } setZIndex(captchas.length, new Date()); updateCaptchaIframeTitle(captchas.length, new Date()); } /** SUBSCRIBE DROPDOWN */ // callbacks for captcha success function submitNewSubscriber(type, error) { if (error) document.querySelector('#subscribe-form-' + type + ' #captcha_error').value = 'true'; document.getElementById('subscribe-form-' + type).dispatchEvent(new Event('submit', {bubbles: true, cancelable: true})); grecaptcha.enterprise.reset(recaptchaIds['subscribe-btn-' + type]); } function submitNewEmailSubscriber(token) { submitNewSubscriber('email'); } function submitNewSmsSubscriber(token) { submitNewSubscriber('sms'); } function submitNewWebhookSubscriber(token) { submitNewSubscriber('webhook'); } function submitIncidentSubscriber(token, error) { var incidentCode = document.getElementById('submit_incident_code').value; var incidentForm = document.getElementById('subscribe-form-' + incidentCode); incidentForm.querySelector('input[name="captcha_error"]').value = error; incidentForm.querySelector('input[name="g-recaptcha-response"]').value = token; incidentForm.dispatchEvent(new Event('submit', {bubbles: true, cancelable: true})); grecaptcha.enterprise.reset(recaptchaIds['subscribe-incident-recaptcha']); } function submitIncidentSubscriberSuccess(token) { submitIncidentSubscriber(token, 'false'); } // callbacks if we get captcha network errors function emailSubscriberCaptchaError(token) { submitNewSubscriber('email', true); } function smsSubscriberCaptchaError(token) { submitNewSubscriber('sms', true); } function webhookSubscriberCaptchaError(token) { submitNewSubscriber('webhook', true); } function submitIncidentSubscriberError(token) { submitIncidentSubscriber(token, 'true'); } // tracking clicks ['email', 'sms', 'webhook'].forEach(function(type) { var el = document.getElementById('subscribe-btn-' + type); el && el.addEventListener("click", function() { $.ajax({ type: "POST", url: "/subscriptions/track_attempt", data: { type: type } }) }) }) // form submission success callbacks $('#subscribe-form-email').on('ajax:success', function(e, data, status, xhr){ if (data.type === 'success') { SP.currentPage.updatesDropdown.hide(); document.getElementById('email').value = ''; } }); $('#subscribe-form-sms').on('ajax:success', function(e, data, status, xhr){ if (data.type === 'success' && data.otp_flow !== true) { SP.currentPage.updatesDropdown.hide(); document.getElementById('phone-number').value = ''; } }); $('#subscribe-form-webhook').on('ajax:success', function(e, data, status, xhr){ if (data.type === 'success') { SP.currentPage.updatesDropdown.hide(); document.getElementById('endpoint-webhooks').value = ''; document.getElementById('email-webhooks').value = ''; } }); $('a.subscribe').on('click', function() { document.body.style.overflow = "hidden"; document.body.style.height = "100vh"; }); $('div.modal-open-incident-subscribe').on('hidden', function(){ document.body.style.overflow = ""; document.body.style.height = ""; }); function submitCaptchaIncidentSubscribe(event) { var incidentCode = event.target.id.split('-')[2]; event.preventDefault(); $.ajax({ type: "POST", url: "/subscriptions/track_attempt", data: { type: 'incident' } }) document.getElementById('submit_incident_code').value = incidentCode; grecaptcha.enterprise.execute(recaptchaIds['subscribe-incident-recaptcha']); } </script> <script src='https://www.recaptcha.net/recaptcha/enterprise.js?onload=onloadCallback&render=explicit' async defer></script> <script src="https://dka575ofm4ao0.cloudfront.net/packs/common-814024cd42fea12d6fe1.chunk.js"></script> <script src="https://dka575ofm4ao0.cloudfront.net/packs/globals-0c851e8c6754c4375f64.chunk.js"></script> <script src="https://dka575ofm4ao0.cloudfront.net/packs/runtime-8a1984f6547cb712c8d9.js"></script> <script> window.addEventListener('load', function () { const urlParams = new URLSearchParams(window.location.search); const messageToken = urlParams.get('slack_message_token'); const channelName = escape(urlParams.get('channel_name')); if(!!messageToken) { switch(messageToken) { case 'slack_auth_error': HRB.utils.notify('The Slack authorization attempt was unsuccessful. Try again.', {cssClass:'error'}); break; case 'subscribers_disabled_error': HRB.utils.notify('Slack subscriptions are not enabled on this page.', {cssClass:'error'}); break; case 'direct_message_channel_error': HRB.utils.notify('Subscriptions aren’t supported in direct messages. Try subscribing again and choose a channel instead.', {cssClass:'error'}); break case 'duplicate_error': HRB.utils.notify("You're already subscribed to get Slack notifications in that channel.", {cssClass:'error'}); break; case 'duplicate_private_channel_error': HRB.utils.notify(`You're already subscribed to get Slack notifications in #${channelName}. Invite the @Statuspage app to that channel to start getting status updates.`, {cssClass: 'error'}); break; case 'default_success': HRB.utils.notify("You're now subscribed to get Statuspage updates in Slack!", {cssClass:'success'}); break; case 'private_channel_success': HRB.utils.notify(`IMPORTANT: Invite the @Statuspage app to your Slack channel #${channelName} to start getting status updates.`, {cssClass:'success'}); break; } } }); </script> <!-- FOR FLASH NOTICES --> <!-- FOR ERROR --> <script> $(function() { var $link = $('<span class="color-secondary powered-by"><a class="color-secondary" target="_blank" rel="noopener noreferrer nofollow" href="https://www.atlassian.com/software/statuspage?utm_campaign=status.crossref.org&utm_content=SP-notifications&utm_medium=powered-by&utm_source=inapp">Powered by Atlassian Statuspage</a></span>'); var setPoweredByStyles = function() { if (!$('.powered-by').length) { $link.appendTo($('.page-footer')) } $('.powered-by').attr('style', 'display: inline !important; visibility:visible !important; opacity: 1 !important; position:static !important; text-indent:0px !important; transform:scale(1) !important'); } setInterval(setPoweredByStyles, 1000); }); </script> </body> </html>