Annotation of loncom/html/adm/jsMath/jsMath-global.html, revision 1.1
1.1 ! albertel 1: <html>
! 2: <head>
! 3: <!--
! 4: | jsMath-global.html
! 5: |
! 6: | Part of the jsMath package for mathematics on the web.
! 7: |
! 8: | This file is used to store persistent data across multiple
! 9: | documents, for example, the cookie data when files are loaded
! 10: | locally, or cached typset math data.
! 11: |
! 12: | The file opens a frameset with one frame containing the
! 13: | actual document to view, and stores the global data in the
! 14: | outer document. That way, when the frame changes documents
! 15: | the global data is still available.
! 16: |
! 17: | ---------------------------------------------------------------------
! 18: |
! 19: | Copyright 2006 by Davide P. Cervone
! 20: |
! 21: | Licensed under the Apache License, Version 2.0 (the "License");
! 22: | you may not use this file except in compliance with the License.
! 23: | You may obtain a copy of the License at
! 24: |
! 25: | http://www.apache.org/licenses/LICENSE-2.0
! 26: |
! 27: | Unless required by applicable law or agreed to in writing, software
! 28: | distributed under the License is distributed on an "AS IS" BASIS,
! 29: | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
! 30: | See the License for the specific language governing permissions and
! 31: | limitations under the License.
! 32: -->
! 33: <title>jsMath Global Frame</title>
! 34: <style></style>
! 35:
! 36: <script>
! 37: var jsMath = {
! 38: isGlobal: 1, // to pervent FRAME from inheriting this jsMath
! 39: isOpera: (window.opera != null && window.Packages != null),
! 40: isSafari: (window.clientInformation && document.implementation.createCSSStyleSheet != null),
! 41: isMSIEmac: (screen.updateInterval != null && !window.SyntaxError && !window.print),
! 42: msieDelay: 1000, // MSIE/mac delay time for checking for offsite pages
! 43:
! 44: /***************************************************************/
! 45:
! 46: /*
! 47: * This will be shared with the jsMath in the frameset
! 48: */
! 49: Global: {
! 50: isHidden: 0,
! 51: cookie: '',
! 52: cache: {T: {}, D: {}, R: {}, B: {}},
! 53: ClearCache: function () {jsMath.Global.cache = {T: {}, D: {}, R: {}, B: {}}},
! 54: Init: function () {}
! 55: },
! 56:
! 57: /*
! 58: * Called by jsMath to attach to the Global data area.
! 59: */
! 60: Register: function (w) {
! 61: w.jsMath.Global = jsMath.Global;
! 62: w.jsMath.Controls.localSetCookie = jsMath.localSetCookie;
! 63: w.jsMath.Controls.localGetCookie = jsMath.localGetCookie;
! 64: if (window.location.protocol != 'mk:') {
! 65: document.title = w.document.title;
! 66: this.ShowURL(w.location);
! 67: jsMath.SetUnload();
! 68: }
! 69: },
! 70:
! 71: /***************************************************************/
! 72:
! 73: /*
! 74: * Initialize the global data and load the contents of the frame
! 75: */
! 76: Init: function () {
! 77: if (this.inited) return;
! 78: this.controls = document.getElementById('jsMath_controls');
! 79: this.frame = document.getElementById('jsMath_frame');
! 80: this.window = this.FrameWindow();
! 81: var URL;
! 82: if (!this.isOpera) {try {URL = this.window.document.URL} catch (err) {}}
! 83: if (!URL || URL == "about:blank" || URL.match(/jsMath-global.html$/))
! 84: {this.frame.src = this.src}
! 85:
! 86: this.Global.frame = this.frame;
! 87: this.Global.Show = this.Show;
! 88: this.Global.GoLocal = this.GoLocal;
! 89: if (this.hide) {this.Hide()}
! 90: this.inited = 1;
! 91: },
! 92:
! 93: GetURL: function () {
! 94: var src = unescape(document.location.search.substr(1));
! 95: if (src == '') {src = unescape(document.location.hash.substr(1))}
! 96: src = src.replace(/\?(.*)/,'');
! 97: if (RegExp.$1) {this.Global.cookie = unescape(RegExp.$1)}
! 98: return src;
! 99: },
! 100:
! 101: FrameWindow: function (force) {
! 102: if (this.window && !force) {return this.window}
! 103: if (this.frame.contentWindow) {return this.frame.contentWindow}
! 104: if (document.frames && document.frames.jsMath_frame)
! 105: {return document.frames.jsMath_frame}
! 106: return null;
! 107: },
! 108:
! 109: /*
! 110: * Called whenever the FRAME loads a new file.
! 111: * (Update the title, etc.)
! 112: */
! 113: Loaded: function () {
! 114: if (!jsMath.inited) {jsMath.Init()}
! 115: if (!jsMath.window) {jsMath.window = jsMath.FrameWindow()}
! 116: if (!jsMath.window || window.location.protocol == 'mk:') return;
! 117: var URL; try {URL = jsMath.frame.src} catch (err) {}
! 118: var title; try {title = jsMath.window.document.title} catch (err) {}
! 119: if (URL != null && URL == jsMath.URL) return;
! 120: if (title != null) {
! 121: document.title = title;
! 122: jsMath.ShowURL(jsMath.window.location);
! 123: jsMath.SetUnload();
! 124: } else {
! 125: jsMath.Offsite();
! 126: }
! 127: },
! 128:
! 129: /*
! 130: * Mark the page as offsite and can't be read
! 131: */
! 132: Offsite: function () {
! 133: document.title = "jsMath Global: Offsite document -- can't read title";
! 134: jsMath.ShowURL("(Offsite document -- cant' read URL)");
! 135: if (jsMath.print && !jsMath.Global.isHidden) {
! 136: jsMath.print.disabled = true;
! 137: jsMath.reload.disabled = true;
! 138: }
! 139: jsMath.window = null;
! 140: },
! 141:
! 142: //
! 143: // Safari doesn't fire onload for offsite URL's, so use in unload
! 144: // handler to look for these and mark them.
! 145: // MSIE/mac doesn't fire onload events at all, so use unload
! 146: // handler to simulate them.
! 147: //
! 148: SetUnload: function () {
! 149: if (jsMath.isMSIEmac || jsMath.isSafari) {
! 150: try {jsMath.oldUnload = jsMath.window.unload} catch (err) {}
! 151: try {jsMath.window.onunload = jsMath.Unload} catch (err) {}
! 152: }
! 153: },
! 154: Unload: function (event) {
! 155: if (jsMath.oldUnload) {jsMath.oldUnload(event)}
! 156: try {setTimeout('jsMath.StateChange(0)',1)} catch (err) {}
! 157: },
! 158: StateChange: function (i) {
! 159: jsMath.ShowURL(jsMath.window.location);
! 160: var state = 'unknown'; try {state = jsMath.window.document.readyState} catch (err) {};
! 161: if (state == 'unknown' || i++ == 20) {jsMath.Offsite(); return}
! 162: if (state != 'complete') {setTimeout('jsMath.StateChange('+i+')',50*i); return}
! 163: document.title = jsMath.window.document.title;
! 164: jsMath.ShowURL(jsMath.window.location);
! 165: if (window.location.host == jsMath.window.location.host)
! 166: {jsMath.SetUnload(); return}
! 167: if (jsMath.isMSIEmac) {
! 168: jsMath.oldLocation = jsMath.window.location;
! 169: setTimeout('jsMath.MSIEcheckDocument()',jsMath.msieDelay);
! 170: }
! 171: },
! 172: MSIEcheckDocument: function () {
! 173: if (window.location.host == jsMath.window.location.host) {
! 174: jsMath.StateChange(0)
! 175: } else {
! 176: if (jsMath.oldLocation != jsMath.window.location) {
! 177: jsMath.ShowURL(jsMath.window.location);
! 178: document.title = jsMath.window.document.title;
! 179: }
! 180: setTimeout('jsMath.MSIEcheckDocument()',jsMath.msieDelay);
! 181: }
! 182: },
! 183:
! 184: /*
! 185: * Replacements for standard localSetCookie/localGetCookie that
! 186: * use the global cache for storing the cookie data rather than
! 187: * the document.location's search field.
! 188: */
! 189: localSetCookie: function (cookie,warn) {
! 190: if (cookie != "") {cookie = 'jsMath='+cookie}
! 191: if (cookie == jsMath.Global.cookie) return;
! 192: jsMath.Global.cookie = cookie;
! 193: },
! 194: localGetCookie: function () {return (jsMath.Global.cookie || "")},
! 195:
! 196: /*
! 197: * Set the URL in the controls window
! 198: */
! 199: ShowURL: function (URL) {
! 200: try {
! 201: jsMath.URL = URL; if (jsMath.url) {jsMath.url.value = URL}
! 202: if (jsMath.print && !jsMath.Global.isHidden) {
! 203: jsMath.print.disabled = !window.print;
! 204: jsMath.reload.disabled = false;
! 205: }
! 206: } catch (err) {}
! 207: },
! 208: SetURL: function () {this.frame.src = jsMath.url.value},
! 209:
! 210: /*
! 211: * Handle actions for the document frame
! 212: */
! 213: Print: function () {if (this.window) {this.window.document.body.focus(); this.window.print()}},
! 214: Reload: function () {if (this.window) {this.window.location.reload()}},
! 215: GoLocal: function () {
! 216: if (jsMath.window) {
! 217: jsMath.UpdateCookie();
! 218: if (jsMath.isMSIEmac) {
! 219: alert("MSIE/Mac has a bug that causes it not to go local properly. "
! 220: + "After you press OK below, your browser will appear to hang. "
! 221: + "When this happens, press Command-. to cancel the action. "
! 222: + "The window should clear and the page location will appear "
! 223: + "in the address area at the top of the screen. Press the "
! 224: + "REFRESH button to load the page correctly.");
! 225: }
! 226: jsMath.location = jsMath.window.location;
! 227: if (jsMath.window.location.protocol == 'file:' && jsMath.Global.cookie)
! 228: {jsMath.location += '?' + escape(jsMath.Global.cookie)}
! 229: setTimeout('window.location = jsMath.location',1);
! 230: return;
! 231: }
! 232: alert("You are viewing a web page from a site other than the "
! 233: + "one where you loaded jsMath-Global, so jsMath can't read "
! 234: + "its URL to load it locally.\n\n"
! 235: + "Check to see if your browser has a contextual menu item to "
! 236: + "open the active frame in a separate window.");
! 237: },
! 238:
! 239: /*
! 240: * Read the cookie data, set the hiddenGlobal and global fields
! 241: * and save the cookie again.
! 242: */
! 243: UpdateCookie: function () {
! 244: var cookie = []; var cookies = jsMath.window.document.cookie;
! 245: if (window.location.protocol == 'file:') {cookies = jsMath.Global.cookie}
! 246: if (cookies.match(/jsMath=([^;]+)/)) {
! 247: var data = RegExp.$1.split(/,/);
! 248: for (var i = 0; i < data.length; i++) {
! 249: var x = data[i].match(/(.*):(.*)/);
! 250: if (x[2].match(/^\d+$/)) {x[2] = 1*x[2]} // convert from string
! 251: cookie[x[1]] = x[2];
! 252: }
! 253: }
! 254: cookie.hiddenGlobal = jsMath.Global.isHidden;
! 255: cookie.global = "never"; cookies = [];
! 256: for (var id in cookie) {cookies[cookies.length] = id + ':' + cookie[id]}
! 257: cookies = cookies.join(',');
! 258: if (window.location.protocol == 'file:') {
! 259: jsMath.Global.cookie = 'jsMath='+cookies;
! 260: } else {
! 261: cookies += '; path=/';
! 262: if (cookie.keep && cookie.keep != '0D') {
! 263: var ms = {
! 264: D: 1000*60*60*24,
! 265: W: 1000*60*60*24*7,
! 266: M: 1000*60*60*24*30,
! 267: Y: 1000*60*60*24*365
! 268: };
! 269: var exp = new Date;
! 270: exp.setTime(exp.getTime() +
! 271: cookie.keep.substr(0,1) * ms[cookie.keep.substr(1,1)]);
! 272: cookies += '; expires=' + exp.toGMTString();
! 273: }
! 274: jsMath.window.document.cookie = 'jsMath='+cookies;
! 275: }
! 276: },
! 277:
! 278: /*
! 279: * Check if the control panel should be hidden
! 280: */
! 281: SetControls: function (rows) {
! 282: if (!jsMath.rows) {
! 283: jsMath.rows = rows;
! 284: var cookie = document.cookie;
! 285: if (String(window.location.protocol).match(/^(file|mk):$/))
! 286: {cookie = jsMath.Global.cookie}
! 287: if (cookie.match(/jsMath=([^;]+)/)) {cookie = RegExp.$1}
! 288: if (!cookie.match("hiddenGlobal:0")) {
! 289: if (this.inited) {setTimeout('jsMath.Hide()',1)} else {jsMath.hide = 1}
! 290: return;
! 291: }
! 292: }
! 293: document.body.rows = rows;
! 294: },
! 295:
! 296: /*
! 297: * Remove the frame that holds the control panel
! 298: */
! 299: Hide: function () {
! 300: if (jsMath.Global.isHidden) return;
! 301: if (this.isMSIEmac) {
! 302: //
! 303: // MSIE/Mac can't remove the frame, so hide it (and the drag bar)
! 304: //
! 305: document.body.rows = "-6,*";
! 306: } else if (this.isOpera) {
! 307: //
! 308: // Opera can remove it, but it is unstable for that, but
! 309: // setting the size to -1 seems to remove it as well.
! 310: //
! 311: document.body.rows = "-1,*";
! 312: } else {
! 313: document.body.removeChild(this.controls);
! 314: document.body.rows = "*";
! 315: jsMath.window = jsMath.FrameWindow(1);
! 316: }
! 317: this.Global.isHidden = 1;
! 318: },
! 319:
! 320: /*
! 321: * Put back the control-panel frame
! 322: */
! 323: Show: function (bubble) {
! 324: if (!jsMath.Global.isHidden) {
! 325: if (bubble && jsMath.window) {jsMath.window.jsMath.Controls.Panel()}
! 326: return;
! 327: }
! 328: if (!jsMath.isMSIEmac) {
! 329: document.body.insertBefore(jsMath.controls,jsMath.frame);
! 330: //
! 331: // Opera doesn't refresh the frames properly, so reload them
! 332: //
! 333: if (jsMath.isOpera) {
! 334: setTimeout(
! 335: 'jsMath.controls.src = "about:blank";\n' +
! 336: 'jsMath.controls.src = jsMath.root+"jsMath-global-controls.html"+jsMath.domain;\n' +
! 337: 'jsMath.frame.src = jsMath.window.location;',1
! 338: );
! 339: }
! 340: }
! 341: document.body.rows = jsMath.rows;
! 342: jsMath.window = jsMath.FrameWindow(1);
! 343: jsMath.Global.isHidden = 0;
! 344: },
! 345:
! 346: /*
! 347: * Empty the cache
! 348: */
! 349: Empty: function () {
! 350: var OK = confirm('Really empty the equation cache?');
! 351: if (OK) {jsMath.Global.ClearCache()}
! 352: },
! 353:
! 354: /*
! 355: * Find the largest common domain between the source file
! 356: * and the location of the jsMath files
! 357: */
! 358: Domain: function () {
! 359: this.domain = '';
! 360: // MSIE/Mac can't do domain changes, so don't bother trying
! 361: if (navigator.appName == 'Microsoft Internet Explorer' &&
! 362: navigator.platform == 'MacPPC' && navigator.userProfile != null) return;
! 363: if (this.src == '') {
! 364: if (window == parent) return;
! 365: var oldDomain = document.domain;
! 366: try {
! 367: while (true) {
! 368: try {if (parent.document.title != null) return} catch (err) {}
! 369: if (!document.domain.match(/\..*\./)) break;
! 370: document.domain = document.domain.replace(/^[^.]*\./,'');
! 371: }
! 372: } catch (err) {}
! 373: document.domain = oldDomain;
! 374: } else {
! 375: if (!this.src.match(/^[^:]+:\/\/([^/]+)(:[0-9]+)?\//)) return;
! 376: if (document.domain == RegExp.$1) return;
! 377: var src = RegExp.$1.split(/\./);
! 378: var loc = String(window.location.host).split(/\./);
! 379: var si, li; si = src.length-2; li = loc.length-2
! 380: while (si >= 0 && li >= 0 && src[si] == loc[li]) {li--; si--}
! 381: document.domain = src.slice(si+1).join('.');
! 382: this.domain = '?'+document.domain;
! 383: }
! 384: },
! 385:
! 386: /*
! 387: * Create the document content based on whether this is the initial
! 388: * call to this file, or the secondary one
! 389: */
! 390: Content: function () {
! 391: if (this.src != '') {
! 392: this.root = (!this.isOpera) ? '' :
! 393: String(window.location).replace(/\/jsMath-global.html\??.*/,'/');
! 394: document.writeln('<frameset rows="0,*" onload="jsMath.Init()">');
! 395: document.writeln('<frame src="'+this.root+'jsMath-global-controls.html'+this.domain+'" frameborder="0" scrolling="no" id="jsMath_controls" />');
! 396: document.writeln('<frame src="'+this.root+'jsMath-global.html" frameborder="0" onload="jsMath.Loaded()" id="jsMath_frame" />');
! 397: document.writeln('</frameset>');
! 398: } else {
! 399: document.writeln('<body><br/></body>');
! 400: }
! 401: }
! 402:
! 403: };
! 404:
! 405: </script>
! 406: </head>
! 407:
! 408: <script>
! 409: jsMath.src = jsMath.GetURL();
! 410: jsMath.Domain();
! 411: jsMath.Content();
! 412: </script>
! 413:
! 414: </html>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>