Inital commit
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
|
||||
version="2.4">
|
||||
|
||||
<display-name>AuthSub Demo Application</display-name>
|
||||
<description>
|
||||
This is a simple web application that demonstrates AuthSub
|
||||
usage.
|
||||
</description>
|
||||
|
||||
|
||||
<servlet>
|
||||
<servlet-name>LoginServlet</servlet-name>
|
||||
<servlet-class>sample.authsub.src.LoginServlet</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>LoginServlet</servlet-name>
|
||||
<url-pattern>/LoginServlet</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>HandleTokenServlet</servlet-name>
|
||||
<servlet-class>sample.authsub.src.HandleTokenServlet</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>HandleTokenServlet</servlet-name>
|
||||
<url-pattern>/HandleTokenServlet</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<servlet>
|
||||
<servlet-name>RetrieveFeedServlet</servlet-name>
|
||||
<servlet-class>sample.authsub.src.RetrieveFeedServlet</servlet-class>
|
||||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>RetrieveFeedServlet</servlet-name>
|
||||
<url-pattern>/RetrieveFeedServlet</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
</web-app>
|
||||
@@ -0,0 +1,101 @@
|
||||
|
||||
/* The main chrome containing the calendar is spaced this far from the side */
|
||||
.datePickerDiv {
|
||||
background: #c3d9ff;
|
||||
padding: 0px 0px 9px 9px;
|
||||
line-height: 1em;
|
||||
}
|
||||
|
||||
.DP_monthtable {
|
||||
width: 100%;
|
||||
background: #fff;
|
||||
padding: 0px;
|
||||
border-bottom: 1px #A2BBDD solid;
|
||||
font-size: 83%;
|
||||
}
|
||||
|
||||
.DP_monthtable TD {
|
||||
text-align: center;
|
||||
padding: 2px;
|
||||
font-family: Verdana;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.DP_heading {
|
||||
cursor: pointer;
|
||||
background: rgb(195, 217, 255);
|
||||
color: #112ABB;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.DP_days {
|
||||
background: rgb(195, 217, 255);
|
||||
}
|
||||
|
||||
.DP_dayh {
|
||||
cursor: default;
|
||||
font-size: 78%;
|
||||
}
|
||||
|
||||
.DP_cur {
|
||||
font:bold 78%/1em Verdana,Sans-serif;
|
||||
padding-bottom: 4px;
|
||||
text-align: center;
|
||||
}
|
||||
.DP_prev, .DP_next {
|
||||
font-size: 125%;
|
||||
padding-bottom: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.DP_prev { text-align: right; }
|
||||
.DP_next { text-align: left; }
|
||||
|
||||
/* today */
|
||||
.DP_today {
|
||||
background : #9ab !important;
|
||||
border: 1px solid !important;
|
||||
border-color: #567 #abc #abc #567 !important;
|
||||
color: #fff;
|
||||
}
|
||||
.DP_today_selected {
|
||||
background : #579 !important;
|
||||
border: 1px solid !important;
|
||||
border-color: #246 #9bd #9bd #246 !important;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* weekday is Gmail blue when selected */
|
||||
.DP_weekday {
|
||||
background: rgb(255, 255, 255);
|
||||
}
|
||||
.DP_weekday_selected {
|
||||
background: rgb(170, 204, 238);
|
||||
}
|
||||
|
||||
/* weekend goes from gray to dark blue when selected */
|
||||
.DP_weekend {
|
||||
background: #E8EEF7;
|
||||
}
|
||||
.DP_weekend_selected {
|
||||
background: rgb(153, 187, 221);
|
||||
}
|
||||
|
||||
.DP_onmonth {
|
||||
}
|
||||
|
||||
.DP_offmonth {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.DP_day_top {
|
||||
border-top: 1px #A2BBDD solid;
|
||||
}
|
||||
|
||||
.DP_day_right {
|
||||
border-right: 1px #A2BBDD solid;
|
||||
}
|
||||
|
||||
.DP_day_left {
|
||||
border-left: 1px #A2BBDD solid;
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
body {
|
||||
font-family: arial, sans-serif;
|
||||
font-size: 83%;
|
||||
}
|
||||
|
||||
.leftcontent {
|
||||
float:left;
|
||||
width:175px;
|
||||
background:#fff;
|
||||
}
|
||||
|
||||
.topimage {
|
||||
margin-left:13px;
|
||||
margin-top:0px;
|
||||
padding:0px;
|
||||
}
|
||||
|
||||
.footerimage {
|
||||
margin-left:15px;
|
||||
margin-top:20px;
|
||||
padding:0px;
|
||||
}
|
||||
|
||||
.toc {
|
||||
color: #ddad08;
|
||||
font-weight:bold;
|
||||
}
|
||||
|
||||
.rightcontent {
|
||||
background:#fff;
|
||||
margin-left: 199px;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-right: 5%;
|
||||
margin-left:3%;
|
||||
}
|
||||
|
||||
ol, ul {
|
||||
margin-right: 5%;
|
||||
margin-left:3%;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size:130%;
|
||||
font-weight:bold;
|
||||
margin-left:3%;
|
||||
margin-top:2em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size:120%;
|
||||
font-weight:bold;
|
||||
margin-left:3%;
|
||||
margin-top:2em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size:100%;
|
||||
font-weight:bold;
|
||||
margin-left:3%;
|
||||
margin-top:2em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size:90%;
|
||||
font-weight:bold;
|
||||
margin-left:3%;
|
||||
margin-top:1.5em;
|
||||
}
|
||||
|
||||
.title {
|
||||
background-color: #FEFADE;
|
||||
border-top:1px solid #ddad08;
|
||||
font-weight:bold;
|
||||
font-size:120%;
|
||||
text-align:left;
|
||||
margin-left:0;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
background-color: #FEFADE;
|
||||
border-top:1px solid #ddad08;
|
||||
font-weight:bold;
|
||||
font-size:120%;
|
||||
text-align:left;
|
||||
}
|
||||
|
||||
.toclinks, ul {
|
||||
margin-bottom:0px;
|
||||
margin-top:0px;
|
||||
}
|
||||
|
||||
|
||||
.footer {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family:Courier, monospace;
|
||||
}
|
||||
|
||||
pre {
|
||||
font-family:Courier, monospace;
|
||||
margin-left:3%;
|
||||
text-align:left;
|
||||
}
|
||||
|
||||
.content {
|
||||
border-left:thin dotted #000;
|
||||
}
|
||||
|
||||
table {
|
||||
margin-left:3%;
|
||||
border: 1px solid #c3d9ff;
|
||||
border-spacing:0;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight:bold;
|
||||
text-align:left;
|
||||
margin-left:3%;
|
||||
border-right: 1px solid #C3d9ff;
|
||||
border-bottom: 1px solid #C3d9ff;
|
||||
border-top: 1px solid #C3d9ff;
|
||||
text-align: left;
|
||||
padding: 6px 6px 6px 12px;
|
||||
background: #aac8f6;
|
||||
}
|
||||
|
||||
td {
|
||||
border-right: 1px solid #C3d9ff;
|
||||
border-bottom: 1px solid #C3d9ff;
|
||||
text-align:left;
|
||||
margin-left:3%;
|
||||
padding: 6px 6px 6px 12px;
|
||||
vertical-align:top;
|
||||
}
|
||||
|
||||
td.alt {
|
||||
background: #e8eefa;
|
||||
vertical-align:top;
|
||||
}
|
||||
|
||||
font {
|
||||
margin-right: 5%;
|
||||
vertical-align:bottom;
|
||||
margin-left:3%;
|
||||
}
|
||||
|
||||
.tdfooter {
|
||||
margin-right: 5%;
|
||||
text-align:right;
|
||||
}
|
||||
|
||||
.i {
|
||||
margin-left: 1em;
|
||||
margin-right: 2em;
|
||||
}
|
||||
|
||||
.q {
|
||||
margin: 0 10px 0 5px;
|
||||
padding: 10px 0 0 10px;
|
||||
color: #000;
|
||||
background: url("../../images/quote.gif") no-repeat top left;
|
||||
}
|
||||
|
||||
.d {
|
||||
color:#999999;
|
||||
text-decoration:italics;
|
||||
font-size:83%;
|
||||
}
|
||||
|
||||
.tdheading {
|
||||
font-weight:bold;
|
||||
font-size:120%;
|
||||
margin-left:3%;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
body { background-color: white; }
|
||||
|
||||
h1 td, h1, h2, h3, h4, h5, h6, div.topnav,
|
||||
div.sidenav, div.sidesearch, div.sidequote, div.bottomnav, div.footer, small,
|
||||
td#sidebartitle { font-family: arial,sans-serif; }
|
||||
|
||||
/* rules for the bottom navigation on the results page */
|
||||
div.bottomnav { margin-top: 1ex; }
|
||||
|
||||
div.bottomnav a, span.bottomnav { font-size: 10pt; }
|
||||
|
||||
div.bottomnav a, span.big { font-size: 12pt; color: #0000cc; }
|
||||
|
||||
/* standard link colors */
|
||||
a:link { color: #0000cc; }
|
||||
a:visited { color: #551a8b; }
|
||||
a:active { color: #ff0000; }
|
||||
|
||||
|
||||
/* top part of the page */
|
||||
div.topnav { margin-bottom: 0.1ex; }
|
||||
h1 td { font-size: .95em; font-weight: bolder; }
|
||||
h1 td { background-color: #669900; color: white; border: none; padding: 2pt; }
|
||||
div.side { margin-right: 3ex; padding: 2pt; }
|
||||
div.sidenav { }
|
||||
div.sidesearch { margin-top: 1em; font-size: 0.75em; }
|
||||
div.sidequote { text-align: center; margin-top: 1.5in; border-color: red; border-style: solid; border-top-width: 1px; border-bottom-width: 1px; border-left-width: 0px; border-right-width: 0px; }
|
||||
div.footer { text-align: center; color: #6f6f6f; padding: 3pt; }
|
||||
/* sidebar on the right */
|
||||
table.sidebarborder { margin: 3pt; margin-top: 1pt; }
|
||||
td#sidebarcontent { background-color: #ffffff; }
|
||||
/* color schemes for different sections of the site */
|
||||
body.corporate h1 td, body.corporate table.sidebarborder td { background-color: #339966; }
|
||||
body.corporate td#sidebartitle { background-color: #d8f1e4; }
|
||||
body.siteowners h1 td, body.siteowners table.sidebarborder td { background-color: #ddad08; }
|
||||
body.siteowners td#sidebartitle { background-color: #f1e4d8; }
|
||||
body.search h1 td, body.search table.sidebarborder td { background-color: #336699; }
|
||||
body.search td#sidebartitle { background-color: #d8e4f1; }
|
||||
body.zealots h1 td, body.zealots table.sidebarborder td { background-color: #aa1002; }
|
||||
body.zealots td#sidebartitle { background-color: #f1e4d8; }
|
||||
body.gsa h1 td, body.gsa table.sidebarborder td { background-color: #F0C000; }
|
||||
body.gsa td#sidebartitle { background-color: #fbeab5; }
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
ul, ol {
|
||||
margin-left:3%;
|
||||
padding-left:3%;
|
||||
}
|
||||
@@ -0,0 +1,188 @@
|
||||
.pbox {
|
||||
/* position: relative; */
|
||||
top: 1px;
|
||||
width: 15em;
|
||||
/* height: 18em; */
|
||||
line-height: 1.2em;
|
||||
margin:0 10px 10px 0;
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
|
||||
/* =Menu borders (top and bottom) creates rounded corners
|
||||
----------------------------------------------- */
|
||||
.pbox .t2, .pbox .b2, .pbox .sb2 {
|
||||
background-color:#BBBBBB; /* D */
|
||||
position:relative;
|
||||
top:-1px;
|
||||
height:1px;
|
||||
margin:0 1px;
|
||||
font-size:1px;
|
||||
line-height:1px;
|
||||
}
|
||||
|
||||
.pbox .offset, .pbox .b2 {
|
||||
border-right:1px solid #666666; /* A */
|
||||
}
|
||||
.pbox .t2 {
|
||||
margin-right:2px;
|
||||
}
|
||||
.pbox .b2 {
|
||||
background-color:#BBBBBB; /* D */
|
||||
}
|
||||
.pbox .sb2 {
|
||||
display:block;
|
||||
background-color:#666666;/* A */
|
||||
margin-left:2px;
|
||||
}
|
||||
|
||||
.boxbody {
|
||||
background-color:#DDDDDD; /* E */
|
||||
position:relative;
|
||||
top:-1px;
|
||||
border:solid #BBBBBB; /* D */
|
||||
border-width:0 1px;
|
||||
}
|
||||
.boxbody ul, .boxbody li {
|
||||
margin:0;
|
||||
padding:0;
|
||||
list-style:none;
|
||||
}
|
||||
|
||||
|
||||
/* =QuickAdd
|
||||
----------------------------------------------- */
|
||||
.quick {
|
||||
width:30em;
|
||||
font-size:100%;
|
||||
color:#fff;
|
||||
z-Index: 42;
|
||||
}
|
||||
.quick .t2 {
|
||||
background-color:#8ac;
|
||||
}
|
||||
.quick .b2 {
|
||||
background-color:#468;
|
||||
}
|
||||
.quick .sb2 {
|
||||
background-color:#246;
|
||||
}
|
||||
.quick .offset, .pbox .quick .b2 {
|
||||
border-right:1px solid #246; /* A */
|
||||
}
|
||||
.quick .boxbody {
|
||||
background-color:#68a;
|
||||
border-left-color:#8ac;
|
||||
border-right-color:#468;
|
||||
padding-left: 6px;
|
||||
}
|
||||
.quick form {
|
||||
margin:0;
|
||||
padding:2px 0px;
|
||||
}
|
||||
.quick label {
|
||||
display:block;
|
||||
padding:1px 1px 2px;
|
||||
}
|
||||
.quick .txt {
|
||||
width:27em;
|
||||
border:1px solid;
|
||||
border-color:#468 #8ac #8ac #468;
|
||||
font:100% Arial,Sans-serif;
|
||||
}
|
||||
.quick .imgbtn {
|
||||
vertical-align:middle;
|
||||
}
|
||||
.quick p {
|
||||
margin:0;
|
||||
padding:2px;
|
||||
font-size:85%;
|
||||
line-height:1.2em;
|
||||
}
|
||||
|
||||
|
||||
/* =Options
|
||||
----------------------------------------------- */
|
||||
ul.caloptions {
|
||||
border-bottom:1px solid #BBBBBB; /* D */
|
||||
}
|
||||
.caloptions li {
|
||||
width:100%;
|
||||
}
|
||||
.caloptions li a {
|
||||
display:block;
|
||||
padding:3px 8px;
|
||||
color:#222;
|
||||
text-decoration:none;
|
||||
}
|
||||
* html .caloptions li a {
|
||||
height:1.2em;
|
||||
}
|
||||
.caloptions li a:hover {
|
||||
background-color:#BBBBBB; /* D */
|
||||
/*bolinfest*/
|
||||
text-decoration:underline;
|
||||
color:#222;
|
||||
}
|
||||
/*bolinfest*/
|
||||
.caloptions li a:visited {
|
||||
color:#222;
|
||||
}
|
||||
|
||||
/* =CalColor
|
||||
----------------------------------------------- */
|
||||
.calcolor {
|
||||
padding:7px 8px 0;
|
||||
}
|
||||
.calcolor ul {
|
||||
position:relative;
|
||||
float:left;
|
||||
width:100%;
|
||||
padding-bottom:3px;
|
||||
}
|
||||
* html .calcolor ul {
|
||||
padding-bottom:7px;
|
||||
}
|
||||
.calcolor li {
|
||||
display:inline;
|
||||
font-size:1px;
|
||||
line-height:1px;
|
||||
}
|
||||
.calcolor li a {
|
||||
float:left;
|
||||
display:block;
|
||||
width:13px;
|
||||
height:13px;
|
||||
margin:0 4px 4px 0;
|
||||
border:1px solid #fff;
|
||||
text-decoration:none;
|
||||
}
|
||||
.calcolor li a:hover {
|
||||
border-color:#000;
|
||||
}
|
||||
.cal1 a.cal1-b, .cal1 a.cal1-b:hover,
|
||||
.cal2 a.cal2-b, .cal2 a.cal2-b:hover,
|
||||
.cal3 a.cal3-b, .cal3 a.cal3-b:hover,
|
||||
.cal4 a.cal4-b, .cal4 a.cal4-b:hover,
|
||||
.cal5 a.cal5-b, .cal5 a.cal5-b:hover,
|
||||
.cal6 a.cal6-b, .cal6 a.cal6-b:hover,
|
||||
.cal7 a.cal7-b, .cal7 a.cal7-b:hover,
|
||||
.cal8 a.cal8-b, .cal8 a.cal8-b:hover,
|
||||
.cal9 a.cal9-b, .cal9 a.cal9-b:hover,
|
||||
.cal10 a.cal10-b, .cal10 a.cal10-b:hover,
|
||||
.cal11 a.cal11-b, .cal11 a.cal11-b:hover,
|
||||
.cal12 a.cal12-b, .cal12 a.cal12-b:hover,
|
||||
.cal13 a.cal13-b, .cal13 a.cal13-b:hover,
|
||||
.cal14 a.cal14-b, .cal14 a.cal14-b:hover,
|
||||
.cal15 a.cal15-b, .cal15 a.cal15-b:hover,
|
||||
.cal16 a.cal16-b, .cal16 a.cal16-b:hover,
|
||||
.cal17 a.cal17-b, .cal17 a.cal17-b:hover,
|
||||
.cal18 a.cal18-b, .cal18 a.cal18-b:hover,
|
||||
.cal19 a.cal19-b, .cal19 a.cal19-b:hover,
|
||||
.cal20 a.cal20-b, .cal20 a.cal20-b:hover,
|
||||
.cal21 a.cal21-b, .cal21 a.cal21-b:hover {
|
||||
background-image:url("images/icon_check3.gif");
|
||||
background-position:-13px 0;
|
||||
background-repeat:no-repeat;
|
||||
cursor:default;
|
||||
}
|
||||
|
After Width: | Height: | Size: 84 B |
|
After Width: | Height: | Size: 82 B |
|
After Width: | Height: | Size: 849 B |
|
After Width: | Height: | Size: 44 B |
|
After Width: | Height: | Size: 43 B |
|
After Width: | Height: | Size: 43 B |
|
After Width: | Height: | Size: 44 B |
@@ -0,0 +1,68 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Google Calendar AuthSub demo</title>
|
||||
<link rel="stylesheet" type="text/css" href="css/google.css">
|
||||
<link rel="stylesheet" type="text/css" href="css/frameless.css">
|
||||
<!--[if IE]>
|
||||
<link rel="stylesheet" type="text/css" href="css/ieonly.css" />
|
||||
<![endif]-->
|
||||
</head>
|
||||
|
||||
|
||||
<body>
|
||||
<div class="leftcontent">
|
||||
<p class="topimage"><a href="http://www.google.com/">
|
||||
<img src="http://www.google.com/images/google_sm.gif" border="0" alt="Return to Google homepage" /></a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<%
|
||||
StringBuffer continueUrl = request.getRequestURL();
|
||||
int index = continueUrl.lastIndexOf("/");
|
||||
continueUrl.delete(index, continueUrl.length());
|
||||
continueUrl.append("/LoginServlet");
|
||||
%>
|
||||
|
||||
<FORM NAME=index METHOD=POST ACTION="<%=continueUrl.toString()%>">
|
||||
<div class="rightcontent">
|
||||
<p class=title>Google AuthSub Demo </p>
|
||||
<div class="content">
|
||||
<h1>Google AuthSub Demo</h1>
|
||||
<p>
|
||||
This page demonstrates a basic version of AuthSub in action.</p>
|
||||
<p>
|
||||
The AuthSub token is first retrieved from Google and then used to retrieve your Calendar entries.
|
||||
</p>
|
||||
<p>
|
||||
Note: <br>
|
||||
If your user account is registered to a domain other than 'gmail.com', specify the domain name as well.
|
||||
If the calendar service in your domain requires secure connection (ssl) for retrieving feeds, make sure to check the ssl option.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
||||
<br><b>Specify user domain:</b>
|
||||
<br>
|
||||
<input type="radio" name="defaultdomain" value="true" onclick="javascript:document.index.domain.disabled=true" checked>
|
||||
Use default domain (gmail.com)
|
||||
<br>
|
||||
<input type="radio" name="defaultdomain" value="false" onclick="javascript:document.index.domain.disabled=false">
|
||||
Use my application domain (ex: mydomain.com): <input type=text name=domain disabled>
|
||||
<br>
|
||||
<br>
|
||||
<input type="checkbox" name="secure" value="true">Use secure connection to retrieve calendar feed.
|
||||
<p><input type=submit value="Authenticate">
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</FORM>
|
||||
|
||||
<div class="leftcontent">
|
||||
<p class="footerimage"><img src="http://www.google.com/images/art.gif">
|
||||
</p></div><div class="rightcontent">
|
||||
<p>
|
||||
<img src="http://www.google.com/images/cleardot.gif" width="1" height="45">
|
||||
</p> </div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,260 @@
|
||||
Function.prototype.bind=function(a){if(typeof this!="function"){throw new Error("Bind must be called as a method of a function object.");}var b=this;var c=Array.prototype.splice.call(arguments,1,arguments.length);return function(){var d=c.concat();for(var e=0;e<arguments.length;e++){d.push(arguments[e])}return b.apply(a,d)}
|
||||
}
|
||||
;var Ta;var Ya;(function(){var a={};var b=0;function c(f){if(!f.Da){f.Da=++b}return f.Da}
|
||||
function d(f,h,l,n){var k=c(f);var q=c(l);n=!(!n);var s=k+"_"+h+"_"+q+"_"+n;return s}
|
||||
Ta=function(f,h,l,n){var k=d(f,h,l,n);if(k in a){return k}var q=e.bind(null,k);a[k]={listener:l,proxy:q};if(f.addEventListener){f.addEventListener(h,q,n)}else if(f.attachEvent){f.attachEvent("on"+h,q)}else{throw new Error("Node {"+f+"} does not support event listeners.");}return k}
|
||||
;Ya=function(f,h,l,n){var k=d(f,h,l,n);if(!(k in a)){return false}var q=a[k].proxy;if(f.removeEventListener){f.removeEventListener(h,q,n)}else if(f.detachEvent){f.detachEvent("on"+h,q)}delete a[k];return true}
|
||||
;function e(f){var h=Array.prototype.splice.call(arguments,1,arguments.length);return a[f].listener.apply(null,h)}
|
||||
}
|
||||
)();var oa=["Su","M","Tu","W","Th","F","Sa"];var Z=[,"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];var aa=[,"January","February","March","April","May","June","July","August","September","October","November","December"];var Aa;var Qa;var Ba;var Ca;var W;var Sa;var Ra;(function(){var a=navigator.userAgent.toLowerCase();Aa=a.indexOf("msie")!=-1;Qa=a.indexOf("msie 5")!=-1&&document.all;Ba=a.indexOf("konqueror")!=-1;Ca=a.indexOf("safari")!=-1||Ba;W=!Aa&&!Ca&&a.indexOf("mozilla"
|
||||
)!=-1;Sa=a.indexOf("win")!=-1;Ra=!(!window.opera)}
|
||||
)();function na(a,b){}
|
||||
;function ca(a){if(!a)return"";return a.replace(/&#(\d+);/g,function(b,c){return String.fromCharCode(parseInt(c,10))}
|
||||
).replace(/&#x([a-f0-9]+);/gi,function(b,c){return String.fromCharCode(parseInt(c,16))}
|
||||
).replace(/&(\w+);/g,function(b,c){c=c.toLowerCase();return c in ca.unesc?ca.unesc[c]:"?"}
|
||||
)}
|
||||
ca.unesc={lt:"<",gt:">",quot:'"',nbsp:" ",amp:"&"};function Y(a){return Y.Ba[a]}
|
||||
function ma(a){if(!Y.Ba){var b={};b["\\"]="\\\\";b["'"]="\\047";b["\u0008"]="\\b";b['"']="\\042";b["<"]="\\074";b[">"]="\\076";b["&"]="\\046";b["\n"]="\\n";b["\r"]="\\r";b["\u0085"]="\\205";b["\u2028"]="\\u2028";b["\u2029"]="\\u2029";Y.Ba=b}return"'"+a.toString().replace(/[\'\\\r\n\b\"<>&\u0085\u2028\u2029]/g,Y)+"'"}
|
||||
function Ea(a){var b={};b.clientX=a.clientX;b.clientY=a.clientY;b.pageX=a.pageX;b.pageY=a.pageY;b.type=a.type;b.srcElement=a.srcElement;b.target=a.target;b.cancelBubble=a.cancelBubble;b.explicitOriginalTarget=a.explicitOriginalTarget;return b}
|
||||
function Oa(a){return document.getElementById(a)}
|
||||
function Pa(a){return document.all[a]}
|
||||
var z=document.getElementById?Oa:Pa;function ba(a){var b;if(!("name" in a)){var c=/\W*function\s+([\w\$]+)\(/.exec(a);if(!c){throw new Error("Cannot extract name from function: "+a);}b=c[1];a.name=b}else{b=a.name}if(!b||b=="anonymous"){throw new Error("Anonymous function has no name: "+a);}return a.name}
|
||||
function _showLogWindow(){}
|
||||
function N(a){return a<0?-1:1}
|
||||
function X(a){return a|0}
|
||||
function ta(a){DumpError(a);throw a;}
|
||||
function p(a,b){var c=a.toString();while(c.length<b){c="0"+c}return c}
|
||||
var ea=[undefined,31,undefined,31,30,31,30,31,31,30,31,30,31];function H(a,b){if(2!==b){return ea[b]}var c=a<<4;var d=ea[c];if(!d){d=Math.round((Date.UTC(a,2,1)-Date.UTC(a,1,1))/86400000);ea[c]=d}return d}
|
||||
var ua=new Object;function Ka(a,b){var c=a<<4|b;var d=ua[c];if(!d){d=(new Date(a,b-1,1,0,0,0,0)).getDay();ua[c]=d}return d}
|
||||
function fa(a){return(a.date-1+Ka(a.year,a.month))%7}
|
||||
function ra(a,b,c,d,e,f){var h;if(a===d){if((h=b-e)===0){return c-f}else if(h<0){h=c-f;do{h-=H(a,b++)}while(b<e);return h}else{h=c-f;do{h+=H(d,e++)}while(e<b);return h}}else{return Math.round((Date.UTC(a,b-1,c)-Date.UTC(d,e-1,f))/86400000)}}
|
||||
function sa(a,b){return ra(a.year,a.month,a.date,b.year,b.month,b.date)}
|
||||
function y(a,b,c,d,e,f){if(!isNaN(a)){this.year=a}if(!isNaN(b)){this.month=b}if(!isNaN(c)){this.date=c}if(!isNaN(d)){this.hour=d}if(!isNaN(e)){this.minute=e}if(!isNaN(f)){this.second=f}}
|
||||
y.prototype.year=NaN;y.prototype.month=NaN;y.prototype.date=NaN;y.prototype.hour=NaN;y.prototype.minute=NaN;y.prototype.second=NaN;y.prototype.Ya=function(){return fa(this)}
|
||||
;y.prototype.toString=function(){if(this.l!==undefined)return this.l;this.l=this.D();return this.l}
|
||||
;function K(){}
|
||||
K.prototype=new y;K.prototype.constructor=K;function j(a,b,c){y.call(this,a,b,c,NaN,NaN,NaN)}
|
||||
j.prototype=new K;j.prototype.constructor=j;j.now=function(){var a=new Date;return j.create(a.getFullYear(),a.getMonth()+1,a.getDate())}
|
||||
;j.prototype.type="Date";j.prototype.i=function(){return this}
|
||||
;j.prototype.P=function(){return new t(this.year,this.month,this.date,0,0,0)}
|
||||
;j.prototype.a=function(){if(undefined===this.e){this.e=j.wa(this.year,this.month,this.date)}return this.e}
|
||||
;j.wa=function(a,b,c){return this.e=(((a-1970)*12+b<<5)+c)*86400}
|
||||
;j.prototype.da=function(){return true}
|
||||
;j.prototype.D=function(){return p(this.year,4)+p(this.month,2)+p(this.date,2)}
|
||||
;j.prototype.equals=function(a){return this.constructor===a.constructor&&this.date===a.date&&this.month===a.month&&this.year===a.year}
|
||||
;j.V={};j.Ra=0;j.Ma=200;j.create=function(a,b,c){var d=j.wa(a,b,c);if(d in j.V){return j.V[d]}else{var e=new j(a,b,c);e.e=d;if(j.Ra<j.Ma){j.V[d]=e}return e}}
|
||||
;function t(a,b,c,d,e,f){y.call(this,a,b,c,d,e,f)}
|
||||
t.prototype=new K;t.prototype.constructor=t;t.now=function(){var a=new Date;return new t(a.getFullYear(),a.getMonth()+1,a.getDate(),a.getHours(),a.getMinutes(),a.getSeconds())}
|
||||
;t.prototype.type="DateTime";t.prototype.i=function(){return j.create(this.year,this.month,this.date)}
|
||||
;t.prototype.P=function(){return this}
|
||||
;t.prototype.La=function(){return new F(this.hour,this.minute,this.second)}
|
||||
;t.prototype.a=function(){if(undefined===this.e){this.e=(((((this.year-1970)*12+this.month<<5)+this.date)*24+this.hour)*60+this.minute)*60+this.second}return this.e}
|
||||
;t.prototype.da=function(){return true}
|
||||
;t.prototype.D=function(){return p(this.year,4)+p(this.month,2)+p(this.date,2)+"T"+p(this.hour,2)+p(this.minute,2)+p(this.second,2)}
|
||||
;t.prototype.equals=function(a){return this.constructor===a.constructor&&this.date===a.date&&this.month===a.month&&this.year===a.year&&this.hour===a.hour&&this.minute===a.minute&&this.second===a.second}
|
||||
;t.prototype.clone=function(){var a=new t(this.year,this.month,this.date,this.hour,this.minute,this.second);if(this.l!==undefined)a.l=this.l;return a}
|
||||
;function F(a,b,c){y.call(this,NaN,NaN,NaN,a,b,c)}
|
||||
F.prototype=new y;F.prototype.constructor=F;F.prototype.type="Time";F.prototype.La=function(){return this}
|
||||
;F.prototype.D=function(){return"T"+p(this.hour,2)+p(this.minute,2)+p(this.second,2)}
|
||||
;F.prototype.equals=function(a){return this.constructor===a.constructor&&this.hour===a.hour&&this.minute===a.minute&&this.second===a.second}
|
||||
;F.prototype.a=function(){return(this.hour*60+this.minute)*60+this.second}
|
||||
;function E(a,b,c,d){var e=d+60*(c+60*(b+24*a));var f=X(e/86400);e-=f*86400;var h=X(e/3600);e-=h*3600;var l=X(e/60);e-=l*60;var n=X(e);y.call(this,NaN,NaN,f,h,l,n)}
|
||||
E.prototype=new y;E.prototype.constructor=E;E.prototype.type="Duration";E.prototype.Wb=function(){return this.date}
|
||||
;E.prototype.Xb=function(){return this.date*24+this.hour}
|
||||
;E.prototype.Yb=function(){return 1440*this.date+this.hour*60+this.minute}
|
||||
;E.prototype.Zb=function(){return this.second+this.minute*60+this.hour*3600+86400*this.date}
|
||||
;E.prototype.a=function(){if(undefined===this.e){this.e=((this.date*24+this.hour)*60+this.minute)*60+this.second}return this.e}
|
||||
;E.prototype.D=function(){var a=this.year?N(this.year):(this.month?N(this.month):(this.date?N(this.date):(this.hour?N(this.hour):(this.minute?N(this.minute):(this.second?N(this.second):0)))));var b=a<0?"-P":"P";if(this.year){b+=a*this.year+"Y"}if(this.month){b+=a*this.month+"N"}if(this.date){b+=this.date%7?a*this.date+"D":a*this.date/7+"W"}if(this.hour||this.minute||this.second){b+="T"}if(this.hour){b+=a*this.hour+"H"}if(this.minute){b+=a*this.minute+"M"}if(this.second){b+=a*this.second+"S"}if(!a)
|
||||
{b+="0D"}return b}
|
||||
;E.prototype.equals=function(a){return this.constructor===a.constructor&&this.date===a.date&&this.hour===a.hour&&this.minute===a.minute&&this.second===a.second}
|
||||
;function Q(a){var b=new o;b.year=a.year||0;b.month=a.month||0;b.date=a.date||0;b.hour=a.hour||0;b.minute=a.minute||0;b.second=a.second||0;return b}
|
||||
function $(a,b,c){na(!(isNaN(a)|isNaN(b)|isNaN(c)));var d=new o;d.year=a||0;d.month=b||0;d.date=c||0;return d}
|
||||
function o(){}
|
||||
o.prototype=new y;o.prototype.constructor=o;o.prototype.type="DTBuilder";o.prototype.year=(o.prototype.month=(o.prototype.date=(o.prototype.hour=(o.prototype.minute=(o.prototype.second=0)))));o.prototype.a=function(){this.normalize()}
|
||||
;o.prototype.advance=function(a){if(a.date){this.date+=a.date}if(a.hour){this.hour+=a.hour}if(a.minute){this.minute+=a.minute}if(a.second){this.second+=a.second}}
|
||||
;o.prototype.normalize=function(){this.ib();this.ia();var a=H(this.year,this.month);while(this.date<1){this.month-=1;this.ia();a=H(this.year,this.month);this.date+=a}while(this.date>a){this.date-=a;this.month+=1;this.ia();a=H(this.year,this.month)}}
|
||||
;o.prototype.ib=function(){var a;if(this.second<0){a=Math.ceil(this.second/-60);this.second+=60*a;this.minute-=a}else if(this.second>=60){a=Math.floor(this.second/60);this.second-=60*a;this.minute+=a}if(this.minute<0){a=Math.ceil(this.minute/-60);this.minute+=60*a;this.hour-=a}else if(this.minute>=60){a=Math.floor(this.minute/60);this.minute-=60*a;this.hour+=a}if(this.hour<0){a=Math.ceil(this.hour/-24);this.hour+=24*a;this.date-=a}else if(this.hour>=24){a=Math.floor(this.hour/24);this.hour-=24*a;
|
||||
this.date+=a}}
|
||||
;o.prototype.ia=function(){var a;if(this.month<1){a=Math.ceil((this.month-1)/-12);this.month+=12*a;this.year-=a}else if(this.month>12){a=Math.floor((this.month-1)/12);this.month-=12*a;this.year+=a}}
|
||||
;o.prototype.i=function(){this.normalize();return j.create(this.year,this.month,this.date)}
|
||||
;o.prototype.P=function(){this.normalize();return new t(this.year,this.month,this.date,this.hour,this.minute,this.second)}
|
||||
;o.prototype.Ja=function(){this.normalize();return new B(isFinite(this.year)?this.year:undefined,isFinite(this.month)?this.month:undefined,isFinite(this.date)?this.date:undefined)}
|
||||
;o.prototype.Ka=function(){this.normalize();return new C(isFinite(this.year)?this.year:undefined,isFinite(this.month)?this.month:undefined,isFinite(this.date)?this.date:undefined,isFinite(this.hour)?this.hour:undefined,isFinite(this.minute)?this.minute:undefined,isFinite(this.second)?this.second:undefined)}
|
||||
;o.prototype.La=function(){this.normalize();return new F(this.hour,this.minute,this.second)}
|
||||
;o.prototype.rb=function(){if(this.year||this.month){ta("Can't convert months or years to ICAL_Duration");return undefined}else{return new E(this.date,this.hour,this.minute,this.second)}}
|
||||
;o.prototype.sb=function(){return"number"==typeof this.year&&1+this.year%1===1&&"number"==typeof this.month&&1+this.month%1===1&&"number"==typeof this.date&&1+this.date%1===1}
|
||||
;o.prototype.$b=function(){return this.sb()&&this.tb()}
|
||||
;o.prototype.tb=function(){return"number"==typeof this.hour&&1+this.hour%1===1&&"number"==typeof this.minute&&1+this.minute%1===1&&"number"==typeof this.second&&1+this.second%1===1}
|
||||
;o.prototype.toString=function(){return"["+(undefined!==this.year?p(this.year,4):"????")+"/"+(undefined!==this.month?p(this.month,2):"??")+"/"+(undefined!==this.date?p(this.date,2):"??")+" "+(undefined!==this.hour?p(this.hour,2):"??")+" "+(undefined!==this.minute?p(this.minute,2):"??")+" "+(undefined!==this.second?p(this.second,2):"??")+"]"}
|
||||
;o.prototype.equals=function(a){return this.constructor===a.constructor&&this.date===a.date&&this.month===a.month&&this.year===a.year&&this.hour===a.hour&&this.minute===a.minute&&this.second===a.second}
|
||||
;function M(a,b){this.start=a;if(b.constructor==E){var c=Q(a);c.advance(b);this.end=this.start instanceof t?c.P():c.i()}else{this.end=b}this.duration=pa(this.end,this.start)}
|
||||
M.prototype.type="PeriodOfTime";M.prototype.toString=function(){if(this.l!==undefined)return this.l;this.l=this.start+"/"+this.end;return this.l}
|
||||
;M.prototype.equals=function(a){return this.constructor===a.constructor&&this.start.equals(a.start)&&this.end.equals(a.end)}
|
||||
;M.prototype.overlaps=function(a){return a.end.a()>this.start.a()&&a.start.a()<this.end.a()}
|
||||
;M.prototype.Kb=function(a,b){return b.a()>this.start.a()&&a.a()<this.end.a()}
|
||||
;M.prototype.contains=function(a){return this.start.a()<=a.start.a()&&this.end.a()>=a.end.a()}
|
||||
;function da(a,b){this.start=a;this.end=b;try{this.duration=pa(this.end,this.start)}catch(c){this.duration=null}}
|
||||
da.prototype.type="PartialPeriodOfTime";da.prototype.D=function(){return this.start+"/"+this.end}
|
||||
;da.prototype.equals=function(a){return this.constructor===a.constructor&&this.start.equals(a.start)&&this.end.equals(a.end)}
|
||||
;function pa(a,b){if(isNaN(a.year)!=isNaN(b.year)||isNaN(a.hour)!=isNaN(b.hour)){ta("diff("+a+", "+b+")");return undefined}var c=Q(a);if(isNaN(a.year)){c.hour-=b.hour;c.minute-=b.minute;c.second-=b.second}else{c.year=NaN;c.month=NaN;c.date=ra(a.year,a.month,a.date,b.year,b.month,b.date);if(!isNaN(a.hour)){c.hour-=b.hour;c.minute-=b.minute;c.second-=b.second}}return c.rb()}
|
||||
function B(a,b,c){this.year=a;this.month=b;this.date=c}
|
||||
B.prototype=new K;B.prototype.constructor=B;B.prototype.type="PartialDate";B.prototype.i=function(){return j.create(this.year||0,this.month||1,this.date||1)}
|
||||
;B.prototype.P=function(){return new t(this.year||0,this.month||1,this.date||1,0,0,0)}
|
||||
;B.prototype.Ja=function(){return this}
|
||||
;B.prototype.Ka=function(){return new C(this.year,this.month,this.date,0,0,0)}
|
||||
;B.prototype.da=function(){return!isNaN(this.a())}
|
||||
;B.prototype.a=function(){if(undefined===this.e){this.e=(((this.year-1970)*12+this.month<<5)+this.date)*86400}return this.e}
|
||||
;B.prototype.equals=function(a){return this.constructor===a.constructor&&(this.date===a.date||isNaN(this.date)&&isNaN(a.date))&&(this.month===a.month||isNaN(this.month)&&isNaN(a.month))&&(this.year===a.year||isNaN(this.year)&&isNaN(a.year))}
|
||||
;B.prototype.D=function(){return(undefined!==this.year?p(this.year,4):"????")+(undefined!==this.month?p(this.month,2):"??")+(undefined!==this.date?p(this.date,2):"??")}
|
||||
;function C(a,b,c,d,e,f){this.year=a;this.month=b;this.date=c;this.hour=d;this.minute=e;this.second=f}
|
||||
C.prototype=new K;C.prototype.constructor=C;C.prototype.type="PartialDateTime";C.prototype.i=function(){return j.create(this.year||0,this.month||1,this.date||1)}
|
||||
;C.prototype.P=function(){return new t(this.year||0,this.month||1,this.date||1,this.hour||0,this.minute||0,this.second||0)}
|
||||
;C.prototype.Ja=function(){return new B(this.year,this.month,this.date)}
|
||||
;C.prototype.Ka=function(){return this}
|
||||
;C.prototype.da=function(){return!isNaN(this.a())}
|
||||
;C.prototype.a=function(){if(undefined===this.e){this.e=(((((this.year-1970)*12+this.month<<5)+this.date)*24+this.hour)*60+this.minute)*60+this.second}return this.e}
|
||||
;C.prototype.equals=function(a){return this.constructor===a.constructor&&(this.date===a.date||isNaN(this.date)&&isNaN(a.date))&&(this.month===a.month||isNaN(this.month)&&isNaN(a.month))&&(this.year===a.year||isNaN(this.year)&&isNaN(a.year))&&(this.hour===a.hour||isNaN(this.hour)&&isNaN(a.hour))&&(this.minute===a.minute||isNaN(this.minute)&&isNaN(a.minute))&&(this.second===a.second||isNaN(this.second)&&isNaN(a.second))}
|
||||
;C.prototype.D=function(){return(undefined!==this.year?p(this.year,4):"????")+(undefined!==this.month?p(this.month,2):"??")+(undefined!==this.date?p(this.date,2):"??")+"T"+(undefined!==this.hour?p(this.hour,2):"??")+(undefined!==this.minute?p(this.minute,2):"??")+(undefined!==this.second?p(this.second,2):"??")}
|
||||
;var S=undefined;var va=[];function qa(a,b,c){var d=b>2&&29===H(a,2);return qa.Na[b]+d+c-1}
|
||||
qa.Na=[undefined,0,31,59,90,120,151,181,212,243,273,304,334];function Da(){var a=new Date;var b=S;S=j.create(a.getFullYear(),a.getMonth()+1,a.getDate());if(b&&!b.equals(S)){for(var c=0;c<va.length;++c){var d=va[c];try{d(S)}catch(e){}}}var f=new Date(a.getFullYear(),a.getMonth(),a.getDate(),0,0,0,0);f.setDate(f.getDate()+1);var h=f.getTime()-a.getTime();if(h<0||h>=1800000){h=1800000}setTimeout(Da,h)}
|
||||
Da();function P(a,b,c){this.x=a;this.y=b;this.coordinateFrame=c}
|
||||
P.prototype.toString=function(){return"[P "+this.x+","+this.y+"]"}
|
||||
;P.prototype.clone=function(){return new P(this.x,this.y,this.coordinateFrame)}
|
||||
;function Ia(a,b){this.dx=a;this.dy=b}
|
||||
Ia.prototype.toString=function(){return"[D "+this.dx+","+this.dy+"]"}
|
||||
;function L(a,b,c,d,e){this.x=a;this.y=b;this.w=c;this.h=d;this.coordinateFrame=e}
|
||||
L.prototype.contains=function(a){return this.x<=a.x&&a.x<this.x+this.w&&this.y<=a.y&&a.y<this.y+this.h}
|
||||
;L.prototype.toString=function(){return"[R "+this.w+"x"+this.h+"+"+this.x+"+"+this.y+"]"}
|
||||
;L.prototype.clone=function(){return new L(this.x,this.y,this.w,this.h,this.coordinateFrame)}
|
||||
;function Ua(a){var b=a.ownerDocument;if(W&&b){var c=b.getBoxObjectFor(a);return new L(c.x,c.y,c.width,c.height,window)}var d=0;var e=0;for(var f=a;f.offsetParent;f=f.offsetParent){d+=f.offsetLeft;e+=f.offsetTop}return new L(d,e,a.offsetWidth,a.offsetHeight,window)}
|
||||
function Va(a){var b=a.ownerDocument;if(W&&b){var c=b.getBoxObjectFor(a);return c.height}else{return a.offsetHeight}}
|
||||
function Xa(a){var b=a.ownerDocument;if(W&&b){var c=b.getBoxObjectFor(a);return c.width}else{return a.offsetWidth}}
|
||||
function Wa(a){var b=a.ownerDocument;if(W&&b){var c=b.getBoxObjectFor(a);return new P(c.x,c.y,window)}var d=0;var e=0;while(a.offsetParent){d+=a.offsetLeft;e+=a.offsetTop;a=a.offsetParent}return new P(d,e,window)}
|
||||
function Ja(a){var b=0;var c=0;if(a.pageX||a.pageY){b=a.pageX;c=a.pageY}else if(a.clientX||a.clientY){b=a.clientX+document.body.scrollLeft;c=a.clientY+document.body.scrollTop}return new P(b,c,window)}
|
||||
function g(a,b,c,d,e){this.Q=a;this.g=c?c:this.Q.id+"_";this.c=d?d:"DP_";this.Qa();g.K[this.g]=this;if(e){this.j=e}else{this.j=j.now()}this.r=j.create(this.j.year,this.j.month,1);this.L=0;this.Ua=!(!b);this.T=false;this.Fa=null;this.Ea=null;this.J={};this.t={};this.F={};this.b={};this.n=null;this.N=null;this.ka=new J(this);this.ga=new J(this);this.pa=false;this.G=false;this.f=new G;this.ya=false;this.A=0;this.E=null;this.X=null;this.na=true;this.ja=null;this.W=null;this.ha=null;this.p();this.qa=false;
|
||||
this.pb(0);this.Ga(0);this.ba=false;this.o=null;this.d=null;this.m=null;this.I=null;this.H=null;this.Ca=null;this.M=false;this.ta=null;this.sa=null;var f=this;var h=function(l){var n=l.startDate;var k=l.endDate;var q;if(!n){q=R[this.O]}else if(!k||n.equals(k)){q="Selected: "+f.$(n,true)}else{q="Selected: "+f.$(n)+" - "+f.$(k)}f.jb(q)}
|
||||
;if(this.pa)this.ua(h);this.fa=new J(this)}
|
||||
;g.prototype.Qa=function(){var a=this.c+"day_top ",b=this.c+"day_left ",c=this.c+"day_right ",d=this.c+"onmonth ",e=this.c+"onmonth ",f=this.c+"month_top ",h=this.c+"month_left ",l=this.c+"weekend ",n=this.c+"weekday ",k=this.c+"weekend_selected ",q=this.c+"weekday_selected ";var s={};s[0]="";s[1]=a;s[3]=a+b;s[5]=a+c;s[2]=b;s[4]=c;var u={};for(var i in s){u[i|16|256]=s[i]+d+l;u[i|16|512]=s[i]+d+n;u[i|32|256]=s[i]+e+l;u[i|32|512]=s[i]+e+n;u[i|16|1024]=s[i]+d+k;u[i|16|2048]=s[i]+d+q;u[i|32|1024]=s[
|
||||
i]+e+k;u[i|32|2048]=s[i]+e+q}var v={};for(var i in u){v[i]=u[i];v[i|64]=u[i]+f;v[i|64|128]=u[i]+f+h}this._classMap=v}
|
||||
;var R={};R[0]="Select a date";R[1]="Select a range of dates";R[2]="Select dates";R[3]=" ";g.prototype.Ga=function(a,b){if(a!=0&&a!=1&&a!=7&&a!=30&&a!=-1&&!(b instanceof Function)){throw new Error("Invalid click mode: "+a);}this.Ta=a;this.xa=b}
|
||||
;g.prototype.Hb=function(){return this.T}
|
||||
;g.prototype.qb=function(a){if(a!=this.T){this.T=a;this.p()}}
|
||||
;g.prototype.Wa=function(){return this.Ta}
|
||||
;g.prototype.pb=function(a){if(this.O==a){return}this.O=a;this.u()}
|
||||
;g.prototype.aa=function(){return this.O}
|
||||
;g.prototype.show=function(){this.G=true;this.p()}
|
||||
;g.prototype.hide=function(){this.Q.innerHTML="";this.G=false}
|
||||
;g.prototype.gb=function(){return this.G}
|
||||
;g.prototype.Cb=function(a){return this.t[a.id]}
|
||||
;g.prototype.Eb=function(a){return this.F[a.id]}
|
||||
;g.prototype.Xa=function(a){return this.b[a.id]}
|
||||
;g.prototype.Fb=function(){return z(this.g+"tbl")}
|
||||
;g.prototype.mb=function(a){this.L=a;this.p()}
|
||||
;g.prototype.Aa=function(){return this.L}
|
||||
;g.prototype.Pb=function(a){this.E=a;this.p();return true}
|
||||
;g.prototype.lb=function(a){this.X=a}
|
||||
;g.prototype.yb=function(){return this.E}
|
||||
;g.prototype.Ab=function(){return this.n}
|
||||
;g.prototype.$a=function(){if(!this.G)return null;return this.b[this.n.id]}
|
||||
;g.prototype.ab=function(){if(!this.G)return null;var a=z(this.g+"day_"+(this.A-1)+"_6");return this.b[a.id]}
|
||||
;g.prototype.Ub=function(a){if(a!=this.na){this.na=a;this.p()}}
|
||||
;g.prototype.ob=function(a){this.ja=a}
|
||||
;g.prototype.Ob=function(a){this.W=a}
|
||||
;g.prototype.nb=function(a){this.ha=a}
|
||||
;g.prototype.bb=function(){return Z}
|
||||
;g.prototype.Bb=function(){return aa}
|
||||
;g.prototype.p=function(){if(!this.G){return}var a=this.g;var b;var c=this.r.month;var d=this.r.year;var e=oa.length;var f=[c==1?12:c-1,c,c==12?1:c+1];var h=j.create(this.j.year,this.j.month,1);var l=$(d,c-1,1).i();var n=$(d,c+1,1).i();if(this.ja){f[0]=this.ja(l)}else{var k=l.a()>=h.a()?"«":"‹ ";f[0]=k+Z[f[0]]}if(this.W){f[1]=this.W(this.r)}else{f[1]=aa[f[1]]+" "+d}if(this.ha){f[2]=this.ha(n)}else{var q=n.a()-h.a()<=0?"»":" ›";f[2]=Z[f[2]]+q}var s=H(d,c);var u=
|
||||
H(l.year,l.month);var i=new Array(49);var v=this.r.Ya()-this.L;if(v<0)v+=7;if(s<30||v<5)v+=7;for(var r=0;r<v;++r){i[r]=j.create(l.year,l.month,u-v+r+1)}for(var r=v,m=0;m<s;++r){i[r]=j.create(d,c,++m)}var A=v+s;for(var r=A,m=0;r<i.length;++r){i[r]=j.create(n.year,n.month,++m)}this.ta=i[0];this.sa=i[i.length-1];var D=new Array;var O=this.Ua?[2,3,2]:[1,5,1];D.push('<table cols=7 cellspacing="0" cellpadding="3" id="',a,'tbl"',' class="',this.c,'monthtable" ',' style="-moz-user-select:none; cursor:pointer;">'
|
||||
,'<tr class="',this.c,'heading" id="',a,'header">',"<td colspan=",O[0]," unselectable=on",' onmousedown="'+ba(Ha)+"(",ma(this.g),')"',' id="',a,'mhl" class="',this.c,'prev">',f[0],"</td>","<td colspan=",O[1],' unselectable="on"',' id="',a,'mhc" class="',this.c,'cur">',f[1],"</td>","<td colspan=",O[2],' unselectable="on"',' onmousedown="'+ba(Ga)+"(",ma(this.g),')"',' id="',a,'mhr" class="',this.c,'next">',f[2],"</td>","</tr>");if(this.T){D.push('<tr class="',this.c,'days" id="',a,'dow">');for(var r=
|
||||
0;r<e;++r){D.push('<td unselectable="on"',' class="',this.c,'dayh" id="',a,"day_",r,'">',oa[(r+this.L)%7],"</td>")}D.push("</tr>")}var T=(7-this.L)%7;var La=(T+6)%7;this.J={};var b=null;var w=null;var Ma=ba(Fa);var wa;var w;var ga=null;if(this.X){ga=this.X.call(null,this.ta,this.sa)}for(var r=0,m=-1;r<7;++r){D.push('<tr id="',a,"week_",r,'">');for(var I=0;I<e;++I){++m;var ha=this.f.contains(i[m]);w=0;if(r==0)w|=1;if(I==0)w|=2;else if(I==6)w|=4;w|=I==T||I==La?(ha?1024:256):(ha?2048:512);if(m<v||m>=
|
||||
A){w|=32;if(i[m].date<=7){w|=64;if(i[m].date==1&&I!=0){w|=128}}w=this._classMap[w]}else{w|=16;if(i[m].date<=7){w|=64;if(i[m].date==1&&I!=0){w|=128}}if(i[m].date==this.j.date&&c==this.j.month&&d==this.j.year){w=this._classMap[w]+(this.c+"today"+(ha?"_selected ":" "))}else{w=this._classMap[w]}}D.push('<td id="',a,"day_",r,"_",I,'"',' class="',w,'"');if(ga&&(wa=ga[i[m]])){D.push(' style="',wa,'"')}D.push(' onclick="',Ma,'(this)"',' unselectable="on">',i[m].date,"</td>")}D.push("</tr>")}if(this.pa){D.push(
|
||||
'<tr class="',this.c,'months">','<td colspan="7" id="',a,'sel"></td></tr>')}D.push("</table>");this.Q.innerHTML=D.join("");this.n=z(a+"day_0_0");this.N=z(a+"day_6_6");var b=this.n;var U=b.parentNode;var ia=null;var xa=null;var m=-1;var ja=-1;while(U!=null){++ja;if(ja==7)break;var ya=-1;while(b!=null){++m;++ya;var ka=a+"day_"+ja+"_"+ya;this.b[ka]=i[m];this.J[i[m].toString()]=b;this.F[ka]=ia;if(ia)this.t[xa]=b;ia=b;xa=ka;b=b.nextSibling}U=U.nextSibling;if(U!=null){b=U.firstChild}}this.A=7;if(!this.na)
|
||||
{var Na=z(a+"week_4");var za=z(a+"week_5");var la=z(a+"week_6");if(this.b[a+"day_4_0"].month!=c){Na.style.display="none";za.style.display="none";la.style.display="none";this.A=4}else if(this.b[a+"day_5_0"].month!=c){za.style.display="none";la.style.display="none";this.A=5}else if(this.b[a+"day_6_0"].month!=c){la.style.display="none";this.A=6}}this.Fa=l;this.Ea=n;if(this.E){this.E.call(null,this)}this.Oa()}
|
||||
;g.prototype.refresh=function(){if(this.E){this.E.call(null,this)}}
|
||||
;g.prototype.ua=function(a){return this.ka.add(a)}
|
||||
;g.prototype.Nb=function(a){return this.ka.remove(a)}
|
||||
;g.prototype.u=function(a){a=arguments.length===0||a;var b=this.f.U();for(var c=0;c<b.length;++c){var d=this.J[b[c].toString()];this.C(d,false)}this.f.clear();if(!this.M){this.Ha(null);this.la(null)}if(a)this.z()}
|
||||
;g.prototype.Jb=function(a){return this.f.contains(a)}
|
||||
;g.prototype.Sa=function(a){if(this.xa){this.xa.call(null,a);return}var b=z(a);var c=this.f;switch(this.O){case 1:var d=this.Wa();if(d==0)break;if(d!=1&&(d!=-1||!c.contains(this.b[a]))){var e=this.b[b.id];var f;switch(d){case -1:if(c.s()>7&&this.R()){var h=b.id.substr(b.id.length-3,1);e=this.b[this.g+"day_"+h+"_0"]}f=c.s()-1;break;case 7:var h=b.id.substr(b.id.length-3,1);e=this.b[this.g+"day_"+h+"_0"];f=6;break;case 30:e=this.b[b.id];e=j.create(e.year,e.month,1);var l=Q(e);f=H(e.year,e.month)-1;
|
||||
break;default:}var l=Q(e);l.date+=f;var n=l.i();this.ma(e,n);return}na(d==1||d==-1&&c.contains(this.b[a]),"not a case for single date selection");this.u(false);case 0:if(c.s()>0){var k=c.U()[0];c.remove(k);var q=this.J[k.toString()];if(q)this.C(q,false)}c.add(this.b[b.id]);this.C(b);this.z(this.b[b.id]);break;case 2:break;case 3:default:break}}
|
||||
;g.prototype.Ha=function(a){this.d=a;this.I=a?this.b[a.id]:null}
|
||||
;g.prototype.la=function(a){this.m=a;this.H=a?this.b[a.id]:null}
|
||||
;g.prototype.fb=function(){return this.M}
|
||||
;g.prototype.Vb=function(a,b){this.u(false);this.M=true;this.Ha(this.Y(a));var c=this.b[this.d.id];this.f.add(c);this.C(this.d);this.ma(c);this.la(this.d)}
|
||||
;g.prototype.xb=function(a,b,c){this.M=false;this.m=this.Y(a);if(this.R()){this.z(this.I,this.H,false);return}var d,e;if(this.b[this.m.id].a()<this.b[this.d.id].a()){d=this.b[this.m.id];e=this.b[this.d.id]}else{d=this.b[this.d.id];e=this.b[this.m.id]}this.z(d,e,false)}
|
||||
;g.prototype.Ib=function(a,b,c,d){this.Ca=Ea(a);if(this.O!=1||this.ba)return;this.ba=true;var e=this;setTimeout(function(){try{if(e.M){e.Va.call(e,b,c,d)}}finally{e.ba=false}}
|
||||
,50)}
|
||||
;g.prototype.Sb=function(a){if(this.qa==a)return;this.qa=!(!a);this.u()}
|
||||
;g.prototype.R=function(){return this.qa}
|
||||
;g.prototype.Va=function(a,b,c){var d=this.Ca;var e=this.Y(d);if(e===this.m)return;var f=this.m;this.la(e);var h=this.b;var l=h[f.id].a()<h[e.id].a();var n=h[f.id].a()<h[this.d.id].a();var k=h[e.id].a()<h[this.d.id].a();var q=h[this.d.id].a()<h[e.id].a();var s=h[this.d.id].a()<h[f.id].a();var u,i;var v,r;var m=k?this.m:this.d;var A=k?this.d:this.m;if(this.R()){var D=sa(h[A.id],h[m.id]);if(D>=7){var O,T;O=parseInt(m.id.charAt(m.id.length-3),10);T=parseInt(A.id.charAt(A.id.length-3),10);m=z(this.g+
|
||||
"day_"+O+"_0");A=z(this.g+"day_"+T+"_6")}this.B(this.n,m,false);this.B(A,this.N,false);this.B(m,A,true);this.I=h[m.id];this.H=h[A.id]}else{if(l){if(n){i=k?this.F[e.id]:this.F[this.d.id];this.B(f,i,false)}if(q){u=s?this.t[f.id]:this.t[this.d.id];this.B(u,e,true)}}else{if(s){u=q?this.t[e.id]:this.t[this.d.id];this.B(u,f,false)}if(k){i=k?this.F[this.d.id]:this.F[f.id];this.B(e,i,true)}}}v=h[m.id];r=h[A.id];this.z(v,r,true)}
|
||||
;g.prototype.B=function(a,b,c){var d=false;while(a){if(c){d=this.f.add(this.b[a.id])}else{d=this.f.remove(this.b[a.id])}if(d){this.C(a,c)}if(a.id===b.id)break;a=this.t[a.id]}}
|
||||
;g.LAST_DAY_OF_WEEK={4:"day_3_6",5:"day_4_6",6:"day_5_6",7:"day_6_6"};g.prototype.Rb=function(a){if(a){this.o={};this.o.x=a.x;this.o.y=a.y}else{this.o=null}}
|
||||
;g.prototype.Pa=function(a,b){if(!this.o)return;if(b){a.x-=this.o.x;a.y-=this.o.y}else{a.x+=this.o.x;a.y+=this.o.y}}
|
||||
;g.prototype.Y=function(a){var b=Xa(this.n);var c=Va(this.n);var d=this.db();var e=Ja(a);this.Pa(e);var f=7;var h=this.za(d.x,b,f,e.x);var l=this.za(d.y,c,this.A,e.y);return z(this.g+"day_"+l+"_"+h)}
|
||||
;g.prototype.za=function(a,b,c,d){if(d<a)return 0;var e=Math.floor((d-a)/b);return e>=c?c-1:e}
|
||||
;g.prototype.db=function(){var a=this.g;var b=this.A;var c=Wa(this.n);var d=Ua(z(a+g.LAST_DAY_OF_WEEK[b]));return new L(c.x,c.y,d.x+d.w-c.x,d.y+d.h-c.y,c.coordinateFrame)}
|
||||
;g.prototype.$=function(a,b){var c=b?aa:Z;return c[a.month]+" "+a.date}
|
||||
;g.prototype.z=function(a,b,c){var d={};d.startDate=a;d.endDate=b||a;d.fb=!(!c);d.mode=this.aa();this.ka.Z(d)}
|
||||
;g.prototype.Gb=function(){return this.j}
|
||||
;g.prototype.Tb=function(a){if(a.equals(this.j))return;this.j=a;this.p()}
|
||||
;g.prototype.va=function(a){if(a instanceof j)return a;if(a instanceof t){return j.create(a.year,a.month,a.date)}}
|
||||
;g.prototype.Qb=function(a){this.ya=!(!a)}
|
||||
;g.prototype.ma=function(a,b,c){var d=this.aa();c=c!==false;if(a)a=this.va(a);if(b)b=this.va(b);if(a)this.Ia(a);if(!a||d==3){this.u(c);return}if(d==0){this.u(false);var e=this.J[a.toString()];this.f.add(a);this.C(e);if(c)this.z(a)}else if(d==1){if(!b)b=a;var f=sa(b,a);var h=false;if(this.R()&&f>=7){var l=fa(a)+7;var n=fa(b)+7;l=(l-this.Aa())%7;n=(n-this.Aa())%7;var k;k=$(a.year,a.month,a.date-l);a=k.i();k=$(b.year,b.month,b.date+(6-n));b=k.i();h=this.Ia(a)}if(h){this.u(false)}var e=this.n;this.I=
|
||||
a;this.H=b;var q=this.N;var s=a.a();var u=b.a();var i=new G;for(;e;e=this.t[e.id]){var v=this.b[e.id];var r=this.f.contains(v);var m=v.a()>=s&&v.a()<=u;if(r!=m){this.C(e,m)}if(m){i.add(v)}}this.f=i;if(this.b[q.id].a()<u){q=this.N;var k=Q(this.b[this.N.id]);var A=null;do{k.date+=1;A=k.i();this.f.add(A)}while(!A.equals(b))}if(c)this.z(a,b)}}
|
||||
;g.prototype.oa=function(a,b,c){if(this.r.month==a.month&&this.r.year==a.year&&!c)return false;b=arguments.length==1||b;this.r=j.create(a.year,a.month,1);this.p();if(b)this.ga.Z();return true}
|
||||
;g.prototype.Za=function(){return this.r}
|
||||
;g.prototype.Ia=function(a,b){if(a.a()>=this.ta.a()&&a.a()<=this.sa.a()){return false}return this.oa(a,b)}
|
||||
;g.prototype.cb=function(){switch(this.aa()){case 0:if(this.f.s()){return this.f.U()[0]}else{return null}case 1:var a=this.I?this.I:null;var b=this.H?this.H:null;if(!a||!b)return null;return[a,b];case 2:return null;case 3:default:return null}}
|
||||
;g.prototype.Db=function(){return this.f.s()}
|
||||
;g.prototype.jb=function(a){if(this.pa){z(this.g+"sel").innerHTML=a}}
|
||||
;g.prototype.C=function(a,b){if(this.ya||!a)return;if(!(typeof b!="undefined"))b=true;var c=[];var d=[];var e=" "+a.className+" ";var f=" "+this.c;if(b){if(-1!=e.indexOf(f+"today ")){c.push(f+"today ");d.push(f+"today_selected ")}if(-1!=e.indexOf(f+"weekday ")){c.push(f+"weekday ");d.push(f+"weekday_selected ")}else if(-1!=e.indexOf(f+"weekend ")){c.push(f+"weekend ");d.push(f+"weekend_selected ")}}else{if(-1!=e.indexOf(f+"today_selected ")){d.push(f+"today ");c.push(f+"today_selected ")}if(-1!=e.indexOf(
|
||||
f+"weekday_selected ")){d.push(f+"weekday ");c.push(f+"weekday_selected ")}else if(-1!=e.indexOf(f+"weekend_selected ")){d.push(f+"weekend ");c.push(f+"weekend_selected ")}}for(var h=0;h<c.length;++h){e=e.replace(c[h],d[h])}if(c.length!=0){a.className=e}}
|
||||
;g.prototype.wb=function(a){this.ga.add(a)}
|
||||
;g.prototype.Mb=function(a){this.ga.remove(a)}
|
||||
;g.K=new Object;g.prototype.ub=function(){return this.g}
|
||||
;g.staticGetPickerById=function(a){return g.K[a]}
|
||||
;function Ha(a){var b=g.K[a];return b.oa(b.Fa)}
|
||||
function Ga(a){var b=g.K[a];return b.oa(b.Ea)}
|
||||
function Fa(a){var b=a.id;var c=b.match(/(.*)day_\d+_\d+/);var d=g.K[c[1]];return d.Sa(b)}
|
||||
g.prototype.Oa=function(){if(this.hb===true)return;this.hb=true}
|
||||
;g.prototype.vb=function(a){return this.fa.add(a)}
|
||||
;g.prototype.Lb=function(a){return this.fa.remove(a)}
|
||||
;g.prototype.log=function(){this.fa.Z(arguments)}
|
||||
;g.prototype.zb=function(){return this.Q}
|
||||
;function G(){this.q={};this.S=0}
|
||||
G.prototype.s=function(){return this.S}
|
||||
;G.prototype.add=function(a){var b=this.ra(a);if(b in this.q)return false;this.q[b]=a.i();++this.S;return true}
|
||||
;G.prototype.remove=function(a){var b=this.ra(a);if(!(b in this.q))return false;delete this.q[b];--this.S;return true}
|
||||
;G.prototype.clear=function(a){this.q={};this.S=0}
|
||||
;G.prototype.contains=function(a){var b=this.ra(a);return b in this.q}
|
||||
;G.prototype.U=function(){var a=new Array(this.s());var b=-1;for(var c in this.q)a[++b]=this.q[c];return a}
|
||||
;G.prototype.ra=function(a){return a.toString().substr(0,9)}
|
||||
;function J(a){this.kb=a;this.k=[]}
|
||||
J.prototype.add=function(a){if(!a)return false;for(var b=0;b<this.k.length;++b){if(a===this.k[b])return false}this.k.push(a);return true}
|
||||
;J.prototype.remove=function(a){if(!a)return false;for(var b=0;b<this.k.length;++b){if(a===this.k[b]){this.k.splice(b,1);return true}}return false}
|
||||
;J.prototype.Z=function(){for(var a=0;a<this.k.length;++a){this.k[a].apply(this.kb,arguments)}}
|
||||
;J.prototype.s=function(){return this.k.length}
|
||||
;J.prototype.iterator=function(){return new V(this)}
|
||||
;function V(a){this.ea=a;this.ca=0;this.v=null}
|
||||
V.prototype.eb=function(){return this.ca<this.ea.s()}
|
||||
;V.prototype.next=function(){if(this.eb()){this.v=this.ea.k[this.ca++]}else{this.v=null}return this.v}
|
||||
;V.prototype.current=function(){return this.v}
|
||||
;V.prototype.remove=function(){if(!this.v)throw new Error("no current element!");this.ea.remove(this.v);this.v=null;--this.ca}
|
||||
;var x=null;function _InitializeDatePicker(a,b,c,d,e){var f=z(a);x=new g(f,false);x.qb(true);x.ob(function(){return"«"}
|
||||
);x.nb(function(){return"»"}
|
||||
);x.lb(b);x.Ga(1,c);x.mb(d["Sunday"]);x.ua(e);z("pickerContainer").style.display="";x.show()}
|
||||
function _DatePickerSetSelection(a){x.ma(a)}
|
||||
function _DatePickerGetSelection(){return x.cb()}
|
||||
function _DatePickerGetDateForCell(a){return x.Xa(a)}
|
||||
function _DatePickerGetMonths(){return x.bb()}
|
||||
function _DatePickerGetFirstDate(){return x.$a()}
|
||||
function _DatePickerGetLastDate(){return x.ab()}
|
||||
function _DatePickerPopulateHtml(){return x.p()}
|
||||
function _DatePickerIsVisible(){return x.gb()}
|
||||
function _DatePickerGetDisplayedMonth(){return x.Za()}
|
||||
function _ICAL_Date_create(a,b,c){return j.create(a,b,c)}
|
||||
function _ICAL_ToDate(a){return a.i()}
|
||||
function _ICAL_GetComparable(a){return a.a()}
|
||||
var _ICAL_DateTime=t;var _forid=z;var _ICAL_todaysDate=S;var _ical_builderCopy=Q;var _ToJSString=ma;
|
||||
|
||||
@@ -0,0 +1,457 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Google Calendar AuthSub demo</title>
|
||||
|
||||
<!--
|
||||
This is the page that uses the AuthSub token retrieved from Google for the
|
||||
respective user. The web service will redirect to this page once an
|
||||
AuthSub token has been successfully retrieved.
|
||||
|
||||
This page makes the following assumptions:
|
||||
- User has been assigned an login cookie by the web service
|
||||
- The web service has retrieved from Google a valid AuthSub token for the
|
||||
respective user
|
||||
|
||||
This page displays a calendar widget. The widget is populated with
|
||||
information retrieved from Google Calendar using the user's private default
|
||||
feed.
|
||||
|
||||
Note: The URL is secured on the server using the token generated in the
|
||||
formProxyFeedUrl() function.
|
||||
-->
|
||||
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="css/google.css">
|
||||
<link rel="stylesheet" type="text/css" href="css/frameless.css">
|
||||
<!--[if IE]>
|
||||
<link rel="stylesheet" type="text/css" href="css/ieonly.css" />
|
||||
<![endif]-->
|
||||
|
||||
<link href="css/datepicker.css" type="text/css" rel="stylesheet">
|
||||
<link href="css/pbox.css" type="text/css" rel="stylesheet">
|
||||
|
||||
|
||||
<script language="JavaScript" type="text/javascript"
|
||||
src="javascript/util.js" ></script>
|
||||
|
||||
<script language="JavaScript" type="text/javascript"
|
||||
src="javascript/gdata_condensed.js" ></script>
|
||||
|
||||
<script language="JavaScript" type="text/javascript">
|
||||
|
||||
var dateData = {};
|
||||
|
||||
var firstDayMap = {
|
||||
Sunday : 0,
|
||||
Monday : 1,
|
||||
Saturday : 6
|
||||
};
|
||||
|
||||
|
||||
// The following function generates the URL for the proxy. A secure token
|
||||
// is first generated using JSP. The token is appended as a query
|
||||
// parameter to the RetrieveFeed request
|
||||
function formProxyFeedUrl() {
|
||||
<%
|
||||
String feedUrl = (String)(request.getSession(false)).getAttribute("feedRootUrl")
|
||||
+ "default/private/full";
|
||||
|
||||
// Secure the URL by generating a secure token before sending the request
|
||||
// to the proxy server
|
||||
long currentTimeSeconds = ((new java.util.Date()).getTime()) / 1000;
|
||||
String cookie = sample.authsub.src.Utility.getCookieValueWithName(
|
||||
request.getCookies(), sample.authsub.src.Utility.LOGIN_COOKIE_NAME);
|
||||
|
||||
String token = sample.authsub.src.SecureUrl.generateToken(cookie,
|
||||
feedUrl,
|
||||
"GET",
|
||||
currentTimeSeconds);
|
||||
// Pass values to javascript
|
||||
feedUrl = "\"" + feedUrl + "\"";
|
||||
token = "\"" + token + "\"";
|
||||
%>
|
||||
|
||||
return "/authsub_sample/RetrieveFeedServlet?href=\"" + <%=feedUrl%>
|
||||
+ "\"×tamp=\"" + <%=currentTimeSeconds%> + "\"&token=\"" +
|
||||
<%=token%> +"\"";
|
||||
}
|
||||
|
||||
// @param date {ICAL_Date}
|
||||
// @return {GD_Entry[]} entries for date, sorted
|
||||
function getEntriesFor(date) {
|
||||
var data = dateData[date];
|
||||
var entries = [];
|
||||
for (var e in data) entries.push(data[e]);
|
||||
entries.sort(compareEntry);
|
||||
return entries;
|
||||
}
|
||||
|
||||
// a before b <=> -1
|
||||
// @param a {GD_Entry}
|
||||
// @param b {GD_Entry}
|
||||
// @return {number} satisfying "Comparable" contract for GD_Entry
|
||||
function compareEntry(a, b) {
|
||||
var cmp = IsAllDay(b) - IsAllDay(a);
|
||||
if (cmp) return cmp;
|
||||
cmp = _ICAL_GetComparable(parseTemporal(a.getStartTime())) -
|
||||
_ICAL_GetComparable(parseTemporal(b.getStartTime()));
|
||||
if (cmp) return cmp;
|
||||
var at = a.getTitle(), bt = b.getTitle();
|
||||
if (at < bt) return -1;
|
||||
return (at == bt) ? 0 : 1;
|
||||
}
|
||||
|
||||
function AgendaPopup() {
|
||||
this.div_ = _forid('agendaDiv');
|
||||
document.body.appendChild(this.div_);
|
||||
this.isVisible_ = false;
|
||||
}
|
||||
|
||||
// @param date {ICAL_Date}
|
||||
// @param cell {Element}
|
||||
AgendaPopup.prototype.show = function(date, cell) {
|
||||
_DatePickerSetSelection(date);
|
||||
}
|
||||
|
||||
function _OpenUrl(url) {
|
||||
open(url, "_BLANK");
|
||||
}
|
||||
|
||||
var HOVER_LINK_JS = ' onmouseout="this.style.textDecoration=\'none\'" ' +
|
||||
'onmouseover="this.style.textDecoration=\'underline\'" ';
|
||||
|
||||
// @param date {ICAL_Date}
|
||||
// @param entry {GD_Entry}
|
||||
// @param html {string[]}
|
||||
function AddEventHtml(date, entry, html) {
|
||||
html.push("<TR>");
|
||||
var title = entry.getTitle();
|
||||
if (IsAllDay(entry)) {
|
||||
html.push('<TD colspan="2" ',
|
||||
'style="background-color:#668CD9; color:white; width:100%">');
|
||||
} else {
|
||||
html.push('<TD style="text-align: right;" class="eventChip">');
|
||||
var titlePrefix = "";
|
||||
var startDateTime = parseDateTime(entry.getStartTime());
|
||||
if (_ICAL_ToDate(startDateTime).equals(date)) {
|
||||
// event starts today! show start time
|
||||
titlePrefix = HumanTime(startDateTime) + " ";
|
||||
} else {
|
||||
}
|
||||
html.push(titlePrefix, '</TD><TD style="width:100%">');
|
||||
}
|
||||
var onclick = "\"_OpenUrl(" + _ToJSString(entry.getEventPageUrl()) + ")\"";
|
||||
html.push('<SPAN onclick=', onclick, HOVER_LINK_JS,
|
||||
'style="cursor:pointer" class="eventChip">', title, '</SPAN>');
|
||||
html.push("</TD></TR>");
|
||||
}
|
||||
|
||||
var gAgendaPopup;
|
||||
|
||||
function _GetAgendaPopup() {
|
||||
if (!gAgendaPopup) gAgendaPopup = new AgendaPopup();
|
||||
return gAgendaPopup;
|
||||
}
|
||||
|
||||
// @param cellId {string}
|
||||
function popupAgenda(cellId) {
|
||||
var cell = _forid(cellId);
|
||||
var dt = _DatePickerGetDateForCell(cell);
|
||||
_GetAgendaPopup().show(dt, cell);
|
||||
}
|
||||
|
||||
// authentication token for reading XAPI feeds
|
||||
var token;
|
||||
|
||||
// @param start {ICAL_Date}
|
||||
// @param end {ICAL_Date}
|
||||
function calendarInlineDecorator(start, end) {
|
||||
var decs = {};
|
||||
var builder = _ical_builderCopy(start);
|
||||
|
||||
for (var dt = _ICAL_ToDate(builder);
|
||||
_ICAL_GetComparable(dt) <= _ICAL_GetComparable(end);
|
||||
builder.date += 1, dt = _ICAL_ToDate(builder)) {
|
||||
var str = dt.toString();
|
||||
if (str in dateData) decs[str] = 'font-weight:bold';
|
||||
}
|
||||
return decs;
|
||||
}
|
||||
|
||||
// @param date {ICAL_Date}
|
||||
// @return {string} XAPI Date
|
||||
function formatDate(date) {
|
||||
var m = date.month;
|
||||
if (m < 10) m = "0" + m;
|
||||
var d = date.date;
|
||||
if (d < 10) d = "0" + d;
|
||||
return date.year + "-" + m + "-" + d;
|
||||
}
|
||||
|
||||
// @param date {ICAL_Date}
|
||||
// @return mm dd[, yyyy]
|
||||
function HumanDate(date) {
|
||||
var humanDate = _DatePickerGetMonths()[date.month] + " " + date.date;
|
||||
if (_ICAL_todaysDate.year !== date.year) {
|
||||
humanDate += ", " + date.year;
|
||||
}
|
||||
return humanDate;
|
||||
}
|
||||
|
||||
// @param time {ICAL_DateTime}
|
||||
// @return hh:mm{a,p}m
|
||||
function HumanTime(time) {
|
||||
var h = time.hour;
|
||||
var m = time.minute;
|
||||
if (m < 10) m = "0" + m;
|
||||
var a = (h < 12) ? "am" : "pm";
|
||||
if (h > 12) {
|
||||
h -= 12;
|
||||
} else if (h === 0) {
|
||||
h = 12;
|
||||
}
|
||||
return h + ":" + m + a;
|
||||
}
|
||||
|
||||
// @param yyyy_mm_dd_date {string}
|
||||
function parseDate(yyyy_mm_dd_date) {
|
||||
var parts = yyyy_mm_dd_date.substring(0, 10).split('-');
|
||||
for (var i = 0; i < 3; ++i) {
|
||||
parts[i] = parseInt(parts[i], 10);
|
||||
}
|
||||
return _ICAL_Date_create(parts[0], parts[1], parts[2]);
|
||||
}
|
||||
|
||||
function parseDateTime(str) {
|
||||
var m = str.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/);
|
||||
for(var i = 1; i < 7; ++i) {
|
||||
m[i] = parseInt(m[i], 10);
|
||||
}
|
||||
return new _ICAL_DateTime(m[1], m[2], m[3], m[4], m[5], m[6]);
|
||||
}
|
||||
|
||||
function parseTemporal(str) {
|
||||
if (str.length === 10) return parseDate(str);
|
||||
return parseDateTime(str);
|
||||
}
|
||||
|
||||
// @param month {ICAL_Date}
|
||||
function loadEventsForMonth(month) {
|
||||
loadEventsForRange(_DatePickerGetFirstDate(), _DatePickerGetLastDate());
|
||||
}
|
||||
|
||||
// @param start {ICAL_Date}
|
||||
// @param end {ICAL_Date}
|
||||
function loadEventsForRange(start, end) {
|
||||
loadFeed(formatDate(start), formatDate(end));
|
||||
}
|
||||
|
||||
function IsAllDay(entry) {
|
||||
if ('allday' in entry) return entry.allday;
|
||||
var allday = (entry.getStartTime().length == 10);
|
||||
return (entry.allday = allday);
|
||||
}
|
||||
|
||||
// @param start {string}
|
||||
// @param end {string}
|
||||
function loadFeed(start, end) {
|
||||
var feedUrl = formProxyFeedUrl();
|
||||
new GD_EventFeed(feedUrl, createLoadFeedCallback());
|
||||
}
|
||||
|
||||
function createLoadFeedCallback() {
|
||||
return function(feed) {
|
||||
var entries = feed.getEntries();
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
var status = entry.getEventStatus();
|
||||
if (status == GD_EventEntry.CANCELED) continue;
|
||||
|
||||
var startTime = entry.getStartTime();
|
||||
var endTime = entry.getEndTime();
|
||||
var startDate = parseDate(startTime);
|
||||
var endDate = parseDate(endTime);
|
||||
var endDateCmp;
|
||||
var builder;
|
||||
if (IsAllDay(entry)) {
|
||||
endDateCmp = _ICAL_GetComparable(endDate);
|
||||
} else {
|
||||
builder = _ical_builderCopy(endDate);
|
||||
builder.date += 1;
|
||||
endDateCmp = _ICAL_GetComparable(_ICAL_ToDate(builder));
|
||||
}
|
||||
builder = _ical_builderCopy(startDate);
|
||||
for (var dt = _ICAL_ToDate(builder);
|
||||
_ICAL_GetComparable(dt) < endDateCmp;
|
||||
builder.date += 1, dt = _ICAL_ToDate(builder)) {
|
||||
var events;
|
||||
if (dt in dateData) {
|
||||
events = dateData[dt];
|
||||
} else {
|
||||
events = {};
|
||||
dateData[dt] = events;
|
||||
}
|
||||
events[entry.getId()] = entry;
|
||||
}
|
||||
}
|
||||
_DatePickerPopulateHtml();
|
||||
}
|
||||
}
|
||||
|
||||
function firstLoad() {
|
||||
if (_DatePickerIsVisible()) {
|
||||
loadEventsForMonth(_DatePickerGetDisplayedMonth());
|
||||
} else {
|
||||
var today = _ICAL_todaysDate;
|
||||
var builder = _ical_builderCopy(_ICAL_todaysDate);
|
||||
var start, end;
|
||||
builder.date -= 14;
|
||||
start = _ICAL_ToDate(builder);
|
||||
builder.date += 28;
|
||||
end = _ICAL_ToDate(builder);
|
||||
// load 2 weeks before and after the current date
|
||||
loadEventsForRange(start, end);
|
||||
}
|
||||
_nav(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Navigate the current selection on the datepicker.
|
||||
* @param period {int} must be -1, 0, or 1;
|
||||
* corresponds to previous day, today, next day
|
||||
*/
|
||||
function _nav(period) {
|
||||
if (period === 0) {
|
||||
// go to today
|
||||
_DatePickerSetSelection(_ICAL_todaysDate);
|
||||
} else {
|
||||
var selectedDate = _DatePickerGetSelection();
|
||||
var builder = _ical_builderCopy(selectedDate);
|
||||
builder.date += period;
|
||||
_DatePickerSetSelection(_ICAL_ToDate(builder));
|
||||
}
|
||||
}
|
||||
|
||||
function handleDatePickerSelection(event) {
|
||||
populateAgenda(event.startDate);
|
||||
}
|
||||
|
||||
var gAgendaInitialized = false;
|
||||
|
||||
/**
|
||||
* Initializes the agenda view.
|
||||
*/
|
||||
function initAgenda() {
|
||||
if (!gAgendaInitialized) {
|
||||
_forid('prevB').src = "images/btn_prev.gif";
|
||||
_forid('nextB').src = "images/btn_next.gif";
|
||||
_forid('agenda').style.display = ''; // block
|
||||
gAgendaInitialized = true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function populateAgenda(opt_date) {
|
||||
if (!initAgenda()) return;
|
||||
var date = opt_date || _ICAL_todaysDate;
|
||||
var entries = getEntriesFor(date);
|
||||
var html = [];
|
||||
if (entries.length) {
|
||||
for (var i = 0; i < entries.length; ++i) {
|
||||
var entry = entries[i];
|
||||
AddEventHtml(date, entry, html);
|
||||
}
|
||||
} else {
|
||||
html.push("<TR><TD><I>Nothing to do today!</I></TD></TR>");
|
||||
}
|
||||
_forid('selectedDate').innerHTML = HumanDate(date);
|
||||
_forid('agendaTable').innerHTML = html.join("");
|
||||
}
|
||||
|
||||
function MyOnLoad() {
|
||||
_InitializeDatePicker('picker', calendarInlineDecorator, popupAgenda,
|
||||
firstDayMap, handleDatePickerSelection);
|
||||
firstLoad();
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<body onload="MyOnLoad()">
|
||||
|
||||
<div class="leftcontent">
|
||||
<p class="topimage">
|
||||
<a href="http://www.google.com/">
|
||||
<img src="http://www.google.com/images/google_sm.gif" border="0"
|
||||
alt="Return to Google homepage" /></a></p>
|
||||
</div>
|
||||
|
||||
<div class="rightcontent">
|
||||
<p class=title>Google AuthSub Demo </p>
|
||||
<div class="content">
|
||||
<h1>Google AuthSub Demo</h1>
|
||||
|
||||
<p>This page demonstrates a basic version of AuthSub in action.</p>
|
||||
|
||||
<p>The AuthSub token is first retrieved from Google and then used
|
||||
to retrieve your Calendar feed.
|
||||
</p>
|
||||
|
||||
|
||||
<center>
|
||||
<table width="65%" border="3">
|
||||
<tr>
|
||||
<td height="100%" valign="top">
|
||||
|
||||
<center>
|
||||
<div id="pickerContainer" align="center" style="display:none; width: 13em">
|
||||
<div id="picker"></div>
|
||||
</div>
|
||||
</center>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td height="100%" valign="top">
|
||||
|
||||
<center>
|
||||
<div id="agenda" style="display:none">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" id="navButtons"><tr>
|
||||
<td><div align="center" valign="middle">
|
||||
<img id="prevB" width="33px" height="17px" onmousedown="_nav(-1)"></div></td>
|
||||
<td><div align="center" valign="middle">
|
||||
<img id="nextB" width="33px" height="17px" onmousedown="_nav(1)"></div></td>
|
||||
<td><div align="center" valign="middle">
|
||||
<button id="todayB" onmousedown="_nav(0)">Today</button></div></td>
|
||||
<td id="selectedDate" style="padding-left: 1em; font-weight: bold;"></td>
|
||||
</tr></table>
|
||||
<table width="100%" id="agendaTable" cellspacing="1"></table>
|
||||
</div>
|
||||
</center>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</center>
|
||||
|
||||
<div id="agendaDiv"
|
||||
style="display:none; position:absolute; width: 20em; background-color: #666666;
|
||||
padding: 3px 0px 2px 0px; font-size: 83%">
|
||||
<div style="border: 1px solid gray; background-color:white; width: 100%; margin: -6px 0 0 -4px;">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="leftcontent">
|
||||
<p class="footerimage"><img src="http://www.google.com/images/art.gif"></p>
|
||||
</div>
|
||||
<div class="rightcontent">
|
||||
<p><img src="http://www.google.com/images/cleardot.gif" width="1" height="45"></p>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||