investigações sôbre a tristeza dos citrus: ii - conceitos e dados sôbre a reação das plantas cítricas à tristeza</h1> <div class="dropdown d-inline-block mt-1 mb-2"> <button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" style="font-size:0.8rem;"> <i class="fas fa-language me-1"></i> Translate Title </button> <ul class="dropdown-menu"> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="tr">Turkish</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="es">Spanish</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="pt">Portuguese</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="ar">Arabic</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="zh">Chinese</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="fr">French</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="de">German</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="id">Indonesian</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="ru">Russian</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="th">Thai</a></li> </ul> </div> </div> <div class="paper-metrics"> <div class="paper-metric"> <i class="fas fa-eye"></i> Clicks: 125 </div> <div class="paper-metric"> <i class="fas fa-hashtag"></i> ID: 158759 </div> <div class="paper-metric"> <i class="fas fa-calendar-alt"></i> 1949 </div> </div> <div class="paper-actions"> <div class="paper-actions"> <a href="http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0006-87051949000100008" target="_blank" class="btn btn-success action-btn" rel="noopener noreferrer"> <i class="fas fa-file-pdf"></i> Free PDF </a> <span id="unpaywall-badge" style="display:none;"> <a id="unpaywall-link" href="#" target="_blank" class="btn btn-outline-success action-btn" rel="noopener noreferrer"> <i class="fas fa-unlock-alt"></i> <span id="unpaywall-text">Open Access PDF</span> </a> </span> <!-- Combined AI Analysis + Performance Tier Button - Available to all authenticated users --> <!-- Get Abstract Button - For articles with DOI/URL but no abstract --> </div> </div> <div id="altmetric-section" class="mb-3" style="display:none;"> <div class="card border-0 shadow-sm"> <div class="card-body d-flex align-items-center gap-3 py-2 px-3"> <img id="altmetric-donut" src="" alt="Altmetric" style="width:48px;height:48px;"> <div> <div class="fw-bold" style="font-size:0.95rem;"> Altmetric Attention Score: <span id="altmetric-score" class="text-primary"></span> </div> <small class="text-muted"> <span id="altmetric-tweeters"></span> <span id="altmetric-readers" class="ms-2"></span> <a id="altmetric-details-link" href="#" target="_blank" class="ms-2">View details</a> </small> </div> </div> </div> </div> <div class="quality-metrics-section"> <div class="quality-header"> <h5 class="quality-title"> <i class="fas fa-chart-line me-2"></i> Article Quality & Performance Metrics </h5> </div> <div class="quality-body"> <div class="row g-3"> <div class="col-md-6"> <div class="metric-card combined-quality"> <div class="metric-header"> <span class="metric-label">Overall Quality</span> </div> <div class="metric-value"> <span class="score-pending">Not rated</span> </div> <div class="metric-description"> Combines reader engagement with the AI quality analysis. This article has not been analysed, so there is no overall score — reader engagement is measured and shown alongside. </div> </div> </div> <div class="col-md-6"> <div class="metric-card engagement"> <div class="metric-header"> <span class="metric-label">Reader Engagement</span> <span class="tier-badge steady"> Steady Performance </span> </div> <div class="metric-value"> <span class="score-number">30.0</span> <span class="score-unit">/100</span> </div> <div class="metric-breakdown"> <div class="breakdown-item"> <i class="fas fa-eye"></i> <span>125 views</span> </div> <div class="breakdown-item"> <i class="fas fa-users"></i> <span>42 readers</span> </div> </div> </div> </div> <div class="col-12"> <div class="metric-card ai-quality ai-quality--idle"> <div class="metric-header"> <span class="metric-label">AI Quality Assessment</span> </div> <div class="metric-value"> <span class="score-pending">Not analyzed</span> </div> </div> </div> </div> </div> </div> <section class="rs-card"> <div class="rs-head"> <h5 class="rs-title"> <i class="fas fa-ranking-star me-2"></i>Readership in this journal </h5> <span class="rs-tier rs-tier-steady">Steady</span> </div> <div class="rs-body"> <p class="rs-line"> Ranked <strong>#140</strong> of 206 articles by views in <a href="https://journament.com/journal/984">revista espanola de salud publica</a> </p> <div class="rs-plot" role="img" aria-label="Readership curve of 206 articles; this one ranks 140"> <span class="rs-bar " style="height: 100%" title="#1 — 618 views"></span> <span class="rs-bar " style="height: 89%" title="#2 — 489 views"></span> <span class="rs-bar " style="height: 87%" title="#3 — 463 views"></span> <span class="rs-bar " style="height: 84%" title="#4 — 440 views"></span> <span class="rs-bar " style="height: 83%" title="#5 — 421 views"></span> <span class="rs-bar " style="height: 82%" title="#6 — 418 views"></span> <span class="rs-bar " style="height: 81%" title="#7 — 409 views"></span> <span class="rs-bar " style="height: 80%" title="#8 — 395 views"></span> <span class="rs-bar " style="height: 80%" title="#9 — 393 views"></span> <span class="rs-bar " style="height: 76%" title="#10 — 361 views"></span> <span class="rs-bar " style="height: 75%" title="#11 — 351 views"></span> <span class="rs-bar " style="height: 74%" title="#12 — 343 views"></span> <span class="rs-bar " style="height: 73%" title="#13 — 325 views"></span> <span class="rs-bar " style="height: 72%" title="#14 — 322 views"></span> <span class="rs-bar " style="height: 71%" title="#15 — 309 views"></span> <span class="rs-bar " style="height: 70%" title="#16 — 307 views"></span> <span class="rs-bar " style="height: 70%" title="#17 — 303 views"></span> <span class="rs-bar " style="height: 69%" title="#18 — 298 views"></span> <span class="rs-bar " style="height: 68%" title="#19 — 287 views"></span> <span class="rs-bar " style="height: 68%" title="#20 — 282 views"></span> <span class="rs-bar " style="height: 67%" title="#21 — 279 views"></span> <span class="rs-bar " style="height: 66%" title="#22 — 269 views"></span> <span class="rs-bar " style="height: 66%" title="#23 — 269 views"></span> <span class="rs-bar " style="height: 66%" title="#24 — 266 views"></span> <span class="rs-bar " style="height: 66%" title="#25 — 266 views"></span> <span class="rs-bar " style="height: 66%" title="#26 — 266 views"></span> <span class="rs-bar " style="height: 65%" title="#27 — 263 views"></span> <span class="rs-bar " style="height: 65%" title="#28 — 262 views"></span> <span class="rs-bar " style="height: 65%" title="#29 — 260 views"></span> <span class="rs-bar " style="height: 65%" title="#30 — 260 views"></span> <span class="rs-bar " style="height: 65%" title="#31 — 260 views"></span> <span class="rs-bar " style="height: 65%" title="#32 — 259 views"></span> <span class="rs-bar " style="height: 65%" title="#33 — 259 views"></span> <span class="rs-bar " style="height: 64%" title="#34 — 255 views"></span> <span class="rs-bar " style="height: 64%" title="#35 — 254 views"></span> <span class="rs-bar " style="height: 63%" title="#36 — 248 views"></span> <span class="rs-bar " style="height: 63%" title="#37 — 246 views"></span> <span class="rs-bar " style="height: 63%" title="#38 — 246 views"></span> <span class="rs-bar " style="height: 63%" title="#39 — 246 views"></span> <span class="rs-bar " style="height: 63%" title="#40 — 245 views"></span> <span class="rs-bar " style="height: 63%" title="#41 — 245 views"></span> <span class="rs-bar " style="height: 63%" title="#42 — 244 views"></span> <span class="rs-bar " style="height: 63%" title="#43 — 243 views"></span> <span class="rs-bar " style="height: 62%" title="#44 — 241 views"></span> <span class="rs-bar " style="height: 62%" title="#45 — 241 views"></span> <span class="rs-bar " style="height: 62%" title="#46 — 235 views"></span> <span class="rs-bar " style="height: 61%" title="#47 — 232 views"></span> <span class="rs-bar " style="height: 61%" title="#48 — 232 views"></span> <span class="rs-bar " style="height: 61%" title="#49 — 231 views"></span> <span class="rs-bar " style="height: 61%" title="#50 — 230 views"></span> <span class="rs-bar " style="height: 61%" title="#51 — 230 views"></span> <span class="rs-bar " style="height: 61%" title="#52 — 227 views"></span> <span class="rs-bar " style="height: 60%" title="#53 — 224 views"></span> <span class="rs-bar " style="height: 60%" title="#54 — 224 views"></span> <span class="rs-bar " style="height: 60%" title="#55 — 223 views"></span> <span class="rs-bar " style="height: 60%" title="#56 — 222 views"></span> <span class="rs-bar " style="height: 60%" title="#57 — 219 views"></span> <span class="rs-bar " style="height: 59%" title="#58 — 218 views"></span> <span class="rs-bar " style="height: 59%" title="#59 — 218 views"></span> <span class="rs-bar " style="height: 59%" title="#60 — 216 views"></span> <span class="rs-bar " style="height: 59%" title="#61 — 213 views"></span> <span class="rs-bar " style="height: 58%" title="#62 — 211 views"></span> <span class="rs-bar " style="height: 58%" title="#63 — 211 views"></span> <span class="rs-bar " style="height: 58%" title="#64 — 210 views"></span> <span class="rs-bar " style="height: 58%" title="#65 — 209 views"></span> <span class="rs-bar " style="height: 58%" title="#66 — 208 views"></span> <span class="rs-bar " style="height: 58%" title="#67 — 206 views"></span> <span class="rs-bar " style="height: 57%" title="#68 — 202 views"></span> <span class="rs-bar " style="height: 57%" title="#69 — 199 views"></span> <span class="rs-bar " style="height: 56%" title="#70 — 196 views"></span> <span class="rs-bar " style="height: 56%" title="#71 — 194 views"></span> <span class="rs-bar " style="height: 56%" title="#72 — 194 views"></span> <span class="rs-bar " style="height: 56%" title="#73 — 194 views"></span> <span class="rs-bar " style="height: 55%" title="#74 — 188 views"></span> <span class="rs-bar " style="height: 55%" title="#75 — 187 views"></span> <span class="rs-bar " style="height: 55%" title="#76 — 187 views"></span> <span class="rs-bar " style="height: 55%" title="#77 — 187 views"></span> <span class="rs-bar " style="height: 55%" title="#78 — 186 views"></span> <span class="rs-bar " style="height: 55%" title="#79 — 184 views"></span> <span class="rs-bar " style="height: 55%" title="#80 — 184 views"></span> <span class="rs-bar " style="height: 54%" title="#81 — 183 views"></span> <span class="rs-bar " style="height: 54%" title="#82 — 183 views"></span> <span class="rs-bar " style="height: 54%" title="#83 — 183 views"></span> <span class="rs-bar " style="height: 54%" title="#84 — 182 views"></span> <span class="rs-bar " style="height: 54%" title="#85 — 182 views"></span> <span class="rs-bar " style="height: 54%" title="#86 — 182 views"></span> <span class="rs-bar " style="height: 54%" title="#87 — 181 views"></span> <span class="rs-bar " style="height: 54%" title="#88 — 178 views"></span> <span class="rs-bar " style="height: 53%" title="#89 — 176 views"></span> <span class="rs-bar " style="height: 53%" title="#90 — 176 views"></span> <span class="rs-bar " style="height: 53%" title="#91 — 175 views"></span> <span class="rs-bar " style="height: 53%" title="#92 — 174 views"></span> <span class="rs-bar " style="height: 53%" title="#93 — 173 views"></span> <span class="rs-bar " style="height: 53%" title="#94 — 172 views"></span> <span class="rs-bar " style="height: 53%" title="#95 — 172 views"></span> <span class="rs-bar " style="height: 53%" title="#96 — 171 views"></span> <span class="rs-bar " style="height: 52%" title="#97 — 170 views"></span> <span class="rs-bar " style="height: 52%" title="#98 — 168 views"></span> <span class="rs-bar " style="height: 52%" title="#99 — 168 views"></span> <span class="rs-bar " style="height: 52%" title="#100 — 167 views"></span> <span class="rs-bar " style="height: 52%" title="#101 — 166 views"></span> <span class="rs-bar " style="height: 52%" title="#102 — 164 views"></span> <span class="rs-bar " style="height: 52%" title="#103 — 164 views"></span> <span class="rs-bar " style="height: 52%" title="#104 — 164 views"></span> <span class="rs-bar " style="height: 51%" title="#105 — 160 views"></span> <span class="rs-bar " style="height: 50%" title="#106 — 155 views"></span> <span class="rs-bar " style="height: 50%" title="#107 — 155 views"></span> <span class="rs-bar " style="height: 50%" title="#108 — 153 views"></span> <span class="rs-bar " style="height: 49%" title="#109 — 151 views"></span> <span class="rs-bar " style="height: 49%" title="#110 — 150 views"></span> <span class="rs-bar " style="height: 49%" title="#111 — 147 views"></span> <span class="rs-bar " style="height: 49%" title="#112 — 147 views"></span> <span class="rs-bar " style="height: 48%" title="#113 — 145 views"></span> <span class="rs-bar " style="height: 48%" title="#114 — 145 views"></span> <span class="rs-bar " style="height: 48%" title="#115 — 145 views"></span> <span class="rs-bar " style="height: 48%" title="#116 — 143 views"></span> <span class="rs-bar " style="height: 48%" title="#117 — 143 views"></span> <span class="rs-bar " style="height: 48%" title="#118 — 142 views"></span> <span class="rs-bar " style="height: 48%" title="#119 — 142 views"></span> <span class="rs-bar " style="height: 48%" title="#120 — 141 views"></span> </div> <div class="rs-axis"> <span>Most read</span> <span>Least read</span> </div> <p class="rs-note"> Bar heights use a square-root scale. Only the 120 most-read articles are drawn; the journal has 206 in total. </p> </div> </section> <div class="nft-panel nft-panel--offer card mb-4" id="blockchain-nft"> <div class="card-header d-flex flex-wrap align-items-center gap-2"> <span class="nft-panel__icon" aria-hidden="true"><i class="fas fa-cube"></i></span> <h5 class="mb-0 me-auto">Mint this article as an NFT</h5> <span class="badge bg-secondary text-white">Not yet minted</span> </div> <div class="card-body"> <p class="mb-3"> Create a permanent, verifiable on-chain record of this article on the Scimatic Network. The NFT is held in your Journament account, and you can withdraw it to your own wallet at any time. </p> <div class="nft-offer-price"> <span class="nft-offer-price__amount">5</span> <span class="nft-offer-price__unit">SUSD</span> <span class="nft-offer-price__note">one-off · no wallet required</span> </div> </div> <div class="card-footer d-flex flex-wrap align-items-center gap-2"> <a href="https://journament.com/login" class="btn btn-sm btn-primary"> <i class="fas fa-sign-in-alt me-1"></i>Sign in to mint </a> </div> </div> <div class="paper-body"> <div class="abstract-section"> <h5 class="abstract-heading">Abstract</h5> <div class="translation-tabs-wrapper mt-3" data-type="bibliography" data-id="158759" data-field="abstract"> <ul class="nav nav-pills mb-2 translation-nav" style="font-size:0.8rem; gap:4px;"> <li class="nav-item"> <a class="nav-link active py-1 px-2" data-bs-toggle="pill" href="#abstract-lang-en">EN</a> </li> <li class="nav-item ms-auto"> <div class="dropdown d-inline-block"> <button class="btn btn-outline-secondary btn-sm py-0 px-2 dropdown-toggle" type="button" data-bs-toggle="dropdown" style="font-size:0.8rem;"> <i class="fas fa-plus"></i> </button> <ul class="dropdown-menu dropdown-menu-end"> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="tr">Turkish</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="es">Spanish</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="pt">Portuguese</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="ar">Arabic</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="zh">Chinese</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="fr">French</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="de">German</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="id">Indonesian</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="ru">Russian</a></li> <li><a class="dropdown-item translate-lang-btn" href="#" data-locale="th">Thai</a></li> </ul> </div> </li> </ul> <div class="tab-content"> <div class="tab-pane fade show active" id="abstract-lang-en"> <div class="abstract-content"><abstract language="eng">The writers review previous concepts concerning the reaction of citrus plants to the tristeza disease. It is recognized that environmental factors such as temperature, humidity and light can influence plant reaction, but these are considered of relatively minor importance. Characteristics of the plant itself govern its reaction to the disease and among those, resistance to infection, ability to permit virus increase and tolerance or non-tolerance of tissues are considered most important. Tests using viruliferous oriental citrus aphids for inoculation of various citrus types budded over sour orange rootstocks (table 1 and 2) showed a correlation between susceptibility to infection and severity of symptoms. The sweet oranges proved to be the most susceptible to infection and showed severe disease symptoms. The Barão sweet orange appeared to be more susceptible than Valencia. The mandarins tended to show some resistance to infection, but when infected, severe symptoms developed. The tolerant tangelos (7) behaved similarly to sweet oranges : They were very susceptible to infection and showed severe symptoms. The non-tolerant tangelos, susceptible citranges (7) and grapefruits behaved more or less alike, and showed medium susceptibility to infection and moderately severe disease symptoms. Among the grapefruits, Leonardy was. observed to be relatively more susceptible and showed more severe symptoms than Duncan. The pummelos, shaddocks and sour oranges were comparatively very resistant to infection and showed only moderate symptoms when infected. It has been found that the sour oranges can be more easily infected by tissue union than by the aphid vector. Poncirus trifoliata, citrumelos and resistant citranges showed no symptoms and no virus could be recovered from the inoculated plants even after three inoculations. The nature of injury caused by tristeza in the non-tolerant graft and intergraft combinations is discussed. The observation of symptoms shown by plants consisting of a sour orange inter-stem-graft between sweet orange roots and foliage seems to indicate that phloem collapse of the sour intergraft does not entirely prevent food translocation, since under field conditions the sweet stem below the sour intergraft continued, for almost two years, to increase in size at about the same rate as the sweet stem above. The growth of the sour intergraft was observed to be constricted and its lack of developments indicates a possible injurious effect of the disease on tissues other than the phloem. Root tissues of sour oranges have been found to be sensitive ;to injury, sincejsweet orange tops grafted directly onto sour orange roots and subsequently inoculated showed the usual tristeza symptoms. Death of rootlets and roots was found to occur not only in infected plants with tolerant tops and non-tolerant rootstocks but also on infected tolerant plants having an inter-stem-graft of non-tolerant sour orange. These observations and those made of root reaction on mechanically ringed plants indicate that although the root tissues of non-tolerant stocks may be sensitive to injury the rootlet and root symptoms are mostly secondary reactions. Tests carried out showed that the tristeza virus was recovered from insect protected sprouts grown at the ends of severed roots of Caipira sweet orange stock thus indicating that the virus was definitely present in the roots of a tolerant rootstock. Previously tristeza has been recognized as being associated with various citrus stock-scion combinations. In the present paper 50 seedling types have been reported as showing tristeza symptoms following heavy aphid inoculation. The symptoms shown by infected seedlings are similar to those shown by non-tolerant stock-scion combinations. Small sweet orange seedlings have been observed to show some symptoms of tristeza following heavy inoculations, but citrus types possessing tolerant tissues have shown a tendency toward recovery from symptom expression. The writers, on the basis of observed plant responses, have discussed the mode of inheritance of the main characteristis involved in plant reaction to tristeza. Some seedling progenies of known crosses between Poncirus trifoliata and sweet oranges (citranges) have been found to permit virus increase as the sweet orange parent does, whereas others behave like P. trifoliata and apparently do not permit virus multiplication. No relationship has been found between the trifoliata leaf-shape and inability to permit virus increase, since some of the hybrids that possess the trifoliata leaves, permit virus multiplication. Backcrosses of citranges to sweet oranges show a tendency to behave like the sweet orange parent. Hybrids between P. trifoliata and grapefruits (citrumelos) have behaved in most cases as the parent P. trifoliata. This seems to indicate that tolerant tissues and inability to permit virus increase are dependent on dominant factors in this type of cross. Hybrids between Citrus reticulata and C. paradisi (tangelos) do not show a clear-cut type of inheritance. Some tangelos behave Uke the mandarin parent, possessing tolerant tissues ; others behave like the grapefruit parent indicating possession of non-tolerant tissues. The inability to permit virus increase is a characteristic of little value in a rootstock improvement since tops of most commercial citrus varieties permit virus multiplication. It is pointed out that improvement of citrus rootstock with respect to tristeza should be aimed at combining tolerant tissues such as found in P. trifoliata or hybrids, C. sinensis, C. reticulata, etc., with other favorable characters such as vigor, resistance to gummosis, etc. Field tests showed that the reaction of infective buds on different rootstocks varies not only according to the tolerance of non-tolerance of the rootstock tissues, but also according to whether the buds themselves belong to types that possess non-tolerant or tolerant tissues. Infective buds of tolerant types, as sweet oranges, when budded on non-tolerant stocks produce a first flush of growth that is apparently healthy, but which later shows disease symptoms. For a period of about two months from date of budding, there is little or no difference between sprouts from healthy or infective buds of tolerant types. In contrast, when infective buds of non-tolerant types are budded on non-tolerant stocks, disease symptoms appear practically as soon as the buds start to grow. Observations indicate that infective buds from tolerant citrus types when budded on tolerant stocks usually do not develop symptoms even though the plant is a carrier of the virus. On the other hand observations indicate that infective buds of non-tolerant citrus types when budded on tolerant stocks may at times produce some symptoms. A possible explanation for the above-mentioned reactions is presented and is based on the relation between virus movement and food translocation in the plant. In the study of the relationship of tristeza virus to host tissues, plants composed of a sweet top over sour orange rootstock were allowed to develop two sweet orange branches. One branch of each plant was then ringed and inoculated by the vector. The branch not inoculated did not develop symptoms and 16 months after inoculation, buds were taken from the inoculated and the non-inoculated branches and tested for presence of virus. All buds taken from the inoculated ringed branches were found to be carrying the virus, whereas the buds taken from the other branch of the same plant did not have any virus. This experiment shows that the tristeza virus was not able to move across the ringed portion of the stem during that period, thus indicating that the tristeza virus is probably a phloem virus. Results from extensive buddings of various citrus stocks in the field indicate that buds taken from old sweet orange plants that have been known to be infected for a long time have been found to carry the virus in all buds. On the other hand, tests with buds taken from young plants recently infected, of Duncan grapefruit, sour orange and in some cases of Dancy tangerine and Valencia sweet orange, showed that not all buds were carrying the virus. It is not yet known whether buds that are mature prior to infection may temporarily escape virus invasion or whether citrus types which have non-tolerant tissues may limit to a certain extent complete systemic invasion of the tristeza virus.</div> </div> </div> </div> </div> <table class="info-table"> <tr> <th>Reference Key</th> <td> <div class="d-flex align-items-center flex-wrap"> <span class="badge bg-dark me-3">costa1949bragantia<title</span> <span class="text-muted">Use this key to autocite in the manuscript while using <a href="https://scimatic.org" class="info-link" target="_blank">SciMatic Manuscript Manager or Thesis Manager</a> </span> </div> </td> </tr> <tr> <th>Authors</th> <td>;A. S. Costa;T. J. Grant;S. Moreira</td> </tr> <tr> <th>Journal</th> <td> <a href="https://journament.com/journal/984" class="info-link"> <i class="fas fa-book-open me-1"></i> revista espanola de salud publica </a> </td> </tr> <tr> <th>Year</th> <td> 1949 </td> </tr> <tr> <th>DOI</th> <td> <div id="doi-display-container"> <span id="doi-value">10.1590/S0006-87051949000100008</span> </div> <div id="doi-search-status" class="mt-2" style="display: none;"> <div class="alert alert-info mb-0"> <i class="fas fa-spinner fa-spin me-2"></i> <span id="doi-search-message">Searching for DOI...</span> </div> </div> </td> </tr> <tr> <th>URL</th> <td> <div class="mb-2"> <i class="fas fa-external-link-alt text-primary me-2"></i> <a href="http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0006-87051949000100008" target="_blank" class="info-link">http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0006-87051949000100008</a> </div> <div> <i class="fas fa-external-link-alt text-primary me-2"></i> <a href="https://doi.org/10.1590/S0006-87051949000100008" target="_blank" class="info-link">https://doi.org/10.1590/S0006-87051949000100008</a> </div> </td> </tr> <tr> <th>Keywords</th> <td> <div class="keywords-list"> <a href="https://journament.com/keyword_connections/741" class="keyword-tag"> <i class="fas fa-tag me-1"></i> Agriculture (General) </a> </div> </td> </tr> </table> </div> </div> <!-- Citations Chart --> <!-- Ad Unit --> <div class="my-4"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-4045225739665865" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-4045225739665865" data-ad-slot="2450678444" data-ad-format="auto" data-full-width-responsive="true"></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script> </div> <!-- Citations Section --> <div class="citations-section"> <div class="citations-header"> <h3 class="citations-title"> <i class="fas fa-quote-left"></i> Citations </h3> </div> <div class="citations-body"> <div class="empty-state"> <i class="fas fa-quote-right"></i> <p>No citations found. To add a citation, contact the admin at info@scimatic.org</p> </div> </div> </div> <!-- Comments Section --> <div class="comments-section"> <div class="comments-header"> <h3 class="comments-title"> <i class="fas fa-comments"></i> Comments </h3> <div> <a href="https://journament.com/login" class="btn btn-primary action-btn me-2"> <i class="fas fa-sign-in-alt"></i> Login to comment </a> <a href="https://journament.com/register" class="btn btn-secondary action-btn"> <i class="fas fa-user-plus"></i> Register </a> </div> </div> <div class="comments-body"> <div class="empty-state"> <i class="far fa-comment-dots"></i> <p>No comments yet. Be the first to comment on this article.</p> </div> </div> </div> </div> </div> </div> <!-- AI Analysis Confirmation Modal --> <div class="modal fade" id="ai_analysis_modal" tabindex="-1" aria-labelledby="aiAnalysisModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content" style="border-radius: 15px; border: none; box-shadow: 0 10px 40px rgba(0,0,0,0.15);"> <div class="modal-header" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 15px 15px 0 0; border: none; padding: 25px 30px;"> <h5 class="modal-title text-white" id="aiAnalysisModalLabel" style="font-weight: 600; font-size: 1.3rem;"> <i class="fas fa-brain me-2"></i>Calculate Quality Scores </h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body" style="padding: 30px;"> <div class="mb-4"> <h6 class="fw-bold mb-3" style="color: #333; font-size: 1.1rem;"> <i class="fas fa-chart-line text-primary me-2"></i>What will be calculated: </h6> <div class="row g-3"> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Readability & Clarity</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Academic Rigor</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Novelty</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Methodology Quality</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Practical Impact Potential</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Research Integrity</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Performance Tier</span> </div> </div> <div class="col-md-6"> <div class="d-flex align-items-start"> <i class="fas fa-check-circle text-success mt-1 me-2"></i> <span>Keyword Generation</span> </div> </div> </div> </div> <div class="alert alert-info mb-4" role="alert" style="border-left: 4px solid #2196F3; background-color: #E3F2FD; border-radius: 8px;"> <div class="d-flex align-items-center"> <i class="fas fa-info-circle text-info me-2" style="font-size: 1.2rem;"></i> <div> <strong>Analysis powered by Google Gemini AI</strong><br> <small>Following NISO RP-25-2016 and DORA assessment principles</small> </div> </div> </div> <div class="alert alert-warning mb-3" role="alert" style="border-left: 4px solid #FF9800; background-color: #FFF3E0; border-radius: 8px;"> <div class="d-flex align-items-center"> <i class="fas fa-clock text-warning me-2" style="font-size: 1.2rem;"></i> <div> <strong>Estimated time: 10-30 seconds</strong><br> <small>Please wait while AI analyzes the article</small> </div> </div> </div> <div class="pricing-box mb-0" style="background: linear-gradient(135deg, #e8f5e9 0%, #f1f8e9 100%); border-radius: 10px; padding: 15px; border: 1px solid #c8e6c9;"> <div class="d-flex justify-content-between align-items-center"> <div> <div style="font-weight: 600; color: #2e7d32; font-size: 0.95rem;"> <i class="fas fa-tag me-1"></i>Analysis Cost </div> <div style="font-size: 1.5rem; font-weight: 700; color: #1b5e20;"> 5.00 USDT </div> </div> <div class="text-end"> <div style="font-weight: 600; color: #666; font-size: 0.9rem;"> <i class="fas fa-wallet me-1"></i>Your Balance </div> <div style="font-size: 1.3rem; font-weight: 700; color: #c62828;"> 0.00 USDT </div> </div> </div> <div class="mt-2 text-center"> <span class="text-danger" style="font-size: 0.9rem;"> <i class="fas fa-exclamation-triangle me-1"></i> Insufficient balance. <a href="https://journament.com/dashboard/balance" class="fw-bold">Top up now</a> </span> </div> </div> </div> <div class="modal-footer flex-wrap" style="border-top: 1px solid rgba(0,0,0,0.05); padding: 20px 30px; gap: 8px;"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" style="border-radius: 8px; padding: 10px 20px;"> <i class="fas fa-times me-1"></i>Cancel </button> <button type="button" class="btn btn-success" id="ai-article-pay-card-btn" style="border-radius: 8px; padding: 10px 25px; font-weight: 600;"> <i class="fas fa-credit-card me-2"></i>Pay $5.00 with Card </button> <a href="https://journament.com/dashboard/balance" class="btn btn-outline-success" style="border-radius: 8px; padding: 10px 25px; font-weight: 600;"> <i class="fas fa-plus-circle me-2"></i>Top Up Balance </a> </div> </div> </div> </div> <!-- Claim Authorship Modal --> <div class="modal fade" id="claim_authorship" tabindex="-1" aria-labelledby="claimAuthorshipLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="claimAuthorshipLabel"> Claim Authorship </h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <p> Do you claim this paper? If you are one of the authors of this paper, click the Claim button below. </p> <a class="btn btn-danger" href="https://journament.com/claim_biblio/158759"> <i class="fas fa-user-check me-2"></i>Claim </a> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button> </div> </div> </div> </div> <!-- Modals --> <!-- Modal --> <div class="modal fade" id="add_keyword_biblio" tabindex="-1" aria-labelledby="addKeywordBiblioLabel" aria-hidden="true"> <div class="modal-dialog modal-sm"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="addKeywordBiblioLabel"> Add Keyword </h5> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <form action="https://journament.com/journals" method="store"> <label for="keyword" class="">Enter Keyword e.g. Organic Chemistry</label> <input type="text" name="keyword" value="" class="form-control" placeholder="Suitable Keyword" > <input type="hidden" name="store_type" value="add_keyword"> <input type="hidden" name="bibliography_id" value="158759"> <button type="submit" class="btn btn-primary">Save</button> </form> </div> </div> </div> </div> </main> <!-- Footer --> <footer class="footer"> <div class="container"> <div class="row"> <div class="col-lg-4 footer-column"> <div class="d-flex align-items-center mb-3"> <img src="https://journament.com/storage/journament/logo.png" alt="Journament" class="footer-log" style="height: 160px; width: auto; margin-bottom: 0; margin-right: 12px;"> <span style="font-weight: 700; font-size: 1.5rem; color: #ffffff;">Journament</span> </div> <p class="mb-3">Journament is a unique journals indexing service that helps researchers find the perfect publication venue for their work.</p> <div style="background: rgba(255,255,255,0.1); padding: 15px; border-radius: 8px; margin-top: 15px;"> <div style="font-size: 0.9rem; color: #ecf0f1; margin-bottom: 10px;"> <i class="fas fa-brain me-2"></i><strong>Powered by AI</strong> </div> <div style="font-size: 0.85rem; color: #bdc3c7; line-height: 1.5;"> Following NISO RP-25-2016, DORA 2025, and COPE international standards for transparent research assessment </div> </div> </div> <div class="col-lg-2 col-md-3 col-sm-6 footer-column"> <h5 class="footer-heading">Quick Links</h5> <ul class="footer-links"> <li><a href="https://journament.com/en">Home</a></li> <li><a href="https://journament.com/en/statistics">Statistics</a></li> <li><a href="https://journament.com/en/journals">Journals</a></li> <li><a href="https://journament.com/en/howitworks">How It Works</a></li> <li><a href="https://journament.com/en/pricing">Pricing</a></li> <li><a href="https://journament.com/login">Login</a></li> <li><a href="https://journament.com/register">Register</a></li> </ul> </div> <div class="col-lg-2 col-md-3 col-sm-6 footer-column"> <h5 class="footer-heading">Resources</h5> <ul class="footer-links"> <li><a href="https://journament.com/en/blog">Blog</a></li> <li><a href="https://journament.com/en/help">Help Center</a></li> <li><a href="https://journament.com/en/faqs">FAQs</a></li> <li><a href="mailto:info@journament.com">Contact Us</a></li> </ul> </div> <div class="col-lg-2 col-md-3 col-sm-6 footer-column"> <h5 class="footer-heading">Partner Sites</h5> <ul class="footer-links"> <li><a href="https://scimatic.org" target="_blank">SciMatic</a></li> <li><a href="https://improofer.com" target="_blank">ImProofer</a></li> <li><a href="https://scimatic.net" target="_blank">SciMatic Network</a></li> <li><a href="https://decerta.scimatic.net" target="_blank">DeCerta</a></li> <li><a href="https://events.scimatic.net" target="_blank">SciMatic Events</a></li> </ul> </div> <div class="col-lg-2 col-md-3 col-sm-6 footer-column"> <h5 class="footer-heading">Company & Legal</h5> <ul class="footer-links"> <li><a href="https://journament.com/en/about">About Us</a></li> <li><a href="https://journament.com/en/terms">Terms of Service</a></li> <li><a href="https://journament.com/en/privacy">Privacy Policy</a></li> <li><a href="https://journament.com/en/delivery">Delivery & Returns</a></li> <li><a href="https://journament.com/en/distance-sales">Distance Sales Agreement</a></li> </ul> </div> </div> <!-- Payment Methods --> <div class="row mt-4"> <div class="col-12 text-center"> <div style="background: rgba(255,255,255,0.05); padding: 20px; border-radius: 8px;"> <p style="color: #bdc3c7; font-size: 14px; margin-bottom: 15px;">Secure Payment Methods</p> <div class="d-flex justify-content-center align-items-center gap-3 flex-wrap"> <img src="https://journament.com/images/payment/visa.svg" alt="Visa" style="height: 32px; background: white; padding: 4px 8px; border-radius: 4px;"> <img src="https://journament.com/images/payment/mastercard.svg" alt="MasterCard" style="height: 32px; background: white; padding: 4px 8px; border-radius: 4px;"> </div> </div> </div> </div> <div class="footer-bottom text-center"> <p class="footer-copyright mb-0"> © 2026 Journament. All rights reserved. | AI-Powered Quality Analysis </p> </div> </div> </footer> </div> <!-- Scripts are loaded via Vite --> <!-- Custom scripts per page --> <script> document.addEventListener('DOMContentLoaded', function () { const cardBtn = document.getElementById('ai-article-pay-card-btn'); if (!cardBtn) return; cardBtn.addEventListener('click', function () { const original = cardBtn.innerHTML; cardBtn.disabled = true; cardBtn.innerHTML = '<i class="fas fa-spinner fa-spin me-2"></i>Redirecting…'; fetch('https://journament.com/bibliographies/158759/checkout-article-quality', { method: 'POST', headers: { 'X-CSRF-TOKEN': 'UDopqR5pVGNLXoBL6w2YgGTbhKFKRqSyqVIAZzRh', 'Accept': 'application/json', 'Content-Type': 'application/json' } }) .then(r => r.json()) .then(data => { if (data.success && data.checkout_url) { window.location.href = data.checkout_url; } else { cardBtn.disabled = false; cardBtn.innerHTML = original; if (typeof showNotification === 'function') { showNotification(data.error || 'Could not start checkout. Please try again.', 'danger'); } else { alert(data.error || 'Could not start checkout.'); } } }) .catch(err => { cardBtn.disabled = false; cardBtn.innerHTML = original; if (typeof showNotification === 'function') { showNotification('Network error. Please try again.', 'danger'); } }); }); }); </script> <!-- jQuery CDN for immediate fix --> <script src="https://code.jquery.com/jquery-3.7.1.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous"></script> <script> // Translation strings for JavaScript window.__bib_trans = { confirmation_required: "Confirmation Required", cancel: "Cancel", confirm: "Confirm", ai_analysis_in_progress: "AI Analysis in Progress...", analyzing_with_gemini: "Analyzing article with Gemini AI...", evaluating_readability: "Evaluating readability and clarity...", assessing_rigor: "Assessing academic rigor...", measuring_novelty: "Measuring novelty and innovation...", analyzing_methodology: "Analyzing methodology quality...", calculating_relevance: "Calculating topic relevance...", evaluating_integrity: "Evaluating research integrity...", finalizing_scores: "Finalizing quality scores...", analysis_completed: "The page will now reload with fresh data.", analysis_failed_retry: "Failed to complete analysis", analysis_start_failed: "Failed to start analysis. Please try again.", analysis_longer_than_expected: "Analysis is taking longer than expected. Please refresh the page to check results.", analysis_status_failed: "Failed to check analysis status. Please refresh and try again.", ai_analysis_failed_retry: "AI analysis failed. Please try again.", calculating: "Calculating...", calculate_tier_confirm: "Calculate performance tier for this article?\u003Cbr\u003E\u003Cbr\u003EThis will determine if the article is a star\/popular\/steady\/emerging performer within its journal based on engagement metrics.\u003Cbr\u003E\u003Cstrong\u003ECost: 5 USDT\u003C\/strong\u003E", calculation_failed: "Calculation failed", tier_calculation_error: "An error occurred during tier calculation. Please try again.", extract_abstract_title: "Extract Abstract", extract_abstract_text: "This will attempt to automatically extract the abstract from:", not_available: "Not available", extract_time_warning: "This may take 10-30 seconds. Continue?", still_extracting: "Still extracting...", extract_timeout: "Abstract extraction timed out. The process may still be running in the background. Please refresh the page to check if the abstract was added.", extract_success: "Abstract extracted successfully! The page will now reload to show the results.", extract_failed: "Failed to extract abstract. Please try again.", extract_network_error: "Network error during abstract extraction. Please check your connection and try again.", research_abstract_title: "Re-search Abstract", research_abstract_text: "The current abstract appears to be incomplete or contains metadata.", research_abstract_sources: "This will attempt to find a better abstract from:", research_replace_warning: "This may take 10-30 seconds and will replace the current abstract. Continue?", still_researching: "Still re-searching...", research_timeout: "Abstract re-search timed out. Please try again or contact support.", research_success: "Abstract re-search completed! The page will now reload to show the improved abstract.", research_failed: "Failed to re-search abstract. Please try again.", research_kept: "The current abstract will be kept.", research_failed_prefix: "Re-search failed:", research_network_error: "Network error during re-search. Please check your connection and try again.", ai_powered_doi_search: "AI-Powered DOI Search", multi_strategy_doi: "Multi-Strategy DOI Discovery", doi_search_description: "Our AI will search for this article\u0027s DOI using multiple methods:", url_extraction: "URL Extraction", scan_url_metadata: "Scan article URL and metadata", google_scholar: "Google Scholar", search_academic_db: "Search academic database", google_gemini_ai: "Google Gemini AI", intelligent_matching: "Intelligent pattern matching", estimated_time: "Estimated time: 10-30 seconds", start_search: "Start Search", searching_doi: "Searching for DOI...", doi_not_found_msg: "Could not find DOI. The article may not have a DOI assigned or is not indexed in available sources.", doi_search_error: "An error occurred while searching for DOI", doi_found: "DOI Found!", doi_found_text: "The DOI has been found and saved to the article.", found_via: "Found via", ai_search: "AI Search", view_doi: "View DOI", reload_page: "Reload Page", insufficient_balance: "Insufficient balance.", calculate_quality: "Calculate Quality Scores", translate: "Translate", translated: "Translation completed successfully!", translating: "Translating...", translation_error: "Translation error", }; </script> <script> // Professional notification system (replaces amateur JavaScript alerts) function showNotification(message, type = 'info', requireConfirmation = false, onConfirm = null) { if (requireConfirmation) { // Show confirmation dialog const confirmModal = document.createElement('div'); confirmModal.className = 'modal fade'; confirmModal.innerHTML = ` <div class="modal-dialog modal-dialog-centered"> <div class="modal-content"> <div class="modal-header bg-${type === 'warning' ? 'warning' : 'primary'} text-white"> <h5 class="modal-title"> <i class="fas fa-${type === 'warning' ? 'exclamation-triangle' : 'question-circle'} me-2"></i> ${window.__bib_trans?.confirmation_required || 'Confirmation Required'} </h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <p>${message}</p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">${window.__bib_trans?.cancel || 'Cancel'}</button> <button type="button" class="btn btn-primary" id="confirmBtn">${window.__bib_trans?.confirm || 'Confirm'}</button> </div> </div> </div> `; document.body.appendChild(confirmModal); // Use custom modal system with fallback to Bootstrap if (window.showCustomModal) { window.showCustomModal(confirmModal); } else if (typeof bootstrap !== 'undefined') { const modal = new bootstrap.Modal(confirmModal); modal.show(); } // Handle confirmation confirmModal.querySelector('#confirmBtn').addEventListener('click', function() { // Close modal using custom system if (window.hideCustomModal) { window.hideCustomModal(confirmModal); } else { confirmModal.classList.remove('show'); const backdrop = document.querySelector('.modal-backdrop'); if (backdrop) backdrop.remove(); } if (onConfirm) onConfirm(); }); // Handle cancel button const cancelBtn = confirmModal.querySelector('[data-bs-dismiss="modal"]'); if (cancelBtn) { cancelBtn.addEventListener('click', function() { if (window.hideCustomModal) { window.hideCustomModal(confirmModal); } }); } // Remove from DOM after hidden confirmModal.addEventListener('hidden.bs.modal', function() { confirmModal.remove(); }); } else { // Show notification toast const notification = document.createElement('div'); notification.className = `alert alert-${type} alert-dismissible fade show position-fixed`; notification.style.cssText = 'top: 80px; right: 20px; z-index: 10000; min-width: 350px; max-width: 500px; box-shadow: 0 8px 24px rgba(0,0,0,0.25); border: none; border-radius: 8px; font-size: 1rem; padding: 1rem 1.5rem;'; notification.innerHTML = ` <div style="display: flex; align-items: center; gap: 12px;"> <i class="fas fa-${type === 'success' ? 'check-circle' : type === 'danger' ? 'exclamation-circle' : type === 'warning' ? 'exclamation-triangle' : 'info-circle'}" style="font-size: 1.5rem;"></i> <div style="flex: 1; line-height: 1.5;">${message}</div> <button type="button" class="btn-close" data-bs-dismiss="alert" style="font-size: 1.2rem;"></button> </div> `; document.body.appendChild(notification); // Auto-dismiss after 6 seconds setTimeout(() => { notification.classList.remove('show'); setTimeout(() => notification.remove(), 150); }, 6000); } } // Calculate Article Performance Tier Function function calculateArticleTier(bibliographyId) { const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content'); showNotification( window.__bib_trans?.calculate_tier_confirm || 'Calculate performance tier for this article?', 'info', true, function() { const btn = event.target.closest('button'); if (!btn) return; const originalContent = btn.innerHTML; btn.innerHTML = '<i class="fas fa-spinner fa-spin"></i> ' + (window.__bib_trans?.calculating || 'Calculating...'); btn.disabled = true; fetch(`/bibliographies/${bibliographyId}/calculate-tier`, { method: 'POST', headers: { 'X-CSRF-TOKEN': csrfToken, 'Content-Type': 'application/json', 'Accept': 'application/json' } }) .then(response => { if (response.status === 403) { return response.json().then(data => { showNotification(data.error, 'danger'); setTimeout(() => { window.location.href = '/dashboard/balance'; }, 3000); throw new Error('Insufficient balance'); }); } if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(data => { if (data.success) { showNotification(data.message, 'success'); setTimeout(() => window.location.reload(), 2000); } else { showNotification(data.error || (window.__bib_trans?.calculation_failed || 'Calculation failed'), 'danger'); btn.innerHTML = originalContent; btn.disabled = false; } }) .catch(error => { console.error('Error:', error); if (error.message !== 'Insufficient balance') { showNotification(window.__bib_trans?.tier_calculation_error || 'An error occurred during tier calculation. Please try again.', 'danger'); } btn.innerHTML = originalContent; btn.disabled = false; }); } ); } // Start AI Analysis from modal function startAIAnalysis() { // Close the modal using Bootstrap 5 modal API const modalElement = document.getElementById('ai_analysis_modal'); if (modalElement) { // Remove focus from button before closing modal to prevent aria-hidden warning const focusedElement = document.activeElement; if (focusedElement && modalElement.contains(focusedElement)) { focusedElement.blur(); } // Use custom modal system (Bootstrap 5 compatible) if (window.hideCustomModal) { window.hideCustomModal(modalElement); } else { // Bootstrap 5 fallback using data-bs-dismiss trigger const modalInstance = bootstrap.Modal.getInstance(modalElement); if (modalInstance) { modalInstance.hide(); } else { // Create instance and hide (Bootstrap 5 method) const modal = bootstrap.Modal.getOrCreateInstance(modalElement); modal.hide(); } } } // Create persistent loading notification with spinner const loadingNotification = document.createElement('div'); loadingNotification.id = 'ai-analysis-loading'; loadingNotification.className = 'alert alert-info alert-dismissible fade show position-fixed'; loadingNotification.style.cssText = 'top: 80px; right: 20px; z-index: 10000; min-width: 400px; max-width: 500px; box-shadow: 0 8px 24px rgba(0,0,0,0.25); border: none; border-radius: 8px; font-size: 1rem; padding: 1.5rem;'; loadingNotification.innerHTML = ` <div style="display: flex; align-items: center; gap: 15px;"> <div> <i class="fas fa-brain fa-2x" style="color: #2196F3; animation: pulse 1.5s infinite;"></i> </div> <div style="flex: 1;"> <div style="font-weight: 600; margin-bottom: 5px;"> <i class="fas fa-spinner fa-spin me-2"></i>${window.__bib_trans?.ai_analysis_in_progress || 'AI Analysis in Progress...'} </div> <div style="font-size: 0.9rem; color: #555;"> <span id="analysis-status">${window.__bib_trans?.analyzing_with_gemini || 'Analyzing article with Gemini AI...'}</span> </div> <div style="margin-top: 8px;"> <div style="background-color: rgba(33, 150, 243, 0.2); border-radius: 10px; height: 6px; overflow: hidden;"> <div id="analysis-progress" style="background: linear-gradient(90deg, #2196F3, #64B5F6); height: 100%; width: 0%; transition: width 0.3s ease; animation: progress 20s linear forwards;"></div> </div> </div> </div> </div> <style> @keyframes pulse { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.7; transform: scale(1.1); } } @keyframes progress { 0% { width: 0%; } 100% { width: 95%; } } </style> `; document.body.appendChild(loadingNotification); // Get CSRF token and bibliography ID const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); const bibliographyId = window.location.pathname.split('/').pop(); // Update status messages periodically const t = window.__bib_trans || {}; const statusMessages = [ t.analyzing_with_gemini || 'Analyzing article with Gemini AI...', t.evaluating_readability || 'Evaluating readability and clarity...', t.assessing_rigor || 'Assessing academic rigor...', t.measuring_novelty || 'Measuring novelty and innovation...', t.analyzing_methodology || 'Analyzing methodology quality...', t.calculating_relevance || 'Calculating topic relevance...', t.evaluating_integrity || 'Evaluating research integrity...', t.finalizing_scores || 'Finalizing quality scores...' ]; let messageIndex = 0; const statusInterval = setInterval(() => { const statusSpan = document.getElementById('analysis-status'); if (statusSpan && messageIndex < statusMessages.length) { messageIndex++; statusSpan.textContent = statusMessages[messageIndex % statusMessages.length]; } }, 3000); // Start analysis via AJAX fetch(`/bibliographies/${bibliographyId}/start-analysis`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': token, 'Accept': 'application/json' } }) .then(response => response.json()) .then(data => { clearInterval(statusInterval); // Remove loading notification const loadingEl = document.getElementById('ai-analysis-loading'); if (loadingEl) { loadingEl.remove(); } if (data.success) { console.log('Analysis completed successfully:', data.message); showNotification('✅ ' + data.message + ' ' + (window.__bib_trans?.analysis_completed || 'The page will now reload with fresh data.'), 'success'); // Force cache refresh by adding ?refresh=1 parameter const url = new URL(window.location.href); url.searchParams.set('refresh', '1'); setTimeout(() => window.location.href = url.toString(), 2000); } else { console.error('Failed to complete analysis:', data.error); showNotification('❌ ' + (window.__bib_trans?.analysis_failed_retry || 'Failed to complete analysis') + ': ' + (data.error || 'Unknown error'), 'danger'); } }) .catch(error => { clearInterval(statusInterval); // Remove loading notification const loadingEl = document.getElementById('ai-analysis-loading'); if (loadingEl) { loadingEl.remove(); } console.error('AJAX error starting analysis:', error); showNotification('❌ ' + (window.__bib_trans?.analysis_start_failed || 'Failed to start analysis. Please try again.'), 'danger'); }); } // Poll for analysis completion function startAnalysisPolling(button) { const bibliographyId = window.location.pathname.split('/').pop(); const statusUrl = `/bibliographies/${bibliographyId}/analysis-status`; let pollCount = 0; const maxPolls = 30; // Poll for up to 60 seconds (30 polls × 2 seconds) const pollInterval = setInterval(() => { pollCount++; fetch(statusUrl) .then(response => response.json()) .then(data => { console.log('Analysis status:', data); if (data.status === 'completed') { clearInterval(pollInterval); // Show success message and reload page with fresh data showNotification(data.message, 'success'); const url = new URL(window.location.href); url.searchParams.set('refresh', '1'); setTimeout(() => window.location.href = url.toString(), 1500); } else if (data.status === 'failed') { clearInterval(pollInterval); // Reset button and show error resetAnalysisButton(button); showNotification(window.__bib_trans?.ai_analysis_failed_retry || 'AI analysis failed. Please try again.', 'danger'); } else if (pollCount >= maxPolls) { clearInterval(pollInterval); resetAnalysisButton(button); showNotification(window.__bib_trans?.analysis_longer_than_expected || 'Analysis is taking longer than expected. Please refresh the page to check results.', 'warning'); } else { // Update loading text with current status const loadingSpan = button.querySelector('.btn-loading'); if (loadingSpan) { loadingSpan.innerHTML = '<i class="fas fa-spinner fa-spin"></i> ' + (data.message ? data.message.replace('🤖 ', '') : 'Analyzing...'); } } }) .catch(error => { console.error('Error checking analysis status:', error); if (pollCount >= maxPolls) { clearInterval(pollInterval); resetAnalysisButton(button); showNotification(window.__bib_trans?.analysis_status_failed || 'Failed to check analysis status. Please refresh and try again.', 'danger'); } }); }, 2000); // Poll every 2 seconds } // Reset button to normal state function resetAnalysisButton(button) { const btnContent = button.querySelector('.btn-content'); const btnLoading = button.querySelector('.btn-loading'); if (btnContent) btnContent.style.display = 'inline'; if (btnLoading) btnLoading.style.display = 'none'; button.disabled = false; } // Abstract Extraction Button with Loading Spinner function confirmExtraction(button) { showNotification( '📄 <strong>' + (window.__bib_trans?.extract_abstract_title || 'Extract Abstract') + '</strong><br><br>' + (window.__bib_trans?.extract_abstract_text || 'This will attempt to automatically extract the abstract from:') + '<br>' + '• <strong>DOI:</strong> 10.1590/S0006-87051949000100008' + (!!'10.1590/S0006-87051949000100008' ? '' : (window.__bib_trans?.not_available || 'Not available')) + '<br>' + '• <strong>URL:</strong> http://www.scielo.br/scielo.php?script=sci_arttext...' + (!!'http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0006-87051949000100008' ? '' : (window.__bib_trans?.not_available || 'Not available')) + '<br><br>' + '<em>' + (window.__bib_trans?.extract_time_warning || 'This may take 10-30 seconds. Continue?') + '</em>', 'info', true, function() { // Show loading state const btnContent = button.querySelector('.btn-content'); const btnLoading = button.querySelector('.btn-loading'); btnContent.style.display = 'none'; btnLoading.style.display = 'inline'; button.disabled = true; // Add timeout warning after 15 seconds const timeoutWarning = setTimeout(() => { if (button.disabled) { // Still processing const loadingText = btnLoading.querySelector('i').nextSibling; if (loadingText) { loadingText.textContent = ' ' + (window.__bib_trans?.still_extracting || 'Still extracting...'); } } }, 15000); // Add safety timeout to reset button after 45 seconds const safetyTimeout = setTimeout(() => { if (button.disabled) { resetExtractionButton(button); showNotification(window.__bib_trans?.extract_timeout || 'Abstract extraction timed out. The process may still be running in the background. Please refresh the page to check if the abstract was added.', 'warning'); } }, 45000); // Handle form submission via AJAX to properly manage button state const form = button.closest('form'); if (form) { // Get CSRF token const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); const formData = new FormData(form); fetch(form.action, { method: 'POST', headers: { 'X-CSRF-TOKEN': token, 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: formData }) .then(response => { clearTimeout(timeoutWarning); clearTimeout(safetyTimeout); if (response.ok) { // Success - reload page to show the new abstract showNotification(window.__bib_trans?.extract_success || 'Abstract extracted successfully! The page will now reload to show the results.', 'success'); setTimeout(() => window.location.reload(), 1500); } else { // Handle different error types response.json().then(data => { resetExtractionButton(button); if (data.warning) { // This is a warning (like "already has abstract") showNotification(data.warning + ' The page will now reload to show the current abstract.', 'info'); setTimeout(() => window.location.reload(), 2000); } else if (data.error) { // This is an actual error showNotification(data.error, 'danger'); console.error('Abstract extraction error:', data); } else { // Fallback error message showNotification(window.__bib_trans?.extract_failed || 'Failed to extract abstract. Please try again.', 'danger'); console.error('Abstract extraction error:', data); } }).catch(parseError => { // If JSON parsing fails, fall back to text response.text().then(errorText => { resetExtractionButton(button); showNotification(window.__bib_trans?.extract_failed || 'Failed to extract abstract. Please try again.', 'danger'); console.error('Abstract extraction error:', errorText); }); }); } }) .catch(error => { clearTimeout(timeoutWarning); clearTimeout(safetyTimeout); resetExtractionButton(button); showNotification(window.__bib_trans?.extract_network_error || 'Network error during abstract extraction. Please check your connection and try again.', 'danger'); console.error('Abstract extraction network error:', error); }); } } ); return false; } // Search Abstract Button (when no abstract exists) function confirmSearchAbstract(button) { const btnContent = button.querySelector('.btn-content'); const btnLoading = button.querySelector('.btn-loading'); btnContent.style.display = 'none'; btnLoading.style.display = 'inline'; button.disabled = true; const safetyTimeout = setTimeout(() => { if (button.disabled) { resetExtractionButton(button); showNotification('Abstract search timed out. The process may still be running. Please refresh the page.', 'warning'); } }, 45000); const form = button.closest('form'); if (form) { const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); const formData = new FormData(form); fetch(form.action, { method: 'POST', headers: { 'X-CSRF-TOKEN': token, 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: formData }) .then(response => { clearTimeout(safetyTimeout); if (response.ok) { showNotification('Abstract found and saved! Reloading...', 'success'); setTimeout(() => window.location.reload(), 1500); } else { response.json().then(data => { resetExtractionButton(button); showNotification(data.error || 'Could not find abstract from available sources.', 'danger'); }).catch(() => { resetExtractionButton(button); showNotification('Could not find abstract. Please try again.', 'danger'); }); } }) .catch(() => { clearTimeout(safetyTimeout); resetExtractionButton(button); showNotification('Network error. Please check your connection and try again.', 'danger'); }); } return false; } // Reset extraction button to normal state function resetExtractionButton(button) { const btnContent = button.querySelector('.btn-content'); const btnLoading = button.querySelector('.btn-loading'); if (btnContent) btnContent.style.display = 'inline'; if (btnLoading) btnLoading.style.display = 'none'; button.disabled = false; } // Re-search Abstract Button (for poor quality abstracts) function confirmReExtraction(button) { showNotification( '🔄 <strong>' + (window.__bib_trans?.research_abstract_title || 'Re-search Abstract') + '</strong><br><br>' + (window.__bib_trans?.research_abstract_text || 'The current abstract appears to be incomplete or contains metadata.') + '<br><br>' + (window.__bib_trans?.research_abstract_sources || 'This will attempt to find a better abstract from:') + '<br>' + '• <strong>DOI:</strong> 10.1590/S0006-87051949000100008' + (!!'10.1590/S0006-87051949000100008' ? '' : (window.__bib_trans?.not_available || 'Not available')) + '<br>' + '• <strong>URL:</strong> http://www.scielo.br/scielo.php?script=sci_arttext...' + (!!'http://www.scielo.br/scielo.php?script=sci_arttext&pid=S0006-87051949000100008' ? '' : (window.__bib_trans?.not_available || 'Not available')) + '<br><br>' + '<em>' + (window.__bib_trans?.research_replace_warning || 'This may take 10-30 seconds and will replace the current abstract. Continue?') + '</em>', 'info', true, function() { // Show loading state const btnContent = button.querySelector('.btn-content'); const btnLoading = button.querySelector('.btn-loading'); btnContent.style.display = 'none'; btnLoading.style.display = 'inline'; button.disabled = true; // Add timeout warning after 15 seconds const timeoutWarning = setTimeout(() => { if (button.disabled) { const loadingText = btnLoading.querySelector('i').nextSibling; if (loadingText) { loadingText.textContent = ' ' + (window.__bib_trans?.still_researching || 'Still re-searching...'); } } }, 15000); // Add safety timeout const safetyTimeout = setTimeout(() => { if (button.disabled) { resetExtractionButton(button); showNotification(window.__bib_trans?.research_timeout || 'Abstract re-search timed out. Please try again or contact support.', 'warning'); } }, 45000); // Handle form submission via AJAX const form = button.closest('form'); if (form) { const token = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content'); const formData = new FormData(form); fetch(form.action, { method: 'POST', headers: { 'X-CSRF-TOKEN': token, 'Accept': 'application/json', 'X-Requested-With': 'XMLHttpRequest' }, body: formData }) .then(response => { clearTimeout(timeoutWarning); clearTimeout(safetyTimeout); if (response.ok) { showNotification(window.__bib_trans?.research_success || 'Abstract re-search completed! The page will now reload to show the improved abstract.', 'success'); setTimeout(() => window.location.reload(), 1500); } else { response.json().then(data => { resetExtractionButton(button); if (data.warning) { showNotification(data.warning + ' ' + (window.__bib_trans?.research_kept || 'The current abstract will be kept.'), 'info'); } else if (data.error) { showNotification((window.__bib_trans?.research_failed_prefix || 'Re-search failed:') + ' ' + data.error, 'danger'); } else { showNotification(window.__bib_trans?.research_failed || 'Failed to re-search abstract. Please try again.', 'danger'); } }).catch(() => { resetExtractionButton(button); showNotification(window.__bib_trans?.research_failed || 'Failed to re-search abstract. Please try again.', 'danger'); }); } }) .catch(error => { clearTimeout(timeoutWarning); clearTimeout(safetyTimeout); resetExtractionButton(button); showNotification(window.__bib_trans?.research_network_error || 'Network error during re-search. Please check your connection and try again.', 'danger'); console.error('Abstract re-search error:', error); }); return false; } return true; } ); return false; } // Simplified animations for better performance document.addEventListener('DOMContentLoaded', function() { const elements = document.querySelectorAll('.paper-card, .chart-container, .citations-section, .comments-section'); elements.forEach((el, index) => { el.style.opacity = '0'; el.style.transform = 'translateY(10px)'; el.style.transition = 'all 0.3s ease'; setTimeout(() => { el.style.opacity = '1'; el.style.transform = 'translateY(0)'; }, index * 100); }); // Ensure abstract quality warning stays visible const abstractWarning = document.querySelector('.abstract-quality-warning'); if (abstractWarning) { abstractWarning.style.opacity = '1'; abstractWarning.style.visibility = 'visible'; abstractWarning.style.display = 'block'; } }); // Find DOI with AI - Professional Modal function findDOIWithAI(bibliographyId) { // Show professional confirmation modal showDOISearchModal(bibliographyId); } function showDOISearchModal(bibliographyId) { // Create modal HTML const modalHTML = ` <div class="modal fade" id="doiSearchModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content" style="border: none; border-radius: 15px; box-shadow: 0 10px 40px rgba(0,0,0,0.2);"> <div class="modal-header" style="background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: 15px 15px 0 0; padding: 1.5rem;"> <h5 class="modal-title fw-bold"> <i class="fas fa-robot me-2"></i>${window.__bib_trans?.ai_powered_doi_search || 'AI-Powered DOI Search'} </h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body" style="padding: 2rem;"> <div class="text-center mb-3"> <div style="font-size: 3rem; color: #667eea; margin-bottom: 1rem;"> <i class="fas fa-search"></i> </div> <h6 class="fw-bold mb-3">${window.__bib_trans?.multi_strategy_doi || 'Multi-Strategy DOI Discovery'}</h6> <p class="text-muted mb-4">${window.__bib_trans?.doi_search_description || 'Our AI will search for this article\'s DOI using multiple methods:'}</p> </div> <div class="search-strategy-list"> <div class="strategy-item" style="display: flex; align-items: start; padding: 12px; background: #f8f9fa; border-radius: 8px; margin-bottom: 10px;"> <div style="width: 40px; height: 40px; background: linear-gradient(135deg, #4facfe, #00f2fe); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; margin-right: 15px; flex-shrink: 0;">1</div> <div> <strong style="color: #2c3e50;">${window.__bib_trans?.url_extraction || 'URL Extraction'}</strong> <p class="mb-0 text-muted" style="font-size: 0.9rem;">${window.__bib_trans?.scan_url_metadata || 'Scan article URL and metadata'}</p> </div> </div> <div class="strategy-item" style="display: flex; align-items: start; padding: 12px; background: #f8f9fa; border-radius: 8px; margin-bottom: 10px;"> <div style="width: 40px; height: 40px; background: linear-gradient(135deg, #11998e, #38ef7d); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; margin-right: 15px; flex-shrink: 0;">2</div> <div> <strong style="color: #2c3e50;">${window.__bib_trans?.google_scholar || 'Google Scholar'}</strong> <p class="mb-0 text-muted" style="font-size: 0.9rem;">${window.__bib_trans?.search_academic_db || 'Search academic database'}</p> </div> </div> <div class="strategy-item" style="display: flex; align-items: start; padding: 12px; background: #f8f9fa; border-radius: 8px;"> <div style="width: 40px; height: 40px; background: linear-gradient(135deg, #667eea, #764ba2); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; margin-right: 15px; flex-shrink: 0;">3</div> <div> <strong style="color: #2c3e50;">${window.__bib_trans?.google_gemini_ai || 'Google Gemini AI'}</strong> <p class="mb-0 text-muted" style="font-size: 0.9rem;">${window.__bib_trans?.intelligent_matching || 'Intelligent pattern matching'}</p> </div> </div> </div> <div class="alert alert-info mt-4 mb-0" style="background: rgba(79, 172, 254, 0.1); border: 1px solid rgba(79, 172, 254, 0.3); color: #0c5460;"> <i class="fas fa-info-circle me-2"></i> <strong>${window.__bib_trans?.estimated_time || 'Estimated time: 10-30 seconds'}</strong> </div> </div> <div class="modal-footer" style="border: none; padding: 1.5rem; background: #f8f9fa; border-radius: 0 0 15px 15px;"> <button type="button" class="btn btn-secondary px-4" data-bs-dismiss="modal" style="font-weight: 600;"> <i class="fas fa-times me-2"></i>${window.__bib_trans?.cancel || 'Cancel'} </button> <button type="button" class="btn px-4" onclick="startDOISearch(${bibliographyId})" style="background: linear-gradient(135deg, #667eea, #764ba2); color: white; border: none; font-weight: 600;"> <i class="fas fa-search me-2"></i>${window.__bib_trans?.start_search || 'Start Search'} </button> </div> </div> </div> </div> `; // Remove existing modal if any const existingModal = document.getElementById('doiSearchModal'); if (existingModal) { existingModal.remove(); } // Add modal to body document.body.insertAdjacentHTML('beforeend', modalHTML); // Show modal using custom modal system const modalElement = document.getElementById('doiSearchModal'); if (modalElement && window.showCustomModal) { window.showCustomModal(modalElement); } } function startDOISearch(bibliographyId) { // Close modal using custom modal system const modalElement = document.getElementById('doiSearchModal'); if (modalElement && window.hideCustomModal) { window.hideCustomModal(modalElement); } const statusDiv = document.getElementById('doi-search-status'); const messageSpan = document.getElementById('doi-search-message'); // Show loading status if (statusDiv) { statusDiv.style.display = 'block'; if (statusDiv.querySelector('.alert')) { statusDiv.querySelector('.alert').className = 'alert alert-info mb-0'; } } if (messageSpan) { messageSpan.textContent = '🔍 ' + (window.__bib_trans?.searching_doi || 'Searching for DOI...'); } // Make AJAX request fetch(`/bibliographies/${bibliographyId}/find-doi`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content') }, body: JSON.stringify({}) }) .then(response => { // Check if response is ok before parsing JSON if (!response.ok) { // Try to parse error as JSON, otherwise use status text return response.json().catch(() => { throw new Error(`Server error: ${response.status} ${response.statusText}`); }).then(data => { throw new Error(data.message || `Server error: ${response.status}`); }); } return response.json(); }) .then(data => { if (data.success) { // Hide status div if (statusDiv) { statusDiv.style.display = 'none'; } // Update DOI on page without reloading const doiDisplayContainer = document.getElementById('doi-display-container'); if (doiDisplayContainer && data.doi) { // Replace the entire container content with just the DOI value doiDisplayContainer.innerHTML = '<span id="doi-value">' + data.doi + '</span>'; } // Show professional success modal showDOISuccessModal(data.doi, data.method || 'AI'); } else { // Hide status div if (statusDiv) { statusDiv.style.display = 'none'; } // Show professional error notification showNotification(data.message || ('❌ ' + (window.__bib_trans?.doi_not_found_msg || 'Could not find DOI. The article may not have a DOI assigned or is not indexed in available sources.')), 'danger'); } }) .catch(error => { console.error('Error:', error); // Hide status div if (statusDiv) { statusDiv.style.display = 'none'; } // Show professional error notification showNotification('❌ ' + (window.__bib_trans?.doi_search_error || 'An error occurred while searching for DOI') + ': ' + error.message, 'danger'); }); } function showDOISuccessModal(doi, method) { const t = window.__bib_trans || {}; const methodNames = { 'url_extraction': t.url_extraction || 'URL Extraction', 'google_scholar': t.google_scholar || 'Google Scholar', 'gemini_ai': t.google_gemini_ai || 'Google Gemini AI', 'AI': t.ai_search || 'AI Search' }; const methodIcons = { 'url_extraction': 'fa-link', 'google_scholar': 'fa-graduation-cap', 'gemini_ai': 'fa-robot', 'AI': 'fa-robot' }; const methodName = methodNames[method] || method; const methodIcon = methodIcons[method] || 'fa-check-circle'; const modalHTML = ` <div class="modal fade" id="doiSuccessModal" tabindex="-1" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content" style="border: none; border-radius: 15px; box-shadow: 0 10px 40px rgba(0,0,0,0.2);"> <div class="modal-header" style="background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); color: white; border: none; border-radius: 15px 15px 0 0; padding: 1.5rem;"> <h5 class="modal-title fw-bold"> <i class="fas fa-check-circle me-2"></i>${t.doi_found || 'DOI Found Successfully!'} </h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body" style="padding: 2rem;"> <div class="text-center mb-4"> <div style="font-size: 4rem; color: #11998e; margin-bottom: 1rem; animation: successBounce 0.6s ease;"> <i class="fas fa-check-circle"></i> </div> <h6 class="fw-bold mb-2">${t.doi_found || 'DOI Successfully Retrieved'}</h6> <p class="text-muted">${t.doi_found_text || 'The DOI has been found and saved to this article.'}</p> </div> <div style="background: #f8f9fa; padding: 1.5rem; border-radius: 12px; border-left: 4px solid #11998e; margin-bottom: 1.5rem;"> <div class="d-flex align-items-center mb-2"> <i class="fas fa-fingerprint me-2" style="color: #11998e; font-size: 1.2rem;"></i> <strong style="color: #2c3e50;">${t.doi || 'Digital Object Identifier'}</strong> </div> <div style="font-family: monospace; font-size: 1.1rem; color: #495057; word-break: break-all;"> ${doi} </div> </div> <div class="alert alert-success mb-0" style="background: rgba(17, 153, 142, 0.1); border: 1px solid rgba(17, 153, 142, 0.3); color: #0a5f56;"> <i class="fas ${methodIcon} me-2"></i> <strong>${t.found_via || 'Found via'}:</strong> ${methodName} </div> </div> <div class="modal-footer" style="border: none; padding: 1.5rem; background: #f8f9fa; border-radius: 0 0 15px 15px;"> <button type="button" class="btn px-4" data-bs-dismiss="modal" style="background: linear-gradient(135deg, #11998e, #38ef7d); color: white; border: none; font-weight: 600;"> <i class="fas fa-check me-2"></i>${t.confirm || 'Got It'} </button> </div> </div> </div> </div> <style> @keyframes successBounce { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } </style> `; // Remove existing modal if any const existingModal = document.getElementById('doiSuccessModal'); if (existingModal) { existingModal.remove(); } // Add modal to body document.body.insertAdjacentHTML('beforeend', modalHTML); // Show modal using custom modal system const modalElement = document.getElementById('doiSuccessModal'); if (modalElement && window.showCustomModal) { window.showCustomModal(modalElement); } // Also show a toast notification showNotification('✅ DOI found and saved successfully!', 'success'); } // Show/hide a loading overlay with a spinner over the title/abstract area // while a translation is being generated. function showTranslationOverlay(wrapper) { if (!wrapper) return; if (getComputedStyle(wrapper).position === 'static') { wrapper.style.position = 'relative'; } let overlay = wrapper.querySelector('.translation-loading-overlay'); if (!overlay) { overlay = document.createElement('div'); overlay.className = 'translation-loading-overlay'; overlay.style.cssText = 'position:absolute;inset:0;z-index:30;display:flex;flex-direction:column;' + 'align-items:center;justify-content:center;gap:12px;background:rgba(255,255,255,0.88);' + 'backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);border-radius:8px;'; overlay.innerHTML = '<div class="spinner-border text-primary" role="status" style="width:2.5rem;height:2.5rem;">' + '<span class="visually-hidden">Loading...</span></div>' + '<div style="font-weight:600;color:#3F51B5;letter-spacing:.3px;">' + (window.__bib_trans?.translating || 'Translating...') + '</div>'; wrapper.appendChild(overlay); } overlay.style.display = 'flex'; } function hideTranslationOverlay(wrapper) { const overlay = wrapper?.querySelector('.translation-loading-overlay'); if (overlay) overlay.style.display = 'none'; } // ===== Unified article translation: title + abstract switch together ===== // Activate the tab for a given locale inside one wrapper. function activateLangTab(wrapper, locale) { if (!wrapper) return; const field = wrapper.getAttribute('data-field'); const link = wrapper.querySelector('a[href="#' + field + '-lang-' + locale + '"]'); if (link) { try { new bootstrap.Tab(link).show(); } catch (e) { link.click(); } } } // Insert a translated tab + pane into a wrapper, building the tab shell first // if this field had no translations yet. function buildTranslationTab(wrapper, locale, translatedText) { const field = wrapper.getAttribute('data-field'); const tabId = field + '-lang-' + locale; if (document.getElementById(tabId)) return; let nav = wrapper.querySelector('.translation-nav') || wrapper.querySelector('.nav'); let tabContent = wrapper.querySelector('.tab-content'); if (!nav || !tabContent) { const original = wrapper.querySelector('.paper-title, .abstract-content'); const origHtml = original ? original.outerHTML : ''; wrapper.innerHTML = '<ul class="nav nav-pills mb-2 translation-nav" style="font-size:0.8rem; gap:4px;">' + '<li class="nav-item"><a class="nav-link active py-1 px-2" data-bs-toggle="pill" href="#' + field + '-lang-en">EN</a></li>' + '<li class="nav-item ms-auto"><div class="dropdown d-inline-block">' + '<button class="btn btn-outline-secondary btn-sm py-0 px-2 dropdown-toggle" type="button" data-bs-toggle="dropdown" style="font-size:0.8rem;"><i class="fas fa-plus"></i></button>' + '<ul class="dropdown-menu dropdown-menu-end" id="' + field + '-lang-menu"></ul>' + '</div></li>' + '</ul>' + '<div class="tab-content"><div class="tab-pane fade show active" id="' + field + '-lang-en">' + origHtml + '</div></div>'; nav = wrapper.querySelector('.translation-nav'); tabContent = wrapper.querySelector('.tab-content'); } const addLi = nav.querySelector('.dropdown') ? nav.querySelector('.dropdown').closest('.nav-item') : null; const li = document.createElement('li'); li.className = 'nav-item'; li.innerHTML = '<a class="nav-link py-1 px-2" data-bs-toggle="pill" href="#' + tabId + '">' + locale.toUpperCase() + '</a>'; if (addLi) addLi.before(li); else nav.appendChild(li); const pane = document.createElement('div'); pane.className = 'tab-pane fade'; pane.id = tabId; pane.innerHTML = field === 'title' ? '<h1 class="paper-title">' + translatedText + '</h1>' : '<div class="abstract-content">' + translatedText + '</div>'; tabContent.appendChild(pane); // Refresh this field's "add language" menu with the still-missing locales. const used = Array.from(nav.querySelectorAll('a[href*="-lang-"]')) .map(a => (a.getAttribute('href').match(/-lang-([a-z]+)$/) || [])[1]) .filter(Boolean); rebuildLangMenu(wrapper, field, used); } // Translate ONE field to a locale. Resolves true on success (no-op if the // translation already exists). function translateFieldTo(wrapper, locale) { const field = wrapper.getAttribute('data-field'); if (wrapper.querySelector('a[href="#' + field + '-lang-' + locale + '"]')) { return Promise.resolve(true); } return fetch('https://journament.com/api/translate', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-CSRF-TOKEN': 'UDopqR5pVGNLXoBL6w2YgGTbhKFKRqSyqVIAZzRh', 'Accept': 'application/json' }, body: JSON.stringify({ type: wrapper.getAttribute('data-type'), id: parseInt(wrapper.getAttribute('data-id')), field: field, locale: locale }) }) .then(r => r.json()) .then(data => { if (data && data.success) { buildTranslationTab(wrapper, locale, data.data.translated_text); return true; } return false; }) .catch(() => false); } // THE unified entry point: switch the whole article (title + abstract) to a // language, translating whichever field is missing. Never leaves the page. function setArticleLanguage(locale) { const wrappers = Array.from(document.querySelectorAll('.translation-tabs-wrapper')); if (!wrappers.length) return; if (locale === 'en') { wrappers.forEach(w => activateLangTab(w, 'en')); return; } const missing = wrappers.filter(function(w) { const f = w.getAttribute('data-field'); return !w.querySelector('a[href="#' + f + '-lang-' + locale + '"]'); }); // Everything already translated -> just switch both tabs. if (!missing.length) { wrappers.forEach(w => activateLangTab(w, locale)); return; } missing.forEach(showTranslationOverlay); Promise.all(wrappers.map(w => translateFieldTo(w, locale))) .then(function(results) { missing.forEach(hideTranslationOverlay); wrappers.forEach(w => activateLangTab(w, locale)); if (results.every(Boolean)) { showNotification('✅ ' + (window.__bib_trans?.translated || 'Translation completed') + ': ' + locale.toUpperCase(), 'success'); } else { showNotification('⚠️ ' + (window.__bib_trans?.translation_error || 'Some translations could not be completed.'), 'warning'); } }) .catch(function() { missing.forEach(hideTranslationOverlay); showNotification('❌ Translation failed. Please try again.', 'danger'); }); } // Wire every language trigger (add-language dropdown items + language pills) to // the unified handler, so title and abstract always switch together. Delegated // so it also covers dynamically-inserted items. document.addEventListener('click', function(e) { const addBtn = e.target.closest('.translate-lang-btn'); if (addBtn) { e.preventDefault(); setArticleLanguage(addBtn.getAttribute('data-locale')); return; } const pill = e.target.closest('.translation-nav a[href*="-lang-"]'); if (pill) { e.preventDefault(); const m = pill.getAttribute('href').match(/-lang-([a-z]+)$/); if (m) setArticleLanguage(m[1]); } }); // On load, switch the whole article to the user's app language if not English. document.addEventListener('DOMContentLoaded', function() { const appLocale = "en"; if (appLocale && appLocale !== 'en') { setArticleLanguage(appLocale); } }); function rebuildLangMenu(wrapper, field, usedLocales) { const allLocales = {tr:'Turkish',es:'Spanish',pt:'Portuguese',ar:'Arabic',zh:'Chinese',fr:'French',de:'German',id:'Indonesian',ru:'Russian',th:'Thai'}; const menu = wrapper.querySelector('#' + field + '-lang-menu'); if (!menu) return; menu.innerHTML = ''; for (const [lc, ln] of Object.entries(allLocales)) { if (!usedLocales.includes(lc)) { menu.innerHTML += '<li><a class="dropdown-item translate-lang-btn" href="#" data-locale="' + lc + '">' + ln + '</a></li>'; } } } // Load Unpaywall data document.addEventListener('DOMContentLoaded', function() { fetch('https://journament.com/bibliographies/158759/unpaywall') .then(r => r.json()) .then(data => { if (data.success && data.data.is_oa) { const pdfUrl = data.data.best_oa_pdf || data.data.best_oa_url; const existingUrl = "http:\/\/www.scielo.br\/scielo.php?script=sci_arttext\u0026pid=S0006-87051949000100008"; if (pdfUrl && pdfUrl !== existingUrl) { document.getElementById('unpaywall-link').href = pdfUrl; document.getElementById('unpaywall-badge').style.display = 'inline'; } } }) .catch(() => {}); // Load Altmetric data fetch('https://journament.com/bibliographies/158759/altmetric') .then(r => r.json()) .then(data => { if (data.success && data.data) { const section = document.getElementById('altmetric-section'); document.getElementById('altmetric-score').textContent = Math.round(data.data.score); if (data.data.image_small) { document.getElementById('altmetric-donut').src = data.data.image_small; } if (data.data.details_url) { document.getElementById('altmetric-details-link').href = data.data.details_url; } const tweeters = data.data.tweeters_count || 0; const readers = data.data.readers_count || 0; if (tweeters) document.getElementById('altmetric-tweeters').textContent = tweeters + ' tweeters'; if (readers) document.getElementById('altmetric-readers').textContent = readers + ' readers'; section.style.display = 'block'; } }) .catch(() => {}); }); </script> <!-- Page-specific JavaScript --> <script> // Prevent FOUC - mark fonts as loaded immediately document.documentElement.classList.add('fonts-loaded'); // Bootstrap 5 Compatible JavaScript document.addEventListener('DOMContentLoaded', function() { // Auto-dismiss alerts after 6 seconds setTimeout(function() { const alerts = document.querySelectorAll('.alert:not(.alert-permanent)'); alerts.forEach(alert => { // Use Bootstrap 5 Alert instance if (typeof bootstrap !== 'undefined') { var alertInstance = bootstrap.Alert.getOrCreateInstance(alert); alertInstance.close(); } else { alert.style.opacity = '0'; setTimeout(() => { alert.style.display = 'none'; }, 300); } }); }, 6000); // Initialize Bootstrap 5 components if (typeof bootstrap !== 'undefined') { // Initialize popovers var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); var popoverList = popoverTriggerList.map(function (popoverTriggerEl) { return new bootstrap.Popover(popoverTriggerEl); }); // Initialize tooltips var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl); }); // Initialize dropdowns (explicit initialization for better reliability) var dropdownElementList = [].slice.call(document.querySelectorAll('.dropdown-toggle')); var dropdownList = dropdownElementList.map(function (dropdownToggleEl) { return new bootstrap.Dropdown(dropdownToggleEl); }); // Modal initialization handled by custom modal system in bootstrap.js // Removed duplicate initialization that was causing conflicts // Bootstrap 5 collapse is automatically initialized via data-bs-toggle attributes // Just verify Bootstrap is loaded console.log('Bootstrap loaded:', typeof bootstrap !== 'undefined'); console.log('Bootstrap Collapse available:', typeof bootstrap.Collapse !== 'undefined'); } }); // DISABLED - Modal handling is now done by custom modal system in bootstrap.js // This prevents conflicts with the custom modal implementation function openModal(modalId) { console.log('openModal() is deprecated - modals are handled by custom system'); } function closeModal(modalId) { console.log('closeModal() is deprecated - modals are handled by custom system'); } </script> </body> </html>