/* -*- C -*- */
/* --------------------------------------------------------------------
* Shine: The Become Interactive Client Application Framework
* @(#) $Id: shine.js 56702 2008-06-30 09:50:35Z daniel $
* --------------------------------------------------------------------
* Copyright (c) 2006 Become Interactive
* http://www.becomeinteractive.co.uk
* All rights reserved.
* --------------------------------------------------------------------
* This software is the confidential and proprietary information of
* Become Interactive ("Confidential Information").
*
* You shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement you
* with the terms of the license agreement you entered into with
* Become Interactive.
* --------------------------------------------------------------------
*/
var Shine;
if(typeof com == "undefined") var com = new Object();
if(typeof com.uk == "undefined") com.uk = new Object();
if(typeof com.uk.become == "undefined") com.uk.become = new Object();
if(typeof com.uk.become.Browser == "undefined") com.uk.become.Browser = new Object();
com.uk.become.Request = function(method, uri)
{
var r;
var progids = [
'MSXML2.XMLHTTP.5.0',
'MSXML2.XMLHTTP.4.0',
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP'
];
this._method = method;
this._uri = uri;
this._req = false;
this.onload = false;
this.method = false;
this.params = new Array();
this.formVars = new Object();
this._headers = new Object();
try
{
r = new XMLHttpRequest();
this._req = r;
}
catch(e)
{
for(i = 0; i < progids.length; i++)
{
try
{
r = new XMLHttpRequest();
this._req = r;
}
catch(e)
{
}
}
}
finally
{
return this;
}
}
com.uk.become.Request.prototype.header = function(n, v)
{
this._headers[n] = v;
}
com.uk.become.Request.prototype.open = function()
{
var h, payload, hfv;
if(!this._req)
{
Shine.debug('Request object has no XMLHttpRequest (' + this._method + ' ' + this._uri + ')');
return false;
}
hfv = false;
payload = '';
if(this.method)
{
this._method = 'POST';
this.header('Content-Type', 'application/vnd.become.rpc+xml');
payload = '' + "\n";
payload += '' + "\n";
payload += ' ' + this.method + '' + "\n";
payload += ' ' + "\n";
for(h = 0; h < this.params.length; h++)
{
payload += ' ';
if(typeof this.params[h] == 'number')
{
payload += '' + this.params[h] + '';
}
else if(typeof this.params[h] == 'boolean')
{
payload += '' + (this.params[h] ? '1' : '0') + '';
}
else
{
payload += '' + this.params[h] + '';
}
payload += '' + "\n";
}
payload += ' ' + "\n";
payload += '' + "\n";
}
else
{
for(h in this.formVars)
{
hfv = true;
payload += encodeURIComponent(h) + '=' + encodeURIComponent(this.formVars[h]) + '&';
}
if(hfv)
{
payload = payload.substr(0, payload.length - 1);
this.header('Content-Type', 'application/x-www-form-urlencoded');
}
}
this._req.open(this._method, this._uri, true);
for(h in this._headers)
{
this._req.setRequestHeader(h, this._headers[h]);
// Shine.debug(h + ' = ' + this._headers[h]);
}
if(payload)
{
// Shine.debug(payload);
this._req.send(payload);
}
else
{
this._req.send(null);
}
}
com.uk.become.Shine = function(window, document)
{
var ua;
this.version = '$Id: shine.js 56702 2008-06-30 09:50:35Z daniel $';
this._abort = false;
this._window = window;
this._document = document;
this._loaded = false;
this._validating = false;
this._fieldValidators = new Array();
this._forms = new Array();
this._validateInterval = false;
/* Deal with special cases when it comes to browser type */
ua = navigator.userAgent.toLowerCase();
com.uk.become.Browser.userAgent = navigator.userAgent;
com.uk.become.Browser.isOpera = ((ua.indexOf("opera") != -1) || window.opera);
com.uk.become.Browser.isWebTV = (ua.indexOf("webtv") != -1);
com.uk.become.Browser.isIE = (ua.indexOf("msie") != -1) && !com.uk.become.Browser.isOpera && !com.uk.become.Browser.isWebTV;
com.uk.become.Browser.isWebKit = (ua.indexOf('applewebkit') != -1);
if(document.createElementNS)
{
com.uk.become.Browser.isDOM = true;
}
else
{
com.uk.become.Browser.isDOM = false;
}
if(com.uk.become.Browser.ieIE)
{
com.uk.become.Browser.ieVersion = navigator.appVersion.match(/MSIE (\d.\d)/)[1];
if(com.uk.become.Browser.ieVersion < 5 ||
com.uk.become.Browser.ieVersion >= 7)
{
this._abort = true;
return false;
}
}
this.debug(this.version);
if (com.uk.become.Browser.isDOM)
{
this.addEventHandler(document, 'DOMContentLoaded', this.loaded);
}
return this;
}
com.uk.become.Shine.prototype.debug = function()
{
var args, a;
args = new Array('Shine >>>');
d = args.length;
for(c = 0; c < arguments.length; c++)
{
args[d] = arguments[c];
d++;
}
args = args.join(' ');
if(!arguments.length)
{
return false;
}
if(com.uk.become.Browser.isWebKit)
{
/* WebKit raises a DOM exception if the below is executed */
if(window.console)
{
window.console.log(args);
}
}
else if(com.uk.become.Browser.isOpera && window.opera.postError)
{
window.opera.postError(args);
}
else if(document.createEvent && window.dispatchEvent)
{
printfire = new Object();
printfire.args = new Array(args);
var ev = document.createEvent('Events');
ev.initEvent('printfire', false, true);
try
{
dispatchEvent(ev);
}
catch(e)
{
}
}
}
com.uk.become.Shine.prototype.addEventHandler = function(element, eventName, handler)
{
var _this = this;
if(typeof element == 'string')
{
element = document.getElementById(element);
}
if(!element)
{
return false;
}
if(com.uk.become.Browser.isDOM)
{
element.addEventListener(eventName, function(ev) { _this._handler = handler; _this._handler(_this, element, ev); }, false);
}
else if(element.attachEvent)
{
element.attachEvent('on' + eventName, function(ev) { _this._handler = handler; _this._handler(_this, element, window.event); }, false);
}
else
{
eval('element.on' + eventName + ' = function() { _this._handler = handler; _this._handler(_this, element, window.event); }');
}
}
com.uk.become.Shine.prototype.getElementClass = function(element, forceDirect)
{
var cn;
if(element.shineStyleTarget && !forceDirect)
{
element = element.shineStyleTarget;
}
if(com.uk.become.Browser.isDOM)
{
cn = element.getAttribute('class');
}
else
{
cn = element.className;
}
if(typeof cn != 'string')
{
return '';
}
return cn;
}
com.uk.become.Shine.prototype.setElementClass = function(element, classes, replace)
{
var cn = this.getElementClass(element);
if(element.shineStyleTarget)
{
element = element.shineStyleTarget;
}
if(typeof element.shineOriginalClass != 'string')
{
element.shineOriginalClass = this.getElementClass(element);
}
if(!classes)
{
classes = '';
}
if(!replace)
{
classes = element.shineOriginalClass + ' ' + classes;
}
if(cn == classes) return true;
if(!com.uk.become.Browser.isDOM)
{
element.className = classes;
}
else
{
element.setAttribute('class', classes);
}
}
com.uk.become.Shine.prototype.hasElementClass = function(element, classname, forceDirect)
{
var cn;
if(!forceDirect)
{
forceDirect = false;
}
cn = ' ' + this.getElementClass(element, forceDirect) + ' ';
if(cn.indexOf(' ' + classname + ' ') != -1)
{
return true;
}
return false;
}
com.uk.become.Shine.prototype._inputHandler = function(shine, sender, event)
{
var valid, empty, focussed, s, data;
valid = true;
s = false;
prevalidated = false;
if(typeof sender.defaultValue != 'undefined')
{
if(sender.value == sender.defaultValue && sender.acErrorField)
{
valid = false;
prevalidated = true;
}
}
empty = (sender.value ? false : true);
focussed = (sender.focussed ? true: false);
data = (sender.shineValidatorData ? sender.shineValidatorData : false);
if(!prevalidated && !empty && sender.shineValidator)
{
valid = sender.shineValidator(shine, sender, sender.value, data);
}
s = 'shine-input ';
if(empty)
{
s += ' shine-input-empty';
sender.shineValidated = false;
sender.shineIncomplete = true;
}
else if(valid)
{
s += ' shine-input-ok';
sender.shineValidated = true;
sender.shineIncomplete = false;
}
else
{
s += ' shine-input-bad';
sender.shineValidated = false;
sender.shineIncomplete = false;
}
if(focussed)
{
s += ' shine-input-focus';
}
this.setElementClass(sender, s, false);
}
com.uk.become.Shine.prototype._inputFocus = function(shine, sender, event)
{
sender.focussed = true;
this._inputHandler(shine, sender, event);
}
com.uk.become.Shine.prototype._inputBlur = function(shine, sender, event)
{
sender.focussed = false;
this._inputHandler(shine, sender, event);
}
com.uk.become.Shine.prototype.addInputHandlers = function(elements, validator, data)
{
var c;
for(c = 0; c < elements.length; c++)
{
this.addInputHandler(elements[c], validator, data);
}
}
com.uk.become.Shine.prototype._createStyleWrapper = function(element)
{
var newel;
/* Create a wrapper element around an element, and set the child's
* .shineStyleTarget property to point to the new element. Useful for
* elements which can't really be styled themselves (e.g., list/drop-down
* boxes)
*/
if(element.parentNode && element.parentNode.shineStyleSource)
{
element.shineStyleTarget = element.parentNode;
return element.parentNode;
}
newel = document.createElement('span');
element.parentNode.replaceChild(newel, element);
newel.appendChild(element);
newel.shineStyleSource = true;
element.shineStyleTarget = newel;
return newel;
/*
element.outerHTML = '' + element.outerHTML + '';
element.shineStyleTarget = element.parentNode;
element.parentNode.shineStyleSource = element;
return element.parentNode; */
}
com.uk.become.Shine.prototype.addInputHandler = function(element, validator, data)
{
if(typeof element == 'string')
{
element = document.getElementById(element);
}
if(!element)
{
return false;
}
this._createStyleWrapper(element);
if(element.form)
{
if(!element.form.shineFields)
{
element.form.shineFields = new Array();
}
element.form.shineFields[element.form.shineFields.length] = element;
if(!element.form.shineForm)
{
element.form.shineForm = true;
this._forms[this._forms.length] = element.form;
}
}
this.setElementClass(element, 'shine-input');
element.shineValidator = validator;
element.shineValidatorData = data;
element.shineValidated = false;
element.shineIncomplete = true;
this._fieldValidators[this._fieldValidators.length] = element;
this.addEventHandler(element, 'focus', this._inputFocus);
this.addEventHandler(element, 'blur', this._inputBlur);
/* Return the element object for future use */
return element;
}
com.uk.become.Shine.prototype._validateFields = function()
{
var e, complete, valid;
if(this._validating)
{
return true;
}
this._validating = true;
for(e in this._fieldValidators)
{
if(!this._fieldValidators[e].nodeType) continue;
this._inputHandler(this, this._fieldValidators[e], false);
}
for(f in this._forms)
{
complete = true;
valid = true;
if(!this._forms[f].nodeType) continue;
for(e in this._forms[f].shineFields)
{
if(this._forms[f].shineFields[e].shineIncomplete)
{
complete = false;
}
if(!this._forms[f].shineFields[e].shineValidated)
{
valid = false;
}
}
s = '';
if(complete)
{
s += ' form-complete';
}
else
{
s += ' form-incomplete';
}
if(valid)
{
s += ' form-valid';
}
else
{
s += ' form-invalid';
}
if(complete && valid)
{
s += ' form-valid-complete';
}
else
{
s += ' form-not-valid-complete';
}
this.setElementClass(this._forms[f], s, false);
}
this._validating = false;
}
com.uk.become.Shine.prototype.getElementsByClass = function(root, el, classname)
{
var c, nl, nlc, nodes, node;
nodes = root.getElementsByTagName(el);
nl = new Array();
nlc = 0;
for(c = 0; c < nodes.length; c++)
{
node = nodes[c];
if(this.hasElementClass(node, classname, true))
{
nl[nlc] = node;
nlc++;
}
}
return nl;
}
/* Length-based validator */
com.uk.become.Shine.prototype.lengthValidator = function(shine, sender, value, data)
{
if(value.length < data)
{
return false;
}
return true;
}
/* Simple e-mail address validator */
com.uk.become.Shine.prototype.emailInputValidator = function(shine, sender, value, data)
{
var ap, dp;
ap = value.indexOf('@');
dp = value.lastIndexOf('.');
if(ap != -1 && dp != -1 && dp > ap && dp < value.length - 2)
{
return true;
}
return false;
}
/* Simple password validator */
com.uk.become.Shine.prototype.passwordInputValidator = function(shine, sender, value, data, p2)
{
if(data && data.shineValidator)
{
shine._inputHandler(shine, data, false);
}
if(value.length > 3)
{
return true;
}
return false;
}
/* Simple password confirmation validator (simply compares the value with the first password field) */
com.uk.become.Shine.prototype.passwordConfirmInputValidator = function(shine, sender, value, data)
{
var c, nodes, node;
if(!data && sender.form)
{
/* Look for a companion password field and pair with it */
nodes = shine.getElementsByClass(sender.form, 'input', 'shine-input-password');
shine.debug('nodes=' + nodes.join(','));
for(c = 0; c < nodes.length; c++)
{
node = nodes[c];
if(node == sender) continue;
if(!node.shineValidatorData)
{
node.shineValidatorData = sender;
sender.shineValidatorData = node;
data = node;
break;
}
}
}
if(!data) return true;
if(value == data.value)
{
return true;
}
return false;
}
com.uk.become.Shine.prototype.loaded = function(Shine, sender, ev)
{
var nodes;
if(this._loaded)
{
return true;
}
else if(this._abort)
{
return false;
}
this._loaded = true;
if(this.onload)
{
this.onload(Shine, this, ev);
}
/* Add handlers for the various classes of Shine-enabled form fields */
nodes = this.getElementsByClass(document, 'input', 'shine-input-email');
this.addInputHandlers(nodes, Shine.emailInputValidator);
nodes = this.getElementsByClass(document, 'input', 'shine-input-simple');
this.addInputHandlers(nodes, Shine.lengthInputValidator, 1);
nodes = this.getElementsByClass(document, 'select', 'shine-input-simple');
this.addInputHandlers(nodes, Shine.lengthInputValidator, 1);
nodes = this.getElementsByClass(document, 'input', 'shine-input-password');
this.addInputHandlers(nodes, Shine.passwordInputValidator);
nodes = this.getElementsByClass(document, 'input', 'shine-input-passconfirm');
this.addInputHandlers(nodes, Shine.passwordConfirmInputValidator);
/* Set up form field validation */
Shine._validatorInterval = window.setInterval(function() { Shine._validateFields(); }, 150);
this._validateFields();
return true;
}
Shine = new com.uk.become.Shine(window, document);
var ua = navigator.userAgent.toLowerCase();
var opera = (ua.indexOf("opera") != -1);
var ie = (ua.indexOf("msie") != -1 && !opera && (ua.indexOf("webtv") == -1))
var root_path = "/";
var html_path = "/";
var toggle_layer = "";
var input_error = Array();
function _ac_showErrors(){
var el;
for(i=0;i 1 ){
for( var i=1; i= 4){win.window.focus();}
};
var togglePrima = false;
Prima = function()
{
var container = document.getElementById('prima-inner');
container.style.height = '46px';
container.style.overflow = 'hidden';
var container = document.getElementById('prima');
container.style.position = 'absolute';
container.style.left = '0';
container.style.bottom = '0';
var span = document.createElement('span');
span.id = 'toggleSpan';
span.appendChild(document.createTextNode('Click here to find out more'));
container.insertBefore(span, container.firstChild);
Shine.addEventHandler(span, 'click', this.toggleBanner);
}
Prima.prototype.toggleBanner = function(Shine, sender, ev)
{
var container = document.getElementById('prima-inner');
var span = document.getElementById('toggleSpan');
container._sparkleLength = 500;
if(!togglePrima)
{
Slide(container, 46, 321);
span.innerHTML = 'Click here to collapse';
}
else
{
Slide(container, 321, 46);
span.innerHTML = 'Click here to find out more';
}
togglePrima = !togglePrima;
}
Slide = function(element, from, to)
{
var start, ev;
start = (new Date).getTime();
element._sparkleTo = to;
if(element._sparkleTimer)
{
clearInterval(element._sparkleTimer);
}
element._sparkleTimer = setInterval(function()
{
var time = (new Date).getTime();
var Tpos = (time - start) / element._sparkleLength;
var pos;
if (time >= element._sparkleLength + start)
{
element.style.height = to + 'px';
pos = to;
clearInterval (element._sparkleTimer);
element._sparkleTimer = null;
/* if(pos > 0)
{
element.style.height = 'auto';
element._sparkleInitialHeight = element.offsetHeight;
ev = new Object();
ev.expanded = true;
Shine.dispatchEvent(element, 'toggle', ev);
}
else
{
element.style.height = '46px';
ev = new Object();
ev.expanded = false;
// Shine.dispatchEvent(element, 'toggle', ev);
}
*/ }
else
{
//this time-position, sinoidal transition thing is from script.aculo.us
pos = ((-Math.cos(Tpos*Math.PI)/2) + 0.5) * (to - from) + from;
element.style.height = pos + 'px';
}
}, 13);
}
/**
* SWFObject v1.4.1: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
*
* SWFObject is (c) 2006 Geoff Stearns and is released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
* **SWFObject is the SWF embed script formerly known as FlashObject. The name was changed for
* legal reasons.
*/
if(typeof deconcept == "undefined") var deconcept = new Object();
if(typeof deconcept.util == "undefined") deconcept.util = new Object();
if(typeof deconcept.SWFObjectUtil == "undefined") deconcept.SWFObjectUtil = new Object();
deconcept.SWFObject = function(swf, id, w, h, ver, c, useExpressInstall, quality, xiRedirectUrl, redirectUrl, detectKey){
if (!document.createElement || !document.getElementById) { return; }
this.DETECT_KEY = detectKey ? detectKey : 'detectflash';
this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY);
this.params = new Object();
this.variables = new Object();
this.attributes = new Array();
if(swf) { this.setAttribute('swf', swf); }
if(id) { this.setAttribute('id', id); }
if(w) { this.setAttribute('width', w); }
if(h) { this.setAttribute('height', h); }
if(ver) { this.setAttribute('version', new deconcept.PlayerVersion(ver.toString().split("."))); }
this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion(this.getAttribute('version'), useExpressInstall);
if(c) { this.addParam('bgcolor', c); }
var q = quality ? quality : 'high';
this.addParam('quality', q);
this.setAttribute('useExpressInstall', useExpressInstall);
this.setAttribute('doExpressInstall', false);
var xir = (xiRedirectUrl) ? xiRedirectUrl : window.location;
this.setAttribute('xiRedirectUrl', xir);
this.setAttribute('redirectUrl', '');
if(redirectUrl) { this.setAttribute('redirectUrl', redirectUrl); }
}
deconcept.SWFObject.prototype = {
setAttribute: function(name, value){
this.attributes[name] = value;
},
getAttribute: function(name){
return this.attributes[name];
},
addParam: function(name, value){
this.params[name] = value;
},
getParams: function(){
return this.params;
},
addVariable: function(name, value){
this.variables[name] = value;
},
getVariable: function(name){
return this.variables[name];
},
getVariables: function(){
return this.variables;
},
getVariablePairs: function(){
var variablePairs = new Array();
var key;
var variables = this.getVariables();
for(key in variables){
variablePairs.push(key +"="+ variables[key]);
}
return variablePairs;
},
getSWFHTML: function() {
var swfNode = "";
if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { // netscape plugin architecture
if (this.getAttribute("doExpressInstall")) this.addVariable("MMplayerType", "PlugIn");
swfNode = '