From cb4806cb91b3ea6a01613bbfe68a9e04ed255578 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 29 Jun 2010 23:47:41 +0200 Subject: import 1.1.1 --- src/main/webapp/Suggest.js | 363 +++++++++++++++++++++++++++++++++++++++++ src/main/webapp/javascript.jsp | 45 +++++ src/main/webapp/static.html | 163 ++++++++++++++++++ src/main/webapp/static2.html | 160 ++++++++++++++++++ 4 files changed, 731 insertions(+) create mode 100644 src/main/webapp/Suggest.js create mode 100644 src/main/webapp/javascript.jsp create mode 100644 src/main/webapp/static.html create mode 100644 src/main/webapp/static2.html (limited to 'src/main') diff --git a/src/main/webapp/Suggest.js b/src/main/webapp/Suggest.js new file mode 100644 index 0000000..6fd945c --- /dev/null +++ b/src/main/webapp/Suggest.js @@ -0,0 +1,363 @@ +// function log(what) +//{ +// document.getElementById("dbg").innerHTML += what ; +//} + +function TypeAheadControl(list, box, orig, submit, optype, ie6hack) +{ + // + // Squirrel away the parameters we were given + // + this.elementList = list; + this.textBox = box; + this.origin = orig; + this.submit = submit; + this.optype = optype; + this.results = 0; + this.maxResults = 35; + this.ie6hack = ie6hack; + var myThis = this; + + // + // Setup the lowercase names + // + var i = 0; + while (i < list.length) { + if (null == list[i]) { + list.length = i; + break; + } + list[i][2] = list[i][0].toLowerCase(); + i++; + } + // + // Set up the "dropDown" + // + this.dropDown = document.createElement("div"); + this.dropDown.className = "dropdown"; + this.dropDown.style.visibility = "hidden"; + this.dropDown.style.width = box.offsetWidth; + this.dropDown.current = -1; + document.body.appendChild(this.dropDown); + + // + // mouse listeners for the dropdown box + // + this.dropDown.onmouseover = function(event) + { + if (!event) { + event = window.event; + } + target = event.target; + if (!target) { + target = event.srcElement; + } + myThis.select(target); + } + + this.dropDown.onmousedown = function(event) + { + if (-1 != myThis.dropDown.current) { + myThis.textBox.value = myThis.results[myThis.dropDown.current][0]; + } + } + + // + // Add the listeners to the text box + // + this.textBox.onkeyup = function(event) { + // + // get window even if needed + // + if (!event) { + event = window.event; + } + myThis.handleKeyUp(event); + } + + this.textBox.onkeydown = function(event) { + if (!event) { + event = window.event; + } + + myThis.handleKeyDown(event); + } + + this.textBox.onblur = function() { + myThis.hideDrop(); + } + + this.textBox.onfocus = function() { + myThis.handleChange(); + } + +} +// +// Given a name return the first maxresults, or all possibles +// +TypeAheadControl.prototype.getPossible = function(name) +{ + var possibles = []; + var inIndex = 0; + var outIndex = 0; + name = name.toLowerCase(); + var strIndex = 0; + var str; + var ostr; + + while (outIndex <= this.maxResults && inIndex < this.elementList.length) { + strIndex = this.elementList[inIndex][2].indexOf(name); + if (-1 != strIndex) { + // + // a hit + // + str = this.elementList[inIndex][0]; + possibles[outIndex] = new Array(str, this.elementList[inIndex][1]); + outIndex ++; + } else { + // + // Check entityId + strIndex = this.elementList[inIndex][1].indexOf(name); + if (-1 != strIndex) { + // + // a hit + // + str = this.elementList[inIndex][0]; + possibles[outIndex] = new Array(str, this.elementList[inIndex][1]); + outIndex ++; + } + } + inIndex ++; + } + return possibles; +} + +TypeAheadControl.prototype.handleKeyUp = function(event) { + var key = event.keyCode; + + if (27 == key) { + // + // Escape - clear + // + this.textBox.value = ""; + this.handleChange(); + } else if (8 == key || 32 == key || (key >= 46 && key < 112) || key > 123) { + // + // Backspace, Space and >=Del to F12 + // + this.handleChange(); + } +} + +TypeAheadControl.prototype.handleKeyDown = function(event) { + + var key = event.keyCode; + + if (38 == key) { + // + // up arrow + // + this.upSelect(); + + } else if (40 == key) { + // + // down arrow + // + this.downSelect(); + } +} + +TypeAheadControl.prototype.hideDrop = function() +{ + var i = 0; + if (null != this.ie6hack) { + while (i < this.ie6hack.length) { + this.ie6hack[i].style.visibility = "visible"; + i++; + } + } + this.dropDown.style.visibility = "hidden"; + this.doUnselected(); +} + +TypeAheadControl.prototype.showDrop = function() +{ + var i = 0; + if (null != this.ie6hack) { + while (i < this.ie6hack.length) { + this.ie6hack[i].style.visibility = "hidden"; + i++; + } + } + this.dropDown.style.visibility = "visible"; +} + + +TypeAheadControl.prototype.doSelected = function() +{ + this.submit.value="Select"; + this.optype.value = "selection"; +} + +TypeAheadControl.prototype.doUnselected = function() +{ + this.submit.value="Search"; + + this.optype.value = "search"; +} + +TypeAheadControl.prototype.handleChange = function() { + + var val = this.textBox.value; + var res = this.getPossible(val); + + + if (0 == res.length || this.maxResults < res.length) { + this.hideDrop(); + this.doUnselected(); + this.results = []; + this.dropDown.current = -1; + } else { + this.results = res; + this.populateDropDown(res); + if (1 == res.length) { + this.select(this.dropDown.childNodes[0]); + this.doSelected(); + } else { + this.doUnselected(); + } + } +} + +// +// A lot of the stuff below comes from +// http://www.webreference.com/programming/javascript/ncz/column2 +// +// With thanks to Nicholas C Zakas +// +TypeAheadControl.prototype.populateDropDown = function(list) +{ + this.dropDown.innerHTML = ""; + var i = 0; + var div; + while (i < list.length) { + div = document.createElement("div"); + div.appendChild(document.createTextNode(list[i][0])); +// div.style.zIndex = "1000"; + this.dropDown.appendChild(div); + i++; + } + var off = this.getXY(); + this.dropDown.style.left = off[0] + "px"; + this.dropDown.style.top = off[1] + "px"; + this.showDrop(); +} + +TypeAheadControl.prototype.getXY = function() +{ + + var node = this.textBox; + var sumX = 0; + var sumY = node.offsetHeight; + + while(node.tagName != "BODY") { + sumX += node.offsetLeft; + sumY += node.offsetTop; + node = node.offsetParent; + } + // + // And add in the offset for the Body + // + sumX += node.offsetLeft; + sumY += node.offsetTop; + + return [sumX, sumY]; +} + +TypeAheadControl.prototype.select = function(selected) +{ + var i = 0; + var node; + this.dropDown.current = -1; + this.doUnselected(); + while (i < this.dropDown.childNodes.length) { + node = this.dropDown.childNodes[i]; + if (node == selected) { + // + // Highlight it + // + node.className = "current"; + // + // turn on the button + // + this.doSelected(); + // + // setup the cursor + // + this.dropDown.current = i; + // + // and the value for the Server + // + this.origin.value = this.results[i][1]; + } else { + node.className = ""; + } + i++; + } + this.textBox.focus(); +}; + +TypeAheadControl.prototype.downSelect = function() +{ + if (this.results.length > 0) { + + if (-1 == this.dropDown.current) { + // + // mimic a select() + // + this.dropDown.current = 0; + this.dropDown.childNodes[0].className = "current"; + this.doSelected(); + this.origin.value = this.results[0][1]; + + } else if (this.dropDown.current < (this.results.length-1)) { + // + // turn off highlight + // + this.dropDown.childNodes[this.dropDown.current].className = ""; + // + // move cursor + // + this.dropDown.current++; + // + // and "select" + // + this.dropDown.childNodes[this.dropDown.current].className = "current"; + this.doSelected(); + this.origin.value = this.results[this.dropDown.current][1]; + } + } + } + + +TypeAheadControl.prototype.upSelect = function() +{ + if ((this.results.length > 0) && + (this.dropDown.current > 0)) { + + // + // turn off highlight + // + this.dropDown.childNodes[this.dropDown.current].className = ""; + // + // move cursor + // + this.dropDown.current--; + // + // and "select" + // + this.dropDown.childNodes[this.dropDown.current].className = "current"; + this.doSelected(); + this.origin.value = this.results[this.dropDown.current][1]; + } +} \ No newline at end of file diff --git a/src/main/webapp/javascript.jsp b/src/main/webapp/javascript.jsp new file mode 100644 index 0000000..274df50 --- /dev/null +++ b/src/main/webapp/javascript.jsp @@ -0,0 +1,45 @@ +<%@ page contentType="text/javascript;charset=UTF-8" %> +<%@ taglib uri="/WEB-INF/tlds/struts-logic.tld" prefix="logic" %> +<%@ taglib uri="/WEB-INF/tlds/struts-bean.tld" prefix="bean" %> + +<%request.setCharacterEncoding("UTF-8");%> +<%response.setCharacterEncoding("UTF-8");%> + + +var theElements = [ + + ["", ""], + + ]; + +var theHints = [ + + + + + + + + + + [ + "?entityID=<%= java.net.URLEncoder.encode(ei.toString(), "utf-8") %>&return=<%= java.net.URLEncoder.encode(re.toString(), "utf-8") %>&returnIDxParam=<%= java.net.URLEncoder.encode( returnIDParam.toString(), "utf-8" ) %>&cache=perm&action=selection&origin=" + , + "" + ], + + + + + + + [ + "?target=<%= java.net.URLEncoder.encode(targ.toString(),"utf-8") %>&shire=<%= java.net.URLEncoder.encode(shire.toString(),"utf-8") %>&providerId=<%= java.net.URLEncoder.encode(pid.toString(),"utf-8") %>&time=&cache=perm&action=selection&origin=" + , + "" + ], + + + +]; + \ No newline at end of file diff --git a/src/main/webapp/static.html b/src/main/webapp/static.html new file mode 100644 index 0000000..4f20be0 --- /dev/null +++ b/src/main/webapp/static.html @@ -0,0 +1,163 @@ + + + +Static Discovery Service with centralised hinting + +

+This is a boring, but static web page which shows how an signle SP can +configure their own "Discovery Service" without recouse to a Java +Container but taking full advantage of the centralised cookie server +in the Federation Discovery Service. +

+

This is not meant to be pretty - it is meant to be easy for SP's +(who understand HTML) to understand and develop. It is however +targetted at a single SP. Sites running multiple SPs and wanting a +single Discovery will still need to deploy a real DS, or deploy this +as an embedded wayf on each SP. +

+

+There is obviously plenty of room for adding all the visual sugar and +branding that we want at the three levels

+ + +

Just for fun, this Discovery service points to the I2Wiki, a Shib 2 +SP (and so with an easier configuration). To make things even more +fun it has access to metadata (mostly statically loaded) for 6 +Federations. (UK, InCommon, MAMS, Switch AcoNet and Renater)

+ + + +
+ +

Enter Organization Name

+ + + +
+ + + + + + + + + + + + + +
+ + + +
+
+ +

Configuring

+ +Details on how to set this up this are embedded as comments in this +web page. Currently a lot of the configuration is manual. Future +versions will be as automatic as possible and the only configuration +required will be the link which is displayed when there is not +javascript enabled. + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/static2.html b/src/main/webapp/static2.html new file mode 100644 index 0000000..c815f22 --- /dev/null +++ b/src/main/webapp/static2.html @@ -0,0 +1,160 @@ + + + +Static Discovery Service with centralised hinting + +

+This is a boring, but static web page which shows how an signle SP can +configure their own "Discovery Service" without recouse to a Java +Container but taking full advantage of the centralised cookie server +in the Federation Discovery Service. +

+

+This DS points at a test SP in the UK Federation, and uses the +Shib/SAML1 protocol. It is a lot harder to configure (a lot like +setting up one a "WAYFless URLS". Consider it motivation to upgrade +from SAML1 to SAML2... +

+ + +
+
+

Enter Organization Name

+ + +
+ + + + + + + + + + + + + + + +
+ + + +
+
+ + + +

Configuring

+ +Details on how to set this up this are embedded as comments in this +web page. Currently a lot of the configuration is manual. Although +it would be feasible to automate this just as is planned for Shib2 +SPs, the duplication seems needless given that the product has a 9 +month shelf life. + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.1