/* Prototype JavaScript framework, version 1.5.1.1
* (c) 2005-2007 Sam Stephenson
*
* Prototype is freely distributable under the terms of an MIT-style license.
* For details, see the Prototype web site: http://www.prototypejs.org/
*
/*--------------------------------------------------------------------------*/
var Prototype = {
Version: '1.5.1.1',
Browser: {
IE: !!(window.attachEvent && !window.opera),
Opera: !!window.opera,
WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1
},
BrowserFeatures: {
XPath: !!document.evaluate,
ElementExtensions: !!window.HTMLElement,
SpecificElementExtensions:
(document.createElement('div').__proto__ !==
document.createElement('form').__proto__)
},
ScriptFragment: '
//
//
//
// 2) Inclure ce code dans le source HTML
//
// modifier les valeur "xxxxxname", "yyyyyvalue" et "zzzzzurl_script_php" (script générant le code complet du qui sera inséré dans la div "yyyyyname_container")
// le champ parameters sert à préciser d'éventuels autres paramères dans la querystring (du type : 'param1=toto¶m2=titi')
//
//
// -----------
// a
// b
// c
//
//
function fillContainer(sel_val, container_prefixe_id_name, url, parameters, complete_function)
{
var container_id_name = container_prefixe_id_name + '_container';
if(sel_val.length>0){
var pars;
if(parameters.length>0) pars = 'sel_val='+sel_val + '&' + parameters;
else pars = 'sel_val='+sel_val;
if (complete_function == "")
var myAjax = new Ajax.Updater(container_id_name, url, {method: 'get', parameters: pars, onFailure: reportError});
else
eval("var myAjax = new Ajax.Updater(container_id_name, url, {method: 'get', parameters: pars, onFailure: reportError, onComplete: " + complete_function + " });");
}
}
function FfillContainer(field_control_id_name, container_prefixe_id_name, url, parameters)
{
var sel_val = $F(field_control_id_name);
if (FfillContainer.arguments.length > 4) complete_function = FfillContainer.arguments[4];
else complete_function = "";
fillContainer(sel_val, container_prefixe_id_name, url, parameters, complete_function)
}
function reportError(request)
{
alert('Sorry. There was an error.');
}
// script.aculo.us effects.js v1.7.1_beta2, Sat Apr 28 15:20:12 CEST 2007
// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
// Justin Palmer (http://encytemedia.com/)
// Mark Pilgrim (http://diveintomark.org/)
// Martin Bialasinki
//
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/
// converts rgb() and #xxx to #xxxxxx format,
// returns self (or first argument) if not convertable
String.prototype.parseColor = function() {
var color = '#';
if(this.slice(0,4) == 'rgb(') {
var cols = this.slice(4,this.length-1).split(',');
var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
} else {
if(this.slice(0,1) == '#') {
if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
if(this.length==7) color = this.toLowerCase();
}
}
return(color.length==7 ? color : (arguments[0] || this));
}
/*--------------------------------------------------------------------------*/
Element.collectTextNodes = function(element) {
return $A($(element).childNodes).collect( function(node) {
return (node.nodeType==3 ? node.nodeValue :
(node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
}).flatten().join('');
}
Element.collectTextNodesIgnoreClass = function(element, className) {
return $A($(element).childNodes).collect( function(node) {
return (node.nodeType==3 ? node.nodeValue :
((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
Element.collectTextNodesIgnoreClass(node, className) : ''));
}).flatten().join('');
}
Element.setContentZoom = function(element, percent) {
element = $(element);
element.setStyle({fontSize: (percent/100) + 'em'});
if(Prototype.Browser.WebKit) window.scrollBy(0,0);
return element;
}
Element.getInlineOpacity = function(element){
return $(element).style.opacity || '';
}
Element.forceRerendering = function(element) {
try {
element = $(element);
var n = document.createTextNode(' ');
element.appendChild(n);
element.removeChild(n);
} catch(e) { }
};
/*--------------------------------------------------------------------------*/
Array.prototype.call = function() {
var args = arguments;
this.each(function(f){ f.apply(this, args) });
}
/*--------------------------------------------------------------------------*/
var Effect = {
_elementDoesNotExistError: {
name: 'ElementDoesNotExistError',
message: 'The specified DOM element does not exist, but is required for this effect to operate'
},
tagifyText: function(element) {
if(typeof Builder == 'undefined')
throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
var tagifyStyle = 'position:relative';
if(Prototype.Browser.IE) tagifyStyle += ';zoom:1';
element = $(element);
$A(element.childNodes).each( function(child) {
if(child.nodeType==3) {
child.nodeValue.toArray().each( function(character) {
element.insertBefore(
Builder.node('span',{style: tagifyStyle},
character == ' ' ? String.fromCharCode(160) : character),
child);
});
Element.remove(child);
}
});
},
multiple: function(element, effect) {
var elements;
if(((typeof element == 'object') ||
(typeof element == 'function')) &&
(element.length))
elements = element;
else
elements = $(element).childNodes;
var options = Object.extend({
speed: 0.1,
delay: 0.0
}, arguments[2] || {});
var masterDelay = options.delay;
$A(elements).each( function(element, index) {
new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
});
},
PAIRS: {
'slide': ['SlideDown','SlideUp'],
'blind': ['BlindDown','BlindUp'],
'appear': ['Appear','Fade']
},
toggle: function(element, effect) {
element = $(element);
effect = (effect || 'appear').toLowerCase();
var options = Object.extend({
queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
}, arguments[2] || {});
Effect[element.visible() ?
Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
}
};
var Effect2 = Effect; // deprecated
/* ------------- transitions ------------- */
Effect.Transitions = {
linear: Prototype.K,
sinoidal: function(pos) {
return (-Math.cos(pos*Math.PI)/2) + 0.5;
},
reverse: function(pos) {
return 1-pos;
},
flicker: function(pos) {
var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
return (pos > 1 ? 1 : pos);
},
wobble: function(pos) {
return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
},
pulse: function(pos, pulses) {
pulses = pulses || 5;
return (
Math.round((pos % (1/pulses)) * pulses) == 0 ?
((pos * pulses * 2) - Math.floor(pos * pulses * 2)) :
1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
);
},
none: function(pos) {
return 0;
},
full: function(pos) {
return 1;
}
};
/* ------------- core effects ------------- */
Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
initialize: function() {
this.effects = [];
this.interval = null;
},
_each: function(iterator) {
this.effects._each(iterator);
},
add: function(effect) {
var timestamp = new Date().getTime();
var position = (typeof effect.options.queue == 'string') ?
effect.options.queue : effect.options.queue.position;
switch(position) {
case 'front':
// move unstarted effects after this effect
this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
e.startOn += effect.finishOn;
e.finishOn += effect.finishOn;
});
break;
case 'with-last':
timestamp = this.effects.pluck('startOn').max() || timestamp;
break;
case 'end':
// start effect after last queued effect has finished
timestamp = this.effects.pluck('finishOn').max() || timestamp;
break;
}
effect.startOn += timestamp;
effect.finishOn += timestamp;
if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
this.effects.push(effect);
if(!this.interval)
this.interval = setInterval(this.loop.bind(this), 15);
},
remove: function(effect) {
this.effects = this.effects.reject(function(e) { return e==effect });
if(this.effects.length == 0) {
clearInterval(this.interval);
this.interval = null;
}
},
loop: function() {
var timePos = new Date().getTime();
for(var i=0, len=this.effects.length;i= this.startOn) {
if(timePos >= this.finishOn) {
this.render(1.0);
this.cancel();
this.event('beforeFinish');
if(this.finish) this.finish();
this.event('afterFinish');
return;
}
var pos = (timePos - this.startOn) / this.totalTime,
frame = Math.round(pos * this.totalFrames);
if(frame > this.currentFrame) {
this.render(pos);
this.currentFrame = frame;
}
}
},
cancel: function() {
if(!this.options.sync)
Effect.Queues.get(typeof this.options.queue == 'string' ?
'global' : this.options.queue.scope).remove(this);
this.state = 'finished';
},
event: function(eventName) {
if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
if(this.options[eventName]) this.options[eventName](this);
},
inspect: function() {
var data = $H();
for(property in this)
if(typeof this[property] != 'function') data[property] = this[property];
return '#';
}
}
Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
initialize: function(effects) {
this.effects = effects || [];
this.start(arguments[1]);
},
update: function(position) {
this.effects.invoke('render', position);
},
finish: function(position) {
this.effects.each( function(effect) {
effect.render(1.0);
effect.cancel();
effect.event('beforeFinish');
if(effect.finish) effect.finish(position);
effect.event('afterFinish');
});
}
});
Effect.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
initialize: function() {
var options = Object.extend({
duration: 0
}, arguments[0] || {});
this.start(options);
},
update: Prototype.emptyFunction
});
Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
if(!this.element) throw(Effect._elementDoesNotExistError);
// make this work on IE on elements without 'layout'
if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
this.element.setStyle({zoom: 1});
var options = Object.extend({
from: this.element.getOpacity() || 0.0,
to: 1.0
}, arguments[1] || {});
this.start(options);
},
update: function(position) {
this.element.setOpacity(position);
}
});
Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
if(!this.element) throw(Effect._elementDoesNotExistError);
var options = Object.extend({
x: 0,
y: 0,
mode: 'relative'
}, arguments[1] || {});
this.start(options);
},
setup: function() {
// Bug in Opera: Opera returns the "real" position of a static element or
// relative element that does not have top/left explicitly set.
// ==> Always set top and left for position relative elements in your stylesheets
// (to 0 if you do not need them)
this.element.makePositioned();
this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
this.originalTop = parseFloat(this.element.getStyle('top') || '0');
if(this.options.mode == 'absolute') {
// absolute movement, so we need to calc deltaX and deltaY
this.options.x = this.options.x - this.originalLeft;
this.options.y = this.options.y - this.originalTop;
}
},
update: function(position) {
this.element.setStyle({
left: Math.round(this.options.x * position + this.originalLeft) + 'px',
top: Math.round(this.options.y * position + this.originalTop) + 'px'
});
}
});
// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
return new Effect.Move(element,
Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};
Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
initialize: function(element, percent) {
this.element = $(element);
if(!this.element) throw(Effect._elementDoesNotExistError);
var options = Object.extend({
scaleX: true,
scaleY: true,
scaleContent: true,
scaleFromCenter: false,
scaleMode: 'box', // 'box' or 'contents' or {} with provided values
scaleFrom: 100.0,
scaleTo: percent
}, arguments[2] || {});
this.start(options);
},
setup: function() {
this.restoreAfterFinish = this.options.restoreAfterFinish || false;
this.elementPositioning = this.element.getStyle('position');
this.originalStyle = {};
['top','left','width','height','fontSize'].each( function(k) {
this.originalStyle[k] = this.element.style[k];
}.bind(this));
this.originalTop = this.element.offsetTop;
this.originalLeft = this.element.offsetLeft;
var fontSize = this.element.getStyle('font-size') || '100%';
['em','px','%','pt'].each( function(fontSizeType) {
if(fontSize.indexOf(fontSizeType)>0) {
this.fontSize = parseFloat(fontSize);
this.fontSizeType = fontSizeType;
}
}.bind(this));
this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
this.dims = null;
if(this.options.scaleMode=='box')
this.dims = [this.element.offsetHeight, this.element.offsetWidth];
if(/^content/.test(this.options.scaleMode))
this.dims = [this.element.scrollHeight, this.element.scrollWidth];
if(!this.dims)
this.dims = [this.options.scaleMode.originalHeight,
this.options.scaleMode.originalWidth];
},
update: function(position) {
var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
if(this.options.scaleContent && this.fontSize)
this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
},
finish: function(position) {
if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
},
setDimensions: function(height, width) {
var d = {};
if(this.options.scaleX) d.width = Math.round(width) + 'px';
if(this.options.scaleY) d.height = Math.round(height) + 'px';
if(this.options.scaleFromCenter) {
var topd = (height - this.dims[0])/2;
var leftd = (width - this.dims[1])/2;
if(this.elementPositioning == 'absolute') {
if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
} else {
if(this.options.scaleY) d.top = -topd + 'px';
if(this.options.scaleX) d.left = -leftd + 'px';
}
}
this.element.setStyle(d);
}
});
Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
if(!this.element) throw(Effect._elementDoesNotExistError);
var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
this.start(options);
},
setup: function() {
// Prevent executing on elements not in the layout flow
if(this.element.getStyle('display')=='none') { this.cancel(); return; }
// Disable background image during the effect
this.oldStyle = {};
if (!this.options.keepBackgroundImage) {
this.oldStyle.backgroundImage = this.element.getStyle('background-image');
this.element.setStyle({backgroundImage: 'none'});
}
if(!this.options.endcolor)
this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
if(!this.options.restorecolor)
this.options.restorecolor = this.element.getStyle('background-color');
// init color calculations
this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
},
update: function(position) {
this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
},
finish: function() {
this.element.setStyle(Object.extend(this.oldStyle, {
backgroundColor: this.options.restorecolor
}));
}
});
Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
this.start(arguments[1] || {});
},
setup: function() {
Position.prepare();
var offsets = Position.cumulativeOffset(this.element);
if(this.options.offset) offsets[1] += this.options.offset;
var max = window.innerHeight ?
window.height - window.innerHeight :
document.body.scrollHeight -
(document.documentElement.clientHeight ?
document.documentElement.clientHeight : document.body.clientHeight);
this.scrollStart = Position.deltaY;
this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
},
update: function(position) {
Position.prepare();
window.scrollTo(Position.deltaX,
this.scrollStart + (position*this.delta));
}
});
/* ------------- combination effects ------------- */
Effect.Fade = function(element) {
element = $(element);
var oldOpacity = element.getInlineOpacity();
var options = Object.extend({
from: element.getOpacity() || 1.0,
to: 0.0,
afterFinishInternal: function(effect) {
if(effect.options.to!=0) return;
effect.element.hide().setStyle({opacity: oldOpacity});
}}, arguments[1] || {});
return new Effect.Opacity(element,options);
}
Effect.Appear = function(element) {
element = $(element);
var options = Object.extend({
from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
to: 1.0,
// force Safari to render floated elements properly
afterFinishInternal: function(effect) {
effect.element.forceRerendering();
},
beforeSetup: function(effect) {
effect.element.setOpacity(effect.options.from).show();
}}, arguments[1] || {});
return new Effect.Opacity(element,options);
}
Effect.Puff = function(element) {
element = $(element);
var oldStyle = {
opacity: element.getInlineOpacity(),
position: element.getStyle('position'),
top: element.style.top,
left: element.style.left,
width: element.style.width,
height: element.style.height
};
return new Effect.Parallel(
[ new Effect.Scale(element, 200,
{ sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
Object.extend({ duration: 1.0,
beforeSetupInternal: function(effect) {
Position.absolutize(effect.effects[0].element)
},
afterFinishInternal: function(effect) {
effect.effects[0].element.hide().setStyle(oldStyle); }
}, arguments[1] || {})
);
}
Effect.BlindUp = function(element) {
element = $(element);
element.makeClipping();
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: false,
scaleX: false,
restoreAfterFinish: true,
afterFinishInternal: function(effect) {
effect.element.hide().undoClipping();
}
}, arguments[1] || {})
);
}
Effect.BlindDown = function(element) {
element = $(element);
var elementDimensions = element.getDimensions();
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleX: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) {
effect.element.makeClipping().setStyle({height: '0px'}).show();
},
afterFinishInternal: function(effect) {
effect.element.undoClipping();
}
}, arguments[1] || {}));
}
Effect.SwitchOff = function(element) {
element = $(element);
var oldOpacity = element.getInlineOpacity();
return new Effect.Appear(element, Object.extend({
duration: 0.4,
from: 0,
transition: Effect.Transitions.flicker,
afterFinishInternal: function(effect) {
new Effect.Scale(effect.element, 1, {
duration: 0.3, scaleFromCenter: true,
scaleX: false, scaleContent: false, restoreAfterFinish: true,
beforeSetup: function(effect) {
effect.element.makePositioned().makeClipping();
},
afterFinishInternal: function(effect) {
effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
}
})
}
}, arguments[1] || {}));
}
Effect.DropOut = function(element) {
element = $(element);
var oldStyle = {
top: element.getStyle('top'),
left: element.getStyle('left'),
opacity: element.getInlineOpacity() };
return new Effect.Parallel(
[ new Effect.Move(element, {x: 0, y: 100, sync: true }),
new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
Object.extend(
{ duration: 0.5,
beforeSetup: function(effect) {
effect.effects[0].element.makePositioned();
},
afterFinishInternal: function(effect) {
effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
}
}, arguments[1] || {}));
}
Effect.Shake = function(element) {
element = $(element);
var oldStyle = {
top: element.getStyle('top'),
left: element.getStyle('left') };
return new Effect.Move(element,
{ x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
new Effect.Move(effect.element,
{ x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
effect.element.undoPositioned().setStyle(oldStyle);
}}) }}) }}) }}) }}) }});
}
Effect.SlideDown = function(element) {
element = $(element).cleanWhitespace();
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
var oldInnerBottom = element.down().getStyle('bottom');
var elementDimensions = element.getDimensions();
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleX: false,
scaleFrom: window.opera ? 0 : 1,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) {
effect.element.makePositioned();
effect.element.down().makePositioned();
if(window.opera) effect.element.setStyle({top: ''});
effect.element.makeClipping().setStyle({height: '0px'}).show();
},
afterUpdateInternal: function(effect) {
effect.element.down().setStyle({bottom:
(effect.dims[0] - effect.element.clientHeight) + 'px' });
},
afterFinishInternal: function(effect) {
effect.element.undoClipping().undoPositioned();
effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
}, arguments[1] || {})
);
}
Effect.SlideUp = function(element) {
element = $(element).cleanWhitespace();
var oldInnerBottom = element.down().getStyle('bottom');
return new Effect.Scale(element, window.opera ? 0 : 1,
Object.extend({ scaleContent: false,
scaleX: false,
scaleMode: 'box',
scaleFrom: 100,
restoreAfterFinish: true,
beforeStartInternal: function(effect) {
effect.element.makePositioned();
effect.element.down().makePositioned();
if(window.opera) effect.element.setStyle({top: ''});
effect.element.makeClipping().show();
},
afterUpdateInternal: function(effect) {
effect.element.down().setStyle({bottom:
(effect.dims[0] - effect.element.clientHeight) + 'px' });
},
afterFinishInternal: function(effect) {
effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
effect.element.down().undoPositioned();
}
}, arguments[1] || {})
);
}
// Bug in opera makes the TD containing this element expand for a instance after finish
Effect.Squish = function(element) {
return new Effect.Scale(element, window.opera ? 1 : 0, {
restoreAfterFinish: true,
beforeSetup: function(effect) {
effect.element.makeClipping();
},
afterFinishInternal: function(effect) {
effect.element.hide().undoClipping();
}
});
}
Effect.Grow = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
moveTransition: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.full
}, arguments[1] || {});
var oldStyle = {
top: element.style.top,
left: element.style.left,
height: element.style.height,
width: element.style.width,
opacity: element.getInlineOpacity() };
var dims = element.getDimensions();
var initialMoveX, initialMoveY;
var moveX, moveY;
switch (options.direction) {
case 'top-left':
initialMoveX = initialMoveY = moveX = moveY = 0;
break;
case 'top-right':
initialMoveX = dims.width;
initialMoveY = moveY = 0;
moveX = -dims.width;
break;
case 'bottom-left':
initialMoveX = moveX = 0;
initialMoveY = dims.height;
moveY = -dims.height;
break;
case 'bottom-right':
initialMoveX = dims.width;
initialMoveY = dims.height;
moveX = -dims.width;
moveY = -dims.height;
break;
case 'center':
initialMoveX = dims.width / 2;
initialMoveY = dims.height / 2;
moveX = -dims.width / 2;
moveY = -dims.height / 2;
break;
}
return new Effect.Move(element, {
x: initialMoveX,
y: initialMoveY,
duration: 0.01,
beforeSetup: function(effect) {
effect.element.hide().makeClipping().makePositioned();
},
afterFinishInternal: function(effect) {
new Effect.Parallel(
[ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
new Effect.Scale(effect.element, 100, {
scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
], Object.extend({
beforeSetup: function(effect) {
effect.effects[0].element.setStyle({height: '0px'}).show();
},
afterFinishInternal: function(effect) {
effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
}
}, options)
)
}
});
}
Effect.Shrink = function(element) {
element = $(element);
var options = Object.extend({
direction: 'center',
moveTransition: Effect.Transitions.sinoidal,
scaleTransition: Effect.Transitions.sinoidal,
opacityTransition: Effect.Transitions.none
}, arguments[1] || {});
var oldStyle = {
top: element.style.top,
left: element.style.left,
height: element.style.height,
width: element.style.width,
opacity: element.getInlineOpacity() };
var dims = element.getDimensions();
var moveX, moveY;
switch (options.direction) {
case 'top-left':
moveX = moveY = 0;
break;
case 'top-right':
moveX = dims.width;
moveY = 0;
break;
case 'bottom-left':
moveX = 0;
moveY = dims.height;
break;
case 'bottom-right':
moveX = dims.width;
moveY = dims.height;
break;
case 'center':
moveX = dims.width / 2;
moveY = dims.height / 2;
break;
}
return new Effect.Parallel(
[ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
], Object.extend({
beforeStartInternal: function(effect) {
effect.effects[0].element.makePositioned().makeClipping();
},
afterFinishInternal: function(effect) {
effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
}, options)
);
}
Effect.Pulsate = function(element) {
element = $(element);
var options = arguments[1] || {};
var oldOpacity = element.getInlineOpacity();
var transition = options.transition || Effect.Transitions.sinoidal;
var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
reverser.bind(transition);
return new Effect.Opacity(element,
Object.extend(Object.extend({ duration: 2.0, from: 0,
afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
}, options), {transition: reverser}));
}
Effect.Fold = function(element) {
element = $(element);
var oldStyle = {
top: element.style.top,
left: element.style.left,
width: element.style.width,
height: element.style.height };
element.makeClipping();
return new Effect.Scale(element, 5, Object.extend({
scaleContent: false,
scaleX: false,
afterFinishInternal: function(effect) {
new Effect.Scale(element, 1, {
scaleContent: false,
scaleY: false,
afterFinishInternal: function(effect) {
effect.element.hide().undoClipping().setStyle(oldStyle);
} });
}}, arguments[1] || {}));
};
Effect.Morph = Class.create();
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
initialize: function(element) {
this.element = $(element);
if(!this.element) throw(Effect._elementDoesNotExistError);
var options = Object.extend({
style: {}
}, arguments[1] || {});
if (typeof options.style == 'string') {
if(options.style.indexOf(':') == -1) {
var cssText = '', selector = '.' + options.style;
$A(document.styleSheets).reverse().each(function(styleSheet) {
if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
else if (styleSheet.rules) cssRules = styleSheet.rules;
$A(cssRules).reverse().each(function(rule) {
if (selector == rule.selectorText) {
cssText = rule.style.cssText;
throw $break;
}
});
if (cssText) throw $break;
});
this.style = cssText.parseStyle();
options.afterFinishInternal = function(effect){
effect.element.addClassName(effect.options.style);
effect.transforms.each(function(transform) {
if(transform.style != 'opacity')
effect.element.style[transform.style] = '';
});
}
} else this.style = options.style.parseStyle();
} else this.style = $H(options.style)
this.start(options);
},
setup: function(){
function parseColor(color){
if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
color = color.parseColor();
return $R(0,2).map(function(i){
return parseInt( color.slice(i*2+1,i*2+3), 16 )
});
}
this.transforms = this.style.map(function(pair){
var property = pair[0], value = pair[1], unit = null;
if(value.parseColor('#zzzzzz') != '#zzzzzz') {
value = value.parseColor();
unit = 'color';
} else if(property == 'opacity') {
value = parseFloat(value);
if(Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
this.element.setStyle({zoom: 1});
} else if(Element.CSS_LENGTH.test(value)) {
var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
value = parseFloat(components[1]);
unit = (components.length == 3) ? components[2] : null;
}
var originalValue = this.element.getStyle(property);
return {
style: property.camelize(),
originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
targetValue: unit=='color' ? parseColor(value) : value,
unit: unit
};
}.bind(this)).reject(function(transform){
return (
(transform.originalValue == transform.targetValue) ||
(
transform.unit != 'color' &&
(isNaN(transform.originalValue) || isNaN(transform.targetValue))
)
)
});
},
update: function(position) {
var style = {}, transform, i = this.transforms.length;
while(i--)
style[(transform = this.transforms[i]).style] =
transform.unit=='color' ? '#'+
(Math.round(transform.originalValue[0]+
(transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
(Math.round(transform.originalValue[1]+
(transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
(Math.round(transform.originalValue[2]+
(transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
transform.originalValue + Math.round(
((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
this.element.setStyle(style, true);
}
});
Effect.Transform = Class.create();
Object.extend(Effect.Transform.prototype, {
initialize: function(tracks){
this.tracks = [];
this.options = arguments[1] || {};
this.addTracks(tracks);
},
addTracks: function(tracks){
tracks.each(function(track){
var data = $H(track).values().first();
this.tracks.push($H({
ids: $H(track).keys().first(),
effect: Effect.Morph,
options: { style: data }
}));
}.bind(this));
return this;
},
play: function(){
return new Effect.Parallel(
this.tracks.map(function(track){
var elements = [$(track.ids) || $$(track.ids)].flatten();
return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
}).flatten(),
this.options
);
}
});
Element.CSS_PROPERTIES = $w(
'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
'fontSize fontWeight height left letterSpacing lineHeight ' +
'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
'right textIndent top width wordSpacing zIndex');
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
String.prototype.parseStyle = function(){
var element = document.createElement('div');
element.innerHTML = '
';
var style = element.childNodes[0].style, styleRules = $H();
Element.CSS_PROPERTIES.each(function(property){
if(style[property]) styleRules[property] = style[property];
});
if(Prototype.Browser.IE && this.indexOf('opacity') > -1) {
styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
}
return styleRules;
};
Element.morph = function(element, style) {
new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
return element;
};
['getInlineOpacity','forceRerendering','setContentZoom',
'collectTextNodes','collectTextNodesIgnoreClass','morph'].each(
function(f) { Element.Methods[f] = Element[f]; }
);
Element.Methods.visualEffect = function(element, effect, options) {
s = effect.dasherize().camelize();
effect_class = s.charAt(0).toUpperCase() + s.substring(1);
new Effect[effect_class](element, options);
return $(element);
};
Effect.PhaseIn = function(element) {
element = $(element);
new Effect.BlindDown(element, arguments[1] || {});
new Effect.Appear(element, arguments[2] || arguments[1] || {});
}
Effect.PhaseOut = function(element) {
element = $(element);
new Effect.Fade(element, arguments[1] || {});
new Effect.BlindUp(element, arguments[2] || arguments[1] || {});
}
Effect.Phase = function(element) {
element = $(element);
if (element.style.display == 'none')
new Effect.PhaseIn(element, arguments[1] || {}, arguments[2] || arguments[1] || {});
else new Effect.PhaseOut(element, arguments[1] || {}, arguments[2] || arguments[1] || {});
}
Effect.DelayedChain = Class.create();
Object.extend(Effect.DelayedChain.prototype, {
initialize: function(effect, elements, options, timeout){
this.elements = elements;
this.effect = effect;
this.timeout = timeout || 100;
this.options = Object.extend({}, options || {});
this.afterFinish = this.options.afterFinish || Prototype.emptyFunction;
this.options.afterFinish = Prototype.emptyFunction;
setTimeout(this.action.bind(this),1);
},
action: function() {
if(this.elements.length){
new Effect[this.effect](this.elements.shift(), this.options);
setTimeout(this.action.bind(this), this.timeout);
} else {
if(this.afterFinish) this.afterFinish();
}
}
});
Effect.Chain = Class.create();
Object.extend(Effect.Chain.prototype, {
initialize: function(effect, elements, options){
this.elements = elements || [];
this.effect = effect;
this.options = options || {};
this.afterFinish = this.options.afterFinish || Prototype.emptyFunction;
this.options.afterFinish = this.nextEffect.bind(this);
setTimeout(this.nextEffect.bind(this), 1);
},
nextEffect: function(){
if(this.elements.length)
new Effect[this.effect](this.elements.shift(), this.options);
else
this.afterFinish();
}
});
Effect.DropIn = function(element) {
element = $(element);
var oldTop = element.style.top;
var oldLeft = element.style.left;
var pos = Position.cumulativeOffset(element);
return new Effect.Parallel(
[ new Effect.MoveBy(element, 100, 0, { sync: true }),
new Effect.Opacity(element, { sync: true, from:0.0, to: 1.0 }) ],
Object.extend(
{ duration: 0.5,
beforeSetup: function(effect) {
Element.makePositioned(effect.effects[0].element);
Element.setOpacity(element, 0);
element.style.position = 'absolute';
element.style.top = (pos[1]-100) + 'px';
}
}, arguments[1] || {}));
}
Effect.SlideRight = function(element) {
element = $(element);
Element.cleanWhitespace(element);
// SlideDown need to have the content of the element wrapped in a container element with fixed height!
var oldInnerRight = Element.getStyle(element.firstChild, 'right');
var elementDimensions = Element.getDimensions(element);
return new Effect.Scale(element, 100, Object.extend({
scaleContent: false,
scaleY: false,
scaleFrom: 0,
scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
restoreAfterFinish: true,
afterSetup: function(effect) { with(Element) {
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera) setStyle(effect.element, {top: ''});
makeClipping(effect.element);
setStyle(effect.element, {width: '0px'});
show(element); }},
afterUpdateInternal: function(effect) { with(Element) {
setStyle(effect.element.firstChild, {right:
(effect.dims[0] - effect.element.clientWidth) + 'px' }); }},
afterFinishInternal: function(effect) { with(Element) {
undoClipping(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild, {right: oldInnerRight}); }}
}, arguments[1] || {})
);
}
Effect.SlideLeft = function(element) {
element = $(element);
Element.cleanWhitespace(element);
var oldInnerRight = Element.getStyle(element.firstChild, 'right');
return new Effect.Scale(element, 0,
Object.extend({ scaleContent: false,
scaleY: false,
scaleMode: 'box',
scaleFrom: 100,
restoreAfterFinish: true,
beforeStartInternal: function(effect) { with(Element) {
makePositioned(effect.element);
makePositioned(effect.element.firstChild);
if(window.opera) setStyle(effect.element, {top: ''});
makeClipping(effect.element);
show(element); }},
afterUpdateInternal: function(effect) { with(Element) {
setStyle(effect.element.firstChild, {right:
(effect.dims[0] - effect.element.clientWidth) + 'px' }); }},
afterFinishInternal: function(effect) { with(Element) {
[hide, undoClipping].call(effect.element);
undoPositioned(effect.element.firstChild);
undoPositioned(effect.element);
setStyle(effect.element.firstChild, {right: oldInnerRight}); }}
}, arguments[1] || {})
);
}
Effect.DelayedChain = Class.create();
Object.extend(Effect.DelayedChain.prototype, {
initialize: function(effect, elements, options, timeout){
this.elements = elements;
this.effect = effect;
this.timeout = timeout || 100;
this.options = Object.extend({}, options || {});
this.afterFinish = this.options.afterFinish || Prototype.emptyFunction;
this.options.afterFinish = Prototype.emptyFunction;
setTimeout(this.action.bind(this),1);
},
action: function() {
if(this.elements.length){
new Effect[this.effect](this.elements.shift(), this.options);
setTimeout(this.action.bind(this), this.timeout);
} else {
if(this.afterFinish) this.afterFinish();
}
}
});
Effect.Chain = Class.create();
Object.extend(Effect.Chain.prototype, {
initialize: function(effect, elements, options){
this.elements = elements || [];
this.effect = effect;
this.options = options || {};
this.afterFinish = this.options.afterFinish || Prototype.emptyFunction;
this.options.afterFinish = this.nextEffect.bind(this);
setTimeout(this.nextEffect.bind(this), 1);
},
nextEffect: function(){
if(this.elements.length)
new Effect[this.effect](this.elements.shift(), this.options);
else
this.afterFinish();
}
});
Element.addMethods();// lightwindow.js v2.0
//
// Copyright (c) 2007 stickmanlabs
// Author: Kevin P Miller | http://www.stickmanlabs.com
//
// LightWindow is freely distributable under the terms of an MIT-style license.
//
// I don't care what you think about the file size...
// Be a pro:
// http://www.thinkvitamin.com/features/webapps/serving-javascript-fast
// http://rakaz.nl/item/make_your_pages_load_faster_by_combining_and_compressing_javascript_and_css_files
//
/*-----------------------------------------------------------------------------------------------*/
if(typeof Effect == 'undefined')
throw("lightwindow.js requires including script.aculo.us' effects.js library!");
// This will stop image flickering in IE6 when elements with images are moved
try {
document.execCommand("BackgroundImageCache", false, true);
} catch(e) {}
var lightwindow = Class.create();
lightwindow.prototype = {
//
// Setup Variables
//
element : null,
contentToFetch : null,
windowActive : false,
dataEffects : [],
dimensions : {
cruft : null,
container : null,
viewport : {
height : null,
width : null,
offsetTop : null,
offsetLeft : null
}
},
pagePosition : {
x : 0,
y : 0
},
pageDimensions : {
width : null,
height : null
},
preloadImage : [],
preloadedImage : [],
galleries : [],
resizeTo : {
height : null,
heightPercent : null,
width : null,
widthPercent : null,
fixedTop : null,
fixedLeft : null
},
scrollbarOffset : 18,
navigationObservers : {
previous : null,
next : null
},
containerChange : {
height : 0,
width : 0
},
activeGallery : false,
galleryLocation : {
current : 0,
total : 0
},
//
// Initialize the lightwindow.
//
initialize : function(options) {
this.options = Object.extend({
resizeSpeed : 8,
contentOffset : {
height : 20,
width : 20
},
dimensions : {
image : {height : 250, width : 250},
page : {height : 250, width : 250},
inline : {height : 250, width : 250},
media : {height : 250, width : 250},
external : {height : 250, width : 250},
titleHeight : 25
},
classNames : {
standard : 'lightwindow',
action : 'lightwindow_action'
},
fileTypes : {
page : ['asp', 'aspx', 'cgi', 'cfm', 'htm', 'html', 'pl', 'php4', 'php3', 'php', 'php5', 'phtml', 'rhtml', 'shtml', 'txt', 'vbs', 'rb'],
media : ['aif', 'aiff', 'asf', 'avi', 'divx', 'm1v', 'm2a', 'm2v', 'm3u', 'mid', 'midi', 'mov', 'moov', 'movie', 'mp2', 'mp3', 'mpa', 'mpa', 'mpe', 'mpeg', 'mpg', 'mpg', 'mpga', 'pps', 'qt', 'rm', 'ram', 'swf', 'viv', 'vivo', 'wav'],
image : ['bmp', 'gif', 'jpg', 'png', 'tiff']
},
mimeTypes : {
avi : 'video/avi',
aif : 'audio/aiff',
aiff : 'audio/aiff',
gif : 'image/gif',
bmp : 'image/bmp',
jpeg : 'image/jpeg',
m1v : 'video/mpeg',
m2a : 'audio/mpeg',
m2v : 'video/mpeg',
m3u : 'audio/x-mpequrl',
mid : 'audio/x-midi',
midi : 'audio/x-midi',
mjpg : 'video/x-motion-jpeg',
moov : 'video/quicktime',
mov : 'video/quicktime',
movie : 'video/x-sgi-movie',
mp2 : 'audio/mpeg',
mp3 : 'audio/mpeg3',
mpa : 'audio/mpeg',
mpa : 'video/mpeg',
mpe : 'video/mpeg',
mpeg : 'video/mpeg',
mpg : 'audio/mpeg',
mpg : 'video/mpeg',
mpga : 'audio/mpeg',
pdf : 'application/pdf',
png : 'image/png',
pps : 'application/mspowerpoint',
qt : 'video/quicktime',
ram : 'audio/x-pn-realaudio-plugin',
rm : 'application/vnd.rn-realmedia',
swf : 'application/x-shockwave-flash',
tiff : 'image/tiff',
viv : 'video/vivo',
vivo : 'video/vivo',
wav : 'audio/wav',
wmv : 'application/x-mplayer2'
},
classids : {
mov : 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
swf : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
wmv : 'clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6'
},
codebases : {
mov : 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
swf : 'http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0',
wmv : 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,5,715'
},
viewportPadding : 10,
EOLASFix : 'swf,wmv,fla,flv',
overlay : {
opacity : 0.7,
image : '/site/fr/images/black.png',
presetImage : '/site/fr/images/black-70.png'
},
skin : {
main : ''+
'
'+
'
'+
'
'+
'
'+
'
'+
'
'+
' '+
' of '+
' '+
'
'+
'
'+
'by '+
'
'+
'
'+
'
'+
'
'+
'
'+
'
'+
'
',
loading : '',
iframe : ''+
''+
''+
'{body_replace}'+
''+
'',
gallery : {
top : ''+
'
{gallery_title_replace} '+
'
',
middle : ''+
'{gallery_link_replace}'+
' ',
bottom : ' '+
'
'
}
},
formMethod : 'get',
hideFlash : false,
hideGalleryTab : false,
showTitleBar : true,
animationHandler : false,
navigationHandler : false,
transitionHandler : false,
finalAnimationHandler : false,
formHandler : false,
galleryAnimationHandler : false,
showGalleryCount : true
}, options || {});
this.duration = ((11-this.options.resizeSpeed)*0.15);
this._setupLinks();
this._getScroll();
this._getPageDimensions();
this._browserDimensions();
this._addLightWindowMarkup(false);
this._setupDimensions();
this.buildGalleryList();
},
//
// Activate the lightwindow.
//
activate : function(e, link){
// Clear out the window Contents
this._clearWindowContents(true);
// Add back in out loading panel
this._addLoadingWindowMarkup();
// Setup the element properties
this._setupWindowElements(link);
// Setup everything
this._getScroll();
this._browserDimensions();
this._setupDimensions();
this._toggleTroubleElements('hidden', false);
this._displayLightWindow('block', 'hidden');
this._setStatus(true);
this._monitorKeyboard(true);
this._prepareIE(true);
this._loadWindow();
},
//
// Turn off the window
//
deactivate : function(){
// The window is not active
this.windowActive = false;
// There is no longer a gallery active
this.activeGallery = false;
if (!this.options.hideGalleryTab) {
this._handleGalleryAnimation(false);
}
// Kill the animation
this.animating = false;
// Clear our element
this.element = null;
// hide the window.
this._displayLightWindow('none', 'visible');
// Clear out the window Contents
this._clearWindowContents(false);
// Stop all animation
var queue = Effect.Queues.get('lightwindowAnimation').each(function(e){e.cancel();});
// Undo the setup
this._prepareIE(false);
this._setupDimensions();
this._toggleTroubleElements('visible', false);
this._monitorKeyboard(false);
},
//
// Initialize specific window
//
createWindow : function(element, attributes) {
this._processLink($(element));
},
//
// Open a Window from a hash of attributes
//
activateWindow : function(options) {
this.element = Object.extend({
href : null,
title : null,
author : null,
caption : null,
rel : null,
top : null,
left : null,
type : null,
showImages : null,
height : null,
width : null,
loadingAnimation : null,
iframeEmbed : null,
form : null
}, options || {});
// Set the window type
this.contentToFetch = this.element.href;
this.windowType = this.element.type ? this.element.type : this._fileType(this.element.href);
// Clear out the window Contents
this._clearWindowContents(true);
// Add back in out loading panel
this._addLoadingWindowMarkup();
// Setup everything
this._getScroll();
this._browserDimensions();
this._setupDimensions();
this._toggleTroubleElements('hidden', false);
this._displayLightWindow('block', 'hidden');
this._setStatus(true);
this._monitorKeyboard(true);
this._prepareIE(true);
this._loadWindow();
},
//
// Fire off our Form handler
//
submitForm : function(e) {
if (this.options.formHandler) {
this.options.formHandler(e);
} else {
this._defaultFormHandler(e);
}
},
//
// Reload the window with another location
//
openWindow : function(element) {
var element = $(element);
// The window is active
this.windowActive = true;
// Clear out the window Contents
this._clearWindowContents(true);
// Add back in out loading panel
this._addLoadingWindowMarkup();
// Setup the element properties
this._setupWindowElements(element);
this._setStatus(true);
this._handleTransition();
},
//
// Navigate the window
//
navigateWindow : function(direction) {
this._handleNavigation(false);
if (direction == 'previous') {
this.openWindow(this.navigationObservers.previous);
} else if (direction == 'next'){
this.openWindow(this.navigationObservers.next);
}
},
//
// Build the Gallery List and Load it
//
buildGalleryList : function() {
var output = '';
var galleryLink;
for (i in this.galleries) {
if (typeof this.galleries[i] == 'object') {
output += (this.options.skin.gallery.top).replace('{gallery_title_replace}', unescape(i));
for (j in this.galleries[i]) {
if (typeof this.galleries[i][j] == 'object') {
galleryLink = ''+unescape(j)+' ';
output += (this.options.skin.gallery.middle).replace('{gallery_link_replace}', galleryLink);
}
}
output += this.options.skin.gallery.bottom;
}
}
new Insertion.Top('lightwindow_galleries_list', output);
// Attach Events
for (i in this.galleries) {
if (typeof this.galleries[i] == 'object') {
for (j in this.galleries[i]) {
if (typeof this.galleries[i][j] == 'object') {
Event.observe($('lightwindow_gallery_'+i+'_'+j), 'click', this.openWindow.bind(this, this.galleries[i][j][0]), false);
$('lightwindow_gallery_'+i+'_'+j).onclick = function() {return false;};
}
}
}
}
},
//
// Set Links Up
//
_setupLinks : function() {
var links = $$('.'+this.options.classNames.standard);
links.each(function(link) {
this._processLink(link);
}.bind(this));
},
//
// Process a Link
//
_processLink : function(link) {
if ((this._fileType(link.getAttribute('href')) == 'image' || this._fileType(link.getAttribute('href')) == 'media')) {
if (gallery = this._getGalleryInfo(link.rel)) {
if (!this.galleries[gallery[0]]) {
this.galleries[gallery[0]] = new Array();
}
if (!this.galleries[gallery[0]][gallery[1]]) {
this.galleries[gallery[0]][gallery[1]] = new Array();
}
this.galleries[gallery[0]][gallery[1]].push(link);
}
}
// Take care of our inline content
var url = link.getAttribute('href');
if (url.indexOf('?') > -1) {
url = url.substring(0, url.indexOf('?'));
}
var container = url.substring(url.indexOf('#')+1);
if($(container)) {
$(container).setStyle({
display : 'none'
});
}
Event.observe(link, 'click', this.activate.bindAsEventListener(this, link), false);
link.onclick = function() {return false;};
},
//
// Setup our actions
//
_setupActions : function() {
var links = $$('#lightwindow_container .'+this.options.classNames.action);
links.each(function(link) {
Event.observe(link, 'click', this[link.getAttribute('rel')].bindAsEventListener(this, link), false);
link.onclick = function() {return false;};
}.bind(this));
},
//
// Add the markup to the page.
//
_addLightWindowMarkup : function(rebuild) {
var overlay = Element.extend(document.createElement('div'));
overlay.setAttribute('id', 'lightwindow_overlay');
// FF Mac has a problem with putting Flash above a layer without a 100% opacity background, so we need to use a pre-made
if (Prototype.Browser.Gecko) {
overlay.setStyle({
backgroundImage: 'url('+this.options.overlay.presetImage+')',
backgroundRepeat: 'repeat',
height: this.pageDimensions.height+'px'
});
} else {
overlay.setStyle({
opacity: this.options.overlay.opacity,
backgroundImage: 'url('+this.options.overlay.image+')',
backgroundRepeat: 'repeat',
height: this.pageDimensions.height+'px'
});
}
var lw = document.createElement('div');
lw.setAttribute('id', 'lightwindow');
lw.innerHTML = this.options.skin.main;
var body = document.getElementsByTagName('body')[0];
body.appendChild(overlay);
body.appendChild(lw);
if ($('lightwindow_title_bar_close_link')) {
Event.observe('lightwindow_title_bar_close_link', 'click', this.deactivate.bindAsEventListener(this));
$('lightwindow_title_bar_close_link').onclick = function() {return false;};
}
Event.observe($('lightwindow_previous'), 'click', this.navigateWindow.bind(this, 'previous'), false);
$('lightwindow_previous').onclick = function() {return false;};
Event.observe($('lightwindow_next'), 'click', this.navigateWindow.bind(this, 'next'), false);
$('lightwindow_next').onclick = function() {return false;};
if (!this.options.hideGalleryTab) {
Event.observe($('lightwindow_galleries_tab'), 'click', this._handleGalleryAnimation.bind(this, true), false);
$('lightwindow_galleries_tab').onclick = function() {return false;};
}
// Because we use position absolute, kill the scroll Wheel on animations
if (Prototype.Browser.IE) {
Event.observe(document, 'mousewheel', this._stopScrolling.bindAsEventListener(this), false);
} else {
Event.observe(window, 'DOMMouseScroll', this._stopScrolling.bindAsEventListener(this), false);
}
Event.observe(overlay, 'click', this.deactivate.bindAsEventListener(this), false);
overlay.onclick = function() {return false;};
},
//
// Add loading window markup
//
_addLoadingWindowMarkup : function() {
$('lightwindow_contents').innerHTML += this.options.skin.loading;
},
//
// Setup the window elements
//
_setupWindowElements : function(link) {
this.element = link;
this.element.title = null ? '' : link.getAttribute('title');
this.element.author = null ? '' : link.getAttribute('author');
this.element.caption = null ? '' : link.getAttribute('caption');
this.element.rel = null ? '' : link.getAttribute('rel');
this.element.params = null ? '' : link.getAttribute('params');
// Set the window type
this.contentToFetch = this.element.href;
this.windowType = this._getParameter('lightwindow_type') ? this._getParameter('lightwindow_type') : this._fileType(this.contentToFetch);
},
//
// Clear the window contents out
//
_clearWindowContents : function(contents) {
// If there is an iframe, its got to go
if ($('lightwindow_iframe')) {
Element.remove($('lightwindow_iframe'));
}
// Stop playing an object if its still around
if ($('lightwindow_media_primary')) {
try {
$('lightwindow_media_primary').Stop();
} catch(e) {}
Element.remove($('lightwindow_media_primary'));
}
// Stop playing an object if its still around
if ($('lightwindow_media_secondary')) {
try {
$('lightwindow_media_secondary').Stop();
} catch(e) {}
Element.remove($('lightwindow_media_secondary'));
}
this.activeGallery = false;
this._handleNavigation(this.activeGallery);
if (contents) {
// Empty the contents
$('lightwindow_contents').innerHTML = '';
// Reset the scroll bars
$('lightwindow_contents').setStyle({
overflow: 'hidden'
});
if (!this.windowActive) {
$('lightwindow_data_slide_inner').setStyle({
display: 'none'
});
$('lightwindow_title_bar_title').innerHTML = '';
}
// Because of browser differences and to maintain flexible captions we need to reset this height at close
$('lightwindow_data_slide').setStyle({
height: 'auto'
});
}
this.resizeTo.height = null;
this.resizeTo.width = null;
},
//
// Set the status of our animation to keep things from getting clunky
//
_setStatus : function(status) {
this.animating = status;
if (status) {
Element.show('lightwindow_loading');
}
if (!(/MSIE 6./i.test(navigator.userAgent))) {
this._fixedWindow(status);
}
},
//
// Make this window Fixed
//
_fixedWindow : function(status) {
if (status) {
if (this.windowActive) {
this._getScroll();
$('lightwindow').setStyle({
position: 'absolute',
top: parseFloat($('lightwindow').getStyle('top'))+this.pagePosition.y+'px',
left: parseFloat($('lightwindow').getStyle('left'))+this.pagePosition.x+'px'
});
} else {
$('lightwindow').setStyle({
position: 'absolute'
});
}
} else {
if (this.windowActive) {
this._getScroll();
$('lightwindow').setStyle({
position: 'fixed',
top: parseFloat($('lightwindow').getStyle('top'))-this.pagePosition.y+'px',
left: parseFloat($('lightwindow').getStyle('left'))-this.pagePosition.x+'px'
});
} else {
if ($('lightwindow_iframe')) {
// Ideally here we would set a 50% value for top and left, but Safari rears it ugly head again and we need to do it by pixels
this._browserDimensions();
}
$('lightwindow').setStyle({
position: 'fixed',
top: (parseFloat(this._getParameter('lightwindow_top')) ? parseFloat(this._getParameter('lightwindow_top'))+'px' : this.dimensions.viewport.height/2+'px'),
left: (parseFloat(this._getParameter('lightwindow_left')) ? parseFloat(this._getParameter('lightwindow_left'))+'px' : this.dimensions.viewport.width/2+'px')
});
}
}
},
//
// Prepare the window for IE.
//
_prepareIE : function(setup) {
if (Prototype.Browser.IE) {
var height, overflowX, overflowY;
if (setup) {
var height = '100%';
} else {
var height = 'auto';
}
var body = document.getElementsByTagName('body')[0];
var html = document.getElementsByTagName('html')[0];
html.style.height = body.style.height = height;
}
},
_stopScrolling : function(e) {
if (this.animating) {
if (e.preventDefault) {
e.preventDefault();
}
e.returnValue = false;
}
},
//
// Get the scroll for the page.
//
_getScroll : function(){
if(typeof(window.pageYOffset) == 'number') {
this.pagePosition.x = window.pageXOffset;
this.pagePosition.y = window.pageYOffset;
} else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) {
this.pagePosition.x = document.body.scrollLeft;
this.pagePosition.y = document.body.scrollTop;
} else if(document.documentElement) {
this.pagePosition.x = document.documentElement.scrollLeft;
this.pagePosition.y = document.documentElement.scrollTop;
}
},
//
// Reset the scroll.
//
_setScroll : function(x, y) {
document.documentElement.scrollLeft = x;
document.documentElement.scrollTop = y;
},
//
// Hide Selects from the page because of IE.
// We could use iframe shims instead here but why add all the extra markup for one browser when this is much easier and cleaner
//
_toggleTroubleElements : function(visibility, content){
if (content) {
var selects = $('lightwindow_contents').getElementsByTagName('select');
} else {
var selects = document.getElementsByTagName('select');
}
for(var i = 0; i < selects.length; i++) {
selects[i].style.visibility = visibility;
}
if (!content) {
if (this.options.hideFlash){
var objects = document.getElementsByTagName('object');
for (i = 0; i != objects.length; i++) {
objects[i].style.visibility = visibility;
}
var embeds = document.getElementsByTagName('embed');
for (i = 0; i != embeds.length; i++) {
embeds[i].style.visibility = visibility;
}
}
var iframes = document.getElementsByTagName('iframe');
for (i = 0; i != iframes.length; i++) {
iframes[i].style.visibility = visibility;
}
}
},
//
// Get the actual page size
//
_getPageDimensions : function() {
var xScroll, yScroll;
if (window.innerHeight && window.scrollMaxY) {
xScroll = document.body.scrollWidth;
yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight){
xScroll = document.body.scrollWidth;
yScroll = document.body.scrollHeight;
} else {
xScroll = document.body.offsetWidth;
yScroll = document.body.offsetHeight;
}
var windowWidth, windowHeight;
if (self.innerHeight) {
windowWidth = self.innerWidth;
windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) {
windowWidth = document.documentElement.clientWidth;
windowHeight = document.documentElement.clientHeight;
} else if (document.body) {
windowWidth = document.body.clientWidth;
windowHeight = document.body.clientHeight;
}
if(yScroll < windowHeight){
this.pageDimensions.height = windowHeight;
} else {
this.pageDimensions.height = yScroll;
}
if(xScroll < windowWidth){
this.pageDimensions.width = windowWidth;
} else {
this.pageDimensions.width = xScroll;
}
},
//
// Display the lightWindow.
//
_displayLightWindow : function(display, visibility) {
$('lightwindow_overlay').style.display = $('lightwindow').style.display = $('lightwindow_container').style.display = display;
$('lightwindow_overlay').style.visibility = $('lightwindow').style.visibility = $('lightwindow_container').style.visibility = visibility;
},
//
// Setup Dimensions of lightwindow.
//
_setupDimensions : function() {
var originalHeight, originalWidth;
switch (this.windowType) {
case 'page' :
originalHeight = this.options.dimensions.page.height;
originalWidth = this.options.dimensions.page.width;
break;
case 'image' :
originalHeight = this.options.dimensions.image.height;
originalWidth = this.options.dimensions.image.width;
break;
case 'media' :
originalHeight = this.options.dimensions.media.height;
originalWidth = this.options.dimensions.media.width;
break;
case 'external' :
originalHeight = this.options.dimensions.external.height;
originalWidth = this.options.dimensions.external.width;
break;
case 'inline' :
originalHeight = this.options.dimensions.inline.height;
originalWidth = this.options.dimensions.inline.width;
break;
default :
originalHeight = this.options.dimensions.page.height;
originalWidth = this.options.dimensions.page.width;
break;
}
var offsetHeight = this._getParameter('lightwindow_top') ? parseFloat(this._getParameter('lightwindow_top'))+this.pagePosition.y : this.dimensions.viewport.height/2+this.pagePosition.y;
var offsetWidth = this._getParameter('lightwindow_left') ? parseFloat(this._getParameter('lightwindow_left'))+this.pagePosition.x : this.dimensions.viewport.width/2+this.pagePosition.x;
// So if a theme has say shadowed edges, they should be consistant and take care of in the contentOffset
$('lightwindow').setStyle({
top: offsetHeight+'px',
left: offsetWidth+'px'
});
$('lightwindow_container').setStyle({
height: originalHeight+'px',
width: originalWidth+'px',
left: -(originalWidth/2)+'px',
top: -(originalHeight/2)+'px'
});
$('lightwindow_contents').setStyle({
height: originalHeight+'px',
width: originalWidth+'px'
});
},
//
// Get the type of file.
//
_fileType : function(url) {
var image = new RegExp("[^\.]\.("+this.options.fileTypes.image.join('|')+")\s*$", "i");
if (image.test(url)) return 'image';
if (url.indexOf('#') > -1 && (document.domain == this._getDomain(url))) return 'inline';
if (url.indexOf('?') > -1) url = url.substring(0, url.indexOf('?'));
var type = 'unknown';
var page = new RegExp("[^\.]\.("+this.options.fileTypes.page.join('|')+")\s*$", "i");
var media = new RegExp("[^\.]\.("+this.options.fileTypes.media.join('|')+")\s*$", "i");
if (document.domain != this._getDomain(url)) type = 'external';
if (media.test(url)) type = 'media';
if (type == 'external' || type == 'media') return type;
if (page.test(url) || url.substr((url.length-1), url.length) == '/') type = 'page';
return type;
},
//
// Get file Extension
//
_fileExtension : function(url) {
if (url.indexOf('?') > -1) {
url = url.substring(0, url.indexOf('?'));
}
var extenstion = '';
for (var x = (url.length-1); x > -1; x--) {
if (url.charAt(x) == '.') {
return extenstion;
}
extenstion = url.charAt(x)+extenstion;
}
},
//
// Monitor the keyboard while this lightwindow is up
//
_monitorKeyboard : function(status) {
if (status) document.onkeydown = this._eventKeypress.bind(this);
else document.onkeydown = '';
},
//
// Perform keyboard actions
//
_eventKeypress : function(e) {
if (e == null) {
var keycode = event.keyCode;
} else {
var keycode = e.which;
}
switch (keycode) {
case 27:
this.deactivate();
break;
case 13:
return;
default:
break;
}
// Gotta stop those quick fingers
if (this.animating) {
return false;
}
switch (String.fromCharCode(keycode).toLowerCase()) {
case 'p':
if (this.navigationObservers.previous) {
this.navigateWindow('previous');
}
break;
case 'n':
if (this.navigationObservers.next) {
this.navigateWindow('next');
}
break;
default:
break;
}
},
//
// Get Gallery Information
//
_getGalleryInfo : function(rel) {
if (!rel) return false;
if (rel.indexOf('[') > -1) {
return new Array(escape(rel.substring(0, rel.indexOf('['))), escape(rel.substring(rel.indexOf('[')+1, rel.indexOf(']'))));
} else {
return false;
}
},
//
// Get the domain from a string.
//
_getDomain : function(url) {
var leadSlashes = url.indexOf('//');
var domainStart = leadSlashes+2;
var withoutResource = url.substring(domainStart, url.length);
var nextSlash = withoutResource.indexOf('/');
var domain = withoutResource.substring(0, nextSlash);
if (domain.indexOf(':') > -1){
var portColon = domain.indexOf(':');
domain = domain.substring(0, portColon);
}
return domain;
},
//
// Get the value from the params attribute string.
//
_getParameter : function(parameter, parameters) {
if (!this.element) return false;
if (parameter == 'lightwindow_top' && this.element.top) {
return unescape(this.element.top);
} else if (parameter == 'lightwindow_left' && this.element.left) {
return unescape(this.element.left);
} else if (parameter == 'lightwindow_type' && this.element.type) {
return unescape(this.element.type);
} else if (parameter == 'lightwindow_show_images' && this.element.showImages) {
return unescape(this.element.showImages);
} else if (parameter == 'lightwindow_height' && this.element.height) {
return unescape(this.element.height);
} else if (parameter == 'lightwindow_width' && this.element.width) {
return unescape(this.element.width);
} else if (parameter == 'lightwindow_loading_animation' && this.element.loadingAnimation) {
return unescape(this.element.loadingAnimation);
} else if (parameter == 'lightwindow_iframe_embed' && this.element.iframeEmbed) {
return unescape(this.element.iframeEmbed);
} else if (parameter == 'lightwindow_form' && this.element.form) {
return unescape(this.element.form);
} else {
if (!parameters) {
if (this.element.params) parameters = this.element.params;
else return;
}
var value;
var parameterArray = parameters.split(',');
var compareString = parameter+'=';
var compareLength = compareString.length;
for (var i = 0; i < parameterArray.length; i++) {
if (parameterArray[i].substr(0, compareLength) == compareString) {
var currentParameter = parameterArray[i].split('=');
value = currentParameter[1];
break;
}
}
if (!value) return false;
else return unescape(value);
}
},
//
// Get the Browser Viewport Dimensions
//
_browserDimensions : function() {
if (Prototype.Browser.IE) {
this.dimensions.viewport.height = document.documentElement.clientHeight;
this.dimensions.viewport.width = document.documentElement.clientWidth;
} else {
this.dimensions.viewport.height = window.innerHeight;
this.dimensions.viewport.width = document.width || document.body.offsetWidth;
}
},
//
// Get the scrollbar offset, I don't like this method but there is really no other way I can find.
//
_getScrollerWidth : function() {
var scrollDiv = Element.extend(document.createElement('div'));
scrollDiv.setAttribute('id', 'lightwindow_scroll_div');
scrollDiv.setStyle({
position: 'absolute',
top: '-10000px',
left: '-10000px',
width: '100px',
height: '100px',
overflow: 'hidden'
});
var contentDiv = Element.extend(document.createElement('div'));
contentDiv.setAttribute('id', 'lightwindow_content_scroll_div');
contentDiv.setStyle({
width: '100%',
height: '200px'
});
scrollDiv.appendChild(contentDiv);
var body = document.getElementsByTagName('body')[0];
body.appendChild(scrollDiv);
var noScroll = $('lightwindow_content_scroll_div').offsetWidth;
scrollDiv.style.overflow = 'auto';
var withScroll = $('lightwindow_content_scroll_div').offsetWidth;
Element.remove($('lightwindow_scroll_div'));
this.scrollbarOffset = noScroll-withScroll;
},
//
// Add a param to an object dynamically created
//
_addParamToObject : function(name, value, object, id) {
var param = document.createElement('param');
param.setAttribute('value', value);
param.setAttribute('name', name);
if (id) {
param.setAttribute('id', id);
}
object.appendChild(param);
return object;
},
//
// Get the outer HTML of an object CROSS BROWSER
//
_outerHTML : function(object) {
if (Prototype.Browser.IE) {
return object.outerHTML;
} else {
var clone = object.cloneNode(true);
var cloneDiv = document.createElement('div');
cloneDiv.appendChild(clone);
return cloneDiv.innerHTML;
}
},
//
// Convert an object to markup
//
_convertToMarkup : function(object, closeTag) {
var markup = this._outerHTML(object).replace(''+closeTag+'>', '');
if (Prototype.Browser.IE) {
for (var i = 0; i < object.childNodes.length; i++){
markup += this._outerHTML(object.childNodes[i]);
}
markup += ''+closeTag+'>';
}
return markup;
},
//
// Depending what type of browser it is we have to append the object differently... DAMN YOU IE!!
//
_appendObject : function(object, closeTag, appendTo) {
if (Prototype.Browser.IE) {
appendTo.innerHTML += this._convertToMarkup(object, closeTag);
// Fix the Eolas activate thing but only for specified media, for example doing this to a quicktime film breaks it.
if (this.options.EOLASFix.indexOf(this._fileType(this.element.href)) > -1) {
var objectElements = document.getElementsByTagName('object');
for (var i = 0; i < objectElements.length; i++) {
if (objectElements[i].getAttribute("data")) objectElements[i].removeAttribute('data');
objectElements[i].outerHTML = objectElements[i].outerHTML;
objectElements[i].style.visibility = "visible";
}
}
} else {
appendTo.appendChild(object);
}
},
//
// Add in iframe
//
_appendIframe : function(scroll) {
var iframe = document.createElement('iframe');
iframe.setAttribute('id', 'lightwindow_iframe');
iframe.setAttribute('name', 'lightwindow_iframe');
iframe.setAttribute('src', 'about:blank');
iframe.setAttribute('height', '100%');
iframe.setAttribute('width', '100%');
iframe.setAttribute('frameborder', '0');
iframe.setAttribute('marginwidth', '0');
iframe.setAttribute('marginheight', '0');
iframe.setAttribute('scrolling', scroll);
this._appendObject(iframe, 'iframe', $('lightwindow_contents'));
},
//
// Write Content to the iframe using the skin
//
_writeToIframe : function(content) {
var template = this.options.skin.iframe;
template = template.replace('{body_replace}', content);
if ($('lightwindow_iframe').contentWindow){
$('lightwindow_iframe').contentWindow.document.open();
$('lightwindow_iframe').contentWindow.document.write(template);
$('lightwindow_iframe').contentWindow.document.close();
} else {
$('lightwindow_iframe').contentDocument.open();
$('lightwindow_iframe').contentDocument.write(template);
$('lightwindow_iframe').contentDocument.close();
}
},
//
// Load the window Information
//
_loadWindow : function() {
switch (this.windowType) {
case 'image' :
var current = 0;
var images = [];
this.checkImage = [];
this.resizeTo.height = this.resizeTo.width = 0;
this.imageCount = this._getParameter('lightwindow_show_images') ? parseInt(this._getParameter('lightwindow_show_images')) : 1;
// If there is a gallery get it
if (gallery = this._getGalleryInfo(this.element.rel)) {
for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {
if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {
break;
}
}
if (this.galleries[gallery[0]][gallery[1]][current-this.imageCount]) {
this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-this.imageCount];
} else {
this.navigationObservers.previous = false;
}
if (this.galleries[gallery[0]][gallery[1]][current+this.imageCount]) {
this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+this.imageCount];
} else {
this.navigationObservers.next = false;
}
this.activeGallery = true;
} else {
this.navigationObservers.previous = false;
this.navigationObservers.next = false;
this.activeGallery = false;
}
for (var i = current; i < (current+this.imageCount); i++) {
if (gallery && this.galleries[gallery[0]][gallery[1]][i]) {
this.contentToFetch = this.galleries[gallery[0]][gallery[1]][i].href;
this.galleryLocation = {current: (i+1)/this.imageCount, total: (this.galleries[gallery[0]][gallery[1]].length)/this.imageCount};
if (!this.galleries[gallery[0]][gallery[1]][i+this.imageCount]) {
$('lightwindow_next').setStyle({
display: 'none'
});
} else {
$('lightwindow_next').setStyle({
display: 'block'
});
$('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i+this.imageCount].title;
}
if (!this.galleries[gallery[0]][gallery[1]][i-this.imageCount]) {
$('lightwindow_previous').setStyle({
display: 'none'
});
} else {
$('lightwindow_previous').setStyle({
display: 'block'
});
$('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][i-this.imageCount].title;
}
}
images[i] = document.createElement('img');
images[i].setAttribute('id', 'lightwindow_image_'+i);
images[i].setAttribute('border', '0');
images[i].setAttribute('src', this.contentToFetch);
$('lightwindow_contents').appendChild(images[i]);
// We have to do this instead of .onload
this.checkImage[i] = new PeriodicalExecuter(function(i) {
if (!(typeof $('lightwindow_image_'+i).naturalWidth != "undefined" && $('lightwindow_image_'+i).naturalWidth == 0)) {
this.checkImage[i].stop();
var imageHeight = $('lightwindow_image_'+i).getHeight();
if (imageHeight > this.resizeTo.height) {
this.resizeTo.height = imageHeight;
}
this.resizeTo.width += $('lightwindow_image_'+i).getWidth();
this.imageCount--;
$('lightwindow_image_'+i).setStyle({
height: '100%'
});
if (this.imageCount == 0) {
this._processWindow();
}
}
}.bind(this, i), 1);
}
break;
case 'media' :
var current = 0;
this.resizeTo.height = this.resizeTo.width = 0;
// If there is a gallery get it
if (gallery = this._getGalleryInfo(this.element.rel)) {
for (current = 0; current < this.galleries[gallery[0]][gallery[1]].length; current++) {
if (this.contentToFetch.indexOf(this.galleries[gallery[0]][gallery[1]][current].href) > -1) {
break;
}
}
if (this.galleries[gallery[0]][gallery[1]][current-1]) {
this.navigationObservers.previous = this.galleries[gallery[0]][gallery[1]][current-1];
} else {
this.navigationObservers.previous = false;
}
if (this.galleries[gallery[0]][gallery[1]][current+1]) {
this.navigationObservers.next = this.galleries[gallery[0]][gallery[1]][current+1];
} else {
this.navigationObservers.next = false;
}
this.activeGallery = true;
} else {
this.navigationObservers.previous = false;
this.navigationObservers.next = false;
this.activeGallery = false;
}
if (gallery && this.galleries[gallery[0]][gallery[1]][current]) {
this.contentToFetch = this.galleries[gallery[0]][gallery[1]][current].href;
this.galleryLocation = {current: current+1, total: this.galleries[gallery[0]][gallery[1]].length};
if (!this.galleries[gallery[0]][gallery[1]][current+1]) {
$('lightwindow_next').setStyle({
display: 'none'
});
} else {
$('lightwindow_next').setStyle({
display: 'block'
});
$('lightwindow_next_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current+1].title;
}
if (!this.galleries[gallery[0]][gallery[1]][current-1]) {
$('lightwindow_previous').setStyle({
display: 'none'
});
} else {
$('lightwindow_previous').setStyle({
display: 'block'
});
$('lightwindow_previous_title').innerHTML = this.galleries[gallery[0]][gallery[1]][current-1].title;
}
}
if (this._getParameter('lightwindow_iframe_embed')) {
this.resizeTo.height = this.dimensions.viewport.height;
this.resizeTo.width = this.dimensions.viewport.width;
} else {
this.resizeTo.height = this._getParameter('lightwindow_height');
this.resizeTo.width = this._getParameter('lightwindow_width');
}
this._processWindow();
break;
case 'external' :
this._appendIframe('auto');
this.resizeTo.height = this.dimensions.viewport.height;
this.resizeTo.width = this.dimensions.viewport.width;
this._processWindow();
break;
case 'page' :
var newAJAX = new Ajax.Request(
this.contentToFetch, {
method: 'get',
parameters: '',
onComplete: function(response) {
$('lightwindow_contents').innerHTML += response.responseText;
this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);
this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);
this._processWindow();
}.bind(this)
}
);
break;
case 'inline' :
var content = this.contentToFetch;
if (content.indexOf('?') > -1) {
content = content.substring(0, content.indexOf('?'));
}
content = content.substring(content.indexOf('#')+1);
new Insertion.Top($('lightwindow_contents'), $(content).innerHTML);
this.resizeTo.height = $('lightwindow_contents').scrollHeight+(this.options.contentOffset.height);
this.resizeTo.width = $('lightwindow_contents').scrollWidth+(this.options.contentOffset.width);
this._toggleTroubleElements('hidden', true);
this._processWindow();
break;
default :
throw("Page Type could not be determined, please amend this lightwindow URL "+this.contentToFetch);
break;
}
},
//
// Resize the Window to fit the viewport if necessary
//
_resizeWindowToFit : function() {
if (this.resizeTo.height+this.dimensions.cruft.height > this.dimensions.viewport.height) {
var heightRatio = this.resizeTo.height/this.resizeTo.width;
this.resizeTo.height = this.dimensions.viewport.height-this.dimensions.cruft.height-(2*this.options.viewportPadding);
// We only care about ratio's with this window type
if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
this.resizeTo.width = this.resizeTo.height/heightRatio;
$('lightwindow_data_slide_inner').setStyle({
width: this.resizeTo.width+'px'
});
}
}
if (this.resizeTo.width+this.dimensions.cruft.width > this.dimensions.viewport.width) {
var widthRatio = this.resizeTo.width/this.resizeTo.height;
this.resizeTo.width = this.dimensions.viewport.width-2*this.dimensions.cruft.width-(2*this.options.viewportPadding);
// We only care about ratio's with this window type
if (this.windowType == 'image' || (this.windowType == 'media' && !this._getParameter('lightwindow_iframe_embed'))) {
this.resizeTo.height = this.resizeTo.width/widthRatio;
$('lightwindow_data_slide_inner').setStyle({
height: this.resizeTo.height+'px'
});
}
}
},
//
// Set the Window to a preset size
//
_presetWindowSize : function() {
if (this._getParameter('lightwindow_height')) {
this.resizeTo.height = parseFloat(this._getParameter('lightwindow_height'));
}
if (this._getParameter('lightwindow_width')) {
this.resizeTo.width = parseFloat(this._getParameter('lightwindow_width'));
}
},
//
// Process the Window
//
_processWindow : function() {
// Clean out our effects
this.dimensions.dataEffects = [];
// Set up the data-slide if we have caption information
if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {
if (this.element.caption) {
$('lightwindow_data_caption').innerHTML = this.element.caption;
$('lightwindow_data_caption').setStyle({
display: 'block'
});
} else {
$('lightwindow_data_caption').setStyle({
display: 'none'
});
}
if (this.element.author) {
$('lightwindow_data_author').innerHTML = this.element.author;
$('lightwindow_data_author_container').setStyle({
display: 'block'
});
} else {
$('lightwindow_data_author_container').setStyle({
display: 'none'
});
}
if (this.activeGallery && this.options.showGalleryCount) {
$('lightwindow_data_gallery_current').innerHTML = this.galleryLocation.current;
$('lightwindow_data_gallery_total').innerHTML = this.galleryLocation.total;
$('lightwindow_data_gallery_container').setStyle({
display: 'block'
});
} else {
$('lightwindow_data_gallery_container').setStyle({
display: 'none'
});
}
$('lightwindow_data_slide_inner').setStyle({
width: this.resizeTo.width+'px',
height: 'auto',
visibility: 'visible',
display: 'block'
});
$('lightwindow_data_slide').setStyle({
height: $('lightwindow_data_slide').getHeight()+'px',
width: '1px',
overflow: 'hidden',
display: 'block'
});
} else {
$('lightwindow_data_slide').setStyle({
display: 'none',
width: 'auto'
});
$('lightwindow_data_slide_inner').setStyle({
display: 'none',
visibility: 'hidden',
width: this.resizeTo.width+'px',
height: '0px'
});
}
if (this.element.title != 'null') {
$('lightwindow_title_bar_title').innerHTML = this.element.title;
} else {
$('lightwindow_title_bar_title').innerHTML = '';
}
var originalContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
// Position the window
$('lightwindow_container').setStyle({
height: 'auto',
// We need to set the width to a px not auto as opera has problems with it
width: $('lightwindow_container').getWidth()+this.options.contentOffset.width-(this.windowActive ? this.options.contentOffset.width : 0)+'px'
});
var newContainerDimensions = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
// We need to record the container dimension changes
this.containerChange = {height: originalContainerDimensions.height-newContainerDimensions.height, width: originalContainerDimensions.width-newContainerDimensions.width};
// Get out general dimensions
this.dimensions.container = {height: $('lightwindow_container').getHeight(), width: $('lightwindow_container').getWidth()};
this.dimensions.cruft = {height: this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.options.contentOffset.height, width: this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.options.contentOffset.width};
// Set Sizes if we need too
this._presetWindowSize();
this._resizeWindowToFit(); // Even if the window is preset we still don't want it to go outside of the viewport
if (!this.windowActive) {
// Position the window
$('lightwindow_container').setStyle({
left: -(this.dimensions.container.width/2)+'px',
top: -(this.dimensions.container.height/2)+'px'
});
}
$('lightwindow_container').setStyle({
height: this.dimensions.container.height+'px',
width: this.dimensions.container.width+'px'
});
// We are ready, lets show this puppy off!
this._displayLightWindow('block', 'visible');
this._animateLightWindow();
},
//
// Fire off our animation handler
//
_animateLightWindow : function() {
if (this.options.animationHandler) {
this.options.animationHandler().bind(this);
} else {
this._defaultAnimationHandler();
}
},
//
// Fire off our transition handler
//
_handleNavigation : function(display) {
if (this.options.navigationHandler) {
this.options.navigationHandler().bind(this, display);
} else {
this._defaultDisplayNavigation(display);
}
},
//
// Fire off our transition handler
//
_handleTransition : function() {
if (this.options.transitionHandler) {
this.options.transitionHandler().bind(this);
} else {
this._defaultTransitionHandler();
}
},
//
// Handle the finish of the window animation
//
_handleFinalWindowAnimation : function(delay) {
if (this.options.finalAnimationHandler) {
this.options.finalAnimationHandler().bind(this, delay);
} else {
this._defaultfinalWindowAnimationHandler(delay);
}
},
//
// Handle the gallery Animation
//
_handleGalleryAnimation : function(list) {
if (this.options.galleryAnimationHandler) {
this.options.galleryAnimationHandler().bind(this, list);
} else {
this._defaultGalleryAnimationHandler(list);
}
},
//
// Display the navigation
//
_defaultDisplayNavigation : function(display) {
if (display) {
$('lightwindow_navigation').setStyle({
display: 'block',
height: $('lightwindow_contents').getHeight()+'px',
width: '100%',
marginTop: this.options.dimensions.titleHeight+'px'
});
} else {
$('lightwindow_navigation').setStyle({
display: 'none',
height: 'auto',
width: 'auto'
});
}
},
//
// This is the default animation handler for LightWindow
//
_defaultAnimationHandler : function() {
// Now that we have figures out the cruft lets make the caption go away and add its effects
if (this.element.caption || this.element.author || (this.activeGallery && this.options.showGalleryCount)) {
$('lightwindow_data_slide').setStyle({
display: 'none',
width: 'auto'
});
this.dimensions.dataEffects.push(
new Effect.SlideDown('lightwindow_data_slide', {sync: true}),
new Effect.Appear('lightwindow_data_slide', {sync: true, from: 0.0, to: 1.0})
);
}
// Set up the Title if we have one
$('lightwindow_title_bar_inner').setStyle({
height: '0px',
marginTop: this.options.dimensions.titleHeight+'px'
});
// We always want the title bar as well
this.dimensions.dataEffects.push(
new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: this.options.dimensions.titleHeight+'px', marginTop: '0px'}}),
new Effect.Appear('lightwindow_title_bar_inner', {sync: true, from: 0.0, to: 1.0})
);
if (!this.options.hideGalleryTab) {
this._handleGalleryAnimation(false);
if ($('lightwindow_galleries_tab_container').getHeight() == 0) {
this.dimensions.dataEffects.push(
new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '20px', marginTop: '0px'}})
);
$('lightwindow_galleries').setStyle({
width: '0px'
});
}
}
var resized = false;
var ratio = this.dimensions.container.width-$('lightwindow_contents').getWidth()+this.resizeTo.width+this.options.contentOffset.width;
if (ratio != $('lightwindow_container').getWidth()) {
new Effect.Parallel([
new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.width/$('lightwindow_contents').getWidth()), {scaleFrom: 100*($('lightwindow_contents').getWidth()/($('lightwindow_contents').getWidth()+(this.options.contentOffset.width))), sync: true, scaleY: false, scaleContent: false}),
new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.width)), {sync: true, scaleY: false, scaleFromCenter: true, scaleContent: false})
], {
duration: this.duration,
delay: 0.25,
queue: {position: 'end', scope: 'lightwindowAnimation'}
}
);
}
ratio = this.dimensions.container.height-$('lightwindow_contents').getHeight()+this.resizeTo.height+this.options.contentOffset.height;
if (ratio != $('lightwindow_container').getHeight()) {
new Effect.Parallel([
new Effect.Scale('lightwindow_contents', 100*(this.resizeTo.height/$('lightwindow_contents').getHeight()), {scaleFrom: 100*($('lightwindow_contents').getHeight()/($('lightwindow_contents').getHeight()+(this.options.contentOffset.height))), sync: true, scaleX: false, scaleContent: false}),
new Effect.Scale('lightwindow_container', 100*(ratio/(this.dimensions.container.height)), {sync: true, scaleX: false, scaleFromCenter: true, scaleContent: false})
], {
duration: this.duration,
afterFinish: function() {
if (this.dimensions.dataEffects.length > 0) {
if (!this.options.hideGalleryTab) {
$('lightwindow_galleries').setStyle({
width: this.resizeTo.width+'px'
});
}
new Effect.Parallel(this.dimensions.dataEffects, {
duration: this.duration,
afterFinish: function() {
this._finishWindow();
}.bind(this),
queue: {position: 'end', scope: 'lightwindowAnimation'}
}
);
}
}.bind(this),
queue: {position: 'end', scope: 'lightwindowAnimation'}
}
);
resized = true;
}
// We need to do our data effect since there was no resizing
if (!resized && this.dimensions.dataEffects.length > 0) {
new Effect.Parallel(this.dimensions.dataEffects, {
duration: this.duration,
beforeStart: function() {
if (!this.options.hideGalleryTab) {
$('lightwindow_galleries').setStyle({
width: this.resizeTo.width+'px'
});
}
if (this.containerChange.height != 0 || this.containerChange.width != 0) {
new Effect.MoveBy('lightwindow_container', this.containerChange.height, this.containerChange.width, {transition: Effect.Transitions.sinoidal});
}
}.bind(this),
afterFinish: function() {
this._finishWindow();
}.bind(this),
queue: {position: 'end', scope: 'lightwindowAnimation'}
}
);
}
},
//
// Finish up Window Animation
//
_defaultfinalWindowAnimationHandler : function(delay) {
if (this.windowType == 'media' || this._getParameter('lightwindow_loading_animation')) {
// Because of major flickering with the overlay we just hide it in this case
Element.hide('lightwindow_loading');
this._handleNavigation(this.activeGallery);
this._setStatus(false);
} else {
Effect.Fade('lightwindow_loading', {
duration: 0.75,
delay: 1.0,
afterFinish: function() {
// Just in case we need some scroll goodness (this also avoids the swiss cheese effect)
if (this.windowType != 'image' && this.windowType != 'media' && this.windowType != 'external') {
$('lightwindow_contents').setStyle({
overflow: 'auto'
});
}
this._handleNavigation(this.activeGallery);
this._defaultGalleryAnimationHandler();
this._setStatus(false);
}.bind(this),
queue: {position: 'end', scope: 'lightwindowAnimation'}
});
}
},
//
// Handle the gallery Animation
//
_defaultGalleryAnimationHandler : function(list) {
if (this.activeGallery) {
$('lightwindow_galleries').setStyle({
display: 'block',
marginBottom: $('lightwindow_data_slide').getHeight()+this.options.contentOffset.height/2+'px'
});
$('lightwindow_navigation').setStyle({
height: $('lightwindow_contents').getHeight()-20+'px'
});
} else {
$('lightwindow_galleries').setStyle({
display: 'none'
});
$('lightwindow_galleries_tab_container').setStyle({
height: '0px',
marginTop: '20px'
});
$('lightwindow_galleries_list').setStyle({
height: '0px'
});
return false;
}
if (list) {
if ($('lightwindow_galleries_list').getHeight() == 0) {
var height = $('lightwindow_contents').getHeight()*0.80;
$('lightwindow_galleries_tab_span').className = 'down';
} else {
var height = 0;
$('lightwindow_galleries_tab_span').className = 'up';
}
new Effect.Morph('lightwindow_galleries_list', {
duration: this.duration,
transition: Effect.Transitions.sinoidal,
style: {height: height+'px'},
beforeStart: function() {
$('lightwindow_galleries_list').setStyle({
overflow: 'hidden'
});
},
afterFinish: function() {
$('lightwindow_galleries_list').setStyle({
overflow: 'auto'
});
},
queue: {position: 'end', scope: 'lightwindowAnimation'}
});
}
},
//
// Default Transition Handler
//
_defaultTransitionHandler : function() {
// Clean out our effects
this.dimensions.dataEffects = [];
// Now that we have figures out the cruft lets make the caption go away and add its effects
if ($('lightwindow_data_slide').getStyle('display') != 'none') {
this.dimensions.dataEffects.push(
new Effect.SlideUp('lightwindow_data_slide', {sync: true}),
new Effect.Fade('lightwindow_data_slide', {sync: true, from: 1.0, to: 0.0})
);
}
if (!this.options.hideGalleryTab) {
if ($('lightwindow_galleries').getHeight() != 0 && !this.options.hideGalleryTab) {
this.dimensions.dataEffects.push(
new Effect.Morph('lightwindow_galleries_tab_container', {sync: true, style: {height: '0px', marginTop: '20px'}})
);
}
if ($('lightwindow_galleries_list').getHeight() != 0) {
$('lightwindow_galleries_tab_span').className = 'up';
this.dimensions.dataEffects.push(
new Effect.Morph('lightwindow_galleries_list', {
sync: true,
style: {height: '0px'},
transition: Effect.Transitions.sinoidal,
beforeStart: function() {
$('lightwindow_galleries_list').setStyle({
overflow: 'hidden'
});
},
afterFinish: function() {
$('lightwindow_galleries_list').setStyle({
overflow: 'auto'
});
}
})
);
}
}
// We always want the title bar as well
this.dimensions.dataEffects.push(
new Effect.Morph('lightwindow_title_bar_inner', {sync: true, style: {height: '0px', marginTop: this.options.dimensions.titleHeight+'px'}}),
new Effect.Fade('lightwindow_title_bar_inner', {sync: true, from: 1.0, to: 0.0})
);
new Effect.Parallel(this.dimensions.dataEffects, {
duration: this.duration,
afterFinish: function() {
this._loadWindow();
}.bind(this),
queue: {position: 'end', scope: 'lightwindowAnimation'}
}
);
},
//
// Default Form handler for LightWindow
//
_defaultFormHandler : function(e) {
var element = Event.element(e).parentNode;
var parameterString = Form.serialize(this._getParameter('lightwindow_form', element.getAttribute('params')));
if (this.options.formMethod == 'post') {
var newAJAX = new Ajax.Request(element.href, {
method: 'post',
postBody: parameterString,
onComplete: this.openWindow.bind(this, element)
});
} else if (this.options.formMethod == 'get') {
var newAJAX = new Ajax.Request(element.href, {
method: 'get',
parameters: parameterString,
onComplete: this.openWindow.bind(this, element)
});
}
},
//
// Wrap everything up
//
_finishWindow : function() {
if (this.windowType == 'external') {
// We set the externals source here because it allows for a much smoother animation
$('lightwindow_iframe').setAttribute('src', this.element.href);
this._handleFinalWindowAnimation(1);
} else if (this.windowType == 'media') {
var outerObject = document.createElement('object');
outerObject.setAttribute('classid', this.options.classids[this._fileExtension(this.contentToFetch)]);
outerObject.setAttribute('codebase', this.options.codebases[this._fileExtension(this.contentToFetch)]);
outerObject.setAttribute('id', 'lightwindow_media_primary');
outerObject.setAttribute('name', 'lightwindow_media_primary');
outerObject.setAttribute('width', this.resizeTo.width);
outerObject.setAttribute('height', this.resizeTo.height);
outerObject = this._addParamToObject('movie', this.contentToFetch, outerObject);
outerObject = this._addParamToObject('src', this.contentToFetch, outerObject);
outerObject = this._addParamToObject('controller', 'true', outerObject);
outerObject = this._addParamToObject('wmode', 'transparent', outerObject);
outerObject = this._addParamToObject('cache', 'false', outerObject);
outerObject = this._addParamToObject('quality', 'high', outerObject);
if (!Prototype.Browser.IE) {
var innerObject = document.createElement('object');
innerObject.setAttribute('type', this.options.mimeTypes[this._fileExtension(this.contentToFetch)]);
innerObject.setAttribute('data', this.contentToFetch);
innerObject.setAttribute('id', 'lightwindow_media_secondary');
innerObject.setAttribute('name', 'lightwindow_media_secondary');
innerObject.setAttribute('width', this.resizeTo.width);
innerObject.setAttribute('height', this.resizeTo.height);
innerObject = this._addParamToObject('controller', 'true', innerObject);
innerObject = this._addParamToObject('wmode', 'transparent', innerObject);
innerObject = this._addParamToObject('cache', 'false', innerObject);
innerObject = this._addParamToObject('quality', 'high', innerObject);
outerObject.appendChild(innerObject);
}
if (this._getParameter('lightwindow_iframe_embed')) {
this._appendIframe('no');
this._writeToIframe(this._convertToMarkup(outerObject, 'object'));
} else {
this._appendObject(outerObject, 'object', $('lightwindow_contents'));
}
this._handleFinalWindowAnimation(0);
} else {
this._handleFinalWindowAnimation(0);
}
// Initialize any actions
this._setupActions();
}
}
/*-----------------------------------------------------------------------------------------------*/
//Event.observe(window, 'load', lightwindowInit, false);
//
// Set up all of our links
//
//var myLightWindow = null;
//function lightwindowInit() {
// myLightWindow = new lightwindow();
//}