 top.FusecalManager = { base_url : 'http://www.fusecal.com/', calendarId : -1, initialized: false, shown: false, isWebkit: navigator.userAgent.indexOf('AppleWebKit/') > -1, timer: false, observe: function(element, event, callback) { if (window.addEventListener) { element.addEventListener(event.toString(), callback, false); } else if (window.attachEvent) { element.attachEvent('on' + event, callback); }; }, stopObserving: function(element, event, callback) { if (window.addEventListener) { element.removeEventListener(event, callback, false); } else if (window.attachEvent) { element.detachEvent('on' + event, callback); }; }, hasClassName: function(element, className) { var elementClassName = element.className; if (elementClassName.length == 0) return false; if (elementClassName == className || elementClassName.match(new RegExp("(^|\s)" + className + "(\s|$)"))) return true; return false; }, sendMessageToEmbedded: function(message) { top.FusecalManager.gridFrame.contentWindow.location = "http://www.fusecal.com/embedded/frame#" + top.FusecalManager.calendarId + ";" + message; /* Tell the frame to look for something new in its location hash by firing a focus event */ if (top.FusecalManager.isWebkit) { top.FusecalManager.gridFrame.focus(); } else { top.FusecalManager.gridFrame.contentWindow.focus(); }; }, getElementsByClassName: function(className) { var children = document.body.getElementsByTagName('*'); var elements = [], child; for (var i = 0, length = children.length; i < length; i++) { child = children[i]; if (this.hasClassName(child, className)) elements.push(child); } return elements; }, requestStylesheet: function(local, topLevel) { var doc = topLevel ? top.document : document; var stylesheet = doc.createElement("link"); stylesheet.rel = "stylesheet"; stylesheet.type = "text/css"; stylesheet.href = this.base_url + "stylesheets/" + local; stylesheet.media = "all"; doc.lastChild.firstChild.appendChild(stylesheet); }, requestContent: function(url, topLevel) { var doc = topLevel ? top.document : document; var script = doc.createElement('script'); script.src = url; /* IE7 doesn't like this: top.document.body.appendChild(script); Instead use: */ doc.getElementsByTagName('head')[0].appendChild(script); }, init: function() { if (this.initialized) return; this.initialized = true; if (this.timer) window.clearInterval(timer); this.requestStylesheet('__fusecal.css', true); /* this.subscribeTooltip = top.document.createElement('div'); this.subscribeTooltip.style.backgroundColor = '#CCFFCC'; this.subscribeTooltip.style.border = '2px solid green'; this.subscribeTooltip.style.borderLeft = '0px'; this.subscribeTooltip.style.fontFamily = 'arial, sans-serif'; this.subscribeTooltip.style.width = '170px'; this.subscribeTooltip.style.height = '2em'; this.subscribeTooltip.style.padding = '7px'; this.subscribeTooltip.style.position = 'absolute'; this.subscribeTooltip.style.display = 'none'; this.subscribeTooltip.innerHTML = 'Add these events to your personal calendar'; document.getElementById('fusecal_subscribe_button_wrapper').appendChild(this.subscribeTooltip); this.subscribeButton.onmouseover = function(e) { top.FusecalManager.subscribeTooltip.style.top = (this.offsetTop + 10) + "px"; top.FusecalManager.subscribeTooltip.style.left = (this.offsetLeft + this.clientWidth) + "px"; top.FusecalManager.subscribeTooltip.style.display = ''; }; this.subscribeButton.onmouseout = function(e) { top.FusecalManager.subscribeTooltip.style.display = 'none'; };*/ var buttonWrappers = this.getElementsByClassName('fusecal_subscribe_button_wrapper'); /*** DEPRECATED: for league pro **/ var old_button = document.getElementById('fusecal_subscribe_button_wrapper'); if (old_button) { buttonWrappers = buttonWrappers.concat(old_button); }; /** EO DEPRECATED CODE **/ var wrapper, calendarId, pubId, color; for (var i = 0; i < buttonWrappers.length; i++) { wrapper = buttonWrappers[i]; calendarId = wrapper.getAttribute('calendar_id'); pubId = wrapper.getAttribute('publisher_id'); color = wrapper.getAttribute('color') || ''; wrapper.id = 'fusecal_subscribe_button_wrapper_' + pubId + '_' + encodeURIComponent(calendarId); this.requestContent('http://www.fusecal.com/embedded/load_button?calendar_id=' + calendarId + '&publisher_id=' + pubId + '&color=' + color); }; this.overlay = top.document.createElement('div'); this.overlay.id = 'fusecal_overlay'; this.overlay.style.display = "none"; this.observe(this.overlay, 'click', this.hideWindow); top.document.body.appendChild(this.overlay); this.embeddedFusecal = top.document.createElement('div'); this.embeddedFusecal.id = 'fusecal_subscribe_window'; this.embeddedFusecal.style.top = "-10000px"; this.embeddedFusecal.style.visibility = "hidden"; top.document.body.appendChild(this.embeddedFusecal); this.gridFrame = top.document.createElement('iframe'); this.gridFrame.id = "fusecal_embedded_frame"; this.gridFrame.name = "fusecal_embedded_frame"; this.gridFrame.frameBorder = 0; /* get rid of frame border in IE6 */ this.embeddedFusecal.appendChild(this.gridFrame); this.gridFrame.contentWindow.location = "http://www.fusecal.com/embedded/loading/"; var doneLink = top.document.createElement('a'); doneLink.href = 'javascript: void(0);'; doneLink.innerHTML = 'Save and Finish'; this.observe(doneLink, 'click', this.hideWindow); doneLink.id = 'fusecal_done_link'; this.embeddedFusecal.appendChild(doneLink); this.embeddedFusecal.style.visibility = "visible"; }, showWindow : function(calendarId) { var objs = top.document.getElementsByTagName('object'); for (var i = 0; i < objs.length; i++) { objs[i].style.visibility = 'hidden'; }; var embeds = top.document.getElementsByTagName('embed'); for (var i = 0; i < embeds.length; i++) { embeds[i].style.visibility = 'hidden'; }; top.FusecalManager.overlay.style.display = ""; top.FusecalManager.centerWindow(); top.FusecalManager.shown = true; /* Fix scrollbars in frame for mac firefox */ if (top.FusecalManager.embeddedFusecal.style.overflow == "auto") { top.FusecalManager.embeddedFusecal.style.overflow = "hidden"; } else { top.FusecalManager.embeddedFusecal.style.overflow = "auto"; }; if (top.FusecalManager.calendarId != calendarId) { top.FusecalManager.calendarId = calendarId; }; top.FusecalManager.sendMessageToEmbedded("show"); top.FusecalManager.observe(top.window, 'resize', top.FusecalManager.centerWindow); top.FusecalManager.observe(top.window, 'scroll', top.FusecalManager.centerWindow); /* TODO: figure out how to disable (capture?) scrolling */ /*if (window.addEventListener) { top.window.addEventListener('scroll', fusnction() { return false; }, false); } else if (window.attachEvent) { top.window.attachEvent('onscroll', function() { return false; } ); };*/ }, centerWindow : function() { var w,h; if (top.window.innerHeight) /* all except Explorer */ { w = top.window.innerWidth; h = top.window.innerHeight; } else if (top.document.documentElement && top.document.documentElement.clientHeight) { /* Explorer 6 Strict Mode */ w = top.document.documentElement.clientWidth; h = top.document.documentElement.clientHeight; } else if (top.document.body) /* other Explorers */ { w = top.document.body.clientWidth; h = top.document.body.clientHeight; }; var scrollTop = (top.document.documentElement.scrollTop || top.document.body.scrollTop); var scrollLeft = (top.document.documentElement.scrollLeft || top.document.body.scrollLeft); var centerY = h / 2 + scrollTop; var centerX = w /2 + scrollLeft; var newY = Math.max((centerY - top.FusecalManager.embeddedFusecal.clientHeight / 2), scrollTop); var newX = Math.max((centerX - top.FusecalManager.embeddedFusecal.clientWidth / 2), scrollLeft); top.FusecalManager.embeddedFusecal.style.top = newY + "px"; top.FusecalManager.embeddedFusecal.style.left = newX + "px"; top.FusecalManager.overlay.style.top = scrollTop + "px"; top.FusecalManager.overlay.style.left = scrollLeft + "px"; top.FusecalManager.overlay.style.height = h + "px"; top.FusecalManager.overlay.style.width = w + "px"; }, hideWindow : function() { top.FusecalManager.shown = false; /* when the window is hidden tell the frame so it can save the changes made in the grids */ top.FusecalManager.sendMessageToEmbedded('hide'); /* Can't use display none here because we need to do save changes ajax call in frame after it disappears and it will fail if the frame isn't displayed */ top.FusecalManager.embeddedFusecal.style.top = "-10000px"; top.FusecalManager.overlay.style.display = "none"; top.FusecalManager.stopObserving(top.window, 'resize', top.FusecalManager.centerWindow); top.FusecalManager.stopObserving(top.window, 'scroll', top.FusecalManager.centerWindow); var objs = top.document.getElementsByTagName('object'); for (var i = 0; i < objs.length; i++) { objs[i].style.visibility = 'visible'; }; var embeds = top.document.getElementsByTagName('embed'); for (var i = 0; i < embeds.length; i++) { embeds[i].style.visibility = 'visible'; }; } }; /* Init embedded on document ready */ if (document.addEventListener) { if (top.FusecalManager.isWebKit) { top.FusecalManager.timer = window.setInterval(function() { if (/loaded|complete/.test(document.readyState)) top.FusecalManager.init(); }, 0); top.FusecalManager.observe(window, 'load', function() { top.FusecalManager.init() } ); } else { document.addEventListener("DOMContentLoaded", function() { top.FusecalManager.init() }, false); } } else { document.write("<script id='__onDOMContentLoaded' defer src='//:'></script>"); document.getElementById("__onDOMContentLoaded").onreadystatechange = function() { if (this.readyState == "complete") { this.onreadystatechange = null; top.FusecalManager.init(); } }; } 